importing fastop extension in this repo
This repo is dedicated to experimentation on mutable history topic. Fastop is
appropriate there.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/.hgignore Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,16 @@
+syntax: re
+/figures/[^/]+\.png$
+^docs/build/
+^docs/html/
+^html/
+\.pyc$
+~$
+\.swp$
+\.orig$
+\.rej$
+\.err$
+^tests/easy_run.sh$
+^build/
+^MANIFEST$
+^docs/tutorials/.*\.rst$
+\.ico$
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/.hgtags Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,21 @@
+6c6bb7a23bb5125bf06da73265f039dd3447dafa 0.1.0
+d3f20770b86a31dba56ae7b252089e12b34702da 0.2.0
+c046b083a5e0b21af69027f31cee141800cf894b 0.3.0
+9bbcd274689829d9239978236e16610688978233 0.4.0
+4ecbaec1d664b1e6f8ebc78292e1ced77a8e69c0 0.4.1
+7ef8ab8c6feadb8a9d9e13af144a17cb23e9a38d 0.5
+4a5488c01a66be4729252175cea0ea739a88a540 0.6
+18a0d96ed559089edf90206c469f3f8c26681c64 0.7
+18a0d96ed559089edf90206c469f3f8c26681c64 0.7
+1b2757c1bd918509184f6c1d06b2329a847e31b0 0.7
+b18b000363550f02f413aed008f8e306318c608c 1.0.0
+ca5bb72d14aeb6e6053e3a53c064a2b7dc8010e5 1.0.1
+b1bdcb4506defef0e857e2710633f7686d8034a5 1.0.2
+5559e5a4b656978c592d364f242edc62369d7e84 1.0.2
+c062edbcaf13135d0312fd2039deca74573ff4f0 1.1.0
+22cacfce2a65ab965c6179ae862b148f4abc7d8a 1.1.0
+d43e80504e55db9ad4826e860e50530103a27b0f 2.0.0
+f9d305deeff3dba782e65faf4ef3fd1569995859 2.1.0
+862b6b71a35836e81f090ba7229c2888e8ed2f9f 3.0.0
+cdb52bbbe5b8770d5e68943b7e73bee4ba136ecc 3.1.0
+c3ba8a965a7a173e388d84819e936ea9bae9797f 3.2.0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/COPYING Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,340 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/MANIFEST.in Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,17 @@
+recursive-include docs/figures *.svg
+include docs/figures/hgview-example.png
+include docs/*.rst
+include docs/*.py
+include docs/tutorials/*.t
+include docs/makefile
+include docs/static/*.svg
+include hgext/__init__.py
+include hgext/evolve.py
+include hgext/pushexperiment.py
+include setup.py
+include README
+include COPYING
+include tests/*.t
+include tests/*.py
+exclude tests/test-oldconvert.t
+exclude tests/test-qsync.t
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Makefile Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,38 @@
+PYTHON=python
+HG=`which hg`
+VERSION=$(shell python setup.py --version)
+
+
+help:
+ @echo 'Commonly used make targets:'
+ @echo ' tests - run all tests in the automatic test suite'
+ @echo ' all-version-tests - run all tests against many hg versions'
+ @echo ' tests-%s - run all tests in the specified hg version'
+
+all: help
+
+tests:
+ cd tests && $(PYTHON) run-tests.py --with-hg=$(HG) $(TESTFLAGS)
+
+test-%:
+ cd tests && $(PYTHON) run-tests.py --with-hg=$(HG) $(TESTFLAGS) $@
+
+tests-%:
+ @echo "Path to crew repo is $(CREW) - set this with CREW= if needed."
+ hg -R $(CREW) checkout $$(echo $@ | sed s/tests-//) && \
+ (cd $(CREW) ; $(MAKE) clean ) && \
+ cd tests && $(PYTHON) $(CREW)/tests/run-tests.py $(TESTFLAGS)
+
+all-version-tests: tests-1.3.1 tests-1.4.3 tests-1.5.4 \
+ tests-1.6.4 tests-1.7.5 tests-1.8 tests-tip
+
+deb-prepare:
+ python setup.py sdist --dist-dir ..
+ mv -f ../hg-evolve-$(VERSION).tar.gz ../mercurial-evolve_$(VERSION).orig.tar.gz
+ tar xf ../mercurial-evolve_$(VERSION).orig.tar.gz
+ rm -rf ../mercurial-evolve_$(VERSION).orig
+ mv hg-evolve-$(VERSION) ../mercurial-evolve_$(VERSION).orig
+ cp -r debian/ ../mercurial-evolve_$(VERSION).orig/
+ @cd ../mercurial-evolve_$(VERSION).orig && echo 'debian build directory ready at' `pwd`
+
+.PHONY: tests all-version-tests
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/README Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,197 @@
+=============================
+Mutable History For Mercurial
+=============================
+
+This package supplies the ``evolve`` extension for Mercurial, which
+provides several commands to mutate history and deal with the
+resulting issues.
+
+It also:
+
+ - enables the "changeset obsolescence" feature of Mercurial
+ - issues several warning messages when trouble appears in your repository
+
+**This extension is experimental and not yet meant for production.**
+
+You can enable it by adding the line below to the ``extensions``
+section of your hgrc::
+
+ evolve = PATH/TO/mutable-history/hgext/evolve.py
+
+We recommend reading the documentation first. An online version is
+available here:
+
+ http://hg-lab.logilab.org/doc/mutable-history/html/
+
+Or see the ``doc/`` directory for a local copy.
+
+Contribute
+==========
+
+The simplest way to contribute is to issue a pull request on Bitbucket
+(https://bitbucket.org/marmoute/mutable-history).
+
+However, some cutting-edge changes may be found in a mutable repository hosted
+by logilab before they are published.
+
+ http://hg-lab.logilab.org/wip/mutable-history/
+
+Be sure to check latest draft changeset before submitting new changesets.
+
+
+Changelog
+=========
+
+3.3.0 --
+
+- added Augie Facklers `fastop` extension (usage not recommended yet)
+- add verbose hint about how to handle corner case by hand.
+ This should help people until evolve is able to to it itself.
+- removed the qsync extension. The only user I knew about (logilab) is not
+ using it anymore. It not compatible with coming Mercurial version 2.9.
+- add progress indicator for long evolve command
+- report troubles creation from `hg import`
+
+3.2.0 -- 2013-11-15
+
+- conform to the Mercurial custom of lowercase messages
+- added a small extension to experiment with obsolescence marker push
+- amend: drop the deprecated note option
+- amend: use core mechanism for amend (fix multiple bugs)
+- parents command: add "working directory parent is obsolete" message
+- evolve command: allow updating to the successor if the parent is
+ obsolete
+- gdown and gup commands: add next and previous alias, respectively
+- make grab aliases compatible with Mercurial 2.8
+- Tested with 2.6, 2.7 and 2.8
+
+3.1.0 -- 2013-02-11
+
+- amend: drop deprecated --change option for amend
+- alias: add a grab aliast to be used instead of graft -O
+- touch: add a --duplicate option to *not* obsolete the old version
+- touch: fix touching multiple revision at the same time
+- evolve: add a --all option
+- prune: various minor improvements
+- prune: add option to prune a specific bookmark
+- prune: add -u and -d option to control metadata
+
+3.0.0 -- 2013-02-02
+
+- compatibility with 2.5
+
+2.2.0 --
+
+- make evolve smarter at picking next troubled to solved without --any
+
+2.1.0 -- 2012-12-03
+
+- qsync fixes
+- have qfold ask for commit message
+
+2.0.0 -- 2012-10-26
+
+- compat with mercurial 2.4
+
+1.1.0 -- 2012-10-26
+
+- fix troubles creation reporting from rebase
+- rename latecomer to bumped
+- renamed conflicting to divergent
+- smarter divergent handling
+
+1.0.2 -- 2012-09-19
+
+- fix hg fold bug
+- fix hg pull --rebase
+- fix detection of conflict with external tools
+- adapt to core movement (caches and --amend)
+
+1.0.1 -- 2012-08-31
+
+- documentation improvement
+- fix a performance bug with hgweb
+
+1.0 -- 2012-08-29
+
+- Align with Mercurial version 2.3 (drop 2.2 support).
+- stabilize handle killed parent
+- stabilize handle late comer
+- stabilize handle conflicting
+- stabilize get a --continue switch
+- merge and update ignore extinct changeset in most case.
+- new "troubled()" revset
+- summary now reports troubles changesets
+- new touch command
+- new fold command
+- new basic olog alias
+
+- rebase refuse to work on public changeset again
+- rebase explicitly state that there is nothing to rebase because everything is
+ extinct() when that happen.
+- amend now cleanly abort when --change switch is misused
+
+
+0.7 -- 2012-08-06
+
+- hook: work around insanely huge value in obsolete pushkey call
+- pushkey: properly handle abort during obsolete markers push
+- amend: wrap the whole process in a single transaction.
+- evolve: tweak and add EOL to kill warning
+- obsolete: fix doc, rebase no longer aborts with --keep
+- obsolete/evolve: fix grammar in prerequisite messages
+- evolve: avoid duplication in graft wrapper
+- evolve: graft --continue is optional, test
+
+0.6 -- 2012-07-31
+
+- obsolete: change warning output to match mercurial core on
+- qsync: ignore unexistent nodes
+- make compat server both compatible with "dump" and "dump%i" version
+
+0.5 -- 2012-07-16
+
+- obsolete: Detect conflicting changeset!
+- obsolete: adapt to core: marker are written in transaction now
+- evolve: add the solve alias to obsolete
+- doc: big update of terms and summary of the concept
+- evolve: switch the official name for "kill" to prune
+
+
+0.4.1 -- 2012-07-10
+
+- [convert] properly exclude null successors from convertion
+- Ignore buggy marker in newerversion
+
+
+0.4.0 -- 2012-07-06
+
+- obsolete: public changeset are no longer latecomer.
+- obsolete: move to official binary format
+- adapt for new mercurial
+- obsolete: we are not compatible with 2.1 any more
+
+0.3.0 -- 2012-06-27
+
+-
+- obsolete: Add "latecomer" error detection (stabilize does not handle resolution yet)
+- evolve: Introduce a new `uncommit` command to remove change from a changeset
+- rebase: allow the use of --keep again
+- commit: --amend option create obsolete marker (but still strip)
+- obsolete: fewer marker are created when collapsing revision.
+- revset: add, successors(), allsuccessors(), precursors(), allprecursors(),
+ latecomer() and hidden()
+- evolve: add `prune` alias to `kill`.
+- stabilize: clearly state that stabilize does nto handle conflict
+- template: add an {obsolete} keyword
+
+0.2.0 -- 2012-06-20
+
+- stabilize: improve choice of the next changeset to stabilize
+- stabilize: improve resolution of several corner case
+- rebase: handle removing empty changesets
+- rebase: handle --collapse
+- evolve: add `obsolete` alias to `kill`
+- evolve: add `evolve` alias to `stabilize`
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/contrib/nopushpublish.py Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,36 @@
+# Extension which prevent changeset to be turn public by push operation
+#
+# Copyright 2011 Logilab SA <contact@logilab.fr>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+
+from mercurial import extensions, util
+from mercurial import discovery
+
+def checkpublish(orig, repo, remote, outgoing, *args):
+
+ # is remote publishing?
+ publish = True
+ if 'phases' in remote.listkeys('namespaces'):
+ remotephases = remote.listkeys('phases')
+ publish = remotephases.get('publishing', False)
+
+ npublish = 0
+ if publish:
+ for rev in outgoing.missing:
+ if repo[rev].phase():
+ npublish += 1
+ if npublish:
+ repo.ui.warn("Push would publish %s changesets" % npublish)
+
+ ret = orig(repo, remote, outgoing, *args)
+ if npublish:
+ raise util.Abort("Publishing push forbiden",
+ hint="Use `hg phase -p <rev>` to manually publish them")
+
+ return ret
+
+def uisetup(ui):
+ extensions.wrapfunction(discovery, 'checkheads', checkpublish)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/debian/changelog Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,42 @@
+mercurial-evolve (3.2.0-1) UNRELEASED; urgency=low
+
+ * New upstream release.
+
+ -- Julien Cristau <julien.cristau@logilab.fr> Tue, 04 Jun 2013 17:28:02 +0200
+
+mercurial-evolve (3.1.0-1) UNRELEASED; urgency=low
+
+ * New upstream release.
+
+ -- Pierre-Yves David <pierre-yves.david@logilab.fr> Mon, 04 Mar 2013 18:02:15 +0100
+
+mercurial-evolve (2.1.0-1) UNRELEASED; urgency=low
+
+ * New upstream release
+
+ -- Pierre-Yves David <pierre-yves.david@logilab.fr> Mon, 03 Dec 2012 15:19:19 +0100
+
+mercurial-evolve (1.1.0-1) UNRELEASED; urgency=low
+
+ * New upstream release.
+
+ -- Pierre-Yves David <pierre-yves.david@logilab.fr> Tue, 20 Nov 2012 16:28:12 +0100
+
+mercurial-evolve (1.0.2-1) UNRELEASED; urgency=low
+
+ * New upstream Release
+
+ -- Pierre-Yves David <pierre-yves.david@logilab.fr> Wed, 19 Sep 2012 17:38:47 +0200
+
+mercurial-evolve (1.0.1-1) UNRELEASED; urgency=low
+
+ * New bug fix release
+ * remove conflicting __init__.py
+
+ -- Pierre-Yves David <pierre-yves.david@logilab.fr> Fri, 31 Aug 2012 11:31:03 +0200
+
+mercurial-evolve (1.0.0-1) UNRELEASED; urgency=low
+
+ * Initial release.
+
+ -- Julien Cristau <jcristau@debian.org> Fri, 24 Aug 2012 16:46:30 +0200
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/debian/compat Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,1 @@
+8
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/debian/control Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,39 @@
+Source: mercurial-evolve
+Section: vcs
+Priority: optional
+Maintainer: Logilab <contact@logilab.fr>
+Uploaders:
+ Julien Cristau <julien.cristau@logilab.fr>,
+ Pierre-Yves David <pierre-yves.david@logilab.fr>,
+Standards-Version: 3.9.3
+Build-Depends:
+ mercurial (>=2.6~),
+ python,
+ debhelper (>= 8),
+ python-sphinx (>= 1.0.8),
+ imagemagick,
+ librsvg2-bin,
+Python-Version: >= 2.6
+Homepage: https://bitbucket.org/marmoute/mutable-history
+
+Package: mercurial-evolve
+Architecture: all
+Depends:
+ ${python:Depends},
+ ${misc:Depends},
+ mercurial (>= 2.6),
+Description: evolve extension for Mercurial
+ This package provides the experimental "evolve" extension for the Mercurial
+ DVCS.
+ .
+ This extension provides several commands to mutate history and deal with issues
+ it may raise.
+ .
+ It also:
+ - enables the "Changeset Obsolescence" feature of mercurial,
+ - alters core command and extension that rewrite history to use this feature,
+ - improves some aspects of the early implementation in Mercurial 2.3.
+ .
+ **These extensions are experimental and are not meant for production.**
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/debian/copyright Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,15 @@
+This software was downloaded from
+https://bitbucket.org/marmoute/mutable-history
+
+Copyright 2011 Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
+ Logilab SA <contact@logilab.fr>
+ Pierre-Yves David <pierre-yves.david@ens-lyon.org>
+ Patrick Mezard <patrick@mezard.eu>
+
+
+This software may be used and distributed according to the terms of the GNU
+General Public License version 2 or any later version.
+
+On Debian systems, the complete text of the GNU General Public License version
+2 can be found in `/usr/share/common-licenses/GPL-2'.
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/debian/docs Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,1 @@
+html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/debian/rules Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,27 @@
+#!/usr/bin/make -f
+
+clean %:
+ dh $@ --with python2 --buildsystem=python_distutils
+
+build:
+ dh build --with python2 --buildsystem=python_distutils
+ $(MAKE) -C docs
+
+ifeq (,$(filter nocheck, $(DEB_BUILD_OPTIONS)))
+override_dh_auto_test:
+ cd tests && python run-tests.py --with-hg=`which hg`
+endif
+
+override_dh_python2:
+ # avoid conflict with mercurial's own hgext/__init__.py
+ find debian -name __init__.py -delete
+ dh_python2
+
+clean: clean-docs
+
+clean-docs:
+ rm -rf html
+ rm -f docs/static/logo-evolve.ico
+ rm -f docs/tutorials/tutorial.rst
+
+.PHONY: build clean clean-docs
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/debian/source/format Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,1 @@
+3.0 (quilt)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/README Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,3 @@
+doc generated with sphinx. tutorial exported using sphinxedhg
+
+http://hg.piranha.org.ua/sphinxedhg/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/conf.py Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,124 @@
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = []
+#autoclass_content = 'both'
+# Add any paths that contain templates here, relative to this directory.
+#templates_path = []
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General substitutions.
+project = 'Obsolete experimentation'
+copyright = '2010-2011, pierre-yves.david@logilab.fr'
+
+# The default replacements for |version| and |release|, also used in various
+# other places throughout the built documents.
+#
+# The short X.Y version.
+version = '0.0'
+# The full version, including alpha/beta/rc tags.
+release = '0.0'
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+today_fmt = '%B %d, %Y'
+
+# List of documents that shouldn't be included in the build.
+unused_docs = []
+
+# List of directories, relative to source directories, that shouldn't be searched
+# for source files.
+#exclude_dirs = []
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+
+# Options for HTML output
+# -----------------------
+
+# The style sheet to use for HTML and HTML Help pages. A file of that name
+# must exist either in Sphinx' static/ path, or in one of the custom paths
+# given in html_static_path.
+#html_style = 'sphinx-default.css'
+
+# The name for this set of Sphinx documents. If None, it defaults to
+# "<project> v<release> documentation".
+html_title = project
+html_theme = 'haiku'
+html_theme_path = ['.']
+
+# A shorter title for the navigation bar. Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (within the static path) to place at the top of
+# the sidebar.
+#html_logo = 'logo-evolve.svg'
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+html_favicon = 'logo-evolve.ico'
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+html_use_modindex = False
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, the reST sources are included in the HTML build as _sources/<name>.
+#html_copy_source = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it. The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = '.html'
+
+# Output file base name for HTML help builder.
+#htmlhelp_basename = ''
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/evolve-collaboration.rst Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,135 @@
+.. Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
+.. Logilab SA <contact@logilab.fr>
+
+------------------------------------------------
+Collaboration Using Evolve: A user story
+------------------------------------------------
+
+
+After having written some code for ticket #42, Alice starts a patch
+(this will be kind of like a 'work-in-progress' checkpoint
+initially)::
+
+ $ hg ci -m '[entities] remove magic'
+
+Instant patch! Note how the default phase of this changeset is (still)
+in "draft" state.
+
+This is easily checkable::
+
+ $ hg phase tip
+ 827: draft
+
+See? Until the day it becomes a "public" changeset, this can be
+altered to no end. How? It happens with an explicit::
+
+ $ hg phase --public
+
+In practice, pushing to a "publishing" repository can also turn draft
+changesets into public ones. Older Mercurial releases are automatically
+"publishing" since they do not have the notion of non-public changesets
+(or mutable history).
+
+During the transition from older Mercurial servers to new ones, this will
+happen often, so be careful.
+
+Now let's come back to our patch. Next hour sees good progress and Alice
+wants to complete the patch with the recent stuff (all that's shown by
+an "hg diff") to share with a co-worker, Bob::
+
+ $ hg amend -m '[entities] fix frobulator (closes #42)'
+
+Note that we also fix the commit message. (For recovering MQ users: this
+is just like "hg qrefresh -m").
+
+Before leaving, let's push to the central shared repository. That will
+give Bob the signal that something is ripe for review / further amendments::
+
+ $ hg push # was done with a modern mercurial, draft phase is preserved
+
+The next day, Bob, who arrives very early, can immediately work out
+some glitches in the patch.
+
+He then starts two others, for ticket #43 and #44 and finally commits them.
+Then, as original worker arrives, he pushes his stuff.
+
+Alice, now equipped with enough properly sugared coffee to survive the
+next two hours::
+
+ $ hg pull
+
+Then::
+
+ $ hg up "tip ~ 2"
+
+brings her to yesterday's patch. Indeed the patch serial number has
+increased (827 still exists but has been obsoleted).
+
+She understands that her original patch has been altered. But how did it
+evolve?
+
+The enhanced hgview shows the two patches. By default only the most
+recent version of a patch is shown.
+
+Now, when Alice installed the mutable-history extensions, she got an alias
+that allows her to see the diff between two amendments, defined like this::
+
+ odiff=diff --rev 'limit(obsparents(.),1)' --rev .
+
+She can see exactly how Bob amended her work.
+
+* odiff
+
+
+Amend ... Stabilize
+--------------------
+
+Almost perfect! Alice just needs to fix a half dozen grammar oddities in
+the new docstrings and it will be publishable.
+
+Then, another round of:
+
+ $ hg amend
+
+and a quick look at hgview ... shows something strange (at first).
+
+Ticket #42 yesterday's version is still showing up, with two descendant lineages:
+
+* the next version, containing grammar fixes,
+
+* the two stacked changesets for tickets #43 .. 44 committed by Bob.
+
+Indeed, since this changeset still has non-obsolete descendant
+changesets it cannot be hidden. This branch (old version of #42 and
+the two descendants by C.W.) is said to be _unstable_.
+
+Why would one want such a state? Why not auto-stabilize each time "hg
+amend" is typed out?
+
+Alice for one, wouldn't want to merge each time she amends something that
+might conflict with the descendant changesets. Remember she is
+currently updating the very middle of an history!
+
+Being now done with grammar and typo fixes, Alice decides it is time to
+stabilize again the tree. She does::
+
+ $ hg evolve
+
+two times, one for each unstable descendant. The last time, hgview
+shows her a straight line again. Wow! that feels a bit like a
+well-planned surgical operation. At the end, the patient tree has
+been properly trimmed and any conflict properly handled.
+
+Of course nothing fancy really happened: each "stablilize" can be
+understood in terms of a rebase of the next unstable descendant to the
+newest version of its parent (including the possible manual conflict
+resolution intermission ...).
+
+Except that rebase is a destructive (it removes information from the
+repository), unrecoverable operation, and the "evolve + obsolete"
+combo, using changeset copy and obsolescence marker, provides evolution
+semantics by only adding new information to the repository (but more
+on that later).
+
+She pushes again.
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/evolve-faq.rst Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,215 @@
+.. Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
+.. Logilab SA <contact@logilab.fr>
+
+---------------------------------------------------------------------
+Evolve How To
+---------------------------------------------------------------------
+
+
+
+Add a changeset: ``commit``
+------------------------------------------------------------
+
+Just use commit as usual. New changesets will be in the `draft` phase.
+
+Rewrite a changeset: ``commit --amend``
+------------------------------------------------------------
+
+It writes a new changeset combining working-directory parent changes and parent.
+It will work on any `draft` or `secret` changeset. It will not work on `public`
+changesets.
+
+To understand what the result of amend will be I use the two following
+aliases [#]_::
+
+ # diff what amend will look like
+ pdiff=diff --rev .^
+
+ # status what amend will look like
+ pstatus=status --rev .^
+
+This command can even be invoked on changesets with children, provided
+none are public.
+
+.. [#] (defined by the evolve extension for you)
+
+
+
+Move a changeset: ``grab``
+------------------------------------------------------------
+
+You can use ``hg grab <rev>`` to move a rev at your current location, making the
+old version obsolete.
+
+.. note:: grab is an alias for ``hg rebase --dest . --rev $@; hg up <result>``
+
+
+Delete a changeset: ``prune``
+------------------------------------------------------------
+
+A new ``prune`` command allows removing a changeset.
+
+Just use ``hg prune <some-rev>``.
+
+
+Moving within the history: ``gdown`` and ``gup``
+------------------------------------------------------------
+
+While working on mutable part of the history you often need to move between
+mutable commits.
+
+You just need to use standard update to work with evolve. For convenience, you
+can use ``hg gup`` to move to the child commit or ``hg gdown`` to move to the parent commit.
+
+Those command have ``previous`` and ``next`` alias.
+
+.. note:: Those commands only exist for the convenience of getting qpush and qpop
+ feeling back.
+
+Collapse changesets: ``fold``
+------------------------------------------------------------
+
+You can use ``hg fold`` to collapse multiple changesets in a single one.
+
+It takes two forms:
+
+``hg fold <rev>`` folds everything from you current changeset to `<rev>`
+
+``hg fold -r <revset>`` fold everything changeset matching the revset together.
+
+Getting changes out of a commit
+------------------------------------------------------------
+
+The ``hg uncommit`` command lets you rewrite the parent commit without
+selected changed files. Target files content is not altered and
+appears again as "modified"::
+
+ $ hg st
+ M babar
+ M celestine
+ $ hg commit babar celestine
+ $ hg st
+ $ hg uncommit celestine
+ $ hg status
+ M celestine
+
+Split a changeset
+-----------------------
+
+To split on file boundaries, just use ``uncommit`` command.
+
+If you need a fine-grained split, there is no official command for that yet.
+However, it is easily achieved by manual operation::
+
+ ### you want to split changeset A: 42
+ # update to A parent
+ $ hg up 42^
+ # restore content from A
+ $ hg revert -r 42 --all
+ # partially commit the first part
+ $ hg record
+ # commit the second part
+ $ hg commit
+ # informs mercurial of what appened
+ # current changeset (.) and previous one (.^) replace A (42)
+ $ hg prune --new . --new .^ 42
+
+For more complexe scenario we recommend the use of the histedit_ extension.
+
+.. _histedit: http://mercurial.selenic.com/wiki/HisteditExtension
+
+
+Update my current work in progress after a pull
+----------------------------------------------
+
+Whenever you are working on some changesets, it is more likely that a pull
+will, eventually, import new changesets in your tree.
+
+And it is likely that you will want your work in progress changesets to be
+rebased on the top of this newly imported subtree.
+
+Doing so is only a matter of rebasing.
+
+
+
+Move multiple changesets: ``rebase``
+------------------------------------------------------------
+
+You can still use rebase to move a whole segment of the changeset graph together.
+
+.. warning:: Beware that rebasing changesets already obsolete will likely result in
+ divergent versions of the changesets.
+
+Resolve history troubles: ``evolve``
+------------------------------------------------------------
+
+When you rewrite (amend) a changeset with children without rewriting
+those children you create *unstable* changesets and *suspended
+obsolete* changesets.
+
+When you are finished amending a given changeset, you will want to
+declare it stable, in other words rebase its former descendants on its
+newest version.
+
+You can also use evolve to solve `bumped` and `divergent` changeset/
+
+
+Fix my history afterward: ``prune -n``
+------------------------------------------------------------
+
+Sometimes you need to create an obsolete marker by hand. This may happen when
+upstream has applied some of your patches for example.
+
+you can use ``hg prune <old-changeset> --succ <new-changeset>`` to add obsolete
+marker.
+
+View diff from the last amend
+------------------------------------------------------------
+
+An ``odiff`` alias have been added by ``enable.sh``
+
+::
+ [alias]
+ odiff = diff --rev 'limit(precursors(.),1)' --rev .
+
+View obsolete markers
+------------------------------------------------------------
+
+hgview_ is the only viewer that currently supports this feature. You
+need version 1.6.2
+
+.. _hgview: http://www.logilab.org/project/hgview/
+
+.. image:: figures/hgview-example.png
+ :scale: 50%
+
+
+You can also use a debug command
+
+ $ hg debugobsolete
+ 5eb72dbe0cb4 e8db4aa611f6
+ c4cbebac3751 4f1c269eab68
+
+
+
+Important Note
+=====================================================================
+
+View change to your file
+------------------------------------------------------------
+
+Extinct changesets are hidden using the *hidden* feature of mercurial.
+
+Only ``hg log`` and ``hgview`` support it, other
+graphical viewer do not.
+
+You can use ``hg log --graph --hidden`` from the command line
+
+
+
+
+
+
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/evolve-good-practice.rst Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,47 @@
+.. Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
+.. Logilab SA <contact@logilab.fr>
+
+-----------------------------------------
+Good practice for (early) users of evolve
+-----------------------------------------
+
+Avoid unstability
+--------------------------------
+
+The less unstability you have the less you need to resolve.
+
+Evolve is not yet able to detect and solve every situation. And your mind is
+not ready neither.
+
+Branch as much as possible
+--------------------------------
+
+This is not MQ; you are not constrained to linear history.
+
+Making a branch per independent branch will help you avoid unstability
+and conflict.
+
+Rewrite your changes only
+------------------------------------------------
+
+There is no descent conflict detection and handling right now.
+Rewriting other people's changesets guarantees that you will get
+conflicts. Communicate with your fellow developers before trying to
+touch other people's work (which is a good pratice in any case).
+
+Using multiple branches will help you to achieve this goal.
+
+Prefer pushing unstability to touching other people changesets
+--------------------------------------------------------------
+
+
+If you have children changesets from other people that you don't really care
+about, prefer not altering them to risking a conflict by stabilizing them.
+
+
+Do not get too confident
+---------------------------
+
+This is an experimental extension and a complex concept. This is beautiful,
+powerful and robust on paper, but the tool and your mind may not be prepared for
+all situations yet.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/edit-is-rewrite-step1.svg Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,509 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="773.15637"
+ height="740.48505"
+ id="svg3404"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="edit-is-rewrite-step1.svg">
+ <defs
+ id="defs3406">
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM"
+ style="overflow:visible">
+ <path
+ id="path6393"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotL"
+ style="overflow:visible">
+ <path
+ id="path6390"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.8,0,0,0.8,5.92,0.8)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ id="path6334"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,4,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Mstart"
+ style="overflow:visible">
+ <path
+ id="path6352"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(0.6,0.6)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible">
+ <path
+ id="path6331"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective3411" />
+ <inkscape:perspective
+ id="perspective5699"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective5753"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective5784"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.57"
+ inkscape:cx="215.04832"
+ inkscape:cy="422.53048"
+ inkscape:document-units="px"
+ showgrid="false"
+ inkscape:snap-global="true"
+ inkscape:window-width="1280"
+ inkscape:window-height="776"
+ inkscape:window-x="0"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="g6029"
+ fit-margin-top="5"
+ fit-margin-right="5"
+ fit-margin-bottom="5"
+ fit-margin-left="5">
+ <inkscape:grid
+ type="xygrid"
+ id="grid6315"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ originx="5.0135572px"
+ originy="4.9994442px" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3409">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="babar"
+ transform="translate(12.275017,-145.05915)">
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot5626"
+ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"><flowRegion
+ id="flowRegion5628"><rect
+ id="rect5630"
+ width="120.20815"
+ height="52.527931"
+ x="153.54318"
+ y="706.89001"
+ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans" /></flowRegion><flowPara
+ id="flowPara5636" /></flowRoot> <flowRoot
+ xml:space="preserve"
+ id="flowRoot5653"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"><flowRegion
+ id="flowRegion5655"><rect
+ id="rect5657"
+ width="145"
+ height="49.285713"
+ x="565.71429"
+ y="683.07648" /></flowRegion><flowPara
+ id="flowPara5659" /></flowRoot> <g
+ id="g10759"
+ transform="translate(582.45614,-14.035088)">
+ <g
+ transform="translate(-422.06809,-8.1395349)"
+ id="g6029">
+ <rect
+ style="fill:#ffffff;stroke:#000000;stroke-width:4.09652519;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3414"
+ width="291.61774"
+ height="107.33205"
+ x="68.11969"
+ y="793.33905" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans"
+ x="75.714279"
+ y="835.2193"
+ id="text5643"><tspan
+ sodipodi:role="line"
+ id="tspan5645"
+ x="75.714279"
+ y="835.2193"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none">";<tspan
+ style="fill:#008000;stroke:#008000"
+ id="tspan5889">Alice</tspan>;Babar"</tspan><tspan
+ sodipodi:role="line"
+ x="75.714279"
+ y="885.2193"
+ id="tspan5649"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none">⟶ <tspan
+ id="tspan6297"
+ style="fill:#c8ab37;stroke:#c8ab37">19b08111</tspan></tspan></text>
+ </g>
+ <g
+ transform="translate(-602.95683,-59.767404)"
+ id="g6023">
+ <rect
+ style="fill:#ffffff;stroke:#000000;stroke-width:6.09169483;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3414-7"
+ width="657.06445"
+ height="105.33688"
+ x="66.285065"
+ y="639.61066" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans"
+ x="72.882072"
+ y="680.49335"
+ id="text5643-6"><tspan
+ sodipodi:role="line"
+ id="tspan5645-5"
+ x="72.882072"
+ y="680.49335"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none">"<tspan
+ id="tspan6203"
+ style="fill:#c8c4b7;stroke:#c8c4b7;stroke-opacity:1">19b08111</tspan>;<tspan
+ style="fill:#008000;stroke:#008000"
+ id="tspan5885">Alice</tspan>;Babar<tspan
+ id="tspan6287"
+ style="fill:#ff0000;stroke:#ff0000">,Celeste</tspan>"</tspan><tspan
+ sodipodi:role="line"
+ x="72.882072"
+ y="730.49335"
+ id="tspan5649-6"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none">⟶ <tspan
+ id="tspan6035"
+ style="stroke:#009400;stroke-opacity:1"><tspan
+ id="tspan6039"
+ style="stroke:#00b500;stroke-opacity:1"><tspan
+ id="tspan6043"
+ style="stroke:#00ae00;stroke-opacity:1"><tspan
+ id="tspan6045"
+ style="stroke:#00ad00;stroke-opacity:1"><tspan
+ id="tspan6047"
+ style="stroke:#00ac00;stroke-opacity:1"><tspan
+ id="tspan6051"
+ style="stroke:#00aa00;stroke-opacity:1"><tspan
+ id="tspan6053"
+ style="stroke:#00a800;stroke-opacity:1"><tspan
+ id="tspan6055"
+ style="stroke:#00a600;stroke-opacity:1"><tspan
+ id="tspan6057"
+ style="stroke:#00a400;stroke-opacity:1"><tspan
+ id="tspan6059"
+ style="stroke:#00a100;stroke-opacity:1"><tspan
+ id="tspan6061"
+ style="stroke:#009f00;stroke-opacity:1"><tspan
+ id="tspan6063"
+ style="stroke:#009d00;stroke-opacity:1"><tspan
+ id="tspan6065"
+ style="stroke:#009900;stroke-opacity:1"><tspan
+ id="tspan6067"
+ style="stroke:#009800;stroke-opacity:1"><tspan
+ id="tspan6069"
+ style="stroke:#009700;stroke-opacity:1"><tspan
+ id="tspan6071"
+ style="stroke:#009800;stroke-opacity:1"><tspan
+ id="tspan6073"
+ style="stroke:#009900;stroke-opacity:1"><tspan
+ id="tspan6077"
+ style="stroke:#009c00;stroke-opacity:1"><tspan
+ id="tspan6079"
+ style="stroke:#009d00;stroke-opacity:1"><tspan
+ id="tspan6081"
+ style="stroke:#009e00;stroke-opacity:1"><tspan
+ id="tspan6083"
+ style="stroke:#009f00;stroke-opacity:1"><tspan
+ id="tspan6085"
+ style="stroke:#00a100;stroke-opacity:1"><tspan
+ id="tspan6087"
+ style="stroke:#00a200;stroke-opacity:1"><tspan
+ id="tspan6089"
+ style="stroke:#00a500;stroke-opacity:1"><tspan
+ id="tspan6091"
+ style="stroke:#00a600;stroke-opacity:1"><tspan
+ id="tspan6093"
+ style="stroke:#00a500;stroke-opacity:1"><tspan
+ id="tspan6095"
+ style="stroke:#00a200;stroke-opacity:1"><tspan
+ id="tspan6097"
+ style="stroke:#00a100;stroke-opacity:1"><tspan
+ id="tspan6099"
+ style="stroke:#009f00;stroke-opacity:1"><tspan
+ id="tspan6101"
+ style="stroke:#009c00;stroke-opacity:1"><tspan
+ id="tspan6103"
+ style="stroke:#009700;stroke-opacity:1"><tspan
+ id="tspan6105"
+ style="stroke:#009200;stroke-opacity:1"><tspan
+ id="tspan6107"
+ style="stroke:#008b00;stroke-opacity:1"><tspan
+ id="tspan6109"
+ style="stroke:#008500;stroke-opacity:1"><tspan
+ id="tspan6111"
+ style="stroke:#007c00;stroke-opacity:1"><tspan
+ id="tspan6113"
+ style="stroke:#007500;stroke-opacity:1"><tspan
+ id="tspan6115"
+ style="stroke:#006b00;stroke-opacity:1"><tspan
+ id="tspan6117"
+ style="stroke:#006100;stroke-opacity:1"><tspan
+ id="tspan6119"
+ style="stroke:#005800;stroke-opacity:1"><tspan
+ id="tspan6121"
+ style="stroke:#004d00;stroke-opacity:1"><tspan
+ id="tspan6123"
+ style="stroke:#004500;stroke-opacity:1"><tspan
+ id="tspan6125"
+ style="stroke:#003b00;stroke-opacity:1"><tspan
+ id="tspan6127"
+ style="stroke:#003300;stroke-opacity:1"><tspan
+ id="tspan6129"
+ style="stroke:#002900;stroke-opacity:1"><tspan
+ id="tspan6131"
+ style="stroke:#002200;stroke-opacity:1"><tspan
+ id="tspan6133"
+ style="stroke:#001900;stroke-opacity:1"><tspan
+ id="tspan6135"
+ style="stroke:#001300;stroke-opacity:1"><tspan
+ id="tspan6137"
+ style="stroke:#000b00;stroke-opacity:1"><tspan
+ id="tspan6139"
+ style="stroke:#000700;stroke-opacity:1"><tspan
+ id="tspan6141"
+ style="stroke:#000000;stroke-opacity:1"><tspan
+ id="tspan6145"
+ style="stroke:#d00000;stroke-opacity:1"><tspan
+ id="tspan6147"
+ style="stroke:#d10000;stroke-opacity:1"><tspan
+ id="tspan6149"
+ style="stroke:#d30000;stroke-opacity:1"><tspan
+ id="tspan6151"
+ style="stroke:#d80000;stroke-opacity:1"><tspan
+ id="tspan6153"
+ style="stroke:#db0000;stroke-opacity:1"><tspan
+ id="tspan6155"
+ style="stroke:#e10000;stroke-opacity:1"><tspan
+ id="tspan6157"
+ style="stroke:#e40000;stroke-opacity:1"><tspan
+ id="tspan6159"
+ style="stroke:#eb0000;stroke-opacity:1"><tspan
+ id="tspan6161"
+ style="stroke:#ef0000;stroke-opacity:1"><tspan
+ id="tspan6163"
+ style="stroke:#f50000;stroke-opacity:1"><tspan
+ id="tspan6165"
+ style="stroke:#f90000;stroke-opacity:1"><tspan
+ id="tspan6167"
+ style="stroke:#fd0000;stroke-opacity:1"><tspan
+ id="tspan6169"
+ style="stroke:#ff0000;stroke-opacity:1"><tspan
+ id="tspan6185"
+ style="fill:#010000;fill-opacity:1"><tspan
+ id="tspan6187"
+ style="fill:#4c0000;fill-opacity:1"><tspan
+ id="tspan6189"
+ style="fill:#810000;fill-opacity:1"><tspan
+ id="tspan6191"
+ style="fill:#c70000;fill-opacity:1"><tspan
+ id="tspan6193"
+ style="fill:#ee0000;fill-opacity:1"><tspan
+ id="tspan6195"
+ style="fill:#ff0000;fill-opacity:1"><tspan
+ id="tspan6279"
+ style="fill:#c8ab37"><tspan
+ id="tspan6281"
+ style="stroke:#c8ab37">925d8319 </tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></text>
+ </g>
+ <g
+ transform="translate(-582.55815,-32.55814)"
+ id="g6009">
+ <rect
+ style="fill:#ffffff;stroke:#000000;stroke-width:5.109797;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3414-7-0"
+ width="458.04636"
+ height="106.31878"
+ x="145.39543"
+ y="199.2028" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans"
+ x="152.48338"
+ y="240.57646"
+ id="text5643-6-0"><tspan
+ sodipodi:role="line"
+ x="152.48338"
+ y="240.57646"
+ id="tspan5649-6-7"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none">"<tspan
+ id="tspan6305"
+ style="fill:#c8c4b7;stroke:#c8c4b7">6fcdd7fe</tspan>;<tspan
+ style="fill:#008000;stroke:#008000"
+ id="tspan5877">Bob</tspan>;Babar"</tspan><tspan
+ sodipodi:role="line"
+ x="152.48338"
+ y="290.57648"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="tspan5823"><tspan
+ id="tspan6309"
+ style="fill:#c8ab37;stroke:#c8ab37">⟶ebc2b5a1 </tspan></tspan><tspan
+ sodipodi:role="line"
+ x="152.48338"
+ y="340.57648"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="tspan5825" /></text>
+ </g>
+ <g
+ transform="translate(-574.4186,-84.34382)"
+ id="g6016">
+ <rect
+ style="fill:#ffffff;stroke:#000000;stroke-width:6.52355862;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect3414-7-0-7"
+ width="756.63257"
+ height="104.90502"
+ x="-12.03722"
+ y="458.04919" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans"
+ x="-5.6561542"
+ y="498.71597"
+ id="text5643-6-0-7"><tspan
+ sodipodi:role="line"
+ x="-5.6561542"
+ y="498.71597"
+ id="tspan5649-6-7-5"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none">"<tspan
+ id="tspan6289"
+ style="fill:#c8c4b7;stroke:#c8c4b7">925d8319</tspan>;<tspan
+ style="fill:#008000;stroke:#008000"
+ id="tspan5881">Alice</tspan>;Babar,Celeste<tspan
+ id="tspan6303"
+ style="fill:#ff0000;stroke:#ff0000">,flore</tspan>"</tspan><tspan
+ sodipodi:role="line"
+ x="-5.6561542"
+ y="548.71594"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="tspan5809">⟶ <tspan
+ id="tspan6299"
+ style="fill:#c8ab37;stroke:#c8ab37">6fcdd7fe </tspan></tspan><tspan
+ sodipodi:role="line"
+ x="-5.6561542"
+ y="598.71594"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="tspan5811" /></text>
+ </g>
+ <path
+ inkscape:connection-start="#g6016"
+ inkscape:connection-end="#g6009"
+ inkscape:connector-type="polyline"
+ id="path6317"
+ d="m -208.13954,373.70537 0,-100.74193"
+ style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#DotM);marker-end:none"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connection-end="#g6023"
+ inkscape:connection-start="#g6029"
+ inkscape:connector-type="polyline"
+ id="path6321"
+ d="m -208.13953,785.19952 -1e-5,-100.01938"
+ style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.79999995;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#DotM);marker-end:none"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connection-end="#g6023"
+ inkscape:connection-start="#g6016"
+ inkscape:connector-type="polyline"
+ id="path6323"
+ d="m -208.13954,478.6104 0,101.23285"
+ style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-mid:none;marker-end:url(#DotM)"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/edit-is-rewrite-step2.svg Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,832 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1597.0645"
+ height="768.49182"
+ id="svg3404"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="edit-is-rewrite-step2.svg">
+ <defs
+ id="defs3406">
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM"
+ style="overflow:visible">
+ <path
+ id="path6393"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotL"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotL"
+ style="overflow:visible">
+ <path
+ id="path6390"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.8,0,0,0.8,5.92,0.8)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Mstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mstart"
+ style="overflow:visible">
+ <path
+ id="path6334"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,4,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow2Mstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow2Mstart"
+ style="overflow:visible">
+ <path
+ id="path6352"
+ style="font-size:12px;fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round"
+ d="M 8.7185878,4.0337352 -2.2072895,0.01601326 8.7185884,-4.0017078 c -1.7454984,2.3720609 -1.7354408,5.6174519 -6e-7,8.035443 z"
+ transform="scale(0.6,0.6)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible">
+ <path
+ id="path6331"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective3411" />
+ <inkscape:perspective
+ id="perspective5699"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective5753"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective5784"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective11514"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-8"
+ style="overflow:visible">
+ <path
+ id="path6393-2"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker11520"
+ style="overflow:visible">
+ <path
+ id="path11522"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.57"
+ inkscape:cx="1091.46"
+ inkscape:cy="493.26469"
+ inkscape:document-units="px"
+ showgrid="false"
+ inkscape:snap-global="true"
+ inkscape:window-width="1280"
+ inkscape:window-height="776"
+ inkscape:window-x="0"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer4"
+ fit-margin-top="5"
+ fit-margin-right="5"
+ fit-margin-bottom="5"
+ fit-margin-left="5">
+ <inkscape:grid
+ type="xygrid"
+ id="grid6315"
+ empspacing="5"
+ visible="true"
+ enabled="true"
+ snapvisiblegridlinesonly="true"
+ originx="424.40857px"
+ originy="4.9994042px" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata3409">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:groupmode="layer"
+ id="layer4"
+ inkscape:label="babar"
+ transform="translate(888.68669,-124.06992)">
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot5626"
+ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans"><flowRegion
+ id="flowRegion5628"><rect
+ id="rect5630"
+ width="120.20815"
+ height="52.527931"
+ x="153.54318"
+ y="706.89001"
+ style="font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;font-family:Bitstream Vera Sans;-inkscape-font-specification:Bitstream Vera Sans" /></flowRegion><flowPara
+ id="flowPara5636" /></flowRoot> <flowRoot
+ xml:space="preserve"
+ id="flowRoot5653"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"><flowRegion
+ id="flowRegion5655"><rect
+ id="rect5657"
+ width="145"
+ height="49.285713"
+ x="565.71429"
+ y="683.07648" /></flowRegion><flowPara
+ id="flowPara5659" /></flowRoot> <g
+ id="g6029"
+ transform="translate(-296.62861,-15.157079)">
+ <rect
+ y="793.33905"
+ x="68.11969"
+ height="107.33205"
+ width="291.61774"
+ id="rect3414"
+ style="fill:#ffffff;stroke:#000000;stroke-width:4.09652519000000037;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <text
+ id="text5643"
+ y="835.2193"
+ x="75.714279"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ y="835.2193"
+ x="75.714279"
+ id="tspan5645"
+ sodipodi:role="line">";<tspan
+ style="fill:#008000;stroke:#008000"
+ id="tspan12068">Alice</tspan>;Babar"</tspan><tspan
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="tspan5649"
+ y="885.2193"
+ x="75.714279"
+ sodipodi:role="line">⟶ <tspan
+ style="fill:#c8ab37;stroke:#c8ab37"
+ id="tspan6297">19b08111</tspan></tspan></text>
+ </g>
+ <g
+ id="g6023"
+ transform="translate(-897.69367,-93.100738)"
+ style="opacity:0.5">
+ <rect
+ y="639.61066"
+ x="66.285065"
+ height="105.33688"
+ width="657.06445"
+ id="rect3414-7"
+ style="fill:#ffffff;stroke:#000000;stroke-width:5;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:20, 10;stroke-dashoffset:0" />
+ <text
+ id="text5643-6"
+ y="680.49335"
+ x="72.882072"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ y="680.49335"
+ x="72.882072"
+ id="tspan5645-5"
+ sodipodi:role="line">"<tspan
+ style="fill:#c8c4b7;stroke:#c8c4b7;stroke-opacity:1"
+ id="tspan6203">19b08111</tspan>;<tspan
+ style="fill:#008000;stroke:#008000"
+ id="tspan12072">Alice</tspan>;Babar<tspan
+ style="fill:#ff0000;stroke:#ff0000"
+ id="tspan6287">,Celeste</tspan>"</tspan><tspan
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="tspan5649-6"
+ y="730.49335"
+ x="72.882072"
+ sodipodi:role="line">⟶ <tspan
+ style="stroke:#009400;stroke-opacity:1"
+ id="tspan6035"><tspan
+ style="stroke:#00b500;stroke-opacity:1"
+ id="tspan6039"><tspan
+ style="stroke:#00ae00;stroke-opacity:1"
+ id="tspan6043"><tspan
+ style="stroke:#00ad00;stroke-opacity:1"
+ id="tspan6045"><tspan
+ style="stroke:#00ac00;stroke-opacity:1"
+ id="tspan6047"><tspan
+ style="stroke:#00aa00;stroke-opacity:1"
+ id="tspan6051"><tspan
+ style="stroke:#00a800;stroke-opacity:1"
+ id="tspan6053"><tspan
+ style="stroke:#00a600;stroke-opacity:1"
+ id="tspan6055"><tspan
+ style="stroke:#00a400;stroke-opacity:1"
+ id="tspan6057"><tspan
+ style="stroke:#00a100;stroke-opacity:1"
+ id="tspan6059"><tspan
+ style="stroke:#009f00;stroke-opacity:1"
+ id="tspan6061"><tspan
+ style="stroke:#009d00;stroke-opacity:1"
+ id="tspan6063"><tspan
+ style="stroke:#009900;stroke-opacity:1"
+ id="tspan6065"><tspan
+ style="stroke:#009800;stroke-opacity:1"
+ id="tspan6067"><tspan
+ style="stroke:#009700;stroke-opacity:1"
+ id="tspan6069"><tspan
+ style="stroke:#009800;stroke-opacity:1"
+ id="tspan6071"><tspan
+ style="stroke:#009900;stroke-opacity:1"
+ id="tspan6073"><tspan
+ style="stroke:#009c00;stroke-opacity:1"
+ id="tspan6077"><tspan
+ style="stroke:#009d00;stroke-opacity:1"
+ id="tspan6079"><tspan
+ style="stroke:#009e00;stroke-opacity:1"
+ id="tspan6081"><tspan
+ style="stroke:#009f00;stroke-opacity:1"
+ id="tspan6083"><tspan
+ style="stroke:#00a100;stroke-opacity:1"
+ id="tspan6085"><tspan
+ style="stroke:#00a200;stroke-opacity:1"
+ id="tspan6087"><tspan
+ style="stroke:#00a500;stroke-opacity:1"
+ id="tspan6089"><tspan
+ style="stroke:#00a600;stroke-opacity:1"
+ id="tspan6091"><tspan
+ style="stroke:#00a500;stroke-opacity:1"
+ id="tspan6093"><tspan
+ style="stroke:#00a200;stroke-opacity:1"
+ id="tspan6095"><tspan
+ style="stroke:#00a100;stroke-opacity:1"
+ id="tspan6097"><tspan
+ style="stroke:#009f00;stroke-opacity:1"
+ id="tspan6099"><tspan
+ style="stroke:#009c00;stroke-opacity:1"
+ id="tspan6101"><tspan
+ style="stroke:#009700;stroke-opacity:1"
+ id="tspan6103"><tspan
+ style="stroke:#009200;stroke-opacity:1"
+ id="tspan6105"><tspan
+ style="stroke:#008b00;stroke-opacity:1"
+ id="tspan6107"><tspan
+ style="stroke:#008500;stroke-opacity:1"
+ id="tspan6109"><tspan
+ style="stroke:#007c00;stroke-opacity:1"
+ id="tspan6111"><tspan
+ style="stroke:#007500;stroke-opacity:1"
+ id="tspan6113"><tspan
+ style="stroke:#006b00;stroke-opacity:1"
+ id="tspan6115"><tspan
+ style="stroke:#006100;stroke-opacity:1"
+ id="tspan6117"><tspan
+ style="stroke:#005800;stroke-opacity:1"
+ id="tspan6119"><tspan
+ style="stroke:#004d00;stroke-opacity:1"
+ id="tspan6121"><tspan
+ style="stroke:#004500;stroke-opacity:1"
+ id="tspan6123"><tspan
+ style="stroke:#003b00;stroke-opacity:1"
+ id="tspan6125"><tspan
+ style="stroke:#003300;stroke-opacity:1"
+ id="tspan6127"><tspan
+ style="stroke:#002900;stroke-opacity:1"
+ id="tspan6129"><tspan
+ style="stroke:#002200;stroke-opacity:1"
+ id="tspan6131"><tspan
+ style="stroke:#001900;stroke-opacity:1"
+ id="tspan6133"><tspan
+ style="stroke:#001300;stroke-opacity:1"
+ id="tspan6135"><tspan
+ style="stroke:#000b00;stroke-opacity:1"
+ id="tspan6137"><tspan
+ style="stroke:#000700;stroke-opacity:1"
+ id="tspan6139"><tspan
+ style="stroke:#000000;stroke-opacity:1"
+ id="tspan6141"><tspan
+ style="stroke:#d00000;stroke-opacity:1"
+ id="tspan6145"><tspan
+ style="stroke:#d10000;stroke-opacity:1"
+ id="tspan6147"><tspan
+ style="stroke:#d30000;stroke-opacity:1"
+ id="tspan6149"><tspan
+ style="stroke:#d80000;stroke-opacity:1"
+ id="tspan6151"><tspan
+ style="stroke:#db0000;stroke-opacity:1"
+ id="tspan6153"><tspan
+ style="stroke:#e10000;stroke-opacity:1"
+ id="tspan6155"><tspan
+ style="stroke:#e40000;stroke-opacity:1"
+ id="tspan6157"><tspan
+ style="stroke:#eb0000;stroke-opacity:1"
+ id="tspan6159"><tspan
+ style="stroke:#ef0000;stroke-opacity:1"
+ id="tspan6161"><tspan
+ style="stroke:#f50000;stroke-opacity:1"
+ id="tspan6163"><tspan
+ style="stroke:#f90000;stroke-opacity:1"
+ id="tspan6165"><tspan
+ style="stroke:#fd0000;stroke-opacity:1"
+ id="tspan6167"><tspan
+ style="stroke:#ff0000;stroke-opacity:1"
+ id="tspan6169"><tspan
+ style="fill:#010000;fill-opacity:1"
+ id="tspan6185"><tspan
+ style="fill:#4c0000;fill-opacity:1"
+ id="tspan6187"><tspan
+ style="fill:#810000;fill-opacity:1"
+ id="tspan6189"><tspan
+ style="fill:#c70000;fill-opacity:1"
+ id="tspan6191"><tspan
+ style="fill:#ee0000;fill-opacity:1"
+ id="tspan6193"><tspan
+ style="fill:#ff0000;fill-opacity:1"
+ id="tspan6195"><tspan
+ style="fill:#c8ab37"
+ id="tspan6279"><tspan
+ style="stroke:#c8ab37"
+ id="tspan6281">925d8319 </tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></text>
+ </g>
+ <g
+ id="g6009"
+ transform="translate(-877.29499,-65.891474)"
+ style="opacity:0.5">
+ <rect
+ y="199.2028"
+ x="145.39543"
+ height="106.31878"
+ width="458.04636"
+ id="rect3414-7-0"
+ style="fill:#ffffff;stroke:#000000;stroke-width:5;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:20, 10;stroke-dashoffset:0" />
+ <text
+ id="text5643-6-0"
+ y="240.57646"
+ x="152.48338"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="tspan5649-6-7"
+ y="240.57646"
+ x="152.48338"
+ sodipodi:role="line">"<tspan
+ style="fill:#c8c4b7;stroke:#c8c4b7"
+ id="tspan6305">6fcdd7fe</tspan>;<tspan
+ style="fill:#008000;stroke:#008000"
+ id="tspan12080">Bob</tspan>;Babar"</tspan><tspan
+ id="tspan5823"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ y="290.57648"
+ x="152.48338"
+ sodipodi:role="line"><tspan
+ style="fill:#c8ab37;stroke:#c8ab37"
+ id="tspan6309">⟶ebc2b5a1 </tspan></tspan><tspan
+ id="tspan5825"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ y="340.57648"
+ x="152.48338"
+ sodipodi:role="line" /></text>
+ </g>
+ <g
+ id="g6016"
+ transform="translate(-869.15544,-117.67716)"
+ style="opacity:0.5">
+ <rect
+ y="458.04919"
+ x="-12.03722"
+ height="104.90502"
+ width="756.63257"
+ id="rect3414-7-0-7"
+ style="fill:#ffffff;stroke:#000000;stroke-width:5;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:20, 10;stroke-dashoffset:0" />
+ <text
+ id="text5643-6-0-7"
+ y="498.71597"
+ x="-5.6561542"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="tspan5649-6-7-5"
+ y="498.71597"
+ x="-5.6561542"
+ sodipodi:role="line">"<tspan
+ style="fill:#c8c4b7;stroke:#c8c4b7"
+ id="tspan6289">925d8319</tspan>;<tspan
+ style="fill:#008000;stroke:#008000"
+ id="tspan12076">Alice</tspan>;Babar,Celeste<tspan
+ style="fill:#ff0000;stroke:#ff0000"
+ id="tspan6303">,flore<tspan
+ style="fill:#000000;stroke:#000000"
+ id="tspan6313">"</tspan></tspan></tspan><tspan
+ id="tspan5809"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ y="548.71594"
+ x="-5.6561542"
+ sodipodi:role="line">⟶ <tspan
+ style="fill:#c8ab37;stroke:#c8ab37"
+ id="tspan6299">6fcdd7fe </tspan></tspan><tspan
+ id="tspan5811"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ y="598.71594"
+ x="-5.6561542"
+ sodipodi:role="line" /></text>
+ </g>
+ <path
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#DotM);marker-end:none"
+ d="m -502.87638,340.37203 0,-100.74192"
+ id="path6317"
+ inkscape:connector-type="polyline"
+ inkscape:connection-end="#g6009"
+ inkscape:connection-start="#g6016"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:2.79999995000000013;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#DotM);marker-end:none"
+ d="M -179.61512,778.18197 -407.76284,651.8468"
+ id="path6321"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g6029"
+ inkscape:connection-end="#g6023"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-mid:none;marker-end:url(#DotM)"
+ d="m -502.87638,445.27706 0,101.23286"
+ id="path6323"
+ inkscape:connector-type="polyline"
+ inkscape:connection-end="#g6023"
+ inkscape:connection-start="#g6016"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g6023-5"
+ transform="translate(-72.254198,-94.854246)">
+ <rect
+ y="639.61066"
+ x="66.285065"
+ height="105.33688"
+ width="657.06445"
+ id="rect3414-7-5"
+ style="fill:#ffffff;stroke:#000000;stroke-width:5;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <text
+ id="text5643-6-3"
+ y="680.49335"
+ x="72.882072"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ y="680.49335"
+ x="72.882072"
+ id="tspan5645-5-0"
+ sodipodi:role="line">"<tspan
+ style="fill:#c8c4b7;stroke:#c8c4b7;stroke-opacity:1"
+ id="tspan6203-2">19b08111</tspan>;<tspan
+ style="fill:#ff0000;stroke:#ff0000"
+ id="tspan12040">Bob</tspan>;Babar,Celeste"</tspan><tspan
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="tspan5649-6-70"
+ y="730.49335"
+ x="72.882072"
+ sodipodi:role="line">⟶ <tspan
+ style="stroke:#009400;stroke-opacity:1"
+ id="tspan6035-4"><tspan
+ style="stroke:#00b500;stroke-opacity:1"
+ id="tspan6039-3"><tspan
+ style="stroke:#00ae00;stroke-opacity:1"
+ id="tspan6043-2"><tspan
+ style="stroke:#00ad00;stroke-opacity:1"
+ id="tspan6045-5"><tspan
+ style="stroke:#00ac00;stroke-opacity:1"
+ id="tspan6047-2"><tspan
+ style="stroke:#00aa00;stroke-opacity:1"
+ id="tspan6051-8"><tspan
+ style="stroke:#00a800;stroke-opacity:1"
+ id="tspan6053-9"><tspan
+ style="stroke:#00a600;stroke-opacity:1"
+ id="tspan6055-1"><tspan
+ style="stroke:#00a400;stroke-opacity:1"
+ id="tspan6057-7"><tspan
+ style="stroke:#00a100;stroke-opacity:1"
+ id="tspan6059-2"><tspan
+ style="stroke:#009f00;stroke-opacity:1"
+ id="tspan6061-8"><tspan
+ style="stroke:#009d00;stroke-opacity:1"
+ id="tspan6063-7"><tspan
+ style="stroke:#009900;stroke-opacity:1"
+ id="tspan6065-4"><tspan
+ style="stroke:#009800;stroke-opacity:1"
+ id="tspan6067-1"><tspan
+ style="stroke:#009700;stroke-opacity:1"
+ id="tspan6069-4"><tspan
+ style="stroke:#009800;stroke-opacity:1"
+ id="tspan6071-7"><tspan
+ style="stroke:#009900;stroke-opacity:1"
+ id="tspan6073-8"><tspan
+ style="stroke:#009c00;stroke-opacity:1"
+ id="tspan6077-6"><tspan
+ style="stroke:#009d00;stroke-opacity:1"
+ id="tspan6079-8"><tspan
+ style="stroke:#009e00;stroke-opacity:1"
+ id="tspan6081-8"><tspan
+ style="stroke:#009f00;stroke-opacity:1"
+ id="tspan6083-3"><tspan
+ style="stroke:#00a100;stroke-opacity:1"
+ id="tspan6085-6"><tspan
+ style="stroke:#00a200;stroke-opacity:1"
+ id="tspan6087-0"><tspan
+ style="stroke:#00a500;stroke-opacity:1"
+ id="tspan6089-0"><tspan
+ style="stroke:#00a600;stroke-opacity:1"
+ id="tspan6091-3"><tspan
+ style="stroke:#00a500;stroke-opacity:1"
+ id="tspan6093-6"><tspan
+ style="stroke:#00a200;stroke-opacity:1"
+ id="tspan6095-1"><tspan
+ style="stroke:#00a100;stroke-opacity:1"
+ id="tspan6097-5"><tspan
+ style="stroke:#009f00;stroke-opacity:1"
+ id="tspan6099-8"><tspan
+ style="stroke:#009c00;stroke-opacity:1"
+ id="tspan6101-8"><tspan
+ style="stroke:#009700;stroke-opacity:1"
+ id="tspan6103-6"><tspan
+ style="stroke:#009200;stroke-opacity:1"
+ id="tspan6105-2"><tspan
+ style="stroke:#008b00;stroke-opacity:1"
+ id="tspan6107-1"><tspan
+ style="stroke:#008500;stroke-opacity:1"
+ id="tspan6109-0"><tspan
+ style="stroke:#007c00;stroke-opacity:1"
+ id="tspan6111-9"><tspan
+ style="stroke:#007500;stroke-opacity:1"
+ id="tspan6113-5"><tspan
+ style="stroke:#006b00;stroke-opacity:1"
+ id="tspan6115-0"><tspan
+ style="stroke:#006100;stroke-opacity:1"
+ id="tspan6117-9"><tspan
+ style="stroke:#005800;stroke-opacity:1"
+ id="tspan6119-7"><tspan
+ style="stroke:#004d00;stroke-opacity:1"
+ id="tspan6121-7"><tspan
+ style="stroke:#004500;stroke-opacity:1"
+ id="tspan6123-3"><tspan
+ style="stroke:#003b00;stroke-opacity:1"
+ id="tspan6125-5"><tspan
+ style="stroke:#003300;stroke-opacity:1"
+ id="tspan6127-6"><tspan
+ style="stroke:#002900;stroke-opacity:1"
+ id="tspan6129-8"><tspan
+ style="stroke:#002200;stroke-opacity:1"
+ id="tspan6131-6"><tspan
+ style="stroke:#001900;stroke-opacity:1"
+ id="tspan6133-2"><tspan
+ style="stroke:#001300;stroke-opacity:1"
+ id="tspan6135-7"><tspan
+ style="stroke:#000b00;stroke-opacity:1"
+ id="tspan6137-6"><tspan
+ style="stroke:#000700;stroke-opacity:1"
+ id="tspan6139-8"><tspan
+ style="stroke:#000000;stroke-opacity:1"
+ id="tspan6141-5"><tspan
+ style="stroke:#d00000;stroke-opacity:1"
+ id="tspan6145-5"><tspan
+ style="stroke:#d10000;stroke-opacity:1"
+ id="tspan6147-1"><tspan
+ style="stroke:#d30000;stroke-opacity:1"
+ id="tspan6149-3"><tspan
+ style="stroke:#d80000;stroke-opacity:1"
+ id="tspan6151-7"><tspan
+ style="stroke:#db0000;stroke-opacity:1"
+ id="tspan6153-2"><tspan
+ style="stroke:#e10000;stroke-opacity:1"
+ id="tspan6155-6"><tspan
+ style="stroke:#e40000;stroke-opacity:1"
+ id="tspan6157-3"><tspan
+ style="stroke:#eb0000;stroke-opacity:1"
+ id="tspan6159-5"><tspan
+ style="stroke:#ef0000;stroke-opacity:1"
+ id="tspan6161-3"><tspan
+ style="stroke:#f50000;stroke-opacity:1"
+ id="tspan6163-3"><tspan
+ style="stroke:#f90000;stroke-opacity:1"
+ id="tspan6165-5"><tspan
+ style="stroke:#fd0000;stroke-opacity:1"
+ id="tspan6167-1"><tspan
+ style="stroke:#ff0000;stroke-opacity:1"
+ id="tspan6169-8"><tspan
+ style="fill:#010000;fill-opacity:1"
+ id="tspan6185-8"><tspan
+ style="fill:#4c0000;fill-opacity:1"
+ id="tspan6187-3"><tspan
+ style="fill:#810000;fill-opacity:1"
+ id="tspan6189-7"><tspan
+ style="fill:#c70000;fill-opacity:1"
+ id="tspan6191-5"><tspan
+ style="fill:#ee0000;fill-opacity:1"
+ id="tspan6193-3"><tspan
+ style="fill:#ff0000;fill-opacity:1"
+ id="tspan6195-6"><tspan
+ style="fill:#c8ab37"
+ id="tspan6279-2"><tspan
+ style="stroke:#c8ab37"
+ id="tspan6281-0">1a25964c </tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></tspan></text>
+ </g>
+ <g
+ id="g6009-2"
+ transform="matrix(1.0149773,0,0,1,-61.013248,-67.644986)">
+ <rect
+ y="199.28004"
+ x="136.82903"
+ height="106.1643"
+ width="487.27863"
+ id="rect3414-7-0-9"
+ style="fill:#ffffff;stroke:#000000;stroke-width:5.15333318999999968;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <text
+ id="text5643-6-0-8"
+ y="240.57646"
+ x="152.48338"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="tspan5649-6-7-0"
+ y="240.57646"
+ x="152.48338"
+ sodipodi:role="line">"<tspan
+ style="fill:#ff0000;stroke:#ff0000"
+ id="tspan6305-8">6d9e1549</tspan>;<tspan
+ style="fill:#008000;stroke:#008000"
+ id="tspan12088">Bob</tspan>;Babar"</tspan><tspan
+ id="tspan5823-0"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ y="290.57648"
+ x="152.48338"
+ sodipodi:role="line"><tspan
+ style="fill:#c8ab37;stroke:#c8ab37"
+ id="tspan6309-7"><tspan
+ style="fill:#000000;stroke:#000000"
+ id="tspan12060">⟶<tspan
+ style="fill:#c8ab37"
+ id="tspan12064"><tspan
+ style="stroke:#c8ab37"
+ id="tspan12066">dda72e36 </tspan></tspan></tspan></tspan></tspan><tspan
+ id="tspan5825-4"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ y="340.57648"
+ x="152.48338"
+ sodipodi:role="line" /></text>
+ </g>
+ <g
+ id="g6016-0"
+ transform="translate(-43.715968,-119.43067)">
+ <rect
+ y="458.04919"
+ x="-12.03722"
+ height="104.90502"
+ width="756.63257"
+ id="rect3414-7-0-7-4"
+ style="fill:#ffffff;stroke:#000000;stroke-width:5;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <text
+ id="text5643-6-0-7-1"
+ y="498.71597"
+ x="-5.6561542"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="tspan5649-6-7-5-4"
+ y="498.71597"
+ x="-5.6561542"
+ sodipodi:role="line">"<tspan
+ style="fill:#c8c4b7;stroke:#c8c4b7"
+ id="tspan12056">1a25964c</tspan>;<tspan
+ style="fill:#008000;stroke:#008000"
+ id="tspan12084">Alice</tspan>;Babar,Celeste,<tspan
+ style="fill:#ff0000;stroke:#ff0000"
+ id="tspan12050">F</tspan>lore"</tspan><tspan
+ id="tspan5809-3"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ y="548.71594"
+ x="-5.6561542"
+ sodipodi:role="line">⟶ <tspan
+ style="fill:#c8ab37;stroke:#c8ab37"
+ id="tspan6299-4">6d9e1549 </tspan></tspan><tspan
+ id="tspan5811-3"
+ style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:1;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ y="598.71594"
+ x="-5.6561542"
+ sodipodi:role="line" /></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#DotM);marker-end:none"
+ d="m 323.22154,338.61852 1.26559,-100.81916"
+ id="path6317-8"
+ inkscape:connector-type="polyline"
+ inkscape:connection-end="#g6009-2"
+ inkscape:connection-start="#g6016-0"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-mid:none;marker-end:url(#DotM)"
+ d="m 322.5631,443.52355 -1e-5,101.23286"
+ id="path6323-8"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g6016-0"
+ inkscape:connection-end="#g6023-5"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:4;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker11520)"
+ d="M 231.51159,650.09329 10.076033,778.18197"
+ id="path11833"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g6023-5"
+ inkscape:connection-end="#g6029"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/error-conflicting.svg Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="342 1890 349 427" width="349pt" height="427pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2012-03-18 23:47Z</dc:date><!-- Produced by OmniGraffle Professional 5.3.6 --></metadata><defs><filter id="Shadow" filterUnits="userSpaceOnUse"><feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="3.488"/><feOffset in="blur" result="offset" dx="0" dy="4"/><feFlood flood-color="black" flood-opacity=".75" result="flood"/><feComposite in="flood" in2="offset" operator="in"/></filter><font-face font-family="Helvetica" font-size="26" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.31641" slope="0" x-height="522.94922" cap-height="717.2852" ascent="770.0196" descent="-229.98048" font-weight="500"><font-face-src><font-face-name name="Helvetica"/></font-face-src></font-face><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledDiamond_Marker" viewBox="-1 -3 6 6" markerWidth="6" markerHeight="6" color="blue"><g><path d="M 3.7333333 0 L 1.8666667 -1.4 L 0 0 L 1.8666667 1.4 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker><font-face font-family="Helvetica" font-size="17" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.316406" slope="0" x-height="532.22656" cap-height="719.72656" ascent="770.01953" descent="-229.98047" font-weight="bold"><font-face-src><font-face-name name="Helvetica-Bold"/></font-face-src></font-face></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><g><use xl:href="#id465_Graphic" filter="url(#Shadow)"/><use xl:href="#id466_Graphic" filter="url(#Shadow)"/><use xl:href="#id472_Graphic" filter="url(#Shadow)"/><use xl:href="#id471_Graphic" filter="url(#Shadow)"/><use xl:href="#id475_Graphic" filter="url(#Shadow)"/><use xl:href="#id718_Graphic" filter="url(#Shadow)"/><use xl:href="#id722_Graphic" filter="url(#Shadow)"/></g><g id="id465_Graphic"><rect x="362.1148" y="1906.3591" width="308.04614" height="386.30615" fill="white" fill-opacity=".5"/><rect x="362.1148" y="1906.3591" width="308.04614" height="386.30615" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id466_Graphic"><path d="M 460.24097 2058.0142 C 471.311 2069.0842 471.311 2087.032 460.24097 2098.102 C 449.171 2109.1721 431.22305 2109.1721 420.15308 2098.102 C 409.08304 2087.032 409.08304 2069.0842 420.15308 2058.0142 C 431.22305 2046.9441 449.171 2046.9441 460.24097 2058.0142" fill="yellow"/><path d="M 460.24097 2058.0142 C 471.311 2069.0842 471.311 2087.032 460.24097 2098.102 C 449.171 2109.1721 431.22305 2109.1721 420.15308 2098.102 C 409.08304 2087.032 409.08304 2069.0842 420.15308 2058.0142 C 431.22305 2046.9441 449.171 2046.9441 460.24097 2058.0142" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><text transform="translate(422.51984 2062.5581)" fill="maroon"><tspan font-family="Helvetica" font-size="26" font-weight="500" fill="maroon" x="6.1180782" y="25" textLength="23.118164">A’</tspan></text></g><line x1="508.74466" y1="2219.2893" x2="453.23264" y2="2104.9158" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id472_Graphic"><path d="M 525.1753 2222.4712 C 530.71033 2228.0061 530.71033 2236.9802 525.1753 2242.5151 C 519.64032 2248.0503 510.66632 2248.0503 505.13132 2242.5151 C 499.5963 2236.9802 499.5963 2228.0061 505.13132 2222.4712 C 510.66632 2216.936 519.64032 2216.936 525.1753 2222.4712" fill="black"/><path d="M 525.1753 2222.4712 C 530.71033 2228.0061 530.71033 2236.9802 525.1753 2242.5151 C 519.64032 2248.0503 510.66632 2248.0503 505.13132 2242.5151 C 499.5963 2236.9802 499.5963 2228.0061 505.13132 2222.4712 C 510.66632 2216.936 519.64032 2216.936 525.1753 2222.4712" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id471_Graphic"><path d="M 525.1753 2268.4714 C 530.71033 2274.0063 530.71033 2282.9805 525.1753 2288.5154 C 519.64032 2294.0505 510.66632 2294.0505 505.13132 2288.5154 C 499.5963 2282.9805 499.5963 2274.0063 505.13132 2268.4714 C 510.66632 2262.9363 519.64032 2262.9363 525.1753 2268.4714" fill="black"/><path d="M 525.1753 2268.4714 C 530.71033 2274.0063 530.71033 2282.9805 525.1753 2288.5154 C 519.64032 2294.0505 510.66632 2294.0505 505.13132 2288.5154 C 499.5963 2282.9805 499.5963 2274.0063 505.13132 2268.4714 C 510.66632 2262.9363 519.64032 2262.9363 525.1753 2268.4714" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="515.15332" y1="2247.1665" x2="515.15332" y2="2263.8201" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="515.15332" y1="2217.8198" x2="515.15332" y2="2168.1504" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id475_Graphic"><path d="M 535.19727 2119.26 C 546.26727 2130.3301 546.26727 2148.2778 535.19727 2159.3479 C 524.12732 2170.418 506.17935 2170.418 495.10938 2159.3479 C 484.03934 2148.2778 484.03934 2130.3301 495.10938 2119.26 C 506.17935 2108.19 524.12732 2108.19 535.19727 2119.26" fill="yellow" fill-opacity=".5"/><path d="M 535.19727 2119.26 C 546.26727 2130.3301 546.26727 2148.2778 535.19727 2159.3479 C 524.12732 2170.418 506.17935 2170.418 495.10938 2159.3479 C 484.03934 2148.2778 484.03934 2130.3301 495.10938 2119.26 C 506.17935 2108.19 524.12732 2108.19 535.19727 2119.26" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(497.47614 2123.804)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="463.31088" y1="2096.9441" x2="482.01135" y2="2112.2239" marker-end="url(#FilledDiamond_Marker)" stroke="blue" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="1,4"/><g id="id718_Graphic"><path d="M 618.86163 2058.0142 C 629.93164 2069.0842 629.93164 2087.032 618.86163 2098.102 C 607.7917 2109.1721 589.8437 2109.1721 578.77374 2098.102 C 567.70374 2087.032 567.70374 2069.0842 578.77374 2058.0142 C 589.8437 2046.9441 607.7917 2046.9441 618.86163 2058.0142" fill="#ff6"/><path d="M 618.86163 2058.0142 C 629.93164 2069.0842 629.93164 2087.032 618.86163 2098.102 C 607.7917 2109.1721 589.8437 2109.1721 578.77374 2098.102 C 567.70374 2087.032 567.70374 2069.0842 578.77374 2058.0142 C 589.8437 2046.9441 607.7917 2046.9441 618.86163 2058.0142" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><text transform="translate(581.14056 2062.5581)" fill="maroon"><tspan font-family="Helvetica" font-size="26" font-weight="500" fill="maroon" x="3.2298946" y="25" textLength="28.894531">A’’</tspan></text></g><line x1="522.14453" y1="2219.5881" x2="584.5973" y2="2104.3074" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><line x1="574.73132" y1="2095.6902" x2="549.68903" y2="2114.0222" marker-end="url(#FilledDiamond_Marker)" stroke="blue" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="1,4"/><line x1="470.04346" y1="2078.1025" x2="568.97186" y2="2078.2505" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="7"/><g id="id722_Graphic"><path d="M 419.06274 2052.1411 C 459.63675 2034.4656 555.9978 2028.5737 616.85608 2041.7183 C 677.71497 2054.8606 641.8429 2119.8875 608.87634 2121.7026 C 575.90967 2123.5149 553.70416 2096.4143 553.70416 2096.4148 L 498.5315 2097.185 C 498.5315 2097.185 500.21146 2125.1155 452.02893 2119.2227 C 403.84808 2113.3301 378.49112 2069.8181 419.06274 2052.1411 Z" fill="red" fill-opacity=".15000001"/><path d="M 419.06274 2052.1411 C 459.63675 2034.4656 555.9978 2028.5737 616.85608 2041.7183 C 677.71497 2054.8606 641.8429 2119.8875 608.87634 2121.7026 C 575.90967 2123.5149 553.70416 2096.4143 553.70416 2096.4148 L 498.5315 2097.185 C 498.5315 2097.185 500.21146 2125.1155 452.02893 2119.2227 C 403.84808 2113.3301 378.49112 2069.8181 419.06274 2052.1411 Z" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke-dasharray="4,9,1,5"/></g><text transform="translate(481.40805 1999.724)" fill="red"><tspan font-family="Helvetica" font-size="17" font-weight="bold" fill="red" x=".11987305" y="16" textLength="43.429688">Confl</tspan><tspan font-family="Helvetica" font-size="17" font-weight="bold" fill="red" x="43.54956" y="16" textLength="45.330566">icting</tspan></text></g></g></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/error-extinct.svg Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="286 1306 644 435" width="644pt" height="435pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2012-03-18 23:47Z</dc:date><!-- Produced by OmniGraffle Professional 5.3.6 --></metadata><defs><filter id="Shadow" filterUnits="userSpaceOnUse"><feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="3.488"/><feOffset in="blur" result="offset" dx="0" dy="4"/><feFlood flood-color="black" flood-opacity=".75" result="flood"/><feComposite in="flood" in2="offset" operator="in"/></filter><font-face font-family="Helvetica" font-size="26" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.31641" slope="0" x-height="522.94922" cap-height="717.2852" ascent="770.0196" descent="-229.98048" font-weight="500"><font-face-src><font-face-name name="Helvetica"/></font-face-src></font-face><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledDiamond_Marker" viewBox="-1 -2 4 4" markerWidth="4" markerHeight="4" color="blue"><g><path d="M 1.6 0 L .8 -.60000002 L 0 0 L .8 .60000002 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker><font-face font-family="Helvetica" font-size="17" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.316406" slope="0" x-height="532.22656" cap-height="719.72656" ascent="770.01953" descent="-229.98047" font-weight="bold"><font-face-src><font-face-name name="Helvetica-Bold"/></font-face-src></font-face></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><g><use xl:href="#id581_Graphic" filter="url(#Shadow)"/><use xl:href="#id423_Graphic" filter="url(#Shadow)"/><use xl:href="#id422_Graphic" filter="url(#Shadow)"/><use xl:href="#id415_Graphic" filter="url(#Shadow)"/><use xl:href="#id567_Graphic" filter="url(#Shadow)"/><use xl:href="#id588_Graphic" filter="url(#Shadow)"/><use xl:href="#id565_Graphic" filter="url(#Shadow)"/><use xl:href="#id592_Graphic" filter="url(#Shadow)"/><use xl:href="#id595_Graphic" filter="url(#Shadow)"/><use xl:href="#id597_Graphic" filter="url(#Shadow)"/><use xl:href="#id599_Graphic" filter="url(#Shadow)"/><use xl:href="#id604_Graphic" filter="url(#Shadow)"/></g><g id="id581_Graphic"><rect x="538.9198" y="1322.60815" width="371" height="394" fill="white" fill-opacity=".5"/><rect x="538.9198" y="1322.60815" width="371" height="394" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id423_Graphic"><rect x="306.04608" y="1379.2305" width="160" height="280.84644" fill="white" fill-opacity=".5"/><rect x="306.04608" y="1379.2305" width="160" height="280.84644" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id422_Graphic"><circle cx="384.04633" cy="1522.2869" r="28.346533" fill="red"/><circle cx="384.04633" cy="1522.2869" r="28.346533" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(366.36917 1506.7869)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="371.27045" y1="1496.4152" x2="353.8865" y2="1461.212" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><path d="M 394.06836 1589.8818 C 399.60336 1595.4169 399.60336 1604.3907 394.06836 1609.9258 C 388.53336 1615.4608 379.55936 1615.4608 374.02435 1609.9258 C 368.48935 1604.3907 368.48935 1595.4169 374.02435 1589.8818 C 379.55936 1584.3468 388.53336 1584.3468 394.06836 1589.8818" fill="black"/><path d="M 394.06836 1589.8818 C 399.60336 1595.4169 399.60336 1604.3907 394.06836 1609.9258 C 388.53336 1615.4608 379.55936 1615.4608 374.02435 1609.9258 C 368.48935 1604.3907 368.48935 1595.4169 374.02435 1589.8818 C 379.55936 1584.3468 388.53336 1584.3468 394.06836 1589.8818" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><path d="M 394.06836 1635.8817 C 399.60336 1641.4167 399.60336 1650.3906 394.06836 1655.9257 C 388.53336 1661.4607 379.55936 1661.4607 374.02435 1655.9257 C 368.48935 1650.3906 368.48935 1641.4167 374.02435 1635.8817 C 379.55936 1630.3467 388.53336 1630.3467 394.06836 1635.8817" fill="black"/><path d="M 394.06836 1635.8817 C 399.60336 1641.4167 399.60336 1650.3906 394.06836 1655.9257 C 388.53336 1661.4607 379.55936 1661.4607 374.02435 1655.9257 C 368.48935 1650.3906 368.48935 1641.4167 374.02435 1635.8817 C 379.55936 1630.3467 388.53336 1630.3467 394.06836 1635.8817" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="384.05234" y1="1614.577" x2="384.05911" y2="1631.2305" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id415_Graphic"><circle cx="341.11066" cy="1435.3403" r="28.346533" fill="yellow"/><circle cx="341.11066" cy="1435.3403" r="28.346533" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(323.43347 1419.8403)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">B</tspan></text></g><line x1="384.04633" y1="1551.1333" x2="384.04636" y2="1585.2306" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id567_Graphic"><path d="M 649.09058 1405.5331 C 665.0907 1366.53296 703.09058 1353.5331 727.09058 1382.5331 C 751.0899 1411.5319 743.091 1543.5331 730.0907 1547.5327 C 717.09076 1551.5322 681.09106 1566.5331 662.09082 1553.533 C 643.0905 1540.5328 633.091 1444.5325 649.09058 1405.5331 Z" fill="blue" fill-opacity=".15000001"/><path d="M 649.09058 1405.5331 C 665.0907 1366.53296 703.09058 1353.5331 727.09058 1382.5331 C 751.0899 1411.5319 743.091 1543.5331 730.0907 1547.5327 C 717.09076 1551.5322 681.09106 1566.5331 662.09082 1553.533 C 643.0905 1540.5328 633.091 1444.5325 649.09058 1405.5331 Z" stroke="blue" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke-dasharray="4,9,1,5"/></g><line x1="670.96875" y1="1499.7141" x2="608.7143" y2="1440.1655" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><path d="M 763.18304 1609.1852 C 768.7181 1614.7202 768.7181 1623.6941 763.18304 1629.2291 C 757.64807 1634.7642 748.67407 1634.7642 743.1391 1629.2291 C 737.60406 1623.6941 737.60406 1614.7202 743.1391 1609.1852 C 748.67407 1603.6501 757.64807 1603.6501 763.18304 1609.1852" fill="black"/><path d="M 763.18304 1609.1852 C 768.7181 1614.7202 768.7181 1623.6941 763.18304 1629.2291 C 757.64807 1634.7642 748.67407 1634.7642 743.1391 1629.2291 C 737.60406 1623.6941 737.60406 1614.7202 743.1391 1609.1852 C 748.67407 1603.6501 757.64807 1603.6501 763.18304 1609.1852" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><path d="M 763.18304 1655.1852 C 768.7181 1660.7202 768.7181 1669.6941 763.18304 1675.2291 C 757.64807 1680.7642 748.67407 1680.7642 743.1391 1675.2291 C 737.60406 1669.6941 737.60406 1660.7202 743.1391 1655.1852 C 748.67407 1649.6501 757.64807 1649.6501 763.18304 1655.1852" fill="black"/><path d="M 763.18304 1655.1852 C 768.7181 1660.7202 768.7181 1669.6941 763.18304 1675.2291 C 757.64807 1680.7642 748.67407 1680.7642 743.1391 1675.2291 C 737.60406 1669.6941 737.60406 1660.7202 743.1391 1655.1852 C 748.67407 1649.6501 757.64807 1649.6501 763.18304 1655.1852" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="753.16107" y1="1633.8804" x2="753.16107" y2="1650.5339" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id588_Graphic"><circle cx="587.5074" cy="1419.88025" r="28.346518" fill="yellow"/><path d="M 607.55133 1399.8363 C 618.62134 1410.90625 618.62134 1428.85425 607.55133 1439.9242 C 596.4814 1450.9943 578.5334 1450.9943 567.46344 1439.9242 C 556.39343 1428.85425 556.39343 1410.90625 567.46344 1399.8363 C 578.5334 1388.7662 596.4814 1388.7662 607.55133 1399.8363" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" stroke-dasharray="16,9"/><text transform="translate(569.83026 1404.38025)" fill="red"><tspan font-family="Helvetica" font-size="26" font-weight="500" fill="red" x="9.006262" y="25" textLength="17.341797">B</tspan></text></g><g id="id565_Graphic"><circle cx="691.8144" cy="1519.6537" r="28.346518" fill="red" fill-opacity=".5"/><path d="M 711.85834 1499.6097 C 722.92834 1510.6797 722.92834 1528.6277 711.85834 1539.6976 C 700.7884 1550.7677 682.8404 1550.7677 671.77045 1539.6976 C 660.70044 1528.6277 660.70044 1510.6797 671.77045 1499.6097 C 682.8404 1488.5397 700.7884 1488.5397 711.85834 1499.6097" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(674.13727 1504.1537)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="706.95093" y1="1544.2173" x2="745.4616" y2="1606.7125" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><line x1="784.66077" y1="1519.52405" x2="730.5608" y2="1519.5996" marker-end="url(#FilledDiamond_Marker)" stroke="blue" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke-dasharray="1,3"/><g id="id592_Graphic"><circle cx="813.5072" cy="1519.4838" r="28.346518" fill="red"/><circle cx="813.5072" cy="1519.4838" r="28.346518" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(795.8301 1503.9838)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="6.5243282" y="25" textLength="22.305664">A'</tspan></text></g><line x1="798.56934" y1="1544.1689" x2="760.75946" y2="1606.6506" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id595_Graphic"><circle cx="426.39252" cy="1435.3403" r="28.346533" fill="#ff8000"/><circle cx="426.39252" cy="1435.3403" r="28.346533" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(408.71533 1419.8403)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="8.2889767" y="25" textLength="18.776367">C</tspan></text></g><line x1="396.6806" y1="1496.3458" x2="413.75824" y2="1461.2814" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id597_Graphic"><circle cx="817.5072" cy="1419.88025" r="28.346518" fill="#ff8000"/><circle cx="817.5072" cy="1419.88025" r="28.346518" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(799.8301 1404.38025)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="5.807043" y="25" textLength="23.740234">C'</tspan></text></g><line x1="816.34967" y1="1448.7037" x2="814.66473" y2="1490.6603" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id599_Graphic"><circle cx="691.8144" cy="1419.88025" r="28.346518" fill="#ff8000" fill-opacity=".5"/><path d="M 711.85834 1399.8363 C 722.92834 1410.90625 722.92834 1428.85425 711.85834 1439.9242 C 700.7884 1450.9943 682.8404 1450.9943 671.77045 1439.9242 C 660.70044 1428.85425 660.70044 1410.90625 671.77045 1399.8363 C 682.8404 1388.7662 700.7884 1388.7662 711.85834 1399.8363" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(674.13727 1404.38025)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="8.2889767" y="25" textLength="18.776367">C</tspan></text></g><line x1="691.8196" y1="1448.7267" x2="691.82715" y2="1490.80725" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><line x1="788.66077" y1="1419.88025" x2="730.56085" y2="1419.88025" marker-end="url(#FilledDiamond_Marker)" stroke="blue" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke-dasharray="1,3"/><text transform="translate(557.16095 1491.30725)" fill="blue"><tspan font-family="Helvetica" font-size="17" font-weight="bold" fill="blue" x=".13012695" y="16" textLength="72.739746">Obsolete</tspan></text><g id="id604_Graphic"><path d="M 548.05884 1393.9442 C 562.8297 1376.26746 597.9101 1370.3754 620.06622 1383.5195 C 642.22168 1396.6632 634.83734 1456.4924 622.8358 1458.3053 C 610.83466 1460.118 577.60083 1466.9171 560.06024 1461.0248 C 542.51978 1455.1326 533.28845 1411.6206 548.05884 1393.9442 Z" fill="#ff8000" fill-opacity=".15000001"/><path d="M 548.05884 1393.9442 C 562.8297 1376.26746 597.9101 1370.3754 620.06622 1383.5195 C 642.22168 1396.6632 634.83734 1456.4924 622.8358 1458.3053 C 610.83466 1460.118 577.60083 1466.9171 560.06024 1461.0248 C 542.51978 1455.1326 533.28845 1411.6206 548.05884 1393.9442 Z" stroke="#ff8000" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke-dasharray="4,9,1,5"/></g><text transform="translate(551.5074 1339.08044)" fill="#ff8000"><tspan font-family="Helvetica" font-size="17" font-weight="bold" fill="#ff8000" x=".103271484" y="16" textLength="71.793457">Unstable</tspan></text><line x1="631.31445" y1="1469.267" x2="752.31433" y2="1469.267" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="4,3,1,3"/><text transform="translate(712.3343 1373.30725)" fill="maroon"><tspan font-family="Helvetica" font-size="17" font-weight="bold" fill="maroon" x=".103271484" y="16" textLength="54.793457">extinct</tspan></text><text transform="translate(580.1609 1539.234)" fill="#008040"><tspan font-family="Helvetica" font-size="17" font-weight="bold" fill="#008040" x=".13012695" y="16" textLength="89.739746">suspended</tspan></text></g></g></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/error-obsolete.svg Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="125 130 278 413" width="278pt" height="413pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2012-03-18 23:47Z</dc:date><!-- Produced by OmniGraffle Professional 5.3.6 --></metadata><defs><filter id="Shadow" filterUnits="userSpaceOnUse"><feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="3.488"/><feOffset in="blur" result="offset" dx="0" dy="4"/><feFlood flood-color="black" flood-opacity=".75" result="flood"/><feComposite in="flood" in2="offset" operator="in"/></filter><font-face font-family="Helvetica" font-size="26" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.31641" slope="0" x-height="522.94922" cap-height="717.2852" ascent="770.0196" descent="-229.98048" font-weight="500"><font-face-src><font-face-name name="Helvetica"/></font-face-src></font-face><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledDiamond_Marker" viewBox="-1 -2 4 4" markerWidth="4" markerHeight="4" color="blue"><g><path d="M 1.6 0 L .8 -.60000002 L 0 0 L .8 .60000002 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker><font-face font-family="Helvetica" font-size="17" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.316406" slope="0" x-height="532.22656" cap-height="719.72656" ascent="770.01953" descent="-229.98047" font-weight="bold"><font-face-src><font-face-name name="Helvetica-Bold"/></font-face-src></font-face></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><g><use xl:href="#id411_Graphic" filter="url(#Shadow)"/><use xl:href="#id410_Graphic" filter="url(#Shadow)"/><use xl:href="#id408_Graphic" filter="url(#Shadow)"/><use xl:href="#id407_Graphic" filter="url(#Shadow)"/><use xl:href="#id395_Graphic" filter="url(#Shadow)"/><use xl:href="#id394_Graphic" filter="url(#Shadow)"/><use xl:href="#id391_Graphic" filter="url(#Shadow)"/><use xl:href="#id390_Graphic" filter="url(#Shadow)"/><use xl:href="#id724_Graphic" filter="url(#Shadow)"/></g><g id="id411_Graphic"><rect x="145" y="146" width="238" height="373" fill="white" fill-opacity=".5"/><rect x="145" y="146" width="238" height="373" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id410_Graphic"><circle cx="290.34644" cy="351.50146" r="28.34651" fill="red"/><circle cx="290.34644" cy="351.50146" r="28.34651" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(272.66928 336.0015)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="216.72533" y1="434.68497" x2="271.22772" y2="373.10342" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id408_Graphic"><circle cx="207.00024" cy="445.67322" r="14.173263" fill="black"/><circle cx="207.00024" cy="445.67322" r="14.173263" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id407_Graphic"><circle cx="206.30316" cy="488.67325" r="14.173263" fill="black"/><circle cx="206.30316" cy="488.67325" r="14.173263" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="206.7624" y1="460.34457" x2="206.541" y2="474.0019" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id395_Graphic"><circle cx="206.30315" cy="266.11322" r="24.803194" fill="#ff8000" fill-opacity=".5"/><path d="M 223.8416 248.57477 C 233.52788 258.26099 233.52788 273.96545 223.8416 283.65167 C 214.15538 293.33795 198.45091 293.33795 188.76469 283.65167 C 179.07841 273.96545 179.07841 258.26099 188.76469 248.57477 C 198.45091 238.88849 214.15538 238.88849 223.8416 248.57477" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(191.46063 250.61322)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="5.4543362" y="25" textLength="18.776367">C</tspan></text></g><g id="id394_Graphic"><circle cx="206.30315" cy="351.50146" r="24.803194" fill="yellow" fill-opacity=".5"/><path d="M 223.8416 333.96301 C 233.52788 343.64923 233.52788 359.3537 223.8416 369.03992 C 214.15538 378.7262 198.45091 378.7262 188.76469 369.03992 C 179.07841 359.3537 179.07841 343.64923 188.76469 333.96301 C 198.45091 324.27673 214.15538 324.27673 223.8416 333.96301" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(191.46063 336.00146)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="6.1716213" y="25" textLength="17.341797">B</tspan></text></g><line x1="206.89162" y1="431.00034" x2="206.49045" y2="376.80396" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="206.30315" y1="326.1983" x2="206.30315" y2="291.41638" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id391_Graphic"><circle cx="290.34644" cy="269.6565" r="28.346504" fill="yellow"/><circle cx="290.34644" cy="269.6565" r="28.346504" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(272.66928 254.15652)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="6.1180782" y="25" textLength="23.118164">B’</tspan></text></g><g id="id390_Graphic"><circle cx="290.34644" cy="187.80643" r="28.3465" fill="#ff8000"/><circle cx="290.34644" cy="187.80643" r="28.3465" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(272.66928 172.30643)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="5.400793" y="25" textLength="24.552734">C’</tspan></text></g><line x1="290.34644" y1="322.655" x2="290.34644" y2="298.50296" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><line x1="290.3464" y1="240.81003" x2="290.3464" y2="216.65289" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><line x1="269.24112" y1="207.47118" x2="232.0592" y2="242.11519" marker-end="url(#FilledDiamond_Marker)" stroke="blue" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke-dasharray="1,3"/><line x1="269.68039" y1="289.78198" x2="231.52318" y2="326.9411" marker-end="url(#FilledDiamond_Marker)" stroke="blue" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke-dasharray="1,3"/><text transform="translate(154.02574 177.80643)" fill="blue"><tspan font-family="Helvetica" font-size="17" font-weight="bold" fill="blue" x=".13012695" y="16" textLength="72.739746">Obsolete</tspan></text><g id="id724_Graphic"><path d="M 167.93994 250.66768 C 182.56549 215.87003 217.30066 204.27097 239.23875 230.14594 C 261.17621 256.02005 253.8645 373.79715 241.98106 377.36597 C 230.09801 380.93442 197.19122 394.31873 179.82327 382.71951 C 162.45541 371.1203 153.31494 285.46457 167.93994 250.66768 Z" fill="blue" fill-opacity=".15000001"/><path d="M 167.93994 250.66768 C 182.56549 215.87003 217.30066 204.27097 239.23875 230.14594 C 261.17621 256.02005 253.8645 373.79715 241.98106 377.36597 C 230.09801 380.93442 197.19122 394.31873 179.82327 382.71951 C 162.45541 371.1203 153.31494 285.46457 167.93994 250.66768 Z" stroke="blue" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke-dasharray="4,9,1,5"/></g></g></g></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/error-unstable.svg Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="305 746 658 435" width="658pt" height="435pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2012-03-18 23:47Z</dc:date><!-- Produced by OmniGraffle Professional 5.3.6 --></metadata><defs><filter id="Shadow" filterUnits="userSpaceOnUse"><feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="3.488"/><feOffset in="blur" result="offset" dx="0" dy="4"/><feFlood flood-color="black" flood-opacity=".75" result="flood"/><feComposite in="flood" in2="offset" operator="in"/></filter><font-face font-family="Helvetica" font-size="26" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.31641" slope="0" x-height="522.94922" cap-height="717.2852" ascent="770.0196" descent="-229.98048" font-weight="500"><font-face-src><font-face-name name="Helvetica"/></font-face-src></font-face><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledDiamond_Marker" viewBox="-1 -2 4 4" markerWidth="4" markerHeight="4" color="blue"><g><path d="M 1.6 0 L .8 -.60000002 L 0 0 L .8 .60000002 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker><font-face font-family="Helvetica" font-size="17" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.316406" slope="0" x-height="532.22656" cap-height="719.72656" ascent="770.01953" descent="-229.98047" font-weight="bold"><font-face-src><font-face-name name="Helvetica-Bold"/></font-face-src></font-face></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><g><use xl:href="#id672_Graphic" filter="url(#Shadow)"/><use xl:href="#id673_Graphic" filter="url(#Shadow)"/><use xl:href="#id674_Graphic" filter="url(#Shadow)"/><use xl:href="#id680_Graphic" filter="url(#Shadow)"/><use xl:href="#id689_Graphic" filter="url(#Shadow)"/><use xl:href="#id692_Graphic" filter="url(#Shadow)"/><use xl:href="#id702_Graphic" filter="url(#Shadow)"/><use xl:href="#id714_Graphic" filter="url(#Shadow)"/><use xl:href="#id688_Graphic" filter="url(#Shadow)"/></g><g id="id672_Graphic"><rect x="571.2267" y="762.23743" width="371" height="394" fill="white" fill-opacity=".5"/><rect x="571.2267" y="762.23743" width="371" height="394" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id673_Graphic"><rect x="325.28735" y="817.17517" width="160" height="280.84595" fill="white" fill-opacity=".5"/><rect x="325.28735" y="817.17517" width="160" height="280.84595" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id674_Graphic"><circle cx="403.28784" cy="960.2316" r="28.346495" fill="red"/><circle cx="403.28784" cy="960.2316" r="28.346495" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(385.61066 944.73157)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="390.51233" y1="934.3598" x2="373.12732" y2="899.1533" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><path d="M 413.30957 1027.8263 C 418.84457 1033.3613 418.84457 1042.3352 413.30957 1047.87024 C 407.77457 1053.4053 398.80057 1053.4053 393.26556 1047.87024 C 387.73056 1042.3352 387.73056 1033.3613 393.26556 1027.8263 C 398.80057 1022.29126 407.77457 1022.29126 413.30957 1027.8263" fill="black"/><path d="M 413.30957 1027.8263 C 418.84457 1033.3613 418.84457 1042.3352 413.30957 1047.87024 C 407.77457 1053.4053 398.80057 1053.4053 393.26556 1047.87024 C 387.73056 1042.3352 387.73056 1033.3613 393.26556 1027.8263 C 398.80057 1022.29126 407.77457 1022.29126 413.30957 1027.8263" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><path d="M 413.30957 1073.8263 C 418.84457 1079.3613 418.84457 1088.3352 413.30957 1093.87024 C 407.77457 1099.4053 398.80057 1099.4053 393.26556 1093.87024 C 387.73056 1088.3352 387.73056 1079.3613 393.26556 1073.8263 C 398.80057 1068.29126 407.77457 1068.29126 413.30957 1073.8263" fill="black"/><path d="M 413.30957 1073.8263 C 418.84457 1079.3613 418.84457 1088.3352 413.30957 1093.87024 C 407.77457 1099.4053 398.80057 1099.4053 393.26556 1093.87024 C 387.73056 1088.3352 387.73056 1079.3613 393.26556 1073.8263 C 398.80057 1068.29126 407.77457 1068.29126 413.30957 1073.8263" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="403.1737" y1="1052.5211" x2="403.04446" y2="1069.1771" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id680_Graphic"><circle cx="360.3518" cy="873.2816" r="28.346495" fill="yellow"/><circle cx="360.3518" cy="873.2816" r="28.346495" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(342.67462 857.7816)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">B</tspan></text></g><line x1="403.28772" y1="989.078" x2="403.2876" y2="1023.17505" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><line x1="718.2204" y1="930.3955" x2="718.53784" y2="874.86414" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><path d="M 789.4242 1048.76624 C 794.95923 1054.3013 794.95923 1063.27515 789.4242 1068.8102 C 783.8892 1074.3452 774.9152 1074.3452 769.38025 1068.8102 C 763.8452 1063.27515 763.8452 1054.3013 769.38025 1048.76624 C 774.9152 1043.2312 783.8892 1043.2312 789.4242 1048.76624" fill="black"/><path d="M 789.4242 1048.76624 C 794.95923 1054.3013 794.95923 1063.27515 789.4242 1068.8102 C 783.8892 1074.3452 774.9152 1074.3452 769.38025 1068.8102 C 763.8452 1063.27515 763.8452 1054.3013 769.38025 1048.76624 C 774.9152 1043.2312 783.8892 1043.2312 789.4242 1048.76624" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><path d="M 789.4242 1094.7661 C 794.95923 1100.30115 794.95923 1109.275 789.4242 1114.81006 C 783.8892 1120.3451 774.9152 1120.3451 769.38025 1114.81006 C 763.8452 1109.275 763.8452 1100.30115 769.38025 1094.7661 C 774.9152 1089.2311 783.8892 1089.2311 789.4242 1094.7661" fill="black"/><path d="M 789.4242 1094.7661 C 794.95923 1100.30115 794.95923 1109.275 789.4242 1114.81006 C 783.8892 1120.3451 774.9152 1120.3451 769.38025 1114.81006 C 763.8452 1109.275 763.8452 1100.30115 769.38025 1094.7661 C 774.9152 1089.2311 783.8892 1089.2311 789.4242 1094.7661" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="779.4223" y1="1073.4614" x2="779.44507" y2="1090.1149" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id689_Graphic"><circle cx="718.0555" cy="959.24146" r="28.34648" fill="red" fill-opacity=".5"/><path d="M 738.09943 939.19757 C 749.16943 950.2675 749.16943 968.2155 738.09943 979.28546 C 727.0295 990.35547 709.0815 990.35547 698.01154 979.28546 C 686.94153 968.2155 686.94153 950.2675 698.01154 939.19757 C 709.0815 928.12756 727.0295 928.12756 738.09943 939.19757" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(700.37836 943.7415)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="733.1928" y1="983.8047" x2="771.7024" y2="1046.2938" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><line x1="800.166" y1="959.2338" x2="756.80194" y2="959.2374" marker-end="url(#FilledDiamond_Marker)" stroke="blue" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke-dasharray="1,3"/><g id="id692_Graphic"><circle cx="829.01245" cy="959.23145" r="28.34648" fill="red"/><circle cx="829.01245" cy="959.23145" r="28.34648" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(811.33533 943.73145)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="6.5243282" y="25" textLength="22.305664">A'</tspan></text></g><line x1="816.1477" y1="985.059" x2="785.96265" y2="1045.65894" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><text transform="translate(687.9198 889.0216)" fill="blue"><tspan font-family="Helvetica" font-size="17" font-weight="bold" fill="blue" x=".13012695" y="16" textLength="72.739746">Obsolete</tspan></text><g id="id702_Graphic"><path d="M 678.60693 819.58557 C 693.37787 801.90887 728.45825 796.0167 750.6144 809.16083 C 772.7699 822.3045 765.3855 882.13373 753.38397 883.94666 C 741.3828 885.75934 708.149 892.5584 690.6084 886.66614 C 673.06793 880.7739 663.8366 837.26196 678.60693 819.58557 Z" fill="#ff8000" fill-opacity=".15000001"/><path d="M 678.60693 819.58557 C 693.37787 801.90887 728.45825 796.0167 750.6144 809.16083 C 772.7699 822.3045 765.3855 882.13373 753.38397 883.94666 C 741.3828 885.75934 708.149 892.5584 690.6084 886.66614 C 673.06793 880.7739 663.8366 837.26196 678.60693 819.58557 Z" stroke="#ff8000" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke-dasharray="4,9,1,5"/></g><text transform="translate(674.40198 774.87)" fill="#ff8000"><tspan font-family="Helvetica" font-size="17" font-weight="bold" fill="#ff8000" x=".103271484" y="16" textLength="71.793457">Unstable</tspan></text><g id="id714_Graphic"><path d="M 679.4558 933.30554 C 694.08136 915.6288 728.81653 909.73657 750.75464 922.88074 C 772.6921 936.0244 765.38037 995.85364 753.49695 997.66656 C 741.6139 999.47925 708.7071 1006.2783 691.33917 1000.3861 C 673.9713 994.49384 664.8308 950.9819 679.4558 933.30554 Z" fill="blue" fill-opacity=".15000001"/><path d="M 679.4558 933.30554 C 694.08136 915.6288 728.81653 909.73657 750.75464 922.88074 C 772.6921 936.0244 765.38037 995.85364 753.49695 997.66656 C 741.6139 999.47925 708.7071 1006.2783 691.33917 1000.3861 C 673.9713 994.49384 664.8308 950.9819 679.4558 933.30554 Z" stroke="blue" stroke-linecap="round" stroke-linejoin="round" stroke-width="4" stroke-dasharray="4,9,1,5"/></g><g id="id688_Graphic"><circle cx="718.0555" cy="845.52167" r="28.34648" fill="yellow"/><path d="M 738.09943 825.47766 C 749.16943 836.5476 749.16943 854.4956 738.09943 865.56555 C 727.0295 876.63556 709.0815 876.63556 698.01154 865.56555 C 686.94153 854.4956 686.94153 836.5476 698.01154 825.47766 C 709.0815 814.40765 727.0295 814.40765 738.09943 825.47766" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" stroke-dasharray="16,9"/><text transform="translate(700.37836 830.0216)" fill="red"><tspan font-family="Helvetica" font-size="26" font-weight="500" fill="red" x="9.006262" y="25" textLength="17.341797">B</tspan></text></g></g></g></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/example-1-update.svg Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="47 621 426 249" width="426pt" height="249pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2012-03-21 08:32Z</dc:date><!-- Produced by OmniGraffle Professional 5.3.6 --></metadata><defs><filter id="Shadow" filterUnits="userSpaceOnUse"><feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="3.488"/><feOffset in="blur" result="offset" dx="0" dy="4"/><feFlood flood-color="black" flood-opacity=".75" result="flood"/><feComposite in="flood" in2="offset" operator="in"/></filter><font-face font-family="Helvetica" font-size="26" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.31641" slope="0" x-height="522.94922" cap-height="717.2852" ascent="770.0196" descent="-229.98048" font-weight="500"><font-face-src><font-face-name name="Helvetica"/></font-face-src></font-face><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledDiamond_Marker" viewBox="-1 -3 6 6" markerWidth="6" markerHeight="6" color="red"><g><path d="M 3.7333333 0 L 1.8666667 -1.4 L 0 0 L 1.8666667 1.4 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><g><use xl:href="#id464_Graphic" filter="url(#Shadow)"/><use xl:href="#id463_Graphic" filter="url(#Shadow)"/><use xl:href="#id465_Graphic" filter="url(#Shadow)"/><use xl:href="#id466_Graphic" filter="url(#Shadow)"/><use xl:href="#id472_Graphic" filter="url(#Shadow)"/><use xl:href="#id471_Graphic" filter="url(#Shadow)"/><use xl:href="#id475_Graphic" filter="url(#Shadow)"/></g><g id="id464_Graphic"><rect x="67" y="637.9972" width="141" height="207.84595" fill="white" fill-opacity=".5"/><rect x="67" y="637.9972" width="141" height="207.84595" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id463_Graphic"><circle cx="128.71246" cy="718.34644" r="28.346489" fill="red"/><circle cx="128.71246" cy="718.34644" r="28.346489" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(111.035286 702.84644)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="128.93794" y1="770.9975" x2="128.83687" y2="747.19263" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><circle cx="129.000244" cy="785.6706" r="14.173275" fill="black"/><circle cx="129.000244" cy="785.6706" r="14.173275" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><circle cx="129.000244" cy="831.6706" r="14.173275" fill="black"/><circle cx="129.000244" cy="831.6706" r="14.173275" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="128.96199" y1="800.3438" x2="128.91855" y2="816.99756" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id465_Graphic"><rect x="277" y="637.99725" width="176" height="207.84595" fill="white" fill-opacity=".5"/><rect x="277" y="637.99725" width="176" height="207.84595" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id466_Graphic"><circle cx="407.34644" cy="703.95215" r="28.346495" fill="red"/><circle cx="407.34644" cy="703.95215" r="28.346495" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(389.66928 688.45215)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="6.1180782" y="25" textLength="23.118164">A’</tspan></text></g><line x1="378.9428" y1="772.1349" x2="396.34451" y2="730.6261" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id472_Graphic"><circle cx="373.26825" cy="785.67053" r="14.173267" fill="black"/><circle cx="373.26825" cy="785.67053" r="14.173267" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id471_Graphic"><circle cx="373.26825" cy="831.67053" r="14.173267" fill="black"/><circle cx="373.26825" cy="831.67053" r="14.173267" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="373.26837" y1="800.34375" x2="373.26852" y2="816.9973" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="365.1879" y1="773.41925" x2="335.23688" y2="728.00824" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id475_Graphic"><circle cx="319.30762" cy="703.95215" r="28.346495" fill="red" fill-opacity=".5"/><path d="M 339.35156 683.9082 C 350.4216 694.97815 350.4216 712.92615 339.35156 723.9961 C 328.28159 735.0661 310.33365 735.0661 299.26367 723.9961 C 288.19363 712.92615 288.19363 694.97815 299.26367 683.9082 C 310.33365 672.8382 328.28159 672.8382 339.35156 683.9082" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(301.63046 688.45215)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="378.49997" y1="703.95215" x2="362.1041" y2="703.95215" marker-end="url(#FilledDiamond_Marker)" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="1,4"/></g></g></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/example-2-split.svg Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="27 1004 488 344" width="488pt" height="344pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2012-03-21 08:32Z</dc:date><!-- Produced by OmniGraffle Professional 5.3.6 --></metadata><defs><filter id="Shadow" filterUnits="userSpaceOnUse"><feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="3.488"/><feOffset in="blur" result="offset" dx="0" dy="4"/><feFlood flood-color="black" flood-opacity=".75" result="flood"/><feComposite in="flood" in2="offset" operator="in"/></filter><font-face font-family="Helvetica" font-size="26" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.31641" slope="0" x-height="522.94922" cap-height="717.2852" ascent="770.0196" descent="-229.98048" font-weight="500"><font-face-src><font-face-name name="Helvetica"/></font-face-src></font-face><font-face font-family="Helvetica" font-size="15" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.316406" slope="0" x-height="522.94922" cap-height="717.28516" ascent="770.01953" descent="-229.98045" font-weight="500"><font-face-src><font-face-name name="Helvetica"/></font-face-src></font-face><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledDiamond_Marker" viewBox="-1 -3 6 6" markerWidth="6" markerHeight="6" color="red"><g><path d="M 3.7333333 0 L 1.8666667 -1.4 L 0 0 L 1.8666667 1.4 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><g><use xl:href="#id478_Graphic" filter="url(#Shadow)"/><use xl:href="#id479_Graphic" filter="url(#Shadow)"/><use xl:href="#id481_Graphic" filter="url(#Shadow)"/><use xl:href="#id482_Graphic" filter="url(#Shadow)"/><use xl:href="#id485_Graphic" filter="url(#Shadow)"/><use xl:href="#id488_Graphic" filter="url(#Shadow)"/><use xl:href="#id489_Graphic" filter="url(#Shadow)"/><use xl:href="#id491_Graphic" filter="url(#Shadow)"/><use xl:href="#id492_Graphic" filter="url(#Shadow)"/><use xl:href="#id495_Graphic" filter="url(#Shadow)"/></g><g id="id478_Graphic"><rect x="47" y="1087.16406" width="143" height="202.84595" fill="white" fill-opacity=".5"/><rect x="47" y="1087.16406" width="143" height="202.84595" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id479_Graphic"><circle cx="118.50046" cy="1155.5105" r="28.346527" fill="#ff8000"/><circle cx="118.50046" cy="1155.5105" r="28.346527" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(100.823296 1140.0105)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="118.50029" y1="1215.66406" x2="118.50038" y2="1184.3569" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id481_Graphic"><path d="M 128.52223 1220.3153 C 134.05725 1225.85034 134.05725 1234.8242 128.52223 1240.35925 C 122.98724 1245.8943 114.013245 1245.8943 108.478256 1240.35925 C 102.94323 1234.8242 102.94323 1225.85034 108.478256 1220.3153 C 114.013245 1214.7803 122.98724 1214.7803 128.52223 1220.3153" fill="black"/><path d="M 128.52223 1220.3153 C 134.05725 1225.85034 134.05725 1234.8242 128.52223 1240.35925 C 122.98724 1245.8943 114.013245 1245.8943 108.478256 1240.35925 C 102.94323 1234.8242 102.94323 1225.85034 108.478256 1220.3153 C 114.013245 1214.7803 122.98724 1214.7803 128.52223 1220.3153" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id482_Graphic"><path d="M 128.52223 1265.8153 C 134.05725 1271.35034 134.05725 1280.3242 128.52223 1285.85925 C 122.98724 1291.3943 114.013245 1291.3943 108.478256 1285.85925 C 102.94323 1280.3242 102.94323 1271.35034 108.478256 1265.8153 C 114.013245 1260.2803 122.98724 1260.2803 128.52223 1265.8153" fill="black"/><path d="M 128.52223 1265.8153 C 134.05725 1271.35034 134.05725 1280.3242 128.52223 1285.85925 C 122.98724 1291.3943 114.013245 1291.3943 108.478256 1285.85925 C 102.94323 1280.3242 102.94323 1271.35034 108.478256 1265.8153 C 114.013245 1260.2803 122.98724 1260.2803 128.52223 1265.8153" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="118.500244" y1="1245.0105" x2="118.500244" y2="1261.1641" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id485_Graphic"><rect x="277" y="1020" width="218" height="303.08691" fill="white" fill-opacity=".5"/><rect x="277" y="1020" width="218" height="303.08691" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="384.58325" y1="1251.5149" x2="356.10718" y2="1212.0704" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id488_Graphic"><path d="M 403.19525 1253.3916 C 408.73026 1258.9266 408.73026 1267.9005 403.19525 1273.43555 C 397.66025 1278.9706 388.68625 1278.9706 383.15125 1273.43555 C 377.61624 1267.9005 377.61624 1258.9266 383.15125 1253.3916 C 388.68625 1247.8566 397.66025 1247.8566 403.19525 1253.3916" fill="black"/><path d="M 403.19525 1253.3916 C 408.73026 1258.9266 408.73026 1267.9005 403.19525 1273.43555 C 397.66025 1278.9706 388.68625 1278.9706 383.15125 1273.43555 C 377.61624 1267.9005 377.61624 1258.9266 383.15125 1253.3916 C 388.68625 1247.8566 397.66025 1247.8566 403.19525 1253.3916" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id489_Graphic"><path d="M 403.19525 1298.8916 C 408.73026 1304.4266 408.73026 1313.4005 403.19525 1318.93555 C 397.66025 1324.4706 388.68625 1324.4706 383.15125 1318.93555 C 377.61624 1313.4005 377.61624 1304.4266 383.15125 1298.8916 C 388.68625 1293.3566 397.66025 1293.3566 403.19525 1298.8916" fill="black"/><path d="M 403.19525 1298.8916 C 408.73026 1304.4266 408.73026 1313.4005 403.19525 1318.93555 C 397.66025 1324.4706 388.68625 1324.4706 383.15125 1318.93555 C 377.61624 1313.4005 377.61624 1304.4266 383.15125 1298.8916 C 388.68625 1293.3566 397.66025 1293.3566 403.19525 1298.8916" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="393.17325" y1="1278.0868" x2="393.17325" y2="1294.24036" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id491_Graphic"><circle cx="437.34644" cy="1188.5874" r="28.346533" fill="red"/><circle cx="437.34644" cy="1188.5874" r="28.346533" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(419.66928 1171.0874)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="4.8351192" y="25" textLength="17.341797">A</tspan><tspan font-family="Helvetica" font-size="15" font-weight="500" x="22.176916" y="32" textLength="8.342285">1</tspan></text></g><g id="id492_Graphic"><circle cx="437.34644" cy="1105.34644" r="28.346533" fill="yellow"/><circle cx="437.34644" cy="1105.34644" r="28.346533" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(419.66928 1087.84644)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="4.8351192" y="25" textLength="17.341797">A</tspan><tspan font-family="Helvetica" font-size="15" font-weight="500" x="22.176916" y="32" textLength="8.342285">2</tspan></text></g><line x1="400.63443" y1="1250.7749" x2="422.67834" y2="1213.4341" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><line x1="437.3464" y1="1159.741" x2="437.3464" y2="1134.1929" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id495_Graphic"><circle cx="339.34644" cy="1188.5874" r="28.346533" fill="#ff8000"/><path d="M 359.39038 1168.54346 C 370.46042 1179.6134 370.46042 1197.5614 359.39038 1208.63135 C 348.3204 1219.7014 330.37247 1219.7014 319.30249 1208.63135 C 308.23245 1197.5614 308.23245 1179.6134 319.30249 1168.54346 C 330.37247 1157.4734 348.3204 1157.4734 359.39038 1168.54346" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(321.66928 1173.0874)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="393.50046" y1="1152" x2="374.81244" y2="1164.626" marker-end="url(#FilledDiamond_Marker)" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="1,4"/><line x1="417.8144" y1="1126.5746" x2="393.50046" y2="1153" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="1,4"/><line x1="416.74606" y1="1168.3948" x2="399" y2="1151" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="1,4"/></g></g></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/explain-troubles-concurrent-10-solution.svg Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,929 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1290.3188"
+ height="561.80957"
+ id="svg12094"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="explain-troubles-concurrent-10-solution.svg">
+ <defs
+ id="defs12096">
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend"
+ style="overflow:visible">
+ <path
+ id="path4197"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMstart"
+ style="overflow:visible">
+ <path
+ id="path4188"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,2.6,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM"
+ style="overflow:visible">
+ <path
+ id="path6393"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotS"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotS"
+ style="overflow:visible">
+ <path
+ id="path6396"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.2,0,0,0.2,1.48,0.2)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective12102" />
+ <pattern
+ patternUnits="userSpaceOnUse"
+ width="165"
+ height="162.14285"
+ patternTransform="matrix(0.60606061,0,0,0.61674011,-218.21429,419.14788)"
+ id="pattern12110">
+ <rect
+ ry="78.664986"
+ y="2.4064403"
+ x="2.4064403"
+ height="157.32997"
+ width="160.18712"
+ id="rect12108"
+ style="opacity:0.75;fill:#008000;fill-opacity:0;fill-rule:nonzero;stroke:#008000;stroke-width:4.81288052;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0" />
+ </pattern>
+ <inkscape:perspective
+ id="perspective12641"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective12674"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective12705"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective12705-5"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective12811"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective12838"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective12869"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective12869-3"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective8199"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective8230"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-1"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path6393-0"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker3407"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3409"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker3411"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3413"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker3415"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3417"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend-9"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4197-6"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker3421"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3423"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-15"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path6393-08"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker3824"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3826"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker3828"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3830"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker3832"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3834"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend-7"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path4197-67"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker3838"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3840"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.7"
+ inkscape:cx="746.41279"
+ inkscape:cy="248.41683"
+ inkscape:document-units="px"
+ inkscape:current-layer="g3367-2"
+ showgrid="false"
+ inkscape:window-width="1215"
+ inkscape:window-height="776"
+ inkscape:window-x="65"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1"
+ fit-margin-left="5"
+ fit-margin-top="5"
+ fit-margin-right="5"
+ fit-margin-bottom="5" />
+ <metadata
+ id="metadata12099">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(1002.1836,-116.82843)">
+ <flowRoot
+ transform="translate(-214.28571,111.42857)"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ id="flowRoot12902"
+ xml:space="preserve"><flowRegion
+ id="flowRegion12904"><rect
+ y="320.93362"
+ x="-924.28571"
+ height="435.71429"
+ width="301.42856"
+ id="rect12906" /></flowRegion><flowPara
+ id="flowPara12908" /></flowRoot> <g
+ id="g3367">
+ <g
+ style="opacity:0.5"
+ id="g8425">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-750.72428,151.88146)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-822.54358"
+ y="362.2431"
+ id="text12629-9-3-1"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0"
+ x="-822.54358"
+ y="362.2431">B</tspan></text>
+ </g>
+ <g
+ id="g10287">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-9"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-750.72428,288.54815)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-821.49023"
+ y="498.90979"
+ id="text12629-9-3-1-8"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-7"
+ x="-821.49023"
+ y="498.90979">A</tspan></text>
+ </g>
+ <g
+ transform="translate(-10.776028,0)"
+ id="g12957">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-6"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,425.21479)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="635.57648"
+ id="text12629-9-3-1-83"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-5"
+ x="-810.71423"
+ y="635.57648">Z</tspan></text>
+ </g>
+ <path
+ inkscape:connector-type="polyline"
+ id="path12950"
+ d="m -808.27602,393.39505 0,42.40522"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connection-end="#g12957"
+ inkscape:connector-type="polyline"
+ id="path12962"
+ d="m -808.27602,532.73368 0,39.73323"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <g
+ style="fill:#0000ff;stroke:#0000ff"
+ id="g8286">
+ <path
+ sodipodi:type="arc"
+ style="fill:#0000ff;fill-opacity:0;fill-rule:evenodd;stroke:#0000ff;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-5"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-612.86713,62.419408)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#0000ff;fill-opacity:1;stroke:#0000ff;font-family:Bitstream Vera Sans"
+ x="-684.68646"
+ y="272.78107"
+ id="text12629-9-3-1-4"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-76"
+ x="-684.68646"
+ y="272.78107">B'</tspan></text>
+ </g>
+ <g
+ style="fill:#008000;stroke:#008000"
+ id="g8294">
+ <path
+ sodipodi:type="arc"
+ style="fill:#008000;fill-opacity:0;fill-rule:evenodd;stroke:#008000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-5-2"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-888.58143,62.419408)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#008000;fill-opacity:1;stroke:#008000;font-family:Bitstream Vera Sans"
+ x="-960.40076"
+ y="272.78107"
+ id="text12629-9-3-1-4-8"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-76-6"
+ x="-960.40076"
+ y="272.78107">B''</tspan></text>
+ </g>
+ <path
+ inkscape:connection-end="#g10287"
+ inkscape:connection-start="#g8286"
+ inkscape:connector-type="polyline"
+ transform="translate(-997.6235,206.6479)"
+ id="path8303"
+ d="M 301.69976,93.326264 214.85234,235.78314"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM);display:inline"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connection-end="#g10287"
+ inkscape:connection-start="#g8294"
+ inkscape:connector-type="polyline"
+ transform="translate(-997.6235,206.6479)"
+ id="path8305"
+ d="M 76.995186,93.326264 163.84261,235.78314"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM);display:inline"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connection-end="#g8425"
+ inkscape:connection-start="#g8286"
+ inkscape:connector-type="polyline"
+ transform="translate(-997.6235,206.6479)"
+ id="path8430"
+ d="M 286.10442,78.162204 230.44767,114.28051"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-start:none;marker-end:url(#EmptyDiamondMend)"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connection-end="#g8425"
+ inkscape:connection-start="#g8294"
+ inkscape:connector-type="polyline"
+ transform="translate(-997.6235,206.6479)"
+ id="path8432"
+ d="M 92.590525,78.162204 148.24727,114.28051"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-end:url(#EmptyDiamondMend)"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="g3367-2"
+ transform="translate(902.50523,0.6852693)">
+ <g
+ style="opacity:0.5"
+ id="g8425-2">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-64"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-750.72428,151.88146)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-822.54358"
+ y="362.2431"
+ id="text12629-9-3-1-6"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-1"
+ x="-822.54358"
+ y="362.2431">B</tspan></text>
+ </g>
+ <g
+ id="g10287-0">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-9-6"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-750.72428,288.54815)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-821.49023"
+ y="498.90979"
+ id="text12629-9-3-1-8-5"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-7-9"
+ x="-821.49023"
+ y="498.90979">A</tspan></text>
+ </g>
+ <g
+ transform="translate(-10.776028,0)"
+ id="g12957-1">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-6-6"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,425.21479)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="635.57648"
+ id="text12629-9-3-1-83-8"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-5-0"
+ x="-810.71423"
+ y="635.57648">Z</tspan></text>
+ </g>
+ <path
+ inkscape:connector-type="polyline"
+ id="path12950-6"
+ d="m -808.27602,393.39505 0,42.40522"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connection-end="#g12957-1"
+ inkscape:connector-type="polyline"
+ id="path12962-4"
+ d="m -808.27602,532.73368 0,39.73323"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <g
+ style="opacity:0.5;fill:#0000ff;stroke:#0000ff"
+ id="g8286-9">
+ <path
+ sodipodi:type="arc"
+ style="fill:#0000ff;fill-opacity:0;fill-rule:evenodd;stroke:#0000ff;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-5-9"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-612.86713,62.419408)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#0000ff;fill-opacity:1;stroke:#0000ff;font-family:Bitstream Vera Sans"
+ x="-684.68646"
+ y="272.78107"
+ id="text12629-9-3-1-4-0"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-76-0"
+ x="-684.68646"
+ y="272.78107">B'</tspan></text>
+ </g>
+ <g
+ style="opacity:0.5;fill:#008000;stroke:#008000"
+ id="g8294-9">
+ <path
+ sodipodi:type="arc"
+ style="fill:#008000;fill-opacity:0;fill-rule:evenodd;stroke:#008000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-5-2-8"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-888.58143,62.419408)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#008000;fill-opacity:1;stroke:#008000;font-family:Bitstream Vera Sans"
+ x="-960.40076"
+ y="272.78107"
+ id="text12629-9-3-1-4-8-2"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-76-6-0"
+ x="-960.40076"
+ y="272.78107">B''</tspan></text>
+ </g>
+ <path
+ inkscape:connection-end="#g10287-0"
+ inkscape:connection-start="#g8286-9"
+ inkscape:connector-type="polyline"
+ transform="translate(-997.6235,206.6479)"
+ id="path8303-7"
+ d="M 301.69976,93.326264 214.85234,235.78314"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM);display:inline"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connection-end="#g10287-0"
+ inkscape:connection-start="#g8294-9"
+ inkscape:connector-type="polyline"
+ transform="translate(-997.6235,206.6479)"
+ id="path8305-3"
+ d="M 76.995186,93.326264 163.84261,235.78314"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM);display:inline"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connection-end="#g8425-2"
+ inkscape:connection-start="#g8286-9"
+ inkscape:connector-type="polyline"
+ transform="translate(-997.6235,206.6479)"
+ id="path8430-0"
+ d="M 286.10442,78.162204 230.44767,114.28051"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-start:none;marker-end:url(#EmptyDiamondMend)"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connection-end="#g8425-2"
+ inkscape:connection-start="#g8294-9"
+ inkscape:connector-type="polyline"
+ transform="translate(-997.6235,206.6479)"
+ id="path8432-1"
+ d="M 92.590525,78.162204 148.24727,114.28051"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-end:url(#EmptyDiamondMend)"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-end:url(#marker3838)"
+ d="m 1045.7143,-14.223969 -54.28573,30"
+ id="path5991"
+ inkscape:connector-curvature="0"
+ transform="translate(-1900.1287,205.96263)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-end:url(#marker3838)"
+ d="M 1141.4286,-4.2239685 1185.7143,24.34746"
+ id="path5993"
+ inkscape:connector-curvature="0"
+ transform="translate(-1900.1287,205.96263)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker3832)"
+ d="m 1068.5714,11.490317 -62.8571,88.571433 70,132.85714"
+ id="path5995"
+ inkscape:connector-curvature="0"
+ transform="translate(-1900.1287,205.96263)" />
+ </g>
+ <g
+ id="g5033">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-283.50522,302.96994)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1-3"
+ style="opacity:0.5;fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1-0"
+ y="513.3316"
+ x="-355.32452"
+ style="font-size:40px;font-style:normal;font-weight:normal;opacity:0.5;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="513.3316"
+ x="-355.32452"
+ id="tspan12631-6-9-0-8"
+ sodipodi:role="line">B</tspan></text>
+ </g>
+ <g
+ id="g5028">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-146.5298,215.57827)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1-5-1"
+ style="fill:#0000ff;fill-opacity:0;fill-rule:evenodd;stroke:#0000ff;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1-4-9"
+ y="425.93994"
+ x="-218.34914"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#0000ff;fill-opacity:1;stroke:#0000ff;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="425.93994"
+ x="-218.34914"
+ id="tspan12631-6-9-0-76-8"
+ sodipodi:role="line">B'</tspan></text>
+ </g>
+ <g
+ id="g5023">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-422.14656,215.91205)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1-5-2-4"
+ style="fill:#008000;fill-opacity:0;fill-rule:evenodd;stroke:#008000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1-4-8-3"
+ y="426.27371"
+ x="-493.96588"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#008000;fill-opacity:1;stroke:#008000;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="426.27371"
+ x="-493.96588"
+ id="tspan12631-6-9-0-76-6-4"
+ sodipodi:role="line">B''</tspan></text>
+ </g>
+ <g
+ id="g5018">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-285.48057,130.5673)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1-5-1-4"
+ style="fill:#0000ff;fill-opacity:0;fill-rule:evenodd;stroke:#007d7d;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1-4-9-5"
+ y="340.92896"
+ x="-357.2999"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#0000ff;fill-opacity:1;stroke:#007d7d;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="340.92896"
+ x="-357.2999"
+ id="tspan12631-6-9-0-76-8-9"
+ sodipodi:role="line"
+ style="fill:#007d7d;fill-opacity:1">B*</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-end:url(#marker3838)"
+ d="m 696.38676,145.20902 55.35962,33.86937"
+ id="path5038"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="3"
+ inkscape:connection-start="#g5018"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end="#g5028"
+ inkscape:connection-end-point="d4"
+ transform="translate(-997.6235,206.6479)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-end:url(#marker3838)"
+ d="m 613.03214,145.59088 -53.54791,33.43943"
+ id="path5040"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="3"
+ inkscape:connection-start="#g5018"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end="#g5023"
+ inkscape:connection-end-point="d4"
+ transform="translate(-997.6235,206.6479)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-end:url(#marker3838)"
+ d="m 559.41952,231.03876 55.65269,34.94632"
+ id="path5042"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="3"
+ inkscape:connection-start="#g5023"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end="#g5033"
+ inkscape:connection-end-point="d4"
+ transform="translate(-997.6235,206.6479)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-end:url(#marker3838)"
+ d="M 752.23638,231.00256 697.87211,265.6875"
+ id="path5044"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="3"
+ inkscape:connection-start="#g5028"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end="#g5033"
+ inkscape:connection-end-point="d4"
+ transform="translate(-997.6235,206.6479)" />
+ <g
+ transform="translate(441.1231,-152.43362)"
+ id="g5018-9">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-285.48057,130.5673)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1-5-1-4-7"
+ style="fill:#0000ff;fill-opacity:0;fill-rule:evenodd;stroke:#007d7d;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1-4-9-5-1"
+ y="340.92896"
+ x="-357.2999"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#0000ff;fill-opacity:1;stroke:#007d7d;stroke-opacity:1;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="340.92896"
+ x="-357.2999"
+ id="tspan12631-6-9-0-76-8-9-4"
+ sodipodi:role="line"
+ style="fill:#007d7d;fill-opacity:1">B*</tspan></text>
+ </g>
+ </g>
+</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/explain-troubles-concurrent-10-sumup.svg Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,1451 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1424.2434"
+ height="1058.7501"
+ id="svg12964"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="explain-troubles-concurrent-10-sumup.svg">
+ <defs
+ id="defs12966">
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mend"
+ style="overflow:visible">
+ <path
+ id="path4078"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible">
+ <path
+ id="path4072"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path4069"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.8,0,0,0.8,10,0)" />
+ </marker>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective12972" />
+ <inkscape:perspective
+ id="perspective13312"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM"
+ style="overflow:visible">
+ <path
+ id="path6393"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13318"
+ style="overflow:visible">
+ <path
+ id="path13320"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective13418"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-1"
+ style="overflow:visible">
+ <path
+ id="path6393-1"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13424"
+ style="overflow:visible">
+ <path
+ id="path13426"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13428"
+ style="overflow:visible">
+ <path
+ id="path13430"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13432"
+ style="overflow:visible">
+ <path
+ id="path13434"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend"
+ style="overflow:visible">
+ <path
+ id="path6456"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13438"
+ style="overflow:visible">
+ <path
+ id="path13440"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective13583"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-0"
+ style="overflow:visible">
+ <path
+ id="path6393-5"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13589"
+ style="overflow:visible">
+ <path
+ id="path13591"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13593"
+ style="overflow:visible">
+ <path
+ id="path13595"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective13743"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-2"
+ style="overflow:visible">
+ <path
+ id="path6393-2"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13749"
+ style="overflow:visible">
+ <path
+ id="path13751"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13753"
+ style="overflow:visible">
+ <path
+ id="path13755"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13757"
+ style="overflow:visible">
+ <path
+ id="path13759"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend-3"
+ style="overflow:visible">
+ <path
+ id="path6456-4"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13763"
+ style="overflow:visible">
+ <path
+ id="path13765"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective15593"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2"
+ style="overflow:visible">
+ <path
+ id="path4072-8"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective15593-5"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-6"
+ style="overflow:visible">
+ <path
+ id="path4072-7"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective15593-1"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-29"
+ style="overflow:visible">
+ <path
+ id="path4072-70"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective18500"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-4"
+ style="overflow:visible">
+ <path
+ id="path6393-20"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective18588"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-47"
+ style="overflow:visible">
+ <path
+ id="path6393-22"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker18594"
+ style="overflow:visible">
+ <path
+ id="path18596"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend-31"
+ style="overflow:visible">
+ <path
+ id="path4197"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective18791"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective18959"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-6"
+ style="overflow:visible">
+ <path
+ id="path6393-21"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker18965"
+ style="overflow:visible">
+ <path
+ id="path18967"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-1-4"
+ style="overflow:visible">
+ <path
+ id="path6393-3"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend-2"
+ style="overflow:visible">
+ <path
+ id="path4197-2"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective19288"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-44"
+ style="overflow:visible">
+ <path
+ id="path6393-9"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker19294"
+ style="overflow:visible">
+ <path
+ id="path19296"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective20729"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-8"
+ style="overflow:visible">
+ <path
+ id="path6393-7"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker20735"
+ style="overflow:visible">
+ <path
+ id="path20737"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective20952"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-42"
+ style="overflow:visible">
+ <path
+ id="path6393-0"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker20958"
+ style="overflow:visible">
+ <path
+ id="path20960"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker20962"
+ style="overflow:visible">
+ <path
+ id="path20964"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend-8"
+ style="overflow:visible">
+ <path
+ id="path4197-7"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective21100"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-22"
+ style="overflow:visible">
+ <path
+ id="path6393-8"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker21106"
+ style="overflow:visible">
+ <path
+ id="path21108"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker21110"
+ style="overflow:visible">
+ <path
+ id="path21112"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend-313"
+ style="overflow:visible">
+ <path
+ id="path4197-6"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective21316"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-3"
+ style="overflow:visible">
+ <path
+ id="path6393-80"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker21322"
+ style="overflow:visible">
+ <path
+ id="path21324"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker21326"
+ style="overflow:visible">
+ <path
+ id="path21328"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker21330"
+ style="overflow:visible">
+ <path
+ id="path21332"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend-6"
+ style="overflow:visible">
+ <path
+ id="path4197-66"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker21336"
+ style="overflow:visible">
+ <path
+ id="path21338"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.58"
+ inkscape:cx="455.19061"
+ inkscape:cy="725.32431"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1280"
+ inkscape:window-height="776"
+ inkscape:window-x="0"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1" />
+ <metadata
+ id="metadata12969">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(312.26788,374.46262)">
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="290.07355"
+ y="683.72107"
+ id="text13894"><tspan
+ sodipodi:role="line"
+ id="tspan13896"
+ x="290.07355"
+ y="683.72107">Local</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="176.47943"
+ y="147.90836"
+ id="text13898"><tspan
+ sodipodi:role="line"
+ id="tspan13900"
+ x="176.47943"
+ y="147.90836">Distant</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="731.52625"
+ y="360.52893"
+ id="text13902"><tspan
+ sodipodi:role="line"
+ id="tspan13904"
+ x="731.52625"
+ y="360.52893">final = <tspan
+ style="fill:#ff0000;stroke:#ff0000"
+ id="tspan14035">divergent</tspan></tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow1Mend)"
+ d="M -149.51243,71.715908 116.10904,-98.285798"
+ id="path14093" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow1Mend)"
+ d="M -136.88118,173.93586 140.19146,310.32109"
+ id="path14093-1" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow1Mend)"
+ d="m 358.73418,-10.742763 276.5932,40.995518"
+ id="path14093-4"
+ inkscape:transform-center-x="38.2665"
+ inkscape:transform-center-y="-14.191534" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow1Mend)"
+ d="M 385.49434,405.82501 666.42726,306.55019"
+ id="path14093-42" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-316.03741"
+ y="327.08148"
+ id="text13894-3"><tspan
+ sodipodi:role="line"
+ id="tspan13896-8"
+ x="-316.03741"
+ y="327.08148">initial</tspan></text>
+ <g
+ transform="translate(536.95625,-391.35879)"
+ id="g20705">
+ <g
+ transform="translate(0,5.2380981)"
+ id="g12933-0">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-98"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,146.64336)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-811.76758"
+ y="357.005"
+ id="text12629-9-3-1-2"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-3"
+ x="-811.76758"
+ y="357.005">B</tspan></text>
+ </g>
+ <g
+ id="g12945">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-9"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,288.54815)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="498.90979"
+ id="text12629-9-3-1-8"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-7"
+ x="-810.71423"
+ y="498.90979">A</tspan></text>
+ </g>
+ <g
+ id="g12957">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-6"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,425.21479)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="635.57648"
+ id="text12629-9-3-1-83"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-5"
+ x="-810.71423"
+ y="635.57648">Z</tspan></text>
+ </g>
+ <path
+ inkscape:connection-end="#g12945"
+ inkscape:connection-start="#g12933-0"
+ inkscape:connector-type="polyline"
+ id="path12950-93"
+ d="m -797.5,393.91867 0,41.35798"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connection-end="#g12957"
+ inkscape:connection-start="#g12945"
+ inkscape:connector-type="polyline"
+ id="path12962"
+ d="m -797.5,533.2573 0,38.68599"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ transform="translate(1065.0106,-10.420874)"
+ id="g20918">
+ <g
+ style="opacity:0.5"
+ id="g8425">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-91"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-750.72428,151.88146)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-822.54358"
+ y="362.2431"
+ id="text12629-9-3-1-3"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-8"
+ x="-822.54358"
+ y="362.2431">B</tspan></text>
+ </g>
+ <g
+ id="g10287">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-9-9"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-750.72428,288.54815)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-821.49023"
+ y="498.90979"
+ id="text12629-9-3-1-8-1"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-7-6"
+ x="-821.49023"
+ y="498.90979">A</tspan></text>
+ </g>
+ <g
+ transform="translate(-10.776028,0)"
+ id="g12957-7">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-6-9"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,425.21479)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="635.57648"
+ id="text12629-9-3-1-83-4"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-5-9"
+ x="-810.71423"
+ y="635.57648">Z</tspan></text>
+ </g>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot12902"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ transform="translate(-214.28571,111.42857)"><flowRegion
+ id="flowRegion12904"><rect
+ id="rect12906"
+ width="301.42856"
+ height="435.71429"
+ x="-924.28571"
+ y="320.93362" /></flowRegion><flowPara
+ id="flowPara12908" /></flowRoot> <path
+ inkscape:connector-type="polyline"
+ id="path12950-6"
+ d="m -808.27602,393.39505 0,42.40522"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connection-end="#g12957-7"
+ inkscape:connector-type="polyline"
+ id="path12962-1"
+ d="m -808.27602,532.73368 0,39.73323"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <g
+ style="fill:#0000ff;stroke:#0000ff"
+ id="g8286">
+ <path
+ sodipodi:type="arc"
+ style="fill:#0000ff;fill-opacity:0;fill-rule:evenodd;stroke:#0000ff;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-5"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-612.86713,62.419408)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#0000ff;fill-opacity:1;stroke:#0000ff;font-family:Bitstream Vera Sans"
+ x="-684.68646"
+ y="272.78107"
+ id="text12629-9-3-1-4"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-76-6"
+ x="-684.68646"
+ y="272.78107">B'</tspan></text>
+ </g>
+ <path
+ inkscape:connection-end="#g10287"
+ inkscape:connection-start="#g8286"
+ inkscape:connector-type="polyline"
+ transform="translate(-997.6235,206.6479)"
+ id="path8303"
+ d="M 301.69976,93.326264 214.85234,235.78314"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM);display:inline"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connection-end="#g8425"
+ inkscape:connection-start="#g8286"
+ inkscape:connector-type="polyline"
+ transform="translate(-997.6235,206.6479)"
+ id="path8430"
+ d="M 286.10442,78.162204 230.44767,114.28051"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-start:none;marker-end:url(#EmptyDiamondMend)"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ transform="translate(1068.385,-581.11052)"
+ id="g21066">
+ <g
+ style="opacity:0.5"
+ id="g8425-4">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-50"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-750.72428,151.88146)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-822.54358"
+ y="362.2431"
+ id="text12629-9-3-1-5"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-9"
+ x="-822.54358"
+ y="362.2431">B</tspan></text>
+ </g>
+ <g
+ id="g10287-2">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-9-5"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-750.72428,288.54815)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-821.49023"
+ y="498.90979"
+ id="text12629-9-3-1-8-7"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-7-9"
+ x="-821.49023"
+ y="498.90979">A</tspan></text>
+ </g>
+ <g
+ transform="translate(-10.776028,0)"
+ id="g12957-71">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-6-47"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,425.21479)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="635.57648"
+ id="text12629-9-3-1-83-0"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-5-66"
+ x="-810.71423"
+ y="635.57648">Z</tspan></text>
+ </g>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot12902-9"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ transform="translate(-214.28571,111.42857)"><flowRegion
+ id="flowRegion12904-70"><rect
+ id="rect12906-8"
+ width="301.42856"
+ height="435.71429"
+ x="-924.28571"
+ y="320.93362" /></flowRegion><flowPara
+ id="flowPara12908-61" /></flowRoot> <path
+ inkscape:connector-type="polyline"
+ id="path12950-7"
+ d="m -808.27602,393.39505 0,42.40522"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connection-end="#g12957-71"
+ inkscape:connector-type="polyline"
+ id="path12962-3"
+ d="m -808.27602,532.73368 0,39.73323"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <g
+ style="fill:#008000;stroke:#008000"
+ id="g8294">
+ <path
+ sodipodi:type="arc"
+ style="fill:#008000;fill-opacity:0;fill-rule:evenodd;stroke:#008000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-5-2"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-888.58143,62.419408)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#008000;fill-opacity:1;stroke:#008000;font-family:Bitstream Vera Sans"
+ x="-960.40076"
+ y="272.78107"
+ id="text12629-9-3-1-4-8"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-76-6-5"
+ x="-960.40076"
+ y="272.78107">B''</tspan></text>
+ </g>
+ <path
+ inkscape:connection-end="#g10287-2"
+ inkscape:connection-start="#g8294"
+ inkscape:connector-type="polyline"
+ transform="translate(-997.6235,206.6479)"
+ id="path8305"
+ d="M 76.995186,93.326264 163.84261,235.78314"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM);display:inline"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connection-end="#g8425-4"
+ inkscape:connection-start="#g8294"
+ inkscape:connector-type="polyline"
+ transform="translate(-997.6235,206.6479)"
+ id="path8432"
+ d="M 92.590525,78.162204 148.24727,114.28051"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-end:url(#EmptyDiamondMend)"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ transform="translate(1682.2151,-370.76569)"
+ id="g21276">
+ <g
+ style="opacity:0.5"
+ id="g8425-1">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-750.72428,151.88146)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-822.54358"
+ y="362.2431"
+ id="text12629-9-3-1"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0"
+ x="-822.54358"
+ y="362.2431">B</tspan></text>
+ </g>
+ <g
+ id="g10287-7">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-9-2"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-750.72428,288.54815)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-821.49023"
+ y="498.90979"
+ id="text12629-9-3-1-8-2"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-7-1"
+ x="-821.49023"
+ y="498.90979">A</tspan></text>
+ </g>
+ <g
+ transform="translate(-10.776028,0)"
+ id="g12957-9">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-6-0"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,425.21479)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="635.57648"
+ id="text12629-9-3-1-83-3"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-5-6"
+ x="-810.71423"
+ y="635.57648">Z</tspan></text>
+ </g>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot12902-3"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ transform="translate(-214.28571,111.42857)"><flowRegion
+ id="flowRegion12904-7"><rect
+ id="rect12906-6"
+ width="301.42856"
+ height="435.71429"
+ x="-924.28571"
+ y="320.93362" /></flowRegion><flowPara
+ id="flowPara12908-5" /></flowRoot> <path
+ inkscape:connector-type="polyline"
+ id="path12950"
+ d="m -808.27602,393.39505 0,42.40522"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connection-end="#g12957-9"
+ inkscape:connector-type="polyline"
+ id="path12962-5"
+ d="m -808.27602,532.73368 0,39.73323"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <g
+ style="fill:#ff0000;stroke:#ff0000"
+ id="g8286-2">
+ <path
+ sodipodi:type="arc"
+ style="fill:#ff0000;fill-opacity:0;fill-rule:evenodd;stroke:#ff0000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-5-4"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-612.86713,62.419408)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#ff0000;fill-opacity:1;stroke:#ff0000;font-family:Bitstream Vera Sans"
+ x="-684.68646"
+ y="272.78107"
+ id="text12629-9-3-1-4-5"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-76"
+ x="-684.68646"
+ y="272.78107">B'</tspan></text>
+ </g>
+ <g
+ style="fill:#ff0000;stroke:#ff0000"
+ id="g8294-2">
+ <path
+ sodipodi:type="arc"
+ style="fill:#ff0000;fill-opacity:0;fill-rule:evenodd;stroke:#ff0000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-5-2-2"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-888.58143,62.419408)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#ff0000;fill-opacity:1;stroke:#ff0000;font-family:Bitstream Vera Sans"
+ x="-960.40076"
+ y="272.78107"
+ id="text12629-9-3-1-4-8-3"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-76-6-59"
+ x="-960.40076"
+ y="272.78107">B''</tspan></text>
+ </g>
+ <path
+ inkscape:connection-end="#g10287-7"
+ inkscape:connection-start="#g8286-2"
+ inkscape:connector-type="polyline"
+ transform="translate(-997.6235,206.6479)"
+ id="path8303-8"
+ d="M 301.69976,93.326264 214.85234,235.78314"
+ style="fill:#ff0000;stroke:#ff0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM);display:inline"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connection-end="#g10287-7"
+ inkscape:connection-start="#g8294-2"
+ inkscape:connector-type="polyline"
+ transform="translate(-997.6235,206.6479)"
+ id="path8305-0"
+ d="M 76.995186,93.326264 163.84261,235.78314"
+ style="fill:#ff0000;stroke:#ff0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM);display:inline"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connection-end="#g8425-1"
+ inkscape:connection-start="#g8286-2"
+ inkscape:connector-type="polyline"
+ transform="translate(-997.6235,206.6479)"
+ id="path8430-0"
+ d="M 286.10442,78.162204 230.44767,114.28051"
+ style="fill:#ff0000;stroke:#ff0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-start:none;marker-end:url(#EmptyDiamondMend)"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connection-end="#g8425-1"
+ inkscape:connection-start="#g8294-2"
+ inkscape:connector-type="polyline"
+ transform="translate(-997.6235,206.6479)"
+ id="path8432-1"
+ d="M 92.590525,78.162204 148.24727,114.28051"
+ style="fill:#ff0000;stroke:#ff0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-end:url(#EmptyDiamondMend)"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/explain-troubles-latecomer-10-sumup.svg Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,1039 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1311.8625"
+ height="879.2406"
+ id="svg12964"
+ version="1.1"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="explain-troubles-latecomer-10-sumup.svg">
+ <defs
+ id="defs12966">
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mend"
+ style="overflow:visible">
+ <path
+ id="path4078"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.4,0,0,-0.4,-4,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible">
+ <path
+ id="path4072"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path4069"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.8,0,0,0.8,10,0)" />
+ </marker>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective12972" />
+ <inkscape:perspective
+ id="perspective13312"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM"
+ style="overflow:visible">
+ <path
+ id="path6393"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13318"
+ style="overflow:visible">
+ <path
+ id="path13320"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective13418"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-1"
+ style="overflow:visible">
+ <path
+ id="path6393-1"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13424"
+ style="overflow:visible">
+ <path
+ id="path13426"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13428"
+ style="overflow:visible">
+ <path
+ id="path13430"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13432"
+ style="overflow:visible">
+ <path
+ id="path13434"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend"
+ style="overflow:visible">
+ <path
+ id="path6456"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13438"
+ style="overflow:visible">
+ <path
+ id="path13440"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective13583"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-0"
+ style="overflow:visible">
+ <path
+ id="path6393-5"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13589"
+ style="overflow:visible">
+ <path
+ id="path13591"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13593"
+ style="overflow:visible">
+ <path
+ id="path13595"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective13743"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-2"
+ style="overflow:visible">
+ <path
+ id="path6393-2"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13749"
+ style="overflow:visible">
+ <path
+ id="path13751"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13753"
+ style="overflow:visible">
+ <path
+ id="path13755"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13757"
+ style="overflow:visible">
+ <path
+ id="path13759"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend-3"
+ style="overflow:visible">
+ <path
+ id="path6456-4"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13763"
+ style="overflow:visible">
+ <path
+ id="path13765"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective15593"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2"
+ style="overflow:visible">
+ <path
+ id="path4072-8"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective15593-5"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-6"
+ style="overflow:visible">
+ <path
+ id="path4072-7"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective15593-1"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-29"
+ style="overflow:visible">
+ <path
+ id="path4072-70"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective18500"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-4"
+ style="overflow:visible">
+ <path
+ id="path6393-20"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective18588"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-47"
+ style="overflow:visible">
+ <path
+ id="path6393-22"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker18594"
+ style="overflow:visible">
+ <path
+ id="path18596"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend-31"
+ style="overflow:visible">
+ <path
+ id="path4197"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective18791"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective18959"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-6"
+ style="overflow:visible">
+ <path
+ id="path6393-21"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker18965"
+ style="overflow:visible">
+ <path
+ id="path18967"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-1-4"
+ style="overflow:visible">
+ <path
+ id="path6393-3"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend-2"
+ style="overflow:visible">
+ <path
+ id="path4197-2"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective19288"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-44"
+ style="overflow:visible">
+ <path
+ id="path6393-9"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker19294"
+ style="overflow:visible">
+ <path
+ id="path19296"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.58"
+ inkscape:cx="455.19061"
+ inkscape:cy="630.49672"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1918"
+ inkscape:window-height="1165"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata12969">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(312.26788,289.78072)">
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="279.72873"
+ y="588.89349"
+ id="text13894"><tspan
+ sodipodi:role="line"
+ id="tspan13896"
+ x="279.72873"
+ y="588.89349">Local</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="176.47943"
+ y="147.90836"
+ id="text13898"><tspan
+ sodipodi:role="line"
+ id="tspan13900"
+ x="176.47943"
+ y="147.90836">Distant</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="731.52625"
+ y="360.52893"
+ id="text13902"><tspan
+ sodipodi:role="line"
+ id="tspan13904"
+ x="731.52625"
+ y="360.52893">final = <tspan
+ style="fill:#ff0000;stroke:#ff0000"
+ id="tspan14035">tardif</tspan></tspan></text>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow1Mend)"
+ d="M -149.51243,71.715908 116.10904,-98.285798"
+ id="path14093" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow1Mend)"
+ d="M -136.88118,173.93586 140.19146,310.32109"
+ id="path14093-1" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow1Mend)"
+ d="m 358.73418,-10.742763 276.5932,40.995518"
+ id="path14093-4"
+ inkscape:transform-center-x="38.2665"
+ inkscape:transform-center-y="-14.191534" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow1Mend)"
+ d="M 385.49434,405.82501 666.42726,306.55019"
+ id="path14093-42" />
+ <g
+ transform="translate(536.84443,-411.12056)"
+ id="g18477">
+ <g
+ id="g12945">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-9"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,288.54815)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="498.90979"
+ id="text12629-9-3-1-8"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-7"
+ x="-810.71423"
+ y="498.90979">A</tspan></text>
+ </g>
+ <g
+ id="g12957">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-6"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,425.21479)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="635.57648"
+ id="text12629-9-3-1-83"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-5"
+ x="-810.71423"
+ y="635.57648">Z</tspan></text>
+ </g>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot12902"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ transform="translate(-214.28571,111.42857)"><flowRegion
+ id="flowRegion12904"><rect
+ id="rect12906"
+ width="301.42856"
+ height="435.71429"
+ x="-924.28571"
+ y="320.93362" /></flowRegion><flowPara
+ id="flowPara12908" /></flowRoot> <path
+ inkscape:connection-end="#g12957"
+ inkscape:connection-start="#g12945"
+ inkscape:connector-type="polyline"
+ id="path12962"
+ d="m -797.5,533.2573 0,38.68599"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)" />
+ </g>
+ <g
+ transform="translate(1048.9196,-141.60299)"
+ id="g18559">
+ <g
+ style="opacity:0.5"
+ id="g12945-6">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-9-5"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,288.54815)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="498.90979"
+ id="text12629-9-3-1-8-5"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-7-9"
+ x="-810.71423"
+ y="498.90979">A</tspan></text>
+ </g>
+ <g
+ id="g12957-33">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-6-80"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,425.21479)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="635.57648"
+ id="text12629-9-3-1-83-1"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-5-0"
+ x="-810.71423"
+ y="635.57648">Z</tspan></text>
+ </g>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot12902-9"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ transform="translate(-214.28571,111.42857)"><flowRegion
+ id="flowRegion12904-8"><rect
+ id="rect12906-6"
+ width="301.42856"
+ height="435.71429"
+ x="-924.28571"
+ y="320.93362" /></flowRegion><flowPara
+ id="flowPara12908-3" /></flowRoot> <path
+ inkscape:connection-end="#g12957-33"
+ inkscape:connection-start="#g12945-6"
+ inkscape:connector-type="polyline"
+ id="path12962-09"
+ d="m -797.5,533.2573 0,38.68599"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)" />
+ <g
+ id="g3273">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-9-4"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-598.58143,208.13369)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-669.34741"
+ y="418.49533"
+ id="text12629-9-3-1-8-2"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-7-7-4"
+ x="-669.34741"
+ y="418.49533">A'</tspan></text>
+ </g>
+ <path
+ inkscape:connection-end="#g12957-33"
+ inkscape:connection-start="#g3273"
+ inkscape:connector-type="polyline"
+ transform="translate(-848.99032,352.36219)"
+ id="path3278"
+ d="M 166.11979,92.547868 78.227679,227.51388"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)" />
+ <path
+ inkscape:connection-end="#g12945-6"
+ inkscape:connection-start="#g3273"
+ inkscape:connector-type="polyline"
+ transform="translate(-848.99032,352.36219)"
+ id="path3280"
+ d="M 150.2668,75.717222 94.08067,107.67788"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-mid:none;marker-end:url(#EmptyDiamondMend)" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-316.03741"
+ y="327.08148"
+ id="text13894-3"><tspan
+ sodipodi:role="line"
+ id="tspan13896-8"
+ x="-316.03741"
+ y="327.08148">initial</tspan></text>
+ <g
+ transform="translate(1607.395,-370.37344)"
+ id="g18925">
+ <g
+ transform="translate(0,5.2380981)"
+ id="g12933">
+ <path
+ sodipodi:type="arc"
+ style="fill:#d4aa00;fill-opacity:0;fill-rule:evenodd;stroke:#d4aa00;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,146.64336)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#d4aa00;fill-opacity:1;stroke:#d4aa00;font-family:Bitstream Vera Sans"
+ x="-841.76758"
+ y="358.43356"
+ id="text12629-9-3-1"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0"
+ x="-841.76758"
+ y="358.43356">v4.2</tspan></text>
+ </g>
+ <g
+ id="g12945-7">
+ <path
+ sodipodi:type="arc"
+ style="fill:#d4aa00;fill-opacity:0;fill-rule:evenodd;stroke:#d4aa00;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-9-2"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,288.54815)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="498.90979"
+ id="text12629-9-3-1-8-25"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-7-1"
+ x="-810.71423"
+ y="498.90979">A</tspan></text>
+ </g>
+ <g
+ id="g12957-38">
+ <path
+ sodipodi:type="arc"
+ style="fill:#d4aa00;fill-opacity:0;fill-rule:evenodd;stroke:#d4aa00;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-6-4"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,425.21479)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="635.57648"
+ id="text12629-9-3-1-83-8"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-5-6"
+ x="-810.71423"
+ y="635.57648">Z</tspan></text>
+ </g>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot12902-3"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ transform="translate(-214.28571,111.42857)"><flowRegion
+ id="flowRegion12904-7"><rect
+ id="rect12906-4"
+ width="301.42856"
+ height="435.71429"
+ x="-924.28571"
+ y="320.93362" /></flowRegion><flowPara
+ id="flowPara12908-6" /></flowRoot> <path
+ inkscape:connection-start="#g12933"
+ inkscape:connection-end="#g12945-7"
+ inkscape:connector-type="polyline"
+ id="path12950"
+ d="m -797.5,393.91867 0,41.35798"
+ style="fill:#d4aa00;stroke:#d4aa00;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)" />
+ <path
+ inkscape:connection-end="#g12957-38"
+ inkscape:connection-start="#g12945-7"
+ inkscape:connector-type="polyline"
+ id="path12962-2"
+ d="m -797.5,533.2573 0,38.68599"
+ style="fill:#d4aa00;stroke:#d4aa00;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)" />
+ <g
+ id="g7062">
+ <path
+ sodipodi:type="arc"
+ style="fill:#ff0000;fill-opacity:0;fill-rule:evenodd;stroke:#ff0000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-9-4-1"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-601.73896,221.4909)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#ff0000;fill-opacity:1;stroke:#ff0000;font-family:Bitstream Vera Sans"
+ x="-672.50494"
+ y="431.85254"
+ id="text12629-9-3-1-8-2-2"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-7-7"
+ x="-672.50494"
+ y="431.85254">A'</tspan></text>
+ </g>
+ <path
+ inkscape:connection-end="#g12957-38"
+ inkscape:connection-start="#g7062"
+ inkscape:connector-type="polyline"
+ transform="translate(-848.99032,296.10995)"
+ id="path7067"
+ d="M 162.19312,161.64503 78.99682,284.27841"
+ style="fill:#ff0000;stroke:#ff0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM-1)" />
+ <path
+ inkscape:connection-end="#g12945-7"
+ inkscape:connection-start="#g7062"
+ inkscape:connector-type="polyline"
+ transform="translate(-848.99032,296.10995)"
+ id="path7069"
+ d="M 145.61323,142.48988 95.576703,166.76692"
+ style="fill:#ff0000;stroke:#ff0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-end:url(#EmptyDiamondMend)" />
+ </g>
+ <g
+ transform="translate(1040.2927,-585.89067)"
+ id="g19264">
+ <g
+ id="g12933-2"
+ transform="translate(0,5.2380981)">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,146.64336)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1-3"
+ style="fill:#d4aa00;fill-opacity:0;fill-rule:evenodd;stroke:#d4aa00;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1-80"
+ y="358.43356"
+ x="-841.76758"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#d4aa00;fill-opacity:1;stroke:#d4aa00;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="358.43356"
+ x="-841.76758"
+ id="tspan12631-6-9-0-76"
+ sodipodi:role="line">v4.2</tspan></text>
+ </g>
+ <g
+ id="g12945-76">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,288.54815)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1-9-29"
+ style="fill:#d4aa00;fill-opacity:0;fill-rule:evenodd;stroke:#d4aa00;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1-8-9"
+ y="498.90979"
+ x="-810.71423"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="498.90979"
+ x="-810.71423"
+ id="tspan12631-6-9-0-7-0"
+ sodipodi:role="line">A</tspan></text>
+ </g>
+ <g
+ id="g12957-39">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,425.21479)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1-6-81"
+ style="fill:#d4aa00;fill-opacity:0;fill-rule:evenodd;stroke:#d4aa00;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1-83-7"
+ y="635.57648"
+ x="-810.71423"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="635.57648"
+ x="-810.71423"
+ id="tspan12631-6-9-0-5-08"
+ sodipodi:role="line">Z</tspan></text>
+ </g>
+ <path
+ style="fill:#d4aa00;stroke:#d4aa00;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ d="m -797.5,393.91867 0,41.35798"
+ id="path12950-9"
+ inkscape:connector-type="polyline"
+ inkscape:connection-end="#g12945-76"
+ inkscape:connection-start="#g12933-2" />
+ <path
+ style="fill:#d4aa00;stroke:#d4aa00;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ d="m -797.5,533.2573 0,38.68599"
+ id="path12962-0"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g12945-76"
+ inkscape:connection-end="#g12957-39" />
+ </g>
+ </g>
+</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/explain-troubles-latecomer-15-solution.svg Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,994 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="557.31696"
+ height="487.83316"
+ id="svg12964"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="explain-troubles-latecomer-15-solution.svg">
+ <defs
+ id="defs12966">
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mend"
+ style="overflow:visible">
+ <path
+ id="path4078"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.4,0,0,-0.4,-4,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible">
+ <path
+ id="path4072"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path4069"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective12972" />
+ <inkscape:perspective
+ id="perspective13312"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM"
+ style="overflow:visible">
+ <path
+ id="path6393"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13318"
+ style="overflow:visible">
+ <path
+ id="path13320"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ id="perspective13418"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-1"
+ style="overflow:visible">
+ <path
+ id="path6393-1"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13424"
+ style="overflow:visible">
+ <path
+ id="path13426"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13428"
+ style="overflow:visible">
+ <path
+ id="path13430"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13432"
+ style="overflow:visible">
+ <path
+ id="path13434"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend"
+ style="overflow:visible">
+ <path
+ id="path6456"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13438"
+ style="overflow:visible">
+ <path
+ id="path13440"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ id="perspective13583"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-0"
+ style="overflow:visible">
+ <path
+ id="path6393-5"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13589"
+ style="overflow:visible">
+ <path
+ id="path13591"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13593"
+ style="overflow:visible">
+ <path
+ id="path13595"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ id="perspective13743"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-2"
+ style="overflow:visible">
+ <path
+ id="path6393-2"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13749"
+ style="overflow:visible">
+ <path
+ id="path13751"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13753"
+ style="overflow:visible">
+ <path
+ id="path13755"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13757"
+ style="overflow:visible">
+ <path
+ id="path13759"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend-3"
+ style="overflow:visible">
+ <path
+ id="path6456-4"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13763"
+ style="overflow:visible">
+ <path
+ id="path13765"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ id="perspective15593"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2"
+ style="overflow:visible">
+ <path
+ id="path4072-8"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ id="perspective15593-5"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-6"
+ style="overflow:visible">
+ <path
+ id="path4072-7"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ id="perspective15593-1"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-29"
+ style="overflow:visible">
+ <path
+ id="path4072-70"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ id="perspective18500"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-4"
+ style="overflow:visible">
+ <path
+ id="path6393-20"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ id="perspective18588"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-47"
+ style="overflow:visible">
+ <path
+ id="path6393-22"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker18594"
+ style="overflow:visible">
+ <path
+ id="path18596"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend-31"
+ style="overflow:visible">
+ <path
+ id="path4197"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ id="perspective18791"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <inkscape:perspective
+ id="perspective18959"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-6"
+ style="overflow:visible">
+ <path
+ id="path6393-21"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker18965"
+ style="overflow:visible">
+ <path
+ id="path18967"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-1-4"
+ style="overflow:visible">
+ <path
+ id="path6393-3"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend-2"
+ style="overflow:visible">
+ <path
+ id="path4197-2"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ id="perspective19288"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-44"
+ style="overflow:visible">
+ <path
+ id="path6393-9"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker19294"
+ style="overflow:visible">
+ <path
+ id="path19296"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-7"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path6393-6"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker6176"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path6178"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-1-7"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path6393-1-6"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend-8"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path6456-0"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.58"
+ inkscape:cx="588.77184"
+ inkscape:cy="64.133389"
+ inkscape:document-units="px"
+ inkscape:current-layer="g7062-0"
+ showgrid="false"
+ inkscape:window-width="1215"
+ inkscape:window-height="776"
+ inkscape:window-x="65"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1"
+ fit-margin-top="5"
+ fit-margin-right="5"
+ fit-margin-left="5"
+ fit-margin-bottom="5" />
+ <metadata
+ id="metadata12969">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(170.29334,188.87454)">
+ <g
+ id="g6078">
+ <g
+ id="g18925"
+ transform="translate(683.25707,-378.99413)">
+ <g
+ id="g12933"
+ transform="translate(0,5.2380981)">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,146.64336)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1"
+ style="fill:#d4aa00;fill-opacity:0;fill-rule:evenodd;stroke:#d4aa00;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1"
+ y="358.43356"
+ x="-841.76758"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#d4aa00;fill-opacity:1;stroke:#d4aa00;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="358.43356"
+ x="-841.76758"
+ id="tspan12631-6-9-0"
+ sodipodi:role="line">v4.2</tspan></text>
+ </g>
+ <g
+ id="g12945-7">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,288.54815)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1-9-2"
+ style="fill:#d4aa00;fill-opacity:0;fill-rule:evenodd;stroke:#d4aa00;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1-8-25"
+ y="498.90979"
+ x="-810.71423"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="498.90979"
+ x="-810.71423"
+ id="tspan12631-6-9-0-7-1"
+ sodipodi:role="line">A</tspan></text>
+ </g>
+ <g
+ id="g12957-38">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,425.21479)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1-6-4"
+ style="fill:#d4aa00;fill-opacity:0;fill-rule:evenodd;stroke:#d4aa00;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1-83-8"
+ y="635.57648"
+ x="-810.71423"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="635.57648"
+ x="-810.71423"
+ id="tspan12631-6-9-0-5-6"
+ sodipodi:role="line">Z</tspan></text>
+ </g>
+ <flowRoot
+ transform="translate(-214.28571,111.42857)"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ id="flowRoot12902-3"
+ xml:space="preserve"><flowRegion
+ id="flowRegion12904-7"><rect
+ y="320.93362"
+ x="-924.28571"
+ height="435.71429"
+ width="301.42856"
+ id="rect12906-4" /></flowRegion><flowPara
+ id="flowPara12908-6" /></flowRoot> <path
+ inkscape:connector-curvature="0"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-start-point="d4"
+ style="fill:#d4aa00;stroke:#d4aa00;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ d="m -797.5,393.91867 0,41.35798"
+ id="path12950"
+ inkscape:connector-type="polyline"
+ inkscape:connection-end="#g12945-7"
+ inkscape:connection-start="#g12933" />
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-start-point="d4"
+ style="fill:#d4aa00;stroke:#d4aa00;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ d="m -797.5,533.2573 0,38.68599"
+ id="path12962-2"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g12945-7"
+ inkscape:connection-end="#g12957-38" />
+ <g
+ id="g7062">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-601.73896,221.4909)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1-9-4-1"
+ style="fill:#ff0000;fill-opacity:0;fill-rule:evenodd;stroke:#ff0000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1-8-2-2"
+ y="431.85254"
+ x="-672.50494"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#ff0000;fill-opacity:1;stroke:#ff0000;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="431.85254"
+ x="-672.50494"
+ id="tspan12631-6-9-0-7-7"
+ sodipodi:role="line">A'</tspan></text>
+ </g>
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-start-point="d4"
+ style="fill:#ff0000;stroke:#ff0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM-1)"
+ d="M 162.19312,161.64503 78.99682,284.27841"
+ id="path7067"
+ transform="translate(-848.99032,296.10995)"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g7062"
+ inkscape:connection-end="#g12957-38" />
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-start-point="d4"
+ style="fill:#ff0000;stroke:#ff0000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-end:url(#EmptyDiamondMend)"
+ d="M 145.61323,142.48988 95.576703,166.76692"
+ id="path7069"
+ transform="translate(-848.99032,296.10995)"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g7062"
+ inkscape:connection-end="#g12945-7" />
+ </g>
+ </g>
+ <g
+ transform="translate(990.2654,-377.97948)"
+ id="g18925-6">
+ <g
+ transform="translate(0,5.2380981)"
+ id="g12933-0">
+ <path
+ sodipodi:type="arc"
+ style="fill:#d4aa00;fill-opacity:0;fill-rule:evenodd;stroke:#d4aa00;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-8"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,146.64336)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#d4aa00;fill-opacity:1;stroke:#d4aa00;font-family:Bitstream Vera Sans"
+ x="-841.76758"
+ y="358.43356"
+ id="text12629-9-3-1-9"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-4"
+ x="-841.76758"
+ y="358.43356">v4.2</tspan></text>
+ </g>
+ <g
+ id="g12945-7-0">
+ <path
+ sodipodi:type="arc"
+ style="fill:#d4aa00;fill-opacity:0;fill-rule:evenodd;stroke:#d4aa00;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-9-2-6"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,288.54815)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="498.90979"
+ id="text12629-9-3-1-8-25-0"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-7-1-0"
+ x="-810.71423"
+ y="498.90979">A</tspan></text>
+ </g>
+ <g
+ id="g12957-38-9">
+ <path
+ sodipodi:type="arc"
+ style="fill:#d4aa00;fill-opacity:0;fill-rule:evenodd;stroke:#d4aa00;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-6-4-2"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,425.21479)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="635.57648"
+ id="text12629-9-3-1-83-8-7"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-5-6-6"
+ x="-810.71423"
+ y="635.57648">Z</tspan></text>
+ </g>
+ <flowRoot
+ xml:space="preserve"
+ id="flowRoot12902-3-4"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ transform="translate(-214.28571,111.42857)"><flowRegion
+ id="flowRegion12904-7-4"><rect
+ id="rect12906-4-2"
+ width="301.42856"
+ height="435.71429"
+ x="-924.28571"
+ y="320.93362" /></flowRegion><flowPara
+ id="flowPara12908-6-9" /></flowRoot> <path
+ inkscape:connection-start="#g12933-0"
+ inkscape:connection-end="#g12945-7-0"
+ inkscape:connector-type="polyline"
+ id="path12950-5"
+ d="m -797.5,393.91867 0,41.35798"
+ style="fill:#d4aa00;stroke:#d4aa00;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connection-end="#g12957-38-9"
+ inkscape:connection-start="#g12945-7-0"
+ inkscape:connector-type="polyline"
+ id="path12962-2-2"
+ d="m -797.5,533.2573 0,38.68599"
+ style="fill:#d4aa00;stroke:#d4aa00;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g7062-0">
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.5;fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-9-4-1-8"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-601.73896,221.4909)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;opacity:0.5;fill:#000000;fill-opacity:1;stroke:#000000;font-family:Bitstream Vera Sans"
+ x="-672.50494"
+ y="431.85254"
+ id="text12629-9-3-1-8-2-2-6"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-7-7-2"
+ x="-672.50494"
+ y="431.85254">A'</tspan></text>
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-9-4-1-8-3"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-602.70567,72.41019)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:#000000;font-family:Bitstream Vera Sans"
+ x="-671.47168"
+ y="282.77182"
+ id="text12629-9-3-1-8-2-2-6-2"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-7-7-2-8"
+ x="-671.47168"
+ y="282.77182">Aᵟ</tspan></text>
+ <path
+ style="fill:#000000;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-end:url(#EmptyDiamondMend-8)"
+ d="m 643.10345,205.10267 0,51.72414"
+ id="path6304"
+ inkscape:connector-curvature="0"
+ transform="translate(-1302.5333,110.19876)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM-1-7)"
+ d="m -697.8407,298.53986 -80.747,140.6978"
+ id="path6306"
+ inkscape:connector-curvature="0" />
+ </g>
+ <path
+ inkscape:connector-type="polyline"
+ id="path7067-4"
+ d="m -695.12005,452.57296 -84.97116,125.65959"
+ style="opacity:0.5;fill:#000000;stroke:#000000;stroke-width:3.06777191;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM-1)"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-type="polyline"
+ id="path7069-5"
+ d="m -705.04154,428.01168 -51.05239,29.6913"
+ style="opacity:0.5;fill:#000000;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-end:url(#EmptyDiamondMend)"
+ inkscape:connector-curvature="0" />
+ </g>
+ </g>
+</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/explain-troubles-unstable-10-sumup.svg Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,1101 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="1414.5707"
+ height="1196.5396"
+ id="svg12964"
+ version="1.1"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="explain-troubles-unstable-10-sumup.svg">
+ <defs
+ id="defs12966">
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Mend"
+ style="overflow:visible;">
+ <path
+ id="path4078"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.4) rotate(180) translate(10,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lend"
+ style="overflow:visible;">
+ <path
+ id="path4072"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none;"
+ transform="scale(0.8) rotate(180) translate(12.5,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0.0"
+ refX="0.0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path4069"
+ d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1.0pt;marker-start:none"
+ transform="scale(0.8) translate(12.5,0)" />
+ </marker>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective12972" />
+ <inkscape:perspective
+ id="perspective13312"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM"
+ style="overflow:visible">
+ <path
+ id="path6393"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13318"
+ style="overflow:visible">
+ <path
+ id="path13320"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective13418"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-1"
+ style="overflow:visible">
+ <path
+ id="path6393-1"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13424"
+ style="overflow:visible">
+ <path
+ id="path13426"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13428"
+ style="overflow:visible">
+ <path
+ id="path13430"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13432"
+ style="overflow:visible">
+ <path
+ id="path13434"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend"
+ style="overflow:visible">
+ <path
+ id="path6456"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13438"
+ style="overflow:visible">
+ <path
+ id="path13440"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective13583"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-0"
+ style="overflow:visible">
+ <path
+ id="path6393-5"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13589"
+ style="overflow:visible">
+ <path
+ id="path13591"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13593"
+ style="overflow:visible">
+ <path
+ id="path13595"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective13743"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-2"
+ style="overflow:visible">
+ <path
+ id="path6393-2"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13749"
+ style="overflow:visible">
+ <path
+ id="path13751"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13753"
+ style="overflow:visible">
+ <path
+ id="path13755"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13757"
+ style="overflow:visible">
+ <path
+ id="path13759"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend-3"
+ style="overflow:visible">
+ <path
+ id="path6456-4"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13763"
+ style="overflow:visible">
+ <path
+ id="path13765"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective15593"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2"
+ style="overflow:visible">
+ <path
+ id="path4072-8"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective15593-5"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-6"
+ style="overflow:visible">
+ <path
+ id="path4072-7"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ <inkscape:perspective
+ id="perspective15593-1"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-29"
+ style="overflow:visible">
+ <path
+ id="path4072-70"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.58"
+ inkscape:cx="460.47484"
+ inkscape:cy="579.06827"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1918"
+ inkscape:window-height="1165"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0" />
+ <metadata
+ id="metadata12969">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(317.55211,451.61155)">
+ <g
+ id="g16677">
+ <g
+ transform="translate(63.770124,322.85714)"
+ id="g13934">
+ <g
+ transform="translate(994.04378,-358.66548)"
+ id="g13382">
+ <g
+ style="opacity:0.5"
+ transform="translate(0,5.2380981)"
+ id="g12933-9">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-8"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,146.64336)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-811.76758"
+ y="357.005"
+ id="text12629-9-3-1-4"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-9"
+ x="-811.76758"
+ y="357.005">B</tspan></text>
+ </g>
+ <g
+ style="opacity:0.5"
+ id="g12945-3">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-9-9"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,288.54815)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="498.90979"
+ id="text12629-9-3-1-8-9"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-7-0"
+ x="-810.71423"
+ y="498.90979">A</tspan></text>
+ </g>
+ <g
+ id="g12957-8">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-6-3"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,425.21479)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="635.57648"
+ id="text12629-9-3-1-83-0"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-5-1"
+ x="-810.71423"
+ y="635.57648">Z</tspan></text>
+ </g>
+ <path
+ inkscape:connection-end="#g12945-3"
+ inkscape:connection-start="#g12933-9"
+ inkscape:connector-type="polyline"
+ id="path12950-7"
+ d="m -797.5,393.91867 0,41.35798"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)" />
+ <path
+ inkscape:connection-end="#g12957-8"
+ inkscape:connection-start="#g12945-3"
+ inkscape:connector-type="polyline"
+ id="path12962-0"
+ d="m -797.5,533.2573 0,38.68599"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)" />
+ <g
+ id="g14080">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-67"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-580.01,81.22892)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-651.82935"
+ y="291.59058"
+ id="text12629-9-3-1-2"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-77"
+ x="-651.82935"
+ y="291.59058">B'</tspan></text>
+ </g>
+ <g
+ id="g14034">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-9-2"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-580.01,217.89561)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-650.776"
+ y="428.25726"
+ id="text12629-9-3-1-8-0"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-7-7"
+ x="-650.776"
+ y="428.25726">A'</tspan></text>
+ </g>
+ <path
+ inkscape:connection-end="#g12957-8"
+ inkscape:connection-start="#g14034"
+ inkscape:connector-type="polyline"
+ transform="translate(-848.99032,225.45742)"
+ id="path14087"
+ d="M 181.50292,226.948 81.415976,356.68521"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)" />
+ <path
+ inkscape:connection-end="#g14034"
+ inkscape:connection-start="#g14080"
+ inkscape:connector-type="polyline"
+ transform="translate(-848.99032,225.45742)"
+ id="path14089"
+ d="m 211.42857,100.48065 0,38.68604"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)" />
+ <path
+ inkscape:connection-end="#g12945-3"
+ inkscape:connection-start="#g14034"
+ inkscape:connector-type="polyline"
+ transform="translate(-848.99032,225.45742)"
+ id="path14463"
+ d="M 166.6047,207.95791 96.314201,239.00866"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-start:none;marker-mid:none;marker-end:url(#EmptyDiamondMend)" />
+ <path
+ inkscape:connection-start="#g14080"
+ inkscape:connection-end="#g12933-9"
+ transform="translate(-848.99032,225.45742)"
+ inkscape:connector-type="polyline"
+ id="path14465"
+ d="M 166.6047,71.29122 97.24687,101.92996"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-start:none;marker-mid:none;marker-end:url(#EmptyDiamondMend)" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="224.57932"
+ y="372.93292"
+ id="text13894"><tspan
+ sodipodi:role="line"
+ id="tspan13896"
+ x="224.57932"
+ y="372.93292">Local</tspan></text>
+ </g>
+ <g
+ transform="translate(53.152706,-930.19704)"
+ id="g13910">
+ <g
+ transform="translate(999.11715,331.93758)"
+ id="g13554">
+ <g
+ transform="translate(2.11198,-3.2921448)"
+ id="g12933-2">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-1"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,146.64336)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-811.76758"
+ y="357.005"
+ id="text12629-9-3-1-0"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-1"
+ x="-811.76758"
+ y="357.005">B</tspan></text>
+ </g>
+ <g
+ transform="translate(2.11198,-4.265152)"
+ id="g12945-7">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-9-0"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,288.54815)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="498.90979"
+ id="text12629-9-3-1-8-8"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-7-07"
+ x="-810.71423"
+ y="498.90979">A</tspan></text>
+ </g>
+ <g
+ transform="translate(2.11198,0)"
+ id="g12957-6">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-6-7"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,425.21479)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="635.57648"
+ id="text12629-9-3-1-83-3"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-5-9"
+ x="-810.71423"
+ y="635.57648">Z</tspan></text>
+ </g>
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end="#g12945-7"
+ inkscape:connection-start="#g12933-2"
+ inkscape:connector-type="polyline"
+ id="path12950-8"
+ d="m -795.38802,389.71981 0,43.48719"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)" />
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end="#g12957-6"
+ inkscape:connection-start="#g12945-7"
+ inkscape:connector-type="polyline"
+ id="path12962-3"
+ d="m -795.38802,531.14792 0,40.81523"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)" />
+ <g
+ transform="translate(-2.11198,0)"
+ id="g13397">
+ <path
+ sodipodi:type="arc"
+ style="fill:#0000ff;fill-opacity:0;fill-rule:evenodd;stroke:#0000ff;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-0"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-735.72429,2.41941)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-807.54364"
+ y="212.78105"
+ id="text12629-9-3-1-7"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-6"
+ x="-807.54364"
+ y="212.78105">C</tspan></text>
+ </g>
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end="#g12933-2"
+ inkscape:connection-start="#g13397"
+ inkscape:connector-type="polyline"
+ transform="translate(-848.99032,296.10995)"
+ id="path13402"
+ d="m 53.602303,-49.001257 0,44.6701979"
+ style="fill:#0000ff;stroke:#0000ff;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-end:url(#DotM)" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="130.22327"
+ y="1072.933"
+ id="text13898"><tspan
+ sodipodi:role="line"
+ id="tspan13900"
+ x="130.22327"
+ y="1072.933">Distant</tspan></text>
+ </g>
+ </g>
+ <g
+ id="g14037"
+ transform="translate(-12.610837,-438.21686)">
+ <g
+ id="g13702"
+ transform="translate(1669.5314,38.478002)">
+ <g
+ id="g12933-3"
+ transform="translate(0.68341,5.2381)"
+ style="opacity:0.5">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,146.64336)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1-5"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1-28"
+ y="357.005"
+ x="-811.76758"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="357.005"
+ x="-811.76758"
+ id="tspan12631-6-9-0-73"
+ sodipodi:role="line">B</tspan></text>
+ </g>
+ <g
+ id="g12945-5"
+ style="opacity:0.5"
+ transform="translate(0.68341,0)">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,288.54815)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1-9-8"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1-8-87"
+ y="498.90979"
+ x="-810.71423"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="498.90979"
+ x="-810.71423"
+ id="tspan12631-6-9-0-7-3"
+ sodipodi:role="line">A</tspan></text>
+ </g>
+ <g
+ id="g12957-3"
+ transform="translate(0.68341,0)">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,425.21479)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1-6-8"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1-83-5"
+ y="635.57648"
+ x="-810.71423"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="635.57648"
+ x="-810.71423"
+ id="tspan12631-6-9-0-5-4"
+ sodipodi:role="line">Z</tspan></text>
+ </g>
+ <path
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ d="m -796.81659,393.91659 0,41.36213"
+ id="path12950-85"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g12933-3"
+ inkscape:connection-end="#g12945-5"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ d="m -796.81659,533.25522 0,38.69014"
+ id="path12962-4"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g12945-5"
+ inkscape:connection-end="#g12957-3"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g14080-8">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-580.01,81.22892)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1-67-4"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1-2-2"
+ y="291.59058"
+ x="-651.82935"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="291.59058"
+ x="-651.82935"
+ id="tspan12631-6-9-0-77-5"
+ sodipodi:role="line">B'</tspan></text>
+ </g>
+ <g
+ id="g14034-8">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-580.01,217.89561)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1-9-2-4"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1-8-0-4"
+ y="428.25726"
+ x="-650.776"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="428.25726"
+ x="-650.776"
+ id="tspan12631-6-9-0-7-7-3"
+ sodipodi:role="line">A'</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ d="M 181.58323,227.00991 81.848934,356.84479"
+ id="path14087-4"
+ transform="translate(-848.99032,225.45742)"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g14034-8"
+ inkscape:connection-end="#g12957-3"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ d="m 211.42857,100.48065 0,38.68604"
+ id="path14089-8"
+ transform="translate(-848.99032,225.45742)"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g14080-8"
+ inkscape:connection-end="#g14034-8"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-start:none;marker-mid:none;marker-end:url(#EmptyDiamondMend)"
+ d="M 166.63618,208.02892 96.585,239.10674"
+ id="path14463-7"
+ transform="translate(-848.99032,225.45742)"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g14034-8"
+ inkscape:connection-end="#g12945-5"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-start:none;marker-mid:none;marker-end:url(#EmptyDiamondMend)"
+ d="M 166.63618,71.362225 97.512165,102.02871"
+ id="path14465-9"
+ inkscape:connector-type="polyline"
+ transform="translate(-848.99032,225.45742)"
+ inkscape:connection-end="#g12933-3"
+ inkscape:connection-start="#g14080-8"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g5583"
+ transform="translate(-0.68341,0)">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-738.58143,1.22892)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path4918"
+ style="fill:#ff0000;fill-opacity:0;fill-rule:evenodd;stroke:#ff0000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text4920"
+ y="211.59058"
+ x="-810.40076"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#ff0000;fill-opacity:1;stroke:#ff0000;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="211.59058"
+ x="-810.40076"
+ id="tspan4922"
+ sodipodi:role="line">C</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 52.173733,20.478573 0,50.004102"
+ id="path5588"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="3"
+ inkscape:connection-start="#g5583"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end="#g12933-3"
+ inkscape:connection-end-point="d4"
+ transform="translate(-848.99032,225.45742)" />
+ </g>
+ <text
+ id="text13902"
+ y="781.50439"
+ x="801.03363"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="781.50439"
+ x="801.03363"
+ id="tspan13904"
+ sodipodi:role="line">final = <tspan
+ id="tspan14035"
+ style="fill:#ff0000;stroke:#ff0000">instable</tspan></tspan></text>
+ </g>
+ <g
+ id="g14074"
+ transform="translate(12.068966,-361.47806)">
+ <g
+ id="g13288"
+ transform="translate(531.43821,-33.336839)">
+ <g
+ id="g12933"
+ transform="translate(0,5.2380981)">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,146.64336)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1"
+ y="357.005"
+ x="-811.76758"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="357.005"
+ x="-811.76758"
+ id="tspan12631-6-9-0"
+ sodipodi:role="line">B</tspan></text>
+ </g>
+ <g
+ id="g12945">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,288.54815)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1-9"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1-8"
+ y="498.90979"
+ x="-810.71423"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="498.90979"
+ x="-810.71423"
+ id="tspan12631-6-9-0-7"
+ sodipodi:role="line">A</tspan></text>
+ </g>
+ <g
+ id="g12957">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,425.21479)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1-6"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1-83"
+ y="635.57648"
+ x="-810.71423"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="635.57648"
+ x="-810.71423"
+ id="tspan12631-6-9-0-5"
+ sodipodi:role="line">Z</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ d="m -797.5,393.91867 0,41.35798"
+ id="path12950"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g12933"
+ inkscape:connection-end="#g12945" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ d="m -797.5,533.2573 0,38.68599"
+ id="path12962"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g12945"
+ inkscape:connection-end="#g12957" />
+ </g>
+ <text
+ id="text13906"
+ y="704.36151"
+ x="-321.08133"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="704.36151"
+ x="-321.08133"
+ id="tspan13908"
+ sodipodi:role="line">initial</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow1Mend)"
+ d="M -148.90439,71.107869 115.52431,-150.21739"
+ id="path14093" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow1Mend)"
+ d="M -116.60064,185.59571 141.08898,310.8959"
+ id="path14093-1" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:10;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow1Mend)"
+ d="m 377.16638,-147.48298 351.94233,55.511595"
+ id="path14093-4"
+ inkscape:transform-center-x="48.58484"
+ inkscape:transform-center-y="-19.640393" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:8.96527767;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:none;marker-end:url(#Arrow1Mend)"
+ d="M 516.3549,303.21782 766.85794,121.81435"
+ id="path14093-42" />
+ </g>
+</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/explain-troubles-unstable-15-solution.svg Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,1006 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="637.31207"
+ height="614.44788"
+ id="svg12964"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="explain-troubles-unstable-15-solution.svg">
+ <defs
+ id="defs12966">
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mend"
+ style="overflow:visible">
+ <path
+ id="path4078"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.4,0,0,-0.4,-4,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible">
+ <path
+ id="path4072"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path4069"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective12972" />
+ <inkscape:perspective
+ id="perspective13312"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM"
+ style="overflow:visible">
+ <path
+ id="path6393"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13318"
+ style="overflow:visible">
+ <path
+ id="path13320"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ id="perspective13418"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-1"
+ style="overflow:visible">
+ <path
+ id="path6393-1"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13424"
+ style="overflow:visible">
+ <path
+ id="path13426"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13428"
+ style="overflow:visible">
+ <path
+ id="path13430"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13432"
+ style="overflow:visible">
+ <path
+ id="path13434"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend"
+ style="overflow:visible">
+ <path
+ id="path6456"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13438"
+ style="overflow:visible">
+ <path
+ id="path13440"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ id="perspective13583"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-0"
+ style="overflow:visible">
+ <path
+ id="path6393-5"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13589"
+ style="overflow:visible">
+ <path
+ id="path13591"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13593"
+ style="overflow:visible">
+ <path
+ id="path13595"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ id="perspective13743"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-2"
+ style="overflow:visible">
+ <path
+ id="path6393-2"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13749"
+ style="overflow:visible">
+ <path
+ id="path13751"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13753"
+ style="overflow:visible">
+ <path
+ id="path13755"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13757"
+ style="overflow:visible">
+ <path
+ id="path13759"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend-3"
+ style="overflow:visible">
+ <path
+ id="path6456-4"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13763"
+ style="overflow:visible">
+ <path
+ id="path13765"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ id="perspective15593"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2"
+ style="overflow:visible">
+ <path
+ id="path4072-8"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ id="perspective15593-5"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-6"
+ style="overflow:visible">
+ <path
+ id="path4072-7"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ id="perspective15593-1"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-29"
+ style="overflow:visible">
+ <path
+ id="path4072-70"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-6"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path6393-3"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker8630"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path8632"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker8634"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path8636"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker8638"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path8640"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend-2"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path6456-7"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker8644"
+ style="overflow:visible">
+ <path
+ inkscape:connector-curvature="0"
+ id="path8646"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.58"
+ inkscape:cx="446.08569"
+ inkscape:cy="388.21623"
+ inkscape:document-units="px"
+ inkscape:current-layer="g13702-1"
+ showgrid="false"
+ inkscape:window-width="1215"
+ inkscape:window-height="776"
+ inkscape:window-x="65"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1"
+ fit-margin-top="5"
+ fit-margin-right="5"
+ fit-margin-bottom="5"
+ fit-margin-left="5" />
+ <metadata
+ id="metadata12969">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-804.0536,336.234)">
+ <g
+ transform="translate(1656.9206,-399.73886)"
+ id="g13702">
+ <g
+ style="opacity:0.5"
+ transform="translate(0.68341,5.2381)"
+ id="g12933-3">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-5"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,146.64336)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-811.76758"
+ y="357.005"
+ id="text12629-9-3-1-28"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-73"
+ x="-811.76758"
+ y="357.005">B</tspan></text>
+ </g>
+ <g
+ transform="translate(0.68341,0)"
+ style="opacity:0.5"
+ id="g12945-5">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-9-8"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,288.54815)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="498.90979"
+ id="text12629-9-3-1-8-87"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-7-3"
+ x="-810.71423"
+ y="498.90979">A</tspan></text>
+ </g>
+ <g
+ transform="translate(0.68341,0)"
+ id="g12957-3">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-6-8"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,425.21479)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="635.57648"
+ id="text12629-9-3-1-83-5"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-5-4"
+ x="-810.71423"
+ y="635.57648">Z</tspan></text>
+ </g>
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end="#g12945-5"
+ inkscape:connection-start="#g12933-3"
+ inkscape:connector-type="polyline"
+ id="path12950-85"
+ d="m -796.81659,393.9166 0,41.36212"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)" />
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end="#g12957-3"
+ inkscape:connection-start="#g12945-5"
+ inkscape:connector-type="polyline"
+ id="path12962-4"
+ d="m -796.81659,533.25522 0,38.69014"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)" />
+ <g
+ id="g14080-8">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-67-4"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-580.01,81.22892)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-651.82935"
+ y="291.59058"
+ id="text12629-9-3-1-2-2"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-77-5"
+ x="-651.82935"
+ y="291.59058">B'</tspan></text>
+ </g>
+ <g
+ id="g14034-8">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-9-2-4"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-580.01,217.89561)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-650.776"
+ y="428.25726"
+ id="text12629-9-3-1-8-0-4"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-7-7-3"
+ x="-650.776"
+ y="428.25726">A'</tspan></text>
+ </g>
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end="#g12957-3"
+ inkscape:connection-start="#g14034-8"
+ inkscape:connector-type="polyline"
+ transform="translate(-848.99032,225.45742)"
+ id="path14087-4"
+ d="M 181.58323,227.00991 81.848934,356.84479"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)" />
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end="#g14034-8"
+ inkscape:connection-start="#g14080-8"
+ inkscape:connector-type="polyline"
+ transform="translate(-848.99032,225.45742)"
+ id="path14089-8"
+ d="m 211.42857,100.48065 0,38.68604"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)" />
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end="#g12945-5"
+ inkscape:connection-start="#g14034-8"
+ inkscape:connector-type="polyline"
+ transform="translate(-848.99032,225.45742)"
+ id="path14463-7"
+ d="M 166.63618,208.02892 96.585,239.10674"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-start:none;marker-mid:none;marker-end:url(#EmptyDiamondMend)" />
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-start="#g14080-8"
+ inkscape:connection-end="#g12933-3"
+ transform="translate(-848.99032,225.45742)"
+ inkscape:connector-type="polyline"
+ id="path14465-9"
+ d="M 166.63618,71.362225 97.512166,102.02872"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-start:none;marker-mid:none;marker-end:url(#EmptyDiamondMend)" />
+ <g
+ transform="translate(-0.68341,0)"
+ id="g5583">
+ <path
+ sodipodi:type="arc"
+ style="fill:#ff0000;fill-opacity:0;fill-rule:evenodd;stroke:#ff0000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path4918"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-738.58143,1.22892)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#ff0000;fill-opacity:1;stroke:#ff0000;font-family:Bitstream Vera Sans"
+ x="-810.40076"
+ y="211.59058"
+ id="text4920"><tspan
+ sodipodi:role="line"
+ id="tspan4922"
+ x="-810.40076"
+ y="211.59058">C</tspan></text>
+ </g>
+ <path
+ transform="translate(-848.99032,225.45742)"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-end="#g12933-3"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-start="#g5583"
+ inkscape:connector-curvature="3"
+ inkscape:connector-type="polyline"
+ id="path5588"
+ d="m 52.173733,20.478573 0,50.004103"
+ style="opacity:0.98000004;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker8638)" />
+ </g>
+ <g
+ transform="translate(2022.8785,-401.87475)"
+ id="g13702-1">
+ <g
+ style="opacity:0.5"
+ transform="translate(0.68341,5.2381)"
+ id="g12933-3-2">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-5-9"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,146.64336)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-811.76758"
+ y="357.005"
+ id="text12629-9-3-1-28-1"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-73-6"
+ x="-811.76758"
+ y="357.005">B</tspan></text>
+ </g>
+ <g
+ transform="translate(0.68341,0)"
+ style="opacity:0.5"
+ id="g12945-5-4">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-9-8-0"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,288.54815)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="498.90979"
+ id="text12629-9-3-1-8-87-7"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-7-3-6"
+ x="-810.71423"
+ y="498.90979">A</tspan></text>
+ </g>
+ <g
+ transform="translate(0.68341,0)"
+ id="g12957-3-9">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-6-8-4"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,425.21479)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="635.57648"
+ id="text12629-9-3-1-83-5-9"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-5-4-8"
+ x="-810.71423"
+ y="635.57648">Z</tspan></text>
+ </g>
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end="#g12945-5-4"
+ inkscape:connection-start="#g12933-3-2"
+ inkscape:connector-type="polyline"
+ id="path12950-85-4"
+ d="m -796.81659,393.9166 0,41.36212"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)" />
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end="#g12957-3-9"
+ inkscape:connection-start="#g12945-5-4"
+ inkscape:connector-type="polyline"
+ id="path12962-4-3"
+ d="m -796.81659,533.25522 0,38.69014"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)" />
+ <g
+ id="g14080-8-5">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-67-4-3"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-580.01,81.22892)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-651.82935"
+ y="291.59058"
+ id="text12629-9-3-1-2-2-5"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-77-5-6"
+ x="-651.82935"
+ y="291.59058">B'</tspan></text>
+ </g>
+ <g
+ id="g14034-8-4">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-9-2-4-3"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-580.01,217.89561)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-650.776"
+ y="428.25726"
+ id="text12629-9-3-1-8-0-4-6"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-7-7-3-3"
+ x="-650.776"
+ y="428.25726">A'</tspan></text>
+ </g>
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end="#g12957-3-9"
+ inkscape:connection-start="#g14034-8-4"
+ inkscape:connector-type="polyline"
+ transform="translate(-848.99032,225.45742)"
+ id="path14087-4-0"
+ d="M 181.58323,227.00991 81.848934,356.84479"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)" />
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end="#g14034-8-4"
+ inkscape:connection-start="#g14080-8-5"
+ inkscape:connector-type="polyline"
+ transform="translate(-848.99032,225.45742)"
+ id="path14089-8-4"
+ d="m 211.42857,100.48065 0,38.68604"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)" />
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end="#g12945-5-4"
+ inkscape:connection-start="#g14034-8-4"
+ inkscape:connector-type="polyline"
+ transform="translate(-848.99032,225.45742)"
+ id="path14463-7-3"
+ d="M 166.63618,208.02892 96.585,239.10674"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-start:none;marker-mid:none;marker-end:url(#EmptyDiamondMend)" />
+ <path
+ inkscape:connector-curvature="0"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-start="#g14080-8-5"
+ inkscape:connection-end="#g12933-3-2"
+ transform="translate(-848.99032,225.45742)"
+ inkscape:connector-type="polyline"
+ id="path14465-9-9"
+ d="M 166.63618,71.362225 97.512166,102.02872"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-start:none;marker-mid:none;marker-end:url(#EmptyDiamondMend)" />
+ <g
+ transform="translate(-0.68341,0)"
+ id="g5583-2"
+ style="opacity:0.5;fill:#000000;stroke:#000000">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path4918-6"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-738.58143,1.22892)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:#000000;font-family:Bitstream Vera Sans"
+ x="-810.40076"
+ y="211.59058"
+ id="text4920-1"><tspan
+ sodipodi:role="line"
+ id="tspan4922-9"
+ x="-810.40076"
+ y="211.59058">C</tspan></text>
+ </g>
+ <path
+ transform="translate(-848.99032,225.45742)"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-end="#g12933-3-2"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-start="#g5583-2"
+ inkscape:connector-curvature="3"
+ inkscape:connector-type="polyline"
+ id="path5588-9"
+ d="m 52.173733,20.478573 0,50.004103"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker8638)" />
+ <g
+ transform="translate(-4.5930013,-154.28292)"
+ id="g14080-8-5-0"
+ style="fill:#0000ff;stroke:#0000ff">
+ <path
+ sodipodi:type="arc"
+ style="fill:#0000ff;fill-opacity:0;fill-rule:evenodd;stroke:#0000ff;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-67-4-3-2"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-580.01,81.22892)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#0000ff;fill-opacity:1;stroke:#0000ff;font-family:Bitstream Vera Sans"
+ x="-651.82935"
+ y="291.59058"
+ id="text12629-9-3-1-2-2-5-5"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-77-5-6-1"
+ x="-651.82935"
+ y="291.59058">C'</tspan></text>
+ </g>
+ </g>
+ <path
+ style="fill:#0000ff;stroke:#0000ff;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#marker8638)"
+ d="m 1380.7238,-230.93407 0,58.53617"
+ id="path9998"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:3, 3;stroke-dashoffset:0;marker-end:url(#marker8644)"
+ d="m 1653.4483,189.643 -63.7931,37.93103"
+ id="path10000"
+ inkscape:connector-curvature="0"
+ transform="translate(-317.55211,-451.61155)" />
+ </g>
+</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/git.svg Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,863 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ width="910.36212"
+ height="598.43103"
+ id="svg12964"
+ version="1.1"
+ inkscape:version="0.48.3.1 r9886"
+ sodipodi:docname="git.svg">
+ <defs
+ id="defs12966">
+ <marker
+ inkscape:stockid="Arrow1Mend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Mend"
+ style="overflow:visible">
+ <path
+ id="path4078"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.4,0,0,-0.4,-4,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend"
+ style="overflow:visible">
+ <path
+ id="path4072"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="Arrow1Lstart"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lstart"
+ style="overflow:visible">
+ <path
+ id="path4069"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.8,0,0,0.8,10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 526.18109 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="744.09448 : 526.18109 : 1"
+ inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
+ id="perspective12972" />
+ <inkscape:perspective
+ id="perspective13312"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM"
+ style="overflow:visible">
+ <path
+ id="path6393"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13318"
+ style="overflow:visible">
+ <path
+ id="path13320"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ id="perspective13418"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-1"
+ style="overflow:visible">
+ <path
+ id="path6393-1"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13424"
+ style="overflow:visible">
+ <path
+ id="path13426"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13428"
+ style="overflow:visible">
+ <path
+ id="path13430"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13432"
+ style="overflow:visible">
+ <path
+ id="path13434"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend"
+ style="overflow:visible">
+ <path
+ id="path6456"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13438"
+ style="overflow:visible">
+ <path
+ id="path13440"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ id="perspective13583"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-0"
+ style="overflow:visible">
+ <path
+ id="path6393-5"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13589"
+ style="overflow:visible">
+ <path
+ id="path13591"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13593"
+ style="overflow:visible">
+ <path
+ id="path13595"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ id="perspective13743"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="DotM-2"
+ style="overflow:visible">
+ <path
+ id="path6393-2"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13749"
+ style="overflow:visible">
+ <path
+ id="path13751"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13753"
+ style="overflow:visible">
+ <path
+ id="path13755"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="DotM"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13757"
+ style="overflow:visible">
+ <path
+ id="path13759"
+ d="m -2.5,-1 c 0,2.76 -2.24,5 -5,5 -2.76,0 -5,-2.24 -5,-5 0,-2.76 2.24,-5 5,-5 2.76,0 5,2.24 5,5 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none;marker-end:none"
+ transform="matrix(0.4,0,0,0.4,2.96,0.4)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="EmptyDiamondMend-3"
+ style="overflow:visible">
+ <path
+ id="path6456-4"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <marker
+ inkscape:stockid="EmptyDiamondMend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="marker13763"
+ style="overflow:visible">
+ <path
+ id="path13765"
+ d="M 0,-7.0710768 -7.0710894,0 0,7.0710589 7.0710462,0 0,-7.0710768 z"
+ style="fill:#ffffff;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(0.4,0,0,0.4,-2.6,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ id="perspective15593"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-2"
+ style="overflow:visible">
+ <path
+ id="path4072-8"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ id="perspective15593-5"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-6"
+ style="overflow:visible">
+ <path
+ id="path4072-7"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ <inkscape:perspective
+ id="perspective15593-1"
+ inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
+ inkscape:vp_z="1 : 0.5 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_x="0 : 0.5 : 1"
+ sodipodi:type="inkscape:persp3d" />
+ <marker
+ inkscape:stockid="Arrow1Lend"
+ orient="auto"
+ refY="0"
+ refX="0"
+ id="Arrow1Lend-29"
+ style="overflow:visible">
+ <path
+ id="path4072-70"
+ d="M 0,0 5,-5 -12.5,0 5,5 0,0 z"
+ style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
+ transform="matrix(-0.8,0,0,-0.8,-10,0)"
+ inkscape:connector-curvature="0" />
+ </marker>
+ </defs>
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="0.7"
+ inkscape:cx="267.70686"
+ inkscape:cy="266.91354"
+ inkscape:document-units="px"
+ inkscape:current-layer="g13382"
+ showgrid="false"
+ inkscape:window-width="1280"
+ inkscape:window-height="776"
+ inkscape:window-x="0"
+ inkscape:window-y="24"
+ inkscape:window-maximized="1"
+ fit-margin-top="5"
+ fit-margin-bottom="5"
+ fit-margin-right="5"
+ fit-margin-left="5" />
+ <metadata
+ id="metadata12969">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 1"
+ inkscape:groupmode="layer"
+ id="layer1"
+ transform="translate(-120.93016,350.21716)">
+ <g
+ id="g16677"
+ transform="translate(-83.33333,-403.33333)">
+ <g
+ transform="translate(63.770124,322.85714)"
+ id="g13934">
+ <g
+ transform="translate(994.04378,-358.66548)"
+ id="g13382">
+ <g
+ style="opacity:0.5"
+ transform="translate(0,5.2380981)"
+ id="g12933-9">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-8"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,146.64336)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-811.76758"
+ y="357.005"
+ id="text12629-9-3-1-4"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-9"
+ x="-811.76758"
+ y="357.005">B</tspan></text>
+ </g>
+ <g
+ style="opacity:0.5"
+ id="g12945-3">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-9-9"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,288.54815)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="498.90979"
+ id="text12629-9-3-1-8-9"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-7-0"
+ x="-810.71423"
+ y="498.90979">A</tspan></text>
+ </g>
+ <g
+ id="g12957-8">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-6-3"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,425.21479)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-810.71423"
+ y="635.57648"
+ id="text12629-9-3-1-83-0"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-5-1"
+ x="-810.71423"
+ y="635.57648">Z</tspan></text>
+ </g>
+ <path
+ inkscape:connector-type="polyline"
+ id="path12950-7"
+ d="m -797.5,393.91867 0,41.35798"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ inkscape:connector-curvature="0"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-end="#g12945-3"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-start="#g12933-9" />
+ <path
+ inkscape:connector-type="polyline"
+ id="path12962-0"
+ d="m -797.5,533.2573 0,38.68599"
+ style="opacity:0.5;fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ inkscape:connector-curvature="0"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-end="#g12957-8"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-start="#g12945-3" />
+ <g
+ id="g14080">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-67"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-580.01,81.22892)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-651.82935"
+ y="291.59058"
+ id="text12629-9-3-1-2"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-77"
+ x="-651.82935"
+ y="291.59058">B'</tspan></text>
+ </g>
+ <g
+ id="g14034">
+ <path
+ sodipodi:type="arc"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ id="path12627-8-4-1-9-2"
+ sodipodi:cx="-172.85715"
+ sodipodi:cy="399.50504"
+ sodipodi:rx="147.14285"
+ sodipodi:ry="100"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ transform="matrix(0.33294398,0,0,0.48990327,-580.01,217.89561)" />
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="-650.776"
+ y="428.25726"
+ id="text12629-9-3-1-8-0"><tspan
+ sodipodi:role="line"
+ id="tspan12631-6-9-0-7-7"
+ x="-650.776"
+ y="428.25726">A'</tspan></text>
+ </g>
+ <path
+ inkscape:connector-type="polyline"
+ transform="translate(-848.99032,225.45742)"
+ id="path14087"
+ d="M 181.50292,226.948 81.415976,356.68521"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ inkscape:connector-curvature="0"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-start="#g14034"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-end="#g12957-8" />
+ <path
+ inkscape:connector-type="polyline"
+ transform="translate(-848.99032,225.45742)"
+ id="path14089"
+ d="m 211.42857,100.48065 0,38.68604"
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ inkscape:connector-curvature="0"
+ inkscape:connection-end-point="d4"
+ inkscape:connection-end="#g14034"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-start="#g14080" />
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ x="224.57932"
+ y="372.93292"
+ id="text13894"><tspan
+ sodipodi:role="line"
+ id="tspan13896"
+ x="224.57932"
+ y="372.93292" /></text>
+ </g>
+ </g>
+ <g
+ id="g14037"
+ transform="translate(-209.2775,-468.21686)">
+ <g
+ id="g13702"
+ transform="translate(1669.5314,38.478002)">
+ <g
+ id="g12933-3"
+ transform="translate(0.68341,5.2381)">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,146.64336)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1-5"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1-28"
+ y="357.005"
+ x="-811.76758"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="357.005"
+ x="-811.76758"
+ id="tspan12631-6-9-0-73"
+ sodipodi:role="line">B</tspan></text>
+ </g>
+ <g
+ id="g12945-5"
+ transform="translate(0.68341,0)">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,288.54815)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1-9-8"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1-8-87"
+ y="498.90979"
+ x="-810.71423"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="498.90979"
+ x="-810.71423"
+ id="tspan12631-6-9-0-7-3"
+ sodipodi:role="line">A</tspan></text>
+ </g>
+ <g
+ id="g12957-3"
+ transform="translate(0.68341,0)">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-739.94825,425.21479)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1-6-8"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1-83-5"
+ y="635.57648"
+ x="-810.71423"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="635.57648"
+ x="-810.71423"
+ id="tspan12631-6-9-0-5-4"
+ sodipodi:role="line">Z</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ d="m -796.81659,393.9166 0,41.36212"
+ id="path12950-85"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g12933-3"
+ inkscape:connection-end="#g12945-5"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#000000;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ d="m -796.81659,533.25522 0,38.69014"
+ id="path12962-4"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g12945-5"
+ inkscape:connection-end="#g12957-3"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0" />
+ <g
+ id="g14080-8">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-580.01,81.22892)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1-67-4"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1-2-2"
+ y="291.59058"
+ x="-651.82935"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="291.59058"
+ x="-651.82935"
+ id="tspan12631-6-9-0-77-5"
+ sodipodi:role="line">B'</tspan></text>
+ </g>
+ <g
+ id="g14034-8">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-580.01,217.89561)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path12627-8-4-1-9-2-4"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text12629-9-3-1-8-0-4"
+ y="428.25726"
+ x="-650.776"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="428.25726"
+ x="-650.776"
+ id="tspan12631-6-9-0-7-7-3"
+ sodipodi:role="line">A'</tspan></text>
+ </g>
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ d="M 181.58323,227.00991 81.848934,356.84479"
+ id="path14087-4"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g14034-8"
+ inkscape:connection-end="#g12957-3"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0"
+ transform="translate(-848.99032,225.45742)" />
+ <path
+ style="fill:none;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-end:url(#DotM)"
+ d="m 211.42857,100.48065 0,38.68604"
+ id="path14089-8"
+ inkscape:connector-type="polyline"
+ inkscape:connection-start="#g14080-8"
+ inkscape:connection-end="#g14034-8"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end-point="d4"
+ inkscape:connector-curvature="0"
+ transform="translate(-848.99032,225.45742)" />
+ <g
+ id="g5583"
+ transform="translate(-0.68341,0)"
+ style="fill:#000000;stroke:#000000">
+ <path
+ transform="matrix(0.33294398,0,0,0.48990327,-738.58143,1.22892)"
+ d="m -25.714294,399.50504 c 0,55.22847 -65.8781,100 -147.142856,100 -81.26475,0 -147.14285,-44.77153 -147.14285,-100 0,-55.22848 65.8781,-100 147.14285,-100 81.264756,0 147.142856,44.77152 147.142856,100 z"
+ sodipodi:ry="100"
+ sodipodi:rx="147.14285"
+ sodipodi:cy="399.50504"
+ sodipodi:cx="-172.85715"
+ id="path4918"
+ style="fill:#000000;fill-opacity:0;fill-rule:evenodd;stroke:#000000;stroke-width:12.38024521;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0"
+ sodipodi:type="arc" />
+ <text
+ id="text4920"
+ y="211.59058"
+ x="-810.40076"
+ style="font-size:40px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:#000000;font-family:Bitstream Vera Sans"
+ xml:space="preserve"><tspan
+ y="211.59058"
+ x="-810.40076"
+ id="tspan4922"
+ sodipodi:role="line">C</tspan></text>
+ </g>
+ <path
+ style="fill:#000000;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 52.173733,20.478573 0,50.004103"
+ id="path5588"
+ inkscape:connector-type="polyline"
+ inkscape:connector-curvature="3"
+ inkscape:connection-start="#g5583"
+ inkscape:connection-start-point="d4"
+ inkscape:connection-end="#g12933-3"
+ inkscape:connection-end-point="d4"
+ transform="translate(-848.99032,225.45742)" />
+ </g>
+ </g>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="199.11453"
+ y="-241.73866"
+ id="text17638"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan17640"
+ x="199.11453"
+ y="-241.73866"
+ style="fill:#0000ff;stroke:#0000ff">feature-babar</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="531.01886"
+ y="-314.82654"
+ id="text17638-9"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan17640-9"
+ x="531.01886"
+ y="-314.82654"
+ style="fill:#0000ff;stroke:#0000ff"><tspan
+ style="fill:#008000;stroke:#008000"
+ id="tspan17684">other/</tspan>feature-babar</tspan></text>
+ <text
+ xml:space="preserve"
+ style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans"
+ x="751.01886"
+ y="-222.82655"
+ id="text17638-9-2"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan17640-9-8"
+ x="751.01886"
+ y="-222.82655"
+ style="fill:#0000ff;stroke:#0000ff">feature-babar</tspan></text>
+ </g>
+</svg>
Binary file docs/figures/hgview-example.png has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/simple-3-merge.svg Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="27 1677 497 345" width="497pt" height="345pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2012-03-21 08:32Z</dc:date><!-- Produced by OmniGraffle Professional 5.3.6 --></metadata><defs><filter id="Shadow" filterUnits="userSpaceOnUse"><feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="3.488"/><feOffset in="blur" result="offset" dx="0" dy="4"/><feFlood flood-color="black" flood-opacity=".75" result="flood"/><feComposite in="flood" in2="offset" operator="in"/></filter><font-face font-family="Helvetica" font-size="26" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.31641" slope="0" x-height="522.94922" cap-height="717.2852" ascent="770.0196" descent="-229.98048" font-weight="500"><font-face-src><font-face-name name="Helvetica"/></font-face-src></font-face><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledDiamond_Marker" viewBox="-1 -3 6 6" markerWidth="6" markerHeight="6" color="red"><g><path d="M 3.7333333 0 L 1.8666667 -1.4 L 0 0 L 1.8666667 1.4 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><g><use xl:href="#id500_Graphic" filter="url(#Shadow)"/><use xl:href="#id501_Graphic" filter="url(#Shadow)"/><use xl:href="#id503_Graphic" filter="url(#Shadow)"/><use xl:href="#id504_Graphic" filter="url(#Shadow)"/><use xl:href="#id507_Graphic" filter="url(#Shadow)"/><use xl:href="#id509_Graphic" filter="url(#Shadow)"/><use xl:href="#id510_Graphic" filter="url(#Shadow)"/><use xl:href="#id516_Graphic" filter="url(#Shadow)"/><use xl:href="#id284_Graphic" filter="url(#Shadow)"/><use xl:href="#id520_Graphic" filter="url(#Shadow)"/><use xl:href="#id523_Graphic" filter="url(#Shadow)"/></g><g id="id500_Graphic"><rect x="47" y="1726.5562" width="143" height="260.96387" fill="white" fill-opacity=".5"/><rect x="47" y="1726.5562" width="143" height="260.96387" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id501_Graphic"><circle cx="118.50044" cy="1853.0206" r="28.346527" fill="red"/><circle cx="118.50044" cy="1853.0206" r="28.346527" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(100.82328 1837.5206)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="118.50028" y1="1913.1742" x2="118.500366" y2="1881.8672" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id503_Graphic"><path d="M 128.52223 1917.8254 C 134.05725 1923.3605 134.05725 1932.3344 128.52223 1937.8694 C 122.98724 1943.4044 114.013245 1943.4044 108.478256 1937.8694 C 102.94323 1932.3344 102.94323 1923.3605 108.478256 1917.8254 C 114.013245 1912.2904 122.98724 1912.2904 128.52223 1917.8254" fill="black"/><path d="M 128.52223 1917.8254 C 134.05725 1923.3605 134.05725 1932.3344 128.52223 1937.8694 C 122.98724 1943.4044 114.013245 1943.4044 108.478256 1937.8694 C 102.94323 1932.3344 102.94323 1923.3605 108.478256 1917.8254 C 114.013245 1912.2904 122.98724 1912.2904 128.52223 1917.8254" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id504_Graphic"><path d="M 128.52223 1963.3254 C 134.05725 1968.8605 134.05725 1977.8344 128.52223 1983.3694 C 122.98724 1988.9044 114.013245 1988.9044 108.478256 1983.3694 C 102.94323 1977.8344 102.94323 1968.8605 108.478256 1963.3254 C 114.013245 1957.7904 122.98724 1957.7904 128.52223 1963.3254" fill="black"/><path d="M 128.52223 1963.3254 C 134.05725 1968.8605 134.05725 1977.8344 128.52223 1983.3694 C 122.98724 1988.9044 114.013245 1988.9044 108.478256 1983.3694 C 102.94323 1977.8344 102.94323 1968.8605 108.478256 1963.3254 C 114.013245 1957.7904 122.98724 1957.7904 128.52223 1963.3254" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="118.500244" y1="1942.5206" x2="118.500244" y2="1958.6742" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id507_Graphic"><rect x="285.5" y="1693.958" width="218" height="303.08691" fill="white" fill-opacity=".5"/><rect x="285.5" y="1693.958" width="218" height="303.08691" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="393.10345" y1="1925.458" x2="364.69406" y2="1885.965" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id509_Graphic"><path d="M 411.69525 1927.3492 C 417.23026 1932.8843 417.23026 1941.8582 411.69525 1947.3932 C 406.16025 1952.9282 397.18625 1952.9282 391.65125 1947.3932 C 386.11624 1941.8582 386.11624 1932.8843 391.65125 1927.3492 C 397.18625 1921.8142 406.16025 1921.8142 411.69525 1927.3492" fill="black"/><path d="M 411.69525 1927.3492 C 417.23026 1932.8843 417.23026 1941.8582 411.69525 1947.3932 C 406.16025 1952.9282 397.18625 1952.9282 391.65125 1947.3932 C 386.11624 1941.8582 386.11624 1932.8843 391.65125 1927.3492 C 397.18625 1921.8142 406.16025 1921.8142 411.69525 1927.3492" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id510_Graphic"><path d="M 411.69525 1972.8492 C 417.23026 1978.3843 417.23026 1987.3582 411.69525 1992.8932 C 406.16025 1998.4282 397.18625 1998.4282 391.65125 1992.8932 C 386.11624 1987.3582 386.11624 1978.3843 391.65125 1972.8492 C 397.18625 1967.3142 406.16025 1967.3142 411.69525 1972.8492" fill="black"/><path d="M 411.69525 1972.8492 C 417.23026 1978.3843 417.23026 1987.3582 411.69525 1992.8932 C 406.16025 1998.4282 397.18625 1998.4282 391.65125 1992.8932 C 386.11624 1987.3582 386.11624 1978.3843 391.65125 1972.8492 C 397.18625 1967.3142 406.16025 1967.3142 411.69525 1972.8492" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="401.67789" y1="1952.0444" x2="401.68301" y2="1968.198" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id516_Graphic"><circle cx="347.84644" cy="1862.5444" r="28.346533" fill="red" fill-opacity=".5"/><path d="M 367.89038 1842.5005 C 378.96042 1853.5704 378.96042 1871.5184 367.89038 1882.5884 C 356.8204 1893.6584 338.87247 1893.6584 327.8025 1882.5884 C 316.73245 1871.5184 316.73245 1853.5704 327.8025 1842.5005 C 338.87247 1831.4304 356.8204 1831.4304 367.89038 1842.5005" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(330.16928 1847.0444)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="427.0911" y1="1818.7612" x2="385.31204" y2="1841.8445" marker-end="url(#FilledDiamond_Marker)" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="1,4"/><line x1="118.50028" y1="1824.1741" x2="118.50015" y2="1800.5271" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id284_Graphic"><circle cx="118.5" cy="1771.6807" r="28.346527" fill="yellow"/><circle cx="118.5" cy="1771.6807" r="28.346527" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(100.82284 1756.1807)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">B</tspan></text></g><g id="id520_Graphic"><circle cx="347.84644" cy="1754.9026" r="28.346533" fill="yellow" fill-opacity=".5"/><path d="M 367.89038 1734.8586 C 378.96042 1745.9286 378.96042 1763.8766 367.89038 1774.9465 C 356.8204 1786.0166 338.87247 1786.0166 327.8025 1774.9465 C 316.73245 1763.8766 316.73245 1745.9286 327.8025 1734.8586 C 338.87247 1723.7886 356.8204 1723.7886 367.89038 1734.8586" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(330.16928 1739.4026)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">B</tspan></text></g><line x1="347.84897" y1="1833.698" x2="347.85342" y2="1783.749" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><line x1="406.91367" y1="1923.662" x2="442.04407" y2="1831.7589" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id523_Graphic"><circle cx="452.34644" cy="1804.8074" r="28.346533" fill="#ff8000"/><circle cx="452.34644" cy="1804.8074" r="28.346533" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(434.66928 1789.3074)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="8.2889767" y="25" textLength="18.776367">C</tspan></text></g><line x1="426.309" y1="1792.373" x2="386.4721" y2="1773.3486" marker-end="url(#FilledDiamond_Marker)" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="1,4"/></g></g></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/simple-4-reorder.svg Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="27 2166 497 345" width="497pt" height="345pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2012-03-21 08:32Z</dc:date><!-- Produced by OmniGraffle Professional 5.3.6 --></metadata><defs><filter id="Shadow" filterUnits="userSpaceOnUse"><feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="3.488"/><feOffset in="blur" result="offset" dx="0" dy="4"/><feFlood flood-color="black" flood-opacity=".75" result="flood"/><feComposite in="flood" in2="offset" operator="in"/></filter><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledDiamond_Marker" viewBox="-1 -3 6 6" markerWidth="6" markerHeight="6" color="red"><g><path d="M 3.7333333 0 L 1.8666667 -1.4 L 0 0 L 1.8666667 1.4 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker><font-face font-family="Helvetica" font-size="26" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.31641" slope="0" x-height="522.94922" cap-height="717.2852" ascent="770.0196" descent="-229.98048" font-weight="500"><font-face-src><font-face-name name="Helvetica"/></font-face-src></font-face></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><g><use xl:href="#id532_Graphic" filter="url(#Shadow)"/><use xl:href="#id525_Graphic" filter="url(#Shadow)"/><use xl:href="#id526_Graphic" filter="url(#Shadow)"/><use xl:href="#id528_Graphic" filter="url(#Shadow)"/><use xl:href="#id529_Graphic" filter="url(#Shadow)"/><use xl:href="#id534_Graphic" filter="url(#Shadow)"/><use xl:href="#id535_Graphic" filter="url(#Shadow)"/><use xl:href="#id537_Graphic" filter="url(#Shadow)"/><use xl:href="#id540_Graphic" filter="url(#Shadow)"/><use xl:href="#id541_Graphic" filter="url(#Shadow)"/><use xl:href="#id546_Graphic" filter="url(#Shadow)"/><use xl:href="#id549_Graphic" filter="url(#Shadow)"/></g><g id="id532_Graphic"><rect x="285.5" y="2182.9602" width="218" height="303.08691" fill="white" fill-opacity=".5"/><rect x="285.5" y="2182.9602" width="218" height="303.08691" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="427.7653" y1="2330.3635" x2="376.8968" y2="2275.3335" marker-end="url(#FilledDiamond_Marker)" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="1,4"/><g id="id525_Graphic"><rect x="47" y="2215.56" width="143" height="260.96387" fill="white" fill-opacity=".5"/><rect x="47" y="2215.56" width="143" height="260.96387" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id526_Graphic"><path d="M 138.5444 2321.9729 C 149.61443 2333.043 149.61443 2350.9907 138.5444 2362.0608 C 127.47443 2373.1309 109.526474 2373.1309 98.456505 2362.0608 C 87.386475 2350.9907 87.386475 2333.043 98.456505 2321.9729 C 109.526474 2310.9028 127.47443 2310.9028 138.5444 2321.9729" fill="red"/><path d="M 138.5444 2321.9729 C 149.61443 2333.043 149.61443 2350.9907 138.5444 2362.0608 C 127.47443 2373.1309 109.526474 2373.1309 98.456505 2362.0608 C 87.386475 2350.9907 87.386475 2333.043 98.456505 2321.9729 C 109.526474 2310.9028 127.47443 2310.9028 138.5444 2321.9729" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(100.82329 2326.5168)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="118.50029" y1="2402.1704" x2="118.500374" y2="2370.8633" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id528_Graphic"><path d="M 128.52225 2406.8218 C 134.05727 2412.3567 134.05727 2421.3308 128.52225 2426.8657 C 122.98724 2432.4009 114.01326 2432.4009 108.478264 2426.8657 C 102.94324 2421.3308 102.94324 2412.3567 108.478264 2406.8218 C 114.01326 2401.2866 122.98724 2401.2866 128.52225 2406.8218" fill="black"/><path d="M 128.52225 2406.8218 C 134.05727 2412.3567 134.05727 2421.3308 128.52225 2426.8657 C 122.98724 2432.4009 114.01326 2432.4009 108.478264 2426.8657 C 102.94324 2421.3308 102.94324 2412.3567 108.478264 2406.8218 C 114.01326 2401.2866 122.98724 2401.2866 128.52225 2406.8218" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id529_Graphic"><path d="M 128.52225 2452.3218 C 134.05727 2457.8567 134.05727 2466.8308 128.52225 2472.3657 C 122.98724 2477.9009 114.01326 2477.9009 108.478264 2472.3657 C 102.94324 2466.8308 102.94324 2457.8567 108.478264 2452.3218 C 114.01326 2446.7866 122.98724 2446.7866 128.52225 2452.3218" fill="black"/><path d="M 128.52225 2452.3218 C 134.05727 2457.8567 134.05727 2466.8308 128.52225 2472.3657 C 122.98724 2477.9009 114.01326 2477.9009 108.478264 2472.3657 C 102.94324 2466.8308 102.94324 2457.8567 108.478264 2452.3218 C 114.01326 2446.7866 122.98724 2446.7866 128.52225 2452.3218" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="118.50025" y1="2431.5171" x2="118.50025" y2="2447.6704" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="393.10349" y1="2414.4607" x2="364.69394" y2="2374.9673" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id534_Graphic"><path d="M 411.69525 2416.352 C 417.23026 2421.887 417.23026 2430.8611 411.69525 2436.396 C 406.16025 2441.9312 397.18625 2441.9312 391.65125 2436.396 C 386.11624 2430.8611 386.11624 2421.887 391.65125 2416.352 C 397.18625 2410.8169 406.16025 2410.8169 411.69525 2416.352" fill="black"/><path d="M 411.69525 2416.352 C 417.23026 2421.887 417.23026 2430.8611 411.69525 2436.396 C 406.16025 2441.9312 397.18625 2441.9312 391.65125 2436.396 C 386.11624 2430.8611 386.11624 2421.887 391.65125 2416.352 C 397.18625 2410.8169 406.16025 2410.8169 411.69525 2416.352" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id535_Graphic"><path d="M 411.69525 2461.852 C 417.23026 2467.387 417.23026 2476.3611 411.69525 2481.896 C 406.16025 2487.4312 397.18625 2487.4312 391.65125 2481.896 C 386.11624 2476.3611 386.11624 2467.387 391.65125 2461.852 C 397.18625 2456.3169 406.16025 2456.3169 411.69525 2461.852" fill="black"/><path d="M 411.69525 2461.852 C 417.23026 2467.387 417.23026 2476.3611 411.69525 2481.896 C 406.16025 2487.4312 397.18625 2487.4312 391.65125 2481.896 C 386.11624 2476.3611 386.11624 2467.387 391.65125 2461.852 C 397.18625 2456.3169 406.16025 2456.3169 411.69525 2461.852" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="401.67325" y1="2441.0474" x2="401.67325" y2="2457.2007" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id537_Graphic"><path d="M 367.89038 2331.5027 C 378.96042 2342.5728 378.96042 2360.5205 367.89038 2371.5906 C 356.8204 2382.6606 338.87247 2382.6606 327.8025 2371.5906 C 316.73245 2360.5205 316.73245 2342.5728 327.8025 2331.5027 C 338.87247 2320.4326 356.8204 2320.4326 367.89038 2331.5027" fill="red" fill-opacity=".5"/><path d="M 367.89038 2331.5027 C 378.96042 2342.5728 378.96042 2360.5205 367.89038 2371.5906 C 356.8204 2382.6606 338.87247 2382.6606 327.8025 2371.5906 C 316.73245 2360.5205 316.73245 2342.5728 327.8025 2331.5027 C 338.87247 2320.4326 356.8204 2320.4326 367.89038 2331.5027" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(330.16928 2336.0466)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="118.500275" y1="2313.1704" x2="118.50013" y2="2289.523" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id540_Graphic"><path d="M 138.5439 2240.6326 C 149.61392 2251.7026 149.61392 2269.6504 138.5439 2280.7205 C 127.47393 2291.7905 109.52598 2291.7905 98.45601 2280.7205 C 87.38598 2269.6504 87.38598 2251.7026 98.45601 2240.6326 C 109.52598 2229.5625 127.47393 2229.5625 138.5439 2240.6326" fill="yellow"/><path d="M 138.5439 2240.6326 C 149.61392 2251.7026 149.61392 2269.6504 138.5439 2280.7205 C 127.47393 2291.7905 109.52598 2291.7905 98.45601 2280.7205 C 87.38598 2269.6504 87.38598 2251.7026 98.45601 2240.6326 C 109.52598 2229.5625 127.47393 2229.5625 138.5439 2240.6326" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(100.82279 2245.1765)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">B</tspan></text></g><g id="id541_Graphic"><path d="M 367.89038 2223.8625 C 378.96042 2234.9326 378.96042 2252.8804 367.89038 2263.9504 C 356.8204 2275.0205 338.87247 2275.0205 327.8025 2263.9504 C 316.73245 2252.8804 316.73245 2234.9326 327.8025 2223.8625 C 338.87247 2212.7925 356.8204 2212.7925 367.89038 2223.8625" fill="yellow" fill-opacity=".5"/><path d="M 367.89038 2223.8625 C 378.96042 2234.9326 378.96042 2252.8804 367.89038 2263.9504 C 356.8204 2275.0205 338.87247 2275.0205 327.8025 2263.9504 C 316.73245 2252.8804 316.73245 2234.9326 327.8025 2223.8625 C 338.87247 2212.7925 356.8204 2212.7925 367.89038 2223.8625" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(330.16928 2228.4065)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">B</tspan></text></g><line x1="347.84644" y1="2322.7002" x2="347.84644" y2="2272.7529" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id546_Graphic"><path d="M 467.39038 2218.6619 C 478.46042 2229.732 478.46042 2247.6797 467.39038 2258.7498 C 456.3204 2269.8198 438.37247 2269.8198 427.3025 2258.7498 C 416.23245 2247.6797 416.23245 2229.732 427.3025 2218.6619 C 438.37247 2207.5918 456.3204 2207.5918 467.39038 2218.6619" fill="red"/><path d="M 467.39038 2218.6619 C 478.46042 2229.732 478.46042 2247.6797 467.39038 2258.7498 C 456.3204 2269.8198 438.37247 2269.8198 427.3025 2258.7498 C 416.23245 2247.6797 416.23245 2229.732 427.3025 2218.6619 C 438.37247 2207.5918 456.3204 2207.5918 467.39038 2218.6619" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(429.66928 2223.2058)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="6.5243282" y="25" textLength="22.305664">A'</tspan></text></g><line x1="409.35617" y1="2413.8691" x2="432.46094" y2="2376.2634" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><line x1="447.3466" y1="2267.5522" x2="447.34692" y2="2322.7002" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id549_Graphic"><path d="M 467.39038 2331.5027 C 478.46042 2342.5728 478.46042 2360.5205 467.39038 2371.5906 C 456.3204 2382.6606 438.37247 2382.6606 427.3025 2371.5906 C 416.23245 2360.5205 416.23245 2342.5728 427.3025 2331.5027 C 438.37247 2320.4326 456.3204 2320.4326 467.39038 2331.5027" fill="yellow"/><path d="M 467.39038 2331.5027 C 478.46042 2342.5728 478.46042 2360.5205 467.39038 2371.5906 C 456.3204 2382.6606 438.37247 2382.6606 427.3025 2371.5906 C 416.23245 2360.5205 416.23245 2342.5728 427.3025 2331.5027 C 438.37247 2320.4326 456.3204 2320.4326 467.39038 2331.5027" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(429.66928 2336.0466)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="6.5243282" y="25" textLength="22.305664">B'</tspan></text></g><line x1="428.2673" y1="2260.343" x2="376.15155" y2="2319.4465" marker-end="url(#FilledDiamond_Marker)" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="1,4"/></g></g></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/figures/simple-5-delete.svg Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xl="http://www.w3.org/1999/xlink" version="1.1" viewBox="66 2640 420 262" width="35pc" height="262pt"><metadata xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>2012-03-21 08:32Z</dc:date><!-- Produced by OmniGraffle Professional 5.3.6 --></metadata><defs><filter id="Shadow" filterUnits="userSpaceOnUse"><feGaussianBlur in="SourceAlpha" result="blur" stdDeviation="3.488"/><feOffset in="blur" result="offset" dx="0" dy="4"/><feFlood flood-color="black" flood-opacity=".75" result="flood"/><feComposite in="flood" in2="offset" operator="in"/></filter><font-face font-family="Helvetica" font-size="26" units-per-em="1000" underline-position="-75.683594" underline-thickness="49.31641" slope="0" x-height="522.94922" cap-height="717.2852" ascent="770.0196" descent="-229.98048" font-weight="500"><font-face-src><font-face-name name="Helvetica"/></font-face-src></font-face><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="FilledDiamond_Marker" viewBox="-1 -3 6 6" markerWidth="6" markerHeight="6" color="red"><g><path d="M 3.7333333 0 L 1.8666667 -1.4 L 0 0 L 1.8666667 1.4 Z" fill="currentColor" stroke="currentColor" stroke-width="1"/></g></marker><marker orient="auto" overflow="visible" markerUnits="strokeWidth" id="Ball_Marker" viewBox="-4 -3 5 6" markerWidth="5" markerHeight="6" color="red"><g><circle cx="-1.3999994" cy="0" r="1.3999988" fill="none" stroke="currentColor" stroke-width="1"/></g></marker></defs><g stroke="none" stroke-opacity="1" stroke-dasharray="none" fill="none" fill-opacity="1"><title>Canvas 1</title><g><title>Layer 1</title><g><use xl:href="#id575_Graphic" filter="url(#Shadow)"/><use xl:href="#id554_Graphic" filter="url(#Shadow)"/><use xl:href="#id555_Graphic" filter="url(#Shadow)"/><use xl:href="#id557_Graphic" filter="url(#Shadow)"/><use xl:href="#id558_Graphic" filter="url(#Shadow)"/><use xl:href="#id562_Graphic" filter="url(#Shadow)"/><use xl:href="#id563_Graphic" filter="url(#Shadow)"/><use xl:href="#id565_Graphic" filter="url(#Shadow)"/></g><g id="id575_Graphic"><rect x="322.92328" y="2656" width="143" height="221.08398" fill="white" fill-opacity=".5"/><rect x="322.92328" y="2656" width="143" height="221.08398" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id554_Graphic"><rect x="86" y="2670.28" width="143" height="192.52393" fill="white" fill-opacity=".5"/><rect x="86" y="2670.28" width="143" height="192.52393" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id555_Graphic"><path d="M 177.54439 2708.2524 C 188.61441 2719.3225 188.61441 2737.2703 177.54439 2748.3403 C 166.47443 2759.4104 148.52646 2759.4104 137.4565 2748.3403 C 126.38647 2737.2703 126.38647 2719.3225 137.4565 2708.2524 C 148.52646 2697.1824 166.47443 2697.1824 177.54439 2708.2524" fill="red"/><path d="M 177.54439 2708.2524 C 188.61441 2719.3225 188.61441 2737.2703 177.54439 2748.3403 C 166.47443 2759.4104 148.52646 2759.4104 137.4565 2748.3403 C 126.38647 2737.2703 126.38647 2719.3225 137.4565 2708.2524 C 148.52646 2697.1824 166.47443 2697.1824 177.54439 2708.2524" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><text transform="translate(139.82329 2712.7964)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="157.50027" y1="2788.45" x2="157.50037" y2="2757.1428" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id557_Graphic"><path d="M 167.52223 2793.1013 C 173.05725 2798.6362 173.05725 2807.6104 167.52223 2813.1453 C 161.98724 2818.6804 153.013245 2818.6804 147.47826 2813.1453 C 141.94324 2807.6104 141.94324 2798.6362 147.47826 2793.1013 C 153.013245 2787.5662 161.98724 2787.5662 167.52223 2793.1013" fill="black"/><path d="M 167.52223 2793.1013 C 173.05725 2798.6362 173.05725 2807.6104 167.52223 2813.1453 C 161.98724 2818.6804 153.013245 2818.6804 147.47826 2813.1453 C 141.94324 2807.6104 141.94324 2798.6362 147.47826 2793.1013 C 153.013245 2787.5662 161.98724 2787.5662 167.52223 2793.1013" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id558_Graphic"><path d="M 167.52223 2838.6013 C 173.05725 2844.1362 173.05725 2853.1104 167.52223 2858.6453 C 161.98724 2864.1804 153.013245 2864.1804 147.47826 2858.6453 C 141.94324 2853.1104 141.94324 2844.1362 147.47826 2838.6013 C 153.013245 2833.0662 161.98724 2833.0662 167.52223 2838.6013" fill="black"/><path d="M 167.52223 2838.6013 C 173.05725 2844.1362 173.05725 2853.1104 167.52223 2858.6453 C 161.98724 2864.1804 153.013245 2864.1804 147.47826 2858.6453 C 141.94324 2853.1104 141.94324 2844.1362 147.47826 2838.6013 C 153.013245 2833.0662 161.98724 2833.0662 167.52223 2838.6013" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="157.50024" y1="2817.7966" x2="157.50024" y2="2833.95" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><line x1="394.42325" y1="2798.7" x2="394.42328" y2="2764.2998" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="3"/><g id="id562_Graphic"><path d="M 404.44525 2803.3513 C 409.98026 2808.8862 409.98026 2817.8604 404.44525 2823.3953 C 398.91025 2828.9304 389.93625 2828.9304 384.40125 2823.3953 C 378.86624 2817.8604 378.86624 2808.8862 384.40125 2803.3513 C 389.93625 2797.8162 398.91025 2797.8162 404.44525 2803.3513" fill="black"/><path d="M 404.44525 2803.3513 C 409.98026 2808.8862 409.98026 2817.8604 404.44525 2823.3953 C 398.91025 2828.9304 389.93625 2828.9304 384.40125 2823.3953 C 378.86624 2817.8604 378.86624 2808.8862 384.40125 2803.3513 C 389.93625 2797.8162 398.91025 2797.8162 404.44525 2803.3513" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><g id="id563_Graphic"><path d="M 404.44525 2848.8513 C 409.98026 2854.3862 409.98026 2863.3604 404.44525 2868.8953 C 398.91025 2874.4304 389.93625 2874.4304 384.40125 2868.8953 C 378.86624 2863.3604 378.86624 2854.3862 384.40125 2848.8513 C 389.93625 2843.3162 398.91025 2843.3162 404.44525 2848.8513" fill="black"/><path d="M 404.44525 2848.8513 C 409.98026 2854.3862 409.98026 2863.3604 404.44525 2868.8953 C 398.91025 2874.4304 389.93625 2874.4304 384.40125 2868.8953 C 378.86624 2863.3604 378.86624 2854.3862 384.40125 2848.8513 C 389.93625 2843.3162 398.91025 2843.3162 404.44525 2848.8513" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/></g><line x1="394.42325" y1="2828.0466" x2="394.42325" y2="2844.2" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1"/><g id="id565_Graphic"><path d="M 414.46722 2715.4094 C 425.53726 2726.4795 425.53726 2744.4272 414.46722 2755.4973 C 403.39725 2766.5674 385.4493 2766.5674 374.37933 2755.4973 C 363.3093 2744.4272 363.3093 2726.4795 374.37933 2715.4094 C 385.4493 2704.3394 403.39725 2704.3394 414.46722 2715.4094" fill="red" fill-opacity=".5"/><path d="M 414.46722 2715.4094 C 425.53726 2726.4795 425.53726 2744.4272 414.46722 2755.4973 C 403.39725 2766.5674 385.4493 2766.5674 374.37933 2755.4973 C 363.3093 2744.4272 363.3093 2726.4795 374.37933 2715.4094 C 385.4493 2704.3394 403.39725 2704.3394 414.46722 2715.4094" stroke="black" stroke-linecap="round" stroke-linejoin="round" stroke-width="1" stroke-dasharray="8,5"/><text transform="translate(376.7461 2719.9534)" fill="black"><tspan font-family="Helvetica" font-size="26" font-weight="500" x="9.006262" y="25" textLength="17.341797">A</tspan></text></g><line x1="442.8926" y1="2681.3723" x2="422.98685" y2="2703.5828" marker-end="url(#FilledDiamond_Marker)" marker-start="url(#Ball_Marker)" stroke="red" stroke-linecap="round" stroke-linejoin="round" stroke-width="3" stroke-dasharray="1,4"/></g></g></svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/from-mq.rst Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,172 @@
+.. Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
+.. Logilab SA <contact@logilab.fr>
+
+-------------------------------------------
+From MQ To Evolve, The Refugee Book
+-------------------------------------------
+
+Cheat sheet
+-------------
+
+============================== ============================================
+mq command new equivalent
+============================== ============================================
+qseries ``log``
+qnew ``commit``
+qrefresh ``amend``
+qrefresh --exclude ``uncommit``
+qpop ``update`` or ``gdown``
+qpush ``update`` or ``gup`` sometimes ``evolve``
+qrm ``prune``
+qfold ``fold``
+qdiff ``odiff``
+qrecord ``record``
+
+qfinish --
+qimport --
+============================== ============================================
+
+
+Replacement details
+---------------------
+
+hg qseries
+```````````
+
+All your work in progress is now in real changesets all the time.
+
+You can use the standard log command to display them. You can use the
+phase revset to display unfinished work only, and use templates to have
+the same kind of compact that the output of qseries has.
+
+This will result in something like::
+
+ [alias]
+ wip = log -r 'not public()' --template='{rev}:{node|short} {desc|firstline}\n'
+
+hg qnew
+````````
+
+With evolve you handle standard changesets without an additional overlay.
+
+Standard changeset are created using hg commit as usual::
+
+ $ hg commit
+
+If you want to keep the "WIP is not pushed" behavior, you want to
+set your changeset in the secret phase using the phase command.
+
+Note that you only need it for the first commit you want to be secret. Later
+commits will inherit their parent's phase.
+
+If you always want your new commit to be in the secret phase, your should
+consider updating your configuration:
+
+ [phases]
+ new-commit=secret
+
+hg qref
+````````
+
+A new command from evolution will allow you to rewrite the changeset you are
+currently on. Just call:
+
+ $ hg amend
+
+This command takes the same options as commit, plus the switch '-e' (--edit)
+to edit the commit message in an editor.
+
+
+.. -c is very confusig
+..
+.. The amend command also has a -c switch which allows you to make an
+.. explicit amending commit before rewriting a changeset.::
+..
+.. $ hg record -m 'feature A'
+.. # oups, I forgot some stuff
+.. $ hg record babar.py
+.. $ hg amend -c .^ # .^ refer to "working directoy parent, here 'feature A'
+
+.. note: refresh is an alias for amend
+
+hg qref --exclude
+`````````````````````
+
+To remove changes from your current commit use::
+
+ $ hg uncommit not-ready.txt
+
+
+hg qpop
+`````````
+
+The following command emulates the behavior of hg qpop:
+
+ $ hg gdown
+
+If you need to go back to an arbitrary commit you can use:
+
+ $ hg update
+
+.. note:: gdown and update allow movement with working directory
+ changes applied, and gracefully merge them.
+
+hg qpush
+````````
+
+When you rewrite changesets, descendants of rewritten changesets are marked as
+"unstable". You need to rewrite them on top of the new version of their
+ancestor.
+
+The evolution extension adds a command to rewrite "unstable"
+changesets:::
+
+ $ hg evolve
+
+You can also decide to do it manually using::
+
+ $ hg graft -O <old-version>
+
+or::
+
+ $ hg rebase -r <revset for old version> -d .
+
+note: using graft allows you to pick the changeset you want next as the --move
+option of qpush do.
+
+
+hg qrm
+```````
+
+evolution introduce a new command to mark a changeset as "not wanted anymore".::
+
+ $ hg prune <revset>
+
+hg qfold
+`````````
+
+
+::
+
+ $ hg fold first::last
+
+hg qdiff
+`````````
+
+``pdiff`` is an alias for `hg diff -r .^` It works like qdiff, but outside MQ.
+
+
+
+hg qfinish and hg qimport
+````````````````````````````
+
+These are not necessary anymore. If you want to control the
+mutability of changesets, see the phase feature.
+
+
+
+hg qcommit
+```````````````
+
+If you really need to send patches through versioned mq patches, you should
+look at the qsync extension.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/index.rst Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,166 @@
+.. Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
+.. Logilab SA <contact@logilab.fr>
+
+========================================
+Changeset Evolution Experimentation
+========================================
+
+
+This is the online documentation of the `evolve extension`_. An experimental
+extension that drive the implementation of the `changeset evolution concept`_ for
+Mercurial.
+
+.. _`evolve extension`: http://mercurial.selenic.com/wiki/EvolveExtension
+.. _`changeset evolution concept`: http://mercurial.selenic.com/wiki/ChangesetEvolution
+
+Here are various materials on planned improvement to Mercurial regarding
+rewriting history.
+
+First, read about what challenges arise while rewriting history and how we plan to
+solve them once and for all.
+
+.. toctree::
+ :maxdepth: 2
+
+ instability
+
+The effort is split in two parts:
+
+ * The **obsolescence marker** concept aims to provide an alternative to ``strip``
+ to get rid of changesets. This concept has been partially implemented since
+ Mercurial 2.3.
+
+ * The **evolve** Mercurial extension rewrites history using obsolete
+ *marker* under the hood.
+
+The first and most important step is by far the **obsolescence marker**. However
+most users will never be directly exposed to the concept. For this reason
+this manual starts with changeset evolution.
+
+Evolve: A robust alternative to MQ
+====================================
+
+Evolve is an experimental history rewriting extension that uses obsolete
+markers. It is inspired by MQ and pbranch but has multiple advantages over
+them:
+
+* Focus on your current work.
+
+ You can focus your work on a single changeset and take care of adapting
+ descendent changesets later.
+
+* Handle **non-linear history with branches and merges**
+
+* Rely internally on Mercurial's **robust merge** mechanism.
+
+ Simple conflicts are handled by real merge tools using the appropriate ancestor.
+ Conflicts are much rarer and much more user friendly.
+
+* Mutable history **fully available all the time**.
+
+ Always use 'hg update' and forget about (un)applying patches to access the
+ mutable part of your history.
+
+
+* Use only **plain changesets** and forget about patches. Evolve will create and
+ exchange real changesets. Mutable history can be used in all usual operations:
+ pull, push, log, diff, etc.
+
+* Allow **sharing and collaboration** mutable history without fear of duplicates
+ (thanks to obsolete marker).
+
+* Cover all MQ usage but guard.
+
+.. warning:: The evolve extension and obsolete markers are at an experimental
+ stage. While using obsolete you willl likely be exposed to complex
+ implications of the **obsolete marker** concept. I do not recommend
+ non-power users to test this at this stage.
+
+ While numbered 1.0.0, the command line API of this version should
+ **not** be regarded as *stable*: command behavior, name and
+ options may change in future releases or once integrated into
+ Mercurial. It is still an immature extension; a lot of
+ features are still missing but there is low risk of
+ repository corruption.
+
+ Production-ready version should hide such details from normal users.
+
+The evolve extension requires Mercurial 2.5 (older versions supports down to 2.2)
+
+To enable the evolve extension use::
+
+ $ hg clone https://bitbucket.org/marmoute/mutable-history -u stable
+ $ echo '[extensions]\nevolve=$PWD/mutable-history/hgext/evolve.py' >> ~/.hgrc
+
+You will probably want to use hgview_ to visualize obsolescence. Version 1.7.1
+or later is required.
+
+.. _hgview: http://www.logilab.org/project/hgview/
+
+
+ ---
+
+For more information see the documents below:
+
+.. toctree::
+ :maxdepth: 1
+
+ tutorials/tutorial
+ evolve-good-practice
+ evolve-faq
+ from-mq
+ evolve-collaboration
+ qsync
+
+Smart changeset deletion: Obsolete Marker
+==========================================
+
+The obsolete marker is a powerful concept that allows Mercurial to safely handle
+history rewriting operations. It is a new type of relation between Mercurial
+changesets that tracks the result of history rewriting operations.
+
+This concept is simple to define and provides a very solid base for:
+
+- very fast history rewriting operations
+
+- auditable and reversible history rewriting process
+
+- clean final history
+
+- share and collaborate on mutable parts of the history
+
+- gracefully handle history rewriting conflicts
+
+- allow various history rewriting UI to collaborate with a underlying common API
+
+ ---
+
+For more information, see the documents below
+
+.. toctree::
+ :maxdepth: 1
+
+ obs-concept
+ obs-terms
+ obs-implementation
+
+
+Known limitations and bugs
+=================================
+
+Here is a list of known issues that will be fixed later:
+
+
+* You need to provide to `graft --continue -O` if you started you
+ graft using `-O`.
+
+ you to manually specify target all the time.
+
+* Trying to exchange obsolete marker with a static http repo will crash.
+
+* Extinct changesets are hidden using the *hidden* feature of mercurial only
+ supported by a few commands.
+
+ Only ``hg log``, ``hgview`` and `hg glog` support it. Neither ``hg heads`` nor other visual viewers do.
+
+* hg heads shows extinct changesets.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/instability.rst Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,222 @@
+.. Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
+.. Logilab SA <contact@logilab.fr>
+
+-----------------------------------
+The instability Principle
+-----------------------------------
+
+
+
+An intrinsic contradiction
+-----------------------------------
+
+XXX starts by talking about getting ride of changeset.
+
+DVCSes bring two new major concepts to the version control scene:
+
+ * History is organized as a robust DAG,
+ * History can be rewritten.
+
+However, the two concepts are in contradiction:
+
+To achieve a robust history, three key elements are gathered in *changesets*:
+
+ * Full snapshot of the versioned content,
+ * Reference to the previous full snapshot used to build the new one,
+ * A description of the change which leads from the old content to the new content.
+
+All three elements are used to compute a *unique* hash that identifies the changeset
+(with various other metadata). This identification is a key part of DVCS design.
+
+This is a very useful property because changing B's parent means
+changing B's content too. This requires the creation of **another**
+changeset, which is semantically good.
+
+.. figure:: ./figures/edit-is-rewrite-step2.svg
+
+
+To avoid duplication, the older changeset is usually discarded from accessible
+history. I'm calling them *obsolete* changesets.
+
+
+But rewriting a changeset with children does not change the
+children's parents! And because children of the rewritten changeset
+still **depend** on the older "dead" version of the changeset, we
+cannot get rid of this dead version.
+
+::
+
+ Schema base, A and A' and B.
+
+I'm calling these children **unstable** because they are based on a
+dead changeset and prevent people from getting rid of it.
+
+This instability is an **unavoidable consequence** of the strict dependency of
+changesets. Rewriting history always needs to take it into account and
+provide a way to rewrite the descendants of the new changeset to avoid
+coexistence of the old and new versions of a rewritten changeset.
+
+
+Everybody is working around the issue
+------------------------------------------------
+
+I'm not claiming that rewriting history is impossible. People have been successfully
+doing it for years. However they all need to work around *instability*. Several
+workaround strategies exist.
+
+
+Rewriting all at once
+``````````````````````````
+
+The simplest way to avoid instability is to ensure rewriting
+operations always end in a stable situation. This is achieved by
+rewriting all affected changesets at the same time.
+
+Rewriting all descendants at the same time when rewriting a changeset.
+
+::
+
+ Schema!
+
+Several Mercurial commands apply it: rebase, collapse, histedit.
+Mercurial also refuses to amend changesets with descendants. The git
+branch design enforces this approach in git too.
+
+
+However, DVCS are **distributed**. This means that you do not control what
+happens outside your repository. Once a changeset has been exchanged *outside*,
+there is no way to be sure it does not have descendants somewhere else.
+Therefore **if you rewrite changeset that exists elsewhere, you can't eradicate
+the risk of instability.**
+
+Do not rewrite exchanged changesets
+```````````````````````````````````
+
+To work around the issue above, Mercurial introduced phases, which
+prevent you from rewriting shared changesets and ensure others can't
+pull certain changesets from you. But this is a very frustrating
+limitation that prevents you to efficiently sharing, reviewing and
+collaborating on mutable changesets.
+
+In the Git world, they use another approach to prevent instability. By
+convention only a single developer works on a changeset contained in
+a named branch. But once again this is a huge blocker for
+collaborating. Moreover clueless people **will** mess up social
+convention soon or later.
+
+
+Lose the DAG robustness
+````````````````````````````
+
+The other approach in Mercurial is to keep the mutable part of the
+history outside the DVCS constraint. This is the MQ approach of
+sticking a quilt queue over Mercurial.
+
+This allow much more flexible workflow but two major feature are lost in the
+process:
+
+:graceful merge: MQ uses plain patch to store changeset contents, which has
+ problems in changing context. Applying your queue
+ becomes very painful when context changes.
+
+:easy branching: A quilt queue is by definition a linear queue, increasing risk
+ of conflict.
+
+It is possible to collaborate over versioned MQ! But you are going to
+have a lot of trouble.
+
+Ignore conflicts
+```````````````````````````````````
+
+Another ignored issue is a conflicting rewrite of the same changeset.
+If a changeset is rewritten two times we have two newer versions,
+and duplicated history is complicated to merge.
+
+Mercurial work around by
+
+The "One set of mutable changset == One developer" mantra is also a way to work
+around conflicting rewriting of changeset. If two different people are able to
+
+The git branch model allows overwriting changeset version by another
+one, but it does not care about divergent version. It is the equivalent
+of "common ftp" source management for changesets.
+
+Facing The Danger Once And For All
+------------------------------------------------
+
+Above we saw that the more effort you put to avoid instability, the more options
+you deny. And even the most restrictive workflow can't guarantee that instability
+will never show up!
+
+Obsolete marker can handle the job
+```````````````````````````````````
+
+It is time to provide a full-featured solution to deal with
+instability and to stop working around the issue! This is why I
+am developing a new feature for Mercurial called "Obsolete markers".
+Obsolete markers have two key properties:
+
+
+* Any "old" changeset we want to get rid of is **explicitly** marked
+ as "obsolete" by history rewriting operations.
+
+ By explicitly marking the obsolete part of the history, we will be able to
+ easily detect instability situation.
+
+* Relations between old and new version of changesets are tracked by obsolete
+ markers.
+
+ By storing a meta-history of changeset evolution we are able to easily resolve
+ instability and edit conflicts [#]_ .
+
+.. [#] Edit conflicts is another major obstable to collaboration. See the
+ section dedicated to obsolete marker for details.
+
+Improved robustness == improved simplicity
+````````````````````````````````````````````````
+
+This proposal should **first** be seen as a safety measure.
+
+It allows detecting instability as soon as possible.
+
+::
+
+ $ hg pull
+ added 3 changeset
+ +2 unstable changeset
+ (do you want "hg evolve" ?)
+ working directory parent is obsolete!
+ $ hg push
+ outgoing unstable changesets
+ (use "hg evolve" or force the push)
+
+And it should not not encourage people to create instability.
+
+::
+
+ $ hg up 42
+ $ hg commit --amend
+ changeset have descendant.
+ $ hg commit --amend -f
+ +5 unstable changeset
+
+ $ hg rebase -D --rev 40::44
+ rebasing already obsolete changeset 42:AAA will conflict with newer version 48:BBB
+
+While allowing powerful feature
+````````````````````````````````````````````````
+
+
+* Help to automatically solve instability.
+
+* "prune" changeset remotely.
+
+* track resulting changeset when submitting patch//pull request.
+
+* Focus on what you do:
+
+ I do not like the "all at once" model of history rewriting. I'm comfortable
+ with instability and obsolete marker offer all the tool to safely create and
+ handle instability locally.
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/makefile Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,11 @@
+
+all: tutorials/tutorial.rst static/logo-evolve.ico
+ sphinx-build . ../html/
+
+tutorials/tutorial.rst: tutorials/tutorial.t
+ python test2rst.py tutorials/
+
+static/logo-evolve.ico: static/logo-evolve.svg
+ convert -resize 36x36 static/logo-evolve.svg static/logo-evolve.ico
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/obs-concept.rst Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,390 @@
+.. Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
+.. Logilab SA <contact@logilab.fr>
+
+-----------------------------------------------------------
+Why Do We Need a New Concept
+-----------------------------------------------------------
+
+Current DVCSes are great tools for forging a series of flawless
+changesets on your own. But they perform poorly when it comes to
+**sharing** some work in progress and **collaborating** on such work
+in progress.
+
+When people forge a new version of a changeset they actually create a
+new changeset and get rid of the original changeset. Difficulties to
+collaborate mostly came from the way old content is *removed* from
+a repository.
+
+Mercurial Approach: Strip
+-----------------------------------------------------
+
+With the current version of mercurial, every changeset that exists in
+your repository is *visible* and *meaningful*. To delete old
+(rewritten) changesets, mercurial removes them from the repository
+storage with an operation called *strip*. After the *stripping*, the
+repository looks as if the changeset never existed.
+
+This approach is simple and effective except for one big
+drawback: you can remove changesets from **your repository only**. If
+a stripped changeset exists in another repository it touches, it will
+show up again. This is because a shared changeset becomes
+part of a shared global history. Stripping a changeset from all
+repositories is at best impractical and in most case impossible.
+
+As consequence, **you can not rewrite something once you exchange it with
+others**. The old version will still exist along side the new one [#]_.
+
+Moreover stripping changesets creates backup bundles. This allows
+restoration of the deleted changesets, but the process is painful.
+
+Finally, as the repository format is not optimized for deletion. stripping a
+changeset may be slow in some situations.
+
+To sum up, the strip approach is very simple but does not handle
+interaction with the outer world, which is very unfortunate for a
+*Distributed* VCS.
+
+.. [#] various work around exists but they require their own workflows
+ which are distinct from the very elegant basic workflow of
+ Mercurial.
+
+Git Approach: Overwrite Reference
+-----------------------------------------------------
+
+The Git approach to repository structure is a bit more complex: there
+can be any amount of unrelated changesets in a repository, and **only
+changesets referenced by a git branch** are *visible* and
+*meaningful*.
+
+
+.. figure:: ./figures/git.*
+
+
+This simplifies the process of getting rid of old changesets. You can
+just leave them in place and move the reference on the new one. You
+can then propagate this change by moving the git-branch on remote host
+with the newer version of the marker overwriting the older one.
+
+This approach goes a bit further but still has a major drawback:
+
+Because you **overwrite** the git-branch, you have no conflict
+resolution. The last to act wins. This makes collaboration on multiple
+changesets difficult because you can't merge concurrent updates on a
+changeset.
+
+Every overwrite is a forced operation where the operator says, "yes I
+want this to replace that". In highly distributed environments, a user
+may end up with conflicting references and no proper way to choose.
+
+Because of this way to visualize a repository, git-branches are a core
+part of git, which makes the user interface more complicated and
+constrains moving through history.
+
+Finally, even if all older changesets still exist in the repository,
+accesing them is still painful.
+
+
+-----------------------------------------------------
+The Obsolete Marker Concept
+-----------------------------------------------------
+
+
+As none of the concepts was powerful enough to fulfill the need of
+safely rewriting history, including easy sharing and collaboration on
+mutable history, we needed another one.
+
+Basic concept
+-----------------------------------------------------
+
+
+Every history rewriting operation stores the information that old rewritten
+changeset is replaced by newer version in a given set of changesets.
+
+All basic history rewriting operation can create an appropriate obsolete marker.
+
+
+.. figure:: ./figures/example-1-update.*
+
+ *Updating* a changeset
+
+ Create one obsolete marker: ``([A'] obsolete A)``
+
+
+
+.. figure:: ./figures/example-2-split.*
+
+ *Splitting* a changeset in multiple one
+
+ Create one obsolete marker ``([B1, B2] obsolete B)]``
+
+
+.. figure:: ./figures/simple-3-merge.*
+
+ *Merging* multiple changeset in a single one
+
+ Create two obsolete markers ``([C] obsolete A), ([C] obsolete B)``
+
+.. figure:: ./figures/simple-4-reorder.*
+
+ *Moving* changeset around
+
+ Reordering those two changesets need two obsolete markers:
+ ``([A'] obsolete A), ([B'] obsolete B)``
+
+
+
+.. figure:: ./figures/simple-5-delete.*
+
+ *Removing* a changeset:
+
+ One obselete marker ``([] obsolete B)``
+
+
+To conclude, a single obsolete marker express a relation from **0..n** new
+changesets to **1** old changeset.
+
+Basic Usage
+-----------------------------------------------------
+
+Obsolete markers create a perpendicular history: **a versioned
+changeset graph**. This means that offers the same features we have
+for versioned files but applied to changeset:
+
+First: we can display a **coherent view** of the history graph in which only a
+single version of your changesets is displayed by the UI.
+
+Second, because obsolete changeset content is still **available**. You can
+you can
+
+ * **browse** the content of your obsolete commits,
+
+ * **compare** newer and older versions of a changeset,
+
+ * **restore** content of previously obsolete changesets.
+
+Finally, the obsolete marker can be **exchanged between
+repositories**. You are able to share the result on your history
+rewriting operations with other prople and **collaborate on the
+mutable part of the history**.
+
+Conflicting history rewriting operation can be detected and
+**resolved** as easily as conflicting changes on a file.
+
+
+Detecting and solving tricky situations
+-----------------------------------------------------
+
+History rewriting can lead to complex situations. The obsolete marker
+introduces a simple representation for this complex reality. But
+people using complex workflows will one day or another have to face
+the intrinsic complexity of some real-world situation.
+
+This section describes possible situations, defines precise sets of
+changesets involved in such situations and explains how the error
+cases can be resolved automatically using the available information.
+
+
+Obsolete changesets
+````````````````````
+
+Old changesets left behind by obsolete operation are called **obsolete**.
+
+With the current version of mercurial, this *obsolete* part is stripped from the
+repository before the end of every rewriting operation.
+
+.. figure:: ./figures/error-obsolete.*
+
+ Rebasing `B` and `C` on `A` (as `B'`, `C'`)
+
+ This rebase operation added two obsolete markers from new
+ changesets to old changesets. These two old changesets are now
+ part of the *obsolete* part of the history.
+
+In most cases, the obsolete set will be fully hidden to both the UI and
+discovery, hence users do not have to care about them unless they want to
+audit history rewriting operations.
+
+Unstable changesets
+```````````````````
+
+While exploring the possibilities of the obsolete marker a bit
+further, you may end up with *obsolete* changesets which have
+*non-obsolete* children. There is two common ways to achieve this:
+
+* Pull a changeset based of an old version of a changeset [#]_.
+
+* Use a partial rewriting operation. For example amend on a changeset with
+ children.
+
+*Non-obsolete* changeset based on *obsolete* one are called **unstable**
+
+.. figure:: ./figures/error-unstable.*
+
+ Amend `A` into `A'` leaving `B` behind.
+
+ In this situation we cannot consider `B` as *obsolete*. But we
+ have all the necessary data to detect `B` as an *unstable* branch
+ of the history because its parent `A` is *obsolete*. In addition,
+ we have enough data to automatically resolve this instability: we
+ know that the new version of `B` parent (`A`) is `A'`. We can
+ deduce that we should rebase `B` on `A'` to get a stable history
+ again.
+
+Proper warnings should be issued when part of the history becomes
+unstable. The UI will be able to use the obsolete marker to
+automatically suggest a resolution to the user of even carry them out
+for them.
+
+
+XXX details on automatic resolution for
+
+* movement
+
+* handling deletion
+
+* handling split on multiple head
+
+
+.. [#] For this to happen one needs to explicitly enable exchange of draft
+ changesets. See phase help for details.
+
+The two parts of the obsolete set
+``````````````````````````````````````
+
+The previous section shows that there could be two kinds of *obsolete*
+changesets:
+
+* an *obsolete* changeset with no or *obsolete* only descendants is called **extinct**.
+
+* an *obsolete* changeset with *unstable* descendants is called **suspended**.
+
+
+.. figure:: ./figures/error-extinct.*
+
+ Amend `A` and `C` leaving `B` behind.
+
+ In this example we have two *obsolete* changesets: `C` with no *unstable*
+ children is *extinct*. `A` with *unstable* descendant (`B`) is *suspended*.
+ `B` is *unstable* as before.
+
+
+Because nothing outside the obsolete set default on *extinct*
+changesets, they can be safely hidden in the UI and even garbage
+collected. *Suspended* changesets have to stay visible and available
+until their unstable descendant are rewritten into stable version.
+
+
+Conflicting rewrites
+````````````````````
+
+If people start to concurrently edit the same part of the history they will
+likely meet conflicting situations when a changeset has been rewritten in two
+different ways.
+
+
+.. figure:: ./figures/error-conflicting.*
+
+ Conflicting rewrite of `A` into `A'` and `A''`
+
+This kind of conflict is easy to detect with an obsolete marker
+because an obsolete changeset can have more than one new version. It
+may be seen as the multiple heads case. Mercurial warns you about this
+on pull. It is resolved the same way by a merge of A' and A'' that
+will keep the same parent than `A'` and `A''` with two obsolete
+markers pointing to both `A` and `A'`
+
+.. figure:: ./figures/explain-troubles-concurrent-10-solution.*
+
+Allowing multiple new changesets to obsolete a single one allows to
+distinguish a split changeset from a history rewriting conflict.
+
+Reliable history
+``````````````````````
+
+Obsolete markers help to smooth rewriting operation process. However
+they do not change the fact that **you should only rewrite the mutable
+part of the history**. The phase concept enforces this rule by
+explicitly defining a public immutable set of changesets. Rewriting
+operations refuse to work on public changesets, but there are still
+some corner cases where previously rewritten changesets are made
+public.
+
+Special rules apply for obsolete markers pointing to public changesets:
+
+* Public changesets are excluded from the obsolete set (public
+ changesets are never hidden or candidate to garbage collection)
+
+* *newer* version of a public changeset are called **bumped** and
+ highlighted as an error case.
+
+.. figure:: ./figures/explain-troubles-concurrent-10-sumup.*
+
+Solving such an error is easy. Because we know what changeset a
+*bumped* tries to rewrite, we can easily compute a smaller
+changeset containing only the change from the old *public* to the new
+*bumped*.
+
+.. figure:: ./figures/explain-troubles-concurrent-15-solution.*
+
+
+Conclusion
+----------------
+
+The obsolete marker is a powerful concept that allows mercurial to safely handle
+history rewriting operations. It is a new type of relation between Mercurial
+changesets which tracks the result of history rewriting operations.
+
+This concept is simple to define and provides a very solid base for:
+
+
+- Very fast history rewriting operations,
+
+- auditable and reversible history rewriting process,
+
+- clean final history,
+
+- sharing and collaborating on the mutable part of the history,
+
+- gracefully handling history rewriting conflicts,
+
+- various history rewriting UI's collaborating with an underlying common API.
+
+.. list-table:: Comparison on solution [#]_
+ :header-rows: 1
+
+ * - Solution
+ - Remove changeset locally
+ - Works on any point of your history
+ - Propagation
+ - Collaboration
+ - Speed
+ - Access to older version
+
+ * - Strip
+ - `+`
+ - `+`
+ - \
+ - \
+ - \
+ - `- -`
+
+ * - Reference
+ - `+`
+ - \
+ - `+`
+ - \
+ - `+`
+ - `-`
+
+ * - Obsolete
+ - `+`
+ - `+`
+ - `++`
+ - `++`
+ - `+`
+ - `+`
+
+
+
+.. [#] To preserve good tradition in comparison table, an overwhelming advantage
+ goes to the defended solution.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/obs-implementation.rst Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,106 @@
+.. Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
+.. Logilab SA <contact@logilab.fr>
+
+-----------------------------------------------------
+Implementation of Obsolete Marker
+-----------------------------------------------------
+.. warning:: This document is still in heavy work in progress
+
+Main questions about Obsolete Marker Implementation
+-----------------------------------------------------
+
+
+
+
+How shall we exchange Marker over the Wire ?
+`````````````````````````````````````````````````````````
+
+We can have a lot of markers. We do not want to exchange data for the one we
+already know. Listkey() is not very appropriate there as you get everything.
+
+Moreover, we might want to only hear about Marker that impact changeset we are
+pulling.
+
+pushkey is not batchable yet (could be fixed)
+
+A dedicated discovery and exchange protocol seems mandatory here.
+
+
+Various technical details
+-----------------------------------------------------
+
+Some stuff that worse to note. some may deserve their own section later.
+
+storing old changeset
+``````````````````````
+
+The new general delta format allows a very efficient storage of two very similar
+changesets. Storing obsolete children using general delta takes no more place
+than storing the obsolete diff. Reverted file will even we reused. The whole
+operation will take much less space the strip backup.
+
+
+Abstraction from history rewriting UI
+```````````````````````````````````````````
+
+How Mercurial handles obsolete marker is independent from what decides
+to create them and what actual operation solves the error case. Any of
+the existing history rewriting UI (rebase, mq, histedit) can lay
+obsolete markers and resolve situation created by others. To go
+further, a hook system of obsolete marker creation would allow each
+mechanism to collaborate with other though a standard and central
+mechanism.
+
+
+Obsolete marker storage
+```````````````````````````
+
+The Obsolete marker will most likely be stored outside standard
+history. They are multiple reasons for this:
+
+First, obsolete markers are really perpendicular to standard history
+there is no strong reason to include it here other than convenience.
+
+Second, storing obsolete marker inside standard history means:
+
+* A changeset must be created every time an obsolete relation is added. Very
+ inconvenient for delete operation.
+
+* Obsolete marker must be forged at the creation of the new changeset. This
+ is very inconvenient for split operation. And in general it becomes
+ complicated to fix history afterward in particular when working with older
+ clients.
+
+Storing obsolete marker outside history have several pros:
+
+* It eases Exchange of obsolete markers without unnecessary obsolete
+ changeset contents.
+
+* It allows tuning the actual storage and protocol exchange while maintaining
+ compatibility with older clients through the wire (as we do the repository
+ format).
+
+* It eases the exchange of obsolete related information during
+ discovery to exchange obsolete changeset relevant to conflict
+ resolution. Exchanging such information deserves a dedicated
+ protocol.
+
+Persistent
+```````````````````````
+
+*Extinct* changeset and obsolete marker will most likely be garbage collected as
+some point. However, archive server may decide to keep them forever in order to
+keep a fully auditable history in its finest conception.
+
+
+Current status
+-----------------------------------------------------
+
+Obsolete marker are partialy in core.
+
+2.3:
+
+- storage over obsolete marker
+- exchange suing pushkey
+- extinct changeset are properly hidden
+- extinct changeset are excluded from exchange
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/obs-terms.rst Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,237 @@
+.. Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
+.. Logilab SA <contact@logilab.fr>
+
+-----------------------------------------------------------
+Terminology of the obsolete concept
+-----------------------------------------------------------
+
+Obsolete markers
+---------------------------------
+
+The mutable concept is based on **obsolete markers**. Creating an obsolete
+marker registers a relation between an old obsoleted changeset and its newer
+version.
+
+Old changesets are called **precursors** while their new versions are called
+**successors**. A marker always registers a single *precursor* and:
+
+- no *successor*: the *precursor* is just discarded.
+- one *successor*: the *precursor* has been rewritten
+- multiple *successors*: the *precursor* were splits in multiple
+ changesets.
+
+.. The *precursors* and *successors* terms can be used on changeset directy:
+
+.. :precursors: of a changeset `A` are changesets used as *precursors* by
+.. obsolete marker using changeset `A` as *successors*
+
+.. :successors: of a changeset `B` are changesets used as *successors* by
+.. obsolete marker using changeset `B` as *precursors*
+
+Chaining obsolete markers is allowed to rewrite a changeset that is already a
+*successor*. This is a kind of *second order version control*.
+To clarify ambiguous situations one can use **direct precursors** or
+**direct successors** to name changesets that are directly related.
+
+The set of all *obsolete markers* forms a direct acyclic graph the same way
+standard *parents*/*children* relation does. In this graph we have:
+
+:any precursors: are transitive precursors of a changeset: *direct precursors*
+ and *precursors* of *precursors*.
+
+:any successors: are transitive successors of a changeset: *direct successors*
+ and *successors* of *successors*)
+
+Obsolete markers may refer changesets that are not known locally.
+So, *direct precursors* of a changeset may be unknown locally.
+This is why we usually focus on the **first known precursors** of the rewritten
+changeset. The same apply for *successors*.
+
+Changeset in *any successors* which are not **obsolete** are called
+**newest successors**..
+
+.. note:: I'm not very happy with this naming scheme and I'm looking for a
+ better distinction between *direct successors* and **any successors**.
+
+Possible changesets "type"
+---------------------------------
+
+The following table describes names and behaviors of changesets affected by
+obsolete markers. The left column describes generic categories and the right
+columns are about sub-categories.
+
+
++---------------------+--------------------------+-----------------------------+
+| **mutable** | **obsolete** | **extinct** |
+| | | |
+| Changeset in either | Obsolete changeset is | *extinct* changeset is |
+| *draft* or *secret* | *mutable* used as a | *obsolete* which has only |
+| phase. | *precursor*. | *obsolete* descendants. |
+| | | |
+| | A changeset is used as | They can safely be: |
+| | a *precursor* when at | |
+| | least one obsolete | - hidden in the UI, |
+| | marker refers to it | - silently excluded from |
+| | as precursors. | pull and push operations |
+| | | - mostly ignored |
+| | | - garbage collected |
+| | | |
+| | +-----------------------------+
+| | | |
+| | | **suspended** |
+| | | |
+| | | *suspended* changeset is |
+| | | *obsolete* with at least |
+| | | one non-obsolete descendant |
+| | | |
+| | | Thoses descendants prevent |
+| | | properties of extincts |
+| | | changesets to apply. But |
+| | | they will refuse to be |
+| | | pushed without --force. |
+| | | |
+| +--------------------------+-----------------------------+
+| | | |
+| | **troubled** | **unstable** |
+| | | |
+| | *troubled* has | *unstable* is a changeset |
+| | unresolved issue caused | with obsolete ancestors. |
+| | by *obsolete* relations. | |
+| | | |
+| | Possible issues are | It must be rebased on a |
+| | listed in the next | non *troubled* base to |
+| | column. It is possible | solve the problem. |
+| | for *troubled* | |
+| | changeset to combine | (possible alternative name: |
+| | multiple issue at once. | precarious) |
+| | (a.k.a. divergent and | |
+| | unstable) +-----------------------------+
+| | | |
+| | (possible alternative | **bumped** |
+| | names: unsettled, | |
+| | troublesome | *bumped* is a changeset |
+| | | that tries to be successor |
+| | | of public changesets. |
+| | | |
+| | | Public changeset can't |
+| | | be deleted and replace |
+| | | *bumped* |
+| | | need to be converted into |
+| | | an overlay to this public |
+| | | changeset. |
+| | | |
+| | | (possible alternative names:|
+| | | mislead, naive, unaware, |
+| | | mindless, disenchanting) |
+| | | |
+| | +-----------------------------+
+| | | **divergent** |
+| | | |
+| | | *divergent* is changeset |
+| | | that appears when multiple |
+| | | changesets are successors |
+| | | of the same precursor. |
+| | | |
+| | | *divergent* are solved |
+| | | through a three ways merge |
+| | | between the two |
+| | | *divergent* , |
+| | | using the last "obsolete- |
+| | | -common-ancestor" as the |
+| | | base. |
+| | | |
+| | | (*splitting* is |
+| | | properly not detected as a |
+| | | conflict) |
+| | | |
+| | | (possible alternative names:|
+| | | clashing, rival, concurent, |
+| | | conflicting) |
+| | | |
+| +--------------------------+-----------------------------+
+| | |
+| | Mutable changesets which are neither *obsolete* or |
+| | *troubled* are *"ok"*. |
+| | |
+| | Do we really need a name for it ? *"ok"* is a pretty |
+| | crappy name :-/ other possibilities are: |
+| | |
+| | - stable (confusing with stable branch) |
+| | - sane |
+| | - healthy |
+| | |
++---------------------+--------------------------------------------------------+
+| |
+| **immutable** |
+| |
+| Changesets in the *public* phases. |
+| |
+| Rewriting operation refuse to work on immutable changeset. |
+| |
+| Obsolete markers that refer an immutable changeset as precursors have |
+| no effect on the precussors but may have effect on the successors. |
+| |
+| When a *mutable* changeset becomes *immutable* (changing its phase from draft|
+| to public) it is just *immutable* and loose any property of it's former |
+| state. |
+| |
+| The phase properties says that public changesets stay as *immutable* forever.|
+| |
++------------------------------------------------------------------------------+
+
+
+
+Command and operation name
+---------------------------------
+
+
+Existing terms
+``````````````
+
+Mercurial core already uses the following terms:
+
+:amend: to rewrite a changeset
+:graft: to copy a changeset
+:rebase: to move a changeset
+
+
+Uncommit
+`````````````
+
+Remove files from a commit (and leave them as dirty in the working directory)
+
+The *evolve* extension have an `uncommit` command that aims to replace most
+`rollback` usage.
+
+Fold
+``````````
+
+Collapse multiple changesets into a unique one.
+
+The *evolve* extension will have a `fold` command.
+
+Prune
+``````````
+
+Make a changeset obsolete without successors.
+
+This an important operation as it should mostly replace *strip*.
+
+Alternative names:
+
+- kill: shall has funny effects when you forget "hg" in front of ``hg kill``.
+- obsolete: too vague, too long and too generic.
+
+evolve
+```````````````
+
+Automatically resolve *troublesome* changesets
+(*unstable*, *bumped* and *divergent*)
+
+This is an important name as hg pull/push will suggest it the same way it
+suggest merging when you add heads.
+
+alternative names:
+
+- solve (too generic ?)
+- stabilize
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/qsync.rst Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,19 @@
+.. Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
+.. Logilab SA <contact@logilab.fr>
+
+---------------------------------------------------------------------
+Qsync: Mercurial to MQ exporter
+---------------------------------------------------------------------
+
+
+People may have tools or co-workers that expect to receive mutable history using
+a versioned MQ repository.
+
+For this purpose you can use the ``qsync`` extension.
+
+
+To enable the evolve extension use::
+
+ $ hg clone http://hg-dev.octopoid.net/hgwebdir.cgi/mutable-history/
+ $ mutable-history/iqsync-enable.sh >> ~/.hgrc
+ $ hg help qsync
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/static/logo-evolve.svg Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,622 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ width="100"
+ height="100"
+ viewBox="0 0 124.766 126.74917"
+ id="Layer_1"
+ xml:space="preserve"
+ sodipodi:version="0.32"
+ inkscape:version="0.47 r22583"
+ sodipodi:docname="logo-evolve.svg"
+ inkscape:output_extension="org.inkscape.output.svg.inkscape"
+ style="display:inline"><metadata
+ id="metadata6845"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title><dc:creator><cc:Agent><dc:title>Cali Mastny and Matt Mackall</dc:title></cc:Agent></dc:creator><cc:license
+ rdf:resource="http://creativecommons.org/licenses/GPL/2.0/" /><dc:date>Feb 12 2008</dc:date></cc:Work><cc:License
+ rdf:about="http://creativecommons.org/licenses/GPL/2.0/"><cc:permits
+ rdf:resource="http://web.resource.org/cc/Reproduction" /><cc:permits
+ rdf:resource="http://web.resource.org/cc/Distribution" /><cc:requires
+ rdf:resource="http://web.resource.org/cc/Notice" /><cc:permits
+ rdf:resource="http://web.resource.org/cc/DerivativeWorks" /><cc:requires
+ rdf:resource="http://web.resource.org/cc/ShareAlike" /><cc:requires
+ rdf:resource="http://web.resource.org/cc/SourceCode" /></cc:License></rdf:RDF></metadata><sodipodi:namedview
+ inkscape:window-height="1165"
+ inkscape:window-width="1918"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0.0"
+ guidetolerance="10.0"
+ gridtolerance="10.0"
+ objecttolerance="10.0"
+ borderopacity="1.0"
+ bordercolor="#666666"
+ pagecolor="#ffffff"
+ id="base"
+ inkscape:zoom="5.4093668"
+ inkscape:cx="86.89449"
+ inkscape:cy="46.517129"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:current-layer="Layer_1"
+ width="100px"
+ height="120px"
+ units="px"
+ showgrid="false"
+ inkscape:window-maximized="0"><sodipodi:guide
+ position="0,0"
+ orientation="0,100"
+ id="guide3006" /><sodipodi:guide
+ position="100,0"
+ orientation="-120,0"
+ id="guide3008" /><sodipodi:guide
+ position="-14.419433,100.19657"
+ orientation="0,-100"
+ id="guide3010" /><sodipodi:guide
+ position="0,142.90028"
+ orientation="120,0"
+ id="guide3012" /></sodipodi:namedview><defs
+ id="defs261"><inkscape:perspective
+ sodipodi:type="inkscape:persp3d"
+ inkscape:vp_x="0 : 60 : 1"
+ inkscape:vp_y="0 : 1000 : 0"
+ inkscape:vp_z="100 : 60 : 1"
+ inkscape:persp3d-origin="50 : 40 : 1"
+ id="perspective146" /></defs>
+<pattern
+ overflow="visible"
+ viewBox="2.125 -70.896 69 69"
+ id="Polka_Dot_Pattern"
+ patternUnits="userSpaceOnUse"
+ height="69"
+ width="69"
+ y="736.415"
+ x="-316">
+ <g
+ id="g4">
+ <polygon
+ id="polygon6"
+ points="71.125,-1.896 2.125,-1.896 2.125,-70.896 71.125,-70.896 "
+ fill="none" />
+ <polygon
+ id="polygon8"
+ points="71.125,-1.896 2.125,-1.896 2.125,-70.896 71.125,-70.896 "
+ fill="#F7BC60" />
+ <g
+ id="g10">
+ <path
+ id="path12"
+ d="M61.772-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path14"
+ d="M54.105-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path16"
+ d="M46.439-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path18"
+ d="M38.772-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path20"
+ d="M31.105-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path22"
+ d="M23.439-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path24"
+ d="M15.772-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path26"
+ d="M8.105-71.653c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path28"
+ d="M0.439-71.653c0.018,0.072,0.008,0.127-0.026,0.19C0.361-71.362,0.3-71.4,0.248-71.335 c-0.051,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.07,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.038-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.051-0.12-0.064-0.187c-0.021-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.215,0.124-0.215,0.224c0.002,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ </g>
+ <g
+ id="g30">
+ <path
+ id="path32"
+ d="M69.439-71.653c0.018,0.072,0.008,0.127-0.026,0.19c-0.052,0.101-0.113,0.062-0.165,0.128 c-0.051,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.07,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.038-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.051-0.12-0.064-0.187c-0.021-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.215,0.124-0.215,0.224c0.002,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ </g>
+ <path
+ id="path34"
+ d="M0.495-71.653c0.018,0.072,0.008,0.127-0.026,0.19c-0.052,0.101-0.113,0.062-0.165,0.128 c-0.051,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.07,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.038-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.051-0.12-0.064-0.187c-0.021-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.215,0.124-0.215,0.224C0.5-71.68,0.503-71.744,0.51-71.626 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <g
+ id="g36">
+ <g
+ id="g38">
+ <path
+ id="path40"
+ d="M69.439-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path42"
+ d="M61.778-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path44"
+ d="M54.118-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path46"
+ d="M46.458-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path48"
+ d="M38.797-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path50"
+ d="M31.137-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path52"
+ d="M23.477-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path54"
+ d="M15.816-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path56"
+ d="M8.156-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path58"
+ d="M0.495-64.001c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143C2-61.45,2.217-61.397,2.391-61.46c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ </g>
+ <g
+ id="g60">
+ <path
+ id="path62"
+ d="M69.439-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path64"
+ d="M61.778-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path66"
+ d="M54.118-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path68"
+ d="M46.458-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path70"
+ d="M38.797-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path72"
+ d="M31.137-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path74"
+ d="M23.477-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path76"
+ d="M15.816-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path78"
+ d="M8.156-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path80"
+ d="M0.495-56.348c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224C0.5-56.374,0.503-56.438,0.51-56.32 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ </g>
+ <g
+ id="g82">
+ <path
+ id="path84"
+ d="M69.439-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path86"
+ d="M61.778-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path88"
+ d="M54.118-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path90"
+ d="M46.458-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path92"
+ d="M38.797-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path94"
+ d="M31.137-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path96"
+ d="M23.477-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path98"
+ d="M15.816-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path100"
+ d="M8.156-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path102"
+ d="M0.495-48.695c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ </g>
+ <g
+ id="g104">
+ <path
+ id="path106"
+ d="M69.439-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path108"
+ d="M61.778-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path110"
+ d="M54.118-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path112"
+ d="M46.458-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path114"
+ d="M38.797-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path116"
+ d="M31.137-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path118"
+ d="M23.477-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path120"
+ d="M15.816-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path122"
+ d="M8.156-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 C8.15-41.004,8.149-41.02,8.14-41.04"
+ fill="#FFFFFF" />
+ <path
+ id="path124"
+ d="M0.495-41.042c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ </g>
+ <g
+ id="g126">
+ <path
+ id="path128"
+ d="M69.439-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path130"
+ d="M61.778-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path132"
+ d="M54.118-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path134"
+ d="M46.458-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path136"
+ d="M38.797-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path138"
+ d="M31.137-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path140"
+ d="M23.477-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path142"
+ d="M15.816-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path144"
+ d="M8.156-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path146"
+ d="M0.495-33.39c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224C0.5-33.416,0.503-33.48,0.51-33.362 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ </g>
+ <g
+ id="g148">
+ <path
+ id="path150"
+ d="M69.439-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path152"
+ d="M61.778-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path154"
+ d="M54.118-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path156"
+ d="M46.458-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path158"
+ d="M38.797-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path160"
+ d="M31.137-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path162"
+ d="M23.477-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path164"
+ d="M15.816-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path166"
+ d="M8.156-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path168"
+ d="M0.495-25.736c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ </g>
+ <g
+ id="g170">
+ <path
+ id="path172"
+ d="M69.439-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path174"
+ d="M61.778-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path176"
+ d="M54.118-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path178"
+ d="M46.458-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path180"
+ d="M38.797-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path182"
+ d="M31.137-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path184"
+ d="M23.477-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path186"
+ d="M15.816-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path188"
+ d="M8.156-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path190"
+ d="M0.495-18.084c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224C0.5-18.11,0.503-18.175,0.51-18.057 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ </g>
+ <g
+ id="g192">
+ <path
+ id="path194"
+ d="M69.439-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362C69-9.692,69.159-9.523,69.154-9.4c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path196"
+ d="M61.778-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path198"
+ d="M54.118-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path200"
+ d="M46.458-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path202"
+ d="M38.797-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path204"
+ d="M31.137-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path206"
+ d="M23.477-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path208"
+ d="M15.816-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.009,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 c0.177,0.042,0.384-0.104,0.543-0.143c0.18-0.043,0.397,0.01,0.571-0.053C17.933-7.969,17.839-8.227,18-8.34 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path210"
+ d="M8.156-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 C7.915-10.05,7.866-9.836,7.886-9.75C7.717-9.692,7.876-9.523,7.871-9.4C7.868-9.351,7.83-9.295,7.826-9.239 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C9.114-7.652,9.321-7.799,9.48-7.837c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path212"
+ d="M0.495-10.431c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 C0.254-10.05,0.205-9.836,0.225-9.75C0.056-9.692,0.215-9.523,0.21-9.4c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37C0.33-8.671,0.501-8.456,0.668-8.325c0.19,0.148,0.365,0.572,0.608,0.631 C1.454-7.652,1.66-7.799,1.819-7.837C2-7.88,2.217-7.827,2.391-7.89c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46C3.477-8.933,3.471-8.995,3.5-9.071 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ </g>
+ </g>
+ <g
+ id="g214">
+ <path
+ id="path216"
+ d="M69.439-2.778c0.018,0.072,0.008,0.127-0.026,0.19C69.361-2.487,69.3-2.525,69.248-2.46 c-0.051,0.062-0.099,0.276-0.079,0.362C69-2.04,69.159-1.871,69.154-1.748c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C70.397,0,70.604-0.146,70.763-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.07,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.038-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.051-0.12-0.064-0.187c-0.021-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.215,0.124-0.215,0.224c0.002,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path218"
+ d="M61.778-2.778c0.018,0.072,0.007,0.127-0.026,0.19C61.7-2.487,61.64-2.525,61.587-2.46 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C62.737,0,62.943-0.146,63.103-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224C61.915-3.117,61.78-3.02,61.781-2.92c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path220"
+ d="M54.118-2.778c0.018,0.072,0.007,0.127-0.026,0.19C54.04-2.487,53.98-2.525,53.927-2.46 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C55.077,0,55.283-0.146,55.442-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224C54.255-3.117,54.12-3.02,54.121-2.92c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path222"
+ d="M46.458-2.778c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C47.416,0,47.623-0.146,47.782-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224C46.594-3.117,46.459-3.02,46.46-2.92c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path224"
+ d="M38.797-2.778c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C39.756,0,39.962-0.146,40.122-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224C38.934-3.117,38.799-3.02,38.8-2.92c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path226"
+ d="M31.137-2.778c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C32.095,0,32.302-0.146,32.461-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224C31.273-3.117,31.139-3.02,31.14-2.92c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path228"
+ d="M23.477-2.778c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C24.435,0,24.642-0.146,24.801-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 c-0.021,0.011-0.021-0.005-0.03-0.025"
+ fill="#FFFFFF" />
+ <path
+ id="path230"
+ d="M15.816-2.778c0.018,0.072,0.007,0.127-0.026,0.19c-0.053,0.101-0.112,0.062-0.165,0.128 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C16.774,0,16.981-0.146,17.14-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789c-0.18,0.034-0.287,0.126-0.442,0.207 c-0.17,0.088-0.139,0.166-0.318,0.224c-0.081,0.026-0.216,0.124-0.215,0.224c0.001,0.115,0.005,0.051,0.012,0.169 C15.81-2.74,15.809-2.756,15.8-2.776"
+ fill="#FFFFFF" />
+ <path
+ id="path232"
+ d="M8.156-2.778c0.018,0.072,0.007,0.127-0.026,0.19C8.077-2.487,8.018-2.525,7.965-2.46 c-0.05,0.062-0.099,0.276-0.079,0.362c-0.169,0.058-0.01,0.227-0.015,0.35C7.868-1.698,7.83-1.643,7.826-1.587 c-0.01,0.119,0.017,0.266,0.068,0.37c0.097,0.198,0.268,0.413,0.435,0.544c0.19,0.148,0.365,0.572,0.608,0.631 C9.114,0,9.321-0.146,9.48-0.185c0.18-0.043,0.397,0.01,0.571-0.053c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.069,0.339-0.263,0.376-0.46c0.016-0.082,0.01-0.145,0.039-0.221 c0.039-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.052-0.12-0.064-0.187c-0.022-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789C8.954-3.54,8.847-3.448,8.692-3.367 c-0.17,0.088-0.139,0.166-0.318,0.224C8.292-3.117,8.158-3.02,8.159-2.92C8.16-2.805,8.164-2.869,8.17-2.751 C8.15-2.74,8.149-2.756,8.14-2.776"
+ fill="#FFFFFF" />
+ <path
+ id="path234"
+ d="M0.495-2.778c0.018,0.072,0.008,0.127-0.026,0.19C0.417-2.487,0.356-2.525,0.304-2.46 C0.253-2.397,0.205-2.184,0.225-2.098C0.056-2.04,0.215-1.871,0.21-1.748c-0.002,0.05-0.041,0.105-0.045,0.161 c-0.01,0.119,0.017,0.266,0.068,0.37C0.33-1.019,0.501-0.804,0.668-0.673c0.19,0.148,0.365,0.572,0.608,0.631 C1.454,0,1.66-0.146,1.819-0.185C2-0.228,2.217-0.175,2.391-0.237c0.222-0.079,0.127-0.337,0.288-0.45 c0.104-0.074,0.287-0.01,0.406-0.051c0.2-0.07,0.339-0.263,0.376-0.46C3.477-1.28,3.471-1.343,3.5-1.419 c0.038-0.103,0.111-0.16,0.09-0.293c-0.01-0.062-0.051-0.12-0.064-0.187c-0.021-0.114,0.002-0.224,0-0.337 c-0.003-0.2,0.017-0.379-0.078-0.55c-0.38-0.688-1.236-0.929-1.975-0.789C1.293-3.54,1.187-3.448,1.031-3.367 c-0.17,0.088-0.139,0.166-0.318,0.224C0.632-3.117,0.498-3.02,0.498-2.92C0.5-2.805,0.503-2.869,0.51-2.751 C0.489-2.74,0.488-2.756,0.479-2.776"
+ fill="#FFFFFF" />
+ </g>
+ </g>
+</pattern>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<rect
+ style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:1.83134139;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ id="rect6847"
+ width="126.74917"
+ height="126.99831"
+ x="-0.99158502"
+ y="-0.24915084" /><g
+ id="g2996"
+ transform="matrix(0.46679402,-0.88436607,0.88436607,0.46679402,-20.509268,97.149298)"><path
+ d="M 107.61309,85.427163 C 126.35316,54.267748 103.65523,3.7316784 62.152514,8.8657974 24.653999,13.501508 24.049791,52.97069 57.097677,62.347028 c 28.598853,8.121324 5.908299,26.261404 6.571301,38.341302 0.665797,12.07808 24.862369,16.46007 43.944112,-15.261167 z"
+ style="fill:#1b1a1b"
+ id="path2339" /><path
+ d="M 108.32072,84.162974 C 127.06181,53.003291 104.36388,2.4672218 62.861165,7.6013402 25.362652,12.23705 24.757687,51.707522 57.805574,61.083859 c 28.598853,8.121324 5.908299,26.261404 6.571569,38.342322 0.666551,12.076789 24.861834,16.458029 43.943577,-15.263207 z"
+ style="fill:#bfbfbf"
+ id="path2561" /><path
+ d="m 69.186033,104.19365 c -1.135692,-1.84204 0.601038,-3.88837 2.386188,-3.73277 2.841598,0.24886 9.028642,-0.0333 13.910588,-2.800482 C 97.6794,90.746293 116.44888,57.478025 107.00882,36.495137 102.78257,27.102283 100.72467,24.412915 96.372318,19.81831 c -0.887874,-0.937057 -0.378162,-0.886124 0.223066,-0.568957 2.353599,1.235189 6.489446,6.019569 10.731716,13.806724 7.16765,13.156791 6.79595,28.797842 4.13015,38.609442 -1.85691,6.825577 -8.25281,22.266533 -17.619587,28.942751 -9.387853,6.69156 -20.372606,10.52943 -24.65163,3.58538 z"
+ style="fill:#000000"
+ id="path2563" /><path
+ d="M 60.687485,61.019981 C 54.297665,59.123186 46.06011,56.4817 41.295423,50.249529 c -3.51248,-4.595193 -5.295582,-9.610385 -5.750944,-12.454176 -0.162003,-1.014713 -0.299617,-1.861261 -0.0075,-2.094878 0.135238,-0.108497 2.622869,5.514283 6.341685,10.226737 3.718069,4.713742 8.914807,7.470526 13.24405,8.472162 3.850608,0.890203 11.826899,2.846243 14.525556,5.145317 2.77437,2.363257 3.005946,7.469336 2.072352,8.045384 C 70.779125,68.169283 68.87,63.447817 60.687289,61.019981 z"
+ style="fill:#000000"
+ id="path2565" /><path
+ d="m 73.863069,105.09442 c -0.123332,1.46251 1.556525,1.74932 3.817708,1.41046 2.898288,-0.43471 5.349293,-0.76107 8.685191,-2.43293 4.521182,-2.2658 9.09685,-5.506989 12.447924,-9.879632 9.998228,-13.044622 13.538728,-28.478823 12.993498,-30.69907 -0.1822,1.833569 -2.59588,11.458073 -8.11589,20.134991 -7.089521,11.145311 -12.230531,17.081841 -24.087282,19.959951 -3.299704,0.80164 -5.579675,-0.41901 -5.741149,1.50623 z"
+ style="fill:#ffffff"
+ id="path2567" /><path
+ d="m 47.56572,54.369317 c 1.350435,1.145429 4.117343,2.671707 9.561614,4.457113 6.575462,2.155844 9.776981,4.025449 11.117744,4.921402 1.420732,0.951385 2.321212,3.074269 2.41017,1.188742 0.09277,-1.887616 -1.070702,-3.510729 -3.66667,-4.37155 -1.756347,-0.583153 -4.7109,-1.97194 -7.543128,-2.530905 -1.819913,-0.359233 -4.780811,-1.072155 -7.320051,-1.849642 -1.391646,-0.427711 -2.809634,-1.1769 -4.559679,-1.81516 z"
+ style="fill:#ffffff"
+ id="path2569" /><path
+ d="M 105.72614,63.921199 C 113.7054,40.922252 97.007933,6.1896881 63.228641,10.367773 32.706856,14.141463 32.214677,46.266552 59.113519,53.899069 89.582156,58.51118 71.235202,81.495802 68.632602,93.086552 66.299323,103.47658 93.255777,105.18656 105.72614,63.921199 z"
+ style="fill:#999999"
+ id="path2561_1_" /><path
+ d="m 84.848561,81.885586 c -8.254188,-1.021445 -20.13245,17.614405 -8.932534,15.431899 11.198141,-2.180945 -11.199916,2.182506 0,0 5.383182,-0.798314 9.842872,-2.698914 13.835192,-7.255788 5.205477,-5.940314 12.981581,-18.771954 15.230561,-27.062759 1.89451,-6.990334 0.94225,-17.820653 -1.01071,-7.64474 -2.00298,10.4432 -10.868321,27.552835 -19.122509,26.531388 z"
+ style="fill:#f3f3f3"
+ id="path2571" /></g>
+<text
+ xml:space="preserve"
+ style="font-size:35.48976898px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#000000;fill-opacity:1;stroke:none;font-family:Balker;-inkscape-font-specification:Balker"
+ x="16.816299"
+ y="109.87854"
+ id="text3014"
+ sodipodi:linespacing="125%"><tspan
+ sodipodi:role="line"
+ id="tspan3018"
+ x="16.816299"
+ y="109.87854">evolve</tspan></text>
+<g
+ id="g2988"
+ transform="matrix(0.74328759,-0.66897202,0.66897202,0.74328759,8.9028358,75.473986)"><path
+ d="M 19.418398,44.509742 C 13.566506,45.076202 9.2828039,50.274467 9.8492604,56.126357 10.416792,61.982332 15.614839,66.269362 21.46775,65.702634 27.31879,65.12876 31.606084,59.931735 31.037317,54.079359 30.468598,48.231333 25.271308,43.943014 19.418398,44.509742 z"
+ style="fill:#1b1a1b"
+ id="path2343" /><path
+ d="M 20.127041,43.245285 C 14.275159,43.811746 9.9914567,49.01001 10.557913,54.8619 c 0.567261,5.854953 5.765579,10.143005 11.61747,9.576545 5.85206,-0.574142 10.139092,-5.772187 9.569297,-11.624297 -0.567701,-5.848293 -5.764728,-10.13559 -11.617639,-9.568863 z"
+ style="fill:#bfbfbf"
+ id="path2589" /><path
+ d="m 15.297614,61.936273 c 0.0649,0.752128 1.095012,1.718382 2.713381,2.162016 1.390355,0.381136 4.974531,1.355379 9.578993,-1.550784 4.604462,-2.906163 5.135393,-10.679565 3.042277,-12.965884 -0.647907,-1.158064 -1.490462,-2.001165 -0.820074,-0.152965 1.692982,4.666774 -1.596739,9.032083 -4.434212,11.053479 -2.836454,2.021128 -6.433853,1.064641 -7.902778,0.616794 -1.468915,-0.447847 -2.243523,0.0604 -2.177587,0.837344 z"
+ style="fill:#000000"
+ id="path2591" /><path
+ d="m 21.239503,62.980483 c 0.422006,-0.379939 2.558364,-0.22464 4.487234,-1.261971 1.92785,-1.037065 4.219346,-3.310451 4.628251,-6.540865 0.240881,-1.896934 0.313223,-1.420583 0.409121,-0.387475 -0.299215,5.370492 -5.238089,8.336927 -8.06262,8.72834 -0.76217,0.105705 -2.103468,0.04118 -1.461986,-0.538029 z"
+ style="fill:#ffffff"
+ id="path2597" /><path
+ d="m 12.336171,56.430605 c 0.380898,1.199486 1.354175,2.949646 3.409446,3.241412 2.744512,0.389611 3.30561,1.629622 6.546396,0.986326 3.240786,-0.643297 5.697258,-3.299154 6.680242,-6.23693 1.125385,-4.064906 -0.559668,-6.163496 -3.095682,-8.037135 -2.536005,-1.873639 -8.114707,-1.672161 -11.443975,1.362735 -2.366007,2.155435 -3.02378,5.763265 -2.096427,8.683592 z"
+ style="fill:#999999"
+ id="path2593_2_" /><path
+ d="m 23.114098,59.11873 c 2.490146,-0.651887 5.783458,-4.045016 4.14851,-6.635646 -2.017128,-3.192057 -7.636948,-0.459737 -7.826995,3.094121 -0.190795,3.555146 1.039269,4.232436 3.678485,3.541525 z"
+ style="fill:#f3f3f3"
+ id="path256" /></g></svg>
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/test2rst.py Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,62 @@
+#!/usr/bin/env python
+
+import os, os.path as op, re, sys
+
+# line starts with two chars one of which is not a space (and both are not
+# newlines obviously) and ends with one or more newlines followed by two spaces
+# on a next line (indented text)
+CODEBLOCK = re.compile(r'()\n(([^ \n][^\n]|[^\n][^ \n])[^\n]*)\n+ ')
+
+INDEX = '''
+Mercurial tests
+===============
+
+.. toctree::
+ :maxdepth: 1
+'''
+
+
+def rstify(orig, name):
+ header = '%s\n%s\n\n' % (name, '=' * len(name))
+ content = header + orig
+ content = CODEBLOCK.sub(r'\n\1\n\n::\n\n ', content)
+ return content
+
+
+def main(base):
+ if os.path.isdir(base):
+ one_dir(base)
+ else:
+ one_file(base)
+
+
+def one_dir(base):
+ index = INDEX
+ #doc = lambda x: op.join(op.dirname(__file__), 'docs', x)
+
+ for fn in sorted(os.listdir(base)):
+ if not fn.endswith('.t'):
+ continue
+ name = os.path.splitext(fn)[0]
+ content = one_file(op.join(base, fn))
+ target = op.join(base, name + '.rst')
+ #with file(doc(name + '.rst'), 'w') as f:
+ with file(target, 'w') as f:
+ f.write(content)
+
+ index += '\n ' + name
+
+ #with file(doc('index.rst'), 'w') as f:
+ # f.write(index)
+
+
+def one_file(path):
+ name = os.path.basename(path)[:-2]
+ return rstify(file(path).read(), name)
+
+
+if __name__ == '__main__':
+ if len(sys.argv) != 2:
+ print 'Please supply a path to tests dir as parameter'
+ sys.exit()
+ main(sys.argv[1])
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/docs/tutorials/tutorial.t Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,1 @@
+../../tests/test-tutorial.t
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hgext/__init__.py Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,1 @@
+# Copyright 2011 Logilab SA <contact@logilab.fr>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hgext/drophack.py Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,163 @@
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+'''This extension add a hacky command to drop changeset during review
+
+This extension is intended as a temporary hack to allow Matt Mackall to use
+evolve in the Mercurial review it self. You should probably not use it if your
+name is not Matt Mackall.
+'''
+
+import os
+import time
+import contextlib
+
+from mercurial.i18n import _
+from mercurial import cmdutil
+from mercurial import repair
+from mercurial import scmutil
+from mercurial import lock as lockmod
+from mercurial import util
+from mercurial import commands
+
+cmdtable = {}
+command = cmdutil.command(cmdtable)
+
+
+@contextlib.contextmanager
+def timed(ui, caption):
+ ostart = os.times()
+ cstart = time.time()
+ yield
+ cstop = time.time()
+ ostop = os.times()
+ wall = cstop - cstart
+ user = ostop[0] - ostart[0]
+ sys = ostop[1] - ostart[1]
+ comb = user + sys
+ ui.write("%s: wall %f comb %f user %f sys %f\n"
+ % (caption, wall, comb, user, sys))
+
+def obsmarkerchainfrom(obsstore, nodes):
+ """return all marker chain starting from node
+
+ Starting from mean "use as successors"."""
+ # XXX need something smarter for descendant of bumped changeset
+ seennodes = set(nodes)
+ seenmarkers = set()
+ pendingnodes = set(nodes)
+ precursorsmarkers = obsstore.precursors
+ while pendingnodes:
+ current = pendingnodes.pop()
+ new = set()
+ for precmark in precursorsmarkers.get(current, ()):
+ if precmark in seenmarkers:
+ continue
+ seenmarkers.add(precmark)
+ new.add(precmark[0])
+ yield precmark
+ new -= seennodes
+ pendingnodes |= new
+
+def stripmarker(ui, repo, markers):
+ """remove <markers> from the repo obsstore
+
+ The old obsstore content is saved in a `obsstore.prestrip` file
+ """
+ repo = repo.unfiltered()
+ repo.destroying()
+ oldmarkers = list(repo.obsstore._all)
+ util.rename(repo.sjoin('obsstore'),
+ repo.join('obsstore.prestrip'))
+ del repo.obsstore # drop the cache
+ newstore = repo.obsstore
+ assert not newstore # should be empty after rename
+ tr = repo.transaction('drophack')
+ try:
+ for m in oldmarkers:
+ if m not in markers:
+ newstore.add(tr, [m])
+ tr.close()
+ finally:
+ tr.release()
+ repo.destroyed()
+
+
+@command('drop', [('r', 'rev', [], 'revision to update')], _('[-r] revs'))
+def cmddrop(ui, repo, *revs, **opts):
+ """I'm hacky do not use me!
+
+ This command strip a changeset, its precursors and all obsolescence marker
+ associated to its chain.
+
+ There is no way to limit the extend of the purge yet. You may have to
+ repull from other source to get some changeset and obsolescence marker
+ back.
+
+ This intended for Matt Mackall usage only. do not use me.
+ """
+ revs = list(revs)
+ revs.extend(opts['rev'])
+ if not revs:
+ revs = ['.']
+ # get the changeset
+ revs = scmutil.revrange(repo, revs)
+ if not revs:
+ ui.write_err('no revision to drop\n')
+ return 1
+ # lock from the beginning to prevent race
+ wlock = lock = None
+ try:
+ lock = repo.wlock()
+ lock = repo.lock()
+ # check they have no children
+ if repo.revs('%ld and public()', revs):
+ ui.write_err('cannot drop public revision')
+ return 1
+ if repo.revs('children(%ld) - %ld', revs, revs):
+ ui.write_err('cannot drop revision with children')
+ return 1
+ if repo.revs('. and %ld', revs):
+ newrevs = repo.revs('max(::. - %ld)', revs)
+ if newrevs:
+ assert len(newrevs) == 1
+ newrev = newrevs[0]
+ else:
+ newrev = -1
+ commands.update(ui, repo, newrev)
+ ui.status(_('working directory now at %s\n') % repo[newrev])
+ # get all markers and successors up to root
+ nodes = [repo[r].node() for r in revs]
+ with timed(ui, 'search obsmarker'):
+ markers = set(obsmarkerchainfrom(repo.obsstore, nodes))
+ ui.write('%i obsmarkers found\n' % len(markers))
+ cl = repo.unfiltered().changelog
+ with timed(ui, 'search nodes'):
+ allnodes = set(nodes)
+ allnodes.update(m[0] for m in markers if cl.hasnode(m[0]))
+ ui.write('%i nodes found\n' % len(allnodes))
+ cl = repo.changelog
+ visiblenodes = set(n for n in allnodes if cl.hasnode(n))
+ # check constraint again
+ if repo.revs('%ln and public()', visiblenodes):
+ ui.write_err('cannot drop public revision')
+ return 1
+ if repo.revs('children(%ln) - %ln', visiblenodes, visiblenodes):
+ ui.write_err('cannot drop revision with children')
+ return 1
+
+ if markers:
+ # strip them
+ with timed(ui, 'strip obsmarker'):
+ stripmarker(ui, repo, markers)
+ # strip the changeset
+ with timed(ui, 'strip nodes'):
+ repair.strip(ui, repo, allnodes, backup="all", topic='drophack')
+
+ finally:
+ lockmod.release(lock, wlock)
+
+ # rewrite the whole file.
+ # print data.
+ # - time to compute the chain
+ # - time to strip the changeset
+ # - time to strip the obs marker.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hgext/evolve.py Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,1852 @@
+# Copyright 2011 Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
+# Logilab SA <contact@logilab.fr>
+# Pierre-Yves David <pierre-yves.david@ens-lyon.org>
+# Patrick Mezard <patrick@mezard.eu>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+'''Extends Mercurial feature related to Changeset Evolution
+
+This extension provides several commands to mutate history and deal with
+issues it may raise.
+
+It also:
+
+ - enables the "Changeset Obsolescence" feature of mercurial,
+ - alters core commands and extensions that rewrite history to use
+ this feature,
+ - improves some aspect of the early implementation in 2.3
+'''
+
+testedwith = '2.7 2.7.1 2.7.2 2.8 2.8.1'
+buglink = 'https://bitbucket.org/marmoute/mutable-history/issues'
+
+import sys
+import random
+
+import mercurial
+from mercurial import util
+
+try:
+ from mercurial import obsolete
+ if not obsolete._enabled:
+ obsolete._enabled = True
+ from mercurial import bookmarks
+ bookmarks.bmstore
+except (ImportError, AttributeError):
+ raise util.Abort('Your Mercurial is too old for this version of Evolve',
+ hint='requires version >> 2.4.x')
+
+
+
+from mercurial import bookmarks
+from mercurial import cmdutil
+from mercurial import commands
+from mercurial import context
+from mercurial import copies
+from mercurial import error
+from mercurial import extensions
+from mercurial import hg
+from mercurial import lock as lockmod
+from mercurial import merge
+from mercurial import node
+from mercurial import phases
+from mercurial import revset
+from mercurial import scmutil
+from mercurial import templatekw
+from mercurial.i18n import _
+from mercurial.commands import walkopts, commitopts, commitopts2
+from mercurial.node import nullid
+
+
+
+# This extension contains the following code
+#
+# - Extension Helper code
+# - Obsolescence cache
+# - ...
+# - Older format compat
+
+
+
+#####################################################################
+### Extension helper ###
+#####################################################################
+
+class exthelper(object):
+ """Helper for modular extension setup
+
+ A single helper should be instanciated for each extension. Helper
+ methods are then used as decorator for various purpose.
+
+ All decorators return the original function and may be chained.
+ """
+
+ def __init__(self):
+ self._uicallables = []
+ self._extcallables = []
+ self._repocallables = []
+ self._revsetsymbols = []
+ self._templatekws = []
+ self._commandwrappers = []
+ self._extcommandwrappers = []
+ self._functionwrappers = []
+ self._duckpunchers = []
+
+ def final_uisetup(self, ui):
+ """Method to be used as the extension uisetup
+
+ The following operations belong here:
+
+ - Changes to ui.__class__ . The ui object that will be used to run the
+ command has not yet been created. Changes made here will affect ui
+ objects created after this, and in particular the ui that will be
+ passed to runcommand
+ - Command wraps (extensions.wrapcommand)
+ - Changes that need to be visible to other extensions: because
+ initialization occurs in phases (all extensions run uisetup, then all
+ run extsetup), a change made here will be visible to other extensions
+ during extsetup
+ - Monkeypatch or wrap function (extensions.wrapfunction) of dispatch
+ module members
+ - Setup of pre-* and post-* hooks
+ - pushkey setup
+ """
+ for cont, funcname, func in self._duckpunchers:
+ setattr(cont, funcname, func)
+ for command, wrapper in self._commandwrappers:
+ extensions.wrapcommand(commands.table, command, wrapper)
+ for cont, funcname, wrapper in self._functionwrappers:
+ extensions.wrapfunction(cont, funcname, wrapper)
+ for c in self._uicallables:
+ c(ui)
+
+ def final_extsetup(self, ui):
+ """Method to be used as a the extension extsetup
+
+ The following operations belong here:
+
+ - Changes depending on the status of other extensions. (if
+ extensions.find('mq'))
+ - Add a global option to all commands
+ - Register revset functions
+ """
+ knownexts = {}
+ for name, symbol in self._revsetsymbols:
+ revset.symbols[name] = symbol
+ for name, kw in self._templatekws:
+ templatekw.keywords[name] = kw
+ for ext, command, wrapper in self._extcommandwrappers:
+ if ext not in knownexts:
+ e = extensions.find(ext)
+ if e is None:
+ raise util.Abort('extension %s not found' % ext)
+ knownexts[ext] = e.cmdtable
+ extensions.wrapcommand(knownexts[ext], commands, wrapper)
+ for c in self._extcallables:
+ c(ui)
+
+ def final_reposetup(self, ui, repo):
+ """Method to be used as a the extension reposetup
+
+ The following operations belong here:
+
+ - All hooks but pre-* and post-*
+ - Modify configuration variables
+ - Changes to repo.__class__, repo.dirstate.__class__
+ """
+ for c in self._repocallables:
+ c(ui, repo)
+
+ def uisetup(self, call):
+ """Decorated function will be executed during uisetup
+
+ example::
+
+ @eh.uisetup
+ def setupbabar(ui):
+ print 'this is uisetup!'
+ """
+ self._uicallables.append(call)
+ return call
+
+ def extsetup(self, call):
+ """Decorated function will be executed during extsetup
+
+ example::
+
+ @eh.extsetup
+ def setupcelestine(ui):
+ print 'this is extsetup!'
+ """
+ self._extcallables.append(call)
+ return call
+
+ def reposetup(self, call):
+ """Decorated function will be executed during reposetup
+
+ example::
+
+ @eh.reposetup
+ def setupzephir(ui, repo):
+ print 'this is reposetup!'
+ """
+ self._repocallables.append(call)
+ return call
+
+ def revset(self, symbolname):
+ """Decorated function is a revset symbol
+
+ The name of the symbol must be given as the decorator argument.
+ The symbol is added during `extsetup`.
+
+ example::
+
+ @eh.revset('hidden')
+ def revsetbabar(repo, subset, x):
+ args = revset.getargs(x, 0, 0, 'babar accept no argument')
+ return [r for r in subset if 'babar' in repo[r].description()]
+ """
+ def dec(symbol):
+ self._revsetsymbols.append((symbolname, symbol))
+ return symbol
+ return dec
+
+
+ def templatekw(self, keywordname):
+ """Decorated function is a revset keyword
+
+ The name of the keyword must be given as the decorator argument.
+ The symbol is added during `extsetup`.
+
+ example::
+
+ @eh.templatekw('babar')
+ def kwbabar(ctx):
+ return 'babar'
+ """
+ def dec(keyword):
+ self._templatekws.append((keywordname, keyword))
+ return keyword
+ return dec
+
+ def wrapcommand(self, command, extension=None):
+ """Decorated function is a command wrapper
+
+ The name of the command must be given as the decorator argument.
+ The wrapping is installed during `uisetup`.
+
+ If the second option `extension` argument is provided, the wrapping
+ will be applied in the extension commandtable. This argument must be a
+ string that will be searched using `extension.find` if not found and
+ Abort error is raised. If the wrapping applies to an extension, it is
+ installed during `extsetup`
+
+ example::
+
+ @eh.wrapcommand('summary')
+ def wrapsummary(orig, ui, repo, *args, **kwargs):
+ ui.note('Barry!')
+ return orig(ui, repo, *args, **kwargs)
+
+ """
+ def dec(wrapper):
+ if extension is None:
+ self._commandwrappers.append((command, wrapper))
+ else:
+ self._extcommandwrappers.append((extension, command, wrapper))
+ return wrapper
+ return dec
+
+ def wrapfunction(self, container, funcname):
+ """Decorated function is a function wrapper
+
+ This function takes two arguments, the container and the name of the
+ function to wrap. The wrapping is performed during `uisetup`.
+ (there is no extension support)
+
+ example::
+
+ @eh.function(discovery, 'checkheads')
+ def wrapfunction(orig, *args, **kwargs):
+ ui.note('His head smashed in and his heart cut out')
+ return orig(*args, **kwargs)
+ """
+ def dec(wrapper):
+ self._functionwrappers.append((container, funcname, wrapper))
+ return wrapper
+ return dec
+
+ def addattr(self, container, funcname):
+ """Decorated function is to be added to the container
+
+ This function takes two arguments, the container and the name of the
+ function to wrap. The wrapping is performed during `uisetup`.
+
+ example::
+
+ @eh.function(context.changectx, 'babar')
+ def babar(ctx):
+ return 'babar' in ctx.description
+ """
+ def dec(func):
+ self._duckpunchers.append((container, funcname, func))
+ return func
+ return dec
+
+eh = exthelper()
+uisetup = eh.final_uisetup
+extsetup = eh.final_extsetup
+reposetup = eh.final_reposetup
+
+#####################################################################
+### Critical fix ###
+#####################################################################
+
+@eh.wrapfunction(mercurial.obsolete, '_readmarkers')
+def safereadmarkers(orig, data):
+ """safe maker wrapper to remove nullid succesors
+
+ Nullid successors was created by older version of evolve.
+ """
+ nb = 0
+ for marker in orig(data):
+ if nullid in marker[1]:
+ marker = (marker[0],
+ tuple(s for s in marker[1] if s != nullid),
+ marker[2],
+ marker[3])
+ nb += 1
+ yield marker
+ if nb:
+ e = sys.stderr
+ print >> e, 'repo contains %i invalid obsolescence markers' % nb
+
+getrevs = obsolete.getrevs
+
+#####################################################################
+### Complete troubles computation logic ###
+#####################################################################
+
+
+### Cache computation
+latediff = 1 # flag to prevent taking late comer fix into account
+
+### changectx method
+
+@eh.addattr(context.changectx, 'latecomer')
+def latecomer(ctx):
+ """is the changeset bumped (Try to succeed to public change)"""
+ return ctx.bumped()
+
+@eh.addattr(context.changectx, 'conflicting')
+def conflicting(ctx):
+ """is the changeset divergent (Try to succeed to public change)"""
+ return ctx.divergent()
+
+### revset symbol
+
+eh.revset('latecomer')(revset.symbols['bumped'])
+eh.revset('conflicting')(revset.symbols['divergent'])
+
+
+
+
+#####################################################################
+### Additional Utilities ###
+#####################################################################
+
+# This section contains a lot of small utility function and method
+
+# - Function to create markers
+# - useful alias pstatus and pdiff (should probably go in evolve)
+# - "troubles" method on changectx
+# - function to travel throught the obsolescence graph
+# - function to find useful changeset to stabilize
+
+createmarkers = obsolete.createmarkers
+
+
+### Useful alias
+
+@eh.uisetup
+def _installalias(ui):
+ if ui.config('alias', 'pstatus', None) is None:
+ ui.setconfig('alias', 'pstatus', 'status --rev .^')
+ if ui.config('alias', 'pdiff', None) is None:
+ ui.setconfig('alias', 'pdiff', 'diff --rev .^')
+ if ui.config('alias', 'olog', None) is None:
+ ui.setconfig('alias', 'olog', "log -r 'precursors(.)' --hidden")
+ if ui.config('alias', 'odiff', None) is None:
+ ui.setconfig('alias', 'odiff', "diff --hidden --rev 'limit(precursors(.),1)' --rev .")
+ if ui.config('alias', 'grab', None) is None:
+ ui.setconfig('alias', 'grab', "! $HG rebase --dest . --rev $@ && $HG up tip")
+
+
+### Troubled revset symbol
+
+@eh.revset('troubled')
+def revsettroubled(repo, subset, x):
+ """``troubled()``
+ Changesets with troubles.
+ """
+ _ = revset.getargs(x, 0, 0, 'troubled takes no arguments')
+ return repo.revs('%ld and (unstable() + bumped() + divergent())',
+ subset)
+
+
+### Obsolescence graph
+
+# XXX SOME MAJOR CLEAN UP TO DO HERE XXX
+
+def _precursors(repo, s):
+ """Precursor of a changeset"""
+ cs = set()
+ nm = repo.changelog.nodemap
+ markerbysubj = repo.obsstore.precursors
+ for r in s:
+ for p in markerbysubj.get(repo[r].node(), ()):
+ pr = nm.get(p[0])
+ if pr is not None:
+ cs.add(pr)
+ return cs
+
+def _allprecursors(repo, s): # XXX we need a better naming
+ """transitive precursors of a subset"""
+ toproceed = [repo[r].node() for r in s]
+ seen = set()
+ allsubjects = repo.obsstore.precursors
+ while toproceed:
+ nc = toproceed.pop()
+ for mark in allsubjects.get(nc, ()):
+ np = mark[0]
+ if np not in seen:
+ seen.add(np)
+ toproceed.append(np)
+ nm = repo.changelog.nodemap
+ cs = set()
+ for p in seen:
+ pr = nm.get(p)
+ if pr is not None:
+ cs.add(pr)
+ return cs
+
+def _successors(repo, s):
+ """Successors of a changeset"""
+ cs = set()
+ nm = repo.changelog.nodemap
+ markerbyobj = repo.obsstore.successors
+ for r in s:
+ for p in markerbyobj.get(repo[r].node(), ()):
+ for sub in p[1]:
+ sr = nm.get(sub)
+ if sr is not None:
+ cs.add(sr)
+ return cs
+
+def _allsuccessors(repo, s, haltonflags=0): # XXX we need a better naming
+ """transitive successors of a subset
+
+ haltonflags allows to provide flags which prevent the evaluation of a
+ marker. """
+ toproceed = [repo[r].node() for r in s]
+ seen = set()
+ allobjects = repo.obsstore.successors
+ while toproceed:
+ nc = toproceed.pop()
+ for mark in allobjects.get(nc, ()):
+ if mark[2] & haltonflags:
+ continue
+ for sub in mark[1]:
+ if sub == nullid:
+ continue # should not be here!
+ if sub not in seen:
+ seen.add(sub)
+ toproceed.append(sub)
+ nm = repo.changelog.nodemap
+ cs = set()
+ for s in seen:
+ sr = nm.get(s)
+ if sr is not None:
+ cs.add(sr)
+ return cs
+
+
+
+
+#####################################################################
+### Extending revset and template ###
+#####################################################################
+
+# this section add several useful revset symbol not yet in core.
+# they are subject to changes
+
+
+### XXX I'm not sure this revset is useful
+@eh.revset('suspended')
+def revsetsuspended(repo, subset, x):
+ """``suspended()``
+ Obsolete changesets with non-obsolete descendants.
+ """
+ args = revset.getargs(x, 0, 0, 'suspended takes no arguments')
+ suspended = getrevs(repo, 'suspended')
+ return [r for r in subset if r in suspended]
+
+
+@eh.revset('precursors')
+def revsetprecursors(repo, subset, x):
+ """``precursors(set)``
+ Immediate precursors of changesets in set.
+ """
+ s = revset.getset(repo, range(len(repo)), x)
+ cs = _precursors(repo, s)
+ return [r for r in subset if r in cs]
+
+
+@eh.revset('allprecursors')
+def revsetallprecursors(repo, subset, x):
+ """``allprecursors(set)``
+ Transitive precursors of changesets in set.
+ """
+ s = revset.getset(repo, range(len(repo)), x)
+ cs = _allprecursors(repo, s)
+ return [r for r in subset if r in cs]
+
+
+@eh.revset('successors')
+def revsetsuccessors(repo, subset, x):
+ """``successors(set)``
+ Immediate successors of changesets in set.
+ """
+ s = revset.getset(repo, range(len(repo)), x)
+ cs = _successors(repo, s)
+ return [r for r in subset if r in cs]
+
+@eh.revset('allsuccessors')
+def revsetallsuccessors(repo, subset, x):
+ """``allsuccessors(set)``
+ Transitive successors of changesets in set.
+ """
+ s = revset.getset(repo, range(len(repo)), x)
+ cs = _allsuccessors(repo, s)
+ return [r for r in subset if r in cs]
+
+### template keywords
+# XXX it does not handle troubles well :-/
+
+@eh.templatekw('obsolete')
+def obsoletekw(repo, ctx, templ, **args):
+ """:obsolete: String. The obsolescence level of the node, could be
+ ``stable``, ``unstable``, ``suspended`` or ``extinct``.
+ """
+ rev = ctx.rev()
+ if ctx.obsolete():
+ if ctx.extinct():
+ return 'extinct'
+ else:
+ return 'suspended'
+ elif ctx.unstable():
+ return 'unstable'
+ return 'stable'
+
+#####################################################################
+### Various trouble warning ###
+#####################################################################
+
+# This section take care of issue warning to the user when troubles appear
+
+@eh.wrapcommand("update")
+@eh.wrapcommand("parents")
+@eh.wrapcommand("pull")
+def wrapmayobsoletewc(origfn, ui, repo, *args, **opts):
+ """Warn that the working directory parent is an obsolete changeset"""
+ res = origfn(ui, repo, *args, **opts)
+ if repo['.'].obsolete():
+ ui.warn(_('working directory parent is obsolete!\n'))
+ return res
+
+# XXX this could wrap transaction code
+# XXX (but this is a bit a layer violation)
+@eh.wrapcommand("commit")
+@eh.wrapcommand("import")
+@eh.wrapcommand("push")
+@eh.wrapcommand("pull")
+@eh.wrapcommand("graft")
+@eh.wrapcommand("phase")
+@eh.wrapcommand("unbundle")
+def warnobserrors(orig, ui, repo, *args, **kwargs):
+ """display warning is the command resulted in more instable changeset"""
+ # part of the troubled stuff may be filtered (stash ?)
+ # This needs a better implementation but will probably wait for core.
+ filtered = repo.changelog.filteredrevs
+ priorunstables = len(set(getrevs(repo, 'unstable')) - filtered)
+ priorbumpeds = len(set(getrevs(repo, 'bumped')) - filtered)
+ priordivergents = len(set(getrevs(repo, 'divergent')) - filtered)
+ ret = orig(ui, repo, *args, **kwargs)
+ # workaround phase stupidity
+ #phases._filterunknown(ui, repo.changelog, repo._phasecache.phaseroots)
+ filtered = repo.changelog.filteredrevs
+ newunstables = len(set(getrevs(repo, 'unstable')) - filtered) - priorunstables
+ newbumpeds = len(set(getrevs(repo, 'bumped')) - filtered) - priorbumpeds
+ newdivergents = len(set(getrevs(repo, 'divergent')) - filtered) - priordivergents
+ if newunstables > 0:
+ ui.warn(_('%i new unstable changesets\n') % newunstables)
+ if newbumpeds > 0:
+ ui.warn(_('%i new bumped changesets\n') % newbumpeds)
+ if newdivergents > 0:
+ ui.warn(_('%i new divergent changesets\n') % newdivergents)
+ return ret
+
+@eh.reposetup
+def _repostabilizesetup(ui, repo):
+ """Add a hint for "hg evolve" when troubles make push fails
+ """
+ if not repo.local():
+ return
+
+ class evolvingrepo(repo.__class__):
+ def push(self, remote, *args, **opts):
+ """wrapper around pull that pull obsolete relation"""
+ try:
+ result = super(evolvingrepo, self).push(remote, *args, **opts)
+ except util.Abort, ex:
+ hint = _("use 'hg evolve' to get a stable history "
+ "or --force to ignore warnings")
+ if (len(ex.args) >= 1
+ and ex.args[0].startswith('push includes ')
+ and ex.hint is None):
+ ex.hint = hint
+ raise
+ return result
+ repo.__class__ = evolvingrepo
+
+def summaryhook(ui, repo):
+ def write(fmt, count):
+ s = fmt % count
+ if count:
+ ui.write(s)
+ else:
+ ui.note(s)
+
+ nbunstable = len(getrevs(repo, 'unstable'))
+ nbbumped = len(getrevs(repo, 'bumped'))
+ nbdivergent = len(getrevs(repo, 'divergent'))
+ write('unstable: %i changesets\n', nbunstable)
+ write('bumped: %i changesets\n', nbbumped)
+ write('divergent: %i changesets\n', nbdivergent)
+
+@eh.extsetup
+def obssummarysetup(ui):
+ cmdutil.summaryhooks.add('evolve', summaryhook)
+
+
+#####################################################################
+### Core Other extension compat ###
+#####################################################################
+
+
+@eh.extsetup
+def _rebasewrapping(ui):
+ # warning about more obsolete
+ try:
+ rebase = extensions.find('rebase')
+ if rebase:
+ extensions.wrapcommand(rebase.cmdtable, 'rebase', warnobserrors)
+ except KeyError:
+ pass # rebase not found
+ try:
+ histedit = extensions.find('histedit')
+ if histedit:
+ extensions.wrapcommand(histedit.cmdtable, 'histedit', warnobserrors)
+ except KeyError:
+ pass # rebase not found
+
+
+#####################################################################
+### Old Evolve extension content ###
+#####################################################################
+
+# XXX need clean up and proper sorting in other section
+
+### util function
+#############################
+
+### changeset rewriting logic
+#############################
+
+def rewrite(repo, old, updates, head, newbases, commitopts):
+ """Return (nodeid, created) where nodeid is the identifier of the
+ changeset generated by the rewrite process, and created is True if
+ nodeid was actually created. If created is False, nodeid
+ references a changeset existing before the rewrite call.
+ """
+ if len(old.parents()) > 1: #XXX remove this unecessary limitation.
+ raise error.Abort(_('cannot amend merge changesets'))
+ base = old.p1()
+ updatebookmarks = _bookmarksupdater(repo, old.node())
+
+ wlock = repo.wlock()
+ try:
+
+ # commit a new version of the old changeset, including the update
+ # collect all files which might be affected
+ files = set(old.files())
+ for u in updates:
+ files.update(u.files())
+
+ # Recompute copies (avoid recording a -> b -> a)
+ copied = copies.pathcopies(base, head)
+
+
+ # prune files which were reverted by the updates
+ def samefile(f):
+ if f in head.manifest():
+ a = head.filectx(f)
+ if f in base.manifest():
+ b = base.filectx(f)
+ return (a.data() == b.data()
+ and a.flags() == b.flags())
+ else:
+ return False
+ else:
+ return f not in base.manifest()
+ files = [f for f in files if not samefile(f)]
+ # commit version of these files as defined by head
+ headmf = head.manifest()
+ def filectxfn(repo, ctx, path):
+ if path in headmf:
+ fctx = head[path]
+ flags = fctx.flags()
+ mctx = context.memfilectx(fctx.path(), fctx.data(),
+ islink='l' in flags,
+ isexec='x' in flags,
+ copied=copied.get(path))
+ return mctx
+ raise IOError()
+ if commitopts.get('message') and commitopts.get('logfile'):
+ raise util.Abort(_('options --message and --logfile are mutually'
+ ' exclusive'))
+ if commitopts.get('logfile'):
+ message= open(commitopts['logfile']).read()
+ elif commitopts.get('message'):
+ message = commitopts['message']
+ else:
+ message = old.description()
+
+ user = commitopts.get('user') or old.user()
+ date = commitopts.get('date') or None # old.date()
+ extra = dict(commitopts.get('extra', {}))
+ extra['branch'] = head.branch()
+
+ new = context.memctx(repo,
+ parents=newbases,
+ text=message,
+ files=files,
+ filectxfn=filectxfn,
+ user=user,
+ date=date,
+ extra=extra)
+
+ if commitopts.get('edit'):
+ new._text = cmdutil.commitforceeditor(repo, new, [])
+ revcount = len(repo)
+ newid = repo.commitctx(new)
+ new = repo[newid]
+ created = len(repo) != revcount
+ updatebookmarks(newid)
+ finally:
+ wlock.release()
+
+ return newid, created
+
+class MergeFailure(util.Abort):
+ pass
+
+def relocate(repo, orig, dest):
+ """rewrite <rev> on dest"""
+ try:
+ rebase = extensions.find('rebase')
+ # dummy state to trick rebase node
+ if not orig.p2().rev() == node.nullrev:
+ raise util.Abort(
+ 'no support for evolution merge changesets yet',
+ hint="Redo the merge a use `hg prune` to obsolete the old one")
+ destbookmarks = repo.nodebookmarks(dest.node())
+ cmdutil.duplicatecopies(repo, orig.node(), dest.node())
+ nodesrc = orig.node()
+ destphase = repo[nodesrc].phase()
+ try:
+ r = rebase.rebasenode(repo, orig.node(), dest.node(),
+ {node.nullrev: node.nullrev}, False)
+ if r[-1]: #some conflict
+ raise util.Abort(
+ 'unresolved merge conflicts (see hg help resolve)')
+ nodenew = rebase.concludenode(repo, orig.node(), dest.node(),
+ node.nullid)
+ except util.Abort, exc:
+ class LocalMergeFailure(MergeFailure, exc.__class__):
+ pass
+ exc.__class__ = LocalMergeFailure
+ raise
+ oldbookmarks = repo.nodebookmarks(nodesrc)
+ if nodenew is not None:
+ phases.retractboundary(repo, destphase, [nodenew])
+ createmarkers(repo, [(repo[nodesrc], (repo[nodenew],))])
+ for book in oldbookmarks:
+ repo._bookmarks[book] = nodenew
+ else:
+ createmarkers(repo, [(repo[nodesrc], ())])
+ # Behave like rebase, move bookmarks to dest
+ for book in oldbookmarks:
+ repo._bookmarks[book] = dest.node()
+ for book in destbookmarks: # restore bookmark that rebase move
+ repo._bookmarks[book] = dest.node()
+ if oldbookmarks or destbookmarks:
+ repo._bookmarks.write()
+ return nodenew
+ except util.Abort:
+ # Invalidate the previous setparents
+ repo.dirstate.invalidate()
+ raise
+
+def _bookmarksupdater(repo, oldid):
+ """Return a callable update(newid) updating the current bookmark
+ and bookmarks bound to oldid to newid.
+ """
+ bm = bookmarks.readcurrent(repo)
+ def updatebookmarks(newid):
+ dirty = False
+ if bm:
+ repo._bookmarks[bm] = newid
+ dirty = True
+ oldbookmarks = repo.nodebookmarks(oldid)
+ if oldbookmarks:
+ for b in oldbookmarks:
+ repo._bookmarks[b] = newid
+ dirty = True
+ if dirty:
+ repo._bookmarks.write()
+ return updatebookmarks
+
+### new command
+#############################
+cmdtable = {}
+command = cmdutil.command(cmdtable)
+metadataopts = [
+ ('d', 'date', '',
+ _('record the specified date in metadata'), _('DATE')),
+ ('u', 'user', '',
+ _('record the specified user in metadata'), _('USER')),
+]
+
+
+@command('^evolve|stabilize|solve',
+ [('n', 'dry-run', False, 'do not perform actions, print what to be done'),
+ ('A', 'any', False, 'evolve any troubled changeset'),
+ ('a', 'all', False, 'evolve all troubled changesets'),
+ ('c', 'continue', False, 'continue an interrupted evolution'), ],
+ _('[OPTIONS]...'))
+def evolve(ui, repo, **opts):
+ """Solve trouble in your repository
+
+ - rebase unstable changeset to make it stable again,
+ - create proper diff from bumped changeset,
+ - merge divergent changesets.
+ - update to a successor if the working directory parent is
+ obsolete
+
+ By default, take the first trouble changeset that looks relevant.
+
+ (The logic is still a bit fuzzy)
+
+ - For unstable, this means taking the first which could be rebased as a
+ child of the working directory parent revision or one of its descendants
+ and rebasing it.
+
+ - For divergent, this means taking "." if applicable.
+
+ With --any, evolve picks any troubled changeset to solve.
+
+ The working directory is updated to the newly created revision.
+ """
+
+ contopt = opts['continue']
+ anyopt = opts['any']
+ allopt = opts['all']
+ dryrunopt = opts['dry_run']
+
+ if contopt:
+ if anyopt:
+ raise util.Abort('can not specify both "--any" and "--continue"')
+ if allopt:
+ raise util.Abort('can not specify both "--all" and "--continue"')
+ graftcmd = commands.table['graft'][0]
+ return graftcmd(ui, repo, old_obsolete=True, **{'continue': True})
+
+ tr = _picknexttroubled(ui, repo, anyopt or allopt)
+ if tr is None:
+ if repo['.'].obsolete():
+ displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
+ successors = set()
+
+ for successorsset in obsolete.successorssets(repo, repo['.'].node()):
+ for nodeid in successorsset:
+ successors.add(repo[nodeid])
+
+ if not successors:
+ ui.warn(_('parent is obsolete without successors; ' +
+ 'likely killed\n'))
+ return 2
+
+ elif len(successors) > 1:
+ ui.warn(_('parent is obsolete with multiple successors:\n'))
+
+ for ctx in sorted(successors, key=lambda ctx: ctx.rev()):
+ displayer.show(ctx)
+
+ return 2
+
+ else:
+ ctx = successors.pop()
+
+ ui.status(_('update:'))
+ if not ui.quiet:
+ displayer.show(ctx)
+
+ if dryrunopt:
+ print 'hg update %s' % ctx.rev()
+ return 0
+ else:
+ return hg.update(repo, ctx.rev())
+
+ troubled = repo.revs('troubled()')
+ if troubled:
+ ui.write_err(_('nothing to evolve here\n'))
+ ui.status(_('(%i troubled changesets, do you want --any ?)\n')
+ % len(troubled))
+ return 2
+ else:
+ ui.write_err(_('no troubled changesets\n'))
+ return 1
+
+ def progresscb():
+ if allopt:
+ ui.progress('evolve', seen, unit='changesets', total=count)
+ seen = 1
+ count = allopt and _counttroubled(ui, repo) or 1
+
+ while tr is not None:
+ progresscb()
+ result = _evolveany(ui, repo, tr, dryrunopt, progresscb=progresscb)
+ progresscb()
+ seen += 1
+ if not allopt:
+ return result
+ progresscb()
+ tr = _picknexttroubled(ui, repo, anyopt or allopt)
+
+ if allopt:
+ ui.progress('evolve', None)
+
+
+def _evolveany(ui, repo, tr, dryrunopt, progresscb):
+ repo = repo.unfiltered()
+ tr = repo[tr.rev()]
+ cmdutil.bailifchanged(repo)
+ troubles = tr.troubles()
+ if 'unstable' in troubles:
+ return _solveunstable(ui, repo, tr, dryrunopt, progresscb)
+ elif 'bumped' in troubles:
+ return _solvebumped(ui, repo, tr, dryrunopt, progresscb)
+ elif 'divergent' in troubles:
+ repo = repo.unfiltered()
+ tr = repo[tr.rev()]
+ return _solvedivergent(ui, repo, tr, dryrunopt, progresscb)
+ else:
+ assert False # WHAT? unknown troubles
+
+def _counttroubled(ui, repo):
+ """Count the amount of troubled changesets"""
+ troubled = set()
+ troubled.update(getrevs(repo, 'unstable'))
+ troubled.update(getrevs(repo, 'bumped'))
+ troubled.update(getrevs(repo, 'divergent'))
+ return len(troubled)
+
+def _picknexttroubled(ui, repo, pickany=False, progresscb=None):
+ """Pick a the next trouble changeset to solve"""
+ if progresscb: progresscb()
+ tr = _stabilizableunstable(repo, repo['.'])
+ if tr is None:
+ wdp = repo['.']
+ if 'divergent' in wdp.troubles():
+ tr = wdp
+ if tr is None and pickany:
+ troubled = list(repo.set('unstable()'))
+ if not troubled:
+ troubled = list(repo.set('bumped()'))
+ if not troubled:
+ troubled = list(repo.set('divergent()'))
+ if troubled:
+ tr = troubled[0]
+
+ return tr
+
+def _stabilizableunstable(repo, pctx):
+ """Return a changectx for an unstable changeset which can be
+ stabilized on top of pctx or one of its descendants. None if none
+ can be found.
+ """
+ def selfanddescendants(repo, pctx):
+ yield pctx
+ for prec in repo.set('allprecursors(%d)', pctx):
+ yield prec
+ for ctx in pctx.descendants():
+ yield ctx
+ for prec in repo.set('allprecursors(%d)', ctx):
+ yield prec
+
+ # Look for an unstable which can be stabilized as a child of
+ # node. The unstable must be a child of one of node predecessors.
+ for ctx in selfanddescendants(repo, pctx):
+ for child in ctx.children():
+ if child.unstable():
+ return child
+ return None
+
+def _solveunstable(ui, repo, orig, dryrun=False, progresscb=None):
+ """Stabilize a unstable changeset"""
+ obs = orig.parents()[0]
+ if not obs.obsolete():
+ print obs.rev(), orig.parents()
+ print orig.rev()
+ obs = orig.parents()[1]
+ assert obs.obsolete()
+ newer = obsolete.successorssets(repo, obs.node())
+ # search of a parent which is not killed
+ while not newer or newer == [()]:
+ ui.debug("stabilize target %s is plain dead,"
+ " trying to stabilize on its parent")
+ obs = obs.parents()[0]
+ newer = obsolete.successorssets(repo, obs.node())
+ if len(newer) > 1:
+ raise util.Abort(_("conflict rewriting. can't choose destination\n"))
+ targets = newer[0]
+ assert targets
+ if len(targets) > 1:
+ raise util.Abort(_("does not handle split parents yet\n"))
+ return 2
+ target = targets[0]
+ displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
+ target = repo[target]
+ repo.ui.status(_('move:'))
+ if not ui.quiet:
+ displayer.show(orig)
+ repo.ui.status(_('atop:'))
+ if not ui.quiet:
+ displayer.show(target)
+ if progresscb: progresscb()
+ todo = 'hg rebase -r %s -d %s\n' % (orig, target)
+ if dryrun:
+ repo.ui.write(todo)
+ else:
+ repo.ui.note(todo)
+ if progresscb: progresscb()
+ lock = repo.lock()
+ try:
+ relocate(repo, orig, target)
+ except MergeFailure:
+ repo.opener.write('graftstate', orig.hex() + '\n')
+ repo.ui.write_err(_('evolve failed!\n'))
+ repo.ui.write_err(_('fix conflict and run "hg evolve --continue"\n'))
+ raise
+ finally:
+ lock.release()
+
+def _solvebumped(ui, repo, bumped, dryrun=False, progresscb=None):
+ """Stabilize a bumped changeset"""
+ # For now we deny bumped merge
+ if len(bumped.parents()) > 1:
+ raise util.Abort('late comer stabilization is confused by bumped'
+ ' %s being a merge' % bumped)
+ prec = repo.set('last(allprecursors(%d) and public())', bumped).next()
+ # For now we deny target merge
+ if len(prec.parents()) > 1:
+ raise util.Abort('late comer evolution is confused by precursors'
+ ' %s being a merge' % prec)
+
+ displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
+ repo.ui.status(_('recreate:'))
+ if not ui.quiet:
+ displayer.show(bumped)
+ repo.ui.status(_('atop:'))
+ if not ui.quiet:
+ displayer.show(prec)
+ if dryrun:
+ todo = 'hg rebase --rev %s --dest %s;\n' % (bumped, prec.p1())
+ repo.ui.write(todo)
+ repo.ui.write('hg update %s;\n' % prec)
+ repo.ui.write('hg revert --all --rev %s;\n' % bumped)
+ repo.ui.write('hg commit --msg "bumped update to %s"')
+ return 0
+ if progresscb: progresscb()
+ wlock = repo.wlock()
+ try:
+ newid = tmpctx = None
+ tmpctx = bumped
+ lock = repo.lock()
+ try:
+ bmupdate = _bookmarksupdater(repo, bumped.node())
+ # Basic check for common parent. Far too complicated and fragile
+ tr = repo.transaction('bumped-stabilize')
+ try:
+ if not list(repo.set('parents(%d) and parents(%d)', bumped, prec)):
+ # Need to rebase the changeset at the right place
+ repo.ui.status(_('rebasing to destination parent: %s\n') % prec.p1())
+ try:
+ tmpid = relocate(repo, bumped, prec.p1())
+ if tmpid is not None:
+ tmpctx = repo[tmpid]
+ createmarkers(repo, [(bumped, (tmpctx,))])
+ except MergeFailure:
+ repo.opener.write('graftstate', bumped.hex() + '\n')
+ repo.ui.write_err(_('evolution failed!\n'))
+ repo.ui.write_err(_('fix conflict and run "hg evolve --continue"\n'))
+ raise
+ # Create the new commit context
+ repo.ui.status(_('computing new diff\n'))
+ files = set()
+ copied = copies.pathcopies(prec, bumped)
+ precmanifest = prec.manifest()
+ for key, val in bumped.manifest().iteritems():
+ if precmanifest.pop(key, None) != val:
+ files.add(key)
+ files.update(precmanifest) # add missing files
+ # commit it
+ if files: # something to commit!
+ def filectxfn(repo, ctx, path):
+ if path in bumped:
+ fctx = bumped[path]
+ flags = fctx.flags()
+ mctx = context.memfilectx(fctx.path(), fctx.data(),
+ islink='l' in flags,
+ isexec='x' in flags,
+ copied=copied.get(path))
+ return mctx
+ raise IOError()
+ text = 'bumped update to %s:\n\n' % prec
+ text += bumped.description()
+
+ new = context.memctx(repo,
+ parents=[prec.node(), node.nullid],
+ text=text,
+ files=files,
+ filectxfn=filectxfn,
+ user=bumped.user(),
+ date=bumped.date(),
+ extra=bumped.extra())
+
+ newid = repo.commitctx(new)
+ if newid is None:
+ createmarkers(repo, [(tmpctx, ())])
+ newid = prec.node()
+ else:
+ phases.retractboundary(repo, bumped.phase(), [newid])
+ createmarkers(repo, [(tmpctx, (repo[newid],))],
+ flag=latediff)
+ bmupdate(newid)
+ tr.close()
+ repo.ui.status(_('commited as %s\n') % node.short(newid))
+ finally:
+ tr.release()
+ finally:
+ lock.release()
+ # reroute the working copy parent to the new changeset
+ repo.dirstate.setparents(newid, node.nullid)
+ finally:
+ wlock.release()
+
+def _solvedivergent(ui, repo, divergent, dryrun=False, progresscb=None):
+ base, others = divergentdata(divergent)
+ if len(others) > 1:
+ othersstr = "[%s]" % (','.join([str(i) for i in others]))
+ hint = ("changeset %d is divergent with a changeset that got splitted "
+ "| into multiple ones:\n[%s]\n"
+ "| This is not handled by automatic evolution yet\n"
+ "| You have to fallback to manual handling with commands as:\n"
+ "| - hg touch -D\n"
+ "| - hg prune\n"
+ "| \n"
+ "| You should contact your local evolution Guru for help.\n"
+ % (divergent, othersstr))
+ raise util.Abort("We do not handle divergence with split yet",
+ hint='')
+ other = others[0]
+ if divergent.phase() <= phases.public:
+ raise util.Abort("We can't resolve this conflict from the public side",
+ hint="%s is public, try from %s" % (divergent, other))
+ if len(other.parents()) > 1:
+ raise util.Abort("divergent changeset can't be a merge (yet)",
+ hint="You have to fallback to solving this by hand...\n"
+ "| This probably mean to redo the merge and use "
+ "| `hg prune` to kill older version.")
+ if other.p1() not in divergent.parents():
+ raise util.Abort("parents are not common (not handled yet)",
+ hint="| %(d)s, %(o)s are not based on the same changeset."
+ "| With the current state of its implementation, "
+ "| evolve does not work in that case.\n"
+ "| rebase one of them next to the other and run "
+ "| this command again.\n"
+ "| - either: hg rebase -dest 'p1(%(d)s)' -r %(o)s"
+ "| - or: hg rebase -dest 'p1(%(d)s)' -r %(o)s"
+ % {'d': divergent, 'o': other})
+
+ displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
+ ui.status(_('merge:'))
+ if not ui.quiet:
+ displayer.show(divergent)
+ ui.status(_('with: '))
+ if not ui.quiet:
+ displayer.show(other)
+ ui.status(_('base: '))
+ if not ui.quiet:
+ displayer.show(base)
+ if dryrun:
+ ui.write('hg update -c %s &&\n' % divergent)
+ ui.write('hg merge %s &&\n' % other)
+ ui.write('hg commit -m "auto merge resolving conflict between '
+ '%s and %s"&&\n' % (divergent, other))
+ ui.write('hg up -C %s &&\n' % base)
+ ui.write('hg revert --all --rev tip &&\n')
+ ui.write('hg commit -m "`hg log -r %s --template={desc}`";\n'
+ % divergent)
+ return
+ wlock = lock = None
+ try:
+ wlock = repo.wlock()
+ lock = repo.lock()
+ if divergent not in repo[None].parents():
+ repo.ui.status(_('updating to "local" conflict\n'))
+ hg.update(repo, divergent.rev())
+ repo.ui.note(_('merging divergent changeset\n'))
+ if progresscb: progresscb()
+ stats = merge.update(repo,
+ other.node(),
+ branchmerge=True,
+ force=False,
+ partial=None,
+ ancestor=base.node(),
+ mergeancestor=True)
+ hg._showstats(repo, stats)
+ if stats[3]:
+ repo.ui.status(_("use 'hg resolve' to retry unresolved file merges "
+ "or 'hg update -C .' to abandon\n"))
+ if stats[3] > 0:
+ raise util.Abort('Merge conflict between several amendments, and this is not yet automated',
+ hint="""/!\ You can try:
+/!\ * manual merge + resolve => new cset X
+/!\ * hg up to the parent of the amended changeset (which are named W and Z)
+/!\ * hg revert --all -r X
+/!\ * hg ci -m "same message as the amended changeset" => new cset Y
+/!\ * hg kill -n Y W Z
+""")
+ if progresscb: progresscb()
+ tr = repo.transaction('stabilize-divergent')
+ try:
+ repo.dirstate.setparents(divergent.node(), node.nullid)
+ oldlen = len(repo)
+ amend(ui, repo, message='', logfile='')
+ if oldlen == len(repo):
+ new = divergent
+ # no changes
+ else:
+ new = repo['.']
+ createmarkers(repo, [(other, (new,))])
+ phases.retractboundary(repo, other.phase(), [new.node()])
+ tr.close()
+ finally:
+ tr.release()
+ finally:
+ lockmod.release(lock, wlock)
+
+
+def divergentdata(ctx):
+ """return base, other part of a conflict
+
+ This only return the first one.
+
+ XXX this woobly function won't survive XXX
+ """
+ for base in ctx._repo.set('reverse(precursors(%d))', ctx):
+ newer = obsolete.successorssets(ctx._repo, base.node())
+ # drop filter and solution including the original ctx
+ newer = [n for n in newer if n and ctx.node() not in n]
+ if newer:
+ return base, tuple(ctx._repo[o] for o in newer[0])
+ raise util.Abort('base of divergent changeset not found',
+ hint='this case is not yet handled')
+
+
+
+shorttemplate = '[{rev}] {desc|firstline}\n'
+
+@command('^gdown|previous',
+ [],
+ '')
+def cmdprevious(ui, repo):
+ """update to parent and display summary lines"""
+ wkctx = repo[None]
+ wparents = wkctx.parents()
+ if len(wparents) != 1:
+ raise util.Abort('merge in progress')
+
+ parents = wparents[0].parents()
+ displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
+ if len(parents) == 1:
+ p = parents[0]
+ hg.update(repo, p.rev())
+ displayer.show(p)
+ return 0
+ else:
+ for p in parents:
+ displayer.show(p)
+ ui.warn(_('multiple parents, explicitly update to one\n'))
+ return 1
+
+@command('^gup|next',
+ [],
+ '')
+def cmdnext(ui, repo):
+ """update to child and display summary lines"""
+ wkctx = repo[None]
+ wparents = wkctx.parents()
+ if len(wparents) != 1:
+ raise util.Abort('merge in progress')
+
+ children = [ctx for ctx in wparents[0].children() if not ctx.obsolete()]
+ displayer = cmdutil.show_changeset(ui, repo, {'template': shorttemplate})
+ if not children:
+ ui.warn(_('no non-obsolete children\n'))
+ return 1
+ if len(children) == 1:
+ c = children[0]
+ hg.update(repo, c.rev())
+ displayer.show(c)
+ return 0
+ else:
+ for c in children:
+ displayer.show(c)
+ ui.warn(_('multiple non-obsolete children, explicitly update to one\n'))
+ return 1
+
+def _reachablefrombookmark(repo, revs, mark):
+ """filter revisions and bookmarks reachable from the given bookmark
+ yoinked from mq.py
+ """
+ marks = repo._bookmarks
+ if mark not in marks:
+ raise util.Abort(_("bookmark '%s' not found") % mark)
+
+ # If the requested bookmark is not the only one pointing to a
+ # a revision we have to only delete the bookmark and not strip
+ # anything. revsets cannot detect that case.
+ uniquebm = True
+ for m, n in marks.iteritems():
+ if m != mark and n == repo[mark].node():
+ uniquebm = False
+ break
+ if uniquebm:
+ rsrevs = repo.revs("ancestors(bookmark(%s)) - "
+ "ancestors(head() and not bookmark(%s)) - "
+ "ancestors(bookmark() and not bookmark(%s)) - "
+ "obsolete()",
+ mark, mark, mark)
+ revs.update(set(rsrevs))
+ return marks,revs
+
+def _deletebookmark(ui, marks, mark):
+ del marks[mark]
+ marks.write()
+ ui.write(_("bookmark '%s' deleted\n") % mark)
+
+
+
+def _getmetadata(**opts):
+ metadata = {}
+ date = opts.get('date')
+ user = opts.get('user')
+ if date and '0 0' != date:
+ metadata['date'] = '%i %i' % util.parsedate(date)
+ if user:
+ metadata['user'] = user
+ return metadata
+
+
+@command('^prune|obsolete|kill',
+ [('n', 'new', [], _("successor changeset (DEPRECATED)")),
+ ('s', 'succ', [], _("successor changeset")),
+ ('r', 'rev', [], _("revisions to prune")),
+ ('', 'biject', False, _("do a 1-1 map between rev and successor ranges")),
+ ('B', 'bookmark', '', _("remove revs only reachable from given"
+ " bookmark"))] + metadataopts,
+ _('[OPTION] [-r] REV...'))
+ # -U --noupdate option to prevent wc update and or bookmarks update ?
+def cmdprune(ui, repo, *revs, **opts):
+ """get rid of changesets by marking them obsolete
+
+ Obsolete changesets becomes invisible to all commands.
+
+ Non-pruned descendant of pruned changesets becomes "unstable". Use the
+ :hg:`evolve` to handle such situation.
+
+ When the working directory parent is pruned the repository is updated to a
+ non obsolete parents.
+
+ You can use the ``--succ`` option to informs mercurial that a newer version
+ of the pruned changeset exists.
+
+ You can use the ``--biject`` option to specify a 1-1 (bijection) between
+ revisions to prune and successor changesets. This option may be removed in
+ a future release (with the functionality absored automatically).
+
+ """
+ revs = set(scmutil.revrange(repo, list(revs) + opts.get('rev')))
+ succs = opts['new'] + opts['succ']
+ bookmark = opts.get('bookmark')
+ metadata = _getmetadata(**opts)
+ biject = opts.get('biject')
+
+ if bookmark:
+ marks,revs = _reachablefrombookmark(repo, revs, bookmark)
+ if not revs:
+ # no revisions to prune - delete bookmark immediately
+ _deletebookmark(ui, marks, bookmark)
+
+ if not revs:
+ raise util.Abort(_('nothing to prune'))
+
+ wlock = lock = None
+ wlock = repo.wlock()
+ sortedrevs = lambda specs: sorted(set(scmutil.revrange(repo, specs)))
+ try:
+ lock = repo.lock()
+ # defines pruned changesets
+ precs = []
+ for p in sortedrevs(revs):
+ cp = repo[p]
+ if not cp.mutable():
+ # note: create marker would had raise something anyway
+ raise util.Abort('cannot prune immutable changeset: %s' % cp,
+ hint='see "hg help phases" for details')
+ precs.append(cp)
+ if not precs:
+ raise util.Abort('nothing to prune')
+
+ # defines successors changesets
+ sucs = tuple(repo[n] for n in sortedrevs(succs))
+ if not biject and len(sucs) > 1 and len(precs) > 1:
+ msg = "Can't use multiple successors for multiple precursors"
+ raise util.Abort(msg)
+
+ if biject and len(sucs) != len(precs):
+ msg = "Can't use %d successors for %d precursors" % (len(sucs), len(precs))
+ raise util.Abort(msg)
+
+ relations = [(p, sucs) for p in precs]
+ if biject:
+ relations = [(p, (s,)) for p, s in zip(precs, sucs)]
+
+ # create markers
+ createmarkers(repo, relations, metadata=metadata)
+
+ # informs that changeset have been pruned
+ ui.status(_('%i changesets pruned\n') % len(precs))
+ # update to an unkilled parent
+ wdp = repo['.']
+ newnode = wdp
+ while newnode.obsolete():
+ newnode = newnode.parents()[0]
+ if newnode.node() != wdp.node():
+ commands.update(ui, repo, newnode.rev())
+ ui.status(_('working directory now at %s\n') % newnode)
+ # update bookmarks
+ if bookmark:
+ _deletebookmark(ui, marks, bookmark)
+ for ctx in repo.unfiltered().set('bookmark() and %ld', precs):
+ ldest = list(repo.set('max((::%d) - obsolete())', ctx))
+ if ldest:
+ dest = ldest[0]
+ updatebookmarks = _bookmarksupdater(repo, ctx.node())
+ updatebookmarks(dest.node())
+ finally:
+ lockmod.release(lock, wlock)
+
+@command('amend|refresh',
+ [('A', 'addremove', None,
+ _('mark new/missing files as added/removed before committing')),
+ ('e', 'edit', False, _('invoke editor on commit messages')),
+ ('', 'close-branch', None,
+ _('mark a branch as closed, hiding it from the branch list')),
+ ('s', 'secret', None, _('use the secret phase for committing')),
+ ] + walkopts + commitopts + commitopts2,
+ _('[OPTION]... [FILE]...'))
+def amend(ui, repo, *pats, **opts):
+ """combine a changeset with updates and replace it with a new one
+
+ Commits a new changeset incorporating both the changes to the given files
+ and all the changes from the current parent changeset into the repository.
+
+ See :hg:`commit` for details about committing changes.
+
+ If you don't specify -m, the parent's message will be reused.
+
+ Behind the scenes, Mercurial first commits the update as a regular child
+ of the current parent. Then it creates a new commit on the parent's parents
+ with the updated contents. Then it changes the working copy parent to this
+ new combined changeset. Finally, the old changeset and its update are hidden
+ from :hg:`log` (unless you use --hidden with log).
+
+ Returns 0 on success, 1 if nothing changed.
+ """
+ opts = opts.copy()
+ edit = opts.pop('edit', False)
+ opts['amend'] = True
+ if not (edit or opts['message']):
+ opts['message'] = repo['.'].description()
+ _alias, commitcmd = cmdutil.findcmd('commit', commands.table)
+ return commitcmd[0](ui, repo, *pats, **opts)
+
+def _commitfiltered(repo, ctx, match):
+ """Recommit ctx with changed files not in match. Return the new
+ node identifier, or None if nothing changed.
+ """
+ base = ctx.p1()
+ m, a, r = repo.status(base, ctx)[:3]
+ allfiles = set(m + a + r)
+ files = set(f for f in allfiles if not match(f))
+ if files == allfiles:
+ return None
+
+ # Filter copies
+ copied = copies.pathcopies(base, ctx)
+ copied = dict((src, dst) for src, dst in copied.iteritems()
+ if dst in files)
+ def filectxfn(repo, memctx, path):
+ if path not in ctx:
+ raise IOError()
+ fctx = ctx[path]
+ flags = fctx.flags()
+ mctx = context.memfilectx(fctx.path(), fctx.data(),
+ islink='l' in flags,
+ isexec='x' in flags,
+ copied=copied.get(path))
+ return mctx
+
+ new = context.memctx(repo,
+ parents=[base.node(), node.nullid],
+ text=ctx.description(),
+ files=files,
+ filectxfn=filectxfn,
+ user=ctx.user(),
+ date=ctx.date(),
+ extra=ctx.extra())
+ # commitctx always create a new revision, no need to check
+ newid = repo.commitctx(new)
+ return newid
+
+def _uncommitdirstate(repo, oldctx, match):
+ """Fix the dirstate after switching the working directory from
+ oldctx to a copy of oldctx not containing changed files matched by
+ match.
+ """
+ ctx = repo['.']
+ ds = repo.dirstate
+ copies = dict(ds.copies())
+ m, a, r = repo.status(oldctx.p1(), oldctx, match=match)[:3]
+ for f in m:
+ if ds[f] == 'r':
+ # modified + removed -> removed
+ continue
+ ds.normallookup(f)
+
+ for f in a:
+ if ds[f] == 'r':
+ # added + removed -> unknown
+ ds.drop(f)
+ elif ds[f] != 'a':
+ ds.add(f)
+
+ for f in r:
+ if ds[f] == 'a':
+ # removed + added -> normal
+ ds.normallookup(f)
+ elif ds[f] != 'r':
+ ds.remove(f)
+
+ # Merge old parent and old working dir copies
+ oldcopies = {}
+ for f in (m + a):
+ src = oldctx[f].renamed()
+ if src:
+ oldcopies[f] = src[0]
+ oldcopies.update(copies)
+ copies = dict((dst, oldcopies.get(src, src))
+ for dst, src in oldcopies.iteritems())
+ # Adjust the dirstate copies
+ for dst, src in copies.iteritems():
+ if (src not in ctx or dst in ctx or ds[dst] != 'a'):
+ src = None
+ ds.copy(src, dst)
+
+@command('^uncommit',
+ [('a', 'all', None, _('uncommit all changes when no arguments given')),
+ ] + commands.walkopts,
+ _('[OPTION]... [NAME]'))
+def uncommit(ui, repo, *pats, **opts):
+ """move changes from parent revision to working directory
+
+ Changes to selected files in parent revision appear again as
+ uncommitted changed in the working directory. A new revision
+ without selected changes is created, becomes the new parent and
+ obsoletes the previous one.
+
+ The --include option specify pattern to uncommit
+ The --exclude option specify pattern to keep in the commit
+
+ Return 0 if changed files are uncommitted.
+ """
+ lock = repo.lock()
+ try:
+ wlock = repo.wlock()
+ try:
+ wctx = repo[None]
+ if len(wctx.parents()) <= 0:
+ raise util.Abort(_("cannot uncommit null changeset"))
+ if len(wctx.parents()) > 1:
+ raise util.Abort(_("cannot uncommit while merging"))
+ old = repo['.']
+ if old.phase() == phases.public:
+ raise util.Abort(_("cannot rewrite immutable changeset"))
+ if len(old.parents()) > 1:
+ raise util.Abort(_("cannot uncommit merge changeset"))
+ oldphase = old.phase()
+ updatebookmarks = _bookmarksupdater(repo, old.node())
+ # Recommit the filtered changeset
+ newid = None
+ if (pats or opts.get('include') or opts.get('exclude')
+ or opts.get('all')):
+ match = scmutil.match(old, pats, opts)
+ newid = _commitfiltered(repo, old, match)
+ if newid is None:
+ raise util.Abort(_('nothing to uncommit'))
+ # Move local changes on filtered changeset
+ createmarkers(repo, [(old, (repo[newid],))])
+ phases.retractboundary(repo, oldphase, [newid])
+ repo.dirstate.setparents(newid, node.nullid)
+ _uncommitdirstate(repo, old, match)
+ updatebookmarks(newid)
+ if not repo[newid].files():
+ ui.warn(_("new changeset is empty\n"))
+ ui.status(_('(use "hg kill ." to remove it)\n'))
+ finally:
+ wlock.release()
+ finally:
+ lock.release()
+
+@eh.wrapcommand('commit')
+def commitwrapper(orig, ui, repo, *arg, **kwargs):
+ if kwargs.get('amend', False):
+ lock = None
+ else:
+ lock = repo.lock()
+ try:
+ obsoleted = kwargs.get('obsolete', [])
+ if obsoleted:
+ obsoleted = repo.set('%lr', obsoleted)
+ result = orig(ui, repo, *arg, **kwargs)
+ if not result: # commit successed
+ new = repo['-1']
+ oldbookmarks = []
+ markers = []
+ for old in obsoleted:
+ oldbookmarks.extend(repo.nodebookmarks(old.node()))
+ markers.append((old, (new,)))
+ if markers:
+ createmarkers(repo, markers)
+ for book in oldbookmarks:
+ repo._bookmarks[book] = new.node()
+ if oldbookmarks:
+ repo._bookmarks.write()
+ return result
+ finally:
+ if lock is not None:
+ lock.release()
+
+@command('^touch',
+ [('r', 'rev', [], 'revision to update'),
+ ('D', 'duplicate', False,
+ 'do not mark the new revision as successor of the old one')],
+ # allow to choose the seed ?
+ _('[-r] revs'))
+def touch(ui, repo, *revs, **opts):
+ """Create successors with exact same property but hash
+
+ This is used to "resurrect" changesets
+ """
+ duplicate = opts['duplicate']
+ revs = list(revs)
+ revs.extend(opts['rev'])
+ if not revs:
+ revs = ['.']
+ revs = scmutil.revrange(repo, revs)
+ if not revs:
+ ui.write_err('no revision to touch\n')
+ return 1
+ if not duplicate and repo.revs('public() and %ld', revs):
+ raise util.Abort("can't touch public revision")
+ wlock = lock = None
+ try:
+ wlock = repo.wlock()
+ lock = repo.lock()
+ tr = repo.transaction('touch')
+ revs.sort() # ensure parent are run first
+ newmapping = {}
+ try:
+ for r in revs:
+ ctx = repo[r]
+ extra = ctx.extra().copy()
+ extra['__touch-noise__'] = random.randint(0, 0xffffffff)
+ # search for touched parent
+ p1 = ctx.p1().node()
+ p2 = ctx.p2().node()
+ p1 = newmapping.get(p1, p1)
+ p2 = newmapping.get(p2, p2)
+ new, _ = rewrite(repo, ctx, [], ctx,
+ [p1, p2],
+ commitopts={'extra': extra})
+ # store touched version to help potential children
+ newmapping[ctx.node()] = new
+ if not duplicate:
+ createmarkers(repo, [(ctx, (repo[new],))])
+ phases.retractboundary(repo, ctx.phase(), [new])
+ if ctx in repo[None].parents():
+ repo.dirstate.setparents(new, node.nullid)
+ tr.close()
+ finally:
+ tr.release()
+ finally:
+ lockmod.release(lock, wlock)
+
+@command('^fold',
+ [('r', 'rev', [], _("explicitly specify the full set of revision to fold")),
+ ],
+ # allow to choose the seed ?
+ _('rev'))
+def fold(ui, repo, *revs, **opts):
+ """Fold multiple revisions into a single one
+
+ Revision from your current working directory to the specified one are fold
+ as a new one replacing the other
+
+ you can alternatively use --rev to explicitly specify revision to be fold
+ ignoring the current working directory parent.
+ """
+ revs = list(revs)
+ if revs:
+ if opts.get('rev', ()):
+ raise util.Abort("cannot specify both --rev and a target revision")
+ targets = scmutil.revrange(repo, revs)
+ revs = repo.revs('(%ld::.) or (.::%ld)', targets, targets)
+ elif 'rev' in opts:
+ revs = scmutil.revrange(repo, opts['rev'])
+ else:
+ revs = ()
+ if not revs:
+ ui.write_err('no revision to fold\n')
+ return 1
+ roots = repo.revs('roots(%ld)', revs)
+ if len(roots) > 1:
+ raise util.Abort("set has multiple roots")
+ root = repo[roots[0]]
+ if root.phase() <= phases.public:
+ raise util.Abort("can't fold public revisions")
+ heads = repo.revs('heads(%ld)', revs)
+ if len(heads) > 1:
+ raise util.Abort("set has multiple heads")
+ head = repo[heads[0]]
+ wlock = lock = None
+ try:
+ wlock = repo.wlock()
+ lock = repo.lock()
+ tr = repo.transaction('touch')
+ try:
+ allctx = [repo[r] for r in revs]
+ targetphase = max(c.phase() for c in allctx)
+ msgs = ["HG: This is a fold of %d changesets." % len(allctx)]
+ msgs += ["HG: Commit message of changeset %s.\n\n%s\n" %
+ (c.rev(), c.description()) for c in allctx]
+ commitopts = {'message': "\n".join(msgs)}
+ commitopts['edit'] = True
+ newid, _ = rewrite(repo, root, allctx, head,
+ [root.p1().node(), root.p2().node()],
+ commitopts=commitopts)
+ phases.retractboundary(repo, targetphase, [newid])
+ createmarkers(repo, [(ctx, (repo[newid],))
+ for ctx in allctx])
+ tr.close()
+ finally:
+ tr.release()
+ ui.status('%i changesets folded\n' % len(revs))
+ if repo['.'].rev() in revs:
+ hg.update(repo, newid)
+ finally:
+ lockmod.release(lock, wlock)
+
+
+
+@eh.wrapcommand('graft')
+def graftwrapper(orig, ui, repo, *revs, **kwargs):
+ kwargs = dict(kwargs)
+ revs = list(revs) + kwargs.get('rev', [])
+ kwargs['rev'] = []
+ obsoleted = kwargs.setdefault('obsolete', [])
+
+ lock = repo.lock()
+ try:
+ if kwargs.get('old_obsolete'):
+ if kwargs.get('continue'):
+ obsoleted.extend(repo.opener.read('graftstate').splitlines())
+ else:
+ obsoleted.extend(revs)
+ # convert obsolete target into revs to avoid alias joke
+ obsoleted[:] = [str(i) for i in repo.revs('%lr', obsoleted)]
+ if obsoleted and len(revs) > 1:
+
+ raise error.Abort(_('cannot graft multiple revisions while '
+ 'obsoleting (for now).'))
+
+ return commitwrapper(orig, ui, repo,*revs, **kwargs)
+ finally:
+ lock.release()
+
+@eh.extsetup
+def oldevolveextsetup(ui):
+ try:
+ rebase = extensions.find('rebase')
+ except KeyError:
+ raise error.Abort(_('evolution extension requires rebase extension.'))
+
+ for cmd in ['kill', 'uncommit', 'touch', 'fold']:
+ entry = extensions.wrapcommand(cmdtable, cmd,
+ warnobserrors)
+
+ entry = cmdutil.findcmd('commit', commands.table)[1]
+ entry[1].append(('o', 'obsolete', [],
+ _("make commit obsolete this revision")))
+ entry = cmdutil.findcmd('graft', commands.table)[1]
+ entry[1].append(('o', 'obsolete', [],
+ _("make graft obsoletes this revision")))
+ entry[1].append(('O', 'old-obsolete', False,
+ _("make graft obsoletes its source")))
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hgext/obsolete.py Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,157 @@
+# Copyright 2011 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
+# Logilab SA <contact@logilab.fr>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+"""Deprecated extension that formely introduces "Changeset Obsolescence".
+
+This concept is now partially in Mercurial core (starting with mercurial 2.3). The remaining logic have been grouped with the evolve extension.
+
+Some code cemains in this extensions to detect and convert prehistoric format of obsolete marker than early user may have create. Keep it enabled if you were such user.
+"""
+
+from mercurial import util
+
+try:
+ from mercurial import obsolete
+ if not obsolete._enabled:
+ obsolete._enabled = True
+except ImportError:
+ raise util.Abort('Obsolete extension requires Mercurial 2.3 (or later)')
+
+import sys
+import json
+
+from mercurial import cmdutil
+from mercurial import error
+from mercurial.node import bin, nullid
+
+
+#####################################################################
+### Older format management ###
+#####################################################################
+
+# Code related to detection and management of older legacy format never
+# handled by core
+
+
+def reposetup(ui, repo):
+ """Detect that a repo still contains some old obsolete format
+ """
+ if not repo.local():
+ return
+ for arg in sys.argv:
+ if 'debugc' in arg:
+ break
+ else:
+ data = repo.opener.tryread('obsolete-relations')
+ if not data:
+ data = repo.sopener.tryread('obsoletemarkers')
+ if data:
+ raise util.Abort('old format of obsolete marker detected!\n'
+ 'run `hg debugconvertobsolete` once.')
+
+def _obsdeserialise(flike):
+ """read a file like object serialised with _obsserialise
+
+ this desierialize into a {subject -> objects} mapping
+
+ this was the very first format ever."""
+ rels = {}
+ for line in flike:
+ subhex, objhex = line.split()
+ subnode = bin(subhex)
+ if subnode == nullid:
+ subnode = None
+ rels.setdefault( subnode, set()).add(bin(objhex))
+ return rels
+
+cmdtable = {}
+command = cmdutil.command(cmdtable)
+@command('debugconvertobsolete', [], '')
+def cmddebugconvertobsolete(ui, repo):
+ """import markers from an .hg/obsolete-relations file"""
+ cnt = 0
+ err = 0
+ l = repo.lock()
+ some = False
+ try:
+ unlink = []
+ tr = repo.transaction('convert-obsolete')
+ try:
+ repo._importoldobsolete = True
+ store = repo.obsstore
+ ### very first format
+ try:
+ f = repo.opener('obsolete-relations')
+ try:
+ some = True
+ for line in f:
+ subhex, objhex = line.split()
+ suc = bin(subhex)
+ prec = bin(objhex)
+ sucs = (suc==nullid) and [] or [suc]
+ meta = {
+ 'date': '%i %i' % util.makedate(),
+ 'user': ui.username(),
+ }
+ try:
+ store.create(tr, prec, sucs, 0, meta)
+ cnt += 1
+ except ValueError:
+ repo.ui.write_err("invalid old marker line: %s"
+ % (line))
+ err += 1
+ finally:
+ f.close()
+ unlink.append(repo.join('obsolete-relations'))
+ except IOError:
+ pass
+ ### second (json) format
+ data = repo.sopener.tryread('obsoletemarkers')
+ if data:
+ some = True
+ for oldmark in json.loads(data):
+ del oldmark['id'] # dropped for now
+ del oldmark['reason'] # unused until then
+ oldobject = str(oldmark.pop('object'))
+ oldsubjects = [str(s) for s in oldmark.pop('subjects', [])]
+ LOOKUP_ERRORS = (error.RepoLookupError, error.LookupError)
+ if len(oldobject) != 40:
+ try:
+ oldobject = repo[oldobject].node()
+ except LOOKUP_ERRORS:
+ pass
+ if any(len(s) != 40 for s in oldsubjects):
+ try:
+ oldsubjects = [repo[s].node() for s in oldsubjects]
+ except LOOKUP_ERRORS:
+ pass
+
+ oldmark['date'] = '%i %i' % tuple(oldmark['date'])
+ meta = dict((k.encode('utf-8'), v.encode('utf-8'))
+ for k, v in oldmark.iteritems())
+ try:
+ succs = [bin(n) for n in oldsubjects]
+ succs = [n for n in succs if n != nullid]
+ store.create(tr, bin(oldobject), succs,
+ 0, meta)
+ cnt += 1
+ except ValueError:
+ repo.ui.write_err("invalid marker %s -> %s\n"
+ % (oldobject, oldsubjects))
+ err += 1
+ unlink.append(repo.sjoin('obsoletemarkers'))
+ tr.close()
+ for path in unlink:
+ util.unlink(path)
+ finally:
+ tr.release()
+ finally:
+ del repo._importoldobsolete
+ l.release()
+ if not some:
+ ui.warn('nothing to do\n')
+ ui.status('%i obsolete marker converted\n' % cnt)
+ if err:
+ ui.write_err('%i conversion failed. check you graph!\n' % err)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hgext/pushexperiment.py Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,112 @@
+"""Small extension altering some push behavior
+
+- Add a new wire protocol command to exchange obsolescence markers. Sending the
+ raw file as a binary instead of using pushkey hack.
+- Add a "push done" notification
+- Push obsolescence marker before anything else (This works around the lack of global transaction)
+
+"""
+
+import errno
+from StringIO import StringIO
+
+from mercurial.i18n import _
+from mercurial import extensions
+from mercurial import wireproto
+from mercurial import obsolete
+from mercurial import localrepo
+
+
+def client_pushobsmarkers(self, obsfile):
+ """wireprotocol peer method"""
+ self.requirecap('_push_experiment_pushobsmarkers_0',
+ _('push obsolete markers faster'))
+ ret, output = self._callpush('push_experiment_pushobsmarkers_0', obsfile)
+ for l in output.splitlines(True):
+ self.ui.status(_('remote: '), l)
+ return ret
+
+
+def srv_pushobsmarkers(repo, proto):
+ """wireprotocol command"""
+ fp = StringIO()
+ proto.redirect()
+ proto.getfile(fp)
+ data = fp.getvalue()
+ fp.close()
+ lock = repo.lock()
+ try:
+ tr = repo.transaction('pushkey: obsolete markers')
+ try:
+ repo.obsstore.mergemarkers(tr, data)
+ tr.close()
+ finally:
+ tr.release()
+ finally:
+ lock.release()
+ return wireproto.pushres(0)
+
+
+def syncpush(orig, repo, remote):
+ """wraper for obsolete.syncpush to use the fast way if possible"""
+ if not (obsolete._enabled and repo.obsstore):
+ return
+ if remote.capable('_push_experiment_pushobsmarkers_0'):
+ return # already pushed before changeset
+ remote.push_experiment_pushobsmarkers_0(obsfp)
+ return
+ return orig(repo, remote)
+
+
+def client_notifypushend(self):
+ """wire peer command to notify a push is done"""
+ self.requirecap('_push_experiment_notifypushend_0', _('hook once push is all done'))
+ return self._call('push_experiment_notifypushend_0')
+
+
+def srv_notifypushend(repo, proto):
+ """wire protocol command to notify a push is done"""
+ proto.redirect()
+ repo.hook('notifypushend')
+ return wireproto.pushres(0)
+
+
+def augmented_push(orig, repo, remote, *args, **kwargs):
+ """push wrapped that call the wire protocol command"""
+ if not remote.canpush():
+ raise util.Abort(_("destination does not support push"))
+ if (obsolete._enabled and repo.obsstore
+ and remote.capable('_push_experiment_pushobsmarkers_0')):
+ # push marker early to limit damage of pushing too early.
+ try:
+ obsfp = repo.sopener('obsstore')
+ except IOError as e:
+ if e.errno != errno.ENOENT:
+ raise
+ else:
+ remote.push_experiment_pushobsmarkers_0(obsfp)
+ ret = orig(repo, remote, *args, **kwargs)
+ if remote.capable('_push_experiment_notifypushend_0'):
+ remote.push_experiment_notifypushend_0()
+ return ret
+
+
+def capabilities(orig, repo, proto):
+ """wrapper to advertise new capability"""
+ caps = orig(repo, proto)
+ if obsolete._enabled:
+ caps += ' _push_experiment_pushobsmarkers_0'
+ caps += ' _push_experiment_notifypushend_0'
+ return caps
+
+
+def extsetup(ui):
+ wireproto.wirepeer.push_experiment_pushobsmarkers_0 = client_pushobsmarkers
+ wireproto.wirepeer.push_experiment_notifypushend_0 = client_notifypushend
+ wireproto.commands['push_experiment_pushobsmarkers_0'] = (srv_pushobsmarkers, '')
+ wireproto.commands['push_experiment_notifypushend_0'] = (srv_notifypushend, '')
+ extensions.wrapfunction(wireproto, 'capabilities', capabilities)
+ extensions.wrapfunction(obsolete, 'syncpush', syncpush)
+ extensions.wrapfunction(localrepo.localrepository, 'push', augmented_push)
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/hgext/simple4server.py Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,12 @@
+'''enable experimental obsolescence feature of Mercurial
+
+OBSOLESCENCE IS AN EXPERIMENTAL FEATURE MAKE SURE YOU UNDERSTOOD THE INVOLVED
+CONCEPT BEFORE USING IT.
+
+/!\ THIS EXTENSION IS INTENDED FOR SERVER SIDE ONLY USAGE /!\
+
+For client side usages it is recommended to use the evolve extension for
+improved user interface.'''
+
+import mercurial.obsolete
+mercurial.obsolete._enabled = True
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/setup.py Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,18 @@
+# Copied from histedit setup.py
+# Credit to Augie Fackler <durin42@gmail.com>
+
+from distutils.core import setup
+
+setup(
+ name='hg-evolve',
+ version='3.2.0',
+ author='Pierre-Yves David',
+ maintainer='Pierre-Yves David',
+ maintainer_email='pierre-yves.david@logilab.fr',
+ url='https://bitbucket.org/marmoute/mutable-history',
+ description='Flexible evolution of Mercurial history.',
+ long_description=open('README').read(),
+ keywords='hg mercurial',
+ license='GPLv2+',
+ py_modules=['hgext.evolve', 'hgext.pushexperiment'],
+)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/killdaemons.py Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,25 @@
+#!/usr/bin/env python
+
+import os, time, errno, signal
+
+# Kill off any leftover daemon processes
+try:
+ fp = open(os.environ['DAEMON_PIDS'])
+ for line in fp:
+ try:
+ pid = int(line)
+ except ValueError:
+ continue
+ try:
+ os.kill(pid, 0)
+ os.kill(pid, signal.SIGTERM)
+ for i in range(10):
+ time.sleep(0.05)
+ os.kill(pid, 0)
+ os.kill(pid, signal.SIGKILL)
+ except OSError, err:
+ if err.errno != errno.ESRCH:
+ raise
+ fp.close()
+except IOError:
+ pass
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/run-tests.py Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,1128 @@
+#!/usr/bin/env python
+#
+# run-tests.py - Run a set of tests on Mercurial
+#
+# Copyright 2006 Matt Mackall <mpm@selenic.com>
+#
+# This software may be used and distributed according to the terms of the
+# GNU General Public License version 2 or any later version.
+
+# Modifying this script is tricky because it has many modes:
+# - serial (default) vs parallel (-jN, N > 1)
+# - no coverage (default) vs coverage (-c, -C, -s)
+# - temp install (default) vs specific hg script (--with-hg, --local)
+# - tests are a mix of shell scripts and Python scripts
+#
+# If you change this script, it is recommended that you ensure you
+# haven't broken it by running it in various modes with a representative
+# sample of test scripts. For example:
+#
+# 1) serial, no coverage, temp install:
+# ./run-tests.py test-s*
+# 2) serial, no coverage, local hg:
+# ./run-tests.py --local test-s*
+# 3) serial, coverage, temp install:
+# ./run-tests.py -c test-s*
+# 4) serial, coverage, local hg:
+# ./run-tests.py -c --local test-s* # unsupported
+# 5) parallel, no coverage, temp install:
+# ./run-tests.py -j2 test-s*
+# 6) parallel, no coverage, local hg:
+# ./run-tests.py -j2 --local test-s*
+# 7) parallel, coverage, temp install:
+# ./run-tests.py -j2 -c test-s* # currently broken
+# 8) parallel, coverage, local install:
+# ./run-tests.py -j2 -c --local test-s* # unsupported (and broken)
+# 9) parallel, custom tmp dir:
+# ./run-tests.py -j2 --tmpdir /tmp/myhgtests
+#
+# (You could use any subset of the tests: test-s* happens to match
+# enough that it's worth doing parallel runs, few enough that it
+# completes fairly quickly, includes both shell and Python scripts, and
+# includes some scripts that run daemon processes.)
+
+from distutils import version
+import difflib
+import errno
+import optparse
+import os
+import shutil
+import subprocess
+import signal
+import sys
+import tempfile
+import time
+import re
+
+closefds = os.name == 'posix'
+def Popen4(cmd, bufsize=-1):
+ p = subprocess.Popen(cmd, shell=True, bufsize=bufsize,
+ close_fds=closefds,
+ stdin=subprocess.PIPE, stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT)
+ p.fromchild = p.stdout
+ p.tochild = p.stdin
+ p.childerr = p.stderr
+ return p
+
+# reserved exit code to skip test (used by hghave)
+SKIPPED_STATUS = 80
+SKIPPED_PREFIX = 'skipped: '
+FAILED_PREFIX = 'hghave check failed: '
+PYTHON = sys.executable
+IMPL_PATH = 'PYTHONPATH'
+if 'java' in sys.platform:
+ IMPL_PATH = 'JYTHONPATH'
+
+requiredtools = ["python", "diff", "grep", "sed"]
+
+defaults = {
+ 'jobs': ('HGTEST_JOBS', 1),
+ 'timeout': ('HGTEST_TIMEOUT', 180),
+ 'port': ('HGTEST_PORT', 20059),
+}
+
+def parseargs():
+ parser = optparse.OptionParser("%prog [options] [tests]")
+
+ # keep these sorted
+ parser.add_option("--blacklist", action="append",
+ help="skip tests listed in the specified blacklist file")
+ parser.add_option("-C", "--annotate", action="store_true",
+ help="output files annotated with coverage")
+ parser.add_option("--child", type="int",
+ help="run as child process, summary to given fd")
+ parser.add_option("-c", "--cover", action="store_true",
+ help="print a test coverage report")
+ parser.add_option("-d", "--debug", action="store_true",
+ help="debug mode: write output of test scripts to console"
+ " rather than capturing and diff'ing it (disables timeout)")
+ parser.add_option("-f", "--first", action="store_true",
+ help="exit on the first test failure")
+ parser.add_option("--inotify", action="store_true",
+ help="enable inotify extension when running tests")
+ parser.add_option("-i", "--interactive", action="store_true",
+ help="prompt to accept changed output")
+ parser.add_option("-j", "--jobs", type="int",
+ help="number of jobs to run in parallel"
+ " (default: $%s or %d)" % defaults['jobs'])
+ parser.add_option("--keep-tmpdir", action="store_true",
+ help="keep temporary directory after running tests")
+ parser.add_option("-k", "--keywords",
+ help="run tests matching keywords")
+ parser.add_option("-l", "--local", action="store_true",
+ help="shortcut for --with-hg=<testdir>/../hg")
+ parser.add_option("-n", "--nodiff", action="store_true",
+ help="skip showing test changes")
+ parser.add_option("-p", "--port", type="int",
+ help="port on which servers should listen"
+ " (default: $%s or %d)" % defaults['port'])
+ parser.add_option("--pure", action="store_true",
+ help="use pure Python code instead of C extensions")
+ parser.add_option("-R", "--restart", action="store_true",
+ help="restart at last error")
+ parser.add_option("-r", "--retest", action="store_true",
+ help="retest failed tests")
+ parser.add_option("-S", "--noskips", action="store_true",
+ help="don't report skip tests verbosely")
+ parser.add_option("-t", "--timeout", type="int",
+ help="kill errant tests after TIMEOUT seconds"
+ " (default: $%s or %d)" % defaults['timeout'])
+ parser.add_option("--tmpdir", type="string",
+ help="run tests in the given temporary directory"
+ " (implies --keep-tmpdir)")
+ parser.add_option("-v", "--verbose", action="store_true",
+ help="output verbose messages")
+ parser.add_option("--view", type="string",
+ help="external diff viewer")
+ parser.add_option("--with-hg", type="string",
+ metavar="HG",
+ help="test using specified hg script rather than a "
+ "temporary installation")
+ parser.add_option("-3", "--py3k-warnings", action="store_true",
+ help="enable Py3k warnings on Python 2.6+")
+
+ for option, default in defaults.items():
+ defaults[option] = int(os.environ.get(*default))
+ parser.set_defaults(**defaults)
+ (options, args) = parser.parse_args()
+
+ # jython is always pure
+ if 'java' in sys.platform or '__pypy__' in sys.modules:
+ options.pure = True
+
+ if options.with_hg:
+ if not (os.path.isfile(options.with_hg) and
+ os.access(options.with_hg, os.X_OK)):
+ parser.error('--with-hg must specify an executable hg script')
+ if not os.path.basename(options.with_hg) == 'hg':
+ sys.stderr.write('warning: --with-hg should specify an hg script')
+ if options.local:
+ testdir = os.path.dirname(os.path.realpath(sys.argv[0]))
+ hgbin = os.path.join(os.path.dirname(testdir), 'hg')
+ if not os.access(hgbin, os.X_OK):
+ parser.error('--local specified, but %r not found or not executable'
+ % hgbin)
+ options.with_hg = hgbin
+
+ options.anycoverage = options.cover or options.annotate
+ if options.anycoverage:
+ try:
+ import coverage
+ covver = version.StrictVersion(coverage.__version__).version
+ if covver < (3, 3):
+ parser.error('coverage options require coverage 3.3 or later')
+ except ImportError:
+ parser.error('coverage options now require the coverage package')
+
+ if options.anycoverage and options.local:
+ # this needs some path mangling somewhere, I guess
+ parser.error("sorry, coverage options do not work when --local "
+ "is specified")
+
+ global vlog
+ if options.verbose:
+ if options.jobs > 1 or options.child is not None:
+ pid = "[%d]" % os.getpid()
+ else:
+ pid = None
+ def vlog(*msg):
+ if pid:
+ print pid,
+ for m in msg:
+ print m,
+ print
+ sys.stdout.flush()
+ else:
+ vlog = lambda *msg: None
+
+ if options.tmpdir:
+ options.tmpdir = os.path.expanduser(options.tmpdir)
+
+ if options.jobs < 1:
+ parser.error('--jobs must be positive')
+ if options.interactive and options.jobs > 1:
+ print '(--interactive overrides --jobs)'
+ options.jobs = 1
+ if options.interactive and options.debug:
+ parser.error("-i/--interactive and -d/--debug are incompatible")
+ if options.debug:
+ if options.timeout != defaults['timeout']:
+ sys.stderr.write(
+ 'warning: --timeout option ignored with --debug\n')
+ options.timeout = 0
+ if options.py3k_warnings:
+ if sys.version_info[:2] < (2, 6) or sys.version_info[:2] >= (3, 0):
+ parser.error('--py3k-warnings can only be used on Python 2.6+')
+ if options.blacklist:
+ blacklist = dict()
+ for filename in options.blacklist:
+ try:
+ path = os.path.expanduser(os.path.expandvars(filename))
+ f = open(path, "r")
+ except IOError, err:
+ if err.errno != errno.ENOENT:
+ raise
+ print "warning: no such blacklist file: %s" % filename
+ continue
+
+ for line in f.readlines():
+ line = line.strip()
+ if line and not line.startswith('#'):
+ blacklist[line] = filename
+
+ f.close()
+
+ options.blacklist = blacklist
+
+ return (options, args)
+
+def rename(src, dst):
+ """Like os.rename(), trade atomicity and opened files friendliness
+ for existing destination support.
+ """
+ shutil.copy(src, dst)
+ os.remove(src)
+
+def splitnewlines(text):
+ '''like str.splitlines, but only split on newlines.
+ keep line endings.'''
+ i = 0
+ lines = []
+ while True:
+ n = text.find('\n', i)
+ if n == -1:
+ last = text[i:]
+ if last:
+ lines.append(last)
+ return lines
+ lines.append(text[i:n + 1])
+ i = n + 1
+
+def parsehghaveoutput(lines):
+ '''Parse hghave log lines.
+ Return tuple of lists (missing, failed):
+ * the missing/unknown features
+ * the features for which existence check failed'''
+ missing = []
+ failed = []
+ for line in lines:
+ if line.startswith(SKIPPED_PREFIX):
+ line = line.splitlines()[0]
+ missing.append(line[len(SKIPPED_PREFIX):])
+ elif line.startswith(FAILED_PREFIX):
+ line = line.splitlines()[0]
+ failed.append(line[len(FAILED_PREFIX):])
+
+ return missing, failed
+
+def showdiff(expected, output, ref, err):
+ try:
+ for line in difflib.unified_diff(expected, output, ref, err):
+ sys.stdout.write(line)
+ except IOError, ex:
+ print >>sys.stderr, 'BORKEN PIPE', ex.errno
+ pass
+
+def findprogram(program):
+ """Search PATH for a executable program"""
+ for p in os.environ.get('PATH', os.defpath).split(os.pathsep):
+ name = os.path.join(p, program)
+ if os.access(name, os.X_OK):
+ return name
+ return None
+
+def checktools():
+ # Before we go any further, check for pre-requisite tools
+ # stuff from coreutils (cat, rm, etc) are not tested
+ for p in requiredtools:
+ if os.name == 'nt':
+ p += '.exe'
+ found = findprogram(p)
+ if found:
+ vlog("# Found prerequisite", p, "at", found)
+ else:
+ print "WARNING: Did not find prerequisite tool: "+p
+
+def killdaemons():
+ # Kill off any leftover daemon processes
+ try:
+ fp = open(DAEMON_PIDS)
+ for line in fp:
+ try:
+ pid = int(line)
+ except ValueError:
+ continue
+ try:
+ os.kill(pid, 0)
+ vlog('# Killing daemon process %d' % pid)
+ os.kill(pid, signal.SIGTERM)
+ time.sleep(0.25)
+ os.kill(pid, 0)
+ vlog('# Daemon process %d is stuck - really killing it' % pid)
+ os.kill(pid, signal.SIGKILL)
+ except OSError, err:
+ if err.errno != errno.ESRCH:
+ raise
+ fp.close()
+ os.unlink(DAEMON_PIDS)
+ except IOError:
+ pass
+
+def cleanup(options):
+ if not options.keep_tmpdir:
+ vlog("# Cleaning up HGTMP", HGTMP)
+ shutil.rmtree(HGTMP, True)
+
+def usecorrectpython():
+ # some tests run python interpreter. they must use same
+ # interpreter we use or bad things will happen.
+ exedir, exename = os.path.split(sys.executable)
+ if exename == 'python':
+ path = findprogram('python')
+ if os.path.dirname(path) == exedir:
+ return
+ vlog('# Making python executable in test path use correct Python')
+ mypython = os.path.join(BINDIR, 'python')
+ try:
+ os.symlink(sys.executable, mypython)
+ except AttributeError:
+ # windows fallback
+ shutil.copyfile(sys.executable, mypython)
+ shutil.copymode(sys.executable, mypython)
+
+def installhg(options):
+ vlog("# Performing temporary installation of HG")
+ installerrs = os.path.join("tests", "install.err")
+ pure = options.pure and "--pure" or ""
+
+ # Run installer in hg root
+ script = os.path.realpath(sys.argv[0])
+ hgroot = os.path.dirname(os.path.dirname(script))
+ os.chdir(hgroot)
+ nohome = '--home=""'
+ if os.name == 'nt':
+ # The --home="" trick works only on OS where os.sep == '/'
+ # because of a distutils convert_path() fast-path. Avoid it at
+ # least on Windows for now, deal with .pydistutils.cfg bugs
+ # when they happen.
+ nohome = ''
+ cmd = ('%s setup.py %s clean --all'
+ ' build --build-base="%s"'
+ ' install --force --prefix="%s" --install-lib="%s"'
+ ' --install-scripts="%s" %s >%s 2>&1'
+ % (sys.executable, pure, os.path.join(HGTMP, "build"),
+ INST, PYTHONDIR, BINDIR, nohome, installerrs))
+ vlog("# Running", cmd)
+ if os.system(cmd) == 0:
+ if not options.verbose:
+ os.remove(installerrs)
+ else:
+ f = open(installerrs)
+ for line in f:
+ print line,
+ f.close()
+ sys.exit(1)
+ os.chdir(TESTDIR)
+
+ usecorrectpython()
+
+ vlog("# Installing dummy diffstat")
+ f = open(os.path.join(BINDIR, 'diffstat'), 'w')
+ f.write('#!' + sys.executable + '\n'
+ 'import sys\n'
+ 'files = 0\n'
+ 'for line in sys.stdin:\n'
+ ' if line.startswith("diff "):\n'
+ ' files += 1\n'
+ 'sys.stdout.write("files patched: %d\\n" % files)\n')
+ f.close()
+ os.chmod(os.path.join(BINDIR, 'diffstat'), 0700)
+
+ if options.py3k_warnings and not options.anycoverage:
+ vlog("# Updating hg command to enable Py3k Warnings switch")
+ f = open(os.path.join(BINDIR, 'hg'), 'r')
+ lines = [line.rstrip() for line in f]
+ lines[0] += ' -3'
+ f.close()
+ f = open(os.path.join(BINDIR, 'hg'), 'w')
+ for line in lines:
+ f.write(line + '\n')
+ f.close()
+
+ if options.anycoverage:
+ custom = os.path.join(TESTDIR, 'sitecustomize.py')
+ target = os.path.join(PYTHONDIR, 'sitecustomize.py')
+ vlog('# Installing coverage trigger to %s' % target)
+ shutil.copyfile(custom, target)
+ rc = os.path.join(TESTDIR, '.coveragerc')
+ vlog('# Installing coverage rc to %s' % rc)
+ os.environ['COVERAGE_PROCESS_START'] = rc
+ fn = os.path.join(INST, '..', '.coverage')
+ os.environ['COVERAGE_FILE'] = fn
+
+def outputcoverage(options):
+
+ vlog('# Producing coverage report')
+ os.chdir(PYTHONDIR)
+
+ def covrun(*args):
+ cmd = 'coverage %s' % ' '.join(args)
+ vlog('# Running: %s' % cmd)
+ os.system(cmd)
+
+ if options.child:
+ return
+
+ covrun('-c')
+ omit = ','.join([BINDIR, TESTDIR])
+ covrun('-i', '-r', '"--omit=%s"' % omit) # report
+ if options.annotate:
+ adir = os.path.join(TESTDIR, 'annotated')
+ if not os.path.isdir(adir):
+ os.mkdir(adir)
+ covrun('-i', '-a', '"--directory=%s"' % adir, '"--omit=%s"' % omit)
+
+class Timeout(Exception):
+ pass
+
+def alarmed(signum, frame):
+ raise Timeout
+
+def pytest(test, options, replacements):
+ py3kswitch = options.py3k_warnings and ' -3' or ''
+ cmd = '%s%s "%s"' % (PYTHON, py3kswitch, test)
+ vlog("# Running", cmd)
+ return run(cmd, options, replacements)
+
+def shtest(test, options, replacements):
+ cmd = '"%s"' % test
+ vlog("# Running", cmd)
+ return run(cmd, options, replacements)
+
+needescape = re.compile(r'[\x00-\x08\x0b-\x1f\x7f-\xff]').search
+escapesub = re.compile(r'[\x00-\x08\x0b-\x1f\\\x7f-\xff]').sub
+escapemap = dict((chr(i), r'\x%02x' % i) for i in range(256))
+escapemap.update({'\\': '\\\\', '\r': r'\r'})
+def escapef(m):
+ return escapemap[m.group(0)]
+def stringescape(s):
+ return escapesub(escapef, s)
+
+def tsttest(test, options, replacements):
+ t = open(test)
+ out = []
+ script = []
+ salt = "SALT" + str(time.time())
+
+ pos = prepos = -1
+ after = {}
+ expected = {}
+ for n, l in enumerate(t):
+ if not l.endswith('\n'):
+ l += '\n'
+ if l.startswith(' $ '): # commands
+ after.setdefault(pos, []).append(l)
+ prepos = pos
+ pos = n
+ script.append('echo %s %s $?\n' % (salt, n))
+ script.append(l[4:])
+ elif l.startswith(' > '): # continuations
+ after.setdefault(prepos, []).append(l)
+ script.append(l[4:])
+ elif l.startswith(' '): # results
+ # queue up a list of expected results
+ expected.setdefault(pos, []).append(l[2:])
+ else:
+ # non-command/result - queue up for merged output
+ after.setdefault(pos, []).append(l)
+
+ t.close()
+
+ script.append('echo %s %s $?\n' % (salt, n + 1))
+
+ fd, name = tempfile.mkstemp(suffix='hg-tst')
+
+ try:
+ for l in script:
+ os.write(fd, l)
+ os.close(fd)
+
+ cmd = '/bin/sh "%s"' % name
+ vlog("# Running", cmd)
+ exitcode, output = run(cmd, options, replacements)
+ # do not merge output if skipped, return hghave message instead
+ # similarly, with --debug, output is None
+ if exitcode == SKIPPED_STATUS or output is None:
+ return exitcode, output
+ finally:
+ os.remove(name)
+
+ def rematch(el, l):
+ try:
+ # ensure that the regex matches to the end of the string
+ return re.match(el + r'\Z', l)
+ except re.error:
+ # el is an invalid regex
+ return False
+
+ def globmatch(el, l):
+ # The only supported special characters are * and ?. Escaping is
+ # supported.
+ i, n = 0, len(el)
+ res = ''
+ while i < n:
+ c = el[i]
+ i += 1
+ if c == '\\' and el[i] in '*?\\':
+ res += el[i - 1:i + 1]
+ i += 1
+ elif c == '*':
+ res += '.*'
+ elif c == '?':
+ res += '.'
+ else:
+ res += re.escape(c)
+ return rematch(res, l)
+
+ pos = -1
+ postout = []
+ ret = 0
+ for n, l in enumerate(output):
+ lout, lcmd = l, None
+ if salt in l:
+ lout, lcmd = l.split(salt, 1)
+
+ if lout:
+ if lcmd:
+ lout += ' (no-eol)\n'
+
+ el = None
+ if pos in expected and expected[pos]:
+ el = expected[pos].pop(0)
+
+ if el == lout: # perfect match (fast)
+ postout.append(" " + lout)
+ elif (el and
+ (el.endswith(" (re)\n") and rematch(el[:-6] + '\n', lout) or
+ el.endswith(" (glob)\n") and globmatch(el[:-8] + '\n', lout)
+ or el.endswith(" (esc)\n") and
+ el.decode('string-escape') == l)):
+ postout.append(" " + el) # fallback regex/glob/esc match
+ else:
+ if needescape(lout):
+ lout = stringescape(lout.rstrip('\n')) + " (esc)\n"
+ postout.append(" " + lout) # let diff deal with it
+
+ if lcmd:
+ # add on last return code
+ ret = int(lcmd.split()[1])
+ if ret != 0:
+ postout.append(" [%s]\n" % ret)
+ if pos in after:
+ postout += after.pop(pos)
+ pos = int(lcmd.split()[0])
+
+ if pos in after:
+ postout += after.pop(pos)
+
+ return exitcode, postout
+
+wifexited = getattr(os, "WIFEXITED", lambda x: False)
+def run(cmd, options, replacements):
+ """Run command in a sub-process, capturing the output (stdout and stderr).
+ Return a tuple (exitcode, output). output is None in debug mode."""
+ # TODO: Use subprocess.Popen if we're running on Python 2.4
+ if options.debug:
+ proc = subprocess.Popen(cmd, shell=True)
+ ret = proc.wait()
+ return (ret, None)
+
+ if os.name == 'nt' or sys.platform.startswith('java'):
+ tochild, fromchild = os.popen4(cmd)
+ tochild.close()
+ output = fromchild.read()
+ ret = fromchild.close()
+ if ret is None:
+ ret = 0
+ else:
+ proc = Popen4(cmd)
+ def cleanup():
+ os.kill(proc.pid, signal.SIGTERM)
+ ret = proc.wait()
+ if ret == 0:
+ ret = signal.SIGTERM << 8
+ killdaemons()
+ return ret
+
+ try:
+ output = ''
+ proc.tochild.close()
+ output = proc.fromchild.read()
+ ret = proc.wait()
+ if wifexited(ret):
+ ret = os.WEXITSTATUS(ret)
+ except Timeout:
+ vlog('# Process %d timed out - killing it' % proc.pid)
+ ret = cleanup()
+ output += ("\n### Abort: timeout after %d seconds.\n"
+ % options.timeout)
+ except KeyboardInterrupt:
+ vlog('# Handling keyboard interrupt')
+ cleanup()
+ raise
+
+ for s, r in replacements:
+ output = re.sub(s, r, output)
+ return ret, splitnewlines(output)
+
+def runone(options, test, skips, fails):
+ '''tristate output:
+ None -> skipped
+ True -> passed
+ False -> failed'''
+
+ def skip(msg):
+ if not options.verbose:
+ skips.append((test, msg))
+ else:
+ print "\nSkipping %s: %s" % (testpath, msg)
+ return None
+
+ def fail(msg):
+ fails.append((test, msg))
+ if not options.nodiff:
+ print "\nERROR: %s %s" % (testpath, msg)
+ return None
+
+ vlog("# Test", test)
+
+ # create a fresh hgrc
+ hgrc = open(HGRCPATH, 'w+')
+ hgrc.write('[ui]\n')
+ hgrc.write('slash = True\n')
+ hgrc.write('[defaults]\n')
+ hgrc.write('backout = -d "0 0"\n')
+ hgrc.write('commit = -d "0 0"\n')
+ hgrc.write('tag = -d "0 0"\n')
+ if options.inotify:
+ hgrc.write('[extensions]\n')
+ hgrc.write('inotify=\n')
+ hgrc.write('[inotify]\n')
+ hgrc.write('pidfile=%s\n' % DAEMON_PIDS)
+ hgrc.write('appendpid=True\n')
+ hgrc.close()
+
+ testpath = os.path.join(TESTDIR, test)
+ ref = os.path.join(TESTDIR, test+".out")
+ err = os.path.join(TESTDIR, test+".err")
+ if os.path.exists(err):
+ os.remove(err) # Remove any previous output files
+ try:
+ tf = open(testpath)
+ firstline = tf.readline().rstrip()
+ tf.close()
+ except:
+ firstline = ''
+ lctest = test.lower()
+
+ if lctest.endswith('.py') or firstline == '#!/usr/bin/env python':
+ runner = pytest
+ elif lctest.endswith('.t'):
+ runner = tsttest
+ ref = testpath
+ else:
+ # do not try to run non-executable programs
+ if not os.access(testpath, os.X_OK):
+ return skip("not executable")
+ runner = shtest
+
+ # Make a tmp subdirectory to work in
+ testtmp = os.environ["TESTTMP"] = os.path.join(HGTMP, test)
+ os.mkdir(testtmp)
+ os.chdir(testtmp)
+
+ if options.timeout > 0:
+ signal.alarm(options.timeout)
+
+ ret, out = runner(testpath, options, [
+ (re.escape(testtmp), '$TESTTMP'),
+ (r':%s\b' % options.port, ':$HGPORT'),
+ (r':%s\b' % (options.port + 1), ':$HGPORT1'),
+ (r':%s\b' % (options.port + 2), ':$HGPORT2'),
+ ])
+ vlog("# Ret was:", ret)
+
+ if options.timeout > 0:
+ signal.alarm(0)
+
+ mark = '.'
+
+ skipped = (ret == SKIPPED_STATUS)
+
+ # If we're not in --debug mode and reference output file exists,
+ # check test output against it.
+ if options.debug:
+ refout = None # to match "out is None"
+ elif os.path.exists(ref):
+ f = open(ref, "r")
+ refout = splitnewlines(f.read())
+ f.close()
+ else:
+ refout = []
+
+ if (ret != 0 or out != refout) and not skipped and not options.debug:
+ # Save errors to a file for diagnosis
+ f = open(err, "wb")
+ for line in out:
+ f.write(line)
+ f.close()
+
+ if skipped:
+ mark = 's'
+ if out is None: # debug mode: nothing to parse
+ missing = ['unknown']
+ failed = None
+ else:
+ missing, failed = parsehghaveoutput(out)
+ if not missing:
+ missing = ['irrelevant']
+ if failed:
+ fail("hghave failed checking for %s" % failed[-1])
+ skipped = False
+ else:
+ skip(missing[-1])
+ elif out != refout:
+ mark = '!'
+ if ret:
+ fail("output changed and returned error code %d" % ret)
+ else:
+ fail("output changed")
+ if not options.nodiff:
+ if options.view:
+ os.system("%s %s %s" % (options.view, ref, err))
+ else:
+ showdiff(refout, out, ref, err)
+ ret = 1
+ elif ret:
+ mark = '!'
+ fail("returned error code %d" % ret)
+
+ if not options.verbose:
+ try:
+ sys.stdout.write(mark)
+ sys.stdout.flush()
+ except IOError, ex:
+ print >>sys.stderr, 'BORKEN PIPE', ex.errno
+ pass
+
+ killdaemons()
+
+ os.chdir(TESTDIR)
+ if not options.keep_tmpdir:
+ shutil.rmtree(testtmp, True)
+ if skipped:
+ return None
+ return ret == 0
+
+_hgpath = None
+
+def _gethgpath():
+ """Return the path to the mercurial package that is actually found by
+ the current Python interpreter."""
+ global _hgpath
+ if _hgpath is not None:
+ return _hgpath
+
+ cmd = '%s -c "import mercurial; print mercurial.__path__[0]"'
+ pipe = os.popen(cmd % PYTHON)
+ try:
+ _hgpath = pipe.read().strip()
+ finally:
+ pipe.close()
+ return _hgpath
+
+def _checkhglib(verb):
+ """Ensure that the 'mercurial' package imported by python is
+ the one we expect it to be. If not, print a warning to stderr."""
+ expecthg = os.path.join(PYTHONDIR, 'mercurial')
+ actualhg = _gethgpath()
+ if actualhg != expecthg:
+ sys.stderr.write('warning: %s with unexpected mercurial lib: %s\n'
+ ' (expected %s)\n'
+ % (verb, actualhg, expecthg))
+
+def runchildren(options, tests):
+ if INST:
+ installhg(options)
+ _checkhglib("Testing")
+
+ optcopy = dict(options.__dict__)
+ optcopy['jobs'] = 1
+ del optcopy['blacklist']
+ if optcopy['with_hg'] is None:
+ optcopy['with_hg'] = os.path.join(BINDIR, "hg")
+ optcopy.pop('anycoverage', None)
+
+ opts = []
+ for opt, value in optcopy.iteritems():
+ name = '--' + opt.replace('_', '-')
+ if value is True:
+ opts.append(name)
+ elif value is not None:
+ opts.append(name + '=' + str(value))
+
+ tests.reverse()
+ jobs = [[] for j in xrange(options.jobs)]
+ while tests:
+ for job in jobs:
+ if not tests:
+ break
+ job.append(tests.pop())
+ fps = {}
+
+ for j, job in enumerate(jobs):
+ if not job:
+ continue
+ rfd, wfd = os.pipe()
+ childopts = ['--child=%d' % wfd, '--port=%d' % (options.port + j * 3)]
+ childtmp = os.path.join(HGTMP, 'child%d' % j)
+ childopts += ['--tmpdir', childtmp]
+ cmdline = [PYTHON, sys.argv[0]] + opts + childopts + job
+ vlog(' '.join(cmdline))
+ fps[os.spawnvp(os.P_NOWAIT, cmdline[0], cmdline)] = os.fdopen(rfd, 'r')
+ os.close(wfd)
+ signal.signal(signal.SIGINT, signal.SIG_IGN)
+ failures = 0
+ tested, skipped, failed = 0, 0, 0
+ skips = []
+ fails = []
+ while fps:
+ pid, status = os.wait()
+ fp = fps.pop(pid)
+ l = fp.read().splitlines()
+ try:
+ test, skip, fail = map(int, l[:3])
+ except ValueError:
+ test, skip, fail = 0, 0, 0
+ split = -fail or len(l)
+ for s in l[3:split]:
+ skips.append(s.split(" ", 1))
+ for s in l[split:]:
+ fails.append(s.split(" ", 1))
+ tested += test
+ skipped += skip
+ failed += fail
+ vlog('pid %d exited, status %d' % (pid, status))
+ failures |= status
+ print
+ if not options.noskips:
+ for s in skips:
+ print "Skipped %s: %s" % (s[0], s[1])
+ for s in fails:
+ print "Failed %s: %s" % (s[0], s[1])
+
+ _checkhglib("Tested")
+ print "# Ran %d tests, %d skipped, %d failed." % (
+ tested, skipped, failed)
+
+ if options.anycoverage:
+ outputcoverage(options)
+ sys.exit(failures != 0)
+
+def runtests(options, tests):
+ global DAEMON_PIDS, HGRCPATH
+ DAEMON_PIDS = os.environ["DAEMON_PIDS"] = os.path.join(HGTMP, 'daemon.pids')
+ HGRCPATH = os.environ["HGRCPATH"] = os.path.join(HGTMP, '.hgrc')
+
+ try:
+ if INST:
+ installhg(options)
+ _checkhglib("Testing")
+
+ if options.timeout > 0:
+ try:
+ signal.signal(signal.SIGALRM, alarmed)
+ vlog('# Running each test with %d second timeout' %
+ options.timeout)
+ except AttributeError:
+ print 'WARNING: cannot run tests with timeouts'
+ options.timeout = 0
+
+ tested = 0
+ failed = 0
+ skipped = 0
+
+ if options.restart:
+ orig = list(tests)
+ while tests:
+ if os.path.exists(tests[0] + ".err"):
+ break
+ tests.pop(0)
+ if not tests:
+ print "running all tests"
+ tests = orig
+
+ skips = []
+ fails = []
+
+ for test in tests:
+ if options.blacklist:
+ filename = options.blacklist.get(test)
+ if filename is not None:
+ skips.append((test, "blacklisted (%s)" % filename))
+ skipped += 1
+ continue
+
+ if options.retest and not os.path.exists(test + ".err"):
+ skipped += 1
+ continue
+
+ if options.keywords:
+ fp = open(test)
+ t = fp.read().lower() + test.lower()
+ fp.close()
+ for k in options.keywords.lower().split():
+ if k in t:
+ break
+ else:
+ skipped += 1
+ continue
+
+ ret = runone(options, test, skips, fails)
+ if ret is None:
+ skipped += 1
+ elif not ret:
+ if options.interactive:
+ print "Accept this change? [n] ",
+ answer = sys.stdin.readline().strip()
+ if answer.lower() in "y yes".split():
+ if test.endswith(".t"):
+ rename(test + ".err", test)
+ else:
+ rename(test + ".err", test + ".out")
+ tested += 1
+ fails.pop()
+ continue
+ failed += 1
+ if options.first:
+ break
+ tested += 1
+
+ if options.child:
+ fp = os.fdopen(options.child, 'w')
+ fp.write('%d\n%d\n%d\n' % (tested, skipped, failed))
+ for s in skips:
+ fp.write("%s %s\n" % s)
+ for s in fails:
+ fp.write("%s %s\n" % s)
+ fp.close()
+ else:
+ print
+ for s in skips:
+ print "Skipped %s: %s" % s
+ for s in fails:
+ print "Failed %s: %s" % s
+ _checkhglib("Tested")
+ print "# Ran %d tests, %d skipped, %d failed." % (
+ tested, skipped, failed)
+
+ if options.anycoverage:
+ outputcoverage(options)
+ except KeyboardInterrupt:
+ failed = True
+ print "\ninterrupted!"
+
+ if failed:
+ sys.exit(1)
+
+def main():
+ (options, args) = parseargs()
+ if not options.child:
+ os.umask(022)
+
+ checktools()
+
+ if len(args) == 0:
+ args = os.listdir(".")
+ args.sort()
+
+ tests = []
+ skipped = []
+ for test in args:
+ if (test.startswith("test-") and '~' not in test and
+ ('.' not in test or test.endswith('.py') or
+ test.endswith('.bat') or test.endswith('.t'))):
+ if not os.path.exists(test):
+ skipped.append(test)
+ else:
+ tests.append(test)
+ if not tests:
+ for test in skipped:
+ print 'Skipped %s: does not exist' % test
+ print "# Ran 0 tests, %d skipped, 0 failed." % len(skipped)
+ return
+ tests = tests + skipped
+
+ # Reset some environment variables to well-known values so that
+ # the tests produce repeatable output.
+ os.environ['LANG'] = os.environ['LC_ALL'] = os.environ['LANGUAGE'] = 'C'
+ os.environ['TZ'] = 'GMT'
+ os.environ["EMAIL"] = "Foo Bar <foo.bar@example.com>"
+ os.environ['CDPATH'] = ''
+ os.environ['COLUMNS'] = '80'
+ os.environ['GREP_OPTIONS'] = ''
+ os.environ['http_proxy'] = ''
+
+ # unset env related to hooks
+ for k in os.environ.keys():
+ if k.startswith('HG_'):
+ # can't remove on solaris
+ os.environ[k] = ''
+ del os.environ[k]
+
+ global TESTDIR, HGTMP, INST, BINDIR, PYTHONDIR, COVERAGE_FILE
+ TESTDIR = os.environ["TESTDIR"] = os.getcwd()
+ if options.tmpdir:
+ options.keep_tmpdir = True
+ tmpdir = options.tmpdir
+ if os.path.exists(tmpdir):
+ # Meaning of tmpdir has changed since 1.3: we used to create
+ # HGTMP inside tmpdir; now HGTMP is tmpdir. So fail if
+ # tmpdir already exists.
+ sys.exit("error: temp dir %r already exists" % tmpdir)
+
+ # Automatically removing tmpdir sounds convenient, but could
+ # really annoy anyone in the habit of using "--tmpdir=/tmp"
+ # or "--tmpdir=$HOME".
+ #vlog("# Removing temp dir", tmpdir)
+ #shutil.rmtree(tmpdir)
+ os.makedirs(tmpdir)
+ else:
+ tmpdir = tempfile.mkdtemp('', 'hgtests.')
+ HGTMP = os.environ['HGTMP'] = os.path.realpath(tmpdir)
+ DAEMON_PIDS = None
+ HGRCPATH = None
+
+ os.environ["HGEDITOR"] = sys.executable + ' -c "import sys; sys.exit(0)"'
+ os.environ["HGMERGE"] = "internal:merge"
+ os.environ["HGUSER"] = "test"
+ os.environ["HGENCODING"] = "ascii"
+ os.environ["HGENCODINGMODE"] = "strict"
+ os.environ["HGPORT"] = str(options.port)
+ os.environ["HGPORT1"] = str(options.port + 1)
+ os.environ["HGPORT2"] = str(options.port + 2)
+
+ if options.with_hg:
+ INST = None
+ BINDIR = os.path.dirname(os.path.realpath(options.with_hg))
+
+ # This looks redundant with how Python initializes sys.path from
+ # the location of the script being executed. Needed because the
+ # "hg" specified by --with-hg is not the only Python script
+ # executed in the test suite that needs to import 'mercurial'
+ # ... which means it's not really redundant at all.
+ PYTHONDIR = BINDIR
+ else:
+ INST = os.path.join(HGTMP, "install")
+ BINDIR = os.environ["BINDIR"] = os.path.join(INST, "bin")
+ PYTHONDIR = os.path.join(INST, "lib", "python")
+
+ os.environ["BINDIR"] = BINDIR
+ os.environ["PYTHON"] = PYTHON
+
+ if not options.child:
+ path = [BINDIR] + os.environ["PATH"].split(os.pathsep)
+ os.environ["PATH"] = os.pathsep.join(path)
+
+ # Include TESTDIR in PYTHONPATH so that out-of-tree extensions
+ # can run .../tests/run-tests.py test-foo where test-foo
+ # adds an extension to HGRC
+ pypath = [PYTHONDIR, TESTDIR]
+ # We have to augment PYTHONPATH, rather than simply replacing
+ # it, in case external libraries are only available via current
+ # PYTHONPATH. (In particular, the Subversion bindings on OS X
+ # are in /opt/subversion.)
+ oldpypath = os.environ.get(IMPL_PATH)
+ if oldpypath:
+ pypath.append(oldpypath)
+ os.environ[IMPL_PATH] = os.pathsep.join(pypath)
+
+ COVERAGE_FILE = os.path.join(TESTDIR, ".coverage")
+
+ vlog("# Using TESTDIR", TESTDIR)
+ vlog("# Using HGTMP", HGTMP)
+ vlog("# Using PATH", os.environ["PATH"])
+ vlog("# Using", IMPL_PATH, os.environ[IMPL_PATH])
+
+ try:
+ if len(tests) > 1 and options.jobs > 1:
+ runchildren(options, tests)
+ else:
+ runtests(options, tests)
+ finally:
+ time.sleep(1)
+ cleanup(options)
+
+if __name__ == '__main__':
+ main()
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-amend.t Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,83 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [defaults]
+ > amend=-d "0 0"
+ > [extensions]
+ > hgext.rebase=
+ > hgext.graphlog=
+ > EOF
+ $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+
+ $ glog() {
+ > hg glog --template '{rev}@{branch}({phase}) {desc|firstline}\n' "$@"
+ > }
+
+ $ hg init repo --traceback
+ $ cd repo
+ $ echo a > a
+ $ hg ci -Am adda
+ adding a
+
+Test amend captures branches
+
+ $ hg branch foo
+ marked working directory as branch foo
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg amend
+ $ hg debugobsolete
+ 07f4944404050f47db2e5c5071e0e84e7a27bba9 6a022cbb61d5ba0f03f98ff2d36319dfea1034ae 0 {'date': '* *', 'user': 'test'} (glob)
+ b2e32ffb533cbe1d5759638c0cd4e8abc43b2738 0 {'date': '* *', 'user': 'test'} (glob)
+ $ hg branch
+ foo
+ $ hg branches
+ foo 2:6a022cbb61d5
+ $ glog
+ @ 2@foo(draft) adda
+
+Test no-op
+
+ $ hg amend
+ nothing changed
+ [1]
+ $ glog
+ @ 2@foo(draft) adda
+
+
+Test forcing the message to the same value, no intermediate revision.
+
+ $ hg amend -m 'adda'
+ nothing changed
+ [1]
+ $ glog
+ @ 2@foo(draft) adda
+
+
+Test collapsing into an existing revision, no intermediate revision.
+
+ $ echo a >> a
+ $ hg ci -m changea
+ $ echo a > a
+ $ hg status
+ M a
+ $ hg pstatus
+ $ hg diff
+ diff -r f7a50201fe3a a
+ --- a/a Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a * +0000 (glob)
+ @@ -1,2 +1,1 @@
+ a
+ -a
+ $ hg pdiff
+ $ hg ci -m reseta
+ $ hg debugobsolete
+ 07f4944404050f47db2e5c5071e0e84e7a27bba9 6a022cbb61d5ba0f03f98ff2d36319dfea1034ae 0 {'date': '* *', 'user': 'test'} (glob)
+ b2e32ffb533cbe1d5759638c0cd4e8abc43b2738 0 {'date': '* *', 'user': 'test'} (glob)
+ $ hg phase 2
+ 2: draft
+ $ glog
+ @ 4@foo(draft) reseta
+ |
+ o 3@foo(draft) changea
+ |
+ o 2@foo(draft) adda
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-corrupt.t Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,122 @@
+
+ $ cat >> $HGRCPATH <<EOF
+ > [defaults]
+ > amend=-d "0 0"
+ > [web]
+ > push_ssl = false
+ > allow_push = *
+ > [phases]
+ > publish = False
+ > [alias]
+ > qlog = log --template='{rev} - {node|short} {desc} ({phase})\n'
+ > [diff]
+ > git = 1
+ > unified = 0
+ > [extensions]
+ > hgext.rebase=
+ > hgext.graphlog=
+ > EOF
+ $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+ $ mkcommit() {
+ > echo "$1" >> "$1"
+ > hg add "$1"
+ > hg ci -m "add $1"
+ > }
+
+ $ hg init local
+ $ hg init other
+ $ cd local
+ $ touch 1 2 3 4 5 6 7 8 9 0
+ $ hg add 1 2 3 4 5 6 7 8 9 0
+ $ mkcommit A
+ $ mkcommit B
+ $ mkcommit C
+ $ hg glog
+ @ changeset: 2:829b19580856
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add C
+ |
+ o changeset: 1:97b8f02ab29e
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add B
+ |
+ o changeset: 0:5d8dabd3961b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add A
+
+ $ hg push ../other
+ pushing to ../other
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 13 changes to 13 files
+
+
+ $ hg -R ../other verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 13 files, 3 changesets, 13 total revisions
+ $ mkcommit D
+ $ mkcommit E
+ $ hg up -q .^^
+ $ hg revert -r tip -a -q
+ $ hg ci -m 'coin' -q
+ $ hg glog
+ @ changeset: 5:8313a6afebbb
+ | tag: tip
+ | parent: 2:829b19580856
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: coin
+ |
+ | o changeset: 4:076ec8ade1ac
+ | | user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | summary: add E
+ | |
+ | o changeset: 3:824d9bb109f6
+ |/ user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add D
+ |
+ o changeset: 2:829b19580856
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add C
+ |
+ o changeset: 1:97b8f02ab29e
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add B
+ |
+ o changeset: 0:5d8dabd3961b
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add A
+
+
+ $ hg kill -n -1 -- -2 -3
+ 2 changesets pruned
+ $ hg push ../other
+ pushing to ../other
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 2 changes to 2 files
+ $ hg -R ../other verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 15 files, 4 changesets, 15 total revisions
+
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-drop.t Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,267 @@
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > hgext.rebase=
+ > hgext.graphlog=
+ > EOF
+ $ echo "drophack=$(echo $(dirname $TESTDIR))/hgext/drophack.py" >> $HGRCPATH
+ $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+ $ mkcommit() {
+ > echo "$1" > "$1"
+ > hg add "$1"
+ > hg ci -m "add $1"
+ > }
+ $ summary() {
+ > echo ============ graph ==============
+ > hg log -G
+ > echo ============ hidden =============
+ > hg log --hidden -G
+ > echo ============ obsmark ============
+ > hg debugobsolete
+ > }
+
+
+ $ hg init repo
+ $ cd repo
+ $ mkcommit base
+
+drop a single changeset without any rewrite
+================================================
+
+
+ $ mkcommit simple-single
+ $ summary
+ ============ graph ==============
+ @ changeset: 1:d4e7845543ff
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add simple-single
+ |
+ o changeset: 0:b4952fcf48cf
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add base
+
+ ============ hidden =============
+ @ changeset: 1:d4e7845543ff
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add simple-single
+ |
+ o changeset: 0:b4952fcf48cf
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add base
+
+ ============ obsmark ============
+ $ hg drop .
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ working directory now at b4952fcf48cf
+ search obsmarker: wall * comb * user * sys * (glob)
+ 0 obsmarkers found
+ search nodes: wall * comb * user * sys * (glob)
+ 1 nodes found
+ saved backup bundle to $TESTTMP/repo/.hg/strip-backup/d4e7845543ff-drophack.hg
+ strip nodes: wall * comb * user * sys * (glob)
+ $ summary
+ ============ graph ==============
+ @ changeset: 0:b4952fcf48cf
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add base
+
+ ============ hidden =============
+ @ changeset: 0:b4952fcf48cf
+ tag: tip
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add base
+
+ ============ obsmark ============
+
+Try to drop a changeset with children
+================================================
+
+ $ mkcommit parent
+ $ mkcommit child
+ $ summary
+ ============ graph ==============
+ @ changeset: 2:34b6c051bf1f
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add child
+ |
+ o changeset: 1:19509a42b0d0
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add parent
+ |
+ o changeset: 0:b4952fcf48cf
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add base
+
+ ============ hidden =============
+ @ changeset: 2:34b6c051bf1f
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add child
+ |
+ o changeset: 1:19509a42b0d0
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add parent
+ |
+ o changeset: 0:b4952fcf48cf
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add base
+
+ ============ obsmark ============
+ $ hg drop 1
+ cannot drop revision with children (no-eol)
+ [1]
+ $ summary
+ ============ graph ==============
+ @ changeset: 2:34b6c051bf1f
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add child
+ |
+ o changeset: 1:19509a42b0d0
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add parent
+ |
+ o changeset: 0:b4952fcf48cf
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add base
+
+ ============ hidden =============
+ @ changeset: 2:34b6c051bf1f
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add child
+ |
+ o changeset: 1:19509a42b0d0
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add parent
+ |
+ o changeset: 0:b4952fcf48cf
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add base
+
+ ============ obsmark ============
+
+Try to drop a public changeset
+================================================
+
+ $ hg phase --public 2
+ $ hg drop 2
+ cannot drop public revision (no-eol)
+ [1]
+
+
+Try to drop a changeset with rewrite
+================================================
+
+ $ hg phase --force --draft 2
+ $ echo babar >> child
+ $ hg commit --amend
+ $ summary
+ ============ graph ==============
+ @ changeset: 4:a2c06c884bfe
+ | tag: tip
+ | parent: 1:19509a42b0d0
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add child
+ |
+ o changeset: 1:19509a42b0d0
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add parent
+ |
+ o changeset: 0:b4952fcf48cf
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add base
+
+ ============ hidden =============
+ @ changeset: 4:a2c06c884bfe
+ | tag: tip
+ | parent: 1:19509a42b0d0
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add child
+ |
+ | x changeset: 3:87ea30a976fd
+ | | user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | summary: temporary amend commit for 34b6c051bf1f
+ | |
+ | x changeset: 2:34b6c051bf1f
+ |/ user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add child
+ |
+ o changeset: 1:19509a42b0d0
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add parent
+ |
+ o changeset: 0:b4952fcf48cf
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add base
+
+ ============ obsmark ============
+ 34b6c051bf1f78db6aef400776de5cb964470207 a2c06c884bfe53d3840026248bd8a7eafa152df8 0 {'date': '* *', 'user': 'test'} (glob)
+ 87ea30a976fdf235bf096f04899cb02a903873e2 0 {'date': '* *', 'user': 'test'} (glob)
+ $ hg drop .
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ working directory now at 19509a42b0d0
+ search obsmarker: wall * comb * user * sys * (glob)
+ 1 obsmarkers found
+ search nodes: wall * comb * user * sys * (glob)
+ 2 nodes found
+ strip obsmarker: wall * comb * user * sys * (glob)
+ saved backup bundle to $TESTTMP/repo/.hg/strip-backup/a2c06c884bfe-drophack.hg (glob)
+ strip nodes: wall * comb * user * sys * (glob)
+ $ summary
+ ============ graph ==============
+ @ changeset: 1:19509a42b0d0
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add parent
+ |
+ o changeset: 0:b4952fcf48cf
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add base
+
+ ============ hidden =============
+ @ changeset: 1:19509a42b0d0
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add parent
+ |
+ o changeset: 0:b4952fcf48cf
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add base
+
+ ============ obsmark ============
+ 87ea30a976fdf235bf096f04899cb02a903873e2 0 {'date': '* *', 'user': 'test'} (glob)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-evolve.t Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,647 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [defaults]
+ > amend=-d "0 0"
+ > [web]
+ > push_ssl = false
+ > allow_push = *
+ > [phases]
+ > publish = False
+ > [alias]
+ > qlog = log --template='{rev} - {node|short} {desc} ({phase})\n'
+ > [diff]
+ > git = 1
+ > unified = 0
+ > [extensions]
+ > hgext.rebase=
+ > hgext.graphlog=
+ > EOF
+ $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+ $ mkcommit() {
+ > echo "$1" > "$1"
+ > hg add "$1"
+ > hg ci -m "add $1"
+ > }
+
+ $ glog() {
+ > hg glog --template '{rev}:{node|short}@{branch}({phase}) {desc|firstline}\n' "$@"
+ > }
+
+various init
+
+ $ hg init local
+ $ cd local
+ $ mkcommit a
+ $ mkcommit b
+ $ cat >> .hg/hgrc << EOF
+ > [phases]
+ > publish = True
+ > EOF
+ $ hg pull -q . # make 1 public
+ $ rm .hg/hgrc
+ $ mkcommit c
+ $ mkcommit d
+ $ hg up 1
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ mkcommit e -q
+ created new head
+ $ mkcommit f
+ $ hg qlog
+ 5 - e44648563c73 add f (draft)
+ 4 - fbb94e3a0ecf add e (draft)
+ 3 - 47d2a3944de8 add d (draft)
+ 2 - 4538525df7e2 add c (draft)
+ 1 - 7c3bad9141dc add b (public)
+ 0 - 1f0dee641bb7 add a (public)
+
+test kill and immutable changeset
+
+ $ hg log -r 1 --template '{rev} {phase} {obsolete}\n'
+ 1 public stable
+ $ hg kill 1
+ abort: cannot prune immutable changeset: 7c3bad9141dc
+ (see "hg help phases" for details)
+ [255]
+ $ hg log -r 1 --template '{rev} {phase} {obsolete}\n'
+ 1 public stable
+
+test simple kill
+
+ $ hg id -n
+ 5
+ $ hg kill .
+ 1 changesets pruned
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ working directory now at fbb94e3a0ecf
+ $ hg qlog
+ 4 - fbb94e3a0ecf add e (draft)
+ 3 - 47d2a3944de8 add d (draft)
+ 2 - 4538525df7e2 add c (draft)
+ 1 - 7c3bad9141dc add b (public)
+ 0 - 1f0dee641bb7 add a (public)
+
+test multiple kill
+
+ $ hg kill 4 -r 3
+ 2 changesets pruned
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ working directory now at 7c3bad9141dc
+ $ hg qlog
+ 2 - 4538525df7e2 add c (draft)
+ 1 - 7c3bad9141dc add b (public)
+ 0 - 1f0dee641bb7 add a (public)
+
+test kill with dirty changes
+
+ $ hg up 2
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo 4 > g
+ $ hg add g
+ $ hg kill .
+ 1 changesets pruned
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ working directory now at 7c3bad9141dc
+ $ hg st
+ A g
+ $ cd ..
+
+##########################
+importing Parren test
+##########################
+
+ $ cat << EOF >> $HGRCPATH
+ > [ui]
+ > logtemplate = "{rev}\t{bookmarks}: {desc|firstline} - {author|user}\n"
+ > EOF
+
+Creating And Updating Changeset
+===============================
+
+Setup the Base Repo
+-------------------
+
+We start with a plain base repo::
+
+ $ hg init main; cd main
+ $ cat >main-file-1 <<-EOF
+ > One
+ >
+ > Two
+ >
+ > Three
+ > EOF
+ $ echo Two >main-file-2
+ $ hg add
+ adding main-file-1
+ adding main-file-2
+ $ hg commit --message base
+ $ cd ..
+
+and clone this into a new repo where we do our work::
+
+ $ hg clone main work
+ updating to branch default
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cd work
+
+
+Create First Patch
+------------------
+
+To begin with, we just do the changes that will be the initial version of the changeset::
+
+ $ echo One >file-from-A
+ $ sed -i'' -e s/One/Eins/ main-file-1
+ $ hg add file-from-A
+
+So this is what we would like our changeset to be::
+
+ $ hg diff
+ diff --git a/file-from-A b/file-from-A
+ new file mode 100644
+ --- /dev/null
+ +++ b/file-from-A
+ @@ -0,0 +1,1 @@
+ +One
+ diff --git a/main-file-1 b/main-file-1
+ --- a/main-file-1
+ +++ b/main-file-1
+ @@ -1,1 +1,1 @@
+ -One
+ +Eins
+
+To commit it we just - commit it::
+
+ $ hg commit --message "a nifty feature"
+
+and place a bookmark so we can easily refer to it again (which we could have done before the commit)::
+
+ $ hg book feature-A
+
+
+Create Second Patch
+-------------------
+
+Let's do this again for the second changeset::
+
+ $ echo Two >file-from-B
+ $ sed -i'' -e s/Two/Zwie/ main-file-1
+ $ hg add file-from-B
+
+Before committing, however, we need to switch to a new bookmark for the second
+changeset. Otherwise we would inadvertently move the bookmark for our first changeset.
+It is therefore advisable to always set the bookmark before committing::
+
+ $ hg book feature-B
+ $ hg commit --message "another feature"
+
+So here we are::
+
+ $ hg book
+ feature-A 1:568a468b60fc
+ * feature-B 2:7b36850622b2
+
+
+Fix The Second Patch
+--------------------
+
+There's a typo in feature-B. We spelled *Zwie* instead of *Zwei*::
+
+ $ hg diff --change tip | grep -F Zwie
+ +Zwie
+
+Fixing this is very easy. Just change::
+
+ $ sed -i'' -e s/Zwie/Zwei/ main-file-1
+
+and **amend**::
+
+ $ hg amend
+
+This results in a new single changeset for our amended changeset, and the old
+changeset plus the updating changeset are hidden from view by default::
+
+ $ hg log
+ 4 feature-B: another feature - test
+ 1 feature-A: a nifty feature - test
+ 0 : base - test
+
+ $ hg up feature-A -q
+ $ hg bookmark -i feature-A
+ $ sed -i'' -e s/Eins/Un/ main-file-1
+
+(amend of public changeset denied)
+
+ $ hg phase --public 0 -v
+ phase changed for 1 changesets
+
+
+(amend of on ancestors)
+
+ $ hg amend
+ 1 new unstable changesets
+ $ hg log
+ 6 feature-A: a nifty feature - test
+ 4 feature-B: another feature - test
+ 1 : a nifty feature - test
+ 0 : base - test
+ $ hg up -q 0
+ $ glog --hidden
+ o 6:ba0ec09b1bab@default(draft) a nifty feature
+ |
+ | x 5:c296b79833d1@default(draft) temporary amend commit for 568a468b60fc
+ | |
+ | | o 4:207cbc4ea7fe@default(draft) another feature
+ | |/
+ | | x 3:5bb880fc0f12@default(draft) temporary amend commit for 7b36850622b2
+ | | |
+ | | x 2:7b36850622b2@default(draft) another feature
+ | |/
+ | x 1:568a468b60fc@default(draft) a nifty feature
+ |/
+ @ 0:e55e0562ee93@default(public) base
+
+ $ hg debugobsolete
+ 7b36850622b2fd159fa30a4fb2a1edd2043b4a14 207cbc4ea7fee30d18b3a25f534fe5db22c6071b 0 {'date': '* *', 'user': 'test'} (glob)
+ 5bb880fc0f12dd61eee6de36f62b93fdbc3684b0 0 {'date': '* *', 'user': 'test'} (glob)
+ 568a468b60fc99a42d5d4ddbe181caff1eef308d ba0ec09b1babf3489b567853807f452edd46704f 0 {'date': '* *', 'user': 'test'} (glob)
+ c296b79833d1d497f33144786174bf35e04e44a3 0 {'date': '* *', 'user': 'test'} (glob)
+ $ hg evolve
+ move:[4] another feature
+ atop:[6] a nifty feature
+ merging main-file-1
+ $ hg log
+ 7 feature-B: another feature - test
+ 6 feature-A: a nifty feature - test
+ 0 : base - test
+
+Test commit -o options
+
+ $ hg up 6
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg revert -r 7 --all
+ adding file-from-B
+ reverting main-file-1
+ $ sed -i'' -e s/Zwei/deux/ main-file-1
+ $ hg commit -m 'another feature that rox' -o 7
+ created new head
+ $ hg log
+ 8 feature-B: another feature that rox - test
+ 6 feature-A: a nifty feature - test
+ 0 : base - test
+
+phase change turning obsolete changeset public issue a bumped warning
+
+ $ hg phase --hidden --public 7
+ 1 new bumped changesets
+
+all solving bumped troubled
+
+ $ hg glog
+ @ 8 feature-B: another feature that rox - test
+ |
+ | o 7 : another feature - test
+ |/
+ o 6 feature-A: a nifty feature - test
+ |
+ o 0 : base - test
+
+ $ hg evolve --any --traceback
+ recreate:[8] another feature that rox
+ atop:[7] another feature
+ computing new diff
+ commited as ca3b75e3e59b
+ $ hg glog
+ @ 9 feature-B: bumped update to abe98aeaaa35: - test
+ |
+ o 7 : another feature - test
+ |
+ o 6 feature-A: a nifty feature - test
+ |
+ o 0 : base - test
+
+ $ hg diff --hidden -r 9 -r 8
+ $ hg diff -r 9^ -r 9
+ diff --git a/main-file-1 b/main-file-1
+ --- a/main-file-1
+ +++ b/main-file-1
+ @@ -3,1 +3,1 @@
+ -Zwei
+ +deux
+ $ hg log -r 'bumped()' # no more bumped
+
+test evolve --all
+ $ sed -i'' -e s/deux/to/ main-file-1
+ $ hg commit -m 'dansk 2!'
+ $ sed -i'' -e s/Three/tre/ main-file-1
+ $ hg commit -m 'dansk 3!'
+ $ hg update 9
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ sed -i'' -e s/Un/Én/ main-file-1
+ $ hg commit --amend -m 'dansk!'
+ 2 new unstable changesets
+
+ $ hg evolve --all --traceback
+ move:[10] dansk 2!
+ atop:[13] dansk!
+ merging main-file-1
+ move:[11] dansk 3!
+ atop:[14] dansk 2!
+ merging main-file-1
+ $ hg glog
+ @ 15 : dansk 3! - test
+ |
+ o 14 : dansk 2! - test
+ |
+ o 13 feature-B: dansk! - test
+ |
+ o 7 : another feature - test
+ |
+ o 6 feature-A: a nifty feature - test
+ |
+ o 0 : base - test
+
+
+ $ cd ..
+
+enable general delta
+
+ $ cat << EOF >> $HGRCPATH
+ > [format]
+ > generaldelta=1
+ > EOF
+
+
+
+ $ hg init alpha
+ $ cd alpha
+ $ echo 'base' > firstfile
+ $ hg add firstfile
+ $ hg ci -m 'base'
+
+ $ cd ..
+ $ hg clone -Ur 0 alpha beta
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ $ cd alpha
+
+ $ cat << EOF > A
+ > We
+ > need
+ > some
+ > kind
+ > of
+ > file
+ > big
+ > enough
+ > to
+ > prevent
+ > snapshot
+ > .
+ > yes
+ > new
+ > lines
+ > are
+ > useless
+ > .
+ > EOF
+ $ hg add A
+ $ hg commit -m 'adding A'
+ $ hg mv A B
+ $ echo '.' >> B
+ $ hg amend -m 'add B'
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 3 files, 4 changesets, 4 total revisions
+ $ hg --config extensions.hgext.mq= strip 'extinct()'
+ abort: empty revision set
+ [255]
+ $ hg --config extensions.hgext.mq= strip --hidden 'extinct()'
+ saved backup bundle to $TESTTMP/alpha/.hg/strip-backup/e87767087a57-backup.hg
+ $ hg verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 2 files, 2 changesets, 2 total revisions
+ $ cd ..
+
+Clone just this branch
+
+ $ cd beta
+ $ hg pull -r tip ../alpha
+ pulling from ../alpha
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ (run 'hg update' to get a working copy)
+ $ hg up
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ cd ..
+
+Test graft --obsolete/--old-obsolete
+
+ $ hg init test-graft
+ $ cd test-graft
+ $ mkcommit 0
+ $ mkcommit 1
+ $ mkcommit 2
+ $ mkcommit 3
+ $ hg up -qC 0
+ $ mkcommit 4
+ created new head
+ $ glog --hidden
+ @ 4:ce341209337f@default(draft) add 4
+ |
+ | o 3:0e84df4912da@default(draft) add 3
+ | |
+ | o 2:db038628b9e5@default(draft) add 2
+ | |
+ | o 1:73d38bb17fd7@default(draft) add 1
+ |/
+ o 0:8685c6d34325@default(draft) add 0
+
+ $ hg graft -r3 -O
+ grafting revision 3
+ $ hg graft -r1 -o 2
+ grafting revision 1
+ $ glog --hidden
+ @ 6:acb28cd497b7@default(draft) add 1
+ |
+ o 5:0b9e50c35132@default(draft) add 3
+ |
+ o 4:ce341209337f@default(draft) add 4
+ |
+ | x 3:0e84df4912da@default(draft) add 3
+ | |
+ | x 2:db038628b9e5@default(draft) add 2
+ | |
+ | o 1:73d38bb17fd7@default(draft) add 1
+ |/
+ o 0:8685c6d34325@default(draft) add 0
+
+ $ hg debugobsolete
+ 0e84df4912da4c7cad22a3b4fcfd58ddfb7c8ae9 0b9e50c35132ff548ec0065caea6a87e1ebcef32 0 {'date': '* *', 'user': 'test'} (glob)
+ db038628b9e56f51a454c0da0c508df247b41748 acb28cd497b7f8767e01ef70f68697a959573c2d 0 {'date': '* *', 'user': 'test'} (glob)
+
+Test graft --continue
+
+ $ hg up -qC 0
+ $ echo 2 > 1
+ $ hg ci -Am conflict 1
+ created new head
+ $ hg up -qC 6
+ $ hg graft -O 7
+ grafting revision 7
+ merging 1
+ warning: conflicts during merge.
+ merging 1 incomplete! (edit conflicts, then use 'hg resolve --mark')
+ abort: unresolved conflicts, can't continue
+ (use hg resolve and hg graft --continue)
+ [255]
+ $ hg log -r7 --template '{rev}:{node|short} {obsolete}\n'
+ 7:a5bfd90a2f29 stable
+ $ echo 3 > 1
+ $ hg resolve -m 1
+ $ hg graft --continue -O
+ grafting revision 7
+ $ glog --hidden
+ @ 8:920e58bb443b@default(draft) conflict
+ |
+ | x 7:a5bfd90a2f29@default(draft) conflict
+ | |
+ o | 6:acb28cd497b7@default(draft) add 1
+ | |
+ o | 5:0b9e50c35132@default(draft) add 3
+ | |
+ o | 4:ce341209337f@default(draft) add 4
+ |/
+ | x 3:0e84df4912da@default(draft) add 3
+ | |
+ | x 2:db038628b9e5@default(draft) add 2
+ | |
+ | o 1:73d38bb17fd7@default(draft) add 1
+ |/
+ o 0:8685c6d34325@default(draft) add 0
+
+ $ hg debugobsolete
+ 0e84df4912da4c7cad22a3b4fcfd58ddfb7c8ae9 0b9e50c35132ff548ec0065caea6a87e1ebcef32 0 {'date': '* *', 'user': 'test'} (glob)
+ db038628b9e56f51a454c0da0c508df247b41748 acb28cd497b7f8767e01ef70f68697a959573c2d 0 {'date': '* *', 'user': 'test'} (glob)
+ a5bfd90a2f29c7ccb8f917ff4e5013a9053d0a04 920e58bb443b73eea9d6d65570b4241051ea3229 0 {'date': '* *', 'user': 'test'} (glob)
+
+Test touch
+
+ $ glog
+ @ 8:920e58bb443b@default(draft) conflict
+ |
+ o 6:acb28cd497b7@default(draft) add 1
+ |
+ o 5:0b9e50c35132@default(draft) add 3
+ |
+ o 4:ce341209337f@default(draft) add 4
+ |
+ | o 1:73d38bb17fd7@default(draft) add 1
+ |/
+ o 0:8685c6d34325@default(draft) add 0
+
+ $ hg touch
+ $ glog
+ @ 9:*@default(draft) conflict (glob)
+ |
+ o 6:acb28cd497b7@default(draft) add 1
+ |
+ o 5:0b9e50c35132@default(draft) add 3
+ |
+ o 4:ce341209337f@default(draft) add 4
+ |
+ | o 1:73d38bb17fd7@default(draft) add 1
+ |/
+ o 0:8685c6d34325@default(draft) add 0
+
+ $ hg touch .
+ $ glog
+ @ 10:*@default(draft) conflict (glob)
+ |
+ o 6:acb28cd497b7@default(draft) add 1
+ |
+ o 5:0b9e50c35132@default(draft) add 3
+ |
+ o 4:ce341209337f@default(draft) add 4
+ |
+ | o 1:73d38bb17fd7@default(draft) add 1
+ |/
+ o 0:8685c6d34325@default(draft) add 0
+
+
+Test fold
+
+ $ rm *.orig
+ $ hg fold
+ no revision to fold
+ [1]
+ $ hg fold 6 --rev 10
+ abort: cannot specify both --rev and a target revision
+ [255]
+ $ hg fold 6 # want to run hg fold 6
+ 2 changesets folded
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ glog
+ @ 11:*@default(draft) add 1 (glob)
+ |
+ o 5:0b9e50c35132@default(draft) add 3
+ |
+ o 4:ce341209337f@default(draft) add 4
+ |
+ | o 1:73d38bb17fd7@default(draft) add 1
+ |/
+ o 0:8685c6d34325@default(draft) add 0
+
+ $ hg log -r 11 --template '{desc}\n'
+ add 1
+
+
+ conflict
+ $ hg debugrebuildstate
+ $ hg st
+
+Test fold with wc parent is not the head of the folded revision
+
+ $ hg up 4
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ $ hg fold --rev 4::11
+ 3 changesets folded
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ glog
+ @ 12:*@default(draft) add 4 (glob)
+ |
+ | o 1:73d38bb17fd7@default(draft) add 1
+ |/
+ o 0:8685c6d34325@default(draft) add 0
+
+ $ hg log -r 12 --template '{desc}\n'
+ add 4
+
+
+ add 3
+
+
+ add 1
+
+
+ conflict
+ $ hg debugrebuildstate
+ $ hg st
+
+Test olog
+
+ $ hg olog
+ 4 : add 4 - test
+ 5 : add 3 - test
+ 11 : add 1 - test
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-obsolete-push.t Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,47 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [defaults]
+ > amend=-d "0 0"
+ > [extensions]
+ > hgext.rebase=
+ > hgext.graphlog=
+ > EOF
+ $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+
+ $ template='{rev}:{node|short}@{branch}({obsolete}/{phase}) {desc|firstline}\n'
+ $ glog() {
+ > hg glog --template "$template" "$@"
+ > }
+
+Test outgoing, common A is suspended, B unstable and C secret, remote
+has A and B, neither A or C should be in outgoing.
+
+ $ hg init source
+ $ cd source
+ $ echo a > a
+ $ hg ci -qAm A a
+ $ echo b > b
+ $ hg ci -qAm B b
+ $ hg up 0
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo c > c
+ $ hg ci -qAm C c
+ $ hg phase --secret --force .
+ $ hg kill 0 1
+ 2 changesets pruned
+ 1 new unstable changesets
+ $ glog --hidden
+ @ 2:244232c2222a@default(unstable/secret) C
+ |
+ | x 1:6c81ed0049f8@default(extinct/draft) B
+ |/
+ x 0:1994f17a630e@default(suspended/draft) A
+
+ $ hg init ../clone
+ $ cat > ../clone/.hg/hgrc <<EOF
+ > [phases]
+ > publish = false
+ > EOF
+ $ hg outgoing ../clone --template "$template"
+ comparing with ../clone
+ searching for changes
+ 0:1994f17a630e@default(suspended/draft) A
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-obsolete.t Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,689 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [web]
+ > push_ssl = false
+ > allow_push = *
+ > [phases]
+ > publish=False
+ > [extensions]
+ > hgext.rebase=
+ > EOF
+ $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+ $ mkcommit() {
+ > echo "$1" > "$1"
+ > hg add "$1"
+ > hg ci -m "add $1"
+ > }
+ $ getid() {
+ > hg id --hidden --debug -ir "$1"
+ > }
+
+ $ alias qlog="hg log --template='{rev}\n- {node|short}\n'"
+ $ hg init local
+ $ cd local
+ $ mkcommit a # 0
+ $ hg phase -p .
+ $ mkcommit b # 1
+ $ mkcommit c # 2
+ $ hg up 1
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ mkcommit obsol_c # 3
+ created new head
+ $ getid 2
+ 4538525df7e2b9f09423636c61ef63a4cb872a2d
+ $ getid 3
+ 0d3f46688ccc6e756c7e96cf64c391c411309597
+ $ hg debugobsolete 4538525df7e2b9f09423636c61ef63a4cb872a2d 0d3f46688ccc6e756c7e96cf64c391c411309597
+ $ hg debugobsolete
+ 4538525df7e2b9f09423636c61ef63a4cb872a2d 0d3f46688ccc6e756c7e96cf64c391c411309597 0 {'date': '', 'user': 'test'} (glob)
+
+
+Test hidden() revset
+
+ $ qlog -r 'hidden()' --hidden
+ 2
+ - 4538525df7e2
+
+Test that obsolete changeset are hidden
+
+ $ qlog
+ 3
+ - 0d3f46688ccc
+ 1
+ - 7c3bad9141dc
+ 0
+ - 1f0dee641bb7
+ $ qlog --hidden
+ 3
+ - 0d3f46688ccc
+ 2
+ - 4538525df7e2
+ 1
+ - 7c3bad9141dc
+ 0
+ - 1f0dee641bb7
+ $ qlog -r 'obsolete()' --hidden
+ 2
+ - 4538525df7e2
+
+Test that obsolete parent a properly computed
+
+ $ qlog -r 'precursors(.)' --hidden
+ 2
+ - 4538525df7e2
+ $ qlog -r .
+ 3
+ - 0d3f46688ccc
+ $ hg odiff
+ diff -r 4538525df7e2 -r 0d3f46688ccc c
+ --- a/c Thu Jan 01 00:00:00 1970 +0000
+ +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,1 +0,0 @@
+ -c
+ diff -r 4538525df7e2 -r 0d3f46688ccc obsol_c
+ --- /dev/null Thu Jan 01 00:00:00 1970 +0000
+ +++ b/obsol_c Thu Jan 01 00:00:00 1970 +0000
+ @@ -0,0 +1,1 @@
+ +obsol_c
+
+Test that obsolete successors a properly computed
+
+ $ qlog -r 'successors(2)' --hidden
+ 3
+ - 0d3f46688ccc
+
+test obsolete changeset with no-obsolete descendant
+ $ hg up 1 -q
+ $ mkcommit "obsol_c'" # 4 (on 1)
+ created new head
+ $ hg debugobsolete `getid 3` `getid 4`
+ $ qlog
+ 4
+ - 725c380fe99b
+ 1
+ - 7c3bad9141dc
+ 0
+ - 1f0dee641bb7
+ $ qlog -r 'obsolete()' --hidden
+ 2
+ - 4538525df7e2
+ 3
+ - 0d3f46688ccc
+ $ qlog -r 'allprecursors(4)' --hidden
+ 2
+ - 4538525df7e2
+ 3
+ - 0d3f46688ccc
+ $ qlog -r 'allsuccessors(2)' --hidden
+ 3
+ - 0d3f46688ccc
+ 4
+ - 725c380fe99b
+ $ hg up --hidden 3 -q
+ working directory parent is obsolete!
+(reported by parents too)
+ $ hg parents
+ changeset: 3:0d3f46688ccc
+ parent: 1:7c3bad9141dc
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add obsol_c
+
+ working directory parent is obsolete!
+ $ mkcommit d # 5 (on 3)
+ 1 new unstable changesets
+ $ qlog -r 'obsolete()'
+ 3
+ - 0d3f46688ccc
+
+ $ qlog -r 'extinct()' --hidden
+ 2
+ - 4538525df7e2
+ $ qlog -r 'suspended()'
+ 3
+ - 0d3f46688ccc
+ $ qlog -r 'unstable()'
+ 5
+ - a7a6f2b5d8a5
+
+Test obsolete keyword
+
+ $ hg log -G --template '{rev}:{node|short}@{branch}({obsolete}/{phase}) {desc|firstline}\n' \
+ > --hidden
+ @ 5:a7a6f2b5d8a5@default(unstable/draft) add d
+ |
+ | o 4:725c380fe99b@default(stable/draft) add obsol_c'
+ | |
+ x | 3:0d3f46688ccc@default(suspended/draft) add obsol_c
+ |/
+ | x 2:4538525df7e2@default(extinct/draft) add c
+ |/
+ o 1:7c3bad9141dc@default(stable/draft) add b
+ |
+ o 0:1f0dee641bb7@default(stable/public) add a
+
+
+Test communication of obsolete relation with a compatible client
+
+ $ hg init ../other-new
+ $ hg phase --draft 'secret() - extinct()' # until we fix exclusion
+ abort: empty revision set
+ [255]
+ $ hg push ../other-new
+ pushing to ../other-new
+ searching for changes
+ abort: push includes unstable changeset: a7a6f2b5d8a5!
+ (use 'hg evolve' to get a stable history or --force to ignore warnings)
+ [255]
+ $ hg push -f ../other-new
+ pushing to ../other-new
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 5 changesets with 5 changes to 5 files (+1 heads)
+ $ hg -R ../other-new verify
+ checking changesets
+ checking manifests
+ crosschecking files in changesets and manifests
+ checking files
+ 5 files, 5 changesets, 5 total revisions
+ $ qlog -R ../other-new -r 'obsolete()'
+ 2
+ - 0d3f46688ccc
+ $ qlog -R ../other-new
+ 4
+ - a7a6f2b5d8a5
+ 3
+ - 725c380fe99b
+ 2
+ - 0d3f46688ccc
+ 1
+ - 7c3bad9141dc
+ 0
+ - 1f0dee641bb7
+ $ hg up --hidden 3 -q
+ working directory parent is obsolete!
+ $ mkcommit obsol_d # 6
+ created new head
+ 1 new unstable changesets
+ $ hg debugobsolete `getid 5` `getid 6`
+ $ qlog
+ 6
+ - 95de7fc6918d
+ 4
+ - 725c380fe99b
+ 3
+ - 0d3f46688ccc
+ 1
+ - 7c3bad9141dc
+ 0
+ - 1f0dee641bb7
+ $ qlog -r 'obsolete()'
+ 3
+ - 0d3f46688ccc
+ $ hg push ../other-new
+ pushing to ../other-new
+ searching for changes
+ abort: push includes unstable changeset: 95de7fc6918d!
+ (use 'hg evolve' to get a stable history or --force to ignore warnings)
+ [255]
+ $ hg push ../other-new -f # use f because there is unstability
+ pushing to ../other-new
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ $ qlog -R ../other-new
+ 5
+ - 95de7fc6918d
+ 3
+ - 725c380fe99b
+ 2
+ - 0d3f46688ccc
+ 1
+ - 7c3bad9141dc
+ 0
+ - 1f0dee641bb7
+ $ qlog -R ../other-new -r 'obsolete()'
+ 2
+ - 0d3f46688ccc
+
+Pushing again does not advertise extinct changeset
+
+ $ hg push ../other-new
+ pushing to ../other-new
+ searching for changes
+ no changes found
+ [1]
+
+ $ hg up --hidden -q .^ # 3
+ working directory parent is obsolete!
+ $ mkcommit "obsol_d'" # 7
+ created new head
+ 1 new unstable changesets
+ $ hg debugobsolete `getid 6` `getid 7`
+ $ hg pull -R ../other-new .
+ pulling from .
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to [12] files \(\+1 heads\) (re)
+ \(run 'hg heads( \.)?' to see heads, 'hg merge' to merge\) (re)
+ $ qlog -R ../other-new
+ 6
+ - 909a0fb57e5d
+ 3
+ - 725c380fe99b
+ 2
+ - 0d3f46688ccc
+ 1
+ - 7c3bad9141dc
+ 0
+ - 1f0dee641bb7
+
+pushing to stuff that doesn't support obsolete
+
+DISABLED. the _enable switch it global :-/
+
+.. $ hg init ../other-old
+.. > # XXX I don't like this but changeset get published otherwise
+.. > # remove it when we will get a --keep-state flag for push
+.. $ echo '[extensions]' > ../other-old/.hg/hgrc
+.. $ echo "obsolete=!$(echo $(dirname $TESTDIR))/obsolete.py" >> ../other-old/.hg/hgrc
+.. $ hg push ../other-old
+.. pushing to ../other-old
+.. searching for changes
+.. abort: push includes an unstable changeset: 909a0fb57e5d!
+.. (use 'hg evolve' to get a stable history or --force to ignore warnings)
+.. [255]
+.. $ hg push -f ../other-old
+.. pushing to ../other-old
+.. searching for changes
+.. adding changesets
+.. adding manifests
+.. adding file changes
+.. added 5 changesets with 5 changes to 5 files (+1 heads)
+.. $ qlog -R ../other-ol
+.. 4
+.. - 909a0fb57e5d
+.. 3
+.. - 725c380fe99b
+.. 2
+.. - 0d3f46688ccc
+.. 1
+.. - 7c3bad9141dc
+.. 0
+.. - 1f0dee641bb7
+
+clone support
+
+ $ hg clone . ../cloned
+ > # The warning should go away once we have default value to set ready before we pull
+ updating to branch default
+ 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+ $ qlog -R ../cloned --hidden
+ 7
+ - 909a0fb57e5d
+ 6
+ - 95de7fc6918d
+ 5
+ - a7a6f2b5d8a5
+ 4
+ - 725c380fe99b
+ 3
+ - 0d3f46688ccc
+ 2
+ - 4538525df7e2
+ 1
+ - 7c3bad9141dc
+ 0
+ - 1f0dee641bb7
+
+Test rollback support
+
+ $ hg up --hidden .^ -q # 3
+ working directory parent is obsolete!
+ $ mkcommit "obsol_d''"
+ created new head
+ 1 new unstable changesets
+ $ hg debugobsolete `getid 7` `getid 8`
+ $ cd ../other-new
+ $ hg up -q 3
+ $ hg pull ../local/
+ pulling from ../local/
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to [12] files \(\+1 heads\) (re)
+ \(run 'hg heads( \.)?' to see heads, 'hg merge' to merge\) (re)
+
+ $ hg up -q 7 # to check rollback update behavior
+ $ qlog
+ 7
+ - 159dfc9fa5d3
+ 3
+ - 725c380fe99b
+ 2
+ - 0d3f46688ccc
+ 1
+ - 7c3bad9141dc
+ 0
+ - 1f0dee641bb7
+ $ hg rollback
+ repository tip rolled back to revision 6 (undo pull)
+ working directory now based on revision 3
+ $ hg summary
+ parent: 3:725c380fe99b
+ add obsol_c'
+ branch: default
+ commit: 1 deleted, 2 unknown (clean)
+ update: 2 new changesets, 2 branch heads (merge)
+ unstable: 1 changesets
+ $ qlog
+ 6
+ - 909a0fb57e5d
+ 3
+ - 725c380fe99b
+ 2
+ - 0d3f46688ccc
+ 1
+ - 7c3bad9141dc
+ 0
+ - 1f0dee641bb7
+ $ cd ../local
+
+obsolete public changeset
+
+# move draft boundary from 0 to 1
+ $ sed -e 's/1f0dee641bb7258c56bd60e93edfa2405381c41e/7c3bad9141dcb46ff89abf5f61856facd56e476c/' -i'.back' .hg/store/phaseroots
+
+ $ hg up null
+ 0 files updated, 0 files merged, 4 files removed, 0 files unresolved
+ $ mkcommit toto # 9
+ created new head
+ $ hg id -n
+ 9
+ $ hg debugobsolete `getid 0` `getid 9`
+83b5778897ad try to obsolete immutable changeset 1f0dee641bb7
+# at core level the warning is not issued
+# this is now a big issue now that we have bumped warning
+ $ qlog -r 'obsolete()'
+ 3
+ - 0d3f46688ccc
+allow to just kill changeset
+
+ $ qlog
+ 9
+ - 83b5778897ad
+ 8
+ - 159dfc9fa5d3
+ 4
+ - 725c380fe99b
+ 3
+ - 0d3f46688ccc
+ 1
+ - 7c3bad9141dc
+ 0
+ - 1f0dee641bb7
+
+ $ hg debugobsolete `getid 9` #kill
+ $ hg up null -q # to be not based on 9 anymore
+ $ qlog
+ 8
+ - 159dfc9fa5d3
+ 4
+ - 725c380fe99b
+ 3
+ - 0d3f46688ccc
+ 1
+ - 7c3bad9141dc
+ 0
+ - 1f0dee641bb7
+
+Check that auto update ignore hidden changeset
+ $ hg up 0
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg up
+ 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg id -n
+ 8
+
+Check that named update do too
+
+ $ hg update default
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg id -n
+ 8
+
+ $ hg up null -q # to be not based on 9 anymore
+
+check rebase compat
+
+ $ hg log -G --template='{rev} - {node|short} {desc}\n'
+ o 8 - 159dfc9fa5d3 add obsol_d''
+ |
+ | o 4 - 725c380fe99b add obsol_c'
+ | |
+ x | 3 - 0d3f46688ccc add obsol_c
+ |/
+ o 1 - 7c3bad9141dc add b
+ |
+ o 0 - 1f0dee641bb7 add a
+
+
+ $ hg log -G --template='{rev} - {node|short}\n' --hidden
+ x 9 - 83b5778897ad
+
+ o 8 - 159dfc9fa5d3
+ |
+ | x 7 - 909a0fb57e5d
+ |/
+ | x 6 - 95de7fc6918d
+ |/
+ | x 5 - a7a6f2b5d8a5
+ |/
+ | o 4 - 725c380fe99b
+ | |
+ x | 3 - 0d3f46688ccc
+ |/
+ | x 2 - 4538525df7e2
+ |/
+ o 1 - 7c3bad9141dc
+ |
+ o 0 - 1f0dee641bb7
+
+
+should not rebase extinct changeset
+
+#excluded 'whole rebase set is extinct and ignored.' message not in core
+ $ hg rebase -b '3' -d 4 --traceback
+ 2 new divergent changesets
+ $ hg up tip
+ ? files updated, 0 files merged, 0 files removed, 0 files unresolved (glob)
+ $ hg log -G --template='{rev} - {node|short} {desc}\n'
+ @ 11 - 9468a5f5d8b2 add obsol_d''
+ |
+ o 10 - 2033b4e49474 add obsol_c
+ |
+ o 4 - 725c380fe99b add obsol_c'
+ |
+ o 1 - 7c3bad9141dc add b
+ |
+ o 0 - 1f0dee641bb7 add a
+
+
+Does not complain about new head if you obsolete the old one
+(re necesarry when we start runnind discovery on unfiltered repo in core)
+
+ $ hg push ../other-new --traceback
+ pushing to ../other-new
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 1 changes to [12] files (re)
+ $ hg up -q 10
+ $ mkcommit "obsol_d'''"
+ created new head
+ $ hg debugobsolete `getid 11` `getid 12`
+ $ hg push ../other-new --traceback
+ pushing to ../other-new
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ $ cd ..
+
+check bumped detection
+(make an obsolete changeset public)
+
+ $ cd local
+ $ hg phase --hidden --public 11
+ 1 new bumped changesets
+ $ hg log -G --template='{rev} - ({phase}) {node|short} {desc}\n'
+ @ 12 - (draft) 6db5e282cb91 add obsol_d'''
+ |
+ | o 11 - (public) 9468a5f5d8b2 add obsol_d''
+ |/
+ o 10 - (public) 2033b4e49474 add obsol_c
+ |
+ o 4 - (public) 725c380fe99b add obsol_c'
+ |
+ o 1 - (public) 7c3bad9141dc add b
+ |
+ o 0 - (public) 1f0dee641bb7 add a
+
+ $ hg log -r 'bumped()'
+ changeset: 12:6db5e282cb91
+ tag: tip
+ parent: 10:2033b4e49474
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add obsol_d'''
+
+ $ hg push ../other-new/
+ pushing to ../other-new/
+ searching for changes
+ abort: push includes bumped changeset: 6db5e282cb91!
+ (use 'hg evolve' to get a stable history or --force to ignore warnings)
+ [255]
+
+Check hg commit --amend compat
+
+ $ hg up 'desc(obsol_c)'
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ mkcommit f
+ created new head
+ $ echo 42 >> f
+ $ hg commit --amend --traceback --quiet
+ $ hg log -G
+ @ changeset: 15:705ab2a6b72e
+ | tag: tip
+ | parent: 10:2033b4e49474
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add f
+ |
+ | o changeset: 12:6db5e282cb91
+ |/ parent: 10:2033b4e49474
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add obsol_d'''
+ |
+ | o changeset: 11:9468a5f5d8b2
+ |/ user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add obsol_d''
+ |
+ o changeset: 10:2033b4e49474
+ | parent: 4:725c380fe99b
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add obsol_c
+ |
+ o changeset: 4:725c380fe99b
+ | parent: 1:7c3bad9141dc
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add obsol_c'
+ |
+ o changeset: 1:7c3bad9141dc
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add b
+ |
+ o changeset: 0:1f0dee641bb7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add a
+
+ $ hg debugobsolete | grep -v 33d458d86621f3186c40bfccd77652f4a122743e
+ 4538525df7e2b9f09423636c61ef63a4cb872a2d 0d3f46688ccc6e756c7e96cf64c391c411309597 0 {'date': '', 'user': 'test'} (glob)
+ 0d3f46688ccc6e756c7e96cf64c391c411309597 725c380fe99b5e76613493f0903e8d11ddc70d54 0 {'date': '', 'user': 'test'} (glob)
+ a7a6f2b5d8a54b81bc7aa2fba2934ad6d700a79e 95de7fc6918dea4c9c8d5382f50649794b474c4a 0 {'date': '', 'user': 'test'} (glob)
+ 95de7fc6918dea4c9c8d5382f50649794b474c4a 909a0fb57e5d909f353d89e394ffd7e0890fec88 0 {'date': '', 'user': 'test'} (glob)
+ 909a0fb57e5d909f353d89e394ffd7e0890fec88 159dfc9fa5d334d7e03a0aecfc7f7ab4c3431fea 0 {'date': '', 'user': 'test'} (glob)
+ 1f0dee641bb7258c56bd60e93edfa2405381c41e 83b5778897adafb967ef2f75be3aaa4fce49a4cc 0 {'date': '', 'user': 'test'} (glob)
+ 83b5778897adafb967ef2f75be3aaa4fce49a4cc 0 {'date': '', 'user': 'test'} (glob)
+ 0d3f46688ccc6e756c7e96cf64c391c411309597 2033b4e494742365851fac84d276640cbf52833e 0 {'date': '* *', 'user': 'test'} (glob)
+ 159dfc9fa5d334d7e03a0aecfc7f7ab4c3431fea 9468a5f5d8b2c5d91e17474e95ae4791e9718fdf 0 {'date': '* *', 'user': 'test'} (glob)
+ 9468a5f5d8b2c5d91e17474e95ae4791e9718fdf 6db5e282cb91df5c43ff1f1287c119ff83230d42 0 {'date': '', 'user': 'test'} (glob)
+ 0b1b6dd009c037985363e2290a0b579819f659db 705ab2a6b72e2cd86edb799ebe15f2695f86143e 0 {'date': '* *', 'user': 'test'} (glob)
+#no produced by 2.3
+33d458d86621f3186c40bfccd77652f4a122743e 3734a65252e69ddcced85901647a4f335d40de1e 0 {'date': '* *', 'user': 'test'} (glob)
+
+Check conflict detection
+
+ $ hg up 9468a5f5d8b2 # add obsol_d''
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ mkcommit "obsolet_conflicting_d"
+ $ hg summary
+ parent: 1[46]:50f11e5e3a63 tip (re)
+ add obsolet_conflicting_d
+ branch: default
+ commit: (clean)
+ update: (2|9|11) new changesets, (3|9|10) branch heads \(merge\) (re)
+ bumped: 1 changesets
+ $ hg debugobsolete `getid a7a6f2b5d8a5` `getid 50f11e5e3a63`
+ $ hg log -r 'conflicting()'
+ changeset: 12:6db5e282cb91
+ parent: 10:2033b4e49474
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add obsol_d'''
+
+ changeset: 16:50f11e5e3a63
+ tag: tip
+ parent: 11:9468a5f5d8b2
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add obsolet_conflicting_d
+
+
+ $ hg up --hidden 3 -q
+ working directory parent is obsolete!
+ $ hg evolve
+ parent is obsolete with multiple successors:
+ [4] add obsol_c'
+ [10] add obsol_c
+ [2]
+ $ hg olog
+ changeset: 2:4538525df7e2
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add c
+
+
+Check import reports new unstable changeset:
+
+ $ hg up --hidden 2
+ 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ working directory parent is obsolete!
+ $ hg export 9468a5f5d8b2 | hg import -
+ applying patch from stdin
+ 1 new unstable changesets
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-oldconvert.t Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,114 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [web]
+ > push_ssl = false
+ > allow_push = *
+ > [phases]
+ > publish=False
+ > [alias]
+ > odiff=diff --rev 'limit(obsparents(.),1)' --rev .
+ > [extensions]
+ > hgext.graphlog=
+ > EOF
+ $ mkcommit() {
+ > echo "$1" > "$1"
+ > hg add "$1"
+ > hg ci -m "add $1"
+ > }
+
+create commit
+
+ $ hg init repo
+ $ cd repo
+ $ mkcommit a
+ $ mkcommit b
+ $ hg up -q 0
+ $ mkcommit c
+ created new head
+
+forge old style relation files
+
+ $ hg log -r 2 --template='{node} ' > .hg/obsolete-relations
+ $ hg log -r 1 --template='{node}' >> .hg/obsolete-relations
+
+enable the extensions
+
+ $ echo "obsolete=$(echo $(dirname $TESTDIR))/hgext/obsolete.py" >> $HGRCPATH
+
+ $ hg glog
+ abort: old format of obsolete marker detected!
+ run `hg debugconvertobsolete` once.
+ [255]
+ $ hg debugconvertobsolete --traceback
+ 1 obsolete marker converted
+ $ hg glog
+ @ changeset: 2:d67cd0334eee
+ | tag: tip
+ | parent: 0:1f0dee641bb7
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: add c
+ |
+ o changeset: 0:1f0dee641bb7
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: add a
+
+ $ hg debugobsolete
+ 7c3bad9141dcb46ff89abf5f61856facd56e476c d67cd0334eeecfded222fed9009f0db4beb57585 0 {'date': '* *', 'user': 'test'} (glob)
+ $ hg debugconvertobsolete
+ nothing to do
+ 0 obsolete marker converted
+
+Convert json
+
+ $ cat > .hg/store/obsoletemarkers << EOF
+ > [
+ > {
+ > "reason": "import from older format.",
+ > "subjects": [
+ > "3218406b50ed13480765e7c260669620f37fba6e"
+ > ],
+ > "user": "Pierre-Yves David <pierre-yves.david@ens-lyon.org>",
+ > "date": [
+ > 1336503323.9768269,
+ > -7200
+ > ],
+ > "object": "3e03d82708d4da97a92158558dd13386d8f09ad5",
+ > "id": "4743f676eaf3923cb98c921ee06b2e91052c365b"
+ > },
+ > {
+ > "reason": "import from older format.",
+ > "user": "Pierre-Yves David <pierre-yves.david@logilab.fr>",
+ > "date": [
+ > 1336557472.7875929,
+ > -7200
+ > ],
+ > "object": "5c722672795c3a2cb94d0cc9a821c394c1475f87",
+ > "id": "1fd90a84b7225d2e3062b7e1b3100aa2e060fc72"
+ > },
+ > {
+ > "reason": "import from older format.",
+ > "subjects": [
+ > "0000000000000000000000000000000000000000"
+ > ],
+ > "user": "Pierre-Yves David <pierre-yves.david@logilab.fr>",
+ > "date": [
+ > 1336557472.784307,
+ > -7200
+ > ],
+ > "object": "2c3784e102bb34ccc93862af5bd6d609ee30c577",
+ > "id": "7d940c5ee1f886c8a6c0d805b43e522cb3ef7a15"
+ > }
+ > ]
+ > EOF
+ $ hg glog
+ abort: old format of obsolete marker detected!
+ run `hg debugconvertobsolete` once.
+ [255]
+ $ hg debugconvertobsolete --traceback
+ 3 obsolete marker converted
+ $ hg debugobsolete
+ 7c3bad9141dcb46ff89abf5f61856facd56e476c d67cd0334eeecfded222fed9009f0db4beb57585 0 {'date': '* *', 'user': 'test'} (glob)
+ 3e03d82708d4da97a92158558dd13386d8f09ad5 3218406b50ed13480765e7c260669620f37fba6e 0 {'date': '* *', 'user': 'Pierre-Yves David <pierre-yves.david@ens-lyon.org>'} (glob)
+ 5c722672795c3a2cb94d0cc9a821c394c1475f87 0 {'date': '* *', 'user': 'Pierre-Yves David <pierre-yves.david@logilab.fr>'} (glob)
+ 2c3784e102bb34ccc93862af5bd6d609ee30c577 0 {'date': '* *', 'user': 'Pierre-Yves David <pierre-yves.david@logilab.fr>'} (glob)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-prune.t Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,258 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [ui]
+ > logtemplate={rev}:{node|short}[{bookmarks}] ({obsolete}/{phase}) {desc|firstline}\n
+ > [extensions]
+ > hgext.rebase=
+ > EOF
+ $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+
+ $ mkcommit() {
+ > echo "$1" > "$1"
+ > hg add "$1"
+ > hg ci -m "add $1"
+ > }
+
+ $ hg init repo
+ $ cd repo
+ $ mkcommit a
+ $ hg phase --public .
+ $ mkcommit b
+ $ mkcommit c
+ $ mkcommit d
+ $ mkcommit e
+ $ hg bookmarks BABAR
+ $ hg log -G
+ @ 4:9d206ffc875e[BABAR] (stable/draft) add e
+ |
+ o 3:47d2a3944de8[] (stable/draft) add d
+ |
+ o 2:4538525df7e2[] (stable/draft) add c
+ |
+ o 1:7c3bad9141dc[] (stable/draft) add b
+ |
+ o 0:1f0dee641bb7[] (stable/public) add a
+
+
+Check simple case
+----------------------------
+
+prune current and tip changeset
+
+ $ hg prune --user blah --date '1979-12-15' .
+ 1 changesets pruned
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ working directory now at 47d2a3944de8
+ $ hg debugobsolete
+ 9d206ffc875e1bc304590549be293be36821e66c 0 {'date': '314064000 0', 'user': 'blah'} (glob)
+
+prune leaving unstability behind
+
+ $ hg prune 1
+ 1 changesets pruned
+ 2 new unstable changesets
+ $ hg debugobsolete
+ 9d206ffc875e1bc304590549be293be36821e66c 0 {'date': '314064000 0', 'user': 'blah'} (glob)
+ 7c3bad9141dcb46ff89abf5f61856facd56e476c 0 {'date': '*', 'user': 'test'} (glob)
+
+pruning multiple changeset at once
+
+ $ hg prune 2:
+ 2 changesets pruned
+ 0 files updated, 0 files merged, 3 files removed, 0 files unresolved
+ working directory now at 1f0dee641bb7
+ $ hg debugobsolete
+ 9d206ffc875e1bc304590549be293be36821e66c 0 {'date': '314064000 0', 'user': 'blah'} (glob)
+ 7c3bad9141dcb46ff89abf5f61856facd56e476c 0 {'date': '*', 'user': 'test'} (glob)
+ 4538525df7e2b9f09423636c61ef63a4cb872a2d 0 {'date': '*', 'user': 'test'} (glob)
+ 47d2a3944de8b013de3be9578e8e344ea2e6c097 0 {'date': '*', 'user': 'test'} (glob)
+
+cannot prune public changesets
+
+ $ hg prune 0
+ abort: cannot prune immutable changeset: 1f0dee641bb7
+ (see "hg help phases" for details)
+ [255]
+ $ hg debugobsolete
+ 9d206ffc875e1bc304590549be293be36821e66c 0 {'date': '314064000 0', 'user': 'blah'} (glob)
+ 7c3bad9141dcb46ff89abf5f61856facd56e476c 0 {'date': '*', 'user': 'test'} (glob)
+ 4538525df7e2b9f09423636c61ef63a4cb872a2d 0 {'date': '*', 'user': 'test'} (glob)
+ 47d2a3944de8b013de3be9578e8e344ea2e6c097 0 {'date': '*', 'user': 'test'} (glob)
+
+Check successors addition
+----------------------------
+
+ $ mkcommit bb
+ $ mkcommit cc
+ $ mkcommit dd
+ $ mkcommit ee
+ $ hg up 0
+ 0 files updated, 0 files merged, 4 files removed, 0 files unresolved
+ $ mkcommit nB
+ created new head
+ $ mkcommit nC
+ $ mkcommit nD
+ $ mkcommit nE
+
+ $ hg log -G
+ @ 12:6e8148413dd5[] (stable/draft) add nE
+ |
+ o 11:8ee176ff1d4b[] (stable/draft) add nD
+ |
+ o 10:aa96dc3f04c2[] (stable/draft) add nC
+ |
+ o 9:6f6f25e4f748[] (stable/draft) add nB
+ |
+ | o 8:bb5e90a7ea1f[] (stable/draft) add ee
+ | |
+ | o 7:00ded550b1e2[] (stable/draft) add dd
+ | |
+ | o 6:354011cd103f[] (stable/draft) add cc
+ | |
+ | o 5:814c38b95e72[] (stable/draft) add bb
+ |/
+ o 0:1f0dee641bb7[BABAR] (stable/public) add a
+
+
+one old, one new
+
+ $ hg prune 'desc("add ee")' -s 'desc("add nE")'
+ 1 changesets pruned
+ $ hg debugobsolete
+ 9d206ffc875e1bc304590549be293be36821e66c 0 {'date': '314064000 0', 'user': 'blah'} (glob)
+ 7c3bad9141dcb46ff89abf5f61856facd56e476c 0 {'date': '*', 'user': 'test'} (glob)
+ 4538525df7e2b9f09423636c61ef63a4cb872a2d 0 {'date': '*', 'user': 'test'} (glob)
+ 47d2a3944de8b013de3be9578e8e344ea2e6c097 0 {'date': '*', 'user': 'test'} (glob)
+ bb5e90a7ea1f3b4b38b23150a4a597b6146d70ef 6e8148413dd541855b72a920a90c06fca127c7e7 0 {'date': '*', 'user': 'test'} (glob)
+ $ hg log -G
+ @ 12:6e8148413dd5[] (stable/draft) add nE
+ |
+ o 11:8ee176ff1d4b[] (stable/draft) add nD
+ |
+ o 10:aa96dc3f04c2[] (stable/draft) add nC
+ |
+ o 9:6f6f25e4f748[] (stable/draft) add nB
+ |
+ | o 7:00ded550b1e2[] (stable/draft) add dd
+ | |
+ | o 6:354011cd103f[] (stable/draft) add cc
+ | |
+ | o 5:814c38b95e72[] (stable/draft) add bb
+ |/
+ o 0:1f0dee641bb7[BABAR] (stable/public) add a
+
+
+one old, two new
+
+ $ hg prune 'desc("add dd")' -s 'desc("add nD")' -s 'desc("add nC")'
+ 1 changesets pruned
+ $ hg debugobsolete
+ 9d206ffc875e1bc304590549be293be36821e66c 0 {'date': '314064000 0', 'user': 'blah'} (glob)
+ 7c3bad9141dcb46ff89abf5f61856facd56e476c 0 {'date': '*', 'user': 'test'} (glob)
+ 4538525df7e2b9f09423636c61ef63a4cb872a2d 0 {'date': '*', 'user': 'test'} (glob)
+ 47d2a3944de8b013de3be9578e8e344ea2e6c097 0 {'date': '*', 'user': 'test'} (glob)
+ bb5e90a7ea1f3b4b38b23150a4a597b6146d70ef 6e8148413dd541855b72a920a90c06fca127c7e7 0 {'date': '*', 'user': 'test'} (glob)
+ 00ded550b1e28bba454bd34cec1269d22cf3ef25 aa96dc3f04c2c2341fe6880aeb6dc9fbffff9ef9 8ee176ff1d4b2034ce51e3efc579c2de346b631d 0 {'date': '**', 'user': 'test'} (glob)
+ $ hg log -G
+ @ 12:6e8148413dd5[] (stable/draft) add nE
+ |
+ o 11:8ee176ff1d4b[] (stable/draft) add nD
+ |
+ o 10:aa96dc3f04c2[] (stable/draft) add nC
+ |
+ o 9:6f6f25e4f748[] (stable/draft) add nB
+ |
+ | o 6:354011cd103f[] (stable/draft) add cc
+ | |
+ | o 5:814c38b95e72[] (stable/draft) add bb
+ |/
+ o 0:1f0dee641bb7[BABAR] (stable/public) add a
+
+
+two old, two new (should be denied)
+
+ $ hg prune 'desc("add cc")' 'desc("add bb")' -s 'desc("add nD")' -s 'desc("add nC")'
+ abort: Can't use multiple successors for multiple precursors
+ [255]
+ $ hg debugobsolete
+ 9d206ffc875e1bc304590549be293be36821e66c 0 {'date': '314064000 0', 'user': 'blah'} (glob)
+ 7c3bad9141dcb46ff89abf5f61856facd56e476c 0 {'date': '*', 'user': 'test'} (glob)
+ 4538525df7e2b9f09423636c61ef63a4cb872a2d 0 {'date': '*', 'user': 'test'} (glob)
+ 47d2a3944de8b013de3be9578e8e344ea2e6c097 0 {'date': '*', 'user': 'test'} (glob)
+ bb5e90a7ea1f3b4b38b23150a4a597b6146d70ef 6e8148413dd541855b72a920a90c06fca127c7e7 0 {'date': '*', 'user': 'test'} (glob)
+ 00ded550b1e28bba454bd34cec1269d22cf3ef25 aa96dc3f04c2c2341fe6880aeb6dc9fbffff9ef9 8ee176ff1d4b2034ce51e3efc579c2de346b631d 0 {'date': '**', 'user': 'test'} (glob)
+
+two old, one new:
+
+ $ hg prune 'desc("add cc")' 'desc("add bb")' -s 'desc("add nB")'
+ 2 changesets pruned
+ $ hg debugobsolete
+ 9d206ffc875e1bc304590549be293be36821e66c 0 {'date': '314064000 0', 'user': 'blah'} (glob)
+ 7c3bad9141dcb46ff89abf5f61856facd56e476c 0 {'date': '*', 'user': 'test'} (glob)
+ 4538525df7e2b9f09423636c61ef63a4cb872a2d 0 {'date': '*', 'user': 'test'} (glob)
+ 47d2a3944de8b013de3be9578e8e344ea2e6c097 0 {'date': '*', 'user': 'test'} (glob)
+ bb5e90a7ea1f3b4b38b23150a4a597b6146d70ef 6e8148413dd541855b72a920a90c06fca127c7e7 0 {'date': '*', 'user': 'test'} (glob)
+ 00ded550b1e28bba454bd34cec1269d22cf3ef25 aa96dc3f04c2c2341fe6880aeb6dc9fbffff9ef9 8ee176ff1d4b2034ce51e3efc579c2de346b631d 0 {'date': '**', 'user': 'test'} (glob)
+ 814c38b95e72dfe2cbf675b1649ea9d780c89a80 6f6f25e4f748d8f7571777e6e168aedf50350ce8 0 {'date': '*', 'user': 'test'} (glob)
+ 354011cd103f58bbbd9091a3cee6d6a6bd0dddf7 6f6f25e4f748d8f7571777e6e168aedf50350ce8 0 {'date': '*', 'user': 'test'} (glob)
+
+two old, two new with --biject
+
+ $ hg up 0
+ 0 files updated, 0 files merged, 4 files removed, 0 files unresolved
+ $ mkcommit n1
+ created new head
+ $ mkcommit n2
+
+ $ hg prune 'desc("add n1")::desc("add n2")' -s 'desc("add nD")::desc("add nE")' --biject
+ 2 changesets pruned
+ 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
+ working directory now at 1f0dee641bb7
+ $ hg debugobsolete
+ 9d206ffc875e1bc304590549be293be36821e66c 0 {'date': '314064000 0', 'user': 'blah'} (glob)
+ 7c3bad9141dcb46ff89abf5f61856facd56e476c 0 {'date': '*', 'user': 'test'} (glob)
+ 4538525df7e2b9f09423636c61ef63a4cb872a2d 0 {'date': '*', 'user': 'test'} (glob)
+ 47d2a3944de8b013de3be9578e8e344ea2e6c097 0 {'date': '*', 'user': 'test'} (glob)
+ bb5e90a7ea1f3b4b38b23150a4a597b6146d70ef 6e8148413dd541855b72a920a90c06fca127c7e7 0 {'date': '*', 'user': 'test'} (glob)
+ 00ded550b1e28bba454bd34cec1269d22cf3ef25 aa96dc3f04c2c2341fe6880aeb6dc9fbffff9ef9 8ee176ff1d4b2034ce51e3efc579c2de346b631d 0 {'date': '**', 'user': 'test'} (glob)
+ 814c38b95e72dfe2cbf675b1649ea9d780c89a80 6f6f25e4f748d8f7571777e6e168aedf50350ce8 0 {'date': '* *', 'user': 'test'} (glob)
+ 354011cd103f58bbbd9091a3cee6d6a6bd0dddf7 6f6f25e4f748d8f7571777e6e168aedf50350ce8 0 {'date': '* *', 'user': 'test'} (glob)
+ cb7f8f706a6532967b98cf8583a81baab79a0fa7 8ee176ff1d4b2034ce51e3efc579c2de346b631d 0 {'date': '* *', 'user': 'test'} (glob)
+ 21b6f2f1cece8c10326e575dd38239189d467190 6e8148413dd541855b72a920a90c06fca127c7e7 0 {'date': '* *', 'user': 'test'} (glob)
+
+test hg prune -B bookmark
+yoinked from test-mq-strip.t
+
+ $ cd ..
+ $ hg init bookmarks
+ $ cd bookmarks
+ $ hg debugbuilddag '..<2.*1/2:m<2+3:c<m+3:a<2.:b'
+ $ hg bookmark -r 'a' 'todelete'
+ $ hg bookmark -r 'b' 'B'
+ $ hg bookmark -r 'b' 'nostrip'
+ $ hg bookmark -r 'c' 'delete'
+ $ hg up -C todelete
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg prune -B nostrip
+ bookmark 'nostrip' deleted
+ abort: nothing to prune
+ [255]
+ $ hg prune -B todelete
+ 1 changesets pruned
+ 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ working directory now at d62d843c9a01
+ bookmark 'todelete' deleted
+ $ hg id -ir dcbb326fdec2
+ abort: unknown revision 'dcbb326fdec2'!
+ [255]
+ $ hg id -ir d62d843c9a01
+ d62d843c9a01
+ $ hg bookmarks
+ B 10:ff43616e5d0f
+ delete 6:2702dd0c91e7
+ $ hg prune -B delete
+ 3 changesets pruned
+ bookmark 'delete' deleted
+ $ hg id -ir 6:2702dd0c91e7
+ abort: unknown revision '2702dd0c91e7'!
+ [255]
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-stabilize-conflict.t Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,256 @@
+=================================================================
+This files test the proper behavior of evo during merge conflict.
+=================================================================
+
+Initial setup
+
+ $ cat >> $HGRCPATH <<EOF
+ > [ui]
+ > interactive=false
+ > merge=internal:merge
+ > [defaults]
+ > amend=-d "0 0"
+ > [merge-tools]
+ > touch.checkchanged=true
+ > touch.gui=true
+ > touch.args=babar
+ > [extensions]
+ > hgext.rebase=
+ > EOF
+ $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+
+ $ safesed() {
+ > sed "$1" "$2" > `pwd`/sed.temp
+ > mv `pwd`/sed.temp "$2"
+ > }
+
+create a simple repo
+
+ $ hg init repo
+ $ cd repo
+ $ cat << EOF > babar
+ > un
+ > deux
+ > trois
+ > quatre
+ > cinq
+ > EOF
+ $ hg add babar
+ $ hg commit -m "babar count up to five"
+ $ cat << EOF >> babar
+ > six
+ > sept
+ > huit
+ > neuf
+ > dix
+ > EOF
+ $ hg commit -m "babar count up to ten"
+ $ cat << EOF >> babar
+ > onze
+ > douze
+ > treize
+ > quatorze
+ > quinze
+ > EOF
+ $ hg commit -m "babar count up to fifteen"
+
+
+proper behavior without conflict
+----------------------------------
+
+ $ hg gdown
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ [1] babar count up to ten
+ $ safesed 's/huit/eight/' babar
+ $ hg diff
+ diff -r 9d5daf8bd956 babar
+ --- a/babar Thu Jan 01 00:00:00 1970 +0000
+ +++ b/babar * (glob)
+ @@ -5,6 +5,6 @@
+ cinq
+ six
+ sept
+ -huit
+ +eight
+ neuf
+ dix
+ $ hg amend
+ 1 new unstable changesets
+ $ hg evolve
+ move:[2] babar count up to fifteen
+ atop:[4] babar count up to ten
+ merging babar
+ $ hg resolve -l
+ $ hg log -G
+ @ changeset: 5:71c18f70c34f
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: babar count up to fifteen
+ |
+ o changeset: 4:5977072d13c5
+ | parent: 0:29ec1554cfaf
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: babar count up to ten
+ |
+ o changeset: 0:29ec1554cfaf
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: babar count up to five
+
+
+
+proper behavior with conflict using internal:merge
+--------------------------------------------------
+
+ $ hg gdown
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ [4] babar count up to ten
+ $ safesed 's/dix/ten/' babar
+ $ hg diff
+ diff -r 5977072d13c5 babar
+ --- a/babar Thu Jan 01 00:00:00 1970 +0000
+ +++ b/babar * (glob)
+ @@ -7,4 +7,4 @@
+ sept
+ eight
+ neuf
+ -dix
+ +ten
+ $ hg amend
+ 1 new unstable changesets
+ $ hg evolve
+ move:[5] babar count up to fifteen
+ atop:[7] babar count up to ten
+ merging babar
+ warning: conflicts during merge.
+ merging babar incomplete! (edit conflicts, then use 'hg resolve --mark')
+ evolve failed!
+ fix conflict and run "hg evolve --continue"
+ abort: unresolved merge conflicts (see hg help resolve)
+ [255]
+ $ hg resolve -l
+ U babar
+ $ hg log -G
+ @ changeset: 7:e04690b09bc6
+ | tag: tip
+ | parent: 0:29ec1554cfaf
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: babar count up to ten
+ |
+ | @ changeset: 5:71c18f70c34f
+ | | user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | summary: babar count up to fifteen
+ | |
+ | x changeset: 4:5977072d13c5
+ |/ parent: 0:29ec1554cfaf
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: babar count up to ten
+ |
+ o changeset: 0:29ec1554cfaf
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: babar count up to five
+
+(fix the conflict and continue)
+
+ $ hg revert -r 5 --all
+ reverting babar
+ $ safesed 's/dix/ten/' babar
+ $ hg resolve --all -m
+ $ hg evolve --continue
+ grafting revision 5
+ $ hg resolve -l
+ $ hg log -G
+ @ changeset: 8:1836b91c6c1d
+ | tag: tip
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: babar count up to fifteen
+ |
+ o changeset: 7:e04690b09bc6
+ | parent: 0:29ec1554cfaf
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: babar count up to ten
+ |
+ o changeset: 0:29ec1554cfaf
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: babar count up to five
+
+proper behavior with conflict using an external merge tools
+-----------------------------------------------------------
+
+ $ safesed 's/merge=.*/merge=touch/' $HGRCPATH
+ $ safesed 's/touch.gui=.*/touch.gui=false/' $HGRCPATH
+ $ hg gdown
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ [7] babar count up to ten
+ $ safesed 's/ten/zehn/' babar
+ $ hg diff
+ diff -r e04690b09bc6 babar
+ --- a/babar Thu Jan 01 00:00:00 1970 +0000
+ +++ b/babar * (glob)
+ @@ -7,4 +7,4 @@
+ sept
+ eight
+ neuf
+ -ten
+ +zehn
+ $ hg amend
+ 1 new unstable changesets
+ $ safesed 's/interactive=.*/interactive=true/' $HGRCPATH
+ $ HGMERGE=touch hg evolve <<EOF
+ > n
+ > EOF
+ move:[8] babar count up to fifteen
+ atop:[10] babar count up to ten
+ merging babar
+ output file babar appears unchanged
+ was merge successful (yn)? merging babar failed!
+ evolve failed!
+ fix conflict and run "hg evolve --continue"
+ abort: unresolved merge conflicts (see hg help resolve)
+ [255]
+ $ hg resolve -l
+ U babar
+ $ hg log -G
+ @ changeset: 10:b20d08eea373
+ | tag: tip
+ | parent: 0:29ec1554cfaf
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: babar count up to ten
+ |
+ | @ changeset: 8:1836b91c6c1d
+ | | user: test
+ | | date: Thu Jan 01 00:00:00 1970 +0000
+ | | summary: babar count up to fifteen
+ | |
+ | x changeset: 7:e04690b09bc6
+ |/ parent: 0:29ec1554cfaf
+ | user: test
+ | date: Thu Jan 01 00:00:00 1970 +0000
+ | summary: babar count up to ten
+ |
+ o changeset: 0:29ec1554cfaf
+ user: test
+ date: Thu Jan 01 00:00:00 1970 +0000
+ summary: babar count up to five
+
+ $ cat babar
+ un
+ deux
+ trois
+ quatre
+ cinq
+ six
+ sept
+ eight
+ neuf
+ zehn
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-stabilize-order.t Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,171 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [defaults]
+ > amend=-d "0 0"
+ > [extensions]
+ > hgext.rebase=
+ > hgext.graphlog=
+ > EOF
+ $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+
+ $ glog() {
+ > hg glog --template '{rev}:{node|short}@{branch}({phase}) {desc|firstline}\n' "$@"
+ > }
+
+ $ hg init repo
+ $ cd repo
+ $ echo root > root
+ $ hg ci -Am addroot
+ adding root
+ $ echo a > a
+ $ hg ci -Am adda
+ adding a
+ $ echo b > b
+ $ hg ci -Am addb
+ adding b
+ $ echo c > c
+ $ hg ci -Am addc
+ adding c
+ $ glog
+ @ 3:7a7552255fb5@default(draft) addc
+ |
+ o 2:ef23d6ef94d6@default(draft) addb
+ |
+ o 1:93418d2c0979@default(draft) adda
+ |
+ o 0:c471ef929e6a@default(draft) addroot
+
+ $ hg gdown
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ [2] addb
+ $ echo b >> b
+ $ hg amend
+ 1 new unstable changesets
+ $ hg gdown
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ [1] adda
+ $ echo a >> a
+ $ hg amend
+ 1 new unstable changesets
+ $ glog
+ @ 7:005fe5914f78@default(draft) adda
+ |
+ | o 5:22619daeed78@default(draft) addb
+ | |
+ | | o 3:7a7552255fb5@default(draft) addc
+ | | |
+ | | x 2:ef23d6ef94d6@default(draft) addb
+ | |/
+ | x 1:93418d2c0979@default(draft) adda
+ |/
+ o 0:c471ef929e6a@default(draft) addroot
+
+
+Test stabilizing a predecessor child
+
+ $ hg evolve -v
+ move:[5] addb
+ atop:[7] adda
+ hg rebase -r 22619daeed78 -d 005fe5914f78
+ resolving manifests
+ getting b
+ b
+ $ glog
+ @ 8:bede829dd2d3@default(draft) addb
+ |
+ o 7:005fe5914f78@default(draft) adda
+ |
+ | o 3:7a7552255fb5@default(draft) addc
+ | |
+ | x 2:ef23d6ef94d6@default(draft) addb
+ | |
+ | x 1:93418d2c0979@default(draft) adda
+ |/
+ o 0:c471ef929e6a@default(draft) addroot
+
+
+Test stabilizing a descendant predecessors child
+
+ $ hg up 7
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ hg debugobsolete > successors.old
+ $ hg evolve -v
+ move:[3] addc
+ atop:[8] addb
+ hg rebase -r 7a7552255fb5 -d bede829dd2d3
+ resolving manifests
+ getting b
+ resolving manifests
+ getting c
+ c
+ $ hg debugobsolete > successors.new
+ $ diff -u successors.old successors.new
+ --- successors.old* (glob)
+ +++ successors.new* (glob)
+ @@ -3,3 +3,4 @@
+ 93418d2c0979643ad446f621195e78720edb05b4 005fe5914f78e8bc64c7eba28117b0b1fa210d0d 0 {'date': '* *', 'user': 'test'} (glob)
+ 7a7d76dc97c57751de9e80f61ed2a639bd03cd24 0 {'date': '* *', 'user': 'test'} (glob)
+ 22619daeed78036f80fbd326b6852519c4f0c25e bede829dd2d3b2ae9bf198c23432b250dc964458 0 {'date': '* *', 'user': 'test'} (glob)
+ +7a7552255fb5f8bd745e46fba6f0ca633a4dd716 65095d7d0dd5e4f15503bb7b1f433a5fe9bac052 0 {'date': '* *', 'user': 'test'} (glob)
+ [1]
+
+
+
+ $ glog
+ @ 9:65095d7d0dd5@default(draft) addc
+ |
+ o 8:bede829dd2d3@default(draft) addb
+ |
+ o 7:005fe5914f78@default(draft) adda
+ |
+ o 0:c471ef929e6a@default(draft) addroot
+
+ $ hg evolve -v
+ no troubled changesets
+ [1]
+
+Test behaviour with --any
+
+ $ hg up 8
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ $ echo b >> b
+ $ hg amend
+ 1 new unstable changesets
+ $ glog
+ @ 11:036cf654e942@default(draft) addb
+ |
+ | o 9:65095d7d0dd5@default(draft) addc
+ | |
+ | x 8:bede829dd2d3@default(draft) addb
+ |/
+ o 7:005fe5914f78@default(draft) adda
+ |
+ o 0:c471ef929e6a@default(draft) addroot
+
+ $ hg up 9
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg evolve -v
+ nothing to evolve here
+ (1 troubled changesets, do you want --any ?)
+ [2]
+ $ hg evolve --any -v
+ move:[9] addc
+ atop:[11] addb
+ hg rebase -r 65095d7d0dd5 -d 036cf654e942
+ resolving manifests
+ removing c
+ getting b
+ resolving manifests
+ getting c
+ c
+ $ glog
+ @ 12:e99ecf51c867@default(draft) addc
+ |
+ o 11:036cf654e942@default(draft) addb
+ |
+ o 7:005fe5914f78@default(draft) adda
+ |
+ o 0:c471ef929e6a@default(draft) addroot
+
+ $ hg evolve --any -v
+ no troubled changesets
+ [1]
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-stabilize-result.t Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,330 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [defaults]
+ > amend=-d "0 0"
+ > [extensions]
+ > hgext.rebase=
+ > hgext.graphlog=
+ > EOF
+ $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+
+ $ glog() {
+ > hg glog --template \
+ > '{rev}:{node|short}@{branch}({phase}) bk:[{bookmarks}] {desc|firstline}\n' "$@"
+ > }
+
+Test evolve removing the changeset being evolved
+
+ $ hg init empty
+ $ cd empty
+ $ echo a > a
+ $ hg ci -Am adda a
+ $ echo b > b
+ $ hg ci -Am addb b
+ $ echo a >> a
+ $ hg ci -m changea
+ $ hg bookmark changea
+ $ hg up 1
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ echo a >> a
+ $ hg amend -m changea
+ 1 new unstable changesets
+ $ hg evolve -v
+ move:[2] changea
+ atop:[4] changea
+ hg rebase -r cce2c55b8965 -d fb9d051ec0a4
+ resolving manifests
+ $ glog --hidden
+ @ 4:fb9d051ec0a4@default(draft) bk:[changea] changea
+ |
+ | x 3:c5727dbded3c@default(draft) bk:[] temporary amend commit for 102a90ea7b4a
+ | |
+ | | x 2:cce2c55b8965@default(draft) bk:[] changea
+ | |/
+ | x 1:102a90ea7b4a@default(draft) bk:[] addb
+ |/
+ o 0:07f494440405@default(draft) bk:[] adda
+
+ $ hg debugobsolete
+ 102a90ea7b4a3361e4082ed620918c261189a36a fb9d051ec0a450a4aa2ffc8c324979832ef88065 0 {'date': '* *', 'user': 'test'} (glob)
+ c5727dbded3c3a6877cf60d6bb552a76812cb844 0 {'date': '* *', 'user': 'test'} (glob)
+ cce2c55b896511e0b6e04173c9450ba822ebc740 0 {'date': '* *', 'user': 'test'} (glob)
+
+Test evolve with conflict
+
+ $ ls
+ a
+ b
+ $ hg pdiff a
+ diff -r 07f494440405 a
+ --- a/a * (glob)
+ +++ b/a * (glob)
+ @@ -1,1 +1,2 @@
+ a
+ +a
+ $ echo 'newer a' >> a
+ $ hg ci -m 'newer a'
+ $ hg gdown
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ [4] changea
+ $ echo 'a' > a
+ $ hg amend
+ 1 new unstable changesets
+ $ hg evolve
+ move:[5] newer a
+ atop:[7] changea
+ merging a
+ warning: conflicts during merge.
+ merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
+ evolve failed!
+ fix conflict and run "hg evolve --continue"
+ abort: unresolved merge conflicts (see hg help resolve)
+ [255]
+ $ hg revert -r 'unstable()' a
+ $ hg diff
+ diff -r 66719795a494 a
+ --- a/a * (glob)
+ +++ b/a * (glob)
+ @@ -1,1 +1,3 @@
+ a
+ +a
+ +newer a
+ $ hg evolve --continue
+ grafting revision 5
+ abort: unresolved merge conflicts (see hg help resolve)
+ [255]
+ $ hg resolve -m a
+ $ hg evolve --continue
+ grafting revision 5
+
+Stabilize of late comer with different parent
+==================================================
+
+(the same parent case is handled in test-evolve.t)
+
+ $ glog
+ @ 8:1cf0aacfd363@default(draft) bk:[] newer a
+ |
+ o 7:66719795a494@default(draft) bk:[changea] changea
+ |
+ o 0:07f494440405@default(draft) bk:[] adda
+
+Add another commit
+
+ $ hg gdown
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ [7] changea
+ $ echo 'c' > c
+ $ hg add c
+ $ hg commit -m 'add c'
+ created new head
+
+Get a successors of 8 on it
+
+ $ hg grab 8
+ ? files updated, 0 files merged, 0 files removed, 0 files unresolved (glob)
+
+Add real change to the successors
+
+ $ echo 'babar' >> a
+ $ hg amend
+
+Make precursors public
+
+ $ hg phase --hidden --public 8
+ 1 new bumped changesets
+ $ glog
+ @ 12:(73b15c7566e9|d5c7ef82d003)@default\(draft\) bk:\[\] newer a (re)
+ |
+ o 9:7bc2f5967f5e@default(draft) bk:[] add c
+ |
+ | o 8:1cf0aacfd363@default(public) bk:[] newer a
+ |/
+ o 7:66719795a494@default(public) bk:[changea] changea
+ |
+ o 0:07f494440405@default(public) bk:[] adda
+
+
+Stabilize !
+
+ $ hg evolve --any --dry-run
+ recreate:[12] newer a
+ atop:[8] newer a
+ hg rebase --rev (73b15c7566e9|d5c7ef82d003) --dest 66719795a494; (re)
+ hg update 1cf0aacfd363;
+ hg revert --all --rev (73b15c7566e9|d5c7ef82d003); (re)
+ hg commit --msg "bumped update to %s" (no-eol)
+ $ hg evolve --any
+ recreate:[12] newer a
+ atop:[8] newer a
+ rebasing to destination parent: 66719795a494
+ computing new diff
+ commited as (a7cabd7bd9c2|671b9d7eeaec) (re)
+ $ glog
+ @ 14:(a7cabd7bd9c2|671b9d7eeaec)@default\(draft\) bk:\[\] bumped update to 1cf0aacfd363: (re)
+ |
+ | o 9:7bc2f5967f5e@default(draft) bk:[] add c
+ | |
+ o | 8:1cf0aacfd363@default(public) bk:[] newer a
+ |/
+ o 7:66719795a494@default(public) bk:[changea] changea
+ |
+ o 0:07f494440405@default(public) bk:[] adda
+
+
+Stabilize conflicting changesets with same parent
+=================================================
+
+ $ rm a.orig
+ $ hg up 9
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ cat << EOF >> a
+ > flore
+ > arthur
+ > zephir
+ > some
+ > less
+ > conflict
+ > EOF
+ $ hg ci -m 'More addition'
+ $ glog
+ @ 15:3932c176bbaa@default(draft) bk:[] More addition
+ |
+ | o 14:(a7cabd7bd9c2|671b9d7eeaec)@default\(draft\) bk:\[\] bumped update to 1cf0aacfd363: (re)
+ | |
+ o | 9:7bc2f5967f5e@default(draft) bk:[] add c
+ | |
+ | o 8:1cf0aacfd363@default(public) bk:[] newer a
+ |/
+ o 7:66719795a494@default(public) bk:[changea] changea
+ |
+ o 0:07f494440405@default(public) bk:[] adda
+
+ $ echo 'babar' >> a
+ $ hg amend
+ $ hg up --hidden 15
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ working directory parent is obsolete!
+ $ mv a a.old
+ $ echo 'jungle' > a
+ $ cat a.old >> a
+ $ rm a.old
+ $ hg amend
+ 2 new divergent changesets
+ $ glog
+ @ 19:eacc9c8240fe@default(draft) bk:[] More addition
+ |
+ | o 17:d2f173e25686@default(draft) bk:[] More addition
+ |/
+ | o 14:(a7cabd7bd9c2|671b9d7eeaec)@default\(draft\) bk:\[\] bumped update to 1cf0aacfd363: (re)
+ | |
+ o | 9:7bc2f5967f5e@default(draft) bk:[] add c
+ | |
+ | o 8:1cf0aacfd363@default(public) bk:[] newer a
+ |/
+ o 7:66719795a494@default(public) bk:[changea] changea
+ |
+ o 0:07f494440405@default(public) bk:[] adda
+
+
+Stabilize It
+
+ $ hg evolve -qn --traceback
+ hg update -c eacc9c8240fe &&
+ hg merge d2f173e25686 &&
+ hg commit -m "auto merge resolving conflict between eacc9c8240fe and d2f173e25686"&&
+ hg up -C 3932c176bbaa &&
+ hg revert --all --rev tip &&
+ hg commit -m "`hg log -r eacc9c8240fe --template={desc}`";
+ $ hg evolve -v
+ merge:[19] More addition
+ with: [17] More addition
+ base: [15] More addition
+ merging divergent changeset
+ resolving manifests
+ merging a
+ 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
+ amending changeset eacc9c8240fe
+ a
+ copying changeset 283ccd10e2b8 to 7bc2f5967f5e
+ a
+ committed changeset 21:f344982e63c4
+ $ hg st
+ $ glog
+ @ 21:f344982e63c4@default(draft) bk:[] More addition
+ |
+ | o 14:(a7cabd7bd9c2|671b9d7eeaec)@default\(draft\) bk:\[\] bumped update to 1cf0aacfd363: (re)
+ | |
+ o | 9:7bc2f5967f5e@default(draft) bk:[] add c
+ | |
+ | o 8:1cf0aacfd363@default(public) bk:[] newer a
+ |/
+ o 7:66719795a494@default(public) bk:[changea] changea
+ |
+ o 0:07f494440405@default(public) bk:[] adda
+
+ $ hg summary
+ parent: 21:f344982e63c4 tip
+ More addition
+ branch: default
+ commit: (clean)
+ update: 2 new changesets, 2 branch heads (merge)
+ $ hg export .
+ # HG changeset patch
+ # User test
+ # Date 0 0
+ # Thu Jan 01 00:00:00 1970 +0000
+ # Node ID f344982e63c462b1e44c0371c804685389e673a9
+ # Parent 7bc2f5967f5e4ed277f60a89b7b04cc5d6407ced
+ More addition
+
+ diff -r 7bc2f5967f5e -r f344982e63c4 a
+ --- a/a Thu Jan 01 00:00:00 1970 +0000
+ +++ b/a Thu Jan 01 00:00:00 1970 +0000
+ @@ -1,1 +1,9 @@
+ +jungle
+ a
+ +flore
+ +arthur
+ +zephir
+ +some
+ +less
+ +conflict
+ +babar
+
+Check conflicting during conflicting resolution
+-------------------------------------------------
+
+ $ hg up --hidden 15
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ working directory parent is obsolete!
+ $ echo 'gotta break' >> a
+ $ hg amend
+ 2 new divergent changesets
+ $ hg phase 'divergent()'
+ 21: draft
+ 23: draft
+ $ hg evolve -qn
+ hg update -c 36e188246d67 &&
+ hg merge f344982e63c4 &&
+ hg commit -m "auto merge resolving conflict between 36e188246d67 and f344982e63c4"&&
+ hg up -C 3932c176bbaa &&
+ hg revert --all --rev tip &&
+ hg commit -m "`hg log -r 36e188246d67 --template={desc}`";
+ $ hg evolve
+ merge:[23] More addition
+ with: [21] More addition
+ base: [15] More addition
+ merging a
+ warning: conflicts during merge.
+ merging a incomplete! (edit conflicts, then use 'hg resolve --mark')
+ 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
+ use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
+ abort: Merge conflict between several amendments, and this is not yet automated
+ (/!\ You can try:
+ /!\ * manual merge + resolve => new cset X
+ /!\ * hg up to the parent of the amended changeset (which are named W and Z)
+ /!\ * hg revert --all -r X
+ /!\ * hg ci -m "same message as the amended changeset" => new cset Y
+ /!\ * hg kill -n Y W Z
+ )
+ [255]
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-touch.t Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,88 @@
+
+ $ cat >> $HGRCPATH <<EOF
+ > [ui]
+ > logtemplate={rev}:{node|short} {desc}\n
+ > [defaults]
+ > amend=-d "0 0"
+ > [extensions]
+ > hgext.rebase=
+ > EOF
+ $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+
+ $ hg init repo
+ $ cd repo
+ $ echo A > a
+ $ hg add a
+ $ hg commit -m a
+
+Basic usage
+
+ $ hg log -G
+ @ 0:e93df3427f45 a
+
+ $ hg touch .
+ $ hg log -G
+ @ 1:[0-9a-f]{12} a (re)
+
+
+
+Revive usage
+
+ $ echo A > b
+ $ hg add b
+ $ hg commit -m ab --amend
+ $ hg up --hidden 1
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ working directory parent is obsolete!
+ $ hg log -G
+ o 3:[0-9a-f]{12} ab (re)
+
+ @ 1:[0-9a-f]{12} a (re)
+
+ $ hg touch .
+ 2 new divergent changesets
+ $ hg log -G
+ @ 4:[0-9a-f]{12} a (re)
+
+ o 3:[0-9a-f]{12} ab (re)
+
+ $ hg prune 3
+ 1 changesets pruned
+
+Duplicate
+
+ $ hg touch --duplicate .
+ $ hg log -G
+ @ 5:[0-9a-f]{12} a (re)
+
+ o 4:[0-9a-f]{12} a (re)
+
+
+Multiple touch
+
+ $ echo C > c
+ $ hg add c
+ $ hg commit -m c
+ $ echo D > d
+ $ hg add d
+ $ hg commit -m d
+ $ hg log -G
+ @ 7:[0-9a-f]{12} d (re)
+ |
+ o 6:[0-9a-f]{12} c (re)
+ |
+ o 5:[0-9a-f]{12} a (re)
+
+ o 4:[0-9a-f]{12} a (re)
+
+ $ hg touch 6:7
+ $ hg log -G
+ @ 9:[0-9a-f]{12} d (re)
+ |
+ o 8:[0-9a-f]{12} c (re)
+ |
+ o 5:[0-9a-f]{12} a (re)
+
+ o 4:[0-9a-f]{12} a (re)
+
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-tutorial.t Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,833 @@
+
+Initial setup
+-------------
+
+This Mercurial configuration example is used for testing.
+.. Various setup
+
+ $ cat >> $HGRCPATH << EOF
+ > [ui]
+ > # This is change the default output of log for clear tutorial
+ > logtemplate ="{node|short} ({phase}): {desc}\n"
+ > [diff]
+ > # use "git" diff format, clearer and smarter format
+ > git = 1
+ > [alias]
+ > # "-d '0 0'" means that the new commit will be at January 1st 1970.
+ > # This is used for stable hash during test
+ > # (this tutorial is automatically tested.)
+ > amend = amend -d '0 0'
+ > EOF
+
+ $ hg init local
+ $ cat >> local/.hg/hgrc << EOF
+ > [paths]
+ > remote = ../remote
+ > other = ../other
+ > [ui]
+ > user = Babar the King
+ > EOF
+
+ $ hg init remote
+ $ cat >> remote/.hg/hgrc << EOF
+ > [paths]
+ > local = ../local
+ > [ui]
+ > user = Celestine the Queen
+ > EOF
+
+ $ hg init other
+ $ cat >> other/.hg/hgrc << EOF
+ > [ui]
+ > user = Princess Flore
+ > EOF
+
+
+This tutorial uses the following configuration for Mercurial:
+
+A compact log template with phase data:
+
+ $ hg showconfig ui | grep log
+ ui.logtemplate="{node|short} ({phase}): {desc}\n"
+
+Improved git format diff:
+
+ $ hg showconfig diff
+ diff.git=1
+
+And of course, we enable the experimental extensions for mutable history:
+
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > evolve = $TESTDIR/../hgext/evolve.py
+ > # enabling rebase is also needed for now
+ > rebase =
+ > EOF
+
+-----------------------
+Single Developer Usage
+-----------------------
+
+This tutorial shows how to use evolution to rewrite history locally.
+
+
+Fixing mistake with `hg amend`
+--------------------------------
+
+We are versionning a shopping list
+
+ $ cd local
+ $ cat >> shopping << EOF
+ > Spam
+ > Whizzo butter
+ > Albatross
+ > Rat (rather a lot)
+ > Jugged fish
+ > Blancmange
+ > Salmon mousse
+ > EOF
+ $ hg commit -A -m "Monthy Python Shopping list"
+ adding shopping
+
+Its first version is shared with the outside.
+
+ $ hg push remote
+ pushing to $TESTTMP/remote
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+
+Later I add additional item to my list
+
+ $ cat >> shopping << EOF
+ > Egg
+ > Suggar
+ > Vinegar
+ > Oil
+ > EOF
+ $ hg commit -m "adding condiment"
+ $ cat >> shopping << EOF
+ > Bananos
+ > Pear
+ > Apple
+ > EOF
+ $ hg commit -m "adding fruit"
+
+This history is very linear
+
+ $ hg log -G
+ @ d85de4546133 (draft): adding fruit
+ |
+ o 4d5dc8187023 (draft): adding condiment
+ |
+ o 7e82d3f3c2cb (public): Monthy Python Shopping list
+
+
+But a typo was made in Babanas!
+
+ $ hg export tip
+ # HG changeset patch
+ # User test
+ # Date 0 0
+ # Thu Jan 01 00:00:00 1970 +0000
+ # Node ID d85de4546133030c82d257bbcdd9b1b416d0c31c
+ # Parent 4d5dc81870237d492284826e21840b2ca00e26d1
+ adding fruit
+
+ diff --git a/shopping b/shopping
+ --- a/shopping
+ +++ b/shopping
+ @@ -9,3 +9,6 @@
+ Suggar
+ Vinegar
+ Oil
+ +Bananos
+ +Pear
+ +Apple
+
+The faulty changeset is in the "draft" phase because it has not been exchanged with
+the outside. The first one has been exchanged and is "public" (immutable).
+
+ $ hg log -G
+ @ d85de4546133 (draft): adding fruit
+ |
+ o 4d5dc8187023 (draft): adding condiment
+ |
+ o 7e82d3f3c2cb (public): Monthy Python Shopping list
+
+
+hopefully. I can use `hg commit --amend` to rewrite my faulty changeset!
+
+ $ sed -i'' -e s/Bananos/Banana/ shopping
+ $ hg diff
+ diff --git a/shopping b/shopping
+ --- a/shopping
+ +++ b/shopping
+ @@ -9,6 +9,6 @@
+ Suggar
+ Vinegar
+ Oil
+ -Bananos
+ +Banana
+ Pear
+ Apple
+ $ hg commit --amend
+
+A new changeset with the right diff replace the wrong one.
+
+ $ hg log -G
+ @ 9d0363b81950 (draft): adding fruit
+ |
+ o 4d5dc8187023 (draft): adding condiment
+ |
+ o 7e82d3f3c2cb (public): Monthy Python Shopping list
+
+ $ hg export tip
+ # HG changeset patch
+ # User test
+ # Date 0 0
+ # Thu Jan 01 00:00:00 1970 +0000
+ # Node ID 9d0363b81950646bc6ad1ec5de8b8197ea586541
+ # Parent 4d5dc81870237d492284826e21840b2ca00e26d1
+ adding fruit
+
+ diff --git a/shopping b/shopping
+ --- a/shopping
+ +++ b/shopping
+ @@ -9,3 +9,6 @@
+ Suggar
+ Vinegar
+ Oil
+ +Banana
+ +Pear
+ +Apple
+
+Getting rid of branchy history
+----------------------------------
+
+While I was working on my list. someone made a change remotly.
+
+ $ cd ../remote
+ $ hg up -q
+ $ sed -i'' -e 's/Spam/Spam Spam Spam/' shopping
+ $ hg ci -m 'SPAM'
+ $ cd ../local
+
+I'll get this remote changeset when pulling
+
+ $ hg pull remote
+ pulling from $TESTTMP/remote
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+
+I now have a new heads. Note that this remote head is immutable
+
+ $ hg log -G
+ o 9ca060c80d74 (public): SPAM
+ |
+ | @ 9d0363b81950 (draft): adding fruit
+ | |
+ | o 4d5dc8187023 (draft): adding condiment
+ |/
+ o 7e82d3f3c2cb (public): Monthy Python Shopping list
+
+
+instead of merging my head with the new one. I'm going to rebase my work
+
+ $ hg diff
+ $ hg rebase --dest 9ca060c80d74 --source 4d5dc8187023
+ merging shopping
+ merging shopping
+
+
+My local work is now rebased on the remote one.
+
+ $ hg log -G
+ @ 41aff6a42b75 (draft): adding fruit
+ |
+ o dfd3a2d7691e (draft): adding condiment
+ |
+ o 9ca060c80d74 (public): SPAM
+ |
+ o 7e82d3f3c2cb (public): Monthy Python Shopping list
+
+
+Removing changesets
+------------------------
+
+I add new item to my list
+
+ $ cat >> shopping << EOF
+ > car
+ > bus
+ > plane
+ > boat
+ > EOF
+ $ hg ci -m 'transport'
+ $ hg log -G
+ @ 1125e39fbf21 (draft): transport
+ |
+ o 41aff6a42b75 (draft): adding fruit
+ |
+ o dfd3a2d7691e (draft): adding condiment
+ |
+ o 9ca060c80d74 (public): SPAM
+ |
+ o 7e82d3f3c2cb (public): Monthy Python Shopping list
+
+
+I have a new commit but I realize that don't want it. (transport shop list does
+not fit well in my standard shopping list)
+
+ $ hg prune . # "." is for working directory parent
+ 1 changesets pruned
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ working directory now at 41aff6a42b75
+
+The silly changeset is gone.
+
+ $ hg log -G
+ @ 41aff6a42b75 (draft): adding fruit
+ |
+ o dfd3a2d7691e (draft): adding condiment
+ |
+ o 9ca060c80d74 (public): SPAM
+ |
+ o 7e82d3f3c2cb (public): Monthy Python Shopping list
+
+
+Reordering changesets
+------------------------
+
+
+We create two changesets.
+
+
+ $ cat >> shopping << EOF
+ > Shampoo
+ > Toothbrush
+ > ... More bathroom stuff to come
+ > Towel
+ > Soap
+ > EOF
+ $ hg ci -m 'bathroom stuff' -q # XXX remove the -q
+
+ $ sed -i'' -e 's/Spam/Spam Spam Spam/g' shopping
+ $ hg ci -m 'SPAM SPAM'
+ $ hg log -G
+ @ fac207dec9f5 (draft): SPAM SPAM
+ |
+ o 10b8aeaa8cc8 (draft): bathroom stuff
+ |
+ o 41aff6a42b75 (draft): adding fruit
+ |
+ o dfd3a2d7691e (draft): adding condiment
+ |
+ o 9ca060c80d74 (public): SPAM
+ |
+ o 7e82d3f3c2cb (public): Monthy Python Shopping list
+
+
+.. note:: We can't amend changeset 7e82d3f3c2cb or 9ca060c80d74 as they are immutable.
+
+ I now want to push to remote all my changes except the bathroom one, which I'm
+ not totally happy with yet. To be able to push "SPAM SPAM" I need a version of
+ "SPAM SPAM" which is not a child of "bathroom stuff"
+
+You can use the 'grab' alias for that.
+
+.. note: grab is an alias for `hg rebase --dest . --rev <target>; hg up <there>`
+
+ $ hg up 'p1(10b8aeaa8cc8)' # going on "bathroom stuff" parent
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ $ hg grab fac207dec9f5 # moving "SPAM SPAM" to the working directory parent
+ merging shopping
+ ? files updated, 0 files merged, 0 files removed, 0 files unresolved (glob)
+ $ hg log -G
+ @ a224f2a4fb9f (draft): SPAM SPAM
+ |
+ | o 10b8aeaa8cc8 (draft): bathroom stuff
+ |/
+ o 41aff6a42b75 (draft): adding fruit
+ |
+ o dfd3a2d7691e (draft): adding condiment
+ |
+ o 9ca060c80d74 (public): SPAM
+ |
+ o 7e82d3f3c2cb (public): Monthy Python Shopping list
+
+
+We have a new SPAM SPAM version without the bathroom stuff
+
+ $ grep Spam shopping # enough spam
+ Spam Spam Spam Spam Spam Spam Spam Spam Spam
+ $ grep Toothbrush shopping # no Toothbrush
+ [1]
+ $ hg export .
+ # HG changeset patch
+ # User test
+ # Date 0 0
+ # Thu Jan 01 00:00:00 1970 +0000
+ # Node ID a224f2a4fb9f9f828f608959912229d7b38b26de
+ # Parent 41aff6a42b7578ec7ec3cb2041633f1ca43cca96
+ SPAM SPAM
+
+ diff --git a/shopping b/shopping
+ --- a/shopping
+ +++ b/shopping
+ @@ -1,4 +1,4 @@
+ -Spam Spam Spam
+ +Spam Spam Spam Spam Spam Spam Spam Spam Spam
+ Whizzo butter
+ Albatross
+ Rat (rather a lot)
+
+To make sure I do not push unready changeset by mistake I set the "bathroom
+stuff" changeset in the secret phase.
+
+ $ hg phase --force --secret 10b8aeaa8cc8
+
+we can now push our change:
+
+ $ hg push remote
+ pushing to $TESTTMP/remote
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 3 changesets with 3 changes to 1 files
+
+for simplicity sake we get the bathroom change in line again
+
+ $ hg grab 10b8aeaa8cc8
+ merging shopping
+ ? files updated, 0 files merged, 0 files removed, 0 files unresolved (glob)
+ $ hg phase --draft .
+ $ hg log -G
+ @ 75954b8cd933 (draft): bathroom stuff
+ |
+ o a224f2a4fb9f (public): SPAM SPAM
+ |
+ o 41aff6a42b75 (public): adding fruit
+ |
+ o dfd3a2d7691e (public): adding condiment
+ |
+ o 9ca060c80d74 (public): SPAM
+ |
+ o 7e82d3f3c2cb (public): Monthy Python Shopping list
+
+
+
+
+Splitting change
+------------------
+
+This part is not written yet, but you can use either the `histedit` extension
+of the `uncommit` command to splitting a change.
+
+ $ hg help uncommit
+ hg uncommit [OPTION]... [NAME]
+
+ move changes from parent revision to working directory
+
+ Changes to selected files in parent revision appear again as uncommitted
+ changed in the working directory. A new revision without selected changes
+ is created, becomes the new parent and obsoletes the previous one.
+
+ The --include option specify pattern to uncommit The --exclude option
+ specify pattern to keep in the commit
+
+ Return 0 if changed files are uncommitted.
+
+ options:
+
+ -a --all uncommit all changes when no arguments given
+ -I --include PATTERN [+] include names matching the given patterns
+ -X --exclude PATTERN [+] exclude names matching the given patterns
+
+ [+] marked option can be specified multiple times
+
+ use "hg -v help uncommit" to show the global options
+
+
+The edit command of histedit can be used to split changeset:
+
+
+Collapsing change
+------------------
+
+The tutorial part is not written yet but can use `hg fold`:
+
+ $ hg help fold
+ hg fold rev
+
+ Fold multiple revisions into a single one
+
+ Revision from your current working directory to the specified one are fold
+ as a new one replacing the other
+
+ you can alternatively use --rev to explicitly specify revision to be fold
+ ignoring the current working directory parent.
+
+ options:
+
+ -r --rev VALUE [+] explicitly specify the full set of revision to fold
+
+ [+] marked option can be specified multiple times
+
+ use "hg -v help fold" to show the global options
+
+
+-----------------------
+Collaboration
+-----------------------
+
+
+sharing mutable changesets
+----------------------------
+
+To share mutable changesets with others, just check that the repo you interact
+with is "not publishing". Otherwise you will get the previously observe
+behavior where exchanged changeset are automatically published.
+
+ $ cd ../remote
+ $ hg -R ../local/ showconfig phases
+
+the localrepo does not have any specific configuration for `phases.publish`. It
+is ``true`` by default.
+
+ $ hg pull local
+ pulling from $TESTTMP/local
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ (run 'hg update' to get a working copy)
+ $ hg log -G
+ o 75954b8cd933 (public): bathroom stuff
+ |
+ o a224f2a4fb9f (public): SPAM SPAM
+ |
+ o 41aff6a42b75 (public): adding fruit
+ |
+ o dfd3a2d7691e (public): adding condiment
+ |
+ @ 9ca060c80d74 (public): SPAM
+ |
+ o 7e82d3f3c2cb (public): Monthy Python Shopping list
+
+
+
+
+We do not want to publish the "bathroom changeset". Let's rollback the last transaction.
+
+.. Warning: Rollback is actually a dangerous kind of internal command that is deprecated and should not be exposed to user. Please forget you read about it until someone fix this tutorial.
+
+ $ hg rollback
+ repository tip rolled back to revision 4 (undo pull)
+ $ hg log -G
+ o a224f2a4fb9f (public): SPAM SPAM
+ |
+ o 41aff6a42b75 (public): adding fruit
+ |
+ o dfd3a2d7691e (public): adding condiment
+ |
+ @ 9ca060c80d74 (public): SPAM
+ |
+ o 7e82d3f3c2cb (public): Monthy Python Shopping list
+
+
+Let's make the local repo "non publishing"
+
+ $ echo '[phases]' >> ../local/.hg/hgrc
+ $ echo 'publish=false' >> ../local/.hg/hgrc
+ $ echo '[phases]' >> .hg/hgrc
+ $ echo 'publish=false' >> .hg/hgrc
+ $ hg showconfig phases
+ phases.publish=false
+ $ hg -R ../local/ showconfig phases
+ phases.publish=false
+
+
+I can now exchange mutable changeset between "remote" and "local" repository.
+
+ $ hg pull local
+ pulling from $TESTTMP/local
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ (run 'hg update' to get a working copy)
+ $ hg log -G
+ o 75954b8cd933 (draft): bathroom stuff
+ |
+ o a224f2a4fb9f (public): SPAM SPAM
+ |
+ o 41aff6a42b75 (public): adding fruit
+ |
+ o dfd3a2d7691e (public): adding condiment
+ |
+ @ 9ca060c80d74 (public): SPAM
+ |
+ o 7e82d3f3c2cb (public): Monthy Python Shopping list
+
+
+Rebasing unstable change after pull
+----------------------------------------------
+
+Remotely someone add a new changeset on top of the mutable "bathroom" on.
+
+ $ hg up 75954b8cd933 -q
+ $ cat >> shopping << EOF
+ > Giraffe
+ > Rhino
+ > Lion
+ > Bear
+ > EOF
+ $ hg ci -m 'animals'
+
+But at the same time, locally, this same "bathroom changeset" was updated.
+
+ $ cd ../local
+ $ hg up 75954b8cd933 -q
+ $ sed -i'' -e 's/... More bathroom stuff to come/Bath Robe/' shopping
+ $ hg commit --amend
+ $ hg log -G
+ @ a44c85f957d3 (draft): bathroom stuff
+ |
+ o a224f2a4fb9f (public): SPAM SPAM
+ |
+ o 41aff6a42b75 (public): adding fruit
+ |
+ o dfd3a2d7691e (public): adding condiment
+ |
+ o 9ca060c80d74 (public): SPAM
+ |
+ o 7e82d3f3c2cb (public): Monthy Python Shopping list
+
+
+
+When we pull from remote again we get an unstable state!
+
+ $ hg pull remote
+ pulling from $TESTTMP/remote
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files (+1 heads)
+ (run 'hg heads' to see heads, 'hg merge' to merge)
+ 1 new unstable changesets
+
+
+The new changeset "animal" is based on an old changeset of "bathroom". You can
+see both version showing up in the log.
+
+ $ hg log -G
+ o bf1b0d202029 (draft): animals
+ |
+ | @ a44c85f957d3 (draft): bathroom stuff
+ | |
+ x | 75954b8cd933 (draft): bathroom stuff
+ |/
+ o a224f2a4fb9f (public): SPAM SPAM
+ |
+ o 41aff6a42b75 (public): adding fruit
+ |
+ o dfd3a2d7691e (public): adding condiment
+ |
+ o 9ca060c80d74 (public): SPAM
+ |
+ o 7e82d3f3c2cb (public): Monthy Python Shopping list
+
+
+The older version 75954b8cd933 never ceased to exist in the local repo. It was
+just hidden and excluded from pull and push.
+
+.. note:: In hgview there is a nice dotted relation highlighting a44c85f957d3 as a new version of 75954b8cd933. this is not yet ported to ``hg log -G``.
+
+There is now an **unstable** changeset in this history. Mercurial will refuse to
+share it with the outside:
+
+ $ hg push other
+ pushing to $TESTTMP/other
+ searching for changes
+ abort: push includes unstable changeset: bf1b0d202029!
+ (use 'hg evolve' to get a stable history or --force to ignore warnings)
+ [255]
+
+
+
+
+To resolve this unstable state, you need to rebase bf1b0d202029 onto
+a44c85f957d3. The `hg evolve` command will do this for you.
+
+It has a --dry-run option to only suggest the next move.
+
+ $ hg evolve --dry-run
+ move:[15] animals
+ atop:[14] bathroom stuff
+ hg rebase -r bf1b0d202029 -d a44c85f957d3
+
+Let's do it
+
+ $ hg evolve
+ move:[15] animals
+ atop:[14] bathroom stuff
+ merging shopping
+
+The old version of bathroom is hidden again.
+
+ $ hg log -G
+ @ ee942144f952 (draft): animals
+ |
+ o a44c85f957d3 (draft): bathroom stuff
+ |
+ o a224f2a4fb9f (public): SPAM SPAM
+ |
+ o 41aff6a42b75 (public): adding fruit
+ |
+ o dfd3a2d7691e (public): adding condiment
+ |
+ o 9ca060c80d74 (public): SPAM
+ |
+ o 7e82d3f3c2cb (public): Monthy Python Shopping list
+
+
+
+We can push this evolution to remote
+
+ $ hg push remote
+ pushing to $TESTTMP/remote
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 1 files (+1 heads)
+
+remote get a warning that current working directory is based on an obsolete changeset
+
+ $ cd ../remote
+ $ hg pull local # we up again to trigger the warning. it was displayed during the push
+ pulling from $TESTTMP/local
+ searching for changes
+ no changes found
+ working directory parent is obsolete!
+
+now let's see where we are, and update to the successor
+
+ $ hg parents
+ bf1b0d202029 (draft): animals
+ working directory parent is obsolete!
+ $ hg evolve
+ update:[8] animals
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+
+Relocating unstable change after prune
+----------------------------------------------
+
+The remote guy keep working
+
+ $ sed -i'' -e 's/Spam/Spam Spam Spam Spam/g' shopping
+ $ hg commit -m "SPAM SPAM SPAM"
+
+I'm pulling its work locally.
+
+ $ cd ../local
+ $ hg pull remote
+ pulling from $TESTTMP/remote
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ (run 'hg update' to get a working copy)
+ $ hg log -G
+ o 99f039c5ec9e (draft): SPAM SPAM SPAM
+ |
+ @ ee942144f952 (draft): animals
+ |
+ o a44c85f957d3 (draft): bathroom stuff
+ |
+ o a224f2a4fb9f (public): SPAM SPAM
+ |
+ o 41aff6a42b75 (public): adding fruit
+ |
+ o dfd3a2d7691e (public): adding condiment
+ |
+ o 9ca060c80d74 (public): SPAM
+ |
+ o 7e82d3f3c2cb (public): Monthy Python Shopping list
+
+
+In the mean time I noticed you can't buy animals in a super market and I prune the animal changeset:
+
+ $ hg prune ee942144f952
+ 1 changesets pruned
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ working directory now at a44c85f957d3
+ 1 new unstable changesets
+
+
+The animals changeset is still displayed because the "SPAM SPAM SPAM" changeset
+is neither dead or obsolete. My repository is in an unstable state again.
+
+ $ hg log -G
+ o 99f039c5ec9e (draft): SPAM SPAM SPAM
+ |
+ x ee942144f952 (draft): animals
+ |
+ @ a44c85f957d3 (draft): bathroom stuff
+ |
+ o a224f2a4fb9f (public): SPAM SPAM
+ |
+ o 41aff6a42b75 (public): adding fruit
+ |
+ o dfd3a2d7691e (public): adding condiment
+ |
+ o 9ca060c80d74 (public): SPAM
+ |
+ o 7e82d3f3c2cb (public): Monthy Python Shopping list
+
+
+ $ hg log -r 'unstable()'
+ 99f039c5ec9e (draft): SPAM SPAM SPAM
+
+ $ hg evolve
+ move:[17] SPAM SPAM SPAM
+ atop:[14] bathroom stuff
+ merging shopping
+
+ $ hg log -G
+ @ 40aa40daeefb (draft): SPAM SPAM SPAM
+ |
+ o a44c85f957d3 (draft): bathroom stuff
+ |
+ o a224f2a4fb9f (public): SPAM SPAM
+ |
+ o 41aff6a42b75 (public): adding fruit
+ |
+ o dfd3a2d7691e (public): adding condiment
+ |
+ o 9ca060c80d74 (public): SPAM
+ |
+ o 7e82d3f3c2cb (public): Monthy Python Shopping list
+
+
+
+Handling Divergent amend
+----------------------------------------------
+
+We can detect that multiple diverging/conflicting amendments have been made.
+The `evolve` command can solve this situation. But all corner case are not
+handled now.
+
+This section needs to be written.
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-uncommit.t Thu Feb 20 12:56:57 2014 -0800
@@ -0,0 +1,335 @@
+ $ cat >> $HGRCPATH <<EOF
+ > [extensions]
+ > hgext.rebase=
+ > hgext.graphlog=
+ > EOF
+ $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH
+
+ $ glog() {
+ > hg glog --template '{rev}:{node|short}@{branch}({obsolete}/{phase}) {desc|firstline}\n' "$@"
+ > }
+
+ $ hg init repo
+ $ cd repo
+
+Cannot uncommit null changeset
+
+ $ hg uncommit
+ abort: cannot rewrite immutable changeset
+ [255]
+
+Cannot uncommit public changeset
+
+ $ echo a > a
+ $ hg ci -Am adda a
+ $ hg phase --public .
+ $ hg uncommit
+ abort: cannot rewrite immutable changeset
+ [255]
+ $ hg phase --force --draft .
+
+Cannot uncommit merge
+
+ $ hg up -q null
+ $ echo b > b
+ $ echo c > c
+ $ echo d > d
+ $ echo f > f
+ $ echo g > g
+ $ echo j > j
+ $ echo m > m
+ $ echo n > n
+ $ echo o > o
+ $ hg ci -Am addmore
+ adding b
+ adding c
+ adding d
+ adding f
+ adding g
+ adding j
+ adding m
+ adding n
+ adding o
+ created new head
+ $ hg merge
+ 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ (branch merge, don't forget to commit)
+ $ hg uncommit
+ abort: cannot uncommit while merging
+ [255]
+ $ hg ci -m merge
+ $ hg uncommit
+ abort: cannot uncommit merge changeset
+ [255]
+
+Prepare complicated changeset
+
+ $ hg branch bar
+ marked working directory as branch bar
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg cp a aa
+ $ echo b >> b
+ $ hg rm c
+ $ echo d >> d
+ $ echo e > e
+ $ hg mv f ff
+ $ hg mv g h
+ $ echo j >> j
+ $ echo k > k
+ $ echo l > l
+ $ hg rm m
+ $ hg rm n
+ $ echo o >> o
+ $ hg ci -Am touncommit
+ adding e
+ adding k
+ adding l
+ $ hg st --copies --change .
+ M b
+ M d
+ M j
+ M o
+ A aa
+ a
+ A e
+ A ff
+ f
+ A h
+ g
+ A k
+ A l
+ R c
+ R f
+ R g
+ R m
+ R n
+ $ hg man -r .
+ a
+ aa
+ b
+ d
+ e
+ ff
+ h
+ j
+ k
+ l
+ o
+
+Add a couple of bookmarks
+
+ $ glog --hidden
+ @ 3:5eb72dbe0cb4@bar(stable/draft) touncommit
+ |
+ o 2:f63b90038565@default(stable/draft) merge
+ |\
+ | o 1:f15c744d48e8@default(stable/draft) addmore
+ |
+ o 0:07f494440405@default(stable/draft) adda
+
+ $ hg bookmark -r 2 unrelated
+ $ hg bookmark touncommit-bm
+ $ hg bookmark --inactive touncommit-bm-inactive
+ $ hg bookmarks
+ * touncommit-bm 3:5eb72dbe0cb4
+ touncommit-bm-inactive 3:5eb72dbe0cb4
+ unrelated 2:f63b90038565
+
+Prepare complicated working directory
+
+ $ hg branch foo
+ marked working directory as branch foo
+ (branches are permanent and global, did you want a bookmark?)
+ $ hg mv ff f
+ $ hg mv h i
+ $ hg rm j
+ $ hg rm k
+ $ echo l >> l
+ $ echo m > m
+ $ echo o > o
+
+Test uncommit without argument, should be a no-op
+
+ $ hg uncommit
+ abort: nothing to uncommit
+ [255]
+ $ hg bookmarks
+ * touncommit-bm 3:5eb72dbe0cb4
+ touncommit-bm-inactive 3:5eb72dbe0cb4
+ unrelated 2:f63b90038565
+
+Test no matches
+
+ $ hg uncommit --include nothere
+ abort: nothing to uncommit
+ [255]
+
+Enjoy uncommit
+
+ $ hg uncommit aa b c f ff g h j k l m o
+ $ hg branch
+ foo
+ $ hg st --copies
+ M b
+ A aa
+ a
+ A i
+ g
+ A l
+ R c
+ R g
+ R j
+ R m
+ $ cat aa
+ a
+ $ cat b
+ b
+ b
+ $ cat l
+ l
+ l
+ $ cat m
+ m
+ $ test -f c && echo 'error: c was removed!'
+ [1]
+ $ test -f j && echo 'error: j was removed!'
+ [1]
+ $ test -f k && echo 'error: k was removed!'
+ [1]
+ $ hg st --copies --change .
+ M d
+ A e
+ R n
+ $ hg man -r .
+ a
+ b
+ c
+ d
+ e
+ f
+ g
+ j
+ m
+ o
+ $ hg cat -r . d
+ d
+ d
+ $ hg cat -r . e
+ e
+ $ glog --hidden
+ @ 4:e8db4aa611f6@bar(stable/draft) touncommit
+ |
+ | x 3:5eb72dbe0cb4@bar(extinct/draft) touncommit
+ |/
+ o 2:f63b90038565@default(stable/draft) merge
+ |\
+ | o 1:f15c744d48e8@default(stable/draft) addmore
+ |
+ o 0:07f494440405@default(stable/draft) adda
+
+ $ hg bookmarks
+ * touncommit-bm 4:e8db4aa611f6
+ touncommit-bm-inactive 4:e8db4aa611f6
+ unrelated 2:f63b90038565
+ $ hg debugobsolete
+ 5eb72dbe0cb409d094e3b4ae8eaa30071c1b8730 e8db4aa611f6d5706374288e6898e498f5c44098 0 {'date': '* *', 'user': 'test'} (glob)
+
+Test phase is preserved, no local changes
+
+ $ hg up -C 3 --hidden
+ 8 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ working directory parent is obsolete!
+ $ hg --config extensions.purge= purge
+ $ hg uncommit -I 'set:added() and e'
+ 2 new divergent changesets
+ $ hg st --copies
+ A e
+ $ hg st --copies --change .
+ M b
+ M d
+ M j
+ M o
+ A aa
+ A ff
+ f
+ A h
+ g
+ A k
+ A l
+ R c
+ R f
+ R g
+ R m
+ R n
+ $ glog --hidden
+ @ 5:c706fe2c12f8@bar(stable/draft) touncommit
+ |
+ | o 4:e8db4aa611f6@bar(stable/draft) touncommit
+ |/
+ | x 3:5eb72dbe0cb4@bar(extinct/draft) touncommit
+ |/
+ o 2:f63b90038565@default(stable/draft) merge
+ |\
+ | o 1:f15c744d48e8@default(stable/draft) addmore
+ |
+ o 0:07f494440405@default(stable/draft) adda
+
+ $ hg debugobsolete
+ 5eb72dbe0cb409d094e3b4ae8eaa30071c1b8730 e8db4aa611f6d5706374288e6898e498f5c44098 0 {'date': '* *', 'user': 'test'} (glob)
+ 5eb72dbe0cb409d094e3b4ae8eaa30071c1b8730 c706fe2c12f83ba5010cb60ea6af3bd1f0c2d6d3 0 {'date': '* *', 'user': 'test'} (glob)
+
+Test --all
+
+ $ hg up -C 3 --hidden
+ 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ working directory parent is obsolete!
+ $ hg --config extensions.purge= purge
+ $ hg uncommit --all -X e
+ 1 new divergent changesets
+ $ hg st --copies
+ M b
+ M d
+ M j
+ M o
+ A aa
+ a
+ A ff
+ f
+ A h
+ g
+ A k
+ A l
+ R c
+ R f
+ R g
+ R m
+ R n
+ $ hg st --copies --change .
+ A e
+
+ $ hg debugobsolete
+ 5eb72dbe0cb409d094e3b4ae8eaa30071c1b8730 e8db4aa611f6d5706374288e6898e498f5c44098 0 {'date': '* *', 'user': 'test'} (glob)
+ 5eb72dbe0cb409d094e3b4ae8eaa30071c1b8730 c706fe2c12f83ba5010cb60ea6af3bd1f0c2d6d3 0 {'date': '* *', 'user': 'test'} (glob)
+ 5eb72dbe0cb409d094e3b4ae8eaa30071c1b8730 c4cbebac3751269bdf12d1466deabcc78521d272 0 {'date': '* *', 'user': 'test'} (glob)
+
+Display a warning if nothing left
+
+ $ hg uncommit e
+ new changeset is empty
+ (use "hg kill ." to remove it)
+ $ hg debugobsolete
+ 5eb72dbe0cb409d094e3b4ae8eaa30071c1b8730 e8db4aa611f6d5706374288e6898e498f5c44098 0 {'date': '* *', 'user': 'test'} (glob)
+ 5eb72dbe0cb409d094e3b4ae8eaa30071c1b8730 c706fe2c12f83ba5010cb60ea6af3bd1f0c2d6d3 0 {'date': '* *', 'user': 'test'} (glob)
+ 5eb72dbe0cb409d094e3b4ae8eaa30071c1b8730 c4cbebac3751269bdf12d1466deabcc78521d272 0 {'date': '* *', 'user': 'test'} (glob)
+ c4cbebac3751269bdf12d1466deabcc78521d272 4f1c269eab68720f54e88ce3c1dc02b2858b6b89 0 {'date': '* *', 'user': 'test'} (glob)
+
+Test instability warning
+
+ $ hg ci -m touncommit
+ $ echo unrelated > unrelated
+ $ hg ci -Am addunrelated unrelated
+ $ hg previous
+ 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+ [8] touncommit
+ $ hg uncommit aa
+ 1 new unstable changesets