transitions-0.9.0/0000755000232200023220000000000014304350474014447 5ustar debalancedebalancetransitions-0.9.0/binder/0000755000232200023220000000000014304350474015712 5ustar debalancedebalancetransitions-0.9.0/binder/requirements.txt0000644000232200023220000000001514304350474021172 0ustar debalancedebalancesix graphviz transitions-0.9.0/binder/postBuild0000644000232200023220000000004314304350474017577 0ustar debalancedebalance#!/bin/bash set -ex pip install . transitions-0.9.0/binder/apt.txt0000644000232200023220000000001114304350474017227 0ustar debalancedebalancegraphviz transitions-0.9.0/setup.cfg0000644000232200023220000000026514304350474016273 0ustar debalancedebalance[metadata] description_file = README.md [check-manifest] ignore = .travis.yml .scrutinizer.yml appveyor.yml [bdist_wheel] universal = 1 [egg_info] tag_build = tag_date = 0 transitions-0.9.0/README.md0000644000232200023220000024455614304350474015746 0ustar debalancedebalance# transitions [![Version](https://img.shields.io/badge/version-v0.9.0-orange.svg)](https://github.com/pytransitions/transitions) [![Build Status](https://github.com/pytransitions/transitions/actions/workflows/pytest.yml/badge.svg)](https://github.com/pytransitions/transitions/actions?query=workflow%3Apytest) [![Coverage Status](https://codecov.io/gh/pytransitions/transitions/branch/master/graphs/badge.svg)](https://app.codecov.io/gh/pytransitions/transitions/tree/master) [![PyPi](https://img.shields.io/pypi/v/transitions.svg)](https://pypi.org/project/transitions) [![Copr](https://img.shields.io/badge/dynamic/json?color=blue&label=copr&query=builds.latest.source_package.version&url=https%3A%2F%2Fcopr.fedorainfracloud.org%2Fapi_3%2Fpackage%3Fownername%3Daleneum%26projectname%3Dpython3-transitions%26packagename%3Dpython3-transitions%26with_latest_build%3DTrue)](https://copr.fedorainfracloud.org/coprs/aleneum/python3-transitions/package/python3-transitions) [![GitHub commits](https://img.shields.io/github/commits-since/pytransitions/transitions/0.8.11.svg)](https://github.com/pytransitions/transitions/compare/0.8.11...master) [![License](https://img.shields.io/github/license/pytransitions/transitions.svg)](LICENSE) [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/pytransitions/transitions/master?filepath=examples%2FPlayground.ipynb) A lightweight, object-oriented state machine implementation in Python with many extensions. Compatible with Python 2.7+ and 3.0+. ## Installation pip install transitions ... or clone the repo from GitHub and then: python setup.py install ## Table of Contents - [Quickstart](#quickstart) - [Non-Quickstart](#the-non-quickstart) - [Basic initialization](#basic-initialization) - [States](#states) - [Callbacks](#state-callbacks) - [Checking state](#checking-state) - [Enumerations](#enum-state) - [Transitions](#transitions) - [Automatic transitions](#automatic-transitions-for-all-states) - [Transitioning from multiple states](#transitioning-from-multiple-states) - [Reflexive transitions from multiple states](#reflexive-from-multiple-states) - [Internal transitions](#internal-transitions) - [Ordered transitions](#ordered-transitions) - [Queued transitions](#queued-transitions) - [Conditional transitions](#conditional-transitions) - [Check transitions](#check-transitions) - [Callbacks](#transition-callbacks) - [Callable resolution](#resolution) - [Callback execution order](#execution-order) - [Passing data](#passing-data) - [Alternative initialization patterns](#alternative-initialization-patterns) - [Logging](#logging) - [(Re-)Storing machine instances](#restoring) - [Extensions](#extensions) - [Diagrams](#diagrams) - [Hierarchical State Machine](#hsm) - [Threading](#threading) - [Async](#async) - [State features](#state-features) - [Django](#django-support) - [Bug reports etc.](#bug-reports) ## Quickstart They say [a good example is worth](https://www.google.com/webhp?ie=UTF-8#q=%22a+good+example+is+worth%22&start=20) 100 pages of API documentation, a million directives, or a thousand words. Well, "they" probably lie... but here's an example anyway: ```python from transitions import Machine import random class NarcolepticSuperhero(object): # Define some states. Most of the time, narcoleptic superheroes are just like # everyone else. Except for... states = ['asleep', 'hanging out', 'hungry', 'sweaty', 'saving the world'] def __init__(self, name): # No anonymous superheroes on my watch! Every narcoleptic superhero gets # a name. Any name at all. SleepyMan. SlumberGirl. You get the idea. self.name = name # What have we accomplished today? self.kittens_rescued = 0 # Initialize the state machine self.machine = Machine(model=self, states=NarcolepticSuperhero.states, initial='asleep') # Add some transitions. We could also define these using a static list of # dictionaries, as we did with states above, and then pass the list to # the Machine initializer as the transitions= argument. # At some point, every superhero must rise and shine. self.machine.add_transition(trigger='wake_up', source='asleep', dest='hanging out') # Superheroes need to keep in shape. self.machine.add_transition('work_out', 'hanging out', 'hungry') # Those calories won't replenish themselves! self.machine.add_transition('eat', 'hungry', 'hanging out') # Superheroes are always on call. ALWAYS. But they're not always # dressed in work-appropriate clothing. self.machine.add_transition('distress_call', '*', 'saving the world', before='change_into_super_secret_costume') # When they get off work, they're all sweaty and disgusting. But before # they do anything else, they have to meticulously log their latest # escapades. Because the legal department says so. self.machine.add_transition('complete_mission', 'saving the world', 'sweaty', after='update_journal') # Sweat is a disorder that can be remedied with water. # Unless you've had a particularly long day, in which case... bed time! self.machine.add_transition('clean_up', 'sweaty', 'asleep', conditions=['is_exhausted']) self.machine.add_transition('clean_up', 'sweaty', 'hanging out') # Our NarcolepticSuperhero can fall asleep at pretty much any time. self.machine.add_transition('nap', '*', 'asleep') def update_journal(self): """ Dear Diary, today I saved Mr. Whiskers. Again. """ self.kittens_rescued += 1 @property def is_exhausted(self): """ Basically a coin toss. """ return random.random() < 0.5 def change_into_super_secret_costume(self): print("Beauty, eh?") ``` There, now you've baked a state machine into `NarcolepticSuperhero`. Let's take him/her/it out for a spin... ```python >>> batman = NarcolepticSuperhero("Batman") >>> batman.state 'asleep' >>> batman.wake_up() >>> batman.state 'hanging out' >>> batman.nap() >>> batman.state 'asleep' >>> batman.clean_up() MachineError: "Can't trigger event clean_up from state asleep!" >>> batman.wake_up() >>> batman.work_out() >>> batman.state 'hungry' # Batman still hasn't done anything useful... >>> batman.kittens_rescued 0 # We now take you live to the scene of a horrific kitten entreement... >>> batman.distress_call() 'Beauty, eh?' >>> batman.state 'saving the world' # Back to the crib. >>> batman.complete_mission() >>> batman.state 'sweaty' >>> batman.clean_up() >>> batman.state 'asleep' # Too tired to shower! # Another productive day, Alfred. >>> batman.kittens_rescued 1 ``` While we cannot read the mind of the actual batman, we surely can visualize the current state of our `NarcolepticSuperhero`. ![batman diagram](https://user-images.githubusercontent.com/205986/104932302-c2f24580-59a7-11eb-8963-5dce738b9305.png) Have a look at the [Diagrams](#diagrams) extensions if you want to know how. ## The non-quickstart ### Basic initialization Getting a state machine up and running is pretty simple. Let's say you have the object `lump` (an instance of class `Matter`), and you want to manage its states: ```python class Matter(object): pass lump = Matter() ``` You can initialize a (_minimal_) working state machine bound to `lump` like this: ```python from transitions import Machine machine = Machine(model=lump, states=['solid', 'liquid', 'gas', 'plasma'], initial='solid') # Lump now has state! lump.state >>> 'solid' ``` I say "minimal", because while this state machine is technically operational, it doesn't actually _do_ anything. It starts in the `'solid'` state, but won't ever move into another state, because no transitions are defined... yet! Let's try again. ```python # The states states=['solid', 'liquid', 'gas', 'plasma'] # And some transitions between states. We're lazy, so we'll leave out # the inverse phase transitions (freezing, condensation, etc.). transitions = [ { 'trigger': 'melt', 'source': 'solid', 'dest': 'liquid' }, { 'trigger': 'evaporate', 'source': 'liquid', 'dest': 'gas' }, { 'trigger': 'sublimate', 'source': 'solid', 'dest': 'gas' }, { 'trigger': 'ionize', 'source': 'gas', 'dest': 'plasma' } ] # Initialize machine = Machine(lump, states=states, transitions=transitions, initial='liquid') # Now lump maintains state... lump.state >>> 'liquid' # And that state can change... lump.evaporate() lump.state >>> 'gas' lump.trigger('ionize') lump.state >>> 'plasma' ``` Notice the shiny new methods attached to the `Matter` instance (`evaporate()`, `ionize()`, etc.). Each method triggers the corresponding transition. You don't have to explicitly define these methods anywhere; the name of each transition is bound to the model passed to the `Machine` initializer (in this case, `lump`). To be more precise, your model **should not** already contain methods with the same name as event triggers since `transitions` will only attach convenience methods to your model if the spot is not already taken. If you want to modify that behaviour, have a look at the [FAQ](examples/Frequently%20asked%20questions.ipynb). Furthermore, there is a method called `trigger` now attached to your model (if it hasn't been there before). This method lets you execute transitions by name in case dynamic triggering is required. ### States The soul of any good state machine (and of many bad ones, no doubt) is a set of states. Above, we defined the valid model states by passing a list of strings to the `Machine` initializer. But internally, states are actually represented as `State` objects. You can initialize and modify States in a number of ways. Specifically, you can: - pass a string to the `Machine` initializer giving the name(s) of the state(s), or - directly initialize each new `State` object, or - pass a dictionary with initialization arguments The following snippets illustrate several ways to achieve the same goal: ```python # import Machine and State class from transitions import Machine, State # Create a list of 3 states to pass to the Machine # initializer. We can mix types; in this case, we # pass one State, one string, and one dict. states = [ State(name='solid'), 'liquid', { 'name': 'gas'} ] machine = Machine(lump, states) # This alternative example illustrates more explicit # addition of states and state callbacks, but the net # result is identical to the above. machine = Machine(lump) solid = State('solid') liquid = State('liquid') gas = State('gas') machine.add_states([solid, liquid, gas]) ``` States are initialized _once_ when added to the machine and will persist until they are removed from it. In other words: if you alter the attributes of a state object, this change will NOT be reset the next time you enter that state. Have a look at how to [extend state features](#state-features) in case you require some other behaviour. #### Callbacks A `State` can also be associated with a list of `enter` and `exit` callbacks, which are called whenever the state machine enters or leaves that state. You can specify callbacks during initialization by passing them to a `State` object constructor, in a state property dictionary, or add them later. For convenience, whenever a new `State` is added to a `Machine`, the methods `on_enter_«state name»` and `on_exit_«state name»` are dynamically created on the Machine (not on the model!), which allow you to dynamically add new enter and exit callbacks later if you need them. ```python # Our old Matter class, now with a couple of new methods we # can trigger when entering or exit states. class Matter(object): def say_hello(self): print("hello, new state!") def say_goodbye(self): print("goodbye, old state!") lump = Matter() # Same states as above, but now we give StateA an exit callback states = [ State(name='solid', on_exit=['say_goodbye']), 'liquid', { 'name': 'gas', 'on_exit': ['say_goodbye']} ] machine = Machine(lump, states=states) machine.add_transition('sublimate', 'solid', 'gas') # Callbacks can also be added after initialization using # the dynamically added on_enter_ and on_exit_ methods. # Note that the initial call to add the callback is made # on the Machine and not on the model. machine.on_enter_gas('say_hello') # Test out the callbacks... machine.set_state('solid') lump.sublimate() >>> 'goodbye, old state!' >>> 'hello, new state!' ``` Note that `on_enter_«state name»` callback will _not_ fire when a Machine is first initialized. For example if you have an `on_enter_A()` callback defined, and initialize the `Machine` with `initial='A'`, `on_enter_A()` will not be fired until the next time you enter state `A`. (If you need to make sure `on_enter_A()` fires at initialization, you can simply create a dummy initial state and then explicitly call `to_A()` inside the `__init__` method.) In addition to passing in callbacks when initializing a `State`, or adding them dynamically, it's also possible to define callbacks in the model class itself, which may increase code clarity. For example: ```python class Matter(object): def say_hello(self): print("hello, new state!") def say_goodbye(self): print("goodbye, old state!") def on_enter_A(self): print("We've just entered state A!") lump = Matter() machine = Machine(lump, states=['A', 'B', 'C']) ``` Now, any time `lump` transitions to state `A`, the `on_enter_A()` method defined in the `Matter` class will fire. #### Checking state You can always check the current state of the model by either: - inspecting the `.state` attribute, or - calling `is_«state name»()` And if you want to retrieve the actual `State` object for the current state, you can do that through the `Machine` instance's `get_state()` method. ```python lump.state >>> 'solid' lump.is_gas() >>> False lump.is_solid() >>> True machine.get_state(lump.state).name >>> 'solid' ``` If you'd like you can choose your own state attribute name by passing the `model_attribute` argument while initializing the `Machine`. This will also change the name of `is_«state name»()` to `is_«model_attribute»_«state name»()` though. Similarly, auto transitions will be named `to_«model_attribute»_«state name»()` instead of `to_«state name»()`. This is done to allow multiple machines to work on the same model with individual state attribute names. ```python lump = Matter() machine = Machine(lump, states=['solid', 'liquid', 'gas'], model_attribute='matter_state', initial='solid') lump.matter_state >>> 'solid' # with a custom 'model_attribute', states can also be checked like this: lump.is_matter_state_solid() >>> True lump.to_matter_state_gas() >>> True ``` #### Enumerations So far we have seen how we can give state names and use these names to work with our state machine. If you favour stricter typing and more IDE code completion (or you just can't type 'sesquipedalophobia' any longer because the word scares you) using [Enumerations](https://docs.python.org/3/library/enum.html) might be what you are looking for: ```python import enum # Python 2.7 users need to have 'enum34' installed from transitions import Machine class States(enum.Enum): ERROR = 0 RED = 1 YELLOW = 2 GREEN = 3 transitions = [['proceed', States.RED, States.YELLOW], ['proceed', States.YELLOW, States.GREEN], ['error', '*', States.ERROR]] m = Machine(states=States, transitions=transitions, initial=States.RED) assert m.is_RED() assert m.state is States.RED state = m.get_state(States.RED) # get transitions.State object print(state.name) # >>> RED m.proceed() m.proceed() assert m.is_GREEN() m.error() assert m.state is States.ERROR ``` You can mix enums and strings if you like (e.g. `[States.RED, 'ORANGE', States.YELLOW, States.GREEN]`) but note that internally, `transitions` will still handle states by name (`enum.Enum.name`). Thus, it is not possible to have the states `'GREEN'` and `States.GREEN` at the same time. ### Transitions Some of the above examples already illustrate the use of transitions in passing, but here we'll explore them in more detail. As with states, each transition is represented internally as its own object – an instance of class `Transition`. The quickest way to initialize a set of transitions is to pass a dictionary, or list of dictionaries, to the `Machine` initializer. We already saw this above: ```python transitions = [ { 'trigger': 'melt', 'source': 'solid', 'dest': 'liquid' }, { 'trigger': 'evaporate', 'source': 'liquid', 'dest': 'gas' }, { 'trigger': 'sublimate', 'source': 'solid', 'dest': 'gas' }, { 'trigger': 'ionize', 'source': 'gas', 'dest': 'plasma' } ] machine = Machine(model=Matter(), states=states, transitions=transitions) ``` Defining transitions in dictionaries has the benefit of clarity, but can be cumbersome. If you're after brevity, you might choose to define transitions using lists. Just make sure that the elements in each list are in the same order as the positional arguments in the `Transition` initialization (i.e., `trigger`, `source`, `destination`, etc.). The following list-of-lists is functionally equivalent to the list-of-dictionaries above: ```python transitions = [ ['melt', 'solid', 'liquid'], ['evaporate', 'liquid', 'gas'], ['sublimate', 'solid', 'gas'], ['ionize', 'gas', 'plasma'] ] ``` Alternatively, you can add transitions to a `Machine` after initialization: ```python machine = Machine(model=lump, states=states, initial='solid') machine.add_transition('melt', source='solid', dest='liquid') ``` The `trigger` argument defines the name of the new triggering method that gets attached to the base model. When this method is called, it will try to execute the transition: ```python >>> lump.melt() >>> lump.state 'liquid' ``` By default, calling an invalid trigger will raise an exception: ```python >>> lump.to_gas() >>> # This won't work because only objects in a solid state can melt >>> lump.melt() transitions.core.MachineError: "Can't trigger event melt from state gas!" ``` This behavior is generally desirable, since it helps alert you to problems in your code. But in some cases, you might want to silently ignore invalid triggers. You can do this by setting `ignore_invalid_triggers=True` (either on a state-by-state basis, or globally for all states): ```python >>> # Globally suppress invalid trigger exceptions >>> m = Machine(lump, states, initial='solid', ignore_invalid_triggers=True) >>> # ...or suppress for only one group of states >>> states = ['new_state1', 'new_state2'] >>> m.add_states(states, ignore_invalid_triggers=True) >>> # ...or even just for a single state. Here, exceptions will only be suppressed when the current state is A. >>> states = [State('A', ignore_invalid_triggers=True), 'B', 'C'] >>> m = Machine(lump, states) >>> # ...this can be inverted as well if just one state should raise an exception >>> # since the machine's global value is not applied to a previously initialized state. >>> states = ['A', 'B', State('C')] # the default value for 'ignore_invalid_triggers' is False >>> m = Machine(lump, states, ignore_invalid_triggers=True) ``` If you need to know which transitions are valid from a certain state, you can use `get_triggers`: ```python m.get_triggers('solid') >>> ['melt', 'sublimate'] m.get_triggers('liquid') >>> ['evaporate'] m.get_triggers('plasma') >>> [] # you can also query several states at once m.get_triggers('solid', 'liquid', 'gas', 'plasma') >>> ['melt', 'evaporate', 'sublimate', 'ionize'] ``` #### Automatic transitions for all states In addition to any transitions added explicitly, a `to_«state»()` method is created automatically whenever a state is added to a `Machine` instance. This method transitions to the target state no matter which state the machine is currently in: ```python lump.to_liquid() lump.state >>> 'liquid' lump.to_solid() lump.state >>> 'solid' ``` If you desire, you can disable this behavior by setting `auto_transitions=False` in the `Machine` initializer. #### Transitioning from multiple states A given trigger can be attached to multiple transitions, some of which can potentially begin or end in the same state. For example: ```python machine.add_transition('transmogrify', ['solid', 'liquid', 'gas'], 'plasma') machine.add_transition('transmogrify', 'plasma', 'solid') # This next transition will never execute machine.add_transition('transmogrify', 'plasma', 'gas') ``` In this case, calling `transmogrify()` will set the model's state to `'solid'` if it's currently `'plasma'`, and set it to `'plasma'` otherwise. (Note that only the _first_ matching transition will execute; thus, the transition defined in the last line above won't do anything.) You can also make a trigger cause a transition from _all_ states to a particular destination by using the `'*'` wildcard: ```python machine.add_transition('to_liquid', '*', 'liquid') ``` Note that wildcard transitions will only apply to states that exist at the time of the add_transition() call. Calling a wildcard-based transition when the model is in a state added after the transition was defined will elicit an invalid transition message, and will not transition to the target state. #### Reflexive transitions from multiple states A reflexive trigger (trigger that has the same state as source and destination) can easily be added specifying `=` as destination. This is handy if the same reflexive trigger should be added to multiple states. For example: ```python machine.add_transition('touch', ['liquid', 'gas', 'plasma'], '=', after='change_shape') ``` This will add reflexive transitions for all three states with `touch()` as trigger and with `change_shape` executed after each trigger. #### Internal transitions In contrast to reflexive transitions, internal transitions will never actually leave the state. This means that transition-related callbacks such as `before` or `after` will be processed while state-related callbacks `exit` or `enter` will not. To define a transition to be internal, set the destination to `None`. ```python machine.add_transition('internal', ['liquid', 'gas'], None, after='change_shape') ``` #### Ordered transitions A common desire is for state transitions to follow a strict linear sequence. For instance, given states `['A', 'B', 'C']`, you might want valid transitions for `A` → `B`, `B` → `C`, and `C` → `A` (but no other pairs). To facilitate this behavior, Transitions provides an `add_ordered_transitions()` method in the `Machine` class: ```python states = ['A', 'B', 'C'] # See the "alternative initialization" section for an explanation of the 1st argument to init machine = Machine(states=states, initial='A') machine.add_ordered_transitions() machine.next_state() print(machine.state) >>> 'B' # We can also define a different order of transitions machine = Machine(states=states, initial='A') machine.add_ordered_transitions(['A', 'C', 'B']) machine.next_state() print(machine.state) >>> 'C' # Conditions can be passed to 'add_ordered_transitions' as well # If one condition is passed, it will be used for all transitions machine = Machine(states=states, initial='A') machine.add_ordered_transitions(conditions='check') # If a list is passed, it must contain exactly as many elements as the # machine contains states (A->B, ..., X->A) machine = Machine(states=states, initial='A') machine.add_ordered_transitions(conditions=['check_A2B', ..., 'check_X2A']) # Conditions are always applied starting from the initial state machine = Machine(states=states, initial='B') machine.add_ordered_transitions(conditions=['check_B2C', ..., 'check_A2B']) # With `loop=False`, the transition from the last state to the first state will be omitted (e.g. C->A) # When you also pass conditions, you need to pass one condition less (len(states)-1) machine = Machine(states=states, initial='A') machine.add_ordered_transitions(loop=False) machine.next_state() machine.next_state() machine.next_state() # transitions.core.MachineError: "Can't trigger event next_state from state C!" ``` #### Queued transitions The default behaviour in Transitions is to process events instantly. This means events within an `on_enter` method will be processed _before_ callbacks bound to `after` are called. ```python def go_to_C(): global machine machine.to_C() def after_advance(): print("I am in state B now!") def entering_C(): print("I am in state C now!") states = ['A', 'B', 'C'] machine = Machine(states=states, initial='A') # we want a message when state transition to B has been completed machine.add_transition('advance', 'A', 'B', after=after_advance) # call transition from state B to state C machine.on_enter_B(go_to_C) # we also want a message when entering state C machine.on_enter_C(entering_C) machine.advance() >>> 'I am in state C now!' >>> 'I am in state B now!' # what? ``` The execution order of this example is ``` prepare -> before -> on_enter_B -> on_enter_C -> after. ``` If queued processing is enabled, a transition will be finished before the next transition is triggered: ```python machine = Machine(states=states, queued=True, initial='A') ... machine.advance() >>> 'I am in state B now!' >>> 'I am in state C now!' # That's better! ``` This results in ``` prepare -> before -> on_enter_B -> queue(to_C) -> after -> on_enter_C. ``` **Important note:** when processing events in a queue, the trigger call will _always_ return `True`, since there is no way to determine at queuing time whether a transition involving queued calls will ultimately complete successfully. This is true even when only a single event is processed. ```python machine.add_transition('jump', 'A', 'C', conditions='will_fail') ... # queued=False machine.jump() >>> False # queued=True machine.jump() >>> True ``` When a model is removed from the machine, `transitions` will also remove all related events from the queue. ```python class Model: def on_enter_B(self): self.to_C() # add event to queue ... self.machine.remove_model(self) # aaaand it's gone ``` #### Conditional transitions Sometimes you only want a particular transition to execute if a specific condition occurs. You can do this by passing a method, or list of methods, in the `conditions` argument: ```python # Our Matter class, now with a bunch of methods that return booleans. class Matter(object): def is_flammable(self): return False def is_really_hot(self): return True machine.add_transition('heat', 'solid', 'gas', conditions='is_flammable') machine.add_transition('heat', 'solid', 'liquid', conditions=['is_really_hot']) ``` In the above example, calling `heat()` when the model is in state `'solid'` will transition to state `'gas'` if `is_flammable` returns `True`. Otherwise, it will transition to state `'liquid'` if `is_really_hot` returns `True`. For convenience, there's also an `'unless'` argument that behaves exactly like conditions, but inverted: ```python machine.add_transition('heat', 'solid', 'gas', unless=['is_flammable', 'is_really_hot']) ``` In this case, the model would transition from solid to gas whenever `heat()` fires, provided that both `is_flammable()` and `is_really_hot()` return `False`. Note that condition-checking methods will passively receive optional arguments and/or data objects passed to triggering methods. For instance, the following call: ```python lump.heat(temp=74) # equivalent to lump.trigger('heat', temp=74) ``` ... would pass the `temp=74` optional kwarg to the `is_flammable()` check (possibly wrapped in an `EventData` instance). For more on this, see the [Passing data](#passing-data) section below. #### Check transitions If you want to check whether a transition is possible before you execute it ('look before you leap'), you can use `may_` convenience functions that have been attached to your model: ```python # check if the current temperature is hot enough to trigger a transition if lump.may_heat(): lump.heat() ``` This will execute all `prepare` callbacks and evaluate the conditions assigned to the potential transitions. Transition checks can also be used when a transition's destination is not available (yet): ```python machine.add_transition('elevate', 'solid', 'spiritual') assert not lump.may_elevate() # not ready yet :( ``` #### Callbacks You can attach callbacks to transitions as well as states. Every transition has `'before'` and `'after'` attributes that contain a list of methods to call before and after the transition executes: ```python class Matter(object): def make_hissing_noises(self): print("HISSSSSSSSSSSSSSSS") def disappear(self): print("where'd all the liquid go?") transitions = [ { 'trigger': 'melt', 'source': 'solid', 'dest': 'liquid', 'before': 'make_hissing_noises'}, { 'trigger': 'evaporate', 'source': 'liquid', 'dest': 'gas', 'after': 'disappear' } ] lump = Matter() machine = Machine(lump, states, transitions=transitions, initial='solid') lump.melt() >>> "HISSSSSSSSSSSSSSSS" lump.evaporate() >>> "where'd all the liquid go?" ``` There is also a `'prepare'` callback that is executed as soon as a transition starts, before any `'conditions'` are checked or other callbacks are executed. ```python class Matter(object): heat = False attempts = 0 def count_attempts(self): self.attempts += 1 def heat_up(self): self.heat = random.random() < 0.25 def stats(self): print('It took you %i attempts to melt the lump!' %self.attempts) @property def is_really_hot(self): return self.heat states=['solid', 'liquid', 'gas', 'plasma'] transitions = [ { 'trigger': 'melt', 'source': 'solid', 'dest': 'liquid', 'prepare': ['heat_up', 'count_attempts'], 'conditions': 'is_really_hot', 'after': 'stats'}, ] lump = Matter() machine = Machine(lump, states, transitions=transitions, initial='solid') lump.melt() lump.melt() lump.melt() lump.melt() >>> "It took you 4 attempts to melt the lump!" ``` Note that `prepare` will not be called unless the current state is a valid source for the named transition. Default actions meant to be executed before or after _every_ transition can be passed to `Machine` during initialization with `before_state_change` and `after_state_change` respectively: ```python class Matter(object): def make_hissing_noises(self): print("HISSSSSSSSSSSSSSSS") def disappear(self): print("where'd all the liquid go?") states=['solid', 'liquid', 'gas', 'plasma'] lump = Matter() m = Machine(lump, states, before_state_change='make_hissing_noises', after_state_change='disappear') lump.to_gas() >>> "HISSSSSSSSSSSSSSSS" >>> "where'd all the liquid go?" ``` There are also two keywords for callbacks which should be executed _independently_ a) of how many transitions are possible, b) if any transition succeeds and c) even if an error is raised during the execution of some other callback. Callbacks passed to `Machine` with `prepare_event` will be executed _once_ before processing possible transitions (and their individual `prepare` callbacks) takes place. Callbacks of `finalize_event` will be executed regardless of the success of the processed transitions. Note that if an error occurred it will be attached to `event_data` as `error` and can be retrieved with `send_event=True`. ```python from transitions import Machine class Matter(object): def raise_error(self, event): raise ValueError("Oh no") def prepare(self, event): print("I am ready!") def finalize(self, event): print("Result: ", type(event.error), event.error) states=['solid', 'liquid', 'gas', 'plasma'] lump = Matter() m = Machine(lump, states, prepare_event='prepare', before_state_change='raise_error', finalize_event='finalize', send_event=True) try: lump.to_gas() except ValueError: pass print(lump.state) # >>> I am ready! # >>> Result: Oh no # >>> initial ``` Sometimes things just don't work out as intended and we need to handle exceptions and clean up the mess to keep things going. We can pass callbacks to `on_exception` to do this: ```python from transitions import Machine class Matter(object): def raise_error(self, event): raise ValueError("Oh no") def handle_error(self, event): print("Fixing things ...") del event.error # it did not happen if we cannot see it ... states=['solid', 'liquid', 'gas', 'plasma'] lump = Matter() m = Machine(lump, states, before_state_change='raise_error', on_exception='handle_error', send_event=True) try: lump.to_gas() except ValueError: pass print(lump.state) # >>> Fixing things ... # >>> initial ``` ### Callable resolution As you have probably already realized, the standard way of passing callables to states, conditions and transitions is by name. When processing callbacks and conditions, `transitions` will use their name to retrieve the related callable from the model. If the method cannot be retrieved and it contains dots, `transitions` will treat the name as a path to a module function and try to import it. Alternatively, you can pass names of properties or attributes. They will be wrapped into functions but cannot receive event data for obvious reasons. You can also pass callables such as (bound) functions directly. As mentioned earlier, you can also pass lists/tuples of callables names to the callback parameters. Callbacks will be executed in the order they were added. ```python from transitions import Machine from mod import imported_func import random class Model(object): def a_callback(self): imported_func() @property def a_property(self): """ Basically a coin toss. """ return random.random() < 0.5 an_attribute = False model = Model() machine = Machine(model=model, states=['A'], initial='A') machine.add_transition('by_name', 'A', 'A', conditions='a_property', after='a_callback') machine.add_transition('by_reference', 'A', 'A', unless=['a_property', 'an_attribute'], after=model.a_callback) machine.add_transition('imported', 'A', 'A', after='mod.imported_func') model.by_name() model.by_reference() model.imported() ``` The callable resolution is done in `Machine.resolve_callable`. This method can be overridden in case more complex callable resolution strategies are required. **Example** ```python class CustomMachine(Machine): @staticmethod def resolve_callable(func, event_data): # manipulate arguments here and return func, or super() if no manipulation is done. super(CustomMachine, CustomMachine).resolve_callable(func, event_data) ``` ### Callback execution order In summary, there are currently three ways to trigger events. You can call a model's convenience functions like `lump.melt()`, execute triggers by name such as `lump.trigger("melt")` or dispatch events on multiple models with `machine.dispatch("melt")` (see section about multiple models in [alternative initialization patterns](#alternative-initialization-patterns)). Callbacks on transitions are then executed in the following order: | Callback | Current State | Comments | | ------------------------------- | :------------------: | ------------------------------------------------------------------------------------------- | | `'machine.prepare_event'` | `source` | executed _once_ before individual transitions are processed | | `'transition.prepare'` | `source` | executed as soon as the transition starts | | `'transition.conditions'` | `source` | conditions _may_ fail and halt the transition | | `'transition.unless'` | `source` | conditions _may_ fail and halt the transition | | `'machine.before_state_change'` | `source` | default callbacks declared on model | | `'transition.before'` | `source` | | | `'state.on_exit'` | `source` | callbacks declared on the source state | | `` | | | | `'state.on_enter'` | `destination` | callbacks declared on the destination state | | `'transition.after'` | `destination` | | | `'machine.after_state_change'` | `destination` | default callbacks declared on model | | `'machine.on_exception'` | `source/destination` | callbacks will be executed when an exception has been raised | | `'machine.finalize_event'` | `source/destination` | callbacks will be executed even if no transition took place or an exception has been raised | If any callback raises an exception, the processing of callbacks is not continued. This means that when an error occurs before the transition (in `state.on_exit` or earlier), it is halted. In case there is a raise after the transition has been conducted (in `state.on_enter` or later), the state change persists and no rollback is happening. Callbacks specified in `machine.finalize_event` will always be executed unless the exception is raised by a finalizing callback itself. Note that each callback sequence has to be finished before the next stage is executed. Blocking callbacks will halt the execution order and therefore block the `trigger` or `dispatch` call itself. If you want callbacks to be executed in parallel, you could have a look at the [extensions](#extensions) `AsyncMachine` for asynchronous processing or `LockedMachine` for threading. ### Passing data Sometimes you need to pass the callback functions registered at machine initialization some data that reflects the model's current state. Transitions allows you to do this in two different ways. First (the default), you can pass any positional or keyword arguments directly to the trigger methods (created when you call `add_transition()`): ```python class Matter(object): def __init__(self): self.set_environment() def set_environment(self, temp=0, pressure=101.325): self.temp = temp self.pressure = pressure def print_temperature(self): print("Current temperature is %d degrees celsius." % self.temp) def print_pressure(self): print("Current pressure is %.2f kPa." % self.pressure) lump = Matter() machine = Machine(lump, ['solid', 'liquid'], initial='solid') machine.add_transition('melt', 'solid', 'liquid', before='set_environment') lump.melt(45) # positional arg; # equivalent to lump.trigger('melt', 45) lump.print_temperature() >>> 'Current temperature is 45 degrees celsius.' machine.set_state('solid') # reset state so we can melt again lump.melt(pressure=300.23) # keyword args also work lump.print_pressure() >>> 'Current pressure is 300.23 kPa.' ``` You can pass any number of arguments you like to the trigger. There is one important limitation to this approach: every callback function triggered by the state transition must be able to handle _all_ of the arguments. This may cause problems if the callbacks each expect somewhat different data. To get around this, Transitions supports an alternate method for sending data. If you set `send_event=True` at `Machine` initialization, all arguments to the triggers will be wrapped in an `EventData` instance and passed on to every callback. (The `EventData` object also maintains internal references to the source state, model, transition, machine, and trigger associated with the event, in case you need to access these for anything.) ```python class Matter(object): def __init__(self): self.temp = 0 self.pressure = 101.325 # Note that the sole argument is now the EventData instance. # This object stores positional arguments passed to the trigger method in the # .args property, and stores keywords arguments in the .kwargs dictionary. def set_environment(self, event): self.temp = event.kwargs.get('temp', 0) self.pressure = event.kwargs.get('pressure', 101.325) def print_pressure(self): print("Current pressure is %.2f kPa." % self.pressure) lump = Matter() machine = Machine(lump, ['solid', 'liquid'], send_event=True, initial='solid') machine.add_transition('melt', 'solid', 'liquid', before='set_environment') lump.melt(temp=45, pressure=1853.68) # keyword args lump.print_pressure() >>> 'Current pressure is 1853.68 kPa.' ``` ### Alternative initialization patterns In all of the examples so far, we've attached a new `Machine` instance to a separate model (`lump`, an instance of class `Matter`). While this separation keeps things tidy (because you don't have to monkey patch a whole bunch of new methods into the `Matter` class), it can also get annoying, since it requires you to keep track of which methods are called on the state machine, and which ones are called on the model that the state machine is bound to (e.g., `lump.on_enter_StateA()` vs. `machine.add_transition()`). Fortunately, Transitions is flexible, and supports two other initialization patterns. First, you can create a standalone state machine that doesn't require another model at all. Simply omit the model argument during initialization: ```python machine = Machine(states=states, transitions=transitions, initial='solid') machine.melt() machine.state >>> 'liquid' ``` If you initialize the machine this way, you can then attach all triggering events (like `evaporate()`, `sublimate()`, etc.) and all callback functions directly to the `Machine` instance. This approach has the benefit of consolidating all of the state machine functionality in one place, but can feel a little bit unnatural if you think state logic should be contained within the model itself rather than in a separate controller. An alternative (potentially better) approach is to have the model inherit from the `Machine` class. Transitions is designed to support inheritance seamlessly. (just be sure to override class `Machine`'s `__init__` method!): ```python class Matter(Machine): def say_hello(self): print("hello, new state!") def say_goodbye(self): print("goodbye, old state!") def __init__(self): states = ['solid', 'liquid', 'gas'] Machine.__init__(self, states=states, initial='solid') self.add_transition('melt', 'solid', 'liquid') lump = Matter() lump.state >>> 'solid' lump.melt() lump.state >>> 'liquid' ``` Here you get to consolidate all state machine functionality into your existing model, which often feels more natural than sticking all of the functionality we want in a separate standalone `Machine` instance. A machine can handle multiple models which can be passed as a list like `Machine(model=[model1, model2, ...])`. In cases where you want to add models _as well as_ the machine instance itself, you can pass the class variable placeholder (string) `Machine.self_literal` during initialization like `Machine(model=[Machine.self_literal, model1, ...])`. You can also create a standalone machine, and register models dynamically via `machine.add_model` by passing `model=None` to the constructor. Furthermore, you can use `machine.dispatch` to trigger events on all currently added models. Remember to call `machine.remove_model` if machine is long-lasting and your models are temporary and should be garbage collected: ```python class Matter(): pass lump1 = Matter() lump2 = Matter() # setting 'model' to None or passing an empty list will initialize the machine without a model machine = Machine(model=None, states=states, transitions=transitions, initial='solid') machine.add_model(lump1) machine.add_model(lump2, initial='liquid') lump1.state >>> 'solid' lump2.state >>> 'liquid' # custom events as well as auto transitions can be dispatched to all models machine.dispatch("to_plasma") lump1.state >>> 'plasma' assert lump1.state == lump2.state machine.remove_model([lump1, lump2]) del lump1 # lump1 is garbage collected del lump2 # lump2 is garbage collected ``` If you don't provide an initial state in the state machine constructor, `transitions` will create and add a default state called `'initial'`. If you do not want a default initial state, you can pass `initial=None`. However, in this case you need to pass an initial state every time you add a model. ```python machine = Machine(model=None, states=states, transitions=transitions, initial=None) machine.add_model(Matter()) >>> "MachineError: No initial state configured for machine, must specify when adding model." machine.add_model(Matter(), initial='liquid') ``` Models with multiple states could attach multiple machines using different `model_attribute` values. As mentioned in [Checking state](#checking-state), this will add custom `is/to__` functions: ```python lump = Matter() matter_machine = Machine(lump, states=['solid', 'liquid', 'gas'], initial='solid') # add a second machine to the same model but assign a different state attribute shipment_machine = Machine(lump, states=['delivered', 'shipping'], initial='delivered', model_attribute='shipping_state') lump.state >>> 'solid' lump.is_solid() # check the default field >>> True lump.shipping_state >>> 'delivered' lump.is_shipping_state_delivered() # check the custom field. >>> True lump.to_shipping_state_shipping() >>> True lump.is_shipping_state_delivered() >>> False ``` ### Logging Transitions includes very rudimentary logging capabilities. A number of events – namely, state changes, transition triggers, and conditional checks – are logged as INFO-level events using the standard Python `logging` module. This means you can easily configure logging to standard output in a script: ```python # Set up logging; The basic log level will be DEBUG import logging logging.basicConfig(level=logging.DEBUG) # Set transitions' log level to INFO; DEBUG messages will be omitted logging.getLogger('transitions').setLevel(logging.INFO) # Business as usual machine = Machine(states=states, transitions=transitions, initial='solid') ... ``` ### (Re-)Storing machine instances Machines are picklable and can be stored and loaded with `pickle`. For Python 3.3 and earlier `dill` is required. ```python import dill as pickle # only required for Python 3.3 and earlier m = Machine(states=['A', 'B', 'C'], initial='A') m.to_B() m.state >>> B # store the machine dump = pickle.dumps(m) # load the Machine instance again m2 = pickle.loads(dump) m2.state >>> B m2.states.keys() >>> ['A', 'B', 'C'] ``` ### Extensions Even though the core of transitions is kept lightweight, there are a variety of MixIns to extend its functionality. Currently supported are: - **Diagrams** to visualize the current state of a machine - **Hierarchical State Machines** for nesting and reuse - **Threadsafe Locks** for parallel execution - **Async callbacks** for asynchronous execution - **Custom States** for extended state-related behaviour There are two mechanisms to retrieve a state machine instance with the desired features enabled. The first approach makes use of the convenience `factory` with the four parameters `graph`, `nested`, `locked` or `asyncio` set to `True` if the feature is required: ```python from transitions.extensions import MachineFactory # create a machine with mixins diagram_cls = MachineFactory.get_predefined(graph=True) nested_locked_cls = MachineFactory.get_predefined(nested=True, locked=True) async_machine_cls = MachineFactory.get_predefined(asyncio=True) # create instances from these classes # instances can be used like simple machines machine1 = diagram_cls(model, state, transitions) machine2 = nested_locked_cls(model, state, transitions) ``` This approach targets experimental use since in this case the underlying classes do not have to be known. However, classes can also be directly imported from `transitions.extensions`. The naming scheme is as follows: | | Diagrams | Nested | Locked | Asyncio | | -----------------------------: | :------: | :----: | :----: | :-----: | | Machine | ✘ | ✘ | ✘ | ✘ | | GraphMachine | ✓ | ✘ | ✘ | ✘ | | HierarchicalMachine | ✘ | ✓ | ✘ | ✘ | | LockedMachine | ✘ | ✘ | ✓ | ✘ | | HierarchicalGraphMachine | ✓ | ✓ | ✘ | ✘ | | LockedGraphMachine | ✓ | ✘ | ✓ | ✘ | | LockedHierarchicalMachine | ✘ | ✓ | ✓ | ✘ | | LockedHierarchicalGraphMachine | ✓ | ✓ | ✓ | ✘ | | AsyncMachine | ✘ | ✘ | ✘ | ✓ | | AsyncGraphMachine | ✓ | ✘ | ✘ | ✓ | | HierarchicalAsyncMachine | ✘ | ✓ | ✘ | ✓ | | HierarchicalAsyncGraphMachine | ✓ | ✓ | ✘ | ✓ | To use a feature-rich state machine, one could write: ```python from transitions.extensions import LockedHierarchicalGraphMachine as LHGMachine machine = LHGMachine(model, states, transitions) ``` #### Diagrams Additional Keywords: - `title` (optional): Sets the title of the generated image. - `show_conditions` (default False): Shows conditions at transition edges - `show_auto_transitions` (default False): Shows auto transitions in graph - `show_state_attributes` (default False): Show callbacks (enter, exit), tags and timeouts in graph Transitions can generate basic state diagrams displaying all valid transitions between states. To use the graphing functionality, you'll need to have `graphviz` and/or `pygraphviz` installed: To generate graphs with the package `graphviz`, you need to install [Graphviz](https://graphviz.org/) manually or via a package manager. sudo apt-get install graphviz graphviz-dev # Ubuntu and Debian brew install graphviz # MacOS conda install graphviz python-graphviz # (Ana)conda Now you can install the actual Python packages pip install graphviz pygraphviz # install graphviz and/or pygraphviz manually... pip install transitions[diagrams] # ... or install transitions with 'diagrams' extras which currently depends on pygraphviz Currently, `GraphMachine` will use `pygraphviz` when available and fall back to `graphviz` when `pygraphviz` cannot be found. This can be overridden by passing `use_pygraphviz=False` to the constructor. Note that this default might change in the future and `pygraphviz` support may be dropped. With `Model.get_graph()` you can get the current graph or the region of interest (roi) and draw it like this: ```python # import transitions from transitions.extensions import GraphMachine m = Model() # without further arguments pygraphviz will be used machine = GraphMachine(model=m, ...) # when you want to use graphviz explicitly machine = GraphMachine(model=m, use_pygraphviz=False, ...) # in cases where auto transitions should be visible machine = GraphMachine(model=m, show_auto_transitions=True, ...) # draw the whole graph ... m.get_graph().draw('my_state_diagram.png', prog='dot') # ... or just the region of interest # (previous state, active state and all reachable states) roi = m.get_graph(show_roi=True).draw('my_state_diagram.png', prog='dot') ``` This produces something like this: ![state diagram example](https://user-images.githubusercontent.com/205986/47524268-725c1280-d89a-11e8-812b-1d3b6e667b91.png) Independent of the backend you use, the draw function also accepts a file descriptor or a binary stream as the first argument. If you set this parameter to `None`, the byte stream will be returned: ```python import io with open('a_graph.png', 'bw') as f: # you need to pass the format when you pass objects instead of filenames. m.get_graph().draw(f, format="png", prog='dot') # you can pass a (binary) stream too b = io.BytesIO() m.get_graph().draw(b, format="png", prog='dot') # or just handle the binary string yourself result = m.get_graph().draw(None, format="png", prog='dot') assert result == b.getvalue() ``` References and partials passed as callbacks will be resolved as good as possible: ```python from transitions.extensions import GraphMachine from functools import partial class Model: def clear_state(self, deep=False, force=False): print("Clearing state ...") return True model = Model() machine = GraphMachine(model=model, states=['A', 'B', 'C'], transitions=[ {'trigger': 'clear', 'source': 'B', 'dest': 'A', 'conditions': model.clear_state}, {'trigger': 'clear', 'source': 'C', 'dest': 'A', 'conditions': partial(model.clear_state, False, force=True)}, ], initial='A', show_conditions=True) model.get_graph().draw('my_state_diagram.png', prog='dot') ``` This should produce something similar to this: ![state diagram references_example](https://user-images.githubusercontent.com/205986/110783076-39087f80-8268-11eb-8fa1-fc7bac97f4cf.png) If the format of references does not suit your needs, you can override the static method `GraphMachine.format_references`. If you want to skip reference entirely, just let `GraphMachine.format_references` return `None`. Also, have a look at our [example](./examples) IPython/Jupyter notebooks for a more detailed example about how to use and edit graphs. ### Hierarchical State Machine (HSM) Transitions includes an extension module which allows nesting states. This allows us to create contexts and to model cases where states are related to certain subtasks in the state machine. To create a nested state, either import `NestedState` from transitions or use a dictionary with the initialization arguments `name` and `children`. Optionally, `initial` can be used to define a sub state to transit to, when the nested state is entered. ```python from transitions.extensions import HierarchicalMachine states = ['standing', 'walking', {'name': 'caffeinated', 'children':['dithering', 'running']}] transitions = [ ['walk', 'standing', 'walking'], ['stop', 'walking', 'standing'], ['drink', '*', 'caffeinated'], ['walk', ['caffeinated', 'caffeinated_dithering'], 'caffeinated_running'], ['relax', 'caffeinated', 'standing'] ] machine = HierarchicalMachine(states=states, transitions=transitions, initial='standing', ignore_invalid_triggers=True) machine.walk() # Walking now machine.stop() # let's stop for a moment machine.drink() # coffee time machine.state >>> 'caffeinated' machine.walk() # we have to go faster machine.state >>> 'caffeinated_running' machine.stop() # can't stop moving! machine.state >>> 'caffeinated_running' machine.relax() # leave nested state machine.state # phew, what a ride >>> 'standing' # machine.on_enter_caffeinated_running('callback_method') ``` A configuration making use of `initial` could look like this: ```python # ... states = ['standing', 'walking', {'name': 'caffeinated', 'initial': 'dithering', 'children': ['dithering', 'running']}] transitions = [ ['walk', 'standing', 'walking'], ['stop', 'walking', 'standing'], # this transition will end in 'caffeinated_dithering'... ['drink', '*', 'caffeinated'], # ... that is why we do not need do specify 'caffeinated' here anymore ['walk', 'caffeinated_dithering', 'caffeinated_running'], ['relax', 'caffeinated', 'standing'] ] # ... ``` The `initial` keyword of the `HierarchicalMachine` constructor accepts nested states (e.g. `initial='caffeinated_running'`) and a list of states which is considered to be a parallel state (e.g. `initial=['A', 'B']`) or the current state of another model (`initial=model.state`) which should be effectively one of the previous mentioned options. Note that when passing a string, `transition` will check the targeted state for `initial` substates and use this as an entry state. This will be done recursively until a substate does not mention an initial state. Parallel states or a state passed as a list will be used 'as is' and no further initial evaluation will be conducted. Note that your previously created state object _must be_ a `NestedState` or a derived class of it. The standard `State` class used in simple `Machine` instances lacks features required for nesting. ```python from transitions.extensions.nesting import HierarchicalMachine, NestedState from transitions import State m = HierarchicalMachine(states=['A'], initial='initial') m.add_state('B') # fine m.add_state({'name': 'C'}) # also fine m.add_state(NestedState('D')) # fine as well m.add_state(State('E')) # does not work! ``` Some things that have to be considered when working with nested states: State _names are concatenated_ with `NestedState.separator`. Currently the separator is set to underscore ('\_') and therefore behaves similar to the basic machine. This means a substate `bar` from state `foo` will be known by `foo_bar`. A substate `baz` of `bar` will be referred to as `foo_bar_baz` and so on. When entering a substate, `enter` will be called for all parent states. The same is true for exiting substates. Third, nested states can overwrite transition behaviour of their parents. If a transition is not known to the current state it will be delegated to its parent. **This means that in the standard configuration, state names in HSMs MUST NOT contain underscores.** For `transitions` it's impossible to tell whether `machine.add_state('state_name')` should add a state named `state_name` or add a substate `name` to the state `state`. In some cases this is not sufficient however. For instance if state names consist of more than one word and you want/need to use underscore to separate them instead of `CamelCase`. To deal with this, you can change the character used for separation quite easily. You can even use fancy unicode characters if you use Python 3. Setting the separator to something else than underscore changes some of the behaviour (auto_transition and setting callbacks) though: ```python from transitions.extensions import HierarchicalMachine from transitions.extensions.nesting import NestedState NestedState.separator = '↦' states = ['A', 'B', {'name': 'C', 'children':['1', '2', {'name': '3', 'children': ['a', 'b', 'c']} ]} ] transitions = [ ['reset', 'C', 'A'], ['reset', 'C↦2', 'C'] # overwriting parent reset ] # we rely on auto transitions machine = HierarchicalMachine(states=states, transitions=transitions, initial='A') machine.to_B() # exit state A, enter state B machine.to_C() # exit B, enter C machine.to_C.s3.a() # enter C↦a; enter C↦3↦a; machine.state >>> 'C↦3↦a' assert machine.is_C.s3.a() machine.to('C↦2') # not interactive; exit C↦3↦a, exit C↦3, enter C↦2 machine.reset() # exit C↦2; reset C has been overwritten by C↦3 machine.state >>> 'C' machine.reset() # exit C, enter A machine.state >>> 'A' # s.on_enter('C↦3↦a', 'callback_method') ``` Instead of `to_C_3_a()` auto transition is called as `to_C.s3.a()`. If your substate starts with a digit, transitions adds a prefix 's' ('3' becomes 's3') to the auto transition `FunctionWrapper` to comply with the attribute naming scheme of Python. If interactive completion is not required, `to('C↦3↦a')` can be called directly. Additionally, `on_enter/exit_<>` is replaced with `on_enter/exit(state_name, callback)`. State checks can be conducted in a similar fashion. Instead of `is_C_3_a()`, the `FunctionWrapper` variant `is_C.s3.a()` can be used. To check whether the current state is a substate of a specific state, `is_state` supports the keyword `allow_substates`: ```python machine.state >>> 'C.2.a' machine.is_C() # checks for specific states >>> False machine.is_C(allow_substates=True) >>> True assert machine.is_C.s2() is False assert machine.is_C.s2(allow_substates=True) # FunctionWrapper support allow_substate as well ``` _new in 0.8.0_ You can use enumerations in HSMs as well but keep in mind that `Enum` are compared by value. If you have a value more than once in a state tree those states cannot be distinguished. ```python states = [States.RED, States.YELLOW, {'name': States.GREEN, 'children': ['tick', 'tock']}] states = ['A', {'name': 'B', 'children': states, 'initial': States.GREEN}, States.GREEN] machine = HierarchicalMachine(states=states) machine.to_B() machine.is_GREEN() # returns True even though the actual state is B_GREEN ``` _new in 0.8.0_ `HierarchicalMachine` has been rewritten from scratch to support parallel states and better isolation of nested states. This involves some tweaks based on community feedback. To get an idea of processing order and configuration have a look at the following example: ```python from transitions.extensions.nesting import HierarchicalMachine import logging states = ['A', 'B', {'name': 'C', 'parallel': [{'name': '1', 'children': ['a', 'b', 'c'], 'initial': 'a', 'transitions': [['go', 'a', 'b']]}, {'name': '2', 'children': ['x', 'y', 'z'], 'initial': 'z'}], 'transitions': [['go', '2_z', '2_x']]}] transitions = [['reset', 'C_1_b', 'B']] logging.basicConfig(level=logging.INFO) machine = HierarchicalMachine(states=states, transitions=transitions, initial='A') machine.to_C() # INFO:transitions.extensions.nesting:Exited state A # INFO:transitions.extensions.nesting:Entered state C # INFO:transitions.extensions.nesting:Entered state C_1 # INFO:transitions.extensions.nesting:Entered state C_2 # INFO:transitions.extensions.nesting:Entered state C_1_a # INFO:transitions.extensions.nesting:Entered state C_2_z machine.go() # INFO:transitions.extensions.nesting:Exited state C_1_a # INFO:transitions.extensions.nesting:Entered state C_1_b # INFO:transitions.extensions.nesting:Exited state C_2_z # INFO:transitions.extensions.nesting:Entered state C_2_x machine.reset() # INFO:transitions.extensions.nesting:Exited state C_1_b # INFO:transitions.extensions.nesting:Exited state C_2_x # INFO:transitions.extensions.nesting:Exited state C_1 # INFO:transitions.extensions.nesting:Exited state C_2 # INFO:transitions.extensions.nesting:Exited state C # INFO:transitions.extensions.nesting:Entered state B ``` When using `parallel` instead of `children`, `transitions` will enter all states of the passed list at the same time. Which substate to enter is defined by `initial` which should _always_ point to a direct substate. A novel feature is to define local transitions by passing the `transitions` keyword in a state definition. The above defined transition `['go', 'a', 'b']` is only valid in `C_1`. While you can reference substates as done in `['go', '2_z', '2_x']` you cannot reference parent states directly in locally defined transitions. When a parent state is exited, its children will also be exited. In addition to the processing order of transitions known from `Machine` where transitions are considered in the order they were added, `HierarchicalMachine` considers hierarchy as well. Transitions defined in substates will be evaluated first (e.g. `C_1_a` is left before `C_2_z`) and transitions defined with wildcard `*` will (for now) only add transitions to root states (in this example `A`, `B`, `C`) Starting with _0.8.0_ nested states can be added directly and will issue the creation of parent states on-the-fly: ```python m = HierarchicalMachine(states=['A'], initial='A') m.add_state('B_1_a') m.to_B_1() assert m.is_B(allow_substates=True) ``` #### Reuse of previously created HSMs Besides semantic order, nested states are very handy if you want to specify state machines for specific tasks and plan to reuse them. Before _0.8.0_, a `HierarchicalMachine` would not integrate the machine instance itself but the states and transitions by creating copies of them. However, since _0.8.0_ `(Nested)State` instances are just **referenced** which means changes in one machine's collection of states and events will influence the other machine instance. Models and their state will not be shared though. Note that events and transitions are also copied by reference and will be shared by both instances if you do not use the `remap` keyword. This change was done to be more in line with `Machine` which also uses passed `State` instances by reference. ```python count_states = ['1', '2', '3', 'done'] count_trans = [ ['increase', '1', '2'], ['increase', '2', '3'], ['decrease', '3', '2'], ['decrease', '2', '1'], ['done', '3', 'done'], ['reset', '*', '1'] ] counter = HierarchicalMachine(states=count_states, transitions=count_trans, initial='1') counter.increase() # love my counter states = ['waiting', 'collecting', {'name': 'counting', 'children': counter}] transitions = [ ['collect', '*', 'collecting'], ['wait', '*', 'waiting'], ['count', 'collecting', 'counting'] ] collector = HierarchicalMachine(states=states, transitions=transitions, initial='waiting') collector.collect() # collecting collector.count() # let's see what we got; counting_1 collector.increase() # counting_2 collector.increase() # counting_3 collector.done() # collector.state == counting_done collector.wait() # collector.state == waiting ``` If a `HierarchicalMachine` is passed with the `children` keyword, the initial state of this machine will be assigned to the new parent state. In the above example we see that entering `counting` will also enter `counting_1`. If this is undesired behaviour and the machine should rather halt in the parent state, the user can pass `initial` as `False` like `{'name': 'counting', 'children': counter, 'initial': False}`. Sometimes you want such an embedded state collection to 'return' which means after it is done it should exit and transit to one of your super states. To achieve this behaviour you can remap state transitions. In the example above we would like the counter to return if the state `done` was reached. This is done as follows: ```python states = ['waiting', 'collecting', {'name': 'counting', 'children': counter, 'remap': {'done': 'waiting'}}] ... # same as above collector.increase() # counting_3 collector.done() collector.state >>> 'waiting' # be aware that 'counting_done' will be removed from the state machine ``` As mentioned above, using `remap` will **copy** events and transitions since they could not be valid in the original state machine. If a reused state machine does not have a final state, you can of course add the transitions manually. If 'counter' had no 'done' state, we could just add `['done', 'counter_3', 'waiting']` to achieve the same behaviour. In cases where you want states and transitions to be copied by value rather than reference (for instance, if you want to keep the pre-0.8 behaviour) you can do so by creating a `NestedState` and assigning deep copies of the machine's events and states to it. ```python from transitions.extensions.nesting import NestedState from copy import deepcopy # ... configuring and creating counter counting_state = NestedState(name="counting", initial='1') counting_state.states = deepcopy(counter.states) counting_state.events = deepcopy(counter.events) states = ['waiting', 'collecting', counting_state] ``` For complex state machines, sharing configurations rather than instantiated machines might be more feasible. Especially since instantiated machines must be derived from `HierarchicalMachine`. Such configurations can be stored and loaded easily via JSON or YAML (see the [FAQ](examples/Frequently%20asked%20questions.ipynb)). `HierarchicalMachine` allows defining substates either with the keyword `children` or `states`. If both are present, only `children` will be considered. ```python counter_conf = { 'name': 'counting', 'states': ['1', '2', '3', 'done'], 'transitions': [ ['increase', '1', '2'], ['increase', '2', '3'], ['decrease', '3', '2'], ['decrease', '2', '1'], ['done', '3', 'done'], ['reset', '*', '1'] ], 'initial': '1' } collector_conf = { 'name': 'collector', 'states': ['waiting', 'collecting', counter_conf], 'transitions': [ ['collect', '*', 'collecting'], ['wait', '*', 'waiting'], ['count', 'collecting', 'counting'] ], 'initial': 'waiting' } collector = HierarchicalMachine(**collector_conf) collector.collect() collector.count() collector.increase() assert collector.is_counting_2() ``` #### Threadsafe(-ish) State Machine In cases where event dispatching is done in threads, one can use either `LockedMachine` or `LockedHierarchicalMachine` where **function access** (!sic) is secured with reentrant locks. This does not save you from corrupting your machine by tinkering with member variables of your model or state machine. ```python from transitions.extensions import LockedMachine from threading import Thread import time states = ['A', 'B', 'C'] machine = LockedMachine(states=states, initial='A') # let us assume that entering B will take some time thread = Thread(target=machine.to_B) thread.start() time.sleep(0.01) # thread requires some time to start machine.to_C() # synchronized access; won't execute before thread is done # accessing attributes directly thread = Thread(target=machine.to_B) thread.start() machine.new_attrib = 42 # not synchronized! will mess with execution order ``` Any python context manager can be passed in via the `machine_context` keyword argument: ```python from transitions.extensions import LockedMachine from threading import RLock states = ['A', 'B', 'C'] lock1 = RLock() lock2 = RLock() machine = LockedMachine(states=states, initial='A', machine_context=[lock1, lock2]) ``` Any contexts via `machine_model` will be shared between all models registered with the `Machine`. Per-model contexts can be added as well: ```python lock3 = RLock() machine.add_model(model, model_context=lock3) ``` It's important that all user-provided context managers are re-entrant since the state machine will call them multiple times, even in the context of a single trigger invocation. #### Using async callbacks If you are using Python 3.7 or later, you can use `AsyncMachine` to work with asynchronous callbacks. You can mix synchronous and asynchronous callbacks if you like but this may have undesired side effects. Note that events need to be awaited and the event loop must also be handled by you. ```python from transitions.extensions.asyncio import AsyncMachine import asyncio import time class AsyncModel: def prepare_model(self): print("I am synchronous.") self.start_time = time.time() async def before_change(self): print("I am asynchronous and will block now for 100 milliseconds.") await asyncio.sleep(0.1) print("I am done waiting.") def sync_before_change(self): print("I am synchronous and will block the event loop (what I probably shouldn't)") time.sleep(0.1) print("I am done waiting synchronously.") def after_change(self): print(f"I am synchronous again. Execution took {int((time.time() - self.start_time) * 1000)} ms.") transition = dict(trigger="start", source="Start", dest="Done", prepare="prepare_model", before=["before_change"] * 5 + ["sync_before_change"], after="after_change") # execute before function in asynchronously 5 times model = AsyncModel() machine = AsyncMachine(model, states=["Start", "Done"], transitions=[transition], initial='Start') asyncio.get_event_loop().run_until_complete(model.start()) # >>> I am synchronous. # I am asynchronous and will block now for 100 milliseconds. # I am asynchronous and will block now for 100 milliseconds. # I am asynchronous and will block now for 100 milliseconds. # I am asynchronous and will block now for 100 milliseconds. # I am asynchronous and will block now for 100 milliseconds. # I am synchronous and will block the event loop (what I probably shouldn't) # I am done waiting synchronously. # I am done waiting. # I am done waiting. # I am done waiting. # I am done waiting. # I am done waiting. # I am synchronous again. Execution took 101 ms. assert model.is_Done() ``` So, why do you need to use Python 3.7 or later you may ask. Async support has been introduced earlier. `AsyncMachine` makes use of `contextvars` to handle running callbacks when new events arrive before a transition has been finished: ```python async def await_never_return(): await asyncio.sleep(100) raise ValueError("That took too long!") async def fix(): await m2.fix() m1 = AsyncMachine(states=['A', 'B', 'C'], initial='A', name="m1") m2 = AsyncMachine(states=['A', 'B', 'C'], initial='A', name="m2") m2.add_transition(trigger='go', source='A', dest='B', before=await_never_return) m2.add_transition(trigger='fix', source='A', dest='C') m1.add_transition(trigger='go', source='A', dest='B', after='go') m1.add_transition(trigger='go', source='B', dest='C', after=fix) asyncio.get_event_loop().run_until_complete(asyncio.gather(m2.go(), m1.go())) assert m1.state == m2.state ``` This example actually illustrates two things: First, that 'go' called in m1's transition from `A` to be `B` is not cancelled and second, calling `m2.fix()` will halt the transition attempt of m2 from `A` to `B` by executing 'fix' from `A` to `C`. This separation would not be possible without `contextvars`. Note that `prepare` and `conditions` are NOT treated as ongoing transitions. This means that after `conditions` have been evaluated, a transition is executed even though another event already happened. Tasks will only be cancelled when run as a `before` callback or later. `AsyncMachine` features a model-special queue mode which can be used when `queued='model'` is passed to the constructor. With a model-specific queue, events will only be queued when they belong to the same model. Furthermore, a raised exception will only clear the event queue of the model that raised that exception. For the sake of simplicity, let's assume that every event in `asyncio.gather` below is not triggered at the same time but slightly delayed: ```python asyncio.gather(model1.event1(), model1.event2(), model2.event1()) # execution order with AsyncMachine(queued=True) # model1.event1 -> model1.event2 -> model2.event1 # execution order with AsyncMachine(queued='model') # (model1.event1, model2.event1) -> model1.event2 asyncio.gather(model1.event1(), model1.error(), model1.event3(), model2.event1(), model2.event2(), model2.event3()) # execution order with AsyncMachine(queued=True) # model1.event1 -> model1.error # execution order with AsyncMachine(queued='model') # (model1.event1, model2.event1) -> (model1.error, model2.event2) -> model2.event3 ``` Note that queue modes must not be changed after machine construction. #### Adding features to states If your superheroes need some custom behaviour, you can throw in some extra functionality by decorating machine states: ```python from time import sleep from transitions import Machine from transitions.extensions.states import add_state_features, Tags, Timeout @add_state_features(Tags, Timeout) class CustomStateMachine(Machine): pass class SocialSuperhero(object): def __init__(self): self.entourage = 0 def on_enter_waiting(self): self.entourage += 1 states = [{'name': 'preparing', 'tags': ['home', 'busy']}, {'name': 'waiting', 'timeout': 1, 'on_timeout': 'go'}, {'name': 'away'}] # The city needs us! transitions = [['done', 'preparing', 'waiting'], ['join', 'waiting', 'waiting'], # Entering Waiting again will increase our entourage ['go', 'waiting', 'away']] # Okay, let' move hero = SocialSuperhero() machine = CustomStateMachine(model=hero, states=states, transitions=transitions, initial='preparing') assert hero.state == 'preparing' # Preparing for the night shift assert machine.get_state(hero.state).is_busy # We are at home and busy hero.done() assert hero.state == 'waiting' # Waiting for fellow superheroes to join us assert hero.entourage == 1 # It's just us so far sleep(0.7) # Waiting... hero.join() # Weeh, we got company sleep(0.5) # Waiting... hero.join() # Even more company \o/ sleep(2) # Waiting... assert hero.state == 'away' # Impatient superhero already left the building assert machine.get_state(hero.state).is_home is False # Yupp, not at home anymore assert hero.entourage == 3 # At least he is not alone ``` Currently, transitions comes equipped with the following state features: - **Timeout** -- triggers an event after some time has passed - keyword: `timeout` (int, optional) -- if passed, an entered state will timeout after `timeout` seconds - keyword: `on_timeout` (string/callable, optional) -- will be called when timeout time has been reached - will raise an `AttributeError` when `timeout` is set but `on_timeout` is not - Note: A timeout is triggered in a thread. This implies several limitations (e.g. catching Exceptions raised in timeouts). Consider an event queue for more sophisticated applications. - **Tags** -- adds tags to states - keyword: `tags` (list, optional) -- assigns tags to a state - `State.is_` will return `True` when the state has been tagged with `tag_name`, else `False` - **Error** -- raises a `MachineError` when a state cannot be left - inherits from `Tags` (if you use `Error` do not use `Tags`) - keyword: `accepted` (bool, optional) -- marks a state as accepted - alternatively the keyword `tags` can be passed, containing 'accepted' - Note: Errors will only be raised if `auto_transitions` has been set to `False`. Otherwise every state can be exited with `to_` methods. - **Volatile** -- initialises an object every time a state is entered - keyword: `volatile` (class, optional) -- every time the state is entered an object of type class will be assigned to the model. The attribute name is defined by `hook`. If omitted, an empty VolatileObject will be created instead - keyword: `hook` (string, default='scope') -- The model's attribute name for the temporal object. You can write your own `State` extensions and add them the same way. Just note that `add_state_features` expects _Mixins_. This means your extension should always call the overridden methods `__init__`, `enter` and `exit`. Your extension may inherit from _State_ but will also work without it. Using `@add_state_features` has a drawback which is that decorated machines cannot be pickled (more precisely, the dynamically generated `CustomState` cannot be pickled). This might be a reason to write a dedicated custom state class instead. Depending on the chosen state machine, your custom state class may need to provide certain state features. For instance, `HierarchicalMachine` requires your custom state to be an instance of `NestedState` (`State` is not sufficient). To inject your states you can either assign them to your `Machine`'s class attribute `state_cls` or override `Machine.create_state` in case you need some specific procedures done whenever a state is created: ```python from transitions import Machine, State class MyState(State): pass class CustomMachine(Machine): # Use MyState as state class state_cls = MyState class VerboseMachine(Machine): # `Machine._create_state` is a class method but we can # override it to be an instance method def _create_state(self, *args, **kwargs): print("Creating a new state with machine '{0}'".format(self.name)) return MyState(*args, **kwargs) ``` If you want to avoid threads in your `AsyncMachine` entirely, you can replace the `Timeout` state feature with `AsyncTimeout` from the `asyncio` extension: ```python import asyncio from transitions.extensions.states import add_state_features from transitions.extensions.asyncio import AsyncTimeout, AsyncMachine @add_state_features(AsyncTimeout) class TimeoutMachine(AsyncMachine): pass states = ['A', {'name': 'B', 'timeout': 0.2, 'on_timeout': 'to_C'}, 'C'] m = TimeoutMachine(states=states, initial='A', queued=True) # see remark below asyncio.run(asyncio.wait([m.to_B(), asyncio.sleep(0.1)])) assert m.is_B() # timeout shouldn't be triggered asyncio.run(asyncio.wait([m.to_B(), asyncio.sleep(0.3)])) assert m.is_C() # now timeout should have been processed ``` You should consider passing `queued=True` to the `TimeoutMachine` constructor. This will make sure that events are processed sequentially and avoid asynchronous [racing conditions](https://github.com/pytransitions/transitions/issues/459) that may appear when timeout and event happen in close proximity. #### Using transitions together with Django You can have a look at the [FAQ](examples/Frequently%20asked%20questions.ipynb) for some inspiration or checkout `django-transitions`. It has been developed by Christian Ledermann and is also hosted on [Github](https://github.com/PrimarySite/django-transitions). [The documentation](https://django-transitions.readthedocs.io/en/latest/) contains some usage examples. ### I have a [bug report/issue/question]... First, congratulations! You reached the end of the documentation! If you want to try out `transitions` before you install it, you can do that in an interactive Jupyter notebook at mybinder.org. Just click this button 👉 [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/pytransitions/transitions/master?filepath=examples%2FPlayground.ipynb). For bug reports and other issues, please [open an issue](https://github.com/pytransitions/transitions) on GitHub. For usage questions, post on Stack Overflow, making sure to tag your question with the [`pytransitions` tag](https://stackoverflow.com/questions/tagged/pytransitions). Do not forget to have a look at the [extended examples](./examples)! For any other questions, solicitations, or large unrestricted monetary gifts, email [Tal Yarkoni](mailto:tyarkoni@gmail.com) (initial author) and/or [Alexander Neumann](mailto:aleneum@gmail.com) (current maintainer). transitions-0.9.0/LICENSE0000644000232200023220000000211214304350474015450 0ustar debalancedebalanceThe MIT License Copyright (c) 2014 - 2020 Tal Yarkoni, Alexander Neumann Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. transitions-0.9.0/.coveragerc0000644000232200023220000000011314304350474016563 0ustar debalancedebalance[run] source = transitions include = */transitions/* relative_files = True transitions-0.9.0/PKG-INFO0000644000232200023220000024037314304350474015555 0ustar debalancedebalanceMetadata-Version: 2.1 Name: transitions Version: 0.9.0 Summary: A lightweight, object-oriented Python state machine implementation with many extensions. Home-page: http://github.com/pytransitions/transitions Download-URL: https://github.com/pytransitions/transitions/archive/0.9.0.tar.gz Author: Tal Yarkoni Author-email: tyarkoni@gmail.com Maintainer: Alexander Neumann Maintainer-email: aleneum@gmail.com License: MIT Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Description-Content-Type: text/markdown Provides-Extra: diagrams Provides-Extra: test License-File: LICENSE ## Quickstart They say [a good example is worth](https://www.google.com/webhp?ie=UTF-8#q=%22a+good+example+is+worth%22&start=20) 100 pages of API documentation, a million directives, or a thousand words. Well, "they" probably lie... but here's an example anyway: ```python from transitions import Machine import random class NarcolepticSuperhero(object): # Define some states. Most of the time, narcoleptic superheroes are just like # everyone else. Except for... states = ['asleep', 'hanging out', 'hungry', 'sweaty', 'saving the world'] def __init__(self, name): # No anonymous superheroes on my watch! Every narcoleptic superhero gets # a name. Any name at all. SleepyMan. SlumberGirl. You get the idea. self.name = name # What have we accomplished today? self.kittens_rescued = 0 # Initialize the state machine self.machine = Machine(model=self, states=NarcolepticSuperhero.states, initial='asleep') # Add some transitions. We could also define these using a static list of # dictionaries, as we did with states above, and then pass the list to # the Machine initializer as the transitions= argument. # At some point, every superhero must rise and shine. self.machine.add_transition(trigger='wake_up', source='asleep', dest='hanging out') # Superheroes need to keep in shape. self.machine.add_transition('work_out', 'hanging out', 'hungry') # Those calories won't replenish themselves! self.machine.add_transition('eat', 'hungry', 'hanging out') # Superheroes are always on call. ALWAYS. But they're not always # dressed in work-appropriate clothing. self.machine.add_transition('distress_call', '*', 'saving the world', before='change_into_super_secret_costume') # When they get off work, they're all sweaty and disgusting. But before # they do anything else, they have to meticulously log their latest # escapades. Because the legal department says so. self.machine.add_transition('complete_mission', 'saving the world', 'sweaty', after='update_journal') # Sweat is a disorder that can be remedied with water. # Unless you've had a particularly long day, in which case... bed time! self.machine.add_transition('clean_up', 'sweaty', 'asleep', conditions=['is_exhausted']) self.machine.add_transition('clean_up', 'sweaty', 'hanging out') # Our NarcolepticSuperhero can fall asleep at pretty much any time. self.machine.add_transition('nap', '*', 'asleep') def update_journal(self): """ Dear Diary, today I saved Mr. Whiskers. Again. """ self.kittens_rescued += 1 @property def is_exhausted(self): """ Basically a coin toss. """ return random.random() < 0.5 def change_into_super_secret_costume(self): print("Beauty, eh?") ``` There, now you've baked a state machine into `NarcolepticSuperhero`. Let's take him/her/it out for a spin... ```python >>> batman = NarcolepticSuperhero("Batman") >>> batman.state 'asleep' >>> batman.wake_up() >>> batman.state 'hanging out' >>> batman.nap() >>> batman.state 'asleep' >>> batman.clean_up() MachineError: "Can't trigger event clean_up from state asleep!" >>> batman.wake_up() >>> batman.work_out() >>> batman.state 'hungry' # Batman still hasn't done anything useful... >>> batman.kittens_rescued 0 # We now take you live to the scene of a horrific kitten entreement... >>> batman.distress_call() 'Beauty, eh?' >>> batman.state 'saving the world' # Back to the crib. >>> batman.complete_mission() >>> batman.state 'sweaty' >>> batman.clean_up() >>> batman.state 'asleep' # Too tired to shower! # Another productive day, Alfred. >>> batman.kittens_rescued 1 ``` While we cannot read the mind of the actual batman, we surely can visualize the current state of our `NarcolepticSuperhero`. ![batman diagram](https://user-images.githubusercontent.com/205986/104932302-c2f24580-59a7-11eb-8963-5dce738b9305.png) Have a look at the [Diagrams](#diagrams) extensions if you want to know how. ## The non-quickstart ### Basic initialization Getting a state machine up and running is pretty simple. Let's say you have the object `lump` (an instance of class `Matter`), and you want to manage its states: ```python class Matter(object): pass lump = Matter() ``` You can initialize a (_minimal_) working state machine bound to `lump` like this: ```python from transitions import Machine machine = Machine(model=lump, states=['solid', 'liquid', 'gas', 'plasma'], initial='solid') # Lump now has state! lump.state >>> 'solid' ``` I say "minimal", because while this state machine is technically operational, it doesn't actually _do_ anything. It starts in the `'solid'` state, but won't ever move into another state, because no transitions are defined... yet! Let's try again. ```python # The states states=['solid', 'liquid', 'gas', 'plasma'] # And some transitions between states. We're lazy, so we'll leave out # the inverse phase transitions (freezing, condensation, etc.). transitions = [ { 'trigger': 'melt', 'source': 'solid', 'dest': 'liquid' }, { 'trigger': 'evaporate', 'source': 'liquid', 'dest': 'gas' }, { 'trigger': 'sublimate', 'source': 'solid', 'dest': 'gas' }, { 'trigger': 'ionize', 'source': 'gas', 'dest': 'plasma' } ] # Initialize machine = Machine(lump, states=states, transitions=transitions, initial='liquid') # Now lump maintains state... lump.state >>> 'liquid' # And that state can change... lump.evaporate() lump.state >>> 'gas' lump.trigger('ionize') lump.state >>> 'plasma' ``` Notice the shiny new methods attached to the `Matter` instance (`evaporate()`, `ionize()`, etc.). Each method triggers the corresponding transition. You don't have to explicitly define these methods anywhere; the name of each transition is bound to the model passed to the `Machine` initializer (in this case, `lump`). To be more precise, your model **should not** already contain methods with the same name as event triggers since `transitions` will only attach convenience methods to your model if the spot is not already taken. If you want to modify that behaviour, have a look at the [FAQ](examples/Frequently%20asked%20questions.ipynb). Furthermore, there is a method called `trigger` now attached to your model (if it hasn't been there before). This method lets you execute transitions by name in case dynamic triggering is required. ### States The soul of any good state machine (and of many bad ones, no doubt) is a set of states. Above, we defined the valid model states by passing a list of strings to the `Machine` initializer. But internally, states are actually represented as `State` objects. You can initialize and modify States in a number of ways. Specifically, you can: - pass a string to the `Machine` initializer giving the name(s) of the state(s), or - directly initialize each new `State` object, or - pass a dictionary with initialization arguments The following snippets illustrate several ways to achieve the same goal: ```python # import Machine and State class from transitions import Machine, State # Create a list of 3 states to pass to the Machine # initializer. We can mix types; in this case, we # pass one State, one string, and one dict. states = [ State(name='solid'), 'liquid', { 'name': 'gas'} ] machine = Machine(lump, states) # This alternative example illustrates more explicit # addition of states and state callbacks, but the net # result is identical to the above. machine = Machine(lump) solid = State('solid') liquid = State('liquid') gas = State('gas') machine.add_states([solid, liquid, gas]) ``` States are initialized _once_ when added to the machine and will persist until they are removed from it. In other words: if you alter the attributes of a state object, this change will NOT be reset the next time you enter that state. Have a look at how to [extend state features](#state-features) in case you require some other behaviour. #### Callbacks A `State` can also be associated with a list of `enter` and `exit` callbacks, which are called whenever the state machine enters or leaves that state. You can specify callbacks during initialization by passing them to a `State` object constructor, in a state property dictionary, or add them later. For convenience, whenever a new `State` is added to a `Machine`, the methods `on_enter_«state name»` and `on_exit_«state name»` are dynamically created on the Machine (not on the model!), which allow you to dynamically add new enter and exit callbacks later if you need them. ```python # Our old Matter class, now with a couple of new methods we # can trigger when entering or exit states. class Matter(object): def say_hello(self): print("hello, new state!") def say_goodbye(self): print("goodbye, old state!") lump = Matter() # Same states as above, but now we give StateA an exit callback states = [ State(name='solid', on_exit=['say_goodbye']), 'liquid', { 'name': 'gas', 'on_exit': ['say_goodbye']} ] machine = Machine(lump, states=states) machine.add_transition('sublimate', 'solid', 'gas') # Callbacks can also be added after initialization using # the dynamically added on_enter_ and on_exit_ methods. # Note that the initial call to add the callback is made # on the Machine and not on the model. machine.on_enter_gas('say_hello') # Test out the callbacks... machine.set_state('solid') lump.sublimate() >>> 'goodbye, old state!' >>> 'hello, new state!' ``` Note that `on_enter_«state name»` callback will _not_ fire when a Machine is first initialized. For example if you have an `on_enter_A()` callback defined, and initialize the `Machine` with `initial='A'`, `on_enter_A()` will not be fired until the next time you enter state `A`. (If you need to make sure `on_enter_A()` fires at initialization, you can simply create a dummy initial state and then explicitly call `to_A()` inside the `__init__` method.) In addition to passing in callbacks when initializing a `State`, or adding them dynamically, it's also possible to define callbacks in the model class itself, which may increase code clarity. For example: ```python class Matter(object): def say_hello(self): print("hello, new state!") def say_goodbye(self): print("goodbye, old state!") def on_enter_A(self): print("We've just entered state A!") lump = Matter() machine = Machine(lump, states=['A', 'B', 'C']) ``` Now, any time `lump` transitions to state `A`, the `on_enter_A()` method defined in the `Matter` class will fire. #### Checking state You can always check the current state of the model by either: - inspecting the `.state` attribute, or - calling `is_«state name»()` And if you want to retrieve the actual `State` object for the current state, you can do that through the `Machine` instance's `get_state()` method. ```python lump.state >>> 'solid' lump.is_gas() >>> False lump.is_solid() >>> True machine.get_state(lump.state).name >>> 'solid' ``` If you'd like you can choose your own state attribute name by passing the `model_attribute` argument while initializing the `Machine`. This will also change the name of `is_«state name»()` to `is_«model_attribute»_«state name»()` though. Similarly, auto transitions will be named `to_«model_attribute»_«state name»()` instead of `to_«state name»()`. This is done to allow multiple machines to work on the same model with individual state attribute names. ```python lump = Matter() machine = Machine(lump, states=['solid', 'liquid', 'gas'], model_attribute='matter_state', initial='solid') lump.matter_state >>> 'solid' # with a custom 'model_attribute', states can also be checked like this: lump.is_matter_state_solid() >>> True lump.to_matter_state_gas() >>> True ``` #### Enumerations So far we have seen how we can give state names and use these names to work with our state machine. If you favour stricter typing and more IDE code completion (or you just can't type 'sesquipedalophobia' any longer because the word scares you) using [Enumerations](https://docs.python.org/3/library/enum.html) might be what you are looking for: ```python import enum # Python 2.7 users need to have 'enum34' installed from transitions import Machine class States(enum.Enum): ERROR = 0 RED = 1 YELLOW = 2 GREEN = 3 transitions = [['proceed', States.RED, States.YELLOW], ['proceed', States.YELLOW, States.GREEN], ['error', '*', States.ERROR]] m = Machine(states=States, transitions=transitions, initial=States.RED) assert m.is_RED() assert m.state is States.RED state = m.get_state(States.RED) # get transitions.State object print(state.name) # >>> RED m.proceed() m.proceed() assert m.is_GREEN() m.error() assert m.state is States.ERROR ``` You can mix enums and strings if you like (e.g. `[States.RED, 'ORANGE', States.YELLOW, States.GREEN]`) but note that internally, `transitions` will still handle states by name (`enum.Enum.name`). Thus, it is not possible to have the states `'GREEN'` and `States.GREEN` at the same time. ### Transitions Some of the above examples already illustrate the use of transitions in passing, but here we'll explore them in more detail. As with states, each transition is represented internally as its own object – an instance of class `Transition`. The quickest way to initialize a set of transitions is to pass a dictionary, or list of dictionaries, to the `Machine` initializer. We already saw this above: ```python transitions = [ { 'trigger': 'melt', 'source': 'solid', 'dest': 'liquid' }, { 'trigger': 'evaporate', 'source': 'liquid', 'dest': 'gas' }, { 'trigger': 'sublimate', 'source': 'solid', 'dest': 'gas' }, { 'trigger': 'ionize', 'source': 'gas', 'dest': 'plasma' } ] machine = Machine(model=Matter(), states=states, transitions=transitions) ``` Defining transitions in dictionaries has the benefit of clarity, but can be cumbersome. If you're after brevity, you might choose to define transitions using lists. Just make sure that the elements in each list are in the same order as the positional arguments in the `Transition` initialization (i.e., `trigger`, `source`, `destination`, etc.). The following list-of-lists is functionally equivalent to the list-of-dictionaries above: ```python transitions = [ ['melt', 'solid', 'liquid'], ['evaporate', 'liquid', 'gas'], ['sublimate', 'solid', 'gas'], ['ionize', 'gas', 'plasma'] ] ``` Alternatively, you can add transitions to a `Machine` after initialization: ```python machine = Machine(model=lump, states=states, initial='solid') machine.add_transition('melt', source='solid', dest='liquid') ``` The `trigger` argument defines the name of the new triggering method that gets attached to the base model. When this method is called, it will try to execute the transition: ```python >>> lump.melt() >>> lump.state 'liquid' ``` By default, calling an invalid trigger will raise an exception: ```python >>> lump.to_gas() >>> # This won't work because only objects in a solid state can melt >>> lump.melt() transitions.core.MachineError: "Can't trigger event melt from state gas!" ``` This behavior is generally desirable, since it helps alert you to problems in your code. But in some cases, you might want to silently ignore invalid triggers. You can do this by setting `ignore_invalid_triggers=True` (either on a state-by-state basis, or globally for all states): ```python >>> # Globally suppress invalid trigger exceptions >>> m = Machine(lump, states, initial='solid', ignore_invalid_triggers=True) >>> # ...or suppress for only one group of states >>> states = ['new_state1', 'new_state2'] >>> m.add_states(states, ignore_invalid_triggers=True) >>> # ...or even just for a single state. Here, exceptions will only be suppressed when the current state is A. >>> states = [State('A', ignore_invalid_triggers=True), 'B', 'C'] >>> m = Machine(lump, states) >>> # ...this can be inverted as well if just one state should raise an exception >>> # since the machine's global value is not applied to a previously initialized state. >>> states = ['A', 'B', State('C')] # the default value for 'ignore_invalid_triggers' is False >>> m = Machine(lump, states, ignore_invalid_triggers=True) ``` If you need to know which transitions are valid from a certain state, you can use `get_triggers`: ```python m.get_triggers('solid') >>> ['melt', 'sublimate'] m.get_triggers('liquid') >>> ['evaporate'] m.get_triggers('plasma') >>> [] # you can also query several states at once m.get_triggers('solid', 'liquid', 'gas', 'plasma') >>> ['melt', 'evaporate', 'sublimate', 'ionize'] ``` #### Automatic transitions for all states In addition to any transitions added explicitly, a `to_«state»()` method is created automatically whenever a state is added to a `Machine` instance. This method transitions to the target state no matter which state the machine is currently in: ```python lump.to_liquid() lump.state >>> 'liquid' lump.to_solid() lump.state >>> 'solid' ``` If you desire, you can disable this behavior by setting `auto_transitions=False` in the `Machine` initializer. #### Transitioning from multiple states A given trigger can be attached to multiple transitions, some of which can potentially begin or end in the same state. For example: ```python machine.add_transition('transmogrify', ['solid', 'liquid', 'gas'], 'plasma') machine.add_transition('transmogrify', 'plasma', 'solid') # This next transition will never execute machine.add_transition('transmogrify', 'plasma', 'gas') ``` In this case, calling `transmogrify()` will set the model's state to `'solid'` if it's currently `'plasma'`, and set it to `'plasma'` otherwise. (Note that only the _first_ matching transition will execute; thus, the transition defined in the last line above won't do anything.) You can also make a trigger cause a transition from _all_ states to a particular destination by using the `'*'` wildcard: ```python machine.add_transition('to_liquid', '*', 'liquid') ``` Note that wildcard transitions will only apply to states that exist at the time of the add_transition() call. Calling a wildcard-based transition when the model is in a state added after the transition was defined will elicit an invalid transition message, and will not transition to the target state. #### Reflexive transitions from multiple states A reflexive trigger (trigger that has the same state as source and destination) can easily be added specifying `=` as destination. This is handy if the same reflexive trigger should be added to multiple states. For example: ```python machine.add_transition('touch', ['liquid', 'gas', 'plasma'], '=', after='change_shape') ``` This will add reflexive transitions for all three states with `touch()` as trigger and with `change_shape` executed after each trigger. #### Internal transitions In contrast to reflexive transitions, internal transitions will never actually leave the state. This means that transition-related callbacks such as `before` or `after` will be processed while state-related callbacks `exit` or `enter` will not. To define a transition to be internal, set the destination to `None`. ```python machine.add_transition('internal', ['liquid', 'gas'], None, after='change_shape') ``` #### Ordered transitions A common desire is for state transitions to follow a strict linear sequence. For instance, given states `['A', 'B', 'C']`, you might want valid transitions for `A` → `B`, `B` → `C`, and `C` → `A` (but no other pairs). To facilitate this behavior, Transitions provides an `add_ordered_transitions()` method in the `Machine` class: ```python states = ['A', 'B', 'C'] # See the "alternative initialization" section for an explanation of the 1st argument to init machine = Machine(states=states, initial='A') machine.add_ordered_transitions() machine.next_state() print(machine.state) >>> 'B' # We can also define a different order of transitions machine = Machine(states=states, initial='A') machine.add_ordered_transitions(['A', 'C', 'B']) machine.next_state() print(machine.state) >>> 'C' # Conditions can be passed to 'add_ordered_transitions' as well # If one condition is passed, it will be used for all transitions machine = Machine(states=states, initial='A') machine.add_ordered_transitions(conditions='check') # If a list is passed, it must contain exactly as many elements as the # machine contains states (A->B, ..., X->A) machine = Machine(states=states, initial='A') machine.add_ordered_transitions(conditions=['check_A2B', ..., 'check_X2A']) # Conditions are always applied starting from the initial state machine = Machine(states=states, initial='B') machine.add_ordered_transitions(conditions=['check_B2C', ..., 'check_A2B']) # With `loop=False`, the transition from the last state to the first state will be omitted (e.g. C->A) # When you also pass conditions, you need to pass one condition less (len(states)-1) machine = Machine(states=states, initial='A') machine.add_ordered_transitions(loop=False) machine.next_state() machine.next_state() machine.next_state() # transitions.core.MachineError: "Can't trigger event next_state from state C!" ``` #### Queued transitions The default behaviour in Transitions is to process events instantly. This means events within an `on_enter` method will be processed _before_ callbacks bound to `after` are called. ```python def go_to_C(): global machine machine.to_C() def after_advance(): print("I am in state B now!") def entering_C(): print("I am in state C now!") states = ['A', 'B', 'C'] machine = Machine(states=states, initial='A') # we want a message when state transition to B has been completed machine.add_transition('advance', 'A', 'B', after=after_advance) # call transition from state B to state C machine.on_enter_B(go_to_C) # we also want a message when entering state C machine.on_enter_C(entering_C) machine.advance() >>> 'I am in state C now!' >>> 'I am in state B now!' # what? ``` The execution order of this example is ``` prepare -> before -> on_enter_B -> on_enter_C -> after. ``` If queued processing is enabled, a transition will be finished before the next transition is triggered: ```python machine = Machine(states=states, queued=True, initial='A') ... machine.advance() >>> 'I am in state B now!' >>> 'I am in state C now!' # That's better! ``` This results in ``` prepare -> before -> on_enter_B -> queue(to_C) -> after -> on_enter_C. ``` **Important note:** when processing events in a queue, the trigger call will _always_ return `True`, since there is no way to determine at queuing time whether a transition involving queued calls will ultimately complete successfully. This is true even when only a single event is processed. ```python machine.add_transition('jump', 'A', 'C', conditions='will_fail') ... # queued=False machine.jump() >>> False # queued=True machine.jump() >>> True ``` When a model is removed from the machine, `transitions` will also remove all related events from the queue. ```python class Model: def on_enter_B(self): self.to_C() # add event to queue ... self.machine.remove_model(self) # aaaand it's gone ``` #### Conditional transitions Sometimes you only want a particular transition to execute if a specific condition occurs. You can do this by passing a method, or list of methods, in the `conditions` argument: ```python # Our Matter class, now with a bunch of methods that return booleans. class Matter(object): def is_flammable(self): return False def is_really_hot(self): return True machine.add_transition('heat', 'solid', 'gas', conditions='is_flammable') machine.add_transition('heat', 'solid', 'liquid', conditions=['is_really_hot']) ``` In the above example, calling `heat()` when the model is in state `'solid'` will transition to state `'gas'` if `is_flammable` returns `True`. Otherwise, it will transition to state `'liquid'` if `is_really_hot` returns `True`. For convenience, there's also an `'unless'` argument that behaves exactly like conditions, but inverted: ```python machine.add_transition('heat', 'solid', 'gas', unless=['is_flammable', 'is_really_hot']) ``` In this case, the model would transition from solid to gas whenever `heat()` fires, provided that both `is_flammable()` and `is_really_hot()` return `False`. Note that condition-checking methods will passively receive optional arguments and/or data objects passed to triggering methods. For instance, the following call: ```python lump.heat(temp=74) # equivalent to lump.trigger('heat', temp=74) ``` ... would pass the `temp=74` optional kwarg to the `is_flammable()` check (possibly wrapped in an `EventData` instance). For more on this, see the [Passing data](#passing-data) section below. #### Check transitions If you want to check whether a transition is possible before you execute it ('look before you leap'), you can use `may_` convenience functions that have been attached to your model: ```python # check if the current temperature is hot enough to trigger a transition if lump.may_heat(): lump.heat() ``` This will execute all `prepare` callbacks and evaluate the conditions assigned to the potential transitions. Transition checks can also be used when a transition's destination is not available (yet): ```python machine.add_transition('elevate', 'solid', 'spiritual') assert not lump.may_elevate() # not ready yet :( ``` #### Callbacks You can attach callbacks to transitions as well as states. Every transition has `'before'` and `'after'` attributes that contain a list of methods to call before and after the transition executes: ```python class Matter(object): def make_hissing_noises(self): print("HISSSSSSSSSSSSSSSS") def disappear(self): print("where'd all the liquid go?") transitions = [ { 'trigger': 'melt', 'source': 'solid', 'dest': 'liquid', 'before': 'make_hissing_noises'}, { 'trigger': 'evaporate', 'source': 'liquid', 'dest': 'gas', 'after': 'disappear' } ] lump = Matter() machine = Machine(lump, states, transitions=transitions, initial='solid') lump.melt() >>> "HISSSSSSSSSSSSSSSS" lump.evaporate() >>> "where'd all the liquid go?" ``` There is also a `'prepare'` callback that is executed as soon as a transition starts, before any `'conditions'` are checked or other callbacks are executed. ```python class Matter(object): heat = False attempts = 0 def count_attempts(self): self.attempts += 1 def heat_up(self): self.heat = random.random() < 0.25 def stats(self): print('It took you %i attempts to melt the lump!' %self.attempts) @property def is_really_hot(self): return self.heat states=['solid', 'liquid', 'gas', 'plasma'] transitions = [ { 'trigger': 'melt', 'source': 'solid', 'dest': 'liquid', 'prepare': ['heat_up', 'count_attempts'], 'conditions': 'is_really_hot', 'after': 'stats'}, ] lump = Matter() machine = Machine(lump, states, transitions=transitions, initial='solid') lump.melt() lump.melt() lump.melt() lump.melt() >>> "It took you 4 attempts to melt the lump!" ``` Note that `prepare` will not be called unless the current state is a valid source for the named transition. Default actions meant to be executed before or after _every_ transition can be passed to `Machine` during initialization with `before_state_change` and `after_state_change` respectively: ```python class Matter(object): def make_hissing_noises(self): print("HISSSSSSSSSSSSSSSS") def disappear(self): print("where'd all the liquid go?") states=['solid', 'liquid', 'gas', 'plasma'] lump = Matter() m = Machine(lump, states, before_state_change='make_hissing_noises', after_state_change='disappear') lump.to_gas() >>> "HISSSSSSSSSSSSSSSS" >>> "where'd all the liquid go?" ``` There are also two keywords for callbacks which should be executed _independently_ a) of how many transitions are possible, b) if any transition succeeds and c) even if an error is raised during the execution of some other callback. Callbacks passed to `Machine` with `prepare_event` will be executed _once_ before processing possible transitions (and their individual `prepare` callbacks) takes place. Callbacks of `finalize_event` will be executed regardless of the success of the processed transitions. Note that if an error occurred it will be attached to `event_data` as `error` and can be retrieved with `send_event=True`. ```python from transitions import Machine class Matter(object): def raise_error(self, event): raise ValueError("Oh no") def prepare(self, event): print("I am ready!") def finalize(self, event): print("Result: ", type(event.error), event.error) states=['solid', 'liquid', 'gas', 'plasma'] lump = Matter() m = Machine(lump, states, prepare_event='prepare', before_state_change='raise_error', finalize_event='finalize', send_event=True) try: lump.to_gas() except ValueError: pass print(lump.state) # >>> I am ready! # >>> Result: Oh no # >>> initial ``` Sometimes things just don't work out as intended and we need to handle exceptions and clean up the mess to keep things going. We can pass callbacks to `on_exception` to do this: ```python from transitions import Machine class Matter(object): def raise_error(self, event): raise ValueError("Oh no") def handle_error(self, event): print("Fixing things ...") del event.error # it did not happen if we cannot see it ... states=['solid', 'liquid', 'gas', 'plasma'] lump = Matter() m = Machine(lump, states, before_state_change='raise_error', on_exception='handle_error', send_event=True) try: lump.to_gas() except ValueError: pass print(lump.state) # >>> Fixing things ... # >>> initial ``` ### Callable resolution As you have probably already realized, the standard way of passing callables to states, conditions and transitions is by name. When processing callbacks and conditions, `transitions` will use their name to retrieve the related callable from the model. If the method cannot be retrieved and it contains dots, `transitions` will treat the name as a path to a module function and try to import it. Alternatively, you can pass names of properties or attributes. They will be wrapped into functions but cannot receive event data for obvious reasons. You can also pass callables such as (bound) functions directly. As mentioned earlier, you can also pass lists/tuples of callables names to the callback parameters. Callbacks will be executed in the order they were added. ```python from transitions import Machine from mod import imported_func import random class Model(object): def a_callback(self): imported_func() @property def a_property(self): """ Basically a coin toss. """ return random.random() < 0.5 an_attribute = False model = Model() machine = Machine(model=model, states=['A'], initial='A') machine.add_transition('by_name', 'A', 'A', conditions='a_property', after='a_callback') machine.add_transition('by_reference', 'A', 'A', unless=['a_property', 'an_attribute'], after=model.a_callback) machine.add_transition('imported', 'A', 'A', after='mod.imported_func') model.by_name() model.by_reference() model.imported() ``` The callable resolution is done in `Machine.resolve_callable`. This method can be overridden in case more complex callable resolution strategies are required. **Example** ```python class CustomMachine(Machine): @staticmethod def resolve_callable(func, event_data): # manipulate arguments here and return func, or super() if no manipulation is done. super(CustomMachine, CustomMachine).resolve_callable(func, event_data) ``` ### Callback execution order In summary, there are currently three ways to trigger events. You can call a model's convenience functions like `lump.melt()`, execute triggers by name such as `lump.trigger("melt")` or dispatch events on multiple models with `machine.dispatch("melt")` (see section about multiple models in [alternative initialization patterns](#alternative-initialization-patterns)). Callbacks on transitions are then executed in the following order: | Callback | Current State | Comments | | ------------------------------- | :------------------: | ------------------------------------------------------------------------------------------- | | `'machine.prepare_event'` | `source` | executed _once_ before individual transitions are processed | | `'transition.prepare'` | `source` | executed as soon as the transition starts | | `'transition.conditions'` | `source` | conditions _may_ fail and halt the transition | | `'transition.unless'` | `source` | conditions _may_ fail and halt the transition | | `'machine.before_state_change'` | `source` | default callbacks declared on model | | `'transition.before'` | `source` | | | `'state.on_exit'` | `source` | callbacks declared on the source state | | `` | | | | `'state.on_enter'` | `destination` | callbacks declared on the destination state | | `'transition.after'` | `destination` | | | `'machine.after_state_change'` | `destination` | default callbacks declared on model | | `'machine.on_exception'` | `source/destination` | callbacks will be executed when an exception has been raised | | `'machine.finalize_event'` | `source/destination` | callbacks will be executed even if no transition took place or an exception has been raised | If any callback raises an exception, the processing of callbacks is not continued. This means that when an error occurs before the transition (in `state.on_exit` or earlier), it is halted. In case there is a raise after the transition has been conducted (in `state.on_enter` or later), the state change persists and no rollback is happening. Callbacks specified in `machine.finalize_event` will always be executed unless the exception is raised by a finalizing callback itself. Note that each callback sequence has to be finished before the next stage is executed. Blocking callbacks will halt the execution order and therefore block the `trigger` or `dispatch` call itself. If you want callbacks to be executed in parallel, you could have a look at the [extensions](#extensions) `AsyncMachine` for asynchronous processing or `LockedMachine` for threading. ### Passing data Sometimes you need to pass the callback functions registered at machine initialization some data that reflects the model's current state. Transitions allows you to do this in two different ways. First (the default), you can pass any positional or keyword arguments directly to the trigger methods (created when you call `add_transition()`): ```python class Matter(object): def __init__(self): self.set_environment() def set_environment(self, temp=0, pressure=101.325): self.temp = temp self.pressure = pressure def print_temperature(self): print("Current temperature is %d degrees celsius." % self.temp) def print_pressure(self): print("Current pressure is %.2f kPa." % self.pressure) lump = Matter() machine = Machine(lump, ['solid', 'liquid'], initial='solid') machine.add_transition('melt', 'solid', 'liquid', before='set_environment') lump.melt(45) # positional arg; # equivalent to lump.trigger('melt', 45) lump.print_temperature() >>> 'Current temperature is 45 degrees celsius.' machine.set_state('solid') # reset state so we can melt again lump.melt(pressure=300.23) # keyword args also work lump.print_pressure() >>> 'Current pressure is 300.23 kPa.' ``` You can pass any number of arguments you like to the trigger. There is one important limitation to this approach: every callback function triggered by the state transition must be able to handle _all_ of the arguments. This may cause problems if the callbacks each expect somewhat different data. To get around this, Transitions supports an alternate method for sending data. If you set `send_event=True` at `Machine` initialization, all arguments to the triggers will be wrapped in an `EventData` instance and passed on to every callback. (The `EventData` object also maintains internal references to the source state, model, transition, machine, and trigger associated with the event, in case you need to access these for anything.) ```python class Matter(object): def __init__(self): self.temp = 0 self.pressure = 101.325 # Note that the sole argument is now the EventData instance. # This object stores positional arguments passed to the trigger method in the # .args property, and stores keywords arguments in the .kwargs dictionary. def set_environment(self, event): self.temp = event.kwargs.get('temp', 0) self.pressure = event.kwargs.get('pressure', 101.325) def print_pressure(self): print("Current pressure is %.2f kPa." % self.pressure) lump = Matter() machine = Machine(lump, ['solid', 'liquid'], send_event=True, initial='solid') machine.add_transition('melt', 'solid', 'liquid', before='set_environment') lump.melt(temp=45, pressure=1853.68) # keyword args lump.print_pressure() >>> 'Current pressure is 1853.68 kPa.' ``` ### Alternative initialization patterns In all of the examples so far, we've attached a new `Machine` instance to a separate model (`lump`, an instance of class `Matter`). While this separation keeps things tidy (because you don't have to monkey patch a whole bunch of new methods into the `Matter` class), it can also get annoying, since it requires you to keep track of which methods are called on the state machine, and which ones are called on the model that the state machine is bound to (e.g., `lump.on_enter_StateA()` vs. `machine.add_transition()`). Fortunately, Transitions is flexible, and supports two other initialization patterns. First, you can create a standalone state machine that doesn't require another model at all. Simply omit the model argument during initialization: ```python machine = Machine(states=states, transitions=transitions, initial='solid') machine.melt() machine.state >>> 'liquid' ``` If you initialize the machine this way, you can then attach all triggering events (like `evaporate()`, `sublimate()`, etc.) and all callback functions directly to the `Machine` instance. This approach has the benefit of consolidating all of the state machine functionality in one place, but can feel a little bit unnatural if you think state logic should be contained within the model itself rather than in a separate controller. An alternative (potentially better) approach is to have the model inherit from the `Machine` class. Transitions is designed to support inheritance seamlessly. (just be sure to override class `Machine`'s `__init__` method!): ```python class Matter(Machine): def say_hello(self): print("hello, new state!") def say_goodbye(self): print("goodbye, old state!") def __init__(self): states = ['solid', 'liquid', 'gas'] Machine.__init__(self, states=states, initial='solid') self.add_transition('melt', 'solid', 'liquid') lump = Matter() lump.state >>> 'solid' lump.melt() lump.state >>> 'liquid' ``` Here you get to consolidate all state machine functionality into your existing model, which often feels more natural than sticking all of the functionality we want in a separate standalone `Machine` instance. A machine can handle multiple models which can be passed as a list like `Machine(model=[model1, model2, ...])`. In cases where you want to add models _as well as_ the machine instance itself, you can pass the class variable placeholder (string) `Machine.self_literal` during initialization like `Machine(model=[Machine.self_literal, model1, ...])`. You can also create a standalone machine, and register models dynamically via `machine.add_model` by passing `model=None` to the constructor. Furthermore, you can use `machine.dispatch` to trigger events on all currently added models. Remember to call `machine.remove_model` if machine is long-lasting and your models are temporary and should be garbage collected: ```python class Matter(): pass lump1 = Matter() lump2 = Matter() # setting 'model' to None or passing an empty list will initialize the machine without a model machine = Machine(model=None, states=states, transitions=transitions, initial='solid') machine.add_model(lump1) machine.add_model(lump2, initial='liquid') lump1.state >>> 'solid' lump2.state >>> 'liquid' # custom events as well as auto transitions can be dispatched to all models machine.dispatch("to_plasma") lump1.state >>> 'plasma' assert lump1.state == lump2.state machine.remove_model([lump1, lump2]) del lump1 # lump1 is garbage collected del lump2 # lump2 is garbage collected ``` If you don't provide an initial state in the state machine constructor, `transitions` will create and add a default state called `'initial'`. If you do not want a default initial state, you can pass `initial=None`. However, in this case you need to pass an initial state every time you add a model. ```python machine = Machine(model=None, states=states, transitions=transitions, initial=None) machine.add_model(Matter()) >>> "MachineError: No initial state configured for machine, must specify when adding model." machine.add_model(Matter(), initial='liquid') ``` Models with multiple states could attach multiple machines using different `model_attribute` values. As mentioned in [Checking state](#checking-state), this will add custom `is/to__` functions: ```python lump = Matter() matter_machine = Machine(lump, states=['solid', 'liquid', 'gas'], initial='solid') # add a second machine to the same model but assign a different state attribute shipment_machine = Machine(lump, states=['delivered', 'shipping'], initial='delivered', model_attribute='shipping_state') lump.state >>> 'solid' lump.is_solid() # check the default field >>> True lump.shipping_state >>> 'delivered' lump.is_shipping_state_delivered() # check the custom field. >>> True lump.to_shipping_state_shipping() >>> True lump.is_shipping_state_delivered() >>> False ``` ### Logging Transitions includes very rudimentary logging capabilities. A number of events – namely, state changes, transition triggers, and conditional checks – are logged as INFO-level events using the standard Python `logging` module. This means you can easily configure logging to standard output in a script: ```python # Set up logging; The basic log level will be DEBUG import logging logging.basicConfig(level=logging.DEBUG) # Set transitions' log level to INFO; DEBUG messages will be omitted logging.getLogger('transitions').setLevel(logging.INFO) # Business as usual machine = Machine(states=states, transitions=transitions, initial='solid') ... ``` ### (Re-)Storing machine instances Machines are picklable and can be stored and loaded with `pickle`. For Python 3.3 and earlier `dill` is required. ```python import dill as pickle # only required for Python 3.3 and earlier m = Machine(states=['A', 'B', 'C'], initial='A') m.to_B() m.state >>> B # store the machine dump = pickle.dumps(m) # load the Machine instance again m2 = pickle.loads(dump) m2.state >>> B m2.states.keys() >>> ['A', 'B', 'C'] ``` ### Extensions Even though the core of transitions is kept lightweight, there are a variety of MixIns to extend its functionality. Currently supported are: - **Diagrams** to visualize the current state of a machine - **Hierarchical State Machines** for nesting and reuse - **Threadsafe Locks** for parallel execution - **Async callbacks** for asynchronous execution - **Custom States** for extended state-related behaviour There are two mechanisms to retrieve a state machine instance with the desired features enabled. The first approach makes use of the convenience `factory` with the four parameters `graph`, `nested`, `locked` or `asyncio` set to `True` if the feature is required: ```python from transitions.extensions import MachineFactory # create a machine with mixins diagram_cls = MachineFactory.get_predefined(graph=True) nested_locked_cls = MachineFactory.get_predefined(nested=True, locked=True) async_machine_cls = MachineFactory.get_predefined(asyncio=True) # create instances from these classes # instances can be used like simple machines machine1 = diagram_cls(model, state, transitions) machine2 = nested_locked_cls(model, state, transitions) ``` This approach targets experimental use since in this case the underlying classes do not have to be known. However, classes can also be directly imported from `transitions.extensions`. The naming scheme is as follows: | | Diagrams | Nested | Locked | Asyncio | | -----------------------------: | :------: | :----: | :----: | :-----: | | Machine | ✘ | ✘ | ✘ | ✘ | | GraphMachine | ✓ | ✘ | ✘ | ✘ | | HierarchicalMachine | ✘ | ✓ | ✘ | ✘ | | LockedMachine | ✘ | ✘ | ✓ | ✘ | | HierarchicalGraphMachine | ✓ | ✓ | ✘ | ✘ | | LockedGraphMachine | ✓ | ✘ | ✓ | ✘ | | LockedHierarchicalMachine | ✘ | ✓ | ✓ | ✘ | | LockedHierarchicalGraphMachine | ✓ | ✓ | ✓ | ✘ | | AsyncMachine | ✘ | ✘ | ✘ | ✓ | | AsyncGraphMachine | ✓ | ✘ | ✘ | ✓ | | HierarchicalAsyncMachine | ✘ | ✓ | ✘ | ✓ | | HierarchicalAsyncGraphMachine | ✓ | ✓ | ✘ | ✓ | To use a feature-rich state machine, one could write: ```python from transitions.extensions import LockedHierarchicalGraphMachine as LHGMachine machine = LHGMachine(model, states, transitions) ``` #### Diagrams Additional Keywords: - `title` (optional): Sets the title of the generated image. - `show_conditions` (default False): Shows conditions at transition edges - `show_auto_transitions` (default False): Shows auto transitions in graph - `show_state_attributes` (default False): Show callbacks (enter, exit), tags and timeouts in graph Transitions can generate basic state diagrams displaying all valid transitions between states. To use the graphing functionality, you'll need to have `graphviz` and/or `pygraphviz` installed: To generate graphs with the package `graphviz`, you need to install [Graphviz](https://graphviz.org/) manually or via a package manager. sudo apt-get install graphviz graphviz-dev # Ubuntu and Debian brew install graphviz # MacOS conda install graphviz python-graphviz # (Ana)conda Now you can install the actual Python packages pip install graphviz pygraphviz # install graphviz and/or pygraphviz manually... pip install transitions[diagrams] # ... or install transitions with 'diagrams' extras which currently depends on pygraphviz Currently, `GraphMachine` will use `pygraphviz` when available and fall back to `graphviz` when `pygraphviz` cannot be found. This can be overridden by passing `use_pygraphviz=False` to the constructor. Note that this default might change in the future and `pygraphviz` support may be dropped. With `Model.get_graph()` you can get the current graph or the region of interest (roi) and draw it like this: ```python # import transitions from transitions.extensions import GraphMachine m = Model() # without further arguments pygraphviz will be used machine = GraphMachine(model=m, ...) # when you want to use graphviz explicitly machine = GraphMachine(model=m, use_pygraphviz=False, ...) # in cases where auto transitions should be visible machine = GraphMachine(model=m, show_auto_transitions=True, ...) # draw the whole graph ... m.get_graph().draw('my_state_diagram.png', prog='dot') # ... or just the region of interest # (previous state, active state and all reachable states) roi = m.get_graph(show_roi=True).draw('my_state_diagram.png', prog='dot') ``` This produces something like this: ![state diagram example](https://user-images.githubusercontent.com/205986/47524268-725c1280-d89a-11e8-812b-1d3b6e667b91.png) Independent of the backend you use, the draw function also accepts a file descriptor or a binary stream as the first argument. If you set this parameter to `None`, the byte stream will be returned: ```python import io with open('a_graph.png', 'bw') as f: # you need to pass the format when you pass objects instead of filenames. m.get_graph().draw(f, format="png", prog='dot') # you can pass a (binary) stream too b = io.BytesIO() m.get_graph().draw(b, format="png", prog='dot') # or just handle the binary string yourself result = m.get_graph().draw(None, format="png", prog='dot') assert result == b.getvalue() ``` References and partials passed as callbacks will be resolved as good as possible: ```python from transitions.extensions import GraphMachine from functools import partial class Model: def clear_state(self, deep=False, force=False): print("Clearing state ...") return True model = Model() machine = GraphMachine(model=model, states=['A', 'B', 'C'], transitions=[ {'trigger': 'clear', 'source': 'B', 'dest': 'A', 'conditions': model.clear_state}, {'trigger': 'clear', 'source': 'C', 'dest': 'A', 'conditions': partial(model.clear_state, False, force=True)}, ], initial='A', show_conditions=True) model.get_graph().draw('my_state_diagram.png', prog='dot') ``` This should produce something similar to this: ![state diagram references_example](https://user-images.githubusercontent.com/205986/110783076-39087f80-8268-11eb-8fa1-fc7bac97f4cf.png) If the format of references does not suit your needs, you can override the static method `GraphMachine.format_references`. If you want to skip reference entirely, just let `GraphMachine.format_references` return `None`. Also, have a look at our [example](./examples) IPython/Jupyter notebooks for a more detailed example about how to use and edit graphs. ### Hierarchical State Machine (HSM) Transitions includes an extension module which allows nesting states. This allows us to create contexts and to model cases where states are related to certain subtasks in the state machine. To create a nested state, either import `NestedState` from transitions or use a dictionary with the initialization arguments `name` and `children`. Optionally, `initial` can be used to define a sub state to transit to, when the nested state is entered. ```python from transitions.extensions import HierarchicalMachine states = ['standing', 'walking', {'name': 'caffeinated', 'children':['dithering', 'running']}] transitions = [ ['walk', 'standing', 'walking'], ['stop', 'walking', 'standing'], ['drink', '*', 'caffeinated'], ['walk', ['caffeinated', 'caffeinated_dithering'], 'caffeinated_running'], ['relax', 'caffeinated', 'standing'] ] machine = HierarchicalMachine(states=states, transitions=transitions, initial='standing', ignore_invalid_triggers=True) machine.walk() # Walking now machine.stop() # let's stop for a moment machine.drink() # coffee time machine.state >>> 'caffeinated' machine.walk() # we have to go faster machine.state >>> 'caffeinated_running' machine.stop() # can't stop moving! machine.state >>> 'caffeinated_running' machine.relax() # leave nested state machine.state # phew, what a ride >>> 'standing' # machine.on_enter_caffeinated_running('callback_method') ``` A configuration making use of `initial` could look like this: ```python # ... states = ['standing', 'walking', {'name': 'caffeinated', 'initial': 'dithering', 'children': ['dithering', 'running']}] transitions = [ ['walk', 'standing', 'walking'], ['stop', 'walking', 'standing'], # this transition will end in 'caffeinated_dithering'... ['drink', '*', 'caffeinated'], # ... that is why we do not need do specify 'caffeinated' here anymore ['walk', 'caffeinated_dithering', 'caffeinated_running'], ['relax', 'caffeinated', 'standing'] ] # ... ``` The `initial` keyword of the `HierarchicalMachine` constructor accepts nested states (e.g. `initial='caffeinated_running'`) and a list of states which is considered to be a parallel state (e.g. `initial=['A', 'B']`) or the current state of another model (`initial=model.state`) which should be effectively one of the previous mentioned options. Note that when passing a string, `transition` will check the targeted state for `initial` substates and use this as an entry state. This will be done recursively until a substate does not mention an initial state. Parallel states or a state passed as a list will be used 'as is' and no further initial evaluation will be conducted. Note that your previously created state object _must be_ a `NestedState` or a derived class of it. The standard `State` class used in simple `Machine` instances lacks features required for nesting. ```python from transitions.extensions.nesting import HierarchicalMachine, NestedState from transitions import State m = HierarchicalMachine(states=['A'], initial='initial') m.add_state('B') # fine m.add_state({'name': 'C'}) # also fine m.add_state(NestedState('D')) # fine as well m.add_state(State('E')) # does not work! ``` Some things that have to be considered when working with nested states: State _names are concatenated_ with `NestedState.separator`. Currently the separator is set to underscore ('\_') and therefore behaves similar to the basic machine. This means a substate `bar` from state `foo` will be known by `foo_bar`. A substate `baz` of `bar` will be referred to as `foo_bar_baz` and so on. When entering a substate, `enter` will be called for all parent states. The same is true for exiting substates. Third, nested states can overwrite transition behaviour of their parents. If a transition is not known to the current state it will be delegated to its parent. **This means that in the standard configuration, state names in HSMs MUST NOT contain underscores.** For `transitions` it's impossible to tell whether `machine.add_state('state_name')` should add a state named `state_name` or add a substate `name` to the state `state`. In some cases this is not sufficient however. For instance if state names consist of more than one word and you want/need to use underscore to separate them instead of `CamelCase`. To deal with this, you can change the character used for separation quite easily. You can even use fancy unicode characters if you use Python 3. Setting the separator to something else than underscore changes some of the behaviour (auto_transition and setting callbacks) though: ```python from transitions.extensions import HierarchicalMachine from transitions.extensions.nesting import NestedState NestedState.separator = '↦' states = ['A', 'B', {'name': 'C', 'children':['1', '2', {'name': '3', 'children': ['a', 'b', 'c']} ]} ] transitions = [ ['reset', 'C', 'A'], ['reset', 'C↦2', 'C'] # overwriting parent reset ] # we rely on auto transitions machine = HierarchicalMachine(states=states, transitions=transitions, initial='A') machine.to_B() # exit state A, enter state B machine.to_C() # exit B, enter C machine.to_C.s3.a() # enter C↦a; enter C↦3↦a; machine.state >>> 'C↦3↦a' assert machine.is_C.s3.a() machine.to('C↦2') # not interactive; exit C↦3↦a, exit C↦3, enter C↦2 machine.reset() # exit C↦2; reset C has been overwritten by C↦3 machine.state >>> 'C' machine.reset() # exit C, enter A machine.state >>> 'A' # s.on_enter('C↦3↦a', 'callback_method') ``` Instead of `to_C_3_a()` auto transition is called as `to_C.s3.a()`. If your substate starts with a digit, transitions adds a prefix 's' ('3' becomes 's3') to the auto transition `FunctionWrapper` to comply with the attribute naming scheme of Python. If interactive completion is not required, `to('C↦3↦a')` can be called directly. Additionally, `on_enter/exit_<>` is replaced with `on_enter/exit(state_name, callback)`. State checks can be conducted in a similar fashion. Instead of `is_C_3_a()`, the `FunctionWrapper` variant `is_C.s3.a()` can be used. To check whether the current state is a substate of a specific state, `is_state` supports the keyword `allow_substates`: ```python machine.state >>> 'C.2.a' machine.is_C() # checks for specific states >>> False machine.is_C(allow_substates=True) >>> True assert machine.is_C.s2() is False assert machine.is_C.s2(allow_substates=True) # FunctionWrapper support allow_substate as well ``` _new in 0.8.0_ You can use enumerations in HSMs as well but keep in mind that `Enum` are compared by value. If you have a value more than once in a state tree those states cannot be distinguished. ```python states = [States.RED, States.YELLOW, {'name': States.GREEN, 'children': ['tick', 'tock']}] states = ['A', {'name': 'B', 'children': states, 'initial': States.GREEN}, States.GREEN] machine = HierarchicalMachine(states=states) machine.to_B() machine.is_GREEN() # returns True even though the actual state is B_GREEN ``` _new in 0.8.0_ `HierarchicalMachine` has been rewritten from scratch to support parallel states and better isolation of nested states. This involves some tweaks based on community feedback. To get an idea of processing order and configuration have a look at the following example: ```python from transitions.extensions.nesting import HierarchicalMachine import logging states = ['A', 'B', {'name': 'C', 'parallel': [{'name': '1', 'children': ['a', 'b', 'c'], 'initial': 'a', 'transitions': [['go', 'a', 'b']]}, {'name': '2', 'children': ['x', 'y', 'z'], 'initial': 'z'}], 'transitions': [['go', '2_z', '2_x']]}] transitions = [['reset', 'C_1_b', 'B']] logging.basicConfig(level=logging.INFO) machine = HierarchicalMachine(states=states, transitions=transitions, initial='A') machine.to_C() # INFO:transitions.extensions.nesting:Exited state A # INFO:transitions.extensions.nesting:Entered state C # INFO:transitions.extensions.nesting:Entered state C_1 # INFO:transitions.extensions.nesting:Entered state C_2 # INFO:transitions.extensions.nesting:Entered state C_1_a # INFO:transitions.extensions.nesting:Entered state C_2_z machine.go() # INFO:transitions.extensions.nesting:Exited state C_1_a # INFO:transitions.extensions.nesting:Entered state C_1_b # INFO:transitions.extensions.nesting:Exited state C_2_z # INFO:transitions.extensions.nesting:Entered state C_2_x machine.reset() # INFO:transitions.extensions.nesting:Exited state C_1_b # INFO:transitions.extensions.nesting:Exited state C_2_x # INFO:transitions.extensions.nesting:Exited state C_1 # INFO:transitions.extensions.nesting:Exited state C_2 # INFO:transitions.extensions.nesting:Exited state C # INFO:transitions.extensions.nesting:Entered state B ``` When using `parallel` instead of `children`, `transitions` will enter all states of the passed list at the same time. Which substate to enter is defined by `initial` which should _always_ point to a direct substate. A novel feature is to define local transitions by passing the `transitions` keyword in a state definition. The above defined transition `['go', 'a', 'b']` is only valid in `C_1`. While you can reference substates as done in `['go', '2_z', '2_x']` you cannot reference parent states directly in locally defined transitions. When a parent state is exited, its children will also be exited. In addition to the processing order of transitions known from `Machine` where transitions are considered in the order they were added, `HierarchicalMachine` considers hierarchy as well. Transitions defined in substates will be evaluated first (e.g. `C_1_a` is left before `C_2_z`) and transitions defined with wildcard `*` will (for now) only add transitions to root states (in this example `A`, `B`, `C`) Starting with _0.8.0_ nested states can be added directly and will issue the creation of parent states on-the-fly: ```python m = HierarchicalMachine(states=['A'], initial='A') m.add_state('B_1_a') m.to_B_1() assert m.is_B(allow_substates=True) ``` #### Reuse of previously created HSMs Besides semantic order, nested states are very handy if you want to specify state machines for specific tasks and plan to reuse them. Before _0.8.0_, a `HierarchicalMachine` would not integrate the machine instance itself but the states and transitions by creating copies of them. However, since _0.8.0_ `(Nested)State` instances are just **referenced** which means changes in one machine's collection of states and events will influence the other machine instance. Models and their state will not be shared though. Note that events and transitions are also copied by reference and will be shared by both instances if you do not use the `remap` keyword. This change was done to be more in line with `Machine` which also uses passed `State` instances by reference. ```python count_states = ['1', '2', '3', 'done'] count_trans = [ ['increase', '1', '2'], ['increase', '2', '3'], ['decrease', '3', '2'], ['decrease', '2', '1'], ['done', '3', 'done'], ['reset', '*', '1'] ] counter = HierarchicalMachine(states=count_states, transitions=count_trans, initial='1') counter.increase() # love my counter states = ['waiting', 'collecting', {'name': 'counting', 'children': counter}] transitions = [ ['collect', '*', 'collecting'], ['wait', '*', 'waiting'], ['count', 'collecting', 'counting'] ] collector = HierarchicalMachine(states=states, transitions=transitions, initial='waiting') collector.collect() # collecting collector.count() # let's see what we got; counting_1 collector.increase() # counting_2 collector.increase() # counting_3 collector.done() # collector.state == counting_done collector.wait() # collector.state == waiting ``` If a `HierarchicalMachine` is passed with the `children` keyword, the initial state of this machine will be assigned to the new parent state. In the above example we see that entering `counting` will also enter `counting_1`. If this is undesired behaviour and the machine should rather halt in the parent state, the user can pass `initial` as `False` like `{'name': 'counting', 'children': counter, 'initial': False}`. Sometimes you want such an embedded state collection to 'return' which means after it is done it should exit and transit to one of your super states. To achieve this behaviour you can remap state transitions. In the example above we would like the counter to return if the state `done` was reached. This is done as follows: ```python states = ['waiting', 'collecting', {'name': 'counting', 'children': counter, 'remap': {'done': 'waiting'}}] ... # same as above collector.increase() # counting_3 collector.done() collector.state >>> 'waiting' # be aware that 'counting_done' will be removed from the state machine ``` As mentioned above, using `remap` will **copy** events and transitions since they could not be valid in the original state machine. If a reused state machine does not have a final state, you can of course add the transitions manually. If 'counter' had no 'done' state, we could just add `['done', 'counter_3', 'waiting']` to achieve the same behaviour. In cases where you want states and transitions to be copied by value rather than reference (for instance, if you want to keep the pre-0.8 behaviour) you can do so by creating a `NestedState` and assigning deep copies of the machine's events and states to it. ```python from transitions.extensions.nesting import NestedState from copy import deepcopy # ... configuring and creating counter counting_state = NestedState(name="counting", initial='1') counting_state.states = deepcopy(counter.states) counting_state.events = deepcopy(counter.events) states = ['waiting', 'collecting', counting_state] ``` For complex state machines, sharing configurations rather than instantiated machines might be more feasible. Especially since instantiated machines must be derived from `HierarchicalMachine`. Such configurations can be stored and loaded easily via JSON or YAML (see the [FAQ](examples/Frequently%20asked%20questions.ipynb)). `HierarchicalMachine` allows defining substates either with the keyword `children` or `states`. If both are present, only `children` will be considered. ```python counter_conf = { 'name': 'counting', 'states': ['1', '2', '3', 'done'], 'transitions': [ ['increase', '1', '2'], ['increase', '2', '3'], ['decrease', '3', '2'], ['decrease', '2', '1'], ['done', '3', 'done'], ['reset', '*', '1'] ], 'initial': '1' } collector_conf = { 'name': 'collector', 'states': ['waiting', 'collecting', counter_conf], 'transitions': [ ['collect', '*', 'collecting'], ['wait', '*', 'waiting'], ['count', 'collecting', 'counting'] ], 'initial': 'waiting' } collector = HierarchicalMachine(**collector_conf) collector.collect() collector.count() collector.increase() assert collector.is_counting_2() ``` #### Threadsafe(-ish) State Machine In cases where event dispatching is done in threads, one can use either `LockedMachine` or `LockedHierarchicalMachine` where **function access** (!sic) is secured with reentrant locks. This does not save you from corrupting your machine by tinkering with member variables of your model or state machine. ```python from transitions.extensions import LockedMachine from threading import Thread import time states = ['A', 'B', 'C'] machine = LockedMachine(states=states, initial='A') # let us assume that entering B will take some time thread = Thread(target=machine.to_B) thread.start() time.sleep(0.01) # thread requires some time to start machine.to_C() # synchronized access; won't execute before thread is done # accessing attributes directly thread = Thread(target=machine.to_B) thread.start() machine.new_attrib = 42 # not synchronized! will mess with execution order ``` Any python context manager can be passed in via the `machine_context` keyword argument: ```python from transitions.extensions import LockedMachine from threading import RLock states = ['A', 'B', 'C'] lock1 = RLock() lock2 = RLock() machine = LockedMachine(states=states, initial='A', machine_context=[lock1, lock2]) ``` Any contexts via `machine_model` will be shared between all models registered with the `Machine`. Per-model contexts can be added as well: ```python lock3 = RLock() machine.add_model(model, model_context=lock3) ``` It's important that all user-provided context managers are re-entrant since the state machine will call them multiple times, even in the context of a single trigger invocation. #### Using async callbacks If you are using Python 3.7 or later, you can use `AsyncMachine` to work with asynchronous callbacks. You can mix synchronous and asynchronous callbacks if you like but this may have undesired side effects. Note that events need to be awaited and the event loop must also be handled by you. ```python from transitions.extensions.asyncio import AsyncMachine import asyncio import time class AsyncModel: def prepare_model(self): print("I am synchronous.") self.start_time = time.time() async def before_change(self): print("I am asynchronous and will block now for 100 milliseconds.") await asyncio.sleep(0.1) print("I am done waiting.") def sync_before_change(self): print("I am synchronous and will block the event loop (what I probably shouldn't)") time.sleep(0.1) print("I am done waiting synchronously.") def after_change(self): print(f"I am synchronous again. Execution took {int((time.time() - self.start_time) * 1000)} ms.") transition = dict(trigger="start", source="Start", dest="Done", prepare="prepare_model", before=["before_change"] * 5 + ["sync_before_change"], after="after_change") # execute before function in asynchronously 5 times model = AsyncModel() machine = AsyncMachine(model, states=["Start", "Done"], transitions=[transition], initial='Start') asyncio.get_event_loop().run_until_complete(model.start()) # >>> I am synchronous. # I am asynchronous and will block now for 100 milliseconds. # I am asynchronous and will block now for 100 milliseconds. # I am asynchronous and will block now for 100 milliseconds. # I am asynchronous and will block now for 100 milliseconds. # I am asynchronous and will block now for 100 milliseconds. # I am synchronous and will block the event loop (what I probably shouldn't) # I am done waiting synchronously. # I am done waiting. # I am done waiting. # I am done waiting. # I am done waiting. # I am done waiting. # I am synchronous again. Execution took 101 ms. assert model.is_Done() ``` So, why do you need to use Python 3.7 or later you may ask. Async support has been introduced earlier. `AsyncMachine` makes use of `contextvars` to handle running callbacks when new events arrive before a transition has been finished: ```python async def await_never_return(): await asyncio.sleep(100) raise ValueError("That took too long!") async def fix(): await m2.fix() m1 = AsyncMachine(states=['A', 'B', 'C'], initial='A', name="m1") m2 = AsyncMachine(states=['A', 'B', 'C'], initial='A', name="m2") m2.add_transition(trigger='go', source='A', dest='B', before=await_never_return) m2.add_transition(trigger='fix', source='A', dest='C') m1.add_transition(trigger='go', source='A', dest='B', after='go') m1.add_transition(trigger='go', source='B', dest='C', after=fix) asyncio.get_event_loop().run_until_complete(asyncio.gather(m2.go(), m1.go())) assert m1.state == m2.state ``` This example actually illustrates two things: First, that 'go' called in m1's transition from `A` to be `B` is not cancelled and second, calling `m2.fix()` will halt the transition attempt of m2 from `A` to `B` by executing 'fix' from `A` to `C`. This separation would not be possible without `contextvars`. Note that `prepare` and `conditions` are NOT treated as ongoing transitions. This means that after `conditions` have been evaluated, a transition is executed even though another event already happened. Tasks will only be cancelled when run as a `before` callback or later. `AsyncMachine` features a model-special queue mode which can be used when `queued='model'` is passed to the constructor. With a model-specific queue, events will only be queued when they belong to the same model. Furthermore, a raised exception will only clear the event queue of the model that raised that exception. For the sake of simplicity, let's assume that every event in `asyncio.gather` below is not triggered at the same time but slightly delayed: ```python asyncio.gather(model1.event1(), model1.event2(), model2.event1()) # execution order with AsyncMachine(queued=True) # model1.event1 -> model1.event2 -> model2.event1 # execution order with AsyncMachine(queued='model') # (model1.event1, model2.event1) -> model1.event2 asyncio.gather(model1.event1(), model1.error(), model1.event3(), model2.event1(), model2.event2(), model2.event3()) # execution order with AsyncMachine(queued=True) # model1.event1 -> model1.error # execution order with AsyncMachine(queued='model') # (model1.event1, model2.event1) -> (model1.error, model2.event2) -> model2.event3 ``` Note that queue modes must not be changed after machine construction. #### Adding features to states If your superheroes need some custom behaviour, you can throw in some extra functionality by decorating machine states: ```python from time import sleep from transitions import Machine from transitions.extensions.states import add_state_features, Tags, Timeout @add_state_features(Tags, Timeout) class CustomStateMachine(Machine): pass class SocialSuperhero(object): def __init__(self): self.entourage = 0 def on_enter_waiting(self): self.entourage += 1 states = [{'name': 'preparing', 'tags': ['home', 'busy']}, {'name': 'waiting', 'timeout': 1, 'on_timeout': 'go'}, {'name': 'away'}] # The city needs us! transitions = [['done', 'preparing', 'waiting'], ['join', 'waiting', 'waiting'], # Entering Waiting again will increase our entourage ['go', 'waiting', 'away']] # Okay, let' move hero = SocialSuperhero() machine = CustomStateMachine(model=hero, states=states, transitions=transitions, initial='preparing') assert hero.state == 'preparing' # Preparing for the night shift assert machine.get_state(hero.state).is_busy # We are at home and busy hero.done() assert hero.state == 'waiting' # Waiting for fellow superheroes to join us assert hero.entourage == 1 # It's just us so far sleep(0.7) # Waiting... hero.join() # Weeh, we got company sleep(0.5) # Waiting... hero.join() # Even more company \o/ sleep(2) # Waiting... assert hero.state == 'away' # Impatient superhero already left the building assert machine.get_state(hero.state).is_home is False # Yupp, not at home anymore assert hero.entourage == 3 # At least he is not alone ``` Currently, transitions comes equipped with the following state features: - **Timeout** -- triggers an event after some time has passed - keyword: `timeout` (int, optional) -- if passed, an entered state will timeout after `timeout` seconds - keyword: `on_timeout` (string/callable, optional) -- will be called when timeout time has been reached - will raise an `AttributeError` when `timeout` is set but `on_timeout` is not - Note: A timeout is triggered in a thread. This implies several limitations (e.g. catching Exceptions raised in timeouts). Consider an event queue for more sophisticated applications. - **Tags** -- adds tags to states - keyword: `tags` (list, optional) -- assigns tags to a state - `State.is_` will return `True` when the state has been tagged with `tag_name`, else `False` - **Error** -- raises a `MachineError` when a state cannot be left - inherits from `Tags` (if you use `Error` do not use `Tags`) - keyword: `accepted` (bool, optional) -- marks a state as accepted - alternatively the keyword `tags` can be passed, containing 'accepted' - Note: Errors will only be raised if `auto_transitions` has been set to `False`. Otherwise every state can be exited with `to_` methods. - **Volatile** -- initialises an object every time a state is entered - keyword: `volatile` (class, optional) -- every time the state is entered an object of type class will be assigned to the model. The attribute name is defined by `hook`. If omitted, an empty VolatileObject will be created instead - keyword: `hook` (string, default='scope') -- The model's attribute name for the temporal object. You can write your own `State` extensions and add them the same way. Just note that `add_state_features` expects _Mixins_. This means your extension should always call the overridden methods `__init__`, `enter` and `exit`. Your extension may inherit from _State_ but will also work without it. Using `@add_state_features` has a drawback which is that decorated machines cannot be pickled (more precisely, the dynamically generated `CustomState` cannot be pickled). This might be a reason to write a dedicated custom state class instead. Depending on the chosen state machine, your custom state class may need to provide certain state features. For instance, `HierarchicalMachine` requires your custom state to be an instance of `NestedState` (`State` is not sufficient). To inject your states you can either assign them to your `Machine`'s class attribute `state_cls` or override `Machine.create_state` in case you need some specific procedures done whenever a state is created: ```python from transitions import Machine, State class MyState(State): pass class CustomMachine(Machine): # Use MyState as state class state_cls = MyState class VerboseMachine(Machine): # `Machine._create_state` is a class method but we can # override it to be an instance method def _create_state(self, *args, **kwargs): print("Creating a new state with machine '{0}'".format(self.name)) return MyState(*args, **kwargs) ``` If you want to avoid threads in your `AsyncMachine` entirely, you can replace the `Timeout` state feature with `AsyncTimeout` from the `asyncio` extension: ```python import asyncio from transitions.extensions.states import add_state_features from transitions.extensions.asyncio import AsyncTimeout, AsyncMachine @add_state_features(AsyncTimeout) class TimeoutMachine(AsyncMachine): pass states = ['A', {'name': 'B', 'timeout': 0.2, 'on_timeout': 'to_C'}, 'C'] m = TimeoutMachine(states=states, initial='A', queued=True) # see remark below asyncio.run(asyncio.wait([m.to_B(), asyncio.sleep(0.1)])) assert m.is_B() # timeout shouldn't be triggered asyncio.run(asyncio.wait([m.to_B(), asyncio.sleep(0.3)])) assert m.is_C() # now timeout should have been processed ``` You should consider passing `queued=True` to the `TimeoutMachine` constructor. This will make sure that events are processed sequentially and avoid asynchronous [racing conditions](https://github.com/pytransitions/transitions/issues/459) that may appear when timeout and event happen in close proximity. #### Using transitions together with Django You can have a look at the [FAQ](examples/Frequently%20asked%20questions.ipynb) for some inspiration or checkout `django-transitions`. It has been developed by Christian Ledermann and is also hosted on [Github](https://github.com/PrimarySite/django-transitions). [The documentation](https://django-transitions.readthedocs.io/en/latest/) contains some usage examples. ### I have a [bug report/issue/question]... First, congratulations! You reached the end of the documentation! If you want to try out `transitions` before you install it, you can do that in an interactive Jupyter notebook at mybinder.org. Just click this button 👉 [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/pytransitions/transitions/master?filepath=examples%2FPlayground.ipynb). For bug reports and other issues, please [open an issue](https://github.com/pytransitions/transitions) on GitHub. For usage questions, post on Stack Overflow, making sure to tag your question with the [`pytransitions` tag](https://stackoverflow.com/questions/tagged/pytransitions). Do not forget to have a look at the [extended examples](./examples)! For any other questions, solicitations, or large unrestricted monetary gifts, email [Tal Yarkoni](mailto:tyarkoni@gmail.com) (initial author) and/or [Alexander Neumann](mailto:aleneum@gmail.com) (current maintainer). transitions-0.9.0/requirements.txt0000644000232200023220000000000414304350474017725 0ustar debalancedebalancesix transitions-0.9.0/MANIFEST.in0000644000232200023220000000051014304350474016201 0ustar debalancedebalanceinclude *.md include *.txt include .coveragerc include .pylintrc include LICENSE include MANIFEST include *.ini include conftest.py recursive-include transitions *.pyi recursive-include examples *.ipynb recursive-include tests *.py recursive-exclude examples/.ipynb_checkpoints *.ipynb recursive-include binder *.txt postBuild transitions-0.9.0/Changelog.md0000644000232200023220000006734414304350474016676 0ustar debalancedebalance# Changelog ## 0.9.0 (September 2022) Release 0.9.0 is a major release and contains improvements to ease development, adds some new features and removes the legacy hierarchical machine: - removed legacy implementation of `HierarchicalMachine` from the package - Bug #551: Fix active state styling in `GraphMachine` (thanks @betaboon) - Bug #554: Fix issues related to scopes and queueing in `HierachicalMachine` (thanks @jankrejci) - Bug #568: Reflexive transitions (dest: '=') had not been resolved correctly when source was a wildcard (thanks @jnu) - Bug #568: HSM did not detect reflexive transitions if src was a parent state (thanks @lostcontrol) - Bug #569: Fix implicit fallback to `graphviz` when `pygraphviz` was not installed (thanks @FridjofAmundsen) - Bug #580: Fix `on_timeout` callback resolution when timeout had been initialized with `timeout=0` (thanks @Rysbai) - Bug #582: Last label in `GraphSupport` was not correctly aligned when `show_attributes=True` (thanks @spagh-eddie) - Feature: Add pyi stub files for better type hinting. Since many functions and constructors allow rather arbitrary arguments time will tell whether typing should be strict (and cause more mypy issues) or more relaxed (and thus less precise). - Feature: Reviewed and improved method documentation - Feature #549: Add `may` transition check to transitions (thanks @artofhuman) - Feature #552: Refactored error handling to be able to handle `MachineError` in `on_exception` callbacks (thanks @kpihus) - Feature: Add `mypy` to test workflow - PR #461: Add `Retry` state to supported state stereotypes (thanks @rgov) - Internal: `Machine._identify_callback` has been converted to instance method from class method - Internal: `LockedMachine._get_qualified_state_name` has been converted to instance method from static method - Internal: Removed `_super` workaround related to dill (see https://github.com/pytransitions/transitions/issues/236) ## 0.8.11 (February 2022) Release 0.8.11 is the last 0.8 release and contains fixes for Python 3.10 compatibility issues - Bug #559: Rewrote an async test and replaced `setDaemon` with `daemon` property assignment for thread handling (thanks @debalance) ## 0.8.10 (October 2021) Release 0.8.10 is a minor release and contains two bug fixes for the HSM extension and changes how the 'self' literal string is handled. - Feature #545: The literal 'self' (default model parameter of `Machine`) has been replaced by the class variable `Machine.self_literal = 'self'`. `Machine` now performs an identity check (instead of a value check) with `mod is self.self_literal` to determine whether it should act as a model. While 'self' should still work when passed to the `model` parameter, we encourage using `Machine.self_literal` from now on. This was done to enable easier override of `Machine.__eq__` in subclasses (thanks @VKSolovev). - Bug #547: Introduce `HierarchicalMachine.prefix_path` to resolve global state names since the HSM stack is not reliable when `queued=True` (thanks @jankrejci). - Bug #548: `HSM` source states were exited even though they are parents of the destination state (thanks @wes-public-apps). ## 0.8.9 (September 2021) Release 0.8.9 is a minor release and contains a bugfix for HSM, a feature for `GraphSupport` and changes internal cache handling: - Bugfix #544: `NestedEvent` now wraps the machine's scope into partials passed to `HierarchicalMachine._process`. This prevents queued transitions from losing their scope. - Feature #533: `(A)Graph.draw` function (object returned by `GraphMachine.get_graph()`) can be passed a file/stream object as first parameter or `None`. The later will result in `draw` returning a binary string. (thanks @Blindfreddy). - Feature #532: Use id(model) instead of model for machine-bound caches in `LockedMachine`, `AsyncMachine` and `GraphMachine`. This might influence pickling (thanks @thedrow). ## 0.8.8 (April 2021) Release 0.8.8 is a minor release and contains a bugfix and several new or improved features: - Bugfix #526: `AsyncMachine` does not remove models when `remove_models` is called (thanks @Plazas87) - Feature #517: Introduce `try/except` for finalize callbacks in `Machine` and `HierachicalMachine`. Thus, errors occurring in finalize callbacks will be suppressed and only the original error will be raised. - Feature #520: Show references in graphs and markup. Introduce `MarkupMachine.format_references` to tweak reference formatting (thanks @StephenCarboni) - Feature #485: Introduce `Machine.on_exception` to handle raised exceptions in callbacks (thanks @thedrow) - Feature #527: `Machine.get_triggers` now supports `State` and `Enum` as arguments (thanks @luup2k) - Feature #506: `NestedState` and `HierachicalMachine.add_states` now accept (lists of) states and enums as `initial` parameter ## 0.8.7 (February 2021) Release 0.8.7 is a minor release and contains a bugfix, a feature and adjustments to internal processes: - State configuration dictionaries passed to `HierarchicalMachine` can also use `states` as a keyword to define substates. If `children` and `states` are present, only `children` will be considered. - Feature #500: `HierarchicalMachine` with custom separator now adds `is_state` partials for nested states (e.g. `is_C.s3.a()`) to models (thanks @alterscape) - Bugfix #512: Use `model_attribute` consistently in `AsyncMachine` (thanks @thedrow) - Testing now treats most warnings as errors (thanks @thedrow) - As a consequence, `pygraphviz.Agraph` in `diagrams_pygraphviz` are now copied by `transitions` since `AGraph.copy` as of version `1.6` does not close temporary files appropriately - `HierarchicalMachine` now checks whether `state_cls`, `event_cls` and `transition_cls` have been subclassed from nested base classes (e.g. `NestedState`) to prevent hard to debug inheritance errors ## 0.8.6 (December 2020) Release 0.8.6 is a minor release and contains bugfixes and new features: - `HierarchicalMachine.add_states` will raise a `ValueError` when an `Enum` name contains the currently used `NestedState.separator`. - Bugfix #486: Reset `NestedState._scope` when enter/exit callbacks raise an exception (thanks @m986883511) - Bugfix #488: Let `HierarchicalMachine._get_trigger` which is bound to `model.trigger` raise a `MachineError` for invalid events and `AttributeError` for unknown events (thanks @hsharrison) - Introduced `HierarchicalMachine.has_trigger` to determine whether an event is valid for an HSM - Feature #490: `AsyncMachine` features an event queue dictionary for individual models when `queued='model'` (thanks @jekel) - Feature #490: `Machine.remove_model` will now also remove model events from the event queue when `queued=True` - Feature #491: `Machine.get_transitions` and its HSM counterpart now accept `Enum` and `State` for `source` and `dest` (thanks @thedrow) ## 0.8.5 (November 2020) Release 0.8.5 is a minor release and contains bugfixes: - `AsyncMachine.switch_model_context` is expected to be `async` now for easier integration of async code during model switch. - Bugfix #478: Initializing a machine with `GraphSupport` threw an exception when initial was set to a nested or parallel state (thanks @nickvazztau) ## 0.8.4 (October 2020) Release 0.8.4 is a minor release and contains bugfixes as well as new features: - Bugfix #477: Model callbacks were not added to a LockedHierarchicalMachine when the machine itself served as a model (thanks @oliver-goetz) - Bugfix #475: Clear collection of tasks to prevent memory leak when initializing many models (thanks @h-nakai) - Feature #474: Added static `AsyncMachine.protected_tasks` list which can be used to prevent `transitions` to cancel certain tasks. - Feature: Constructor of `HierarchicalMachine` now accepts substates ('A_1_c') and parallel states (['A', 'B']) as `initial` parameter ## 0.8.3 (September 2020) Release 0.8.3 is a minor release and contains several bugfixes mostly related to `HierarchicalStateMachine`: - Feature #473: Assign `is__` instead of `is_` when `model_attribute != "state"` to enable multiple versions of such convenience functions. A warning will be raised when `is_` is used. (thanks @artofhuman) - Similarly, auto transitions (`to_`) will be assigned as `to__`. `to_` will work as before but raise a warning until version 0.9.0. - Bugfix: `allow_substates` did not consider enum states - Feature: Nested enums can now be passed in a dict as `children` with `initial` parameter - Bugfix #449: get_triggers/get_transitions did not return nested triggers correctly (thanks @alexandretanem) - Feature #452: Improve handling of label attributes in custom diagram states and `TransitionGraphSupport` (thanks @badiku) - Bugfix #456: Prevent parents from overriding (falsy) results of their children's events (thanks @alexandretanem) - Bugfix #458: Entering the same state caused key errors when transition was defined on a parent (thanks @matlom) - Bugfix #459: Do not remove current timeout runner in AsyncTimeout to prevent accidental overrides (thanks @rgov) - Rewording of `State.enter/exit` debug message emitted when callbacks have been processed. - Bugfix #370: Fix order of `before_state_change/before` and `after/after_state_change` in `AsyncMachine` (thanks @tzoiker and @vishes-shell) - Bugfix #470: `Graph.get_graph()` did not consider `enum` states when `show_roi=True` (thanks @termim) ## 0.8.2 (June 2020) Release 0.8.2 is a minor release and contains several bugfixes and improvements: - Bugfix #438: Improved testing without any optional `graphviz` package - Bugfix: `_check_event_result` failed when model was in parallel state - Bugfix #440: Only allow explicit `dest=None` in `Machine.add_transition` (not just falsy) for internal transitions (thanks @Pathfinder216) - Bugfix #419: Fix state creation of nested enums (thanks @thedrow) - Bugfix #428: HierarchicalGraphMachine did not find/apply styling for parallel states (thanks @xiaohuihui1024) - Bugfix: `Model.trigger` now considers the machine's and current state's `ignore_invalid_triggers` attribute and can be called with non-existing events (thanks @potens1) - Bugfix: Child states may not have been exited when the executed transition had been defined on a parent (thanks @thedrow) - Feature #429: Introduced `transitions.extensions.asyncio.AsyncTimeout` as a state decorator to avoid threads used in `transitions.extensions.state.Timeout` (thanks @potens1) - Feature #444: `transitions` can now be tested online at mybinder.org - PR #418: Use sets instead of lists to cache already covered transitions in nested state machines (thanks @thedrow) - PR #422: Improve handling of unresolved attributes for easier inheritance (thanks @thedrow) - PR #445: Refactored AsyncMachine to enable trio/anyio override ## 0.8.1 (April 2020) Release 0.8.1 is a minor release of HSM improvements and bugfixes in the diagram and async extension: - Feature: Introduced experimental `HierarchicalAsync(Graph)Machine` - Feature #405: Support for nested Enums in `HierarchicalMachine` (thanks @thedrow) - Bugfix #400: Fix style initialization when initial state is an `Enum` (thanks @kbinpgh) - Bugfix #403: AsyncMachine.dispatch now returns a boolean as expected (thanks @thedrow) - Bugfix #413: Improve diagram output for `HierarchicalMachine` (thanks @xiaohuihui1024) - Increased coverage (thanks @thedrow) - Introduced `xdist` for parallel testing with `pytest` (thanks @thedrow) ## 0.8.0 (March 2020) Release 0.8.0 is a major release and introduces asyncio support for Python 3.7+, parallel state support and some bugfixes: - Feature: `HierarchicalMachine` has been rewritten to support parallel states. Please have a look at the ReadMe.md to check what has changed. - The previous version can be found in `transitions.extensions.nesting_legacy` for now - Feature: Introduced `AsyncMachine` (see discussion #259); note that async HSMs are not yet supported - Feature #390: String callbacks can now point to properties and attributes (thanks @jsenecal) - Bugfix: Auto transitions are added multiple times when add_states is called more than once - Bugfix: Convert state.\_name from `Enum` into strings in `MarkupMachine` when necessary - Bugfix #392: Allow `Machine.add_ordered_transitions` to be called without the initial state (thanks @mkaranki and @facundofc) - `GraphMachine` now attempts to fall back to `graphviz` when importing `pygraphviz` fails - Not implemented/tested so far (contributions are welcome!): - Proper Graphviz support of parallel states - AsyncHierachicalMachine ## 0.7.2 (January 2020) Release 0.7.2 is a minor release and contains bugfixes and a new feature: - Bugfix #386: Fix transitions for enums with str behavior (thanks @artofhuman) - Bugfix #378: Don't mask away KeyError when executing a transition (thanks @facundofc) - Feature #387: Add support for dynamic model state attribute (thanks @v1k45) ## 0.7.1 (September 2019) Release 0.7.1 is a minor release and contains several documentation improvements and a new feature: - Feature #334: Added Enum (Python 3.4+: `enum` Python 2.7: `enum34`) support (thanks @artofhuman and @justinttl) - Replaced test framework `nosetests` with `pytest` (thanks @artofhuman) - Extended `add_ordered_transitions` documentation in `Readme.md` - Collected code snippets from earlier discussions in `examples/Frequently asked questions.ipynb` - Improved stripping of `long_description` in `setup.py` (thanks @artofhuman) ## 0.7.0 (August 2019) Release 0.7.0 is a major release with fundamental changes to the diagram extension. It also introduces an intermediate `MarkupMachine` which can be used to transfer and (re-)initialize machine configurations. - Feature #263: `MarkupMachine` can be used to retrieve a Machine's dictionary representation - `GraphMachine` uses this representation for Graphs now and does not rely on `Machine` attributes any longer - Feature: The default value of `State.ignore_invalid_triggers` changed to `None`. If it is not explicitly set, the `Machine`'s value is used instead. - Feature #325: transitions now supports `pygraphviz` and `graphviz` for the creation of diagrams. Currently, `GraphMachine` will check for `pygraphviz` first and fall back to `graphviz`. To use `graphviz` directly pass `use_pygraphiv=False` to the constructor of `GraphMachine` - Diagram style has been overhauled. Have a look at `GraphMachine`'s attributes `machine_attributes` and `style_attributes` to adjust it to your needs. - Feature #305: Timeouts and other features are now marked in the graphs - Bugfix #343: `get_graph` was not assigned to models added during machine runtime ## 0.6.9 (October 2018) Release 0.6.9 is a minor release and contains two bugfixes: - Bugfix #314: Do not override already defined model functions with convenience functions (thanks @Arkanayan) - Bugfix #316: `state.Error` did not call parent's `enter` method (thanks @potens1) ## 0.6.8 (May, 2018) Release 0.6.8 is a minor release and contains a critical bugfix: - Bugfix #301: Reading `Readme.md` in `setup.py` causes a `UnicodeDecodeError` in non-UTF8-locale environments (thanks @jodal) ## 0.6.7 (May, 2018) Release 0.6.7 is identical to 0.6.6. A release had been necessary due to #294 related to PyPI. ## 0.6.6 (May, 2018) Release 0.6.6 is a minor release and contains several bugfixes and new features: - Bugfix: `HierarchicalMachine` now considers the initial state of `NestedState` instances/names passed to `initial`. - Bugfix: `HierarchicalMachine` used to ignore children when `NestedStates` were added to the machine. - Bugfix #300: Fixed missing brackets in `TimeoutState` (thanks @Synss) - Feature #289: Introduced `Machine.resolve_callable(func, event_data)` to enable customization of callback definitions (thanks @ollamh and @paulbovbel) - Feature #299: Added support for internal transitions with `dest=None` (thanks @maueki) - Feature: Added `Machine.dispatch` to trigger events on all models assigned to `Machine` ## 0.6.5 (April, 2018) Release 0.6.5 is a minor release and contains a new feature and a bugfix: - Feature #287: Embedding `HierarchicalMachine` will now reuse the machine's `initial` state. Passing `initial: False` overrides this (thanks @mrjogo). - Bugfix #292: Models using `GraphMashine` were not picklable in the past due to `graph` property. Graphs for each model are now stored in `GraphMachine.model_graphs` (thanks @ansumanm). ## 0.6.4 (January, 2018) Release 0.6.4 is a minor release and contains a new feature and two bug fixes related to `HierachicalMachine`: - Bugfix #274: `initial` has not been passed to super in `HierachicalMachine.add_model` (thanks to @illes). - Feature #275: `HierarchicalMachine.add_states` now supports keyword `parent` to be a `NestedState` or a string. - Bugfix #278: `NestedState` has not been exited correctly during reflexive triggering (thanks to @hrsmanian). ## 0.6.3 (November, 2017) Release 0.6.3 is a minor release and contains a new feature and two bug fixes: - Bugfix #268: `Machine.add_ordered_transitions` changed states' order if `initial` is not the first or last state (thanks to @janekbaraniewski). - Bugfix #265: Renamed `HierarchicalMachine.to` to `to_state` to prevent warnings when HSM is used as a model. - Feature #266: Introduce `Machine.get_transitions` to get a list of transitions for alteration (thanks to @Synss). ## 0.6.2 (November, 2017) Release 0.6.2 is a minor release and contains new features and bug fixes but also several internal changes: - Documentation: Add docstring to every public method - Bugfix #257: Readme example variable had been capitalized (thanks to @fedesismo) - Add `appveyor.yml` for Windows testing; However, Windows testing is disabled due to #258 - Bugfix #262: Timeout threads prevented program from execution when main thread ended (thanks to @tkuester) - `prep_ordered_arg` is now protected in `core` - Convert `logger` instances to `_LOGGER` to comply with protected module constant naming standards - `traverse` is now protected in `HierarchicalMachine` - Remove abstract class `Diagram` since it did not add functionality to `diagrams` - Specify several overrides of `add_state` or `add_transition` to keep the base class parameters instead of `*args` and `**kwargs` - Change several `if len(x) > 0:` checks to `if x:` as suggested by the static code analysis to make use of falsy empty lists/strings. ## 0.6.1 (September, 2017) Release 0.6.1 is a minor release and contains new features as well as bug fixes: - Feature #245: Callback definitions ('before', 'on_enter', ...) have been moved to classes `Transition` and `State` - Bugfix #253: `Machine.remove_transitions` converted `defaultdict` into dict (thanks @Synss) - Bugfix #248: `HierarchicalStateMachine`'s copy procedure used to cause issues with function callbacks and object references (thanks @Grey-Bit) - Renamed `Machine.id` to `Machine.name` to be consistent with the constructor parameter `name` - Add `Machine.add_transitions` for adding multiple transitions at once (thanks @Synss) ## 0.6.0 (August, 2017) Release 0.6.0 is a major release and introduces new state features and bug fixes: - `add_state_features` convenience decorator supports creation of custom states - `Tags` makes states taggable - `Error` checks for error states (not accepted states that cannot be left); subclass of `Tags` - `Volatile` enables scoped/temporary state objects to handle context parameters - Removed `add_self` from `Machine` constructor - `pygraphviz` is now optional; use `pip install transitions[diagrams]` to install it - Narrowed warnings filter to prevent output cluttering by other 3rd party modules (thanks to @ksandeep) - Reword HSM exception when wrong state object had been passedn (thanks to @Blindfreddy) - Improved handling of partials during graph generation (thanks to @Synss) - Introduced check to allow explicit passing of callback functions which match the `on_enter_` scheme (thanks to @termim) - Bug #243: on_enter/exit callbacks defined in dictionaries had not been assigned correctly in HSMs (thanks to @Blindfreddy) - Introduced workaround for Python 3 versions older than 3.4 to support dill version 0.2.7 and higher (thanks to @mmckerns) - Improved manifest (#242) to comply with distribution standards (thanks to @jodal) ## 0.5.3 (May, 2017) Release 0.5.3 is a minor release and contains several bug fixes: - Bug #214: `LockedMachine` as a model prevented correct addition of `on_enter/exit_` (thanks to @kr2) - Bug #217: Filtering rules for auto transitions in graphs falsely filtered certain transitions (thanks to @KarolOlko) - Bug #218: Uninitialized `EventData.transition` caused `AttributeError` in `EventData.__repr__` (thanks to @kunalbhagawati) - Bug #215: State instances passed to `initial` parameter of `Machine` constructor had not been processed properly (thanks @mathiasimmer) ## 0.5.2 (April, 2017) Release 0.5.2 is a minor release and contains a bug fix: - Bug #213: prevent `LICENSE` to be installed to root of installation path ## 0.5.1 (April, 2017) Release 0.5.1 is a minor release and contains new features and bug fixes: - Added reflexive transitions (thanks to @janLo) - Wildcards for reflexive (`wildcard_same`) and all (`wildcard_all`) destinations are `Machine` class variables now which can be altered if necessary. - Add LICENSE to packaged distribution (thanks to @bachp) - Bug #211: `prepare` and `finalized` had not been called for HierarchicalMachines (thanks to @booware) ## 0.5.0 (March, 2017) Release 0.5.0 is a major release: - CHANGED API: `MachineError` is now limited to internal error and has been replaced by `AttributeError` and `ValueError` where applicable (thanks to @ankostis) - CHANGED API: Phasing out `add_self`; `model=None` will add NO model starting from next major release; use `model='self'` instead. - Introduced deprecation warnings for upcoming changes concerning `Machine` keywords `model` and `add_self` - Introduced `Machine.remove_transition` (thanks to @PaleNeutron) - Introduced `Machine._create_state` for easier subclassing of states - `LockedMachine` now supports custom context managers for each model (thanks to @paulbovbel) - `Machine.before/after_state_change` can now be altered dynamically (thanks to @peendebak) - `Machine.add_ordered_transitions` now supports `prepare`, `conditons`, `unless`, `before` and `after` (thanks to @aforren1) - New `prepare_event` and `finalize_event` keywords to handle transitions globally (thanks to @ankostis) - New `show_auto_transitions` keyword for `GraphMachine.__init__` (default `False`); if enabled, show auto transitions in graph - New `show_roi` keyword for `GraphMachine._get_graph` (default `False`); if `True`, show only reachable states in retrieved graph - Test suite now skips contextual tests (e.g. pygraphviz) if dependencies cannot be found (thanks to @ankostis) - Improved string representation of several classes (thanks to @ankostis) - Improved `LockedMachine` performance by removing recursive locking - Improved graph layout for nested graphs - `transitions.extensions.nesting.AGraph` has been split up into `Graph` and `NestedGraph` for easier maintenance - Fixed bug related to pickling `RLock` in nesting - Fixed order of callback execution (thanks to @ankostis) - Fixed representation of condition names in graphs (thanks to @cemoody) ## 0.4.3 (December, 2016) Release 0.4.3 is a minor release and contains bug fixes and several new features: - Support dynamic model addition via `Machine.add_model` (thanks to @paulbovbel) - Allow user to explicitly pass a lock instance or context manager to LockedMachine (thanks to @paulbovbel) - Fixed issue related to parsing of HSMs (thanks to @steval and @user2154065 from SO) - When `State` is passed to `Machine.add_transition`, it will check if the state (and not just the name) is known to the machine ## 0.4.2 (October, 2016) Release 0.4.2 contains several new features and bugfixes: - Machines can work with multiple models now (thanks to @gemerden) - New `initial` keyword for nested states to automatically enter a child - New `Machine.trigger` method to trigger events by name (thanks to @IwanLD) - Bug fixes related to remapping in nested (thanks to @imbaczek) - Log messages in `Transition.execute` and `Machine.__init__` have been reassigned to DEBUG log level (thanks to @ankostis) - New `Machine.get_triggers` method to return all valid transitions from (a) certain state(s) (thanks to @limdauto and @guilhermecgs) ## 0.4.1 (July, 2016) Release 0.4.1 is a minor release containing bug fixes, minor API changes, and community feedback: - `async` is renamed to `queued` since it describes the mechanism better - HierarchicalStateMachine.is_state now provides `allow_substates` as an optional argument(thanks to @jonathanunderwood) - Machine can now be used in scenarios where multiple inheritance is required (thanks to @jonathanunderwood) - Adds support for tox (thanks to @medecau and @aisbaa) - Bug fixes: - Problems with conditions shown multiple times in graphs - Bug which omitted transitions with same source and destination in diagrams (thanks to @aisbaa) - Conditions passed incorrectly when HSMs are used as a nested state - Class nesting issue that prevented pickling with dill - Two bugs in HierarchicalStateMachine (thanks to @ajax2leet) - Avoided recursion error when naming a transition 'process' (thanks to @dceresuela) - Minor PEP8 fixes (thanks to @medecau) ## 0.4.0 (April, 2016) Release 0.4 is a major release that includes several new features: - New `async` Machine keyword allows queueing of transitions (thanks to @khigia) - New `name` Machine keyword customizes transitions logger output for easier debugging of multiple running instances - New `prepare` Transition keyword for callbacks before any 'conditions' are checked (thanks to @TheMysteriousX) - New `show_conditions` GraphSupport keyword adds condition checks to dot graph edges (thanks to @khigia) - Nesting now supports custom (unicode) substate separators - Nesting no longer requires a leaf state (e.g. to_C() does not enter C_1 automatically) - Factory for convenient extension mixins - Numerous minor improvements and bug fixes ## 0.3.1 (January 3, 2016) Mostly a bug fix release. Changes include: - Fixes graphing bug introduced in 0.3.0 (thanks to @wtgee) - Fixes bug in dynamic addition of before/after callbacks (though this is a currently undocumented feature) - Adds coveralls support and badge - Adds a few tests to achieve near-100% coverage ## 0.3.0 (January 2, 2016) Release 0.3 includes a number of new features (nesting, multithreading, and graphing) as well as bug fixes and minor improvements: - Support for nested states (thanks to @aleneum) - Basic multithreading support for function access (thanks to @aleneum) - Basic graphing support via graphviz (thanks to @svdgraaf) - Stylistic edits, minor fixes, and improvements to README - Expanded and refactored tests - Minor bug fixes ## 0.2.9 (November 10, 2015) - Enabled pickling in Python 3.4 (and in < 3.4 with the dill module) - Added reference to generating Transition in EventData objects - Fixed minor bugs ## 0.2.8 (August, 6, 2015) - README improvements, added TOC, and typo fixes - Condition checks now receive optional data - Removed invasive basicConfig() call introduced with logging in 0.2.6 ## 0.2.7 (July 27, 2015) - Fixed import bug that prevented dependency installation at setup ## 0.2.6 (July 26, 2015) - Added rudimentary logging for key transition and state change events - Added generic before/after callbacks that apply to all state changes - Ensured string type compatibility across Python 2 and 3 ## 0.2.5 (May 4, 2015) - Added ability to suppress invalid trigger calls - Shorthand definition of transitions via lists ## 0.2.4 (March 11, 2015) - Automatic detection of predefined state callbacks - Fixed bug in automatic transition creation - Added Changelog ## 0.2.3 (January 14, 2015) - Added travis-ci support - Cleaned up and PEP8fied code - Added 'unless' argument to transitions that mirrors 'conditions' ## 0.2.2 (December 28, 2014) - Python 2/3 compatibility - Added automatic to\_{state}() methods - Added ability to easily add ordered transitions transitions-0.9.0/requirements_diagrams.txt0000644000232200023220000000001314304350474021574 0ustar debalancedebalancepygraphviz transitions-0.9.0/transitions/0000755000232200023220000000000014304350474017024 5ustar debalancedebalancetransitions-0.9.0/transitions/py.typed0000644000232200023220000000000114304350474020512 0ustar debalancedebalance transitions-0.9.0/transitions/__init__.py0000644000232200023220000000100114304350474021125 0ustar debalancedebalance""" transitions ----------- A lightweight, object-oriented state machine implementation in Python. Compatible with Python 2.7+ and 3.0+. """ from __future__ import absolute_import from .version import __version__ from .core import (State, Transition, Event, EventData, Machine, MachineError) __copyright__ = "Copyright (c) 2021 Tal Yarkoni, Alexander Neumann" __license__ = "MIT" __summary__ = "A lightweight, object-oriented finite state machine in Python" __uri__ = "https://github.com/tyarkoni/transitions" transitions-0.9.0/transitions/version.py0000644000232200023220000000025714304350474021067 0ustar debalancedebalance""" Contains the current version of transition which is used in setup.py and can also be used to determine transitions' version during runtime. """ __version__ = '0.9.0' transitions-0.9.0/transitions/core.pyi0000644000232200023220000002407014304350474020502 0ustar debalancedebalancefrom logging import Logger from functools import partial from typing import ( Any, Optional, Callable, Sequence, Union, Iterable, List, Dict, DefaultDict, Type, Deque, OrderedDict, Tuple, Literal, Collection ) # Enums are supported for Python 3.4+ and Python 2.7 with enum34 package installed from enum import Enum, EnumMeta _LOGGER: Logger Callback = Union[str, Callable] CallbackList = List[Callback] CallbacksArg = Optional[Union[Callback, CallbackList]] ModelState = Union[str, Enum, List] ModelParameter = Union[Union[Literal['self'], Any], List[Union[Literal['self'], Any]]] def listify(obj: Union[None, list, tuple, EnumMeta, Any]) -> Union[list, tuple, EnumMeta]: ... def _prep_ordered_arg(desired_length: int, arguments: CallbacksArg) -> CallbackList: ... class State: dynamic_methods: List[str] _name: Union[str, Enum] ignore_invalid_triggers: bool on_enter: CallbackList on_exit: CallbackList def __init__(self, name: Union[str, Enum], on_enter: CallbacksArg = ..., on_exit: CallbacksArg = ..., ignore_invalid_triggers: bool = ...) -> None: ... @property def name(self) -> str: ... @property def value(self) -> Union[str, Enum]: ... def enter(self, event_data: EventData) -> None: ... def exit(self, event_data: EventData) -> None: ... def add_callback(self, trigger: str, func: Callback) -> None: ... def __repr__(self) -> str: ... StateIdentifier = Union[str, Enum, State] StateConfig = Union[StateIdentifier, Dict[str, Any], Collection[str]] class Condition: func: Callback target: bool def __init__(self, func: Callback, target: bool = ...) -> None: ... def check(self, event_data: EventData) -> bool: ... def __repr__(self) -> str: ... class Transition: dynamic_methods: List[str] condition_cls: Type[Condition] source: str dest: str prepare: CallbackList before: CallbackList after: CallbackList conditions: List[Condition] def __init__(self, source: str, dest: str, conditions: Optional[Condition] = ..., unless: CallbacksArg = ..., before: CallbacksArg = ..., after: CallbacksArg = ..., prepare: CallbacksArg = ...) -> None: ... def _eval_conditions(self, event_data: EventData) -> bool: ... def execute(self, event_data: EventData) -> bool: ... def _change_state(self, event_data: EventData) -> None: ... def add_callback(self, trigger: str, func: Callback) -> None: ... def __repr__(self) -> str: ... TransitionConfig = Union[Sequence[Union[str, Any]], Dict[str, Any], Transition] class EventData: state: Optional[State] event: Optional[Event] machine: Optional[Machine] model: object args: Iterable[Any] kwargs: Dict[str, Any] transition: Optional[Transition] error: Optional[Exception] result: Optional[bool] def __init__(self, state: Optional[State], event: Optional[Event], machine: Machine, model: object, args: Iterable[Any], kwargs: Dict[str, Any]) -> None: ... def update(self, state: Union[State, str, Enum]) -> None: ... def __repr__(self) -> str: ... class Event: name: str machine: Machine transitions: DefaultDict[str, List[Transition]] def __init__(self, name: str, machine: Machine) -> None: ... def add_transition(self, transition: Transition) -> None: ... def trigger(self, model: object, *args: List, **kwargs: Dict) -> bool: ... def _trigger(self, event_data: EventData) -> bool: ... def _process(self, event_data: EventData) -> bool: ... def _is_valid_source(self, state: State) -> bool: ... def __repr__(self) -> str: ... def add_callback(self, trigger: str, func: Callback) -> None: ... class Machine: separator: str wildcard_all: str wildcard_same: str state_cls: Type[State] transition_cls: Type[Transition] event_cls: Type[Event] self_literal: Literal['self'] _queued: bool _transition_queue: Deque[partial] _before_state_change: CallbackList _after_state_change: CallbackList _prepare_event: CallbackList _finalize_event: CallbackList _on_exception: CallbackList _initial: Optional[str] states: OrderedDict[str, State] events: Dict[str, Event] send_event: bool auto_transitions: bool ignore_invalid_triggers: Optional[bool] name: str model_attribute: str models: List[Any] def __init__(self, model: Optional[ModelParameter] = ..., states: Optional[Union[Sequence[StateConfig], Type[Enum]]] = ..., initial: Optional[StateIdentifier] = ..., transitions: Optional[Union[TransitionConfig, Sequence[TransitionConfig]]] = ..., send_event: bool = ..., auto_transitions: bool = ..., ordered_transitions: bool = ..., ignore_invalid_triggers: Optional[bool] = ..., before_state_change: CallbacksArg = ..., after_state_change: CallbacksArg = ..., name: str = ..., queued: bool = ..., prepare_event: CallbacksArg = ..., finalize_event: CallbacksArg = ..., model_attribute: str = ..., on_exception: CallbacksArg = ..., **kwargs: Dict[str, Any]) -> None: ... def add_model(self, model: ModelParameter, initial: Optional[StateIdentifier] = ...) -> None: ... def remove_model(self, model: ModelParameter) -> None: ... @classmethod def _create_transition(cls, *args: Any, **kwargs: Any) -> Transition: ... @classmethod def _create_event(cls, *args: Any, **kwargs: Any) -> Event: ... @classmethod def _create_state(cls, *args: Any, **kwargs: Any) -> State: ... @property def initial(self) -> Optional[str]: ... @initial.setter def initial(self, value: StateIdentifier) -> None: ... @property def has_queue(self) -> bool: ... @property def model(self) -> Union[object, List[object]]: ... @property def before_state_change(self) -> CallbackList: ... @before_state_change.setter def before_state_change(self, value: CallbacksArg) -> None: ... @property def after_state_change(self) -> CallbackList: ... @after_state_change.setter def after_state_change(self, value: CallbacksArg) -> None: ... @property def prepare_event(self) -> CallbackList: ... @prepare_event.setter def prepare_event(self, value: CallbacksArg) -> None: ... @property def finalize_event(self) -> CallbackList: ... @finalize_event.setter def finalize_event(self, value: CallbacksArg) -> None: ... @property def on_exception(self) -> CallbackList: ... @on_exception.setter def on_exception(self, value: CallbacksArg) -> None: ... def get_state(self, state: Union[str, Enum]) -> State: ... def is_state(self, state: Union[str, Enum], model: object) -> bool: ... def get_model_state(self, model: object) -> State: ... def set_state(self, state: StateIdentifier, model: Optional[object] = ...) -> None: ... def add_state(self, states: Union[Sequence[StateConfig], StateConfig], on_enter: CallbacksArg = ..., on_exit: CallbacksArg = ..., ignore_invalid_triggers: Optional[bool] = ..., **kwargs: Dict[str, Any]) -> None: ... def add_states(self, states: Union[Sequence[StateConfig], StateConfig], on_enter: CallbacksArg = ..., on_exit: CallbacksArg = ..., ignore_invalid_triggers: Optional[bool] = ..., **kwargs: Dict[str, Any]) -> None: ... def _add_model_to_state(self, state: State, model: object) -> None: ... def _checked_assignment(self, model: object, name: str, func: Callable) -> None: ... def _add_trigger_to_model(self, trigger: str, model: object) -> None: ... def _get_trigger(self, model: object, trigger_name: str, *args: List, **kwargs: Dict[str, Any]) -> bool: ... def get_triggers(self, *args: Union[str, Enum, State]) -> List[str]: ... def add_transition(self, trigger: str, source: Union[StateIdentifier, List[StateIdentifier]], dest: Optional[StateIdentifier] = ..., conditions: CallbacksArg = ..., unless: CallbacksArg = ..., before: CallbacksArg = ..., after: CallbacksArg = ..., prepare: CallbacksArg = ..., **kwargs: Dict[str, Any]) -> None: ... def add_transitions(self, transitions: Union[TransitionConfig, List[TransitionConfig]]) -> None: ... def add_ordered_transitions(self, states: Optional[Sequence[Union[str, State]]] = ..., trigger: str = ..., loop: bool = ..., loop_includes_initial: bool = ..., conditions: Optional[Sequence[Union[Callback, None]]] = ..., unless: Optional[Sequence[Union[Callback, None]]] = ..., before: Optional[Sequence[Union[Callback, None]]] = ..., after: Optional[Sequence[Union[Callback, None]]] = ..., prepare: CallbacksArg = ..., **kwargs: Dict[str, Any]) -> None: ... def get_transitions(self, trigger: str = ..., source: StateIdentifier = ..., dest: StateIdentifier = ...) -> List[Transition]: ... def remove_transition(self, trigger: str, source: str = ..., dest: str = ...) -> None: ... def dispatch(self, trigger: str, *args: List, **kwargs: Dict[str, Any]) -> bool: ... def callbacks(self, funcs: Iterable[Union[str, Callable]], event_data: EventData) -> None: ... def callback(self, func: Union[str, Callable], event_data: EventData) -> None: ... @staticmethod def resolve_callable(func: Union[str, Callable], event_data: EventData) -> Callable: ... def _has_state(self, state: StateIdentifier, raise_error: bool = ...) -> bool: ... def _process(self, trigger: partial) -> bool: ... def _identify_callback(self, name: str) -> Tuple[Optional[str], Optional[str]]: ... def __getattr__(self, name: str) -> Any: ... class MachineError(Exception): value: str def __init__(self, value: str) -> None: ... def __str__(self) -> str: ... transitions-0.9.0/transitions/core.py0000644000232200023220000016614714304350474020345 0ustar debalancedebalance""" transitions.core ---------------- This module contains the central parts of transitions which are the state machine logic, state and transition concepts. """ try: from builtins import object except ImportError: # python2 pass try: # Enums are supported for Python 3.4+ and Python 2.7 with enum34 package installed from enum import Enum, EnumMeta except ImportError: # If enum is not available, create dummy classes for type checks class Enum: # type:ignore """ This is just an Enum stub for Python 2 and Python 3.3 and before without Enum support. """ class EnumMeta: # type:ignore """ This is just an EnumMeta stub for Python 2 and Python 3.3 and before without Enum support. """ import inspect import itertools import logging import warnings from collections import OrderedDict, defaultdict, deque from functools import partial from six import string_types _LOGGER = logging.getLogger(__name__) _LOGGER.addHandler(logging.NullHandler()) warnings.filterwarnings(action='default', message=r".*transitions version.*", category=DeprecationWarning) def listify(obj): """Wraps a passed object into a list in case it has not been a list, tuple before. Returns an empty list in case ``obj`` is None. Args: obj: instance to be converted into a list. Returns: list: May also return a tuple in case ``obj`` has been a tuple before. """ if obj is None: return [] try: return obj if isinstance(obj, (list, tuple, EnumMeta)) else [obj] except ReferenceError: # obj is an empty weakref return [obj] def _prep_ordered_arg(desired_length, arguments=None): """Ensure list of arguments passed to add_ordered_transitions has the proper length. Expands the given arguments and apply same condition, callback to all transitions if only one has been given. Args: desired_length (int): The size of the resulting list arguments (optional[str, reference or list]): Parameters to be expanded. Returns: list: Parameter sets with the desired length. """ arguments = listify(arguments) if arguments is not None else [None] if len(arguments) != desired_length and len(arguments) != 1: raise ValueError("Argument length must be either 1 or the same length as " "the number of transitions.") if len(arguments) == 1: return arguments * desired_length return arguments class State(object): """A persistent representation of a state managed by a ``Machine``. Attributes: name (str): State name which is also assigned to the model(s). on_enter (list): Callbacks executed when a state is entered. on_exit (list): Callbacks executed when a state is exited. ignore_invalid_triggers (bool): Indicates if unhandled/invalid triggers should raise an exception. """ # A list of dynamic methods which can be resolved by a ``Machine`` instance for convenience functions. # Dynamic methods for states must always start with `on_`! dynamic_methods = ['on_enter', 'on_exit'] def __init__(self, name, on_enter=None, on_exit=None, ignore_invalid_triggers=None): """ Args: name (str or Enum): The name of the state on_enter (str or list): Optional callable(s) to trigger when a state is entered. Can be either a string providing the name of a callable, or a list of strings. on_exit (str or list): Optional callable(s) to trigger when a state is exited. Can be either a string providing the name of a callable, or a list of strings. ignore_invalid_triggers (Boolean): Optional flag to indicate if unhandled/invalid triggers should raise an exception """ self._name = name self.ignore_invalid_triggers = ignore_invalid_triggers self.on_enter = listify(on_enter) if on_enter else [] self.on_exit = listify(on_exit) if on_exit else [] @property def name(self): """ The name of the state. """ if isinstance(self._name, Enum): return self._name.name return self._name @property def value(self): """ The state's value. For string states this will be equivalent to the name attribute. """ return self._name def enter(self, event_data): """ Triggered when a state is entered. """ _LOGGER.debug("%sEntering state %s. Processing callbacks...", event_data.machine.name, self.name) event_data.machine.callbacks(self.on_enter, event_data) _LOGGER.info("%sFinished processing state %s enter callbacks.", event_data.machine.name, self.name) def exit(self, event_data): """ Triggered when a state is exited. """ _LOGGER.debug("%sExiting state %s. Processing callbacks...", event_data.machine.name, self.name) event_data.machine.callbacks(self.on_exit, event_data) _LOGGER.info("%sFinished processing state %s exit callbacks.", event_data.machine.name, self.name) def add_callback(self, trigger, func): """ Add a new enter or exit callback. Args: trigger (str): The type of triggering event. Must be one of 'enter' or 'exit'. func (str): The name of the callback function. """ callback_list = getattr(self, 'on_' + trigger) callback_list.append(func) def __repr__(self): return "<%s('%s')@%s>" % (type(self).__name__, self.name, id(self)) class Condition(object): """ A helper class to call condition checks in the intended way. Attributes: func (str or callable): The function to call for the condition check target (bool): Indicates the target state--i.e., when True, the condition-checking callback should return True to pass, and when False, the callback should return False to pass. """ def __init__(self, func, target=True): """ Args: func (str or callable): Name of the condition-checking callable target (bool): Indicates the target state--i.e., when True, the condition-checking callback should return True to pass, and when False, the callback should return False to pass. Notes: This class should not be initialized or called from outside a Transition instance, and exists at module level (rather than nesting under the transition class) only because of a bug in dill that prevents serialization under Python 2.7. """ self.func = func self.target = target def check(self, event_data): """ Check whether the condition passes. Args: event_data (EventData): An EventData instance to pass to the condition (if event sending is enabled) or to extract arguments from (if event sending is disabled). Also contains the data model attached to the current machine which is used to invoke the condition. """ predicate = event_data.machine.resolve_callable(self.func, event_data) if event_data.machine.send_event: return predicate(event_data) == self.target return predicate(*event_data.args, **event_data.kwargs) == self.target def __repr__(self): return "<%s(%s)@%s>" % (type(self).__name__, self.func, id(self)) class Transition(object): """ Representation of a transition managed by a ``Machine`` instance. Attributes: source (str): Source state of the transition. dest (str): Destination state of the transition. prepare (list): Callbacks executed before conditions checks. conditions (list): Callbacks evaluated to determine if the transition should be executed. before (list): Callbacks executed before the transition is executed but only if condition checks have been successful. after (list): Callbacks executed after the transition is executed but only if condition checks have been successful. """ dynamic_methods = ['before', 'after', 'prepare'] """ A list of dynamic methods which can be resolved by a ``Machine`` instance for convenience functions. """ condition_cls = Condition """ The class used to wrap condition checks. Can be replaced to alter condition resolution behaviour (e.g. OR instead of AND for 'conditions' or AND instead of OR for 'unless') """ def __init__(self, source, dest, conditions=None, unless=None, before=None, after=None, prepare=None): """ Args: source (str): The name of the source State. dest (str): The name of the destination State. conditions (optional[str, callable or list]): Condition(s) that must pass in order for the transition to take place. Either a string providing the name of a callable, or a list of callables. For the transition to occur, ALL callables must return True. unless (optional[str, callable or list]): Condition(s) that must return False in order for the transition to occur. Behaves just like conditions arg otherwise. before (optional[str, callable or list]): callbacks to trigger before the transition. after (optional[str, callable or list]): callbacks to trigger after the transition. prepare (optional[str, callable or list]): callbacks to trigger before conditions are checked """ self.source = source self.dest = dest self.prepare = [] if prepare is None else listify(prepare) self.before = [] if before is None else listify(before) self.after = [] if after is None else listify(after) self.conditions = [] if conditions is not None: for cond in listify(conditions): self.conditions.append(self.condition_cls(cond)) if unless is not None: for cond in listify(unless): self.conditions.append(self.condition_cls(cond, target=False)) def _eval_conditions(self, event_data): for cond in self.conditions: if not cond.check(event_data): _LOGGER.debug("%sTransition condition failed: %s() does not return %s. Transition halted.", event_data.machine.name, cond.func, cond.target) return False return True def execute(self, event_data): """ Execute the transition. Args: event_data: An instance of class EventData. Returns: boolean indicating whether the transition was successfully executed (True if successful, False if not). """ _LOGGER.debug("%sInitiating transition from state %s to state %s...", event_data.machine.name, self.source, self.dest) event_data.machine.callbacks(self.prepare, event_data) _LOGGER.debug("%sExecuted callbacks before conditions.", event_data.machine.name) if not self._eval_conditions(event_data): return False event_data.machine.callbacks(itertools.chain(event_data.machine.before_state_change, self.before), event_data) _LOGGER.debug("%sExecuted callback before transition.", event_data.machine.name) if self.dest: # if self.dest is None this is an internal transition with no actual state change self._change_state(event_data) event_data.machine.callbacks(itertools.chain(self.after, event_data.machine.after_state_change), event_data) _LOGGER.debug("%sExecuted callback after transition.", event_data.machine.name) return True def _change_state(self, event_data): event_data.machine.get_state(self.source).exit(event_data) event_data.machine.set_state(self.dest, event_data.model) event_data.update(getattr(event_data.model, event_data.machine.model_attribute)) event_data.machine.get_state(self.dest).enter(event_data) def add_callback(self, trigger, func): """ Add a new before, after, or prepare callback. Args: trigger (str): The type of triggering event. Must be one of 'before', 'after' or 'prepare'. func (str or callable): The name of the callback function or a callable. """ callback_list = getattr(self, trigger) callback_list.append(func) def __repr__(self): return "<%s('%s', '%s')@%s>" % (type(self).__name__, self.source, self.dest, id(self)) class EventData(object): """ Collection of relevant data related to the ongoing transition attempt. Attributes: state (State): The State from which the Event was triggered. event (Event): The triggering Event. machine (Machine): The current Machine instance. model (object): The model/object the machine is bound to. args (list): Optional positional arguments from trigger method to store internally for possible later use. kwargs (dict): Optional keyword arguments from trigger method to store internally for possible later use. transition (Transition): Currently active transition. Will be assigned during triggering. error (Exception): In case a triggered event causes an Error, it is assigned here and passed on. result (bool): True in case a transition has been successful, False otherwise. """ def __init__(self, state, event, machine, model, args, kwargs): """ Args: state (State): The State from which the Event was triggered. event (Event): The triggering Event. machine (Machine): The current Machine instance. model (object): The model/object the machine is bound to. args (tuple): Optional positional arguments from trigger method to store internally for possible later use. kwargs (dict): Optional keyword arguments from trigger method to store internally for possible later use. """ self.state = state self.event = event self.machine = machine self.model = model self.args = args self.kwargs = kwargs self.transition = None self.error = None self.result = False def update(self, state): """ Updates the EventData object with the passed state. Attributes: state (State, str or Enum): The state object, enum member or string to assign to EventData. """ if not isinstance(state, State): self.state = self.machine.get_state(state) def __repr__(self): return "<%s('%s', %s)@%s>" % (type(self).__name__, self.state, getattr(self, 'transition'), id(self)) class Event(object): """ A collection of transitions assigned to the same trigger """ def __init__(self, name, machine): """ Args: name (str): The name of the event, which is also the name of the triggering callable (e.g., 'advance' implies an advance() method). machine (Machine): The current Machine instance. """ self.name = name self.machine = machine self.transitions = defaultdict(list) def add_transition(self, transition): """ Add a transition to the list of potential transitions. Args: transition (Transition): The Transition instance to add to the list. """ self.transitions[transition.source].append(transition) def trigger(self, model, *args, **kwargs): """ Executes all transitions that match the current state, halting as soon as one successfully completes. More precisely, it prepares a partial of the internal ``_trigger`` function, passes this to ``Machine._process``. It is up to the machine's configuration of the Event whether processing happens queued (sequentially) or whether further Events are processed as they occur. Args: model (object): The currently processed model args and kwargs: Optional positional or named arguments that will be passed onto the EventData object, enabling arbitrary state information to be passed on to downstream triggered functions. Returns: boolean indicating whether a transition was successfully executed (True if successful, False if not). """ func = partial(self._trigger, EventData(None, self, self.machine, model, args=args, kwargs=kwargs)) # pylint: disable=protected-access # noinspection PyProtectedMember # Machine._process should not be called somewhere else. That's why it should not be exposed # to Machine users. return self.machine._process(func) def _trigger(self, event_data): """ Internal trigger function called by the ``Machine`` instance. This should not be called directly but via the public method ``Machine.process``. Args: event_data (EventData): The currently processed event. State, result and (potentially) error might be overridden. Returns: boolean indicating whether a transition was successfully executed (True if successful, False if not). """ event_data.state = self.machine.get_model_state(event_data.model) try: if self._is_valid_source(event_data.state): self._process(event_data) except Exception as err: # pylint: disable=broad-except; Exception will be handled elsewhere event_data.error = err if self.machine.on_exception: self.machine.callbacks(self.machine.on_exception, event_data) else: raise finally: try: self.machine.callbacks(self.machine.finalize_event, event_data) _LOGGER.debug("%sExecuted machine finalize callbacks", self.machine.name) except Exception as err: # pylint: disable=broad-except; Exception will be handled elsewhere _LOGGER.error("%sWhile executing finalize callbacks a %s occurred: %s.", self.machine.name, type(err).__name__, str(err)) return event_data.result def _process(self, event_data): self.machine.callbacks(self.machine.prepare_event, event_data) _LOGGER.debug("%sExecuted machine preparation callbacks before conditions.", self.machine.name) for trans in self.transitions[event_data.state.name]: event_data.transition = trans if trans.execute(event_data): event_data.result = True break def _is_valid_source(self, state): if state.name not in self.transitions: msg = "%sCan't trigger event %s from state %s!" % (self.machine.name, self.name, state.name) ignore = state.ignore_invalid_triggers if state.ignore_invalid_triggers is not None \ else self.machine.ignore_invalid_triggers if ignore: _LOGGER.warning(msg) return False raise MachineError(msg) return True def __repr__(self): return "<%s('%s')@%s>" % (type(self).__name__, self.name, id(self)) def add_callback(self, trigger, func): """ Add a new before or after callback to all available transitions. Args: trigger (str): The type of triggering event. Must be one of 'before', 'after' or 'prepare'. func (str): The name of the callback function. """ for trans in itertools.chain(*self.transitions.values()): trans.add_callback(trigger, func) class Machine(object): """ Machine manages states, transitions and models. In case it is initialized without a specific model (or specifically no model), it will also act as a model itself. Machine takes also care of decorating models with conveniences functions related to added transitions and states during runtime. Attributes: states (OrderedDict): Collection of all registered states. events (dict): Collection of transitions ordered by trigger/event. models (list): List of models attached to the machine. initial (str): Name of the initial state for new models. prepare_event (list): Callbacks executed when an event is triggered. before_state_change (list): Callbacks executed after condition checks but before transition is conducted. Callbacks will be executed BEFORE the custom callbacks assigned to the transition. after_state_change (list): Callbacks executed after the transition has been conducted. Callbacks will be executed AFTER the custom callbacks assigned to the transition. finalize_event (list): Callbacks will be executed after all transitions callbacks have been executed. Callbacks mentioned here will also be called if a transition or condition check raised an error. queued (bool): Whether transitions in callbacks should be executed immediately (False) or sequentially. send_event (bool): When True, any arguments passed to trigger methods will be wrapped in an EventData object, allowing indirect and encapsulated access to data. When False, all positional and keyword arguments will be passed directly to all callback methods. auto_transitions (bool): When True (default), every state will automatically have an associated to_{state}() convenience trigger in the base model. ignore_invalid_triggers (bool): When True, any calls to trigger methods that are not valid for the present state (e.g., calling an a_to_b() trigger when the current state is c) will be silently ignored rather than raising an invalid transition exception. name (str): Name of the ``Machine`` instance mainly used for easier log message distinction. """ separator = '_' # separates callback type from state/transition name wildcard_all = '*' # will be expanded to ALL states wildcard_same = '=' # will be expanded to source state state_cls = State transition_cls = Transition event_cls = Event self_literal = 'self' def __init__(self, model=self_literal, states=None, initial='initial', transitions=None, send_event=False, auto_transitions=True, ordered_transitions=False, ignore_invalid_triggers=None, before_state_change=None, after_state_change=None, name=None, queued=False, prepare_event=None, finalize_event=None, model_attribute='state', on_exception=None, **kwargs): """ Args: model (object or list): The object(s) whose states we want to manage. If set to `Machine.self_literal` (default value), the current Machine instance will be used as the model (i.e., all triggering events will be attached to the Machine itself). Note that an empty list is treated like no model. states (list or Enum): A list or enumeration of valid states. Each list element can be either a string, an enum member or a State instance. If string or enum member, a new generic State instance will be created that is named according to the string or enum member's name. initial (str, Enum or State): The initial state of the passed model[s]. transitions (list): An optional list of transitions. Each element is a dictionary of named arguments to be passed onto the Transition initializer. send_event (boolean): When True, any arguments passed to trigger methods will be wrapped in an EventData object, allowing indirect and encapsulated access to data. When False, all positional and keyword arguments will be passed directly to all callback methods. auto_transitions (boolean): When True (default), every state will automatically have an associated to_{state}() convenience trigger in the base model. ordered_transitions (boolean): Convenience argument that calls add_ordered_transitions() at the end of initialization if set to True. ignore_invalid_triggers: when True, any calls to trigger methods that are not valid for the present state (e.g., calling an a_to_b() trigger when the current state is c) will be silently ignored rather than raising an invalid transition exception. before_state_change: A callable called on every change state before the transition happened. It receives the very same args as normal callbacks. after_state_change: A callable called on every change state after the transition happened. It receives the very same args as normal callbacks. name: If a name is set, it will be used as a prefix for logger output queued (boolean): When True, processes transitions sequentially. A trigger executed in a state callback function will be queued and executed later. Due to the nature of the queued processing, all transitions will _always_ return True since conditional checks cannot be conducted at queueing time. prepare_event: A callable called on for before possible transitions will be processed. It receives the very same args as normal callbacks. finalize_event: A callable called on for each triggered event after transitions have been processed. This is also called when a transition raises an exception. on_exception: A callable called when an event raises an exception. If not set, the exception will be raised instead. **kwargs additional arguments passed to next class in MRO. This can be ignored in most cases. """ # calling super in case `Machine` is used as a mix in # all keyword arguments should be consumed by now if this is not the case try: super(Machine, self).__init__(**kwargs) except TypeError as err: raise ValueError('Passing arguments {0} caused an inheritance error: {1}'.format(kwargs.keys(), err)) # initialize protected attributes first self._queued = queued self._transition_queue = deque() self._before_state_change = [] self._after_state_change = [] self._prepare_event = [] self._finalize_event = [] self._on_exception = [] self._initial = None self.states = OrderedDict() self.events = {} self.send_event = send_event self.auto_transitions = auto_transitions self.ignore_invalid_triggers = ignore_invalid_triggers self.prepare_event = prepare_event self.before_state_change = before_state_change self.after_state_change = after_state_change self.finalize_event = finalize_event self.on_exception = on_exception self.name = name + ": " if name is not None else "" self.model_attribute = model_attribute self.models = [] if states is not None: self.add_states(states) if initial is not None: self.initial = initial if transitions is not None: self.add_transitions(transitions) if ordered_transitions: self.add_ordered_transitions() if model: self.add_model(model) def add_model(self, model, initial=None): """ Register a model with the state machine, initializing triggers and callbacks. """ models = listify(model) if initial is None: if self.initial is None: raise ValueError("No initial state configured for machine, must specify when adding model.") initial = self.initial for mod in models: mod = self if mod is self.self_literal else mod if mod not in self.models: self._checked_assignment(mod, 'trigger', partial(self._get_trigger, mod)) for trigger in self.events: self._add_trigger_to_model(trigger, mod) for state in self.states.values(): self._add_model_to_state(state, mod) self.set_state(initial, model=mod) self.models.append(mod) def remove_model(self, model): """ Remove a model from the state machine. The model will still contain all previously added triggers and callbacks, but will not receive updates when states or transitions are added to the Machine. If an event queue is used, all queued events of that model will be removed.""" models = listify(model) for mod in models: self.models.remove(mod) if len(self._transition_queue) > 0: # the first element of the list is currently executed. Keeping it for further Machine._process(ing) self._transition_queue = deque( [self._transition_queue[0]] + [e for e in self._transition_queue if e.args[0].model not in models]) @classmethod def _create_transition(cls, *args, **kwargs): return cls.transition_cls(*args, **kwargs) @classmethod def _create_event(cls, *args, **kwargs): return cls.event_cls(*args, **kwargs) @classmethod def _create_state(cls, *args, **kwargs): return cls.state_cls(*args, **kwargs) @property def initial(self): """ Return the initial state. """ return self._initial @initial.setter def initial(self, value): if isinstance(value, State): if value.name not in self.states: self.add_states(value) else: _ = self._has_state(value, raise_error=True) self._initial = value.name else: state_name = value.name if isinstance(value, Enum) else value if state_name not in self.states: self.add_states(state_name) self._initial = state_name @property def has_queue(self): """ Return boolean indicating if machine has queue or not """ return self._queued @property def model(self): """ List of models attached to the machine. For backwards compatibility, the property will return the model instance itself instead of the underlying list if there is only one attached to the machine. """ if len(self.models) == 1: return self.models[0] return self.models @property def before_state_change(self): """Callbacks executed after condition checks but before transition is conducted. Callbacks will be executed BEFORE the custom callbacks assigned to the transition.""" return self._before_state_change # this should make sure that _before_state_change is always a list @before_state_change.setter def before_state_change(self, value): self._before_state_change = listify(value) @property def after_state_change(self): """Callbacks executed after the transition has been conducted. Callbacks will be executed AFTER the custom callbacks assigned to the transition.""" return self._after_state_change # this should make sure that _after_state_change is always a list @after_state_change.setter def after_state_change(self, value): self._after_state_change = listify(value) @property def prepare_event(self): """Callbacks executed when an event is triggered.""" return self._prepare_event # this should make sure that prepare_event is always a list @prepare_event.setter def prepare_event(self, value): self._prepare_event = listify(value) @property def finalize_event(self): """Callbacks will be executed after all transitions callbacks have been executed. Callbacks mentioned here will also be called if a transition or condition check raised an error.""" return self._finalize_event # this should make sure that finalize_event is always a list @finalize_event.setter def finalize_event(self, value): self._finalize_event = listify(value) @property def on_exception(self): """Callbacks will be executed when an Event raises an Exception.""" return self._on_exception # this should make sure that finalize_event is always a list @on_exception.setter def on_exception(self, value): self._on_exception = listify(value) def get_state(self, state): """ Return the State instance with the passed name. """ if isinstance(state, Enum): state = state.name if state not in self.states: raise ValueError("State '%s' is not a registered state." % state) return self.states[state] # In theory this function could be static. This however causes some issues related to inheritance and # pickling down the chain. def is_state(self, state, model): """ Check whether the current state matches the named state. This function is not called directly but assigned as partials to model instances (e.g. is_A -> partial(_is_state, 'A', model)). Args: state (str or Enum): name of the checked state or Enum model: model to be checked Returns: bool: Whether the model's current state is state. """ return getattr(model, self.model_attribute) == state def get_model_state(self, model): """ Get the state of a model Args: model (object): the stateful model Returns: State: The State object related to the model's state """ return self.get_state(getattr(model, self.model_attribute)) def set_state(self, state, model=None): """ Set the current state. Args: state (str or Enum or State): value of state to be set model (optional[object]): targeted model; if not set, all models will be set to 'state' """ if not isinstance(state, State): state = self.get_state(state) models = self.models if model is None else listify(model) for mod in models: setattr(mod, self.model_attribute, state.value) def add_state(self, states, on_enter=None, on_exit=None, ignore_invalid_triggers=None, **kwargs): """ Alias for add_states. """ self.add_states(states=states, on_enter=on_enter, on_exit=on_exit, ignore_invalid_triggers=ignore_invalid_triggers, **kwargs) def add_states(self, states, on_enter=None, on_exit=None, ignore_invalid_triggers=None, **kwargs): """ Add new state(s). Args: states (list, str, dict, Enum or State): a list, a State instance, the name of a new state, an enumeration (member) or a dict with keywords to pass on to the State initializer. If a list, each element can be a string, State or enumeration member. on_enter (str or list): callbacks to trigger when the state is entered. Only valid if first argument is string. on_exit (str or list): callbacks to trigger when the state is exited. Only valid if first argument is string. ignore_invalid_triggers: when True, any calls to trigger methods that are not valid for the present state (e.g., calling an a_to_b() trigger when the current state is c) will be silently ignored rather than raising an invalid transition exception. Note that this argument takes precedence over the same argument defined at the Machine level, and is in turn overridden by any ignore_invalid_triggers explicitly passed in an individual state's initialization arguments. **kwargs additional keyword arguments used by state mixins. """ ignore = ignore_invalid_triggers if ignore is None: ignore = self.ignore_invalid_triggers states = listify(states) for state in states: if isinstance(state, (string_types, Enum)): state = self._create_state( state, on_enter=on_enter, on_exit=on_exit, ignore_invalid_triggers=ignore, **kwargs) elif isinstance(state, dict): if 'ignore_invalid_triggers' not in state: state['ignore_invalid_triggers'] = ignore state = self._create_state(**state) self.states[state.name] = state for model in self.models: self._add_model_to_state(state, model) if self.auto_transitions: for a_state in self.states.keys(): # add all states as sources to auto transitions 'to_' with dest if a_state == state.name: if self.model_attribute == 'state': method_name = 'to_%s' % a_state else: method_name = 'to_%s_%s' % (self.model_attribute, a_state) self.add_transition(method_name, self.wildcard_all, a_state) # add auto transition with source to else: if self.model_attribute == 'state': method_name = 'to_%s' % a_state else: method_name = 'to_%s_%s' % (self.model_attribute, a_state) self.add_transition(method_name, state.name, a_state) def _add_model_to_state(self, state, model): # Add convenience function 'is_' (e.g. 'is_A') to the model. # When model_attribute has been customized, add 'is__' instead # to potentially support multiple states on one model (e.g. 'is_custom_state_A' and 'is_my_state_B'). func = partial(self.is_state, state.value, model) if self.model_attribute == 'state': method_name = 'is_%s' % state.name else: method_name = 'is_%s_%s' % (self.model_attribute, state.name) self._checked_assignment(model, method_name, func) # Add dynamic method callbacks (enter/exit) if there are existing bound methods in the model # except if they are already mentioned in 'on_enter/exit' of the defined state for callback in self.state_cls.dynamic_methods: method = "{0}_{1}".format(callback, state.name) if hasattr(model, method) and inspect.ismethod(getattr(model, method)) and \ method not in getattr(state, callback): state.add_callback(callback[3:], method) def _checked_assignment(self, model, name, func): if hasattr(model, name): _LOGGER.warning("%sModel already contains an attribute '%s'. Skip binding.", self.name, name) else: setattr(model, name, func) def _can_trigger(self, model, trigger, *args, **kwargs): evt = EventData(None, None, self, model, args, kwargs) state = self.get_model_state(model).name for trigger_name in self.get_triggers(state): if trigger_name != trigger: continue for transition in self.events[trigger_name].transitions[state]: try: _ = self.get_state(transition.dest) except ValueError: continue self.callbacks(self.prepare_event, evt) self.callbacks(transition.prepare, evt) if all(c.check(evt) for c in transition.conditions): return True return False def _add_may_transition_func_for_trigger(self, trigger, model): self._checked_assignment(model, "may_%s" % trigger, partial(self._can_trigger, model, trigger)) def _add_trigger_to_model(self, trigger, model): self._checked_assignment(model, trigger, partial(self.events[trigger].trigger, model)) self._add_may_transition_func_for_trigger(trigger, model) def _get_trigger(self, model, trigger_name, *args, **kwargs): """Convenience function added to the model to trigger events by name. Args: model (object): Model with assigned event trigger. trigger_name (str): Name of the trigger to be called. *args: Variable length argument list which is passed to the triggered event. **kwargs: Arbitrary keyword arguments which is passed to the triggered event. Returns: bool: True if a transitions has been conducted or the trigger event has been queued. """ try: event = self.events[trigger_name] except KeyError: state = self.get_model_state(model) ignore = state.ignore_invalid_triggers if state.ignore_invalid_triggers is not None \ else self.ignore_invalid_triggers if not ignore: raise AttributeError("Do not know event named '%s'." % trigger_name) return False return event.trigger(model, *args, **kwargs) def get_triggers(self, *args): """ Collects all triggers FROM certain states. Args: *args: Tuple of source states. Returns: list of transition/trigger names. """ names = {state.name if hasattr(state, 'name') else state for state in args} return [t for (t, ev) in self.events.items() if any(name in ev.transitions for name in names)] def add_transition(self, trigger, source, dest, conditions=None, unless=None, before=None, after=None, prepare=None, **kwargs): """ Create a new Transition instance and add it to the internal list. Args: trigger (str): The name of the method that will trigger the transition. This will be attached to the currently specified model (e.g., passing trigger='advance' will create a new advance() method in the model that triggers the transition.) source(str, Enum or list): The name of the source state--i.e., the state we are transitioning away from. This can be a single state, a list of states or an asterisk for all states. dest (str or Enum): The name of the destination State--i.e., the state we are transitioning into. This can be a single state or an equal sign to specify that the transition should be reflexive so that the destination will be the same as the source for every given source. If dest is None, this transition will be an internal transition (exit/enter callbacks won't be processed). conditions (str or list): Condition(s) that must pass in order for the transition to take place. Either a list providing the name of a callable, or a list of callables. For the transition to occur, ALL callables must return True. unless (str or list): Condition(s) that must return False in order for the transition to occur. Behaves just like conditions arg otherwise. before (str or list): Callables to call before the transition. after (str or list): Callables to call after the transition. prepare (str or list): Callables to call when the trigger is activated **kwargs: Additional arguments which can be passed to the created transition. This is useful if you plan to extend Machine.Transition and require more parameters. """ if trigger == self.model_attribute: raise ValueError("Trigger name cannot be same as model attribute name.") if trigger not in self.events: self.events[trigger] = self._create_event(trigger, self) for model in self.models: self._add_trigger_to_model(trigger, model) if source == self.wildcard_all: source = list(self.states.keys()) else: # states are checked lazily which means we will only raise exceptions when the passed state # is a State object because of potential confusion (see issue #155 for more details) source = [s.name if isinstance(s, State) and self._has_state(s, raise_error=True) or hasattr(s, 'name') else s for s in listify(source)] for state in source: if dest == self.wildcard_same: _dest = state elif dest is not None: if isinstance(dest, State): _ = self._has_state(dest, raise_error=True) _dest = dest.name if hasattr(dest, 'name') else dest else: _dest = None _trans = self._create_transition(state, _dest, conditions, unless, before, after, prepare, **kwargs) self.events[trigger].add_transition(_trans) def add_transitions(self, transitions): """ Add several transitions. Args: transitions (list): A list of transitions. """ for trans in listify(transitions): if isinstance(trans, list): self.add_transition(*trans) else: self.add_transition(**trans) def add_ordered_transitions(self, states=None, trigger='next_state', loop=True, loop_includes_initial=True, conditions=None, unless=None, before=None, after=None, prepare=None, **kwargs): """ Add a set of transitions that move linearly from state to state. Args: states (list): A list of state names defining the order of the transitions. E.g., ['A', 'B', 'C'] will generate transitions for A --> B, B --> C, and C --> A (if loop is True). If states is None, all states in the current instance will be used. trigger (str): The name of the trigger method that advances to the next state in the sequence. loop (boolean): Whether to add a transition from the last state to the first state. loop_includes_initial (boolean): If no initial state was defined in the machine, setting this to True will cause the _initial state placeholder to be included in the added transitions. This argument has no effect if the states argument is passed without the initial state included. conditions (str or list): Condition(s) that must pass in order for the transition to take place. Either a list providing the name of a callable, or a list of callables. For the transition to occur, ALL callables must return True. unless (str or list): Condition(s) that must return False in order for the transition to occur. Behaves just like conditions arg otherwise. before (str or list): Callables to call before the transition. after (str or list): Callables to call after the transition. prepare (str or list): Callables to call when the trigger is activated **kwargs: Additional arguments which can be passed to the created transition. This is useful if you plan to extend Machine.Transition and require more parameters. """ if states is None: states = list(self.states.keys()) # need to listify for Python3 len_transitions = len(states) if len_transitions < 2: raise ValueError("Can't create ordered transitions on a Machine " "with fewer than 2 states.") if not loop: len_transitions -= 1 # ensure all args are the proper length conditions = _prep_ordered_arg(len_transitions, conditions) unless = _prep_ordered_arg(len_transitions, unless) before = _prep_ordered_arg(len_transitions, before) after = _prep_ordered_arg(len_transitions, after) prepare = _prep_ordered_arg(len_transitions, prepare) # reorder list so that the initial state is actually the first one try: idx = states.index(self._initial) states = states[idx:] + states[:idx] first_in_loop = states[0 if loop_includes_initial else 1] except ValueError: # since initial is not part of states it shouldn't be part of the loop either first_in_loop = states[0] for i in range(0, len(states) - 1): self.add_transition(trigger, states[i], states[i + 1], conditions=conditions[i], unless=unless[i], before=before[i], after=after[i], prepare=prepare[i], **kwargs) if loop: self.add_transition(trigger, states[-1], # omit initial if not loop_includes_initial first_in_loop, conditions=conditions[-1], unless=unless[-1], before=before[-1], after=after[-1], prepare=prepare[-1], **kwargs) def get_transitions(self, trigger="", source="*", dest="*"): """ Return the transitions from the Machine. Args: trigger (str): Trigger name of the transition. source (str, Enum or State): Limits list to transitions from a certain state. dest (str, Enum or State): Limits list to transitions to a certain state. """ if trigger: try: events = (self.events[trigger], ) except KeyError: return [] else: events = self.events.values() transitions = [] for event in events: transitions.extend( itertools.chain.from_iterable(event.transitions.values())) target_source = source.name if hasattr(source, 'name') else source if source != "*" else "" target_dest = dest.name if hasattr(dest, 'name') else dest if dest != "*" else "" return [transition for transition in transitions if (transition.source, transition.dest) == (target_source or transition.source, target_dest or transition.dest)] def remove_transition(self, trigger, source="*", dest="*"): """ Removes a transition from the Machine and all models. Args: trigger (str): Trigger name of the transition. source (str, Enum or State): Limits removal to transitions from a certain state. dest (str, Enum or State): Limits removal to transitions to a certain state. """ source = listify(source) if source != "*" else source dest = listify(dest) if dest != "*" else dest # outer comprehension, keeps events if inner comprehension returns lists with length > 0 tmp = {key: value for key, value in {k: [t for t in v # keep entries if source should not be filtered; same for dest. if (source != "*" and t.source not in source) or (dest != "*" and t.dest not in dest)] # }.items() takes the result of the inner comprehension and uses it # for the outer comprehension (see first line of comment) for k, v in self.events[trigger].transitions.items()}.items() if len(value) > 0} # convert dict back to defaultdict in case tmp is not empty if tmp: self.events[trigger].transitions = defaultdict(list, **tmp) # if no transition is left remove the trigger from the machine and all models else: for model in self.models: delattr(model, trigger) del self.events[trigger] def dispatch(self, trigger, *args, **kwargs): """ Trigger an event on all models assigned to the machine. Args: trigger (str): Event name *args (list): List of arguments passed to the event trigger **kwargs (dict): Dictionary of keyword arguments passed to the event trigger Returns: bool The truth value of all triggers combined with AND """ return all(getattr(model, trigger)(*args, **kwargs) for model in self.models) def callbacks(self, funcs, event_data): """ Triggers a list of callbacks """ for func in funcs: self.callback(func, event_data) _LOGGER.info("%sExecuted callback '%s'", self.name, func) def callback(self, func, event_data): """ Trigger a callback function with passed event_data parameters. In case func is a string, the callable will be resolved from the passed model in event_data. This function is not intended to be called directly but through state and transition callback definitions. Args: func (str or callable): The callback function. 1. First, if the func is callable, just call it 2. Second, we try to import string assuming it is a path to a func 3. Fallback to a model attribute event_data (EventData): An EventData instance to pass to the callback (if event sending is enabled) or to extract arguments from (if event sending is disabled). """ func = self.resolve_callable(func, event_data) if self.send_event: func(event_data) else: func(*event_data.args, **event_data.kwargs) @staticmethod def resolve_callable(func, event_data): """ Converts a model's property name, method name or a path to a callable into a callable. If func is not a string it will be returned unaltered. Args: func (str or callable): Property name, method name or a path to a callable event_data (EventData): Currently processed event Returns: callable function resolved from string or func """ if isinstance(func, string_types): try: func = getattr(event_data.model, func) if not callable(func): # if a property or some other not callable attribute was passed def func_wrapper(*_, **__): # properties cannot process parameters return func return func_wrapper except AttributeError: try: module_name, func_name = func.rsplit('.', 1) module = __import__(module_name) for submodule_name in module_name.split('.')[1:]: module = getattr(module, submodule_name) func = getattr(module, func_name) except (ImportError, AttributeError, ValueError): raise AttributeError("Callable with name '%s' could neither be retrieved from the passed " "model nor imported from a module." % func) return func def _has_state(self, state, raise_error=False): found = state in self.states.values() if not found and raise_error: msg = 'State %s has not been added to the machine' % (state.name if hasattr(state, 'name') else state) raise ValueError(msg) return found def _process(self, trigger): # default processing if not self.has_queue: if not self._transition_queue: # if trigger raises an Error, it has to be handled by the Machine.process caller return trigger() raise MachineError("Attempt to process events synchronously while transition queue is not empty!") # process queued events self._transition_queue.append(trigger) # another entry in the queue implies a running transition; skip immediate execution if len(self._transition_queue) > 1: return True # execute as long as transition queue is not empty while self._transition_queue: try: self._transition_queue[0]() self._transition_queue.popleft() except Exception: # if a transition raises an exception, clear queue and delegate exception handling self._transition_queue.clear() raise return True def _identify_callback(self, name): # Does the prefix match a known callback? for callback in itertools.chain(self.state_cls.dynamic_methods, self.transition_cls.dynamic_methods): if name.startswith(callback): callback_type = callback break else: return None, None # Extract the target by cutting the string after the type and separator target = name[len(callback_type) + len(self.separator):] # Make sure there is actually a target to avoid index error and enforce _ as a separator if target == '' or name[len(callback_type)] != self.separator: return None, None return callback_type, target def __getattr__(self, name): # Machine.__dict__ does not contain double underscore variables. # Class variables will be mangled. if name.startswith('__'): raise AttributeError("'{}' does not exist on " .format(name, id(self))) # Could be a callback callback_type, target = self._identify_callback(name) if callback_type is not None: if callback_type in self.transition_cls.dynamic_methods: if target not in self.events: raise AttributeError("event '{}' is not registered on " .format(target, id(self))) return partial(self.events[target].add_callback, callback_type) if callback_type in self.state_cls.dynamic_methods: state = self.get_state(target) return partial(state.add_callback, callback_type[3:]) try: return self.__getattribute__(name) except AttributeError: # Nothing matched raise AttributeError("'{}' does not exist on ".format(name, id(self))) class MachineError(Exception): """ MachineError is used for issues related to state transitions and current states. For instance, it is raised for invalid transitions or machine configuration issues. """ def __init__(self, value): super(MachineError, self).__init__(value) self.value = value def __str__(self): return repr(self.value) transitions-0.9.0/transitions/__init__.pyi0000644000232200023220000000041014304350474021301 0ustar debalancedebalancefrom .core import Event as Event, EventData as EventData, Machine as Machine, MachineError as MachineError, State as State, Transition as Transition from .version import __version__ as __version__ __copyright__: str __license__: str __summary__: str __uri__: str transitions-0.9.0/transitions/extensions/0000755000232200023220000000000014304350474021223 5ustar debalancedebalancetransitions-0.9.0/transitions/extensions/diagrams_graphviz.pyi0000644000232200023220000000500014304350474025442 0ustar debalancedebalancefrom ..core import State, ModelState from .diagrams import GraphMachine from .diagrams_base import BaseGraph from logging import Logger from typing import Type, Optional, Dict, List, Union, IO, DefaultDict, Any try: from graphviz import Digraph from graphviz.dot import SubgraphContext except ImportError: class Digraph: # type: ignore pass class SubgraphContext: # type: ignore pass _LOGGER: Logger class Graph(BaseGraph): custom_styles: Dict[str, DefaultDict] def __init__(self, machine: Type[GraphMachine]) -> None: ... def set_previous_transition(self, src: str, dst: str) -> None: ... def set_node_style(self, state: ModelState, style: str) -> None: ... def reset_styling(self) -> None: ... def _add_nodes(self, states: List[Dict[str, str]], # type: ignore[no-any-unimported] container: Union[Digraph, SubgraphContext]) -> None: ... def _add_edges(self, transitions: List[Dict[str, str]], # type: ignore[no-any-unimported] container: Union[Digraph, SubgraphContext]) -> None: ... def generate(self) -> None: ... def get_graph(self, title: Optional[str] = ..., # type: ignore[no-any-unimported] roi_state: Optional[str] = ...) -> Digraph: ... def draw(self, filename: Optional[Union[str, IO]], format:Optional[str] = ..., prog: Optional[str] = ..., args:str = ...) -> Optional[str]: ... class NestedGraph(Graph): _cluster_states: List[str] def __init__(self, *args: List, **kwargs: Dict[str, Any]) -> None: ... def set_previous_transition(self, src: str, dst: str) -> None: ... def _add_nodes(self, states: List[Dict[str, str]], # type: ignore[no-any-unimported] container: Union[Digraph, SubgraphContext]) -> None: ... def _add_nested_nodes(self, # type: ignore[no-any-unimported] states: List[Dict[str, Union[str, List[Dict[str, str]]]]], container: Union[Digraph, SubgraphContext], prefix: str, default_style: str) -> None: ... def _add_edges(self, transitions: List[Dict[str, str]], # type: ignore[no-any-unimported] container: Union[Digraph, SubgraphContext]) -> None: ... def _create_edge_attr(self, src: str, dst: str, transition: Dict[str, str]) -> Dict[str, Any]: ... def _filter_states(states: List[Dict[str, str]], state_names: List[str], state_cls: Type[State], prefix: Optional[List[str]] = ...) -> List[Dict[str, str]]: ... transitions-0.9.0/transitions/extensions/diagrams.py0000644000232200023220000003057314304350474023374 0ustar debalancedebalance""" transitions.extensions.diagrams ------------------------------- This module contains machine and transition definitions for generating diagrams from machine instances. It uses Graphviz either directly with the help of pygraphviz (https://pygraphviz.github.io/) or loosely coupled via dot graphs with the graphviz module (https://github.com/xflr6/graphviz). Pygraphviz accesses libgraphviz directly and also features more functionality considering graph manipulation. However, especially on Windows, compiling the required extension modules can be tricky. Furthermore, some pygraphviz issues are platform-dependent as well. Graphviz generates a dot graph and calls the `dot` executable to generate diagrams and thus is commonly easier to set up. Make sure that the `dot` executable is in your PATH. """ import logging from functools import partial from transitions import Transition from ..core import listify from .markup import MarkupMachine, HierarchicalMarkupMachine from .nesting import NestedTransition _LOGGER = logging.getLogger(__name__) _LOGGER.addHandler(logging.NullHandler()) class TransitionGraphSupport(Transition): """ Transition used in conjunction with (Nested)Graphs to update graphs whenever a transition is conducted. """ def __init__(self, *args, **kwargs): label = kwargs.pop("label", None) super(TransitionGraphSupport, self).__init__(*args, **kwargs) if label: self.label = label def _change_state(self, event_data): graph = event_data.machine.model_graphs[id(event_data.model)] graph.reset_styling() graph.set_previous_transition(self.source, self.dest) super(TransitionGraphSupport, self)._change_state( event_data ) # pylint: disable=protected-access graph = event_data.machine.model_graphs[ id(event_data.model) ] # graph might have changed during change_event graph.set_node_style(getattr(event_data.model, event_data.machine.model_attribute), "active") class GraphMachine(MarkupMachine): """ Extends transitions.core.Machine with graph support. Is also used as a mixin for HierarchicalMachine. Attributes: _pickle_blacklist (list): Objects that should not/do not need to be pickled. transition_cls (cls): TransitionGraphSupport """ _pickle_blacklist = ["model_graphs"] transition_cls = TransitionGraphSupport machine_attributes = { "directed": "true", "strict": "false", "rankdir": "LR", } hierarchical_machine_attributes = { "rankdir": "TB", "rank": "source", "nodesep": "1.5", "compound": "true", } style_attributes = { "node": { "": {}, "default": { "style": "rounded, filled", "shape": "rectangle", "fillcolor": "white", "color": "black", "peripheries": "1", }, "inactive": {"fillcolor": "white", "color": "black", "peripheries": "1"}, "parallel": { "shape": "rectangle", "color": "black", "fillcolor": "white", "style": "dashed, rounded, filled", "peripheries": "1", }, "active": {"color": "red", "fillcolor": "darksalmon", "peripheries": "2"}, "previous": {"color": "blue", "fillcolor": "azure2", "peripheries": "1"}, }, "edge": {"": {}, "default": {"color": "black"}, "previous": {"color": "blue"}}, "graph": { "": {}, "default": {"color": "black", "fillcolor": "white", "style": "solid"}, "previous": {"color": "blue", "fillcolor": "azure2", "style": "filled"}, "active": {"color": "red", "fillcolor": "darksalmon", "style": "filled"}, "parallel": {"color": "black", "fillcolor": "white", "style": "dotted"}, }, } # model_graphs cannot be pickled. Omit them. def __getstate__(self): # self.pkl_graphs = [(g.markup, g.custom_styles) for g in self.model_graphs] return {k: v for k, v in self.__dict__.items() if k not in self._pickle_blacklist} def __setstate__(self, state): self.__dict__.update(state) self.model_graphs = {} # reinitialize new model_graphs for model in self.models: try: _ = self._get_graph(model) except AttributeError as err: _LOGGER.warning("Graph for model could not be initialized after pickling: %s", err) def __init__(self, model=MarkupMachine.self_literal, states=None, initial='initial', transitions=None, send_event=False, auto_transitions=True, ordered_transitions=False, ignore_invalid_triggers=None, before_state_change=None, after_state_change=None, name=None, queued=False, prepare_event=None, finalize_event=None, model_attribute='state', on_exception=None, title="State Machine", show_conditions=False, show_state_attributes=False, show_auto_transitions=False, use_pygraphviz=True, **kwargs): # remove graph config from keywords self.title = title self.show_conditions = show_conditions self.show_state_attributes = show_state_attributes # in MarkupMachine this switch is called 'with_auto_transitions' # keep 'auto_transitions_markup' for backwards compatibility kwargs["auto_transitions_markup"] = show_auto_transitions self.model_graphs = {} self.graph_cls = self._init_graphviz_engine(use_pygraphviz) _LOGGER.debug("Using graph engine %s", self.graph_cls) super(GraphMachine, self).__init__( model=model, states=states, initial=initial, transitions=transitions, send_event=send_event, auto_transitions=auto_transitions, ordered_transitions=ordered_transitions, ignore_invalid_triggers=ignore_invalid_triggers, before_state_change=before_state_change, after_state_change=after_state_change, name=name, queued=queued, prepare_event=prepare_event, finalize_event=finalize_event, model_attribute=model_attribute, on_exception=on_exception, **kwargs ) # for backwards compatibility assign get_combined_graph to get_graph # if model is not the machine if not hasattr(self, "get_graph"): setattr(self, "get_graph", self.get_combined_graph) def _init_graphviz_engine(self, use_pygraphviz): """ Imports diagrams (py)graphviz backend based on machine configuration """ if use_pygraphviz: try: # state class needs to have a separator and machine needs to be a context manager if hasattr(self.state_cls, "separator") and hasattr(self, "__enter__"): from .diagrams_pygraphviz import ( # pylint: disable=import-outside-toplevel NestedGraph as Graph, pgv ) self.machine_attributes.update(self.hierarchical_machine_attributes) else: from .diagrams_pygraphviz import ( # pylint: disable=import-outside-toplevel Graph, pgv ) if pgv is None: raise ImportError return Graph except ImportError: _LOGGER.warning("Could not import pygraphviz backend. Will try graphviz backend next") if hasattr(self.state_cls, "separator") and hasattr(self, "__enter__"): from .diagrams_graphviz import ( # pylint: disable=import-outside-toplevel NestedGraph as Graph, ) self.machine_attributes.update(self.hierarchical_machine_attributes) else: from .diagrams_graphviz import Graph # pylint: disable=import-outside-toplevel return Graph def _get_graph(self, model, title=None, force_new=False, show_roi=False): """ This method will be bound as a partial to models and return a graph object to be drawn or manipulated. Args: model (object): The model that `_get_graph` was bound to. This parameter will be set by `GraphMachine`. title (str): The title of the created graph. force_new (bool): Whether a new graph should be generated even if another graph already exists. This should be true whenever the model's state or machine's transitions/states/events have changed. show_roi (bool): If set to True, only render states that are active and/or can be reached from the current state. Returns: AGraph (pygraphviz) or Digraph (graphviz) graph instance that can be drawn. """ if force_new: graph = self.graph_cls(self) self.model_graphs[id(model)] = graph try: graph.set_node_style(getattr(model, self.model_attribute), "active") except AttributeError: _LOGGER.info("Could not set active state of diagram") try: graph = self.model_graphs[id(model)] except KeyError: _ = self._get_graph(model, title, force_new=True) graph = self.model_graphs[id(model)] return graph.get_graph(title=title, roi_state=getattr(model, self.model_attribute) if show_roi else None) def get_combined_graph(self, title=None, force_new=False, show_roi=False): """ This method is currently equivalent to 'get_graph' of the first machine's model. In future releases of transitions, this function will return a combined graph with active states of all models. Args: title (str): Title of the resulting graph. force_new (bool): Whether a new graph should be generated even if another graph already exists. This should be true whenever the model's state or machine's transitions/states/events have changed. show_roi (bool): If set to True, only render states that are active and/or can be reached from the current state. Returns: AGraph (pygraphviz) or Digraph (graphviz) graph instance that can be drawn. """ _LOGGER.info( "Returning graph of the first model. In future releases, this " "method will return a combined graph of all models." ) return self._get_graph(self.models[0], title, force_new, show_roi) def add_model(self, model, initial=None): models = listify(model) super(GraphMachine, self).add_model(models, initial) for mod in models: mod = self if mod is self.self_literal else mod if hasattr(mod, "get_graph"): raise AttributeError( "Model already has a get_graph attribute. Graph retrieval cannot be bound." ) setattr(mod, "get_graph", partial(self._get_graph, mod)) _ = mod.get_graph(title=self.title, force_new=True) # initialises graph def add_states( self, states, on_enter=None, on_exit=None, ignore_invalid_triggers=None, **kwargs ): """ Calls the base method and regenerates all models's graphs. """ super(GraphMachine, self).add_states( states, on_enter=on_enter, on_exit=on_exit, ignore_invalid_triggers=ignore_invalid_triggers, **kwargs ) for model in self.models: model.get_graph(force_new=True) def add_transition(self, trigger, source, dest, conditions=None, unless=None, before=None, after=None, prepare=None, **kwargs): """ Calls the base method and regenerates all models's graphs. """ super(GraphMachine, self).add_transition(trigger, source, dest, conditions=conditions, unless=unless, before=before, after=after, prepare=prepare, **kwargs) for model in self.models: model.get_graph(force_new=True) class NestedGraphTransition(TransitionGraphSupport, NestedTransition): """ A transition type to be used with (subclasses of) `HierarchicalGraphMachine` and `LockedHierarchicalGraphMachine`. """ class HierarchicalGraphMachine(GraphMachine, HierarchicalMarkupMachine): """ A hierarchical state machine with graph support. """ transition_cls = NestedGraphTransition transitions-0.9.0/transitions/extensions/diagrams_pygraphviz.pyi0000644000232200023220000000362314304350474026024 0ustar debalancedebalancefrom typing import Any, List, Dict, Union, Optional from logging import Logger from .diagrams_base import BaseGraph from ..core import ModelState try: from pygraphviz import AGraph except ImportError: class AGraph: # type: ignore style_attributes: Dict[str, Union[str, Dict[str, Union[str, Dict[str, str]]]]] _LOGGER: Logger class Graph(BaseGraph): fsm_graph: AGraph # type: ignore[no-any-unimported] def _add_nodes(self, states: List[Dict[str, str]], # type: ignore[no-any-unimported] container: AGraph) -> None: ... def _add_edges(self, transitions: List[Dict[str, str]], # type: ignore[no-any-unimported] container: AGraph) -> None: ... def generate(self) -> None: ... def get_graph(self, title: Optional[str] = ..., # type: ignore[no-any-unimported] roi_state: Optional[str] = ...) -> AGraph: ... def set_node_style(self, state: ModelState, style: str) -> None: ... def set_previous_transition(self, src: str, dst: str) -> None: ... def reset_styling(self) -> None: ... class NestedGraph(Graph): seen_transitions: Any def __init__(self, *args: List, **kwargs: Dict[str, Any]) -> None: ... def _add_nodes(self, # type: ignore[override, no-any-unimported] states: List[Dict[str, Union[str, List[Dict[str, str]]]]], container: AGraph, prefix: str = ..., default_style: str = ...) -> None: ... def _add_edges(self, transitions: List[Dict[str, str]], # type: ignore[no-any-unimported] container: AGraph) -> None: ... def set_node_style(self, state: ModelState, style: str) -> None: ... def set_previous_transition(self, src: str, dst: str) -> None: ... def _get_subgraph(graph: AGraph, name: str) -> Optional[AGraph]: ... # type: ignore[no-any-unimported] def _copy_agraph(graph: AGraph) -> AGraph: ... # type: ignore[no-any-unimported] transitions-0.9.0/transitions/extensions/factory.py0000644000232200023220000001044214304350474023245 0ustar debalancedebalance""" transitions.extensions.factory ------------------------------ This module contains the definitions of classes which combine the functionality of transitions' extension modules. These classes can be accessed by names as well as through a static convenience factory object. """ from functools import partial from ..core import Machine, Transition from .nesting import HierarchicalMachine, NestedEvent, NestedTransition from .locking import LockedMachine from .diagrams import GraphMachine, NestedGraphTransition, HierarchicalGraphMachine try: from transitions.extensions.asyncio import AsyncMachine, AsyncTransition from transitions.extensions.asyncio import HierarchicalAsyncMachine, NestedAsyncTransition except (ImportError, SyntaxError): class AsyncMachine(Machine): # type: ignore """ A mock of AsyncMachine for Python 3.6 and earlier. """ class AsyncTransition(Transition): # type: ignore """ A mock of AsyncTransition for Python 3.6 and earlier. """ class HierarchicalAsyncMachine(HierarchicalMachine): # type: ignore """ A mock of HierarchicalAsyncMachine for Python 3.6 and earlier. """ class NestedAsyncTransition(NestedTransition): # type: ignore """ A mock of NestedAsyncTransition for Python 3.6 and earlier. """ class MachineFactory(object): """ Convenience factory for machine class retrieval. """ # get one of the predefined classes which fulfill the criteria @staticmethod def get_predefined(graph=False, nested=False, locked=False, asyncio=False): """ A function to retrieve machine classes by required functionality. Args: graph (bool): Whether the returned class should contain graph support. nested: Whether the returned machine class should support nested states. locked: Whether the returned class should facilitate locks for threadsafety. Returns (class): A machine class with the specified features. """ try: return _CLASS_MAP[(graph, nested, locked, asyncio)] except KeyError: raise ValueError("Feature combination not (yet) supported") # from KeyError class LockedHierarchicalMachine(LockedMachine, HierarchicalMachine): """ A threadsafe hierarchical machine. """ event_cls = NestedEvent def _get_qualified_state_name(self, state): return self.get_global_name(state.name) class LockedGraphMachine(GraphMachine, LockedMachine): """ A threadsafe machine with graph support. """ @staticmethod def format_references(func): if isinstance(func, partial) and func.func.__name__.startswith('_locked_method'): func = func.args[0] return GraphMachine.format_references(func) class LockedHierarchicalGraphMachine(GraphMachine, LockedHierarchicalMachine): """ A threadsafe hierarchical machine with graph support. """ transition_cls = NestedGraphTransition event_cls = NestedEvent @staticmethod def format_references(func): if isinstance(func, partial) and func.func.__name__.startswith('_locked_method'): func = func.args[0] return GraphMachine.format_references(func) class AsyncGraphMachine(GraphMachine, AsyncMachine): """ A machine that supports asynchronous event/callback processing with Graphviz support. """ transition_cls = AsyncTransition class HierarchicalAsyncGraphMachine(GraphMachine, HierarchicalAsyncMachine): """ A hierarchical machine that supports asynchronous event/callback processing with Graphviz support. """ transition_cls = NestedAsyncTransition # 4d tuple (graph, nested, locked, async) _CLASS_MAP = { (False, False, False, False): Machine, (False, False, True, False): LockedMachine, (False, True, False, False): HierarchicalMachine, (False, True, True, False): LockedHierarchicalMachine, (True, False, False, False): GraphMachine, (True, False, True, False): LockedGraphMachine, (True, True, False, False): HierarchicalGraphMachine, (True, True, True, False): LockedHierarchicalGraphMachine, (False, False, False, True): AsyncMachine, (True, False, False, True): AsyncGraphMachine, (False, True, False, True): HierarchicalAsyncMachine, (True, True, False, True): HierarchicalAsyncGraphMachine } transitions-0.9.0/transitions/extensions/__init__.py0000644000232200023220000000146014304350474023335 0ustar debalancedebalance""" transitions.extensions ---------------------- Additional functionality such as hierarchical (nested) machine support, Graphviz-based diagram creation and threadsafe execution of machine methods. Additionally, combinations of all those features are possible and made easier to access with a convenience factory. """ from .diagrams import GraphMachine, HierarchicalGraphMachine from .nesting import HierarchicalMachine from .locking import LockedMachine from .factory import MachineFactory, LockedHierarchicalGraphMachine from .factory import LockedHierarchicalMachine, LockedGraphMachine try: # only available for Python 3 from .asyncio import AsyncMachine, HierarchicalAsyncMachine from .factory import AsyncGraphMachine, HierarchicalAsyncGraphMachine except (ImportError, SyntaxError): pass transitions-0.9.0/transitions/extensions/diagrams_base.py0000644000232200023220000001330014304350474024353 0ustar debalancedebalance""" transitions.extensions.diagrams_base ------------------------------------ The class BaseGraph implements the common ground for Graphviz backends. """ import copy import abc import logging import six _LOGGER = logging.getLogger(__name__) _LOGGER.addHandler(logging.NullHandler()) @six.add_metaclass(abc.ABCMeta) class BaseGraph(object): """ Provides the common foundation for graphs generated either with pygraphviz or graphviz. This abstract class should not be instantiated directly. Use .(py)graphviz.(Nested)Graph instead. Attributes: machine (GraphMachine): The associated GraphMachine fsm_graph (object): The AGraph-like object that holds the graphviz information """ def __init__(self, machine): self.machine = machine self.fsm_graph = None self.generate() @abc.abstractmethod def generate(self): """ Triggers the generation of a graph. """ @abc.abstractmethod def set_previous_transition(self, src, dst): """ Sets the styling of an edge to 'previous' Args: src (str): Name of the source state dst (str): Name of the destination """ @abc.abstractmethod def reset_styling(self): """ Resets the styling of the currently generated graph. """ @abc.abstractmethod def set_node_style(self, state, style): """ Sets the style of nodes associated with a model state Args: state (str, Enum or list): Name of the state(s) or Enum(s) style (str): Name of the style """ @abc.abstractmethod def get_graph(self, title=None, roi_state=None): """ Returns a graph object. Args: title (str): Title of the generated graph roi_state (State): If not None, the returned graph will only contain edges and states connected to it. Returns: A graph instance with a `draw` that allows to render the graph. """ def _convert_state_attributes(self, state): label = state.get("label", state["name"]) if self.machine.show_state_attributes: if "tags" in state: label += " [" + ", ".join(state["tags"]) + "]" if "on_enter" in state: label += r"\l- enter:\l + " + r"\l + ".join(state["on_enter"]) if "on_exit" in state: label += r"\l- exit:\l + " + r"\l + ".join(state["on_exit"]) if "timeout" in state: label += r'\l- timeout(' + state['timeout'] + 's) -> (' + ', '.join(state['on_timeout']) + ')' # end each label with a left-aligned newline return label + r"\l" def _get_state_names(self, state): if isinstance(state, (list, tuple, set)): for res in state: for inner in self._get_state_names(res): yield inner else: yield self.machine.state_cls.separator.join(self.machine._get_enum_path(state))\ if hasattr(state, "name") else state def _transition_label(self, tran): edge_label = tran.get("label", tran["trigger"]) if "dest" not in tran: edge_label += " [internal]" if self.machine.show_conditions and any(prop in tran for prop in ["conditions", "unless"]): edge_label = "{edge_label} [{conditions}]".format( edge_label=edge_label, conditions=" & ".join( tran.get("conditions", []) + ["!" + u for u in tran.get("unless", [])] ), ) return edge_label def _get_global_name(self, path): if path: state = path.pop(0) with self.machine(state): return self._get_global_name(path) else: return self.machine.get_global_name() def _get_elements(self): states = [] transitions = [] try: markup = self.machine.get_markup_config() queue = [([], markup)] while queue: prefix, scope = queue.pop(0) for transition in scope.get("transitions", []): if prefix: tran = copy.copy(transition) tran["source"] = self.machine.state_cls.separator.join( prefix + [tran["source"]] ) if "dest" in tran: # don't do this for internal transitions tran["dest"] = self.machine.state_cls.separator.join( prefix + [tran["dest"]] ) else: tran = transition transitions.append(tran) for state in scope.get("children", []) + scope.get("states", []): if not prefix: sta = state states.append(sta) ini = state.get("initial", []) if not isinstance(ini, list): ini = ini.name if hasattr(ini, "name") else ini tran = dict( trigger="", source=self.machine.state_cls.separator.join(prefix + [state["name"]]) + "_anchor", dest=self.machine.state_cls.separator.join( prefix + [state["name"], ini] ), ) transitions.append(tran) if state.get("children", []): queue.append((prefix + [state["name"]], state)) except KeyError: _LOGGER.error("Graph creation incomplete!") return states, transitions transitions-0.9.0/transitions/extensions/diagrams.pyi0000644000232200023220000000763714304350474023552 0ustar debalancedebalancefrom transitions.core import ( StateIdentifier, StateConfig, CallbacksArg, Transition, EventData, TransitionConfig, ModelParameter ) from transitions.extensions.nesting import NestedTransition from transitions.extensions.diagrams_base import BaseGraph, GraphModelProtocol, GraphProtocol from transitions.extensions.markup import MarkupMachine, HierarchicalMarkupMachine from logging import Logger from typing import Any, Literal, Sequence, Type, List, Dict, Union, Optional, Generator from enum import Enum _LOGGER: Logger # mypy does not support cyclic definitions (yet) # thus we cannot use Dict[str, 'GraphvizParameters'] and have to fall back to Any GraphvizParameters = Dict[str, Union[str, Dict[str, Any]]] class TransitionGraphSupport(Transition): label: str def __init__(self, *args: List, **kwargs: Dict[str, Any]) -> None: ... def _change_state(self, event_data: EventData) -> None: ... class GraphMachine(MarkupMachine): _pickle_blacklist: List[str] transition_cls: Type[TransitionGraphSupport] machine_attributes: Dict[str, str] hierarchical_machine_attributes:Dict [str, str] style_attributes: Dict[str, Union[str, Dict[str, Union[str, Dict[str, Any]]]]] model_graphs: Dict[int, BaseGraph] title: str show_conditions: bool show_state_attributes: bool graph_cls: Type[BaseGraph] models: List[GraphModelProtocol] def __getstate__(self) -> Dict[str, Any]: ... def __setstate__(self, state: Dict[str, Any]) -> None: ... def __init__(self, model: Optional[ModelParameter]=..., states: Optional[Union[Sequence[StateConfig], Type[Enum]]] = ..., initial: Optional[StateIdentifier] = ..., transitions: Optional[Union[TransitionConfig, List[TransitionConfig]]] = ..., send_event: bool = ..., auto_transitions: bool = ..., ordered_transitions: bool = ..., ignore_invalid_triggers: Optional[bool] = ..., before_state_change: CallbacksArg = ..., after_state_change: CallbacksArg = ..., name: str = ..., queued: bool = ..., prepare_event: CallbacksArg = ..., finalize_event: CallbacksArg = ..., model_attribute: str = ..., on_exception: CallbacksArg = ..., title: str = ..., show_conditions: bool = ..., show_state_attributes: bool = ..., show_auto_transitions: bool = ..., use_pygraphviz: bool = ..., **kwargs: Dict[str, Any]) -> None: ... def _init_graphviz_engine(self, use_pygraphviz: bool) -> Type[BaseGraph]: ... def _get_graph(self, model: GraphModelProtocol, title: Optional[str] = ..., force_new: bool = ..., show_roi: bool = ...) -> GraphProtocol: ... def get_combined_graph(self, title: Optional[str] = ..., force_new: bool = ..., show_roi: bool = ...) -> GraphProtocol: ... def add_model(self, model: Union[Union[Literal['self'], object], List[Union[Literal['self'], object]]], initial: Optional[StateIdentifier] = ...) -> None: ... def add_states(self, states: Union[Sequence[StateConfig], StateConfig], on_enter: CallbacksArg = ..., on_exit: CallbacksArg = ..., ignore_invalid_triggers: Optional[bool] = ..., **kwargs: Dict[str, Any]) -> None: ... def add_transition(self, trigger: str, source: Union[StateIdentifier, List[StateIdentifier]], dest: Optional[StateIdentifier] = ..., conditions: CallbacksArg = ..., unless: CallbacksArg = ..., before: CallbacksArg = ..., after: CallbacksArg = ..., prepare: CallbacksArg = ..., **kwargs: Dict[str, Any]) -> None: ... class NestedGraphTransition(TransitionGraphSupport, NestedTransition): ... class HierarchicalGraphMachine(GraphMachine, HierarchicalMarkupMachine): # type: ignore transition_cls: Type[NestedGraphTransition] transitions-0.9.0/transitions/extensions/asyncio.pyi0000644000232200023220000001445014304350474023417 0ustar debalancedebalancefrom ..core import Condition, Event, EventData, Machine, State, Transition, StateConfig, ModelParameter, TransitionConfig from .nesting import HierarchicalMachine, NestedEvent, NestedState, NestedTransition from typing import Any, Optional, List, Type, Dict, Deque, Callable, Union, Iterable, DefaultDict, Literal, Sequence from asyncio import Task from functools import partial from logging import Logger from enum import Enum from contextvars import ContextVar from ..core import StateIdentifier, CallbacksArg, CallbackList _LOGGER: Logger class AsyncState(State): async def enter(self, event_data: AsyncEventData) -> None: ... # type: ignore[override] async def exit(self, event_data: AsyncEventData) -> None: ... # type: ignore[override] class NestedAsyncState(NestedState, AsyncState): _scope: Any async def scoped_enter(self, event_data: AsyncEventData, scope: Optional[List[str]] = ...) -> None: ... # type: ignore[override] async def scoped_exit(self, event_data: AsyncEventData, scope: Optional[List[str]] = ...) -> None: ... # type: ignore[override] class AsyncCondition(Condition): async def check(self, event_data: AsyncEventData) -> bool: ... # type: ignore[override] class AsyncTransition(Transition): condition_cls: Type[AsyncCondition] async def _eval_conditions(self, event_data: AsyncEventData) -> bool: ... # type: ignore[override] async def execute(self, event_data: AsyncEventData) -> bool: ... # type: ignore[override] async def _change_state(self, event_data: AsyncEventData) -> None: ... # type: ignore[override] class NestedAsyncTransition(AsyncTransition, NestedTransition): async def _change_state(self, event_data: AsyncEventData) -> None: ... # type: ignore[override] class AsyncEventData(EventData): machine: Union[AsyncMachine, HierarchicalAsyncMachine] transition: AsyncTransition source_name: Optional[str] source_path: Optional[List[str]] class AsyncEvent(Event): machine: AsyncMachine transitions: DefaultDict[str, List[AsyncTransition]] # type: ignore async def trigger(self, model: object, *args: List, **kwargs: Dict[str, Any]) -> bool: ... # type: ignore[override] async def _trigger(self, event_data: AsyncEventData) -> bool: ... # type: ignore[override] async def _process(self, event_data: AsyncEventData) -> bool: ... # type: ignore[override] class NestedAsyncEvent(NestedEvent): transitions: DefaultDict[str, List[NestedAsyncTransition]] # type: ignore async def trigger_nested(self, event_data: AsyncEventData) -> bool: ... # type: ignore[override] async def _process(self, event_data: AsyncEventData) -> bool: ... # type: ignore[override] class AsyncMachine(Machine): state_cls: Type[NestedAsyncState] transition_cls: Type[AsyncTransition] event_cls: Type[AsyncEvent] async_tasks: Dict[int, List[Task]] events: Dict[str, AsyncEvent] # type: ignore queued: Union[bool, Literal["model"]] protected_tasks: List[Task] current_context: ContextVar _transition_queue_dict: Dict[int, Deque[Callable]] def __init__(self, model: Optional[ModelParameter] = ..., states: Optional[Union[Sequence[StateConfig], Type[Enum]]] = ..., initial: Optional[StateIdentifier] = ..., transitions: Optional[Union[TransitionConfig, Sequence[TransitionConfig]]] = ..., send_event: bool = ..., auto_transitions: bool = ..., ordered_transitions: bool = ..., ignore_invalid_triggers: Optional[bool] = ..., before_state_change: CallbacksArg = ..., after_state_change: CallbacksArg = ..., name: str = ..., queued: Union[bool, Literal["model"]] = ..., prepare_event: CallbacksArg = ..., finalize_event: CallbacksArg = ..., model_attribute: str = ..., on_exception: CallbacksArg = ..., **kwargs: Dict[str, Any]) -> None: ... def add_model(self, model: Union[Union[Literal["self"], object], Sequence[Union[Literal["self"], object]]], initial: Optional[StateIdentifier] = ...) -> None: ... async def dispatch(self, trigger: str, *args: List, **kwargs: Dict[str, Any]) -> bool: ... # type: ignore[override] async def callbacks(self, funcs: Iterable[Union[str, Callable]], event_data: AsyncEventData) -> None: ... # type: ignore[override] async def callback(self, func: Union[str, Callable], event_data: AsyncEventData) -> None: ... # type: ignore[override] @staticmethod async def await_all(callables: List[Callable]) -> List: ... async def switch_model_context(self, model: object) -> None: ... def get_state(self, state: Union[str, Enum]) -> AsyncState: ... async def process_context(self, func: partial, model: object) -> bool: ... def remove_model(self, model: object) -> None: ... def _process(self, trigger: partial) -> bool: ... async def _process_async(self, trigger: partial, model: object) -> bool: ... class HierarchicalAsyncMachine(HierarchicalMachine, AsyncMachine): # type: ignore state_cls: Type[NestedAsyncState] transition_cls: Type[NestedAsyncTransition] event_cls: Type[NestedAsyncEvent] # type: ignore async def trigger_event(self, model: object, trigger: str, # type: ignore[override] *args: List, **kwargs: Dict[str, Any]) -> bool: ... async def _trigger_event(self, event_data: AsyncEventData, trigger: str) -> bool: ... # type: ignore[override] class AsyncTimeout(AsyncState): dynamic_methods: List[str] timeout: float _on_timeout: CallbacksArg runner: Dict[int, Task] def __init__(self, *args: List, **kwargs: Dict[str, Any]) -> None: ... async def enter(self, event_data: AsyncEventData) -> None: ... # type: ignore[override] async def exit(self, event_data: AsyncEventData) -> None: ... # type: ignore[override] def create_timer(self, event_data: AsyncEventData) -> Task: ... async def _process_timeout(self, event_data: AsyncEventData) -> None: ... @property def on_timeout(self) -> CallbackList: ... @on_timeout.setter def on_timeout(self, value: CallbacksArg) -> None: ... class _DictionaryMock(dict): _value: Any def __init__(self, item: Any) -> None: ... def __setitem__(self, key: Any, item: Any) -> None: ... def __getitem__(self, key: Any) -> Any: ... def __repr__(self) -> str: ... transitions-0.9.0/transitions/extensions/locking.pyi0000644000232200023220000000627414304350474023405 0ustar debalancedebalancefrom transitions.core import Event, Machine, ModelParameter, TransitionConfig, CallbacksArg, StateConfig from typing import Any, Dict, ContextManager, Literal, Optional, Type, List, DefaultDict, Union, Callable, Sequence from types import TracebackType from logging import Logger from threading import Lock from ..core import StateIdentifier, State _LOGGER: Logger from enum import Enum class PicklableLock(ContextManager): lock: Lock def __init__(self) -> None: ... def __getstate__(self) -> Dict[str, Any]: ... def __setstate__(self, value: Dict[str, Any]) -> PicklableLock: ... def __enter__(self) -> None: ... def __exit__(self, exc_type: Optional[Type[BaseException]], exc_val: Optional[BaseException], exc_tb: Optional[TracebackType]) -> None: ... class IdentManager(ContextManager): current: int def __init__(self) -> None: ... def __enter__(self) -> None: ... def __exit__(self, exc_type: Optional[Type[BaseException]], exc_val: Optional[BaseException], exc_tb: Optional[TracebackType]) -> None: ... class LockedEvent(Event): machine: LockedMachine def trigger(self, model: object, *args: List, **kwargs: Dict[str, Any]) -> bool: ... class LockedMachine(Machine): event_cls: Type[LockedEvent] _ident: IdentManager machine_context: List[ContextManager] model_context_map: DefaultDict[int, List[ContextManager]] def __init__(self, model: Optional[ModelParameter] = ..., states: Optional[Union[Sequence[StateConfig], Type[Enum]]] = ..., initial: Optional[StateIdentifier] = ..., transitions: Optional[Union[TransitionConfig, Sequence[TransitionConfig]]] = ..., send_event: bool = ..., auto_transitions: bool = ..., ordered_transitions: bool = ..., ignore_invalid_triggers: Optional[bool] = ..., before_state_change: CallbacksArg = ..., after_state_change: CallbacksArg = ..., name: str = ..., queued: bool = ..., prepare_event: CallbacksArg = ..., finalize_event: CallbacksArg = ..., model_attribute: str = ..., on_exception: CallbacksArg = ..., machine_context: Optional[Union[List[ContextManager], ContextManager]] = ..., **kwargs: Dict[str, Any]) -> None: ... def __getstate__(self) -> Dict[str, Any]: ... def __setstate__(self, state: Dict[str, Any]) -> None: ... def add_model(self, model: Union[Union[Literal['self'], object], List[Union[Literal['self'], object]]], initial: Optional[StateIdentifier] = ..., model_context: Optional[Union[ContextManager, List[ContextManager]]] = ...) -> None: ... def remove_model(self, model: Union[Union[Literal['self'], object], List[Union[Literal['self'], object]]]) -> None: ... def __getattribute__(self, item: str) -> Any: ... def __getattr__(self, item: str) -> Any: ... def _add_model_to_state(self, state: State, model: object) -> None: ... def _get_qualified_state_name(self, state: State) -> str: ... def _locked_method(self, func: Callable, *args: List, **kwargs: Dict[str, Any]) -> Any: ... transitions-0.9.0/transitions/extensions/markup.pyi0000644000232200023220000000664614304350474023261 0ustar debalancedebalanceimport numbers from ..core import Machine, StateIdentifier, CallbacksArg, StateConfig, Event, TransitionConfig, ModelParameter from .nesting import HierarchicalMachine from typing import List, Dict, Union, Optional, Callable, Tuple, Any, Type, Sequence, TypedDict from enum import Enum # mypy does not support recursive definitions (yet), we need to use Any instead of 'MarkupConfig' class MarkupConfig(TypedDict): transitions: List[TransitionConfig] class MarkupMachine(Machine): state_attributes: List[str] transition_attributes: List[str] _markup: MarkupConfig _auto_transitions_markup: bool _needs_update: bool def __init__(self, model: Optional[ModelParameter]=..., states: Optional[Union[Sequence[StateConfig], Type[Enum]]] = ..., initial: Optional[StateIdentifier] = ..., transitions: Optional[Union[TransitionConfig, Sequence[TransitionConfig]]] = ..., send_event: bool = ..., auto_transitions: bool = ..., ordered_transitions: bool = ..., ignore_invalid_triggers: Optional[bool] = ..., before_state_change: CallbacksArg = ..., after_state_change: CallbacksArg = ..., name: str = ..., queued: bool = ..., prepare_event: CallbacksArg = ..., finalize_event: CallbacksArg = ..., model_attribute: str = ..., on_exception: CallbacksArg = ..., markup: Optional[MarkupConfig] = ..., auto_transitions_markup: bool = ..., **kwargs: Dict[str, Any]) -> None: ... @property def auto_transitions_markup(self) -> bool: ... @auto_transitions_markup.setter def auto_transitions_markup(self, value: bool) -> None: ... @property def markup(self) -> MarkupConfig: ... def get_markup_config(self) -> MarkupConfig: ... def add_transition(self, trigger: str, source: Union[StateIdentifier, List[StateIdentifier]], dest: Optional[StateIdentifier] = ..., conditions: CallbacksArg = ..., unless: CallbacksArg = ..., before: CallbacksArg = ..., after: CallbacksArg = ..., prepare: CallbacksArg = ..., **kwargs: Dict[str, Any]) -> None: ... def add_states(self, states: Union[Sequence[StateConfig], StateConfig], on_enter: CallbacksArg = ..., on_exit: CallbacksArg = ..., ignore_invalid_triggers: Optional[bool] = ..., **kwargs: Dict[str, Any]) -> None: ... @staticmethod def format_references(func: Callable) -> str: ... def _convert_states_and_transitions(self, root: MarkupConfig) -> None: ... def _convert_states(self, root: MarkupConfig) -> None: ... def _convert_transitions(self, root: MarkupConfig) -> None: ... def _add_markup_model(self, markup: MarkupConfig) -> None: ... def _convert_models(self) -> List[Dict[str, str]]: ... def _omit_auto_transitions(self, event: Event) -> bool: ... def _is_auto_transition(self, event: Event) -> bool: ... def _identify_callback(self, name: str) -> Tuple[Optional[str], Optional[str]]: ... class HierarchicalMarkupMachine(MarkupMachine, HierarchicalMachine): # type: ignore pass def rep(func: Union[Callable, str, numbers.Number], format_references: Optional[Callable] = ...) -> str: ... def _convert(obj: object, attributes: List[str], format_references: Optional[Callable]) -> MarkupConfig: ... transitions-0.9.0/transitions/extensions/diagrams_pygraphviz.py0000644000232200023220000002374714304350474025664 0ustar debalancedebalance""" transitions.extensions.diagrams ------------------------------- Graphviz support for (nested) machines. This also includes partial views of currently valid transitions. """ import logging try: import pygraphviz as pgv except ImportError: pgv = None from .nesting import NestedState from .diagrams_base import BaseGraph _LOGGER = logging.getLogger(__name__) _LOGGER.addHandler(logging.NullHandler()) class Graph(BaseGraph): """ Graph creation for transitions.core.Machine. """ def _add_nodes(self, states, container): for state in states: shape = self.machine.style_attributes['node']['default']['shape'] container.add_node(state['name'], label=self._convert_state_attributes(state), shape=shape) def _add_edges(self, transitions, container): for transition in transitions: src = transition['source'] edge_attr = {'label': self._transition_label(transition)} try: dst = transition['dest'] except KeyError: dst = src if container.has_edge(src, dst): edge = container.get_edge(src, dst) edge.attr['label'] = edge.attr['label'] + ' | ' + edge_attr['label'] else: container.add_edge(src, dst, **edge_attr) def generate(self): self.fsm_graph = pgv.AGraph(**self.machine.machine_attributes) self.fsm_graph.node_attr.update(self.machine.style_attributes['node']['default']) self.fsm_graph.edge_attr.update(self.machine.style_attributes['edge']['default']) states, transitions = self._get_elements() self._add_nodes(states, self.fsm_graph) self._add_edges(transitions, self.fsm_graph) setattr(self.fsm_graph, 'style_attributes', self.machine.style_attributes) def get_graph(self, title=None, roi_state=None): if title: self.fsm_graph.graph_attr['label'] = title if roi_state: filtered = _copy_agraph(self.fsm_graph) kept_nodes = set() active_state = roi_state.name if hasattr(roi_state, 'name') else roi_state if not filtered.has_node(roi_state): active_state += '_anchor' kept_nodes.add(active_state) # remove all edges that have no connection to the currently active state for edge in filtered.edges(): if active_state not in edge: filtered.delete_edge(edge) # find the ingoing edge by color; remove the rest for edge in filtered.in_edges(active_state): if edge.attr['color'] == self.fsm_graph.style_attributes['edge']['previous']['color']: kept_nodes.add(edge[0]) else: filtered.delete_edge(edge) # remove outgoing edges from children for edge in filtered.out_edges_iter(active_state): kept_nodes.add(edge[1]) for node in filtered.nodes(): if node not in kept_nodes: filtered.delete_node(node) return filtered return self.fsm_graph def set_node_style(self, state, style): node = self.fsm_graph.get_node(state.name if hasattr(state, "name") else state) style_attr = self.fsm_graph.style_attributes.get('node', {}).get(style) node.attr.update(style_attr) def set_previous_transition(self, src, dst): try: edge = self.fsm_graph.get_edge(src, dst) except KeyError: self.fsm_graph.add_edge(src, dst) edge = self.fsm_graph.get_edge(src, dst) style_attr = self.fsm_graph.style_attributes.get('edge', {}).get('previous') edge.attr.update(style_attr) self.set_node_style(src, 'previous') self.set_node_style(dst, 'active') def reset_styling(self): for edge in self.fsm_graph.edges_iter(): style_attr = self.fsm_graph.style_attributes.get('edge', {}).get('default') edge.attr.update(style_attr) for node in self.fsm_graph.nodes_iter(): if 'point' not in node.attr['shape']: style_attr = self.fsm_graph.style_attributes.get('node', {}).get('inactive') node.attr.update(style_attr) for sub_graph in self.fsm_graph.subgraphs_iter(): style_attr = self.fsm_graph.style_attributes.get('graph', {}).get('default') sub_graph.graph_attr.update(style_attr) class NestedGraph(Graph): """ Graph creation support for transitions.extensions.nested.HierarchicalGraphMachine. """ def __init__(self, *args, **kwargs): self.seen_transitions = [] super(NestedGraph, self).__init__(*args, **kwargs) def _add_nodes(self, states, container, prefix='', default_style='default'): for state in states: name = prefix + state['name'] label = self._convert_state_attributes(state) if 'children' in state: cluster_name = "cluster_" + name is_parallel = isinstance(state.get('initial', ''), list) sub = container.add_subgraph(name=cluster_name, label=label, rank='source', **self.machine.style_attributes['graph'][default_style]) root_container = sub.add_subgraph(name=cluster_name + '_root', label='', color=None, rank='min') width = '0' if is_parallel else '0.1' root_container.add_node(name + "_anchor", shape='point', fillcolor='black', width=width) self._add_nodes(state['children'], sub, prefix=prefix + state['name'] + NestedState.separator, default_style='parallel' if is_parallel else 'default') else: container.add_node(name, label=label, **self.machine.style_attributes['node'][default_style]) def _add_edges(self, transitions, container): for transition in transitions: # enable customizable labels label_pos = 'label' src = transition['source'] try: dst = transition['dest'] except KeyError: dst = src edge_attr = {} if _get_subgraph(container, 'cluster_' + src) is not None: edge_attr['ltail'] = 'cluster_' + src # edge_attr['minlen'] = "3" src_name = src + "_anchor" label_pos = 'headlabel' else: src_name = src dst_graph = _get_subgraph(container, 'cluster_' + dst) if dst_graph is not None: if not src.startswith(dst): edge_attr['lhead'] = "cluster_" + dst label_pos = 'taillabel' if label_pos.startswith('l') else 'label' dst_name = dst + '_anchor' else: dst_name = dst # remove ltail when dst is a child of src if 'ltail' in edge_attr: if _get_subgraph(container, edge_attr['ltail']).has_node(dst_name): del edge_attr['ltail'] edge_attr[label_pos] = self._transition_label(transition) if container.has_edge(src_name, dst_name): edge = container.get_edge(src_name, dst_name) edge.attr[label_pos] += ' | ' + edge_attr[label_pos] else: container.add_edge(src_name, dst_name, **edge_attr) def set_node_style(self, state, style): for state_name in self._get_state_names(state): self._set_node_style(state_name, style) def _set_node_style(self, state, style): try: node = self.fsm_graph.get_node(state) style_attr = self.fsm_graph.style_attributes.get('node', {}).get(style) node.attr.update(style_attr) except KeyError: subgraph = _get_subgraph(self.fsm_graph, 'cluster_' + state) style_attr = self.fsm_graph.style_attributes.get('graph', {}).get(style) subgraph.graph_attr.update(style_attr) def set_previous_transition(self, src, dst): src = self._get_global_name(src.split(self.machine.state_cls.separator)) dst = self._get_global_name(dst.split(self.machine.state_cls.separator)) edge_attr = self.fsm_graph.style_attributes.get('edge', {}).get('previous').copy() try: edge = self.fsm_graph.get_edge(src, dst) except KeyError: _src = src _dst = dst if _get_subgraph(self.fsm_graph, 'cluster_' + src): edge_attr['ltail'] = 'cluster_' + src _src += '_anchor' if _get_subgraph(self.fsm_graph, 'cluster_' + dst): edge_attr['lhead'] = "cluster_" + dst _dst += '_anchor' try: edge = self.fsm_graph.get_edge(_src, _dst) except KeyError: self.fsm_graph.add_edge(_src, _dst) edge = self.fsm_graph.get_edge(_src, _dst) edge.attr.update(edge_attr) self.set_node_style(src, 'previous') def _get_subgraph(graph, name): """ Searches for subgraphs in a graph. Args: g (AGraph): Container to be searched. name (str): Name of the cluster. Returns: AGraph if a cluster called 'name' exists else None """ sub_graph = graph.get_subgraph(name) if sub_graph: return sub_graph for sub in graph.subgraphs_iter(): sub_graph = _get_subgraph(sub, name) if sub_graph: return sub_graph return None # the official copy method does not close the file handle # which causes ResourceWarnings def _copy_agraph(graph): from tempfile import TemporaryFile # pylint: disable=import-outside-toplevel; Only required for special cases with TemporaryFile() as tmp: if hasattr(tmp, "file"): fhandle = tmp.file else: fhandle = tmp graph.write(fhandle) tmp.seek(0) res = graph.__class__(filename=fhandle) fhandle.close() return res transitions-0.9.0/transitions/extensions/markup.py0000644000232200023220000002552114304350474023101 0ustar debalancedebalance""" transitions.extensions.markup ----------------------------- This module extends machines with markup functionality that can be used to retrieve the current machine configuration as a dictionary. This is used as the foundation for diagram generation with Graphviz but can also be used to store and transfer machines. """ from functools import partial import importlib import itertools import numbers from six import string_types, iteritems try: # Enums are supported for Python 3.4+ and Python 2.7 with enum34 package installed from enum import Enum, EnumMeta except ImportError: # If enum is not available, create dummy classes for type checks # typing must be prevent redefinition issues with mypy class Enum: # type:ignore """ This is just an Enum stub for Python 2 and Python 3.3 and before without Enum support. """ class EnumMeta: # type:ignore """ This is just an EnumMeta stub for Python 2 and Python 3.3 and before without Enum support. """ from ..core import Machine from .nesting import HierarchicalMachine class MarkupMachine(Machine): """ Extends transitions.core.Machine with the capability to generate a dictionary representation of itself, its events, states and models. """ # Special attributes such as NestedState._name/_parent or Transition._condition are handled differently state_attributes = ['on_exit', 'on_enter', 'ignore_invalid_triggers', 'timeout', 'on_timeout', 'tags', 'label'] transition_attributes = ['source', 'dest', 'prepare', 'before', 'after', 'label'] def __init__(self, model=Machine.self_literal, states=None, initial='initial', transitions=None, send_event=False, auto_transitions=True, ordered_transitions=False, ignore_invalid_triggers=None, before_state_change=None, after_state_change=None, name=None, queued=False, prepare_event=None, finalize_event=None, model_attribute='state', on_exception=None, markup=None, auto_transitions_markup=False, **kwargs): self._markup = markup or {} self._auto_transitions_markup = auto_transitions_markup self._needs_update = True if self._markup: # remove models from config to process them AFTER the base machine has been initialized models = self._markup.pop('models', []) super(MarkupMachine, self).__init__(model=None, **self._markup) for mod in models: self._add_markup_model(mod) else: super(MarkupMachine, self).__init__( model=model, states=states, initial=initial, transitions=transitions, send_event=send_event, auto_transitions=auto_transitions, ordered_transitions=ordered_transitions, ignore_invalid_triggers=ignore_invalid_triggers, before_state_change=before_state_change, after_state_change=after_state_change, name=name, queued=queued, prepare_event=prepare_event, finalize_event=finalize_event, model_attribute=model_attribute, on_exception=on_exception, **kwargs ) self._markup['before_state_change'] = [x for x in (rep(f) for f in self.before_state_change) if x] self._markup['after_state_change'] = [x for x in (rep(f) for f in self.before_state_change) if x] self._markup['prepare_event'] = [x for x in (rep(f) for f in self.prepare_event) if x] self._markup['finalize_event'] = [x for x in (rep(f) for f in self.finalize_event) if x] self._markup['send_event'] = self.send_event self._markup['auto_transitions'] = self.auto_transitions self._markup['ignore_invalid_triggers'] = self.ignore_invalid_triggers self._markup['queued'] = self.has_queue @property def auto_transitions_markup(self): """ Whether auto transitions should be included in the markup. """ return self._auto_transitions_markup @auto_transitions_markup.setter def auto_transitions_markup(self, value): """ Whether auto transitions should be included in the markup. """ self._auto_transitions_markup = value self._needs_update = True @property def markup(self): """ Returns the machine's configuration as a markup dictionary. Returns: dict of machine configuration parameters. """ self._markup['models'] = self._convert_models() return self.get_markup_config() # the only reason why this not part of markup property is that pickle # has issues with properties during __setattr__ (self.markup is not set) def get_markup_config(self): """ Generates and returns all machine markup parameters except models. Returns: dict of machine configuration parameters. """ if self._needs_update: self._convert_states_and_transitions(self._markup) self._needs_update = False return self._markup def add_transition(self, trigger, source, dest, conditions=None, unless=None, before=None, after=None, prepare=None, **kwargs): super(MarkupMachine, self).add_transition(trigger, source, dest, conditions=conditions, unless=unless, before=before, after=after, prepare=prepare, **kwargs) self._needs_update = True def add_states(self, states, on_enter=None, on_exit=None, ignore_invalid_triggers=None, **kwargs): super(MarkupMachine, self).add_states(states, on_enter=on_enter, on_exit=on_exit, ignore_invalid_triggers=ignore_invalid_triggers, **kwargs) self._needs_update = True @staticmethod def format_references(func): """ Creates a string representation of referenced callbacks. Returns: str that represents a callback reference. """ try: return func.__name__ except AttributeError: pass if isinstance(func, partial): return "%s(%s)" % ( func.func.__name__, ", ".join(itertools.chain( (str(_) for _ in func.args), ("%s=%s" % (key, value) for key, value in iteritems(func.keywords if func.keywords else {}))))) return str(func) def _convert_states_and_transitions(self, root): state = getattr(self, 'scoped', self) if state.initial: root['initial'] = state.initial if state == self and state.name: root['name'] = self.name[:-2] self._convert_transitions(root) self._convert_states(root) def _convert_states(self, root): key = 'states' if getattr(self, 'scoped', self) == self else 'children' root[key] = [] for state_name, state in self.states.items(): s_def = _convert(state, self.state_attributes, self.format_references) if isinstance(state_name, Enum): s_def['name'] = state_name.name else: s_def['name'] = state_name if getattr(state, 'states', []): with self(state_name): self._convert_states_and_transitions(s_def) root[key].append(s_def) def _convert_transitions(self, root): root['transitions'] = [] for event in self.events.values(): if self._omit_auto_transitions(event): continue for transitions in event.transitions.items(): for trans in transitions[1]: t_def = _convert(trans, self.transition_attributes, self.format_references) t_def['trigger'] = event.name con = [x for x in (rep(f.func, self.format_references) for f in trans.conditions if f.target) if x] unl = [x for x in (rep(f.func, self.format_references) for f in trans.conditions if not f.target) if x] if con: t_def['conditions'] = con if unl: t_def['unless'] = unl root['transitions'].append(t_def) def _add_markup_model(self, markup): initial = markup.get('state', None) if markup['class-name'] == 'self': self.add_model(self, initial) else: mod_name, cls_name = markup['class-name'].rsplit('.', 1) cls = getattr(importlib.import_module(mod_name), cls_name) self.add_model(cls(), initial) def _convert_models(self): models = [] for model in self.models: state = getattr(model, self.model_attribute) model_def = dict(state=state.name if isinstance(state, Enum) else state) model_def['name'] = model.name if hasattr(model, 'name') else str(id(model)) model_def['class-name'] = 'self' if model == self else model.__module__ + "." + model.__class__.__name__ models.append(model_def) return models def _omit_auto_transitions(self, event): return self.auto_transitions_markup is False and self._is_auto_transition(event) # auto transition events commonly a) start with the 'to_' prefix, followed by b) the state name # and c) contain a transition from each state to the target state (including the target) def _is_auto_transition(self, event): if event.name.startswith('to_') and len(event.transitions) == len(self.states): state_name = event.name[len('to_'):] try: _ = self.get_state(state_name) return True except ValueError: pass return False def _identify_callback(self, name): callback_type, target = super(MarkupMachine, self)._identify_callback(name) if callback_type: self._needs_update = True return callback_type, target class HierarchicalMarkupMachine(MarkupMachine, HierarchicalMachine): """ Extends transitions.extensions.nesting.HierarchicalMachine with markup capabilities. """ def rep(func, format_references=None): """ Return a string representation for `func`. """ if isinstance(func, string_types): return func if isinstance(func, numbers.Number): return str(func) return format_references(func) if format_references is not None else None def _convert(obj, attributes, format_references): definition = {} for key in attributes: val = getattr(obj, key, False) if not val: continue if isinstance(val, string_types): definition[key] = val else: try: definition[key] = [rep(v, format_references) for v in iter(val)] except TypeError: definition[key] = rep(val, format_references) return definition transitions-0.9.0/transitions/extensions/nesting.py0000644000232200023220000015446514304350474023263 0ustar debalancedebalance# -*- coding: utf-8 -*- """ transitions.extensions.nesting ------------------------------ Implements a hierarchical state machine based on transitions.core.Machine. Supports nested states, parallel states and the composition of multiple hierarchical state machines. """ from collections import OrderedDict import copy from functools import partial, reduce import inspect import logging try: # Enums are supported for Python 3.4+ and Python 2.7 with enum34 package installed from enum import Enum, EnumMeta except ImportError: # If enum is not available, create dummy classes for type checks class Enum: # type: ignore """ This is just an Enum stub for Python 2 and Python 3.3 and before without Enum support. """ class EnumMeta: # type: ignore """ This is just an EnumMeta stub for Python 2 and Python 3.3 and before without Enum support. """ from six import string_types from ..core import State, Machine, Transition, Event, listify, MachineError, EventData _LOGGER = logging.getLogger(__name__) _LOGGER.addHandler(logging.NullHandler()) # converts a hierarchical tree into a list of current states def _build_state_list(state_tree, separator, prefix=None): prefix = prefix or [] res = [] for key, value in state_tree.items(): if value: res.append(_build_state_list(value, separator, prefix=prefix + [key])) else: res.append(separator.join(prefix + [key])) return res if len(res) > 1 else res[0] def resolve_order(state_tree): """ Converts a (model) state tree into a list of state paths. States are ordered in the way in which states should be visited to process the event correctly (Breadth-first). This makes sure that ALL children are evaluated before parents in parallel states. Args: state_tree (dict): A dictionary representation of the model's state. Returns: list of lists of str representing the order of states to be processed. """ queue = [] res = [] prefix = [] while True: for state_name in reversed(list(state_tree.keys())): scope = prefix + [state_name] res.append(scope) if state_tree[state_name]: queue.append((scope, state_tree[state_name])) if not queue: break prefix, state_tree = queue.pop(0) return reversed(res) class FunctionWrapper(object): """ A wrapper to enable transitions' convenience function to_ for nested states. This allows to call model.to_A.s1.C() in case a custom separator has been chosen.""" def __init__(self, func, path): """ Args: func: Function to be called at the end of the path. path: If path is an empty string, assign function """ if path: self.add(func, path) self._func = None else: self._func = func def add(self, func, path): """ Assigns a `FunctionWrapper` as an attribute named like the next segment of the substates path. Args: func (callable): Function to be called at the end of the path. path (list of strings): Remaining segment of the substate path. """ if path: name = path[0] if name[0].isdigit(): name = 's' + name if hasattr(self, name): getattr(self, name).add(func, path[1:]) else: setattr(self, name, FunctionWrapper(func, path[1:])) else: self._func = func def __call__(self, *args, **kwargs): return self._func(*args, **kwargs) class NestedEvent(Event): """ An event type to work with nested states. This subclass is NOT compatible with simple Machine instances. """ def trigger(self, model, *args, **kwargs): raise RuntimeError("NestedEvent.trigger must not be called directly. Call Machine.trigger_event instead.") def trigger_nested(self, event_data): """ Executes all transitions that match the current state, halting as soon as one successfully completes. It is up to the machine's configuration of the Event whether processing happens queued (sequentially) or whether further Events are processed as they occur. NOTE: This should only be called by HierarchicalMachine instances. Args: event_data (NestedEventData): The currently processed event Returns: boolean indicating whether or not a transition was successfully executed (True if successful, False if not). """ machine = event_data.machine model = event_data.model state_tree = machine.build_state_tree(getattr(model, machine.model_attribute), machine.state_cls.separator) state_tree = reduce(dict.get, machine.get_global_name(join=False), state_tree) ordered_states = resolve_order(state_tree) done = set() event_data.event = self for state_path in ordered_states: state_name = machine.state_cls.separator.join(state_path) if state_name not in done and state_name in self.transitions: event_data.state = machine.get_state(state_name) event_data.source_name = state_name event_data.source_path = copy.copy(state_path) self._process(event_data) if event_data.result: elems = state_path while elems: done.add(machine.state_cls.separator.join(elems)) elems.pop() return event_data.result def _process(self, event_data): machine = event_data.machine machine.callbacks(event_data.machine.prepare_event, event_data) _LOGGER.debug("%sExecuted machine preparation callbacks before conditions.", machine.name) for trans in self.transitions[event_data.source_name]: event_data.transition = trans event_data.result = trans.execute(event_data) if event_data.result: break class NestedEventData(EventData): """ Collection of relevant data related to the ongoing nested transition attempt. """ def __init__(self, state, event, machine, model, args, kwargs): super(NestedEventData, self).__init__(state, event, machine, model, args, kwargs) self.source_path = None self.source_name = None class NestedState(State): """ A state which allows substates. Attributes: states (OrderedDict): A list of substates of the current state. events (dict): A list of events defined for the nested state. initial (list, str, NestedState or Enum): (Name of a) child or list of children that should be entered when the state is entered. """ separator = '_' u""" Separator between the names of parent and child states. In case '_' is required for naming state, this value can be set to other values such as '.' or even unicode characters such as '↦' (limited to Python 3 though). """ def __init__(self, name, on_enter=None, on_exit=None, ignore_invalid_triggers=None, initial=None): super(NestedState, self).__init__(name=name, on_enter=on_enter, on_exit=on_exit, ignore_invalid_triggers=ignore_invalid_triggers) self.initial = initial self.events = {} self.states = OrderedDict() self._scope = [] def add_substate(self, state): """ Adds a state as a substate. Args: state (NestedState): State to add to the current state. """ self.add_substates(state) def add_substates(self, states): """ Adds a list of states to the current state. Args: states (list): List of state to add to the current state. """ for state in listify(states): self.states[state.name] = state def scoped_enter(self, event_data, scope=None): """ Enters a state with the provided scope. Args: event_data (NestedEventData): The currently processed event. scope (list(str)): Names of the state's parents starting with the top most parent. """ self._scope = scope or [] try: self.enter(event_data) finally: self._scope = [] def scoped_exit(self, event_data, scope=None): """ Exits a state with the provided scope. Args: event_data (NestedEventData): The currently processed event. scope (list(str)): Names of the state's parents starting with the top most parent. """ self._scope = scope or [] try: self.exit(event_data) finally: self._scope = [] @property def name(self): return self.separator.join(self._scope + [super(NestedState, self).name]) class NestedTransition(Transition): """ A transition which handles entering and leaving nested states. """ def _resolve_transition(self, event_data): dst_name_path = self.dest.split(event_data.machine.state_cls.separator) _ = event_data.machine.get_state(dst_name_path) state_tree = event_data.machine.build_state_tree( listify(getattr(event_data.model, event_data.machine.model_attribute)), event_data.machine.state_cls.separator) scope = event_data.machine.get_global_name(join=False) tmp_tree = state_tree.get(dst_name_path[0], None) root = [] while tmp_tree is not None: root.append(dst_name_path.pop(0)) tmp_tree = tmp_tree.get(dst_name_path[0], None) if len(dst_name_path) > 0 else None # when destination is empty this means we are already in the state we want to enter # we deal with a reflexive transition here as internal transitions have been already dealt with # the 'root' of src and dest will be set to the parent and dst (and src) substate will be set as destination if not dst_name_path: dst_name_path = [root.pop()] scoped_tree = reduce(dict.get, scope + root, state_tree) exit_partials = [partial(event_data.machine.get_state(root + state_name).scoped_exit, event_data, scope + root + state_name[:-1]) for state_name in resolve_order(scoped_tree)] if dst_name_path: new_states, enter_partials = self._enter_nested(root, dst_name_path, scope + root, event_data) else: new_states, enter_partials = {}, [] scoped_tree.clear() for new_key, value in new_states.items(): scoped_tree[new_key] = value break return state_tree, exit_partials, enter_partials def _change_state(self, event_data): state_tree, exit_partials, enter_partials = self._resolve_transition(event_data) for func in exit_partials: func() self._update_model(event_data, state_tree) for func in enter_partials: func() def _enter_nested(self, root, dest, prefix_path, event_data): if root: state_name = root.pop(0) with event_data.machine(state_name): return self._enter_nested(root, dest, prefix_path, event_data) elif dest: new_states = OrderedDict() state_name = dest.pop(0) with event_data.machine(state_name): new_states[state_name], new_enter = self._enter_nested([], dest, prefix_path + [state_name], event_data) enter_partials = [partial(event_data.machine.scoped.scoped_enter, event_data, prefix_path)] + new_enter return new_states, enter_partials elif event_data.machine.scoped.initial: new_states = OrderedDict() enter_partials = [] queue = [] prefix = prefix_path scoped_tree = new_states initial_names = [i.name if hasattr(i, 'name') else i for i in listify(event_data.machine.scoped.initial)] initial_states = [event_data.machine.scoped.states[n] for n in initial_names] while True: event_data.scope = prefix for state in initial_states: enter_partials.append(partial(state.scoped_enter, event_data, prefix)) scoped_tree[state.name] = OrderedDict() if state.initial: queue.append((scoped_tree[state.name], prefix + [state.name], [state.states[i.name] if hasattr(i, 'name') else state.states[i] for i in listify(state.initial)])) if not queue: break scoped_tree, prefix, initial_states = queue.pop(0) return new_states, enter_partials else: return {}, [] @staticmethod def _update_model(event_data, tree): model_states = _build_state_list(tree, event_data.machine.state_cls.separator) with event_data.machine(): event_data.machine.set_state(model_states, event_data.model) states = event_data.machine.get_states(listify(model_states)) event_data.state = states[0] if len(states) == 1 else states # Prevent deep copying of callback lists since these include either references to callable or # strings. Deep copying a method reference would lead to the creation of an entire new (model) object # (see https://github.com/pytransitions/transitions/issues/248) # Note: When conditions are handled like other dynamic callbacks the key == "conditions" clause can be removed def __deepcopy__(self, memo): cls = self.__class__ result = cls.__new__(cls) memo[id(self)] = result for key, value in self.__dict__.items(): if key in cls.dynamic_methods or key == "conditions": setattr(result, key, copy.copy(value)) else: setattr(result, key, copy.deepcopy(value, memo)) return result class HierarchicalMachine(Machine): """ Extends transitions.core.Machine by capabilities to handle nested states. A hierarchical machine REQUIRES NestedStates, NestedEvent and NestedTransitions (or any subclass of it) to operate. """ state_cls = NestedState transition_cls = NestedTransition event_cls = NestedEvent def __init__(self, model=Machine.self_literal, states=None, initial='initial', transitions=None, send_event=False, auto_transitions=True, ordered_transitions=False, ignore_invalid_triggers=None, before_state_change=None, after_state_change=None, name=None, queued=False, prepare_event=None, finalize_event=None, model_attribute='state', on_exception=None, **kwargs): assert issubclass(self.state_cls, NestedState) assert issubclass(self.event_cls, NestedEvent) assert issubclass(self.transition_cls, NestedTransition) self._stack = [] self.prefix_path = [] self.scoped = self self._next_scope = None super(HierarchicalMachine, self).__init__( model=model, states=states, initial=initial, transitions=transitions, send_event=send_event, auto_transitions=auto_transitions, ordered_transitions=ordered_transitions, ignore_invalid_triggers=ignore_invalid_triggers, before_state_change=before_state_change, after_state_change=after_state_change, name=name, queued=queued, prepare_event=prepare_event, finalize_event=finalize_event, model_attribute=model_attribute, on_exception=on_exception, **kwargs ) def __call__(self, to_scope=None): if isinstance(to_scope, string_types): state_name = to_scope.split(self.state_cls.separator)[0] state = self.states[state_name] to_scope = (state, state.states, state.events, self.prefix_path + [state_name]) elif isinstance(to_scope, Enum): state = self.states[to_scope.name] to_scope = (state, state.states, state.events, self.prefix_path + [to_scope.name]) elif to_scope is None: if self._stack: to_scope = self._stack[0] else: to_scope = (self, self.states, self.events, []) self._next_scope = to_scope return self def __enter__(self): self._stack.append((self.scoped, self.states, self.events, self.prefix_path)) self.scoped, self.states, self.events, self.prefix_path = self._next_scope self._next_scope = None def __exit__(self, exc_type, exc_val, exc_tb): self.scoped, self.states, self.events, self.prefix_path = self._stack.pop() def add_model(self, model, initial=None): """ Extends transitions.core.Machine.add_model by applying a custom 'to' function to the added model. """ models = [self if mod is self.self_literal else mod for mod in listify(model)] super(HierarchicalMachine, self).add_model(models, initial=initial) initial_name = getattr(models[0], self.model_attribute) if hasattr(initial_name, 'name'): initial_name = initial_name.name # initial states set by add_model or machine might contain initial states themselves. if isinstance(initial_name, string_types): initial_states = self._resolve_initial(models, initial_name.split(self.state_cls.separator)) # when initial is set to a (parallel) state, we accept it as it is else: initial_states = initial_name for mod in models: self.set_state(initial_states, mod) if hasattr(mod, 'to'): _LOGGER.warning("%sModel already has a 'to'-method. It will NOT " "be overwritten by NestedMachine", self.name) else: to_func = partial(self.to_state, mod) setattr(mod, 'to', to_func) @property def initial(self): """ Return the initial state. """ return self._initial @initial.setter def initial(self, value): self._initial = self._recursive_initial(value) def add_ordered_transitions(self, states=None, trigger='next_state', loop=True, loop_includes_initial=True, conditions=None, unless=None, before=None, after=None, prepare=None, **kwargs): if states is None: states = self.get_nested_state_names() super(HierarchicalMachine, self).add_ordered_transitions(states=states, trigger=trigger, loop=loop, loop_includes_initial=loop_includes_initial, conditions=conditions, unless=unless, before=before, after=after, prepare=prepare, **kwargs) def add_states(self, states, on_enter=None, on_exit=None, ignore_invalid_triggers=None, **kwargs): """ Add new nested state(s). Args: states (list, str, dict, Enum, NestedState or HierarchicalMachine): a list, a NestedState instance, the name of a new state, an enumeration (member) or a dict with keywords to pass on to the NestedState initializer. If a list, each element can be a string, dict, NestedState or enumeration member. on_enter (str or list): callbacks to trigger when the state is entered. Only valid if first argument is string. on_exit (str or list): callbacks to trigger when the state is exited. Only valid if first argument is string. ignore_invalid_triggers: when True, any calls to trigger methods that are not valid for the present state (e.g., calling an a_to_b() trigger when the current state is c) will be silently ignored rather than raising an invalid transition exception. Note that this argument takes precedence over the same argument defined at the Machine level, and is in turn overridden by any ignore_invalid_triggers explicitly passed in an individual state's initialization arguments. **kwargs additional keyword arguments used by state mixins. """ remap = kwargs.pop('remap', None) ignore = self.ignore_invalid_triggers if ignore_invalid_triggers is None else ignore_invalid_triggers for state in listify(states): if isinstance(state, Enum): if isinstance(state.value, EnumMeta): state = {'name': state, 'children': state.value} elif isinstance(state.value, dict): state = dict(name=state, **state.value) if isinstance(state, string_types): self._add_string_state(state, on_enter, on_exit, ignore, remap, **kwargs) elif isinstance(state, Enum): self._add_enum_state(state, on_enter, on_exit, ignore, remap, **kwargs) elif isinstance(state, dict): self._add_dict_state(state, ignore, remap, **kwargs) elif isinstance(state, NestedState): if state.name in self.states: raise ValueError("State {0} cannot be added since it already exists.".format(state.name)) self.states[state.name] = state self._init_state(state) elif isinstance(state, HierarchicalMachine): self._add_machine_states(state, remap) elif isinstance(state, State) and not isinstance(state, NestedState): raise ValueError("A passed state object must derive from NestedState! " "A default State object is not sufficient") else: raise ValueError("Cannot add state of type {0}. ".format(type(state).__name__)) def add_transition(self, trigger, source, dest, conditions=None, unless=None, before=None, after=None, prepare=None, **kwargs): if source == self.wildcard_all and dest == self.wildcard_same: source = self.get_nested_state_names() else: if source != self.wildcard_all: source = [self.state_cls.separator.join(self._get_enum_path(s)) if isinstance(s, Enum) else s for s in listify(source)] if dest != self.wildcard_same: dest = self.state_cls.separator.join(self._get_enum_path(dest)) if isinstance(dest, Enum) else dest super(HierarchicalMachine, self).add_transition(trigger, source, dest, conditions, unless, before, after, prepare, **kwargs) def get_global_name(self, state=None, join=True): """ Returns the name of the passed state in context of the current prefix/scope. Args: state (str, Enum or NestedState): The state to be analyzed. join (bool): Whether this method should join the path elements or not Returns: str or list(str) of the global state name """ domains = copy.copy(self.prefix_path) if state: state_name = state.name if hasattr(state, 'name') else state if state_name in self.states: domains.append(state_name) else: raise ValueError("State '{0}' not found in local states.".format(state)) return self.state_cls.separator.join(domains) if join else domains def get_nested_state_names(self): """ Returns a list of global names of all states of a machine. Returns: list(str) of global state names. """ ordered_states = [] for state in self.states.values(): ordered_states.append(self.get_global_name(state)) with self(state.name): ordered_states.extend(self.get_nested_state_names()) return ordered_states def get_nested_transitions(self, trigger="", src_path=None, dest_path=None): """ Retrieves a list of all transitions matching the passed requirements. Args: trigger (str): If set, return only transitions related to this trigger. src_path (list(str)): If set, return only transitions with this source state. dest_path (list(str)): If set, return only transitions with this destination. Returns: list(NestedTransitions) of valid transitions. """ if src_path and dest_path: src = self.state_cls.separator.join(src_path) dest = self.state_cls.separator.join(dest_path) transitions = super(HierarchicalMachine, self).get_transitions(trigger, src, dest) if len(src_path) > 1 and len(dest_path) > 1: with self(src_path[0]): transitions.extend(self.get_nested_transitions(trigger, src_path[1:], dest_path[1:])) elif src_path: src = self.state_cls.separator.join(src_path) transitions = super(HierarchicalMachine, self).get_transitions(trigger, src, "*") if len(src_path) > 1: with self(src_path[0]): transitions.extend(self.get_nested_transitions(trigger, src_path[1:], None)) elif dest_path: dest = self.state_cls.separator.join(dest_path) transitions = super(HierarchicalMachine, self).get_transitions(trigger, "*", dest) if len(dest_path) > 1: for state_name in self.states: with self(state_name): transitions.extend(self.get_nested_transitions(trigger, None, dest_path[1:])) else: transitions = super(HierarchicalMachine, self).get_transitions(trigger, "*", "*") for state_name in self.states: with self(state_name): transitions.extend(self.get_nested_transitions(trigger, None, None)) return transitions def get_nested_triggers(self, src_path=None): """ Retrieves a list of valid triggers. Args: src_path (list(str)): A list representation of the source state's name. Returns: list(str) of valid trigger names. """ if src_path: triggers = super(HierarchicalMachine, self).get_triggers(self.state_cls.separator.join(src_path)) if len(src_path) > 1 and src_path[0] in self.states: with self(src_path[0]): triggers.extend(self.get_nested_triggers(src_path[1:])) else: triggers = list(self.events.keys()) for state_name in self.states: with self(state_name): triggers.extend(self.get_nested_triggers()) return triggers def get_state(self, state, hint=None): """ Return the State instance with the passed name. Args: state (str, Enum or list(str)): A state name, enum or state path hint (list(str)): A state path to check for the state in question Returns: NestedState that belongs to the passed str (list) or Enum. """ if isinstance(state, Enum): state = self._get_enum_path(state) elif isinstance(state, string_types): state = state.split(self.state_cls.separator) if not hint: state = copy.copy(state) hint = copy.copy(state) if len(state) > 1: child = state.pop(0) try: with self(child): return self.get_state(state, hint) except (KeyError, ValueError): try: with self(): state = self for elem in hint: state = state.states[elem] return state except KeyError: raise ValueError( "State '%s' is not a registered state." % self.state_cls.separator.join(hint) ) # from KeyError elif state[0] not in self.states: raise ValueError("State '%s' is not a registered state." % state) return self.states[state[0]] def get_states(self, states): """ Retrieves a list of NestedStates. Args: states (str, Enum or list of str or Enum): Names/values of the states to retrieve. Returns: list(NestedStates) belonging to the passed identifiers. """ res = [] for state in states: if isinstance(state, list): res.append(self.get_states(state)) else: res.append(self.get_state(state)) return res def get_transitions(self, trigger="", source="*", dest="*", delegate=False): """ Return the transitions from the Machine. Args: trigger (str): Trigger name of the transition. source (str, State or Enum): Limits list to transitions from a certain state. dest (str, State or Enum): Limits list to transitions to a certain state. delegate (Optional[bool]): If True, consider delegations to parents of source Returns: list(NestedTransitions): All transitions matching the request. """ with self(): source_path = [] if source == "*" \ else source.split(self.state_cls.separator) if isinstance(source, string_types) \ else self._get_enum_path(source) if isinstance(source, Enum) \ else self._get_state_path(source) dest_path = [] if dest == "*" \ else dest.split(self.state_cls.separator) if isinstance(dest, string_types) \ else self._get_enum_path(dest) if isinstance(dest, Enum) \ else self._get_state_path(dest) matches = self.get_nested_transitions(trigger, source_path, dest_path) # only consider delegations when source_path contains a nested state (len > 1) if delegate is False or len(source_path) < 2: return matches source_path.pop() while source_path: matches.extend(self.get_transitions(trigger, source=self.state_cls.separator.join(source_path), dest=dest)) source_path.pop() return matches def _can_trigger(self, model, trigger, *args, **kwargs): state_tree = self.build_state_tree(getattr(model, self.model_attribute), self.state_cls.separator) ordered_states = resolve_order(state_tree) for state_path in ordered_states: with self(): return self._can_trigger_nested(model, trigger, state_path, *args, **kwargs) def _can_trigger_nested(self, model, trigger, path, *args, **kwargs): evt = NestedEventData(None, None, self, model, args, kwargs) if trigger in self.events: source_path = copy.copy(path) while source_path: state_name = self.state_cls.separator.join(source_path) for transition in self.events[trigger].transitions.get(state_name, []): try: _ = self.get_state(transition.dest) except ValueError: continue self.callbacks(self.prepare_event, evt) self.callbacks(transition.prepare, evt) if all(c.check(evt) for c in transition.conditions): return True source_path.pop(-1) if path: with self(path.pop(0)): return self._can_trigger_nested(model, trigger, path, *args, **kwargs) return False def get_triggers(self, *args): """ Extends transitions.core.Machine.get_triggers to also include parent state triggers. """ triggers = [] with self(): for state in args: state_name = state.name if hasattr(state, 'name') else state state_path = state_name.split(self.state_cls.separator) if len(state_path) > 1: # we only need to check substates when 'state_name' refers to a substate with self(state_path[0]): triggers.extend(self.get_nested_triggers(state_path[1:])) while state_path: # check all valid transitions for parent states triggers.extend(super(HierarchicalMachine, self).get_triggers( self.state_cls.separator.join(state_path))) state_path.pop() return triggers def has_trigger(self, trigger, state=None): """ Check whether an event/trigger is known to the machine Args: trigger (str): Event/trigger name state (optional[NestedState]): Limits the recursive search to this state and its children Returns: bool: True if event is known and False otherwise """ state = state or self return trigger in state.events or any(self.has_trigger(trigger, sta) for sta in state.states.values()) def is_state(self, state, model, allow_substates=False): if allow_substates: current = getattr(model, self.model_attribute) current_name = self.state_cls.separator.join(self._get_enum_path(current))\ if isinstance(current, Enum) else current state_name = self.state_cls.separator.join(self._get_enum_path(state))\ if isinstance(state, Enum) else state return current_name.startswith(state_name) return getattr(model, self.model_attribute) == state def on_enter(self, state_name, callback): """ Helper function to add callbacks to states in case a custom state separator is used. Args: state_name (str): Name of the state callback (str or callable): Function to be called. Strings will be resolved to model functions. """ self.get_state(state_name).add_callback('enter', callback) def on_exit(self, state_name, callback): """ Helper function to add callbacks to states in case a custom state separator is used. Args: state_name (str): Name of the state callback (str or callable): Function to be called. Strings will be resolved to model functions. """ self.get_state(state_name).add_callback('exit', callback) def set_state(self, state, model=None): """ Set the current state. Args: state (list of str or Enum or State): value of state(s) to be set model (optional[object]): targeted model; if not set, all models will be set to 'state' """ values = [self._set_state(value) for value in listify(state)] models = self.models if model is None else listify(model) for mod in models: setattr(mod, self.model_attribute, values if len(values) > 1 else values[0]) def to_state(self, model, state_name, *args, **kwargs): """ Helper function to add go to states in case a custom state separator is used. Args: model (class): The model that should be used. state_name (str): Name of the destination state. """ current_state = getattr(model, self.model_attribute) if isinstance(current_state, list): raise MachineError("Cannot use 'to_state' from parallel state") event = NestedEventData(self.get_state(current_state), Event('to', self), self, model, args=args, kwargs=kwargs) if isinstance(current_state, Enum): event.source_path = self._get_enum_path(current_state) event.source_name = self.state_cls.separator.join(event.source_path) else: event.source_name = current_state event.source_path = current_state.split(self.state_cls.separator) self._create_transition(event.source_name, state_name).execute(event) def trigger_event(self, model, trigger, *args, **kwargs): """ Processes events recursively and forwards arguments if suitable events are found. This function is usually bound to models with model and trigger arguments already resolved as a partial. Execution will halt when a nested transition has been executed successfully. Args: model (object): targeted model trigger (str): event name *args: positional parameters passed to the event and its callbacks **kwargs: keyword arguments passed to the event and its callbacks Returns: bool: whether a transition has been executed successfully Raises: MachineError: When no suitable transition could be found and ignore_invalid_trigger is not True. Note that a transition which is not executed due to conditions is still considered valid. """ event_data = NestedEventData(state=None, event=None, machine=self, model=model, args=args, kwargs=kwargs) event_data.result = None return self._process(partial(self._trigger_event, event_data, trigger)) def _trigger_event(self, event_data, trigger): try: with self(): res = self._trigger_event_nested(event_data, trigger, None) event_data.result = self._check_event_result(res, event_data.model, trigger) except Exception as err: # pylint: disable=broad-except; Exception will be handled elsewhere event_data.error = err if self.on_exception: self.callbacks(self.on_exception, event_data) else: raise finally: try: self.callbacks(self.finalize_event, event_data) _LOGGER.debug("%sExecuted machine finalize callbacks", self.name) except Exception as err: # pylint: disable=broad-except; Exception will be handled elsewhere _LOGGER.error("%sWhile executing finalize callbacks a %s occurred: %s.", self.name, type(err).__name__, str(err)) return event_data.result def _add_model_to_state(self, state, model): name = self.get_global_name(state) if self.state_cls.separator == '_': value = state.value if isinstance(state.value, Enum) else name self._checked_assignment(model, 'is_%s' % name, partial(self.is_state, value, model)) # Add dynamic method callbacks (enter/exit) if there are existing bound methods in the model # except if they are already mentioned in 'on_enter/exit' of the defined state for callback in self.state_cls.dynamic_methods: method = "{0}_{1}".format(callback, name) if hasattr(model, method) and inspect.ismethod(getattr(model, method)) and \ method not in getattr(state, callback): state.add_callback(callback[3:], method) else: path = name.split(self.state_cls.separator) value = state.value if isinstance(state.value, Enum) else name trig_func = partial(self.is_state, value, model) if hasattr(model, 'is_' + path[0]): getattr(model, 'is_' + path[0]).add(trig_func, path[1:]) else: self._checked_assignment(model, 'is_' + path[0], FunctionWrapper(trig_func, path[1:])) with self(state.name): for event in self.events.values(): if not hasattr(model, event.name): self._add_trigger_to_model(event.name, model) for a_state in self.states.values(): self._add_model_to_state(a_state, model) def _add_dict_state(self, state, ignore_invalid_triggers, remap, **kwargs): if remap is not None and state['name'] in remap: return state = state.copy() # prevent messing with the initially passed dict remap = state.pop('remap', None) if 'ignore_invalid_triggers' not in state: state['ignore_invalid_triggers'] = ignore_invalid_triggers # parallel: [states] is just a short handle for {children: [states], initial: [state_names]} state_parallel = state.pop('parallel', []) if state_parallel: state_children = state_parallel state['initial'] = [s['name'] if isinstance(s, dict) else s for s in state_children] else: state_children = state.pop('children', state.pop('states', [])) transitions = state.pop('transitions', []) new_state = self._create_state(**state) self.states[new_state.name] = new_state self._init_state(new_state) remapped_transitions = [] with self(new_state.name): self.add_states(state_children, remap=remap, **kwargs) if transitions: self.add_transitions(transitions) if remap is not None: remapped_transitions.extend(self._remap_state(new_state, remap)) self.add_transitions(remapped_transitions) def _add_enum_state(self, state, on_enter, on_exit, ignore_invalid_triggers, remap, **kwargs): if remap is not None and state.name in remap: return if self.state_cls.separator in state.name: raise ValueError("State '{0}' contains '{1}' which is used as state name separator. " "Consider changing the NestedState.separator to avoid this issue." "".format(state.name, self.state_cls.separator)) if state.name in self.states: raise ValueError("State {0} cannot be added since it already exists.".format(state.name)) new_state = self._create_state(state, on_enter=on_enter, on_exit=on_exit, ignore_invalid_triggers=ignore_invalid_triggers, **kwargs) self.states[new_state.name] = new_state self._init_state(new_state) def _add_machine_states(self, state, remap): new_states = [s for s in state.states.values() if remap is None or s not in remap] self.add_states(new_states) for evt in state.events.values(): self.events[evt.name] = evt if self.scoped.initial is None: self.scoped.initial = state.initial def _add_string_state(self, state, on_enter, on_exit, ignore_invalid_triggers, remap, **kwargs): if remap is not None and state in remap: return domains = state.split(self.state_cls.separator, 1) if len(domains) > 1: try: self.get_state(domains[0]) except ValueError: self.add_state(domains[0], on_enter=on_enter, on_exit=on_exit, ignore_invalid_triggers=ignore_invalid_triggers, **kwargs) with self(domains[0]): self.add_states(domains[1], on_enter=on_enter, on_exit=on_exit, ignore_invalid_triggers=ignore_invalid_triggers, **kwargs) else: if state in self.states: raise ValueError("State {0} cannot be added since it already exists.".format(state)) new_state = self._create_state(state, on_enter=on_enter, on_exit=on_exit, ignore_invalid_triggers=ignore_invalid_triggers, **kwargs) self.states[new_state.name] = new_state self._init_state(new_state) def _add_trigger_to_model(self, trigger, model): trig_func = partial(self.trigger_event, model, trigger) self._add_may_transition_func_for_trigger(trigger, model) # FunctionWrappers are only necessary if a custom separator is used if trigger.startswith('to_') and self.state_cls.separator != '_': path = trigger[3:].split(self.state_cls.separator) if hasattr(model, 'to_' + path[0]): # add path to existing function wrapper getattr(model, 'to_' + path[0]).add(trig_func, path[1:]) else: # create a new function wrapper self._checked_assignment(model, 'to_' + path[0], FunctionWrapper(trig_func, path[1:])) else: self._checked_assignment(model, trigger, trig_func) def build_state_tree(self, model_states, separator, tree=None): """ Converts a list of current states into a hierarchical state tree. Args: model_states (str or list(str)): separator (str): The character used to separate state names tree (OrderedDict): The current branch to use. If not passed, create a new tree. Returns: OrderedDict: A state tree dictionary """ tree = tree if tree is not None else OrderedDict() if isinstance(model_states, list): for state in model_states: _ = self.build_state_tree(state, separator, tree) else: tmp = tree if isinstance(model_states, (Enum, EnumMeta)): with self(): path = self._get_enum_path(model_states) else: path = model_states.split(separator) for elem in path: tmp = tmp.setdefault(elem.name if hasattr(elem, 'name') else elem, OrderedDict()) return tree def _get_enum_path(self, enum_state, prefix=None): prefix = prefix or [] if enum_state.name in self.states and self.states[enum_state.name].value == enum_state: return prefix + [enum_state.name] for name in self.states: with self(name): res = self._get_enum_path(enum_state, prefix=prefix + [name]) if res: return res # if we reach this point without a prefix, we looped over all nested states # and could not find a suitable enum state if not prefix: raise ValueError("Could not find path of {0}.".format(enum_state)) return None def _get_state_path(self, state, prefix=None): prefix = prefix or [] if state in self.states.values(): return prefix + [state.name] for name in self.states: with self(name): res = self._get_state_path(state, prefix=prefix + [name]) if res: return res return [] def _check_event_result(self, res, model, trigger): if res is None: state_names = getattr(model, self.model_attribute) msg = "%sCan't trigger event '%s' from state(s) %s!" % (self.name, trigger, state_names) for state_name in listify(state_names): state = self.get_state(state_name) ignore = state.ignore_invalid_triggers if state.ignore_invalid_triggers is not None \ else self.ignore_invalid_triggers if not ignore: # determine whether a MachineError (valid event but invalid state) ... if self.has_trigger(trigger): raise MachineError(msg) # or AttributeError (invalid event) is appropriate raise AttributeError("Do not know event named '%s'." % trigger) _LOGGER.warning(msg) res = False return res def _get_trigger(self, model, trigger_name, *args, **kwargs): """Convenience function added to the model to trigger events by name. Args: model (object): Model with assigned event trigger. trigger_name (str): Name of the trigger to be called. *args: Variable length argument list which is passed to the triggered event. **kwargs: Arbitrary keyword arguments which is passed to the triggered event. Returns: bool: True if a transitions has been conducted or the trigger event has been queued. """ return self.trigger_event(model, trigger_name, *args, **kwargs) def _has_state(self, state, raise_error=False): """ This function Args: state (NestedState): state to be tested raise_error (bool): whether ValueError should be raised when the state is not registered Returns: bool: Whether state is registered in the machine Raises: ValueError: When raise_error is True and state is not registered """ found = super(HierarchicalMachine, self)._has_state(state) if not found: for a_state in self.states: with self(a_state): if self._has_state(state): return True if not found and raise_error: msg = 'State %s has not been added to the machine' % (state.name if hasattr(state, 'name') else state) raise ValueError(msg) return found def _init_state(self, state): for model in self.models: self._add_model_to_state(state, model) if self.auto_transitions: state_name = self.get_global_name(state.name) parent = state_name.split(self.state_cls.separator, 1) with self(): for a_state in self.get_nested_state_names(): if a_state == parent[0]: self.add_transition('to_%s' % state_name, self.wildcard_all, state_name) elif len(parent) == 1: self.add_transition('to_%s' % a_state, state_name, a_state) with self(state.name): for substate in self.states.values(): self._init_state(substate) def _recursive_initial(self, value): if isinstance(value, string_types): path = value.split(self.state_cls.separator, 1) if len(path) > 1: state_name, suffix = path # make sure the passed state has been created already super(HierarchicalMachine, self.__class__).initial.fset(self, state_name) with self(state_name): self.initial = suffix self._initial = state_name + self.state_cls.separator + self._initial else: super(HierarchicalMachine, self.__class__).initial.fset(self, value) elif isinstance(value, (list, tuple)): return [self._recursive_initial(v) for v in value] else: super(HierarchicalMachine, self.__class__).initial.fset(self, value) return self._initial[0] if isinstance(self._initial, list) and len(self._initial) == 1 else self._initial def _remap_state(self, state, remap): drop_event = [] remapped_transitions = [] for evt in self.events.values(): self.events[evt.name] = copy.copy(evt) for trigger, event in self.events.items(): drop_source = [] event.transitions = copy.deepcopy(event.transitions) for source_name, trans_source in event.transitions.items(): if source_name in remap: drop_source.append(source_name) continue drop_trans = [] for trans in trans_source: if trans.dest in remap: conditions, unless = [], [] for cond in trans.conditions: # split a list in two lists based on the accessors (cond.target) truth value (unless, conditions)[cond.target].append(cond.func) remapped_transitions.append({ 'trigger': trigger, 'source': state.name + self.state_cls.separator + trans.source, 'dest': remap[trans.dest], 'conditions': conditions, 'unless': unless, 'prepare': trans.prepare, 'before': trans.before, 'after': trans.after}) drop_trans.append(trans) for d_trans in drop_trans: trans_source.remove(d_trans) if not trans_source: drop_source.append(source_name) for d_source in drop_source: del event.transitions[d_source] if not event.transitions: drop_event.append(trigger) for d_event in drop_event: del self.events[d_event] return remapped_transitions def _resolve_initial(self, models, state_name_path, prefix=None): prefix = prefix or [] if state_name_path: state_name = state_name_path.pop(0) with self(state_name): return self._resolve_initial(models, state_name_path, prefix=prefix + [state_name]) if self.scoped.initial: entered_states = [] for initial_state_name in listify(self.scoped.initial): with self(initial_state_name): entered_states.append(self._resolve_initial(models, [], prefix=prefix + [self.scoped.name])) return entered_states if len(entered_states) > 1 else entered_states[0] return self.state_cls.separator.join(prefix) def _set_state(self, state_name): if isinstance(state_name, list): return [self._set_state(value) for value in state_name] a_state = self.get_state(state_name) return a_state.value if isinstance(a_state.value, Enum) else state_name def _trigger_event_nested(self, event_data, trigger, _state_tree): model = event_data.model if _state_tree is None: _state_tree = self.build_state_tree(listify(getattr(model, self.model_attribute)), self.state_cls.separator) res = {} for key, value in _state_tree.items(): if value: with self(key): tmp = self._trigger_event_nested(event_data, trigger, value) if tmp is not None: res[key] = tmp if res.get(key, False) is False and trigger in self.events: event_data.event = self.events[trigger] tmp = event_data.event.trigger_nested(event_data) if tmp is not None: res[key] = tmp return None if not res or all(v is None for v in res.values()) else any(res.values()) transitions-0.9.0/transitions/extensions/diagrams_base.pyi0000644000232200023220000000301614304350474024527 0ustar debalancedebalanceimport abc from typing import Protocol, Optional, Union, List, Dict, IO, Tuple, Generator from .diagrams import GraphMachine, HierarchicalGraphMachine from ..core import ModelState class GraphProtocol(Protocol): def draw(self, filename: Optional[Union[str, IO]], format:Optional[str] = ..., prog: Optional[str] = ..., args:str = ...) -> Optional[str]: ... class GraphModelProtocol(Protocol): def get_graph(self, title: Optional[str]=None, force_new: bool=False, show_roi: bool=False) -> GraphProtocol: ... class BaseGraph(metaclass=abc.ABCMeta): machine: Union[GraphMachine, HierarchicalGraphMachine] fsm_graph: Optional[GraphProtocol] def __init__(self, machine: GraphMachine) -> None: ... @abc.abstractmethod def generate(self) -> None: ... @abc.abstractmethod def set_previous_transition(self, src: str, dst: str) -> None: ... @abc.abstractmethod def reset_styling(self) -> None: ... @abc.abstractmethod def set_node_style(self, state: ModelState, style: str) -> None: ... @abc.abstractmethod def get_graph(self, title: Optional[str] = ..., roi_state: Optional[str] = ...) -> GraphProtocol: ... def _convert_state_attributes(self, state: Dict[str, str]) -> str: ... def _get_state_names(self, state: ModelState) -> Generator[str, None, None]: ... def _transition_label(self, tran: Dict[str, str]) -> str: ... def _get_global_name(self, path: List[str]) -> str: ... def _get_elements(self) -> Tuple[List[Dict[str, str]], List[Dict[str, str]]]: ...transitions-0.9.0/transitions/extensions/nesting.pyi0000644000232200023220000002455014304350474023423 0ustar debalancedebalancefrom ..core import Event, EventData, Machine, State, Transition, CallbacksArg, Callback, ModelParameter, TransitionConfig from collections import defaultdict as defaultdict from typing import OrderedDict, Sequence, Union, List, Dict, Optional, Type, Tuple, Callable, Any, Collection from types import TracebackType from logging import Logger from enum import Enum from functools import partial _LOGGER: Logger class FunctionWrapper: _func: Optional[Callable] def __init__(self, func: Callable, path: List[str]) -> None: ... def add(self, func: Callable, path: List[str]) -> None: ... def __call__(self, *args: List, **kwargs: Dict[str, Any]) -> Any: ... class NestedEvent(Event): def trigger_nested(self, event_data: NestedEventData) -> bool: ... def _process(self, event_data: NestedEventData) -> bool: ... # type: ignore[override] class NestedEventData(EventData): state: Optional[NestedState] event: Optional[NestedEvent] machine: Optional[HierarchicalMachine] transition: Optional[NestedTransition] source_name: Optional[str] source_path: Optional[List[str]] class NestedState(State): separator: str initial: Optional[str] events: Dict[str, NestedEvent] states: OrderedDict[str, NestedState] _scope: List[str] def __init__(self, name: Union[str, Enum], on_enter: CallbacksArg = ..., on_exit: CallbacksArg = ..., ignore_invalid_triggers: bool = ..., initial: Optional[str] = ...) -> None: ... def add_substate(self, state: NestedState) -> None: ... def add_substates(self, states: List[NestedState]) -> None: ... def scoped_enter(self, event_data: NestedEventData, scope: List[str]=...) -> None: ... def scoped_exit(self, event_data: NestedEventData, scope: List[str]=...) -> None: ... @property def name(self) -> str: ... NestedStateIdentifier = Union[str, Enum, NestedState, Sequence[Union[str, Enum, NestedState, Sequence[Any]]]] NestedStateConfig = Union[NestedStateIdentifier, Dict[str, Any], Collection[str], 'HierarchicalMachine'] # mypy does not support cyclic definitions, use Any instead of `StateTree` StateTree = OrderedDict[str, Any] def _build_state_list(state_tree: StateTree, separator: str, prefix: Optional[List[str]] = ...) -> Union[str, List[str]]: ... def resolve_order(state_tree: Dict[str, str]) -> List[List[str]]: ... class NestedTransition(Transition): def _resolve_transition(self, event_data: NestedEventData) -> Tuple[StateTree, List[partial], List[partial]]: ... def _change_state(self, event_data: NestedEventData) -> None: ... # type: ignore[override] def _enter_nested(self, root: List[str], dest: List[str], prefix_path: List[str], event_data: NestedEventData) -> Tuple[StateTree, List[partial]]: ... @staticmethod def _update_model(event_data: NestedEventData, tree: StateTree) -> None: ... def __deepcopy__(self, memo: Dict) -> NestedTransition: ... ScopeTuple = Tuple[Union[NestedState, 'HierarchicalMachine'], OrderedDict[str, NestedState], Dict[str, NestedEvent], List[str]] class HierarchicalMachine(Machine): state_cls: Type[NestedState] transition_cls: Type[NestedTransition] event_cls: Type[NestedEvent] # mypy does not approve State being overridden with NestedState and Event with NestedEvent states: OrderedDict[str, NestedState] # type: ignore events: Dict[str, NestedEvent] # type:ignore _stack: List[ScopeTuple] _initial: Optional[str] prefix_path: List[str] scoped: Union[NestedState, HierarchicalMachine] def __init__(self, model: Optional[ModelParameter]=..., states: Optional[Union[Sequence[NestedStateConfig], Type[Enum]]] = ..., initial: Optional[NestedStateIdentifier] = ..., transitions: Optional[Union[TransitionConfig, Sequence[TransitionConfig]]] = ..., send_event: bool = ..., auto_transitions: bool = ..., ordered_transitions: bool = ..., ignore_invalid_triggers: Optional[bool] = ..., before_state_change: CallbacksArg = ..., after_state_change: CallbacksArg = ..., name: str = ..., queued: Union[bool, str] = ..., prepare_event: CallbacksArg = ..., finalize_event: CallbacksArg = ..., model_attribute: str = ..., on_exception: CallbacksArg = ..., **kwargs: Dict[str, Any]) -> None: ... _next_scope: Optional[ScopeTuple] def __call__(self, to_scope: Optional[Union[ScopeTuple, str, Enum]] = ...) -> HierarchicalMachine: ... def __enter__(self) -> None: ... def __exit__(self, exc_type: Optional[Type[BaseException]], exc_val: Optional[BaseException], exc_tb: Optional[TracebackType]) -> None: ... def add_model(self, model: ModelParameter, initial: Optional[NestedStateIdentifier] = ...) -> None: ... # type: ignore[override] @property def initial(self) -> Optional[str]: ... @initial.setter def initial(self, value: NestedStateIdentifier) -> None: ... def add_ordered_transitions(self, states: Optional[Sequence[NestedState]] = ..., trigger: str = ..., loop: bool = ..., # type: ignore[override] loop_includes_initial: bool = ..., conditions: CallbacksArg = ..., unless: CallbacksArg = ..., before: CallbacksArg = ..., after: CallbacksArg = ..., prepare: CallbacksArg = ..., **kwargs: Dict[str, Any]) -> None: ... def add_states(self, states: Union[List[NestedStateConfig], NestedStateConfig], # type: ignore[override] on_enter: CallbacksArg = ..., on_exit: CallbacksArg = ..., ignore_invalid_triggers: Optional[bool] = ..., **kwargs: Dict[str, Any]) -> None: ... def add_transition(self, trigger: str, # type: ignore[override] source: Union[NestedStateIdentifier, List[NestedStateIdentifier]], dest: Optional[NestedStateIdentifier] = ..., conditions: CallbacksArg = ..., unless: CallbacksArg = ..., before: CallbacksArg = ..., after: CallbacksArg = ..., prepare: CallbacksArg = ..., **kwargs: Dict[str, Any]) -> None: ... def get_global_name(self, state: NestedStateIdentifier = ..., join: bool = ...) -> Union[str, List[str]]: ... def get_nested_state_names(self) -> List[str]: ... def get_nested_transitions(self, trigger: str = ..., src_path: Optional[List[str]] = ..., dest_path: Optional[List[str]] = ...) -> List[NestedTransition]: ... def get_nested_triggers(self, src_path: Optional[List[str]] = ...) -> List[str]: ... def get_state(self, state: Union[str, Enum, List[str]], hint: Optional[List[str]] = ...) -> NestedState: ... def get_states(self, states: Union[str, Enum, List[Union[str, Enum]]]) -> List[NestedState]: ... def get_transitions(self, trigger: str = ..., source: NestedStateIdentifier = ..., # type: ignore[override] dest: NestedStateIdentifier = ..., delegate: bool = ...) -> List[NestedTransition]: ... def get_triggers(self, *args: Union[str, Enum, State]) -> List[str]: ... def has_trigger(self, trigger: str, state: Optional[NestedState] = ...) -> bool: ... def is_state(self, state: Union[str, Enum], model: object, allow_substates: bool = ...) -> bool: ... def on_enter(self, state_name: str, callback: Callback) -> None: ... def on_exit(self, state_name: str, callback: Callback) -> None: ... def set_state(self, state: Union[NestedStateIdentifier, List[NestedStateIdentifier]], # type: ignore[override] model: Optional[object] = ...) -> None: ... def to_state(self, model: object, state_name: str, *args: List, **kwargs: Dict[str, Any]) -> None: ... def trigger_event(self, model: object, trigger: str, *args: List, **kwargs: Dict[str, Any]) -> bool: ... def _add_model_to_state(self, state: NestedState, model: object) -> None: ... # type: ignore[override] def _add_dict_state(self, state: Dict[str, Any], ignore_invalid_triggers: bool, remap: Optional[Dict[str, str]], **kwargs: Dict[str, Any]) -> None: ... def _add_enum_state(self, state: Enum, on_enter: CallbacksArg, on_exit: CallbacksArg, ignore_invalid_triggers: bool, remap: Optional[Dict[str, str]], **kwargs: Dict[str, Any]) -> None: ... def _add_machine_states(self, state: HierarchicalMachine, remap: Optional[Dict[str, str]]) -> None: ... def _add_string_state(self, state: str, on_enter: CallbacksArg, on_exit: CallbacksArg, ignore_invalid_triggers: bool, remap: Optional[Dict[str, str]], **kwargs: Dict[str, Any]) -> None: ... def _add_trigger_to_model(self, trigger: str, model: object) -> None: ... def build_state_tree(self, model_states: Union[str, Enum, Sequence[Union[str, Enum, Sequence[Any]]]], separator: str, tree: Optional[StateTree] = ...) -> StateTree: ... @classmethod def _create_transition(cls, *args: List, **kwargs: Dict[str, Any]) -> NestedTransition: ... @classmethod def _create_event(cls, *args: List, **kwargs: Dict[str, Any]) -> NestedEvent: ... @classmethod def _create_state(cls, *args: List, **kwargs: Dict[str, Any]) -> NestedState: ... def _get_enum_path(self, enum_state: Enum, prefix: Optional[List[str]] =...) -> List[str]: ... def _get_state_path(self, state: NestedState, prefix: Optional[List[str]] = ...) -> List[str]: ... def _check_event_result(self, res: bool, model: object, trigger: str) -> bool: ... def _get_trigger(self, model: object, trigger_name: str, *args: List, **kwargs: Dict[str, Any]) -> bool: ... def _has_state(self, state: NestedState, raise_error: bool = ...) -> bool: ... # type: ignore[override] def _init_state(self, state: NestedState) -> None: ... def _recursive_initial(self, value: NestedStateIdentifier) -> Union[str, List[str]]: ... def _remap_state(self, state: NestedState, remap: Dict[str, str]) -> List[NestedTransition]: ... def _resolve_initial(self, models: List[object], state_name_path: List[str], prefix: Optional[List[str]] = ...) -> str: ... def _set_state(self, state_name: Union[str, List[str]]) -> Union[str, Enum, List[Union[str, Enum]]]: ... def _trigger_event(self, event_data: NestedEventData, trigger: str) -> Optional[bool]: ... transitions-0.9.0/transitions/extensions/states.py0000644000232200023220000002316614304350474023110 0ustar debalancedebalance""" transitions.extensions.states ----------------------------- This module contains mix ins which can be used to extend state functionality. """ from collections import Counter from threading import Timer import logging import inspect from ..core import MachineError, listify, State _LOGGER = logging.getLogger(__name__) _LOGGER.addHandler(logging.NullHandler()) class Tags(State): """ Allows states to be tagged. Attributes: tags (list): A list of tag strings. `State.is_` may be used to check if is in the list. """ def __init__(self, *args, **kwargs): """ Args: **kwargs: If kwargs contains `tags`, assign them to the attribute. """ self.tags = kwargs.pop('tags', []) super(Tags, self).__init__(*args, **kwargs) def __getattr__(self, item): if item.startswith('is_'): return item[3:] in self.tags return super(Tags, self).__getattribute__(item) class Error(Tags): """ This mix in builds upon tag and should be used INSTEAD of Tags if final states that have not been tagged with 'accepted' should throw an `MachineError`. """ def __init__(self, *args, **kwargs): """ Args: **kwargs: If kwargs contains the keyword `accepted` add the 'accepted' tag to a tag list which will be forwarded to the Tags constructor. """ tags = kwargs.get('tags', []) accepted = kwargs.pop('accepted', False) if accepted: tags.append('accepted') kwargs['tags'] = tags super(Error, self).__init__(*args, **kwargs) def enter(self, event_data): """ Extends transitions.core.State.enter. Throws a `MachineError` if there is no leaving transition from this state and 'accepted' is not in self.tags. """ if not event_data.machine.get_triggers(self.name) and not self.is_accepted: raise MachineError("Error state '{0}' reached!".format(self.name)) super(Error, self).enter(event_data) class Timeout(State): """ Adds timeout functionality to a state. Timeouts are handled model-specific. Attributes: timeout (float): Seconds after which a timeout function should be called. on_timeout (list): Functions to call when a timeout is triggered. """ dynamic_methods = ['on_timeout'] def __init__(self, *args, **kwargs): """ Args: **kwargs: If kwargs contain 'timeout', assign the float value to self.timeout. If timeout is set, 'on_timeout' needs to be passed with kwargs as well or an AttributeError will be thrown. If timeout is not passed or equal 0. """ self.timeout = kwargs.pop('timeout', 0) self._on_timeout = None if self.timeout > 0: try: self.on_timeout = kwargs.pop('on_timeout') except KeyError: raise AttributeError("Timeout state requires 'on_timeout' when timeout is set.") # from KeyError else: self._on_timeout = kwargs.pop('on_timeout', []) self.runner = {} super(Timeout, self).__init__(*args, **kwargs) def enter(self, event_data): """ Extends `transitions.core.State.enter` by starting a timeout timer for the current model when the state is entered and self.timeout is larger than 0. """ if self.timeout > 0: timer = Timer(self.timeout, self._process_timeout, args=(event_data,)) timer.daemon = True timer.start() self.runner[id(event_data.model)] = timer return super(Timeout, self).enter(event_data) def exit(self, event_data): """ Extends `transitions.core.State.exit` by canceling a timer for the current model. """ timer = self.runner.get(id(event_data.model), None) if timer is not None and timer.is_alive(): timer.cancel() return super(Timeout, self).exit(event_data) def _process_timeout(self, event_data): _LOGGER.debug("%sTimeout state %s. Processing callbacks...", event_data.machine.name, self.name) for callback in self.on_timeout: event_data.machine.callback(callback, event_data) _LOGGER.info("%sTimeout state %s processed.", event_data.machine.name, self.name) @property def on_timeout(self): """ List of strings and callables to be called when the state timeouts. """ return self._on_timeout @on_timeout.setter def on_timeout(self, value): """ Listifies passed values and assigns them to on_timeout.""" self._on_timeout = listify(value) class Volatile(State): """ Adds scopes/temporal variables to the otherwise persistent state objects. Attributes: volatile_cls (cls): Class of the temporal object to be initiated. volatile_hook (str): Model attribute name which will contain the volatile instance. """ def __init__(self, *args, **kwargs): """ Args: **kwargs: If kwargs contains `volatile`, always create an instance of the passed class whenever the state is entered. The instance is assigned to a model attribute which can be passed with the kwargs keyword `hook`. If hook is not passed, the instance will be assigned to the 'attribute' scope. If `volatile` is not passed, an empty object will be assigned to the model's hook. """ self.volatile_cls = kwargs.pop('volatile', VolatileObject) self.volatile_hook = kwargs.pop('hook', 'scope') super(Volatile, self).__init__(*args, **kwargs) self.initialized = True def enter(self, event_data): """ Extends `transitions.core.State.enter` by creating a volatile object and assign it to the current model's hook. """ setattr(event_data.model, self.volatile_hook, self.volatile_cls()) super(Volatile, self).enter(event_data) def exit(self, event_data): """ Extends `transitions.core.State.exit` by deleting the temporal object from the model. """ super(Volatile, self).exit(event_data) try: delattr(event_data.model, self.volatile_hook) except AttributeError: pass class Retry(State): """ The Retry mix-in sets a limit on the number of times a state may be re-entered from itself. The first time a state is entered it does not count as a retry. Thus with `retries=3` the state can be entered four times before it fails. When the retry limit is exceeded, the state is not entered and instead the `on_failure` callback is invoked on the model. For example, Retry(retries=3, on_failure='to_failed') transitions the model directly to the 'failed' state, if the machine has automatic transitions enabled (the default). Attributes: retries (int): Number of retries to allow before failing. on_failure (str): Function to invoke on the model when the retry limit is exceeded. """ def __init__(self, *args, **kwargs): """ Args: **kwargs: If kwargs contains `retries`, then limit the number of times the state may be re-entered from itself. The argument `on_failure`, which is the function to invoke on the model when the retry limit is exceeded, must also be provided. """ self.retries = kwargs.pop('retries', 0) self.on_failure = kwargs.pop('on_failure', None) self.retry_counts = Counter() if self.retries > 0 and self.on_failure is None: raise AttributeError("Retry state requires 'on_failure' when " "'retries' is set.") super(Retry, self).__init__(*args, **kwargs) def enter(self, event_data): k = id(event_data.model) # If we are entering from a different state, then this is our first try; # reset the retry counter. if event_data.transition.source != self.name: _LOGGER.debug('%sRetry limit for state %s reset (came from %s)', event_data.machine.name, self.name, event_data.transition.source) self.retry_counts[k] = 0 # If we have tried too many times, invoke our failure callback instead if self.retry_counts[k] > self.retries > 0: _LOGGER.info('%sRetry count for state %s exceeded limit (%i)', event_data.machine.name, self.name, self.retries) event_data.machine.callback(self.on_failure, event_data) return # Otherwise, increment the retry count and continue per normal _LOGGER.debug('%sRetry count for state %s is now %i', event_data.machine.name, self.name, self.retry_counts[k]) self.retry_counts.update((k,)) super(Retry, self).enter(event_data) def add_state_features(*args): """ State feature decorator. Should be used in conjunction with a custom Machine class. """ def _class_decorator(cls): class CustomState(type('CustomState', args, {}), cls.state_cls): """ The decorated State. It is based on the State class used by the decorated Machine. """ method_list = sum([c.dynamic_methods for c in inspect.getmro(CustomState) if hasattr(c, 'dynamic_methods')], []) CustomState.dynamic_methods = list(set(method_list)) cls.state_cls = CustomState return cls return _class_decorator class VolatileObject(object): """ Empty Python object which can be used to assign attributes to.""" transitions-0.9.0/transitions/extensions/factory.pyi0000644000232200023220000000465214304350474023424 0ustar debalancedebalancefrom ..core import Machine, State from .diagrams import GraphMachine, NestedGraphTransition, HierarchicalGraphMachine from .locking import LockedMachine from .nesting import HierarchicalMachine, NestedEvent from typing import Type, Dict, Tuple, Callable, Union try: from transitions.extensions.asyncio import AsyncMachine, AsyncTransition from transitions.extensions.asyncio import HierarchicalAsyncMachine, NestedAsyncTransition except (ImportError, SyntaxError): # Mocks for Python version 3.6 and earlier class AsyncMachine: # type: ignore pass class AsyncTransition: # type: ignore pass class HierarchicalAsyncMachine: # type: ignore pass class NestedAsyncTransition: # type: ignore pass class MachineFactory: @staticmethod def get_predefined(graph: bool = ..., nested: bool = ..., locked: bool = ..., asyncio: bool = ...) -> Union[ Type[Machine], Type[HierarchicalMachine], Type[AsyncMachine], Type[HierarchicalAsyncMachine], Type[GraphMachine], Type[HierarchicalGraphMachine], Type[AsyncGraphMachine], Type[HierarchicalAsyncGraphMachine], Type[LockedMachine], Type[LockedHierarchicalMachine], Type[LockedGraphMachine], Type[LockedHierarchicalGraphMachine] ]: ... class LockedHierarchicalMachine(LockedMachine, HierarchicalMachine): # type: ignore[misc] # replaces LockedEvent with NestedEvent; method overridden by LockedEvent is not used in HSMs event_cls: Type[NestedEvent] # type: ignore def _get_qualified_state_name(self, state: State) -> str: ... class LockedGraphMachine(GraphMachine, LockedMachine): # type: ignore @staticmethod def format_references(func: Callable) -> str: ... class LockedHierarchicalGraphMachine(GraphMachine, LockedHierarchicalMachine): # type: ignore transition_cls: Type[NestedGraphTransition] event_cls: Type[NestedEvent] @staticmethod def format_references(func: Callable) -> str: ... class AsyncGraphMachine(GraphMachine, AsyncMachine): # AsyncTransition already considers graph models when necessary transition_cls: Type[AsyncTransition] # type: ignore class HierarchicalAsyncGraphMachine(GraphMachine, HierarchicalAsyncMachine): # type: ignore # AsyncTransition already considers graph models when necessary transition_cls: Type[NestedAsyncTransition] # type: ignore _CLASS_MAP: Dict[Tuple[bool, bool, bool, bool], Type[Machine]] transitions-0.9.0/transitions/extensions/locking.py0000644000232200023220000001777114304350474023240 0ustar debalancedebalance""" transitions.extensions.factory ------------------------------ Adds locking to machine methods as well as model functions that trigger events. Additionally, the user can inject her/his own context manager into the machine if required. """ from collections import defaultdict from functools import partial from threading import Lock import inspect import warnings import logging from transitions.core import Machine, Event, listify _LOGGER = logging.getLogger(__name__) _LOGGER.addHandler(logging.NullHandler()) try: from contextlib import nested # Python 2 from thread import get_ident # with nested statements now raise a DeprecationWarning. Should be replaced with ExitStack-like approaches. warnings.simplefilter('ignore', DeprecationWarning) except ImportError: from contextlib import ExitStack, contextmanager from threading import get_ident @contextmanager def nested(*contexts): """ Reimplementation of nested in Python 3. """ with ExitStack() as stack: for ctx in contexts: stack.enter_context(ctx) yield contexts class PicklableLock: """ A wrapper for threading.Lock which discards its state during pickling and is reinitialized unlocked when unpickled. """ def __init__(self): self.lock = Lock() def __getstate__(self): return '' def __setstate__(self, value): return self.__init__() def __enter__(self): self.lock.__enter__() def __exit__(self, exc_type, exc_val, exc_tb): self.lock.__exit__(exc_type, exc_val, exc_tb) class IdentManager: """ Manages the identity of threads to detect whether the current thread already has a lock. """ def __init__(self): self.current = 0 def __enter__(self): self.current = get_ident() def __exit__(self, exc_type, exc_val, exc_tb): self.current = 0 class LockedEvent(Event): """ An event type which uses the parent's machine context map when triggered. """ def trigger(self, model, *args, **kwargs): """ Extends transitions.core.Event.trigger by using locks/machine contexts. """ # pylint: disable=protected-access # noinspection PyProtectedMember # LockedMachine._locked should not be called somewhere else. That's why it should not be exposed # to Machine users. if self.machine._ident.current != get_ident(): with nested(*self.machine.model_context_map[id(model)]): return super(LockedEvent, self).trigger(model, *args, **kwargs) else: return super(LockedEvent, self).trigger(model, *args, **kwargs) class LockedMachine(Machine): """ Machine class which manages contexts. In it's default version the machine uses a `threading.Lock` context to lock access to its methods and event triggers bound to model objects. Attributes: machine_context (dict): A dict of context managers to be entered whenever a machine method is called or an event is triggered. Contexts are managed for each model individually. """ event_cls = LockedEvent def __init__(self, model=Machine.self_literal, states=None, initial='initial', transitions=None, send_event=False, auto_transitions=True, ordered_transitions=False, ignore_invalid_triggers=None, before_state_change=None, after_state_change=None, name=None, queued=False, prepare_event=None, finalize_event=None, model_attribute='state', on_exception=None, machine_context=None, **kwargs): self._ident = IdentManager() self.machine_context = listify(machine_context) or [PicklableLock()] self.machine_context.append(self._ident) self.model_context_map = defaultdict(list) super(LockedMachine, self).__init__( model=model, states=states, initial=initial, transitions=transitions, send_event=send_event, auto_transitions=auto_transitions, ordered_transitions=ordered_transitions, ignore_invalid_triggers=ignore_invalid_triggers, before_state_change=before_state_change, after_state_change=after_state_change, name=name, queued=queued, prepare_event=prepare_event, finalize_event=finalize_event, model_attribute=model_attribute, on_exception=on_exception, **kwargs ) # When we attempt to pickle a locked machine, using IDs wont suffice to unpickle the contexts since # IDs have changed. We use a 'reference' store with objects as dictionary keys to resolve the newly created # references. This should induce no restrictions compared to transitions 0.8.8 but enable the usage of unhashable # objects in locked machine. def __getstate__(self): state = {k: v for k, v in self.__dict__.items()} del state['model_context_map'] state['_model_context_map_store'] = {mod: self.model_context_map[id(mod)] for mod in self.models} return state def __setstate__(self, state): self.__dict__.update(state) self.model_context_map = defaultdict(list) for model in self.models: self.model_context_map[id(model)] = self._model_context_map_store[model] del self._model_context_map_store def add_model(self, model, initial=None, model_context=None): """ Extends `transitions.core.Machine.add_model` by `model_context` keyword. Args: model (list or object): A model (list) to be managed by the machine. initial (str, Enum or State): The initial state of the passed model[s]. model_context (list or object): If passed, assign the context (list) to the machines model specific context map. """ models = listify(model) model_context = listify(model_context) if model_context is not None else [] super(LockedMachine, self).add_model(models, initial) for mod in models: mod = self if mod is self.self_literal else mod self.model_context_map[id(mod)].extend(self.machine_context) self.model_context_map[id(mod)].extend(model_context) def remove_model(self, model): """ Extends `transitions.core.Machine.remove_model` by removing model specific context maps from the machine when the model itself is removed. """ models = listify(model) for mod in models: del self.model_context_map[id(mod)] return super(LockedMachine, self).remove_model(models) def __getattribute__(self, item): get_attr = super(LockedMachine, self).__getattribute__ tmp = get_attr(item) if not item.startswith('_') and inspect.ismethod(tmp): return partial(get_attr('_locked_method'), tmp) return tmp def __getattr__(self, item): try: return super(LockedMachine, self).__getattribute__(item) except AttributeError: return super(LockedMachine, self).__getattr__(item) # Determine if the returned method is a partial and make sure the returned partial has # not been created by Machine.__getattr__. # https://github.com/tyarkoni/transitions/issues/214 def _add_model_to_state(self, state, model): super(LockedMachine, self)._add_model_to_state(state, model) # pylint: disable=protected-access for prefix in self.state_cls.dynamic_methods: callback = "{0}_{1}".format(prefix, self._get_qualified_state_name(state)) func = getattr(model, callback, None) if isinstance(func, partial) and func.func != state.add_callback: state.add_callback(prefix[3:], callback) # this needs to be overridden by the HSM variant to resolve names correctly def _get_qualified_state_name(self, state): return state.name def _locked_method(self, func, *args, **kwargs): if self._ident.current != get_ident(): with nested(*self.machine_context): return func(*args, **kwargs) else: return func(*args, **kwargs) transitions-0.9.0/transitions/extensions/asyncio.py0000644000232200023220000007677214304350474023265 0ustar debalancedebalance""" transitions.extensions.asyncio ------------------------------ This module contains machine, state and event implementations for asynchronous callback processing. `AsyncMachine` and `HierarchicalAsyncMachine` use `asyncio` for concurrency. The extension `transitions-anyio` found at https://github.com/pytransitions/transitions-anyio illustrates how they can be extended to make use of other concurrency libraries. The module also contains the state mixin `AsyncTimeout` to asynchronously trigger timeout-related callbacks. """ # Overriding base methods of states, transitions and machines with async variants is not considered good practise. # However, the alternative would mean to either increase the complexity of the base classes or copy code fragments # and thus increase code complexity and reduce maintainability. If you know a better solution, please file an issue. # pylint: disable=invalid-overridden-method import logging import asyncio import contextvars import inspect from collections import deque from functools import partial, reduce import copy from ..core import State, Condition, Transition, EventData, listify from ..core import Event, MachineError, Machine from .nesting import HierarchicalMachine, NestedState, NestedEvent, NestedTransition, resolve_order _LOGGER = logging.getLogger(__name__) _LOGGER.addHandler(logging.NullHandler()) class AsyncState(State): """ A persistent representation of a state managed by a ``Machine``. Callback execution is done asynchronously. """ async def enter(self, event_data): """ Triggered when a state is entered. Args: event_data: (AsyncEventData): The currently processed event. """ _LOGGER.debug("%sEntering state %s. Processing callbacks...", event_data.machine.name, self.name) await event_data.machine.callbacks(self.on_enter, event_data) _LOGGER.info("%sFinished processing state %s enter callbacks.", event_data.machine.name, self.name) async def exit(self, event_data): """ Triggered when a state is exited. Args: event_data: (AsyncEventData): The currently processed event. """ _LOGGER.debug("%sExiting state %s. Processing callbacks...", event_data.machine.name, self.name) await event_data.machine.callbacks(self.on_exit, event_data) _LOGGER.info("%sFinished processing state %s exit callbacks.", event_data.machine.name, self.name) class NestedAsyncState(NestedState, AsyncState): """ A state that allows substates. Callback execution is done asynchronously. """ async def scoped_enter(self, event_data, scope=None): self._scope = scope or [] await self.enter(event_data) self._scope = [] async def scoped_exit(self, event_data, scope=None): self._scope = scope or [] await self.exit(event_data) self._scope = [] class AsyncCondition(Condition): """ A helper class to await condition checks in the intended way. """ async def check(self, event_data): """ Check whether the condition passes. Args: event_data (EventData): An EventData instance to pass to the condition (if event sending is enabled) or to extract arguments from (if event sending is disabled). Also contains the data model attached to the current machine which is used to invoke the condition. """ func = event_data.machine.resolve_callable(self.func, event_data) res = func(event_data) if event_data.machine.send_event else func(*event_data.args, **event_data.kwargs) if inspect.isawaitable(res): return await res == self.target return res == self.target class AsyncTransition(Transition): """ Representation of an asynchronous transition managed by a ``AsyncMachine`` instance. """ condition_cls = AsyncCondition async def _eval_conditions(self, event_data): res = await event_data.machine.await_all([partial(cond.check, event_data) for cond in self.conditions]) if not all(res): _LOGGER.debug("%sTransition condition failed: Transition halted.", event_data.machine.name) return False return True async def execute(self, event_data): """ Executes the transition. Args: event_data (EventData): An instance of class EventData. Returns: boolean indicating whether or not the transition was successfully executed (True if successful, False if not). """ _LOGGER.debug("%sInitiating transition from state %s to state %s...", event_data.machine.name, self.source, self.dest) await event_data.machine.callbacks(self.prepare, event_data) _LOGGER.debug("%sExecuted callbacks before conditions.", event_data.machine.name) if not await self._eval_conditions(event_data): return False machine = event_data.machine # cancel running tasks since the transition will happen await machine.switch_model_context(event_data.model) await event_data.machine.callbacks(event_data.machine.before_state_change, event_data) await event_data.machine.callbacks(self.before, event_data) _LOGGER.debug("%sExecuted callback before transition.", event_data.machine.name) if self.dest: # if self.dest is None this is an internal transition with no actual state change await self._change_state(event_data) await event_data.machine.callbacks(self.after, event_data) await event_data.machine.callbacks(event_data.machine.after_state_change, event_data) _LOGGER.debug("%sExecuted callback after transition.", event_data.machine.name) return True async def _change_state(self, event_data): if hasattr(event_data.machine, "model_graphs"): graph = event_data.machine.model_graphs[id(event_data.model)] graph.reset_styling() graph.set_previous_transition(self.source, self.dest) await event_data.machine.get_state(self.source).exit(event_data) event_data.machine.set_state(self.dest, event_data.model) event_data.update(getattr(event_data.model, event_data.machine.model_attribute)) await event_data.machine.get_state(self.dest).enter(event_data) class NestedAsyncTransition(AsyncTransition, NestedTransition): """ Representation of an asynchronous transition managed by a ``HierarchicalMachine`` instance. """ async def _change_state(self, event_data): if hasattr(event_data.machine, "model_graphs"): graph = event_data.machine.model_graphs[id(event_data.model)] graph.reset_styling() graph.set_previous_transition(self.source, self.dest) state_tree, exit_partials, enter_partials = self._resolve_transition(event_data) for func in exit_partials: await func() self._update_model(event_data, state_tree) for func in enter_partials: await func() class AsyncEventData(EventData): """ A redefinition of the base EventData intended to easy type checking. """ class AsyncEvent(Event): """ A collection of transitions assigned to the same trigger """ async def trigger(self, model, *args, **kwargs): """ Serially execute all transitions that match the current state, halting as soon as one successfully completes. Note that `AsyncEvent` triggers must be awaited. Args: args and kwargs: Optional positional or named arguments that will be passed onto the EventData object, enabling arbitrary state information to be passed on to downstream triggered functions. Returns: boolean indicating whether or not a transition was successfully executed (True if successful, False if not). """ func = partial(self._trigger, EventData(None, self, self.machine, model, args=args, kwargs=kwargs)) return await self.machine.process_context(func, model) async def _trigger(self, event_data): event_data.state = self.machine.get_state(getattr(event_data.model, self.machine.model_attribute)) try: if self._is_valid_source(event_data.state): await self._process(event_data) except Exception as err: # pylint: disable=broad-except; Exception will be handled elsewhere _LOGGER.error("%sException was raised while processing the trigger: %s", self.machine.name, err) event_data.error = err if self.machine.on_exception: await self.machine.callbacks(self.machine.on_exception, event_data) else: raise finally: await self.machine.callbacks(self.machine.finalize_event, event_data) _LOGGER.debug("%sExecuted machine finalize callbacks", self.machine.name) return event_data.result async def _process(self, event_data): await self.machine.callbacks(self.machine.prepare_event, event_data) _LOGGER.debug("%sExecuted machine preparation callbacks before conditions.", self.machine.name) for trans in self.transitions[event_data.state.name]: event_data.transition = trans event_data.result = await trans.execute(event_data) if event_data.result: break class NestedAsyncEvent(NestedEvent): """ A collection of transitions assigned to the same trigger. This Event requires a (subclass of) `HierarchicalAsyncMachine`. """ async def trigger_nested(self, event_data): """ Serially execute all transitions that match the current state, halting as soon as one successfully completes. NOTE: This should only be called by HierarchicalMachine instances. Args: event_data (AsyncEventData): The currently processed event. Returns: boolean indicating whether or not a transition was successfully executed (True if successful, False if not). """ machine = event_data.machine model = event_data.model state_tree = machine.build_state_tree(getattr(model, machine.model_attribute), machine.state_cls.separator) state_tree = reduce(dict.get, machine.get_global_name(join=False), state_tree) ordered_states = resolve_order(state_tree) done = set() event_data.event = self for state_path in ordered_states: state_name = machine.state_cls.separator.join(state_path) if state_name not in done and state_name in self.transitions: event_data.state = machine.get_state(state_name) event_data.source_name = state_name event_data.source_path = copy.copy(state_path) await self._process(event_data) if event_data.result: elems = state_path while elems: done.add(machine.state_cls.separator.join(elems)) elems.pop() return event_data.result async def _process(self, event_data): machine = event_data.machine await machine.callbacks(event_data.machine.prepare_event, event_data) _LOGGER.debug("%sExecuted machine preparation callbacks before conditions.", machine.name) for trans in self.transitions[event_data.source_name]: event_data.transition = trans event_data.result = await trans.execute(event_data) if event_data.result: break class AsyncMachine(Machine): """ Machine manages states, transitions and models. In case it is initialized without a specific model (or specifically no model), it will also act as a model itself. Machine takes also care of decorating models with conveniences functions related to added transitions and states during runtime. Attributes: states (OrderedDict): Collection of all registered states. events (dict): Collection of transitions ordered by trigger/event. models (list): List of models attached to the machine. initial (str): Name of the initial state for new models. prepare_event (list): Callbacks executed when an event is triggered. before_state_change (list): Callbacks executed after condition checks but before transition is conducted. Callbacks will be executed BEFORE the custom callbacks assigned to the transition. after_state_change (list): Callbacks executed after the transition has been conducted. Callbacks will be executed AFTER the custom callbacks assigned to the transition. finalize_event (list): Callbacks will be executed after all transitions callbacks have been executed. Callbacks mentioned here will also be called if a transition or condition check raised an error. on_exception: A callable called when an event raises an exception. If not set, the Exception will be raised instead. queued (bool or str): Whether transitions in callbacks should be executed immediately (False) or sequentially. send_event (bool): When True, any arguments passed to trigger methods will be wrapped in an EventData object, allowing indirect and encapsulated access to data. When False, all positional and keyword arguments will be passed directly to all callback methods. auto_transitions (bool): When True (default), every state will automatically have an associated to_{state}() convenience trigger in the base model. ignore_invalid_triggers (bool): When True, any calls to trigger methods that are not valid for the present state (e.g., calling an a_to_b() trigger when the current state is c) will be silently ignored rather than raising an invalid transition exception. name (str): Name of the ``Machine`` instance mainly used for easier log message distinction. """ state_cls = AsyncState transition_cls = AsyncTransition event_cls = AsyncEvent async_tasks = {} protected_tasks = [] current_context = contextvars.ContextVar('current_context', default=None) def __init__(self, model=Machine.self_literal, states=None, initial='initial', transitions=None, send_event=False, auto_transitions=True, ordered_transitions=False, ignore_invalid_triggers=None, before_state_change=None, after_state_change=None, name=None, queued=False, prepare_event=None, finalize_event=None, model_attribute='state', on_exception=None, **kwargs): self._transition_queue_dict = {} super().__init__(model=model, states=states, initial=initial, transitions=transitions, send_event=send_event, auto_transitions=auto_transitions, ordered_transitions=ordered_transitions, ignore_invalid_triggers=ignore_invalid_triggers, before_state_change=before_state_change, after_state_change=after_state_change, name=name, queued=queued, prepare_event=prepare_event, finalize_event=finalize_event, model_attribute=model_attribute, on_exception=on_exception, **kwargs) if self.has_queue is True: # _DictionaryMock sets and returns ONE internal value and ignores the passed key self._transition_queue_dict = _DictionaryMock(self._transition_queue) def add_model(self, model, initial=None): super().add_model(model, initial) if self.has_queue == 'model': for mod in listify(model): self._transition_queue_dict[id(self) if mod is self.self_literal else id(mod)] = deque() async def dispatch(self, trigger, *args, **kwargs): """ Trigger an event on all models assigned to the machine. Args: trigger (str): Event name *args (list): List of arguments passed to the event trigger **kwargs (dict): Dictionary of keyword arguments passed to the event trigger Returns: bool The truth value of all triggers combined with AND """ results = await self.await_all([partial(getattr(model, trigger), *args, **kwargs) for model in self.models]) return all(results) async def callbacks(self, funcs, event_data): """ Triggers a list of callbacks """ await self.await_all([partial(event_data.machine.callback, func, event_data) for func in funcs]) async def callback(self, func, event_data): """ Trigger a callback function with passed event_data parameters. In case func is a string, the callable will be resolved from the passed model in event_data. This function is not intended to be called directly but through state and transition callback definitions. Args: func (string, callable): The callback function. 1. First, if the func is callable, just call it 2. Second, we try to import string assuming it is a path to a func 3. Fallback to a model attribute event_data (EventData): An EventData instance to pass to the callback (if event sending is enabled) or to extract arguments from (if event sending is disabled). """ func = self.resolve_callable(func, event_data) res = func(event_data) if self.send_event else func(*event_data.args, **event_data.kwargs) if inspect.isawaitable(res): await res @staticmethod async def await_all(callables): """ Executes callables without parameters in parallel and collects their results. Args: callables (list): A list of callable functions Returns: list: A list of results. Using asyncio the list will be in the same order as the passed callables. """ return await asyncio.gather(*[func() for func in callables]) async def switch_model_context(self, model): """ This method is called by an `AsyncTransition` when all conditional tests have passed and the transition will happen. This requires already running tasks to be cancelled. Args: model (object): The currently processed model """ for running_task in self.async_tasks.get(id(model), []): if self.current_context.get() == running_task or running_task in self.protected_tasks: continue if running_task.done() is False: _LOGGER.debug("Cancel running tasks...") running_task.cancel() async def process_context(self, func, model): """ This function is called by an `AsyncEvent` to make callbacks processed in Event._trigger cancellable. Using asyncio this will result in a try-catch block catching CancelledEvents. Args: func (partial): The partial of Event._trigger with all parameters already assigned model (object): The currently processed model Returns: bool: returns the success state of the triggered event """ if self.current_context.get() is None: self.current_context.set(asyncio.current_task()) if id(model) in self.async_tasks: self.async_tasks[id(model)].append(asyncio.current_task()) else: self.async_tasks[id(model)] = [asyncio.current_task()] try: res = await self._process_async(func, model) except asyncio.CancelledError: res = False finally: self.async_tasks[id(model)].remove(asyncio.current_task()) if len(self.async_tasks[id(model)]) == 0: del self.async_tasks[id(model)] else: res = await self._process_async(func, model) return res def remove_model(self, model): """ Remove a model from the state machine. The model will still contain all previously added triggers and callbacks, but will not receive updates when states or transitions are added to the Machine. If an event queue is used, all queued events of that model will be removed.""" models = listify(model) if self.has_queue == 'model': for mod in models: del self._transition_queue_dict[id(mod)] self.models.remove(mod) else: for mod in models: self.models.remove(mod) if len(self._transition_queue) > 0: queue = self._transition_queue new_queue = [queue.popleft()] + [e for e in queue if e.args[0].model not in models] self._transition_queue.clear() self._transition_queue.extend(new_queue) async def _can_trigger(self, model, trigger, *args, **kwargs): evt = AsyncEventData(None, None, self, model, args, kwargs) state = self.get_model_state(model).name for trigger_name in self.get_triggers(state): if trigger_name != trigger: continue for transition in self.events[trigger_name].transitions[state]: try: _ = self.get_state(transition.dest) except ValueError: continue await self.callbacks(self.prepare_event, evt) await self.callbacks(transition.prepare, evt) if all(await self.await_all([partial(c.check, evt) for c in transition.conditions])): return True return False def _process(self, trigger): raise RuntimeError("AsyncMachine should not call `Machine._process`. Use `Machine._process_async` instead.") async def _process_async(self, trigger, model): # default processing if not self.has_queue: if not self._transition_queue: # if trigger raises an Error, it has to be handled by the Machine.process caller return await trigger() raise MachineError("Attempt to process events synchronously while transition queue is not empty!") self._transition_queue_dict[id(model)].append(trigger) # another entry in the queue implies a running transition; skip immediate execution if len(self._transition_queue_dict[id(model)]) > 1: return True while self._transition_queue_dict[id(model)]: try: await self._transition_queue_dict[id(model)][0]() except Exception: # if a transition raises an exception, clear queue and delegate exception handling self._transition_queue_dict[id(model)].clear() raise try: self._transition_queue_dict[id(model)].popleft() except KeyError: return True return True class HierarchicalAsyncMachine(HierarchicalMachine, AsyncMachine): """ Asynchronous variant of transitions.extensions.nesting.HierarchicalMachine. An asynchronous hierarchical machine REQUIRES AsyncNestedStates, AsyncNestedEvent and AsyncNestedTransitions (or any subclass of it) to operate. """ state_cls = NestedAsyncState transition_cls = NestedAsyncTransition event_cls = NestedAsyncEvent async def trigger_event(self, model, trigger, *args, **kwargs): """ Processes events recursively and forwards arguments if suitable events are found. This function is usually bound to models with model and trigger arguments already resolved as a partial. Execution will halt when a nested transition has been executed successfully. Args: model (object): targeted model trigger (str): event name *args: positional parameters passed to the event and its callbacks **kwargs: keyword arguments passed to the event and its callbacks Returns: bool: whether a transition has been executed successfully Raises: MachineError: When no suitable transition could be found and ignore_invalid_trigger is not True. Note that a transition which is not executed due to conditions is still considered valid. """ event_data = AsyncEventData(state=None, event=None, machine=self, model=model, args=args, kwargs=kwargs) event_data.result = None return await self.process_context(partial(self._trigger_event, event_data, trigger), model) async def _trigger_event(self, event_data, trigger): try: with self(): res = await self._trigger_event_nested(event_data, trigger, None) event_data.result = self._check_event_result(res, event_data.model, trigger) except Exception as err: # pylint: disable=broad-except; Exception will be handled elsewhere event_data.error = err if self.on_exception: await self.callbacks(self.on_exception, event_data) else: raise finally: try: await self.callbacks(self.finalize_event, event_data) _LOGGER.debug("%sExecuted machine finalize callbacks", self.name) except Exception as err: # pylint: disable=broad-except; Exception will be handled elsewhere _LOGGER.error("%sWhile executing finalize callbacks a %s occurred: %s.", self.name, type(err).__name__, str(err)) return event_data.result async def _trigger_event_nested(self, event_data, _trigger, _state_tree): model = event_data.model if _state_tree is None: _state_tree = self.build_state_tree(listify(getattr(model, self.model_attribute)), self.state_cls.separator) res = {} for key, value in _state_tree.items(): if value: with self(key): tmp = await self._trigger_event_nested(event_data, _trigger, value) if tmp is not None: res[key] = tmp if not res.get(key, None) and _trigger in self.events: tmp = await self.events[_trigger].trigger_nested(event_data) if tmp is not None: res[key] = tmp return None if not res or all(v is None for v in res.values()) else any(res.values()) async def _can_trigger(self, model, trigger, *args, **kwargs): state_tree = self.build_state_tree(getattr(model, self.model_attribute), self.state_cls.separator) ordered_states = resolve_order(state_tree) for state_path in ordered_states: with self(): return await self._can_trigger_nested(model, trigger, state_path, *args, **kwargs) async def _can_trigger_nested(self, model, trigger, path, *args, **kwargs): evt = AsyncEventData(None, None, self, model, args, kwargs) if trigger in self.events: source_path = copy.copy(path) while source_path: state_name = self.state_cls.separator.join(source_path) for transition in self.events[trigger].transitions.get(state_name, []): try: _ = self.get_state(transition.dest) except ValueError: continue await self.callbacks(self.prepare_event, evt) await self.callbacks(transition.prepare, evt) if all(await self.await_all([partial(c.check, evt) for c in transition.conditions])): return True source_path.pop(-1) if path: with self(path.pop(0)): return await self._can_trigger_nested(model, trigger, path, *args, **kwargs) return False class AsyncTimeout(AsyncState): """ Adds timeout functionality to an asynchronous state. Timeouts are handled model-specific. Attributes: timeout (float): Seconds after which a timeout function should be called. on_timeout (list): Functions to call when a timeout is triggered. runner (dict): Keeps track of running timeout tasks to cancel when a state is exited. """ dynamic_methods = ["on_timeout"] def __init__(self, *args, **kwargs): """ Args: **kwargs: If kwargs contain 'timeout', assign the float value to self.timeout. If timeout is set, 'on_timeout' needs to be passed with kwargs as well or an AttributeError will be thrown if timeout is not passed or equal 0. """ self.timeout = kwargs.pop("timeout", 0) self._on_timeout = None if self.timeout > 0: try: self.on_timeout = kwargs.pop("on_timeout") except KeyError: raise AttributeError("Timeout state requires 'on_timeout' when timeout is set.") from None else: self.on_timeout = kwargs.pop("on_timeout", None) self.runner = {} super().__init__(*args, **kwargs) async def enter(self, event_data): """ Extends `transitions.core.State.enter` by starting a timeout timer for the current model when the state is entered and self.timeout is larger than 0. Args: event_data (EventData): events representing the currently processed event. """ if self.timeout > 0: self.runner[id(event_data.model)] = self.create_timer(event_data) await super().enter(event_data) async def exit(self, event_data): """ Cancels running timeout tasks stored in `self.runner` first (when not note) before calling further exit callbacks. Args: event_data (EventData): Data representing the currently processed event. Returns: """ timer_task = self.runner.get(id(event_data.model), None) if timer_task is not None and not timer_task.done(): timer_task.cancel() await super().exit(event_data) def create_timer(self, event_data): """ Creates and returns a running timer. Shields self._process_timeout to prevent cancellation when transitioning away from the current state (which cancels the timer) while processing timeout callbacks. Args: event_data (EventData): Data representing the currently processed event. Returns (cancellable): A running timer with a cancel method """ async def _timeout(): try: await asyncio.sleep(self.timeout) await asyncio.shield(self._process_timeout(event_data)) except asyncio.CancelledError: pass return asyncio.ensure_future(_timeout()) async def _process_timeout(self, event_data): _LOGGER.debug("%sTimeout state %s. Processing callbacks...", event_data.machine.name, self.name) await event_data.machine.callbacks(self.on_timeout, event_data) _LOGGER.info("%sTimeout state %s processed.", event_data.machine.name, self.name) @property def on_timeout(self): """ List of strings and callables to be called when the state timeouts. """ return self._on_timeout @on_timeout.setter def on_timeout(self, value): """ Listifies passed values and assigns them to on_timeout.""" self._on_timeout = listify(value) class _DictionaryMock(dict): def __init__(self, item): super().__init__() self._value = item def __setitem__(self, key, item): self._value = item def __getitem__(self, key): return self._value def __repr__(self): return repr("{{'*': {0}}}".format(self._value)) transitions-0.9.0/transitions/extensions/states.pyi0000644000232200023220000000257214304350474023257 0ustar debalancedebalancefrom ..core import State, EventData, Callback from logging import Logger from threading import Timer from typing import List, Union, Any, Dict, Optional, Type _LOGGER: Logger class Tags(State): tags: Logger def __init__(self, *args: List, **kwargs: Dict[str, Any]) -> None: ... def __getattr__(self, item: str) -> Any: ... class Error(Tags): def __init__(self, *args: List, **kwargs: Dict[str, Any]) -> None: ... def enter(self, event_data: EventData) -> None: ... class Timeout(State): dynamic_methods: List[str] timeout: float _on_timeout: Optional[List[Callback]] runner: Dict[int, Timer] def __init__(self, *args: List, **kwargs: Dict[str, Any]) -> None: ... def enter(self, event_data: EventData) -> None: ... def exit(self, event_data: EventData) -> None: ... def _process_timeout(self, event_data: EventData) -> None: ... @property def on_timeout(self) -> List[Callback]: ... @on_timeout.setter def on_timeout(self, value: Union[Callback, List[Callback]]) -> None: ... class Volatile(State): volatile_cls: Any volatile_hook: str initialized: bool def __init__(self, *args: List, **kwargs: Dict[str, Any]) -> None: ... def enter(self, event_data: EventData) -> None: ... def exit(self, event_data: EventData) -> None: ... def add_state_features(*args: Type) -> Any: ... class VolatileObject: ... transitions-0.9.0/transitions/extensions/diagrams_graphviz.py0000644000232200023220000002620214304350474025300 0ustar debalancedebalance""" transitions.extensions.diagrams ------------------------------- Graphviz support for (nested) machines. This also includes partial views of currently valid transitions. """ import logging from functools import partial from collections import defaultdict from os.path import splitext try: import graphviz as pgv except ImportError: pgv = None from .diagrams_base import BaseGraph _LOGGER = logging.getLogger(__name__) _LOGGER.addHandler(logging.NullHandler()) class Graph(BaseGraph): """ Graph creation for transitions.core.Machine. Attributes: custom_styles (dict): A dictionary of styles for the current graph """ def __init__(self, machine): self.custom_styles = {} self.reset_styling() super(Graph, self).__init__(machine) def set_previous_transition(self, src, dst): self.custom_styles["edge"][src][dst] = "previous" self.set_node_style(src, "previous") def set_node_style(self, state, style): self.custom_styles["node"][state.name if hasattr(state, "name") else state] = style def reset_styling(self): self.custom_styles = { "edge": defaultdict(lambda: defaultdict(str)), "node": defaultdict(str), } def _add_nodes(self, states, container): for state in states: style = self.custom_styles["node"][state["name"]] container.node( state["name"], label=self._convert_state_attributes(state), **self.machine.style_attributes["node"][style] ) def _add_edges(self, transitions, container): edge_labels = defaultdict(lambda: defaultdict(list)) for transition in transitions: try: dst = transition["dest"] except KeyError: dst = transition["source"] edge_labels[transition["source"]][dst].append(self._transition_label(transition)) for src, dests in edge_labels.items(): for dst, labels in dests.items(): style = self.custom_styles["edge"][src][dst] container.edge( src, dst, label=" | ".join(labels), **self.machine.style_attributes["edge"][style] ) def generate(self): """ Triggers the generation of a graph. With graphviz backend, this does nothing since graph trees need to be build from scratch with the configured styles. """ if not pgv: # pragma: no cover raise Exception("AGraph diagram requires graphviz") # we cannot really generate a graph in advance with graphviz def get_graph(self, title=None, roi_state=None): title = title if title else self.machine.title fsm_graph = pgv.Digraph( name=title, node_attr=self.machine.style_attributes["node"]["default"], edge_attr=self.machine.style_attributes["edge"]["default"], graph_attr=self.machine.style_attributes["graph"]["default"], ) fsm_graph.graph_attr.update(**self.machine.machine_attributes) fsm_graph.graph_attr["label"] = title # For each state, draw a circle states, transitions = self._get_elements() if roi_state: transitions = [ t for t in transitions if t["source"] == roi_state or self.custom_styles["edge"][t["source"]][t["dest"]] ] state_names = [ t for trans in transitions for t in [trans["source"], trans.get("dest", trans["source"])] ] state_names += [k for k, style in self.custom_styles["node"].items() if style] states = _filter_states(states, state_names, self.machine.state_cls) self._add_nodes(states, fsm_graph) self._add_edges(transitions, fsm_graph) setattr(fsm_graph, "draw", partial(self.draw, fsm_graph)) return fsm_graph # pylint: disable=redefined-builtin,unused-argument def draw(self, graph, filename, format=None, prog="dot", args=""): """ Generates and saves an image of the state machine using graphviz. Note that `prog` and `args` are only part of the signature to mimic `Agraph.draw` and thus allow to easily switch between graph backends. Args: filename (str or file descriptor or stream or None): path and name of image output, file descriptor, stream object or None format (str): Optional format of the output file prog (str): ignored args (str): ignored Returns: None or str: Returns a binary string of the graph when the first parameter (`filename`) is set to None. """ graph.engine = prog if filename is None: if format is None: raise ValueError( "Parameter 'format' must not be None when filename is no valid file path." ) return graph.pipe(format) try: filename, ext = splitext(filename) format = format if format is not None else ext[1:] graph.render(filename, format=format if format else "png", cleanup=True) except (TypeError, AttributeError): if format is None: raise ValueError( "Parameter 'format' must not be None when filename is no valid file path." ) # from None filename.write(graph.pipe(format)) return None class NestedGraph(Graph): """ Graph creation support for transitions.extensions.nested.HierarchicalGraphMachine. """ def __init__(self, *args, **kwargs): self._cluster_states = [] super(NestedGraph, self).__init__(*args, **kwargs) def set_node_style(self, state, style): for state_name in self._get_state_names(state): super(NestedGraph, self).set_node_style(state_name, style) def set_previous_transition(self, src, dst): src_name = self._get_global_name(src.split(self.machine.state_cls.separator)) dst_name = self._get_global_name(dst.split(self.machine.state_cls.separator)) super(NestedGraph, self).set_previous_transition(src_name, dst_name) def _add_nodes(self, states, container): self._add_nested_nodes(states, container, prefix="", default_style="default") def _add_nested_nodes(self, states, container, prefix, default_style): for state in states: name = prefix + state["name"] label = self._convert_state_attributes(state) if state.get("children", []): cluster_name = "cluster_" + name attr = {"label": label, "rank": "source"} attr.update( **self.machine.style_attributes["graph"][ self.custom_styles["node"][name] or default_style ] ) with container.subgraph(name=cluster_name, graph_attr=attr) as sub: self._cluster_states.append(name) is_parallel = isinstance(state.get("initial", ""), list) with sub.subgraph( name=cluster_name + "_root", graph_attr={"label": "", "color": "None", "rank": "min"}, ) as root: root.node( name + "_anchor", shape="point", fillcolor="black", width="0.0" if is_parallel else "0.1", ) self._add_nested_nodes( state["children"], sub, default_style="parallel" if is_parallel else "default", prefix=prefix + state["name"] + self.machine.state_cls.separator, ) else: style = self.machine.style_attributes["node"][default_style].copy() style.update( self.machine.style_attributes["node"][ self.custom_styles["node"][name] or default_style ] ) container.node(name, label=label, **style) def _add_edges(self, transitions, container): edges_attr = defaultdict(lambda: defaultdict(dict)) for transition in transitions: # enable customizable labels src = transition["source"] try: dst = transition["dest"] except KeyError: dst = src if edges_attr[src][dst]: attr = edges_attr[src][dst] attr[attr["label_pos"]] = " | ".join( [edges_attr[src][dst][attr["label_pos"]], self._transition_label(transition)] ) else: edges_attr[src][dst] = self._create_edge_attr(src, dst, transition) for custom_src, dests in self.custom_styles["edge"].items(): for custom_dst, style in dests.items(): if style and ( custom_src not in edges_attr or custom_dst not in edges_attr[custom_src] ): edges_attr[custom_src][custom_dst] = self._create_edge_attr( custom_src, custom_dst, {"trigger": "", "dest": ""} ) for src, dests in edges_attr.items(): for dst, attr in dests.items(): del attr["label_pos"] style = self.custom_styles["edge"][src][dst] attr.update(**self.machine.style_attributes["edge"][style]) container.edge(attr.pop("source"), attr.pop("dest"), **attr) def _create_edge_attr(self, src, dst, transition): label_pos = "label" attr = {} if src in self._cluster_states: attr["ltail"] = "cluster_" + src src_name = src + "_anchor" label_pos = "headlabel" else: src_name = src if dst in self._cluster_states: if not src.startswith(dst): attr["lhead"] = "cluster_" + dst label_pos = "taillabel" if label_pos.startswith("l") else "label" dst_name = dst + "_anchor" else: dst_name = dst # remove ltail when dst (ltail always starts with 'cluster_') is a child of src if "ltail" in attr and dst_name.startswith(attr["ltail"][8:]): del attr["ltail"] attr[label_pos] = self._transition_label(transition) attr["label_pos"] = label_pos attr["source"] = src_name attr["dest"] = dst_name return attr def _filter_states(states, state_names, state_cls, prefix=None): prefix = prefix or [] result = [] for state in states: pref = prefix + [state["name"]] if "children" in state: state["children"] = _filter_states( state["children"], state_names, state_cls, prefix=pref ) result.append(state) elif getattr(state_cls, "separator", "_").join(pref) in state_names: result.append(state) return result transitions-0.9.0/transitions/version.pyi0000644000232200023220000000002114304350474021225 0ustar debalancedebalance__version__: str transitions-0.9.0/setup.py0000644000232200023220000000422614304350474016165 0ustar debalancedebalanceimport codecs import sys from setuptools import setup, find_packages with open('transitions/version.py') as f: exec(f.read()) with codecs.open('README.md', 'r', 'utf-8') as f: import re # cut the badges from the description and also the TOC which is currently not working on PyPi regex = r"([\s\S]*)## Quickstart" readme = f.read() long_description = re.sub(regex, "## Quickstart", readme, 1) assert long_description[:13] == '## Quickstart' # Description should start with a headline (## Quickstart) tests_require = ['mock', 'tox', 'graphviz', 'pygraphviz'] extras_require = {'diagrams': ['pygraphviz']} extra_setuptools_args = {} if 'setuptools' in sys.modules: extras_require['test'] = ['pytest'] tests_require.append('pytest') setup( name="transitions", version=__version__, description="A lightweight, object-oriented Python state machine implementation with many extensions.", long_description=long_description, long_description_content_type="text/markdown", author='Tal Yarkoni', author_email='tyarkoni@gmail.com', maintainer='Alexander Neumann', maintainer_email='aleneum@gmail.com', url='http://github.com/pytransitions/transitions', packages=find_packages(exclude=['tests', 'test_*']), package_data={'transitions': ['py.typed', 'data/*'], 'transitions.tests': ['data/*'] }, include_package_data=True, install_requires=['six'], extras_require=extras_require, tests_require=tests_require, license='MIT', download_url='https://github.com/pytransitions/transitions/archive/%s.tar.gz' % __version__, classifiers=[ 'License :: OSI Approved :: MIT License', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.3', 'Programming Language :: Python :: 3.4', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', ], **extra_setuptools_args ) transitions-0.9.0/conftest.py0000644000232200023220000000112314304350474016643 0ustar debalancedebalance""" pytest configuration - Tests async functionality only when asyncio and contextvars are available (Python 3.7+) """ # imports are required to check whether the modules are available # pylint: disable=unused-import from os.path import basename try: import asyncio import contextvars WITH_ASYNC = True except ImportError: WITH_ASYNC = False async_files = ['test_async.py', 'asyncio.py'] def pytest_ignore_collect(path): """ Text collection function executed by pytest""" if not WITH_ASYNC and basename(str(path)) in async_files: return True return False transitions-0.9.0/mypy.ini0000644000232200023220000000057214304350474016152 0ustar debalancedebalance[mypy] disallow_untyped_defs = True disallow_any_unimported = True no_implicit_optional = True check_untyped_defs = True warn_return_any = True warn_unused_ignores = True show_error_codes = True ignore_missing_imports = False [mypy-pygraphviz.*] ignore_missing_imports = True [mypy-graphviz.*] ignore_missing_imports = True [mypy-pycodestyle.*] ignore_missing_imports = True transitions-0.9.0/examples/0000755000232200023220000000000014304350474016265 5ustar debalancedebalancetransitions-0.9.0/examples/Graph MIxin Demo.ipynb0000644000232200023220000271227414304350474022262 0ustar debalancedebalance{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "### Table of Content \n", "\n", "- [The Matter graph](#The-Matter-graph)\n", "- [Hide auto transitions](#Hide-auto-transitions)\n", "- [Previous state and transition notation](#Previous-state-and-transition-notation)\n", "- [One Machine and multiple models](#One-Machine-and-multiple-models)\n", "- [Show only the current region of interest](#Show-only-the-current-region-of-interest)\n", "- [Example graph from Readme.md](#Example-graph-from-Readme.md)\n", "- [Custom styling](#Custom-styling)\n", "- [Enum states](#Enum-states)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "hide_input": false }, "outputs": [], "source": [ "import os, sys, inspect, io\n", "\n", "cmd_folder = os.path.realpath(\n", " os.path.dirname(\n", " os.path.abspath(os.path.split(inspect.getfile( inspect.currentframe() ))[0])))\n", "\n", "if cmd_folder not in sys.path:\n", " sys.path.insert(0, cmd_folder)\n", " \n", "from transitions import *\n", "from transitions.extensions import GraphMachine\n", "from IPython.display import Image, display, display_png\n", "\n", "\n", "class Model():\n", " \n", " # graph object is created by the machine\n", " def show_graph(self, **kwargs):\n", " stream = io.BytesIO()\n", " self.get_graph(**kwargs).draw(stream, prog='dot', format='png')\n", " display(Image(stream.getvalue()))\n", "\n", " \n", "class Matter(Model):\n", " def alert(self):\n", " pass\n", " \n", " def resume(self):\n", " pass\n", " \n", " def notify(self):\n", " pass\n", " \n", " def is_valid(self):\n", " return True\n", " \n", " def is_not_valid(self):\n", " return False\n", " \n", " def is_also_valid(self):\n", " return True\n", "\n", "\n", "extra_args = dict(initial='solid', title='Matter is Fun!',\n", " show_conditions=True, show_state_attributes=True)" ] }, { "cell_type": "markdown", "metadata": { "hide_input": true }, "source": [ "### The Matter graph" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "hide_input": true }, "outputs": [ { "data": { "image/png": "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jBo1ql2OT0RERERERET0Z/T09PD888/j9OnTyM3NRWBgIGJiYuQui7oJhRBCyF0EEVFXFRERgejoaGg0GrlLabPc3FysXLkSu3btQkhIiPQLDCIiIiIiIiIiOVVWVuKJJ57A999/j7Vr1+LFF1+UuyTq4jhChIioh9JoNFi7di0GDhyIU6dO4eDBg4iOjmYYQkRERERERESdgqWlJb799lusWbMGq1atwmOPPYaqqiq5y6IujIEIEVEPdPToUQQEBGDDhg1Yvnw5Ll26JC3iTkRERERERETUWSgUCqxatQpHjx7FsWPHMHz4cCQlJcldFnVRDESIqFtQKBR/uq1Zs6bd2tu9ezcUCgWOHTvW7mt5dKQbN25g6tSpmDBhAoYMGYKUlBSsWbMGxsbGcpdGRERERERERHRboaGhOHXqFCwsLBAcHIzDhw/LXRJ1QVxDhIh6rJycHFy8eBGXL19GdnY2cnJykJubC5VKhfLycmi1WpSXl0NfXx8WFhYwNzeHkZERbGxs4OjoiH79+qFfv37w8PCAv78/XF1d5e7SbTU2NuKdd97Bq6++in79+uH9999HWFiY3GUREREREREREbWKRqPBggULsHv3bnz66aeYPXu23CVRF2IgdwFERPdKTk4ODh06hEOHDuHkyZMoKSkBAHh4eMDV1RUuLi7w8fGBjY0NrK2toVAoYGVlhcbGRlRVVaGqqgp1dXW4efMmcnNzcebMGXzzzTcoKCgAALi4uGDcuHEYM2YMHnzwQTg5OcnZXcm1a9cwZ84cnDt3DqtXr8ayZctgaGgod1lERERERERERK1mYmKCHTt2wMnJCXPmzEF+fj4XW6c7xhEiRNStVVdX49tvv8Vnn32G6OhomJqaYvz48Zg4cSICAgLg5+cHpVJ5V22o1WqcO3cOv/76K2JiYhATE4Pq6mqEh4dj5syZmD59OszNzdupR3dOCIFPPvkES5cuRb9+/bBjxw4MGzbsntdBRERERERERNQRtm3bhueeew7PPPMMtm7dCj09rhBBf4yBCBF1S2q1Gu+99x42b96MqqoqTJ06FU888QTCwsJgamraoW3X1tbiwIED2LVrF3788UcolUqsWLECTz/9dIe33SQjIwNz587Fr7/+iueffx6vv/46jIyM7knbRERERERERET3yt69e/HYY49h8uTJ+Oqrr+7ZuRfqmhiI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yWSSwhOTySRVo3g8Hmnb8PBwn6BEDEmSkpJ85hMTExEfH88B+oiIiIioW7DZbPjmm298ApAzZ84AAPr164dx48YhIyMD48aNw7hx4ziWH/UaTqcT06ZNg9vtxqFDh6DRaORuEl0kBiJ0UXJzc/HWW2/h3XffRUVFBSZMmIBbbrkFN998M4xGo9zNIyIi6nZcLhfKyspQWloKs9kcdL6kpARWq9VnW4VCgeTkZBiNRhgMBhgMBp/7/vNERERERJfK7Xbju+++w4EDB5Cbm4vc3Fzk5+ejqakJBoMBGRkZmDJlCjIyMjB+/HgkJSXJ3WSiTtHU1IQbbrgBX375JQ4fPozBgwfL3SS6BAxE6JI0NTXh4MGD2LJlC9599104HA5kZmbixhtvxKJFixAXFyd3E4mIiHoch8OBsrIyqbrEe9676sRkMsFisfhsq1KppO66EhISkJKSgoSEBCQnJ0tVJ8nJyUhMTERERIRMZ0hERERE3YnZbMa3337rMxUUFMDj8SAuLk6q+BCnlJQUuZtM1GXuv/9+bNiwAbt27cLMmTPlbg5dIgYi1GHq6urw8ccf45///Cd27twJQRBwzTXX4NZbb8X8+fM52CwREVEnqK+vl8IRsQuv8vJy6X5JSQkqKipQWloKm83ms21CQoJPWJKUlASj0YjExESfIEWr1cp0dkRERETU0UpLS5uFH2fPngUAJCUlYezYsRg7diyuvPJKZGRkYMCAAfI2mEhGr732Gu688068+eabWLx4sdzNoQ7AQIQ6hdVqxfbt27F161b897//RXh4OK666irceOONuP766xEdHS13E4mIiPqcuro61NTUSF10Beq2q6ysDEVFRWhoaJC2UygUPl1zBequKzk5Gf369WPVCREREVE3UlpaKnV3JU5lZWUAAKPRiIyMDGlKT0/HoEGDZG4xUfexf/9+zJ49G+vWrcOf/vQnuZtDHYSBCHU6k8mEDz74AP/617+wf/9+REVFYd68ebjhhhswb948qNVquZtIREREXpqamlBRUYGKigqfChOTyQSTyYSysjKp+sTpdErbhYaGSlUn/l11+Vef8P8/ERERUcepq6tDXl4ejh07huPHj+Po0aM4evQorFYrwsLCkJaWJlV+iJNer5e72UTd1nfffYdp06Zh7ty5eOeddxASEiJ3k6iDMBChLlVdXY1PPvlEqhwJ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CAIefvjhTm2nnBwOB4YMGYL58+d3+H7F533BggUQBCHgNH369A49bmvi4+N9bomIiIiIqGswECEiIiIi6iJKpRL9+/fHzp07kZOTE3S9Z599Fv369euQY2o0GmRlZV30411BEAQ0NTWhqalJ1nZ0FQYiRERERETyYCBCRERERNRFQkND8cADDwBA0C6wLBYLNm7ciHXr1nVl02QVHR2NM2fOYMeOHbIcf9++fbjjjju67HgMRIiIiIiI5MFAhIiIiIioCy1duhQpKSn46KOPcPz48WaPP//887j22msxePBgGVrXt9x9991YvXp1lx83Li4OISEhDESIiIiIiLoYAxEiIiIioi4UFRWFtWvXQhAEPP744z6PORwOvPDCC/jd734XdPvGxka89957mD17NpKSkqBUKjFq1Chs2LDBp8up9evXIyQkBE6nE9nZ2dLg4eHh4W16XFRZWYl77rkHAwYMQGRkJOLj47Fw4UIcPXpUWmfbtm0+A5QXFBTgpptuQmxsrLSsqqoq4Pn4b1tXVyc9Vl9fjz/84Q9IS0uDSqVCTEwMfvrTn+Kjjz6Cx+Np+5PeRo899pjUDu9uxHbt2iUtj4uLC9r2c+fO4eabb4Zer0dsbCzmz5+PM2fONDtOWFgYDAYDAxEiIiIioi7GQISIiIiIqIstX74ciYmJ+Ne//oWTJ09Ky1966SXMmjULw4cPD7rtrl278Itf/AKzZs3CyZMnUVRUhOXLl2PNmjU+3Wzdd999EAQBarUaU6ZMkQYQb2xsbNPjAFBWVobx48fj/fffx9///nfU1NRg3759qKmpQWZmJg4dOgQAuO666yAIAhYsWAAAWLFiBe666y4UFRXh8OHDCAsLC3o+/tt6u/vuu/H888/jhRdeQHV1NU6ePIm0tDQsWLAAX375ZRuf7R9t377dJ7wICQnBSy+95LPOww8/LD0n3n7yk59AEARkZGS02PbVq1dj9erVKCkpwXvvvYe9e/filltuCdie+Ph4BiJERERERF2MgQgRERERURdTKpVYs2YNmpqa8Je//AUAUFtbi2effRYPPfRQq9vPmDEDDz74IAwGA+Li4rBq1Srceuut2LBhA2w2W4e188EHH8T58+fxt7/9Dddeey00Gg3S09Px7rvvQhAErFq1KuB269atw4wZM6BSqTBx4kQ0Njb6VFa01WeffYb09HTMnj0bSqUSiYmJePrppzF06NB272vBggVS6CNOv/71r9u9n5bccccdyMzMhFqtxtVXX4158+bhyJEjAatj4uLiEBsb26HHJyIiIiKiljEQISIiIiKSwV133YXY2Fi88847OH36NDZv3oxJkyZh9OjRLW43f/58fP75582WjxkzBg0NDcjLy+uwNm7btg2hoaGYP3++z/KkpCSkp6cjNzcXxcXFzbabMGFChxz/Jz/5CQ4ePIjly5fj8OHDUjdZBQUFmDFjRoccoyONHz/e536/fv0AAKWlpc3WDQ8Pb9Y9GRERERERdS6+AyciIiIikoFGo8Hq1avx+9//Ho888gj27duH7du3t7qd1WrFM888gw8//BDFxcWwWCw+j9fW1nZI++rr62G1WgEAOp0u6Ho//PADUlNTfZb5dzl1sV566SVkZmbizTffxFVXXQUAmDp1KlasWIHrr7/+kvf/4osvXvI+vPk/T5GRkQDgM7YLERERERHJhxUiREREREQyWbVqFXQ6Hf75z39izJgxGDduXKvb/PSnP8Wf//xn3HnnnTh16hSampogCAKeffZZAIAgCD7rh4SEtLi/YI9HRUVBr9cjPDwcDQ0NzbqbEqeZM2e28WzbLyQkBIsXL8aePXtgsViwbds2CIKAhQsX4m9/+1unHTc0NBRut7vZcv/w6VLs27cPd9xxR4ftj4iIiIiIWsdAhIiIiIhIJjqdDmvWrIFOp8PDDz/c6voejwfZ2dlISkrCPffcg/j4eCnQcLlcAbdRqVQ+X+4PGzYML7/8cpseX7hwIRobG5Gdnd1sv08++SQuu+wyn0HYO5per0d+fj4AICIiArNnz8a2bdsQEhKCTz75pNOOazQaUVJS4rPMZDLhwoULnXZMIiIiIiLqfAxEiIiIiIhk9Ic//AEWiwWTJ09udd2wsDDMmDEDJpMJTz/9NKqqquByufD5559j06ZNAbe58sorcerUKRQVFeHQoUMoLCzE1KlT2/T4E088gcGDB+P222/Hzp07YbVaUVNTg82bN+NPf/oT1q9f3+njYKxcuRLHjx9HfX09Kioq8NRTT0EQBMyaNavTjjlnzhyUlpbixRdfhMPhwJkzZ3DvvfciISGhQ/afm5uLuLg4ZGVlsTstIiIiIqIuFCL419QTEREREVGH0mg0cDqd0v25c+di165dQdcP1I3VCy+8gLvvvhtVVVV4+OGHsWPHDphMJsTExOCaa65BUlIS/vrXvwIAMjIykJOTA+DHAcjvvPNOfPPNN4iJicEDDzyAu+66S9pva4/X1NTg8ccfx7Zt21BUVAS9Xo+xY8di7dq1uPrqqwEAhw8fRmZmZrM2t+WjxrZt25qNB7Jo0SK8/fbbOHbsGDZu3Ij9+/fj/PnzUCgUGDp0KJYtW4Zly5a12h2Y//MOAImJiTCZTC1uZ7Vacd999+GTTz6BxWJBRkYGnn32WaxcuRK5ubkAgHXr1uG6665rdt4PPfQQHnvssWZtmzdvHj7++GMAQE5ODubOnYuhQ4ciOzsboaG8To2IiIiIqCswECEiIiIiIiIiIiIiol6PlyIREREREREREREREVGvx0CEiIiIiIiIiIiIiIh6PQYiRERERERERERERETU6zEQISIiIiIiIiIiIiKiXo+BCBERERERERERERER9XoMRIiIiIiIiIiIiIiIqNdjIEJERERERERERERERL0eAxEiIiIiIiIiIiIiIur1GIgQEREREREREREREVGvx0CEiIiIiIiIiIiIiIh6PQYiRERERERERERERETU6zEQISIiIiIiIiIiIiKiXo+BCBERERERERERERER9XoMRIiIiIiIiIiIiIiIqNcLB/Cy3I0gIiIiIiIiIiIiIiLqTP8fENoWh8HDTtkAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "transitions = [\n", " { 'trigger': 'melt', 'source': 'solid', 'dest': 'liquid' },\n", " { 'trigger': 'evaporate', 'source': 'liquid', 'dest': 'gas', 'conditions':'is_valid' },\n", " { 'trigger': 'sublimate', 'source': 'solid', 'dest': 'gas', 'unless':'is_not_valid' },\n", " { 'trigger': 'ionize', 'source': 'gas', 'dest': 'plasma', \n", " 'conditions':['is_valid','is_also_valid'] }\n", "]\n", "states=['solid', 'liquid', {'name': 'gas', 'on_exit': ['resume', 'notify']},\n", " {'name': 'plasma', 'on_enter': 'alert', 'on_exit': 'resume'}]\n", "\n", "model = Matter()\n", "machine = GraphMachine(model=model, states=states, transitions=transitions, \n", " show_auto_transitions=True, **extra_args)\n", "model.show_graph()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Hide auto transitions" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "hide_input": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABOgAAACnCAIAAAAkHPQUAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzdeTzU+f8A8PcY5jAYV3J0OIpyLEUklIrtIrIpFW1boS1HqU1bqTaErUSl+1fbXapNomyrKETFbgcloVxDCGNcw4z5/fH+7mdnHWMwzND7+UePmfd8jvfnM5PPvOb9/rxeOA6HAxAEQRAEQRAEQRBEVIkJuwMIgiAIgiAIgiAIwgsKXBEEQRAEQRAEQRCRhgJXBEEQBEEQBEEQRKSJC7sDCDLE1NTU5OTk1NbWMplMYfcFEIlEOTk5PT09eXl5YfcFQRAEQRAEQQYKClwRhC85OTlnz56Ni4vLy8sTdl+6oK2tbW9v/8MPP+jp6Qm7LwiCIAiCIAgiYGiqMIL0ID8/38HBQV9fPzY21tHR8f79+6WlpS0tLRwR0NLSUlpaev/+fUdHxzt37ujr6zs4OOTn5wv7nCEIgiAIgiCIIOE4qBwOgnSjpaXll19+OXTo0Pjx43/99de5c+ficDhhd6pbHA4nISFh69atHz582LRp0+7du0kkkrA7hSAIgiAIgiACgAJXBOlaZWWlo6Pju3fvAgMD161bJy4+NObVs1isEydOBAQETJw4MSYmRklJSdg9QhAEQRAEQZD+QoErgnQhJyfHzs5OXFz87t27EyZMEHZ3ei03N9fe3p7FYsXFxaG7XhEEQRAEQZChDgWuCNJRSUmJmZmZlpZWTEyMgoKCsLvTR1++fHF0dCwoKHj27Nno0aOF3R0EQRAEQRAE6TsUuCLIfzQ1NVlbWzc0NDx9+lRWVlbY3ekXBoNhYWGBx+NTUlKkpKSE3R0EQRAEQRAE6SOUVRhB/mPt2rVFRUX37t0b6lErAEBaWjo2NpZGo3l4eAi7LwiCIAiCIAjSd2jEFUH+lZycPHPmzPj4+Pnz5wu7LwJz7969BQsWJCUlWVtbC7svCIIgCIIgCNIXKHBFkP9hs9mTJ08eO3ZsbGyssPsiYPb29h8/fnz58uVQyY2MIAiCIAiCINzQVGEE+Z+rV6++e/fu4MGDwu6I4IWHh+fl5V27dk3YHUEQBEEQBEGQvkAjrgjyP5aWlqqqqtHR0cLuyIBYsmRJeXl5SkqKsDuCIAiCIAiCIL2GRlwRBAAAKioq0tPT3dzchN2RgeLq6vr06dPPnz8LuyMIgiAIgiAI0msocEUQAABITk7G4/GzZ88WdkcGio2NDR6PT05OFnZHEARBEARBEKTXUOCKIAAA8Pr1ax0dHUlJSWF3ZKBISkrq6Oi8efNG2B1BEARBEARBkF5DgSuCAABAeXn56NGjeS9z4MABHA6Hw+FGjRo1OL3i7dq1a7A/JBKJn+VHjRpVXl4+0L1CEARBEAT5ejx79iwgIMDGxkZVVZVMJuOQ7snIyIwfP37x4sXHjh0rLS3t7alGyZkQBAAAli5d2t7efuPGjR6XNDIyqq6uxv6zNTQ0TJo0SUdHJy4uTrBd4nPLNjY2qampLS0tPW7Q2dlZTEzs+vXrgusjgiAIgiDI14jD4Vy+fDk0NDQnJ0dDQ2PmzJn6+vqKiop8Did8nerr68vKyv76669Hjx41NTXZ2dnt3bv3m2++4XN1VNQRQQAAgMPh4HC4vq3Y3t7e3t4+EF0S7JZxOPRDFYIgCIIgSH9lZWX5+Pg8e/bMzc3t/PnzxsbGwu7RENPa2nrnzp0DBw5MnjzZ09MzMDBQXl6+x7XQVGEE6RdpaemCgoJ79+4NoS0jCIIgCIIgfRMaGmpqaiouLp6ZmXnu3DkUtfYBgUBwdnbOyMj4v//7v9u3b+vq6qanp/e4FgpcEQRBEARBEARBetDa2vrDDz/s3Lnz0KFDycnJRkZGwu7R0IbD4b7//vvc3FxTU9NZs2ZdvXqV9/IocEWQvouJicFuN+e+yzQ3N9fR0ZFKpUpKSpqamsbFxdnY2MDF1q5dGxQUBB9bWlrC5RMSEmCLoqIin1umUChWVlapqamDebwIgiAIgiBfJzabvWjRot9///3u3bs+Pj59u8UM6UxGRub27dvr169fsWLF6dOneSyJ7nFFkL5zdHTkcDiOjo537tzBGvPz883NzSkUys2bN83NzYuKijZu3Pj69WsikYiFoDt37pSSksJWmTt3LofDMTEx+fTpE/9b/vjx45YtWwoKCgbjUBEEQRAEQb5imzZtSk5OTk5OnjJlirD7Mtzg8fiDBw9KS0tv2LBBU1Nz9uzZXS6GRlwRRMC2b99eV1cXGRlpa2srJSWlp6d35cqVxsZGgW/ZwMDg3LlzqMINgiAIgiDIgDpx4kRUVNT58+f7FrWKWklF0bR79+7Fixc7Ozvn5+d3uQAKXBFEwBISEgAAc+bMwVpGjBgxYcKEgdiyqqqqtrZ2/7eMIIJ16dIlbK479+QC0dG37xBdFk/etm0bdrBTp04dgM4iCIIgwkSj0X766aft27cvXry4b1vYsmULh8MxNDQUbMeGGRwOd/bs2bFjx3p5eXW5AApcEUSQmEwmg8EgkUgdvqzLyckN0JaVlJT6uWUEGSDHjx/ncDgNDQ3waUNDw/jx4+3s7ITbK6jL7xA99tDFxYXD4XSYwhQaGsrhcDgcDh6PH6juIgiCIMKzdetWJSWlHTt2CLsjwx+JRIqKinrw4EFsbGznV9E9rggiSEQiUVpamsFgNDQ0cEeYlZWVHZYUExNrbW3lbqmrq+vDlmtqagTRcQQBAAApKSkjI6MBSvo1cEWPBUX0e9jZs2fP4uLi0tPT3759W1tby53LDelAWlp65MiRhoaGs2bNWrhwIZqwhyAIP168eHHlypVbt25xz7VBBs60adOWLVu2efPmBQsWdPhFGAWuCCJg8+bNi46OTkhIwOaTVFRU5OXldVhMRUWlrKwMe1pRUVFcXCwjI9OrLVdXV79//16g3UeQgQJLEwu7F7yIfg8xHA7n8uXLoaGhOTk5GhoaM2fOXLBggaKiIvpexUN9fX1ZWdlff/21bds2Hx8fOzu7vXv3fvPNN8LuF4IgIu3IkSOTJk1atGiRsDvyFfnll1+0tbXv3btnb2//nxc4CIJwOM7Ozs7OzvwsaWhoqKamxt3i4OAAAGhuboZP8/Pz5eXl1dTUHjx4wGAw3rx5M3fu3LFjxxKJRO614PT9I0eOMBiM/Pz8JUuWqKmpKSgo8L/lnJycOXPmKCkpddgyj2P87rvv+FkS+WpRKBQLC4v+b+fixYvgn6nCoqzzf2d+zJ49u8v/dHg83szMTBD96kFmZua0adPwePyqVasyMzMHYY/DDJPJjI6ONjU1xePx69ev//Lli7B7hCCIiGpubqZQKMeOHeOxzP79+2FUpaam9vz581mzZklJSZHJZGtr69TUVO4lO1x02trarl27ZmNjM3LkSBKJpK+vHxERwWazsQVaWloCAgJ0dHTIZLKcnJydnd2dO3dYLBaHw7l9+zYWzX369GnJkiVSUlLy8vKurq41NTUfP360s7OTkpJSVlZeu3ZtfX09/zsVETNnzly2bFmHRhS4IsMWm82OjIxMSEj4+PFjj/8h+QlcsT9M0I4dO7j/agAAVqxYAZd8//69o6OjjIyMpKTktGnTHj9+3Pmbbl1d3dq1a1VUVMhksqWl5YsXL4yNjeF2/P39e9wymUyeMmVKXFwcdrvdmjVrejxGKSkpEomkqalpY2Pj4eGxe/fukydP/vnnn9nZ2dx/1JAuVVZWent7jx07VkJCQlFRcdGiRX///TeHw6mtreV+swIDAzkcTltbG9YCfy/gfang/7JXXV29adMmTU1NCQkJWVnZuXPnPnr0CL7E/bHJzc11dnaWl5eHT6uqqvjsAAaPx/d47N3pHLhy9w37LYbHJZkHgZxwiPs7RJc95HA47969c3BwgP+dLS0tU1JShBu4hoSEiImJTZ8+nfdbgPSovb39t99+U1FRGTly5NOnT4XdHQRBRNGDBw8AACUlJT0uaWhoSKFQzM3Nnz592tDQ8OLFi2+++YZAICQnJ3Mvwx243r17FwCwb9++mpqaqqqqw4cPi4mJwRQM0Nq1a6lU6oMHD5qamioqKrZs2QIASEpKwhaAIxxOTk6ZmZkNDQ0XLlwAAMybN8/BweHvv/9mMBgnTpwAAGzatIn/nYqI8PBwOTm59vZ27kYUuCLD2ZgxY+DXUAKBMGHCBGdn54CAgMuXL2dmZnaI0/gfce2b7r7pDiZnZ2crK6vDhw/7+/uvWLHCyspKQ0ODQCBgX9aVlJQmT568cOFCLy+vkJCQixcvPn78uKCgoKWlRbg9FwU0Gm3s2LEjR46Mj49nMBjZ2dkzZswgkUjY9925c+eKiYnl5+dzr2Vubn7lyhX4mJ9LRY+XvfLycg0NjZEjR969e5dOp79//97JyQmHw50+fRrbCLyMzZgxIykpqbGxMSMjA4/HV1VV8dOBLkdcezz2zrobce0wiaDHSzIPgjrhvCdQfPjwQVZWFpvm8Pr162+//VZdXV0ogSuTyVy1ahUej4+MjOxwLUf6jE6n29vbk0gk7JODIAiCCQkJGT16ND9Lwmx/3D8pvn79GgBgaGjIvUyHwNXa2pp7I66urhISEnQ6HT7V0NCYNm0a9wLa2tqdA9f4+HisRU9PDwDw+PFjrEVDQ0NHR4f/nYqI9PR0AEBhYSF3IwpckeHM0dFRTOzf1NliYmISEhI4HA4+HTFihJWV1fr16w8fPjx9+vQFCxYM3HdBEQlcuwzOa2pqsrOz//zzz5MnT+7evdvDw8PGxkZXV1dSUhI7dXJycrq6up3HaRsaGgb/QITi+++/BwBcvnwZaykvLycSicbGxvBpYmIiAGD9+vXYAqmpqWPGjGlra4NP+blU9HjZW7VqFQDg6tWr2AItLS2qqqpkMrmiogK2wMvYvXv3OhwCPx3oMnDt8dg74zNw7fGSzIOgTjjvwNXZ2RkAcPPmTWyBsrIyIpE4+IEri8WaP3++jIxM53cW6ScWi+Xn54fD4U6dOiXsviAIIlo8PT1nzZrFz5Lwp+cOjaqqqgAAGo2GLcP7/hQ4+wn7XfjHH38EALi7u6enp3c5HQlesz5//oy12NraAgAaGxuxFktLS2lpaf53KiKqq6sBAA8fPuRuRIErMpz98ssv3COKXRIX/1+KMkVFxVevXg1QT0Q5cOWhpqYmMzMzNjb25MmT/v7+bm5uNjY2cJIq75i2oKCgtbV1gA5EKKhUqpiYWIffIydPnsw9g2jSpEmSkpLV1dXwqYODQ3h4OI9tdr5U9HjZo1KpAIAO8wXc3NwAAOfPn8f2CwDAutGrDnQZuPJz7B3wGbj2eEnmTSAnnHfgKi0tDQBgMBjcyxgYGAx+4Ort7S0pKfn8+fMB2j6ye/duCQmJxMREYXcEQRAR4uLismjRIn6W7DIoNTIyAgC8fPmyy2Xq6uoCAgL09fVlZWW5v5pif4ja29svXLgwe/ZsSUlJSUnJOXPm/P7779zb73DN4nA4c+bM4b7Th8PhzJgxg/urRY87FRHwDqBbt25xN6KswshwZmho2KHkTGccDkdVVVVdXV1ZWXkg0kteu3Zt2bJl8DEOh1uzZs2ZM2cEvhd+sFgsIpHYq1Xk5OSMjY2xm2+51dbWFhYW0mi08vJy+KCwsDAxMbG4uJjFYmGra2pqqqioqKqqcj8YM2YM9nvBkMBkMul0OgAAxo0dfPjwAdbV2Lx5s6ur67FjxwICAvLy8p48eQLjN4hOpx88ePD27dulpaXcpY+ampq4t9bhQgIAUFJSotFolZWV8vLydDqdRCLBaAozcuRIAEBFRQV3I4VC6bAdPjvQt2Pvm6ioKHNz8/Pnz8Nbta2srDw9PfnP3CiQE84Dj+LJnfOED6gTJ05ERUVdv359ypQpg7nfr8ru3bvz8vKcnZ2fP38+btw4YXcHQRCRwGaz+f/GAjO9YTP7wD/VEJWUlLpc3t7ePiUlJTIyctmyZYqKijgcLiIiAt6PChfA4XBubm5ubm5tbW3JyckHDhxwcnI6ePCgn59fn4+ox52KCHjasa+UkFg3CyOi5cCBAzgcDofDobpz/GhoaHj69Onx48ejo6N5LCYhIUEkEnfu3Jmfn29gYAC/nQuci4sL929FwopaAQB0Or1zUNRnMKa1t7f38PAIDQ29cOECHGhta2vDxmlDQ0NtbGzk5OQKCwtPnTq1Zs0aW1tbLS0tCQkJeXl5ExMTe3t7T0/PsLCwCxcuJCYmFhYWdvgLJSKIRKKsrKy4uDg2DZXbzJkz4WJLly4dPXr00aNHmUzmwYMH3d3duSNMe3v7wMBAd3f3vLw8OCn90KFDAIAOlwp42eNuwS57RCKRSqW2tLQwGAzuBT5//gwAUFZW5n0U/HSA+3Lbq2PvG3hJTkxMrKuri4mJ4XA4Tk5O4eHhfK4ukBPOAyye3NLS0tDQwN0+yMWTaTTaTz/9tH37dqwOFjIQcDjc2bNnx44dC1O+IwiC9FZLS8uLFy+wp2/evKHRaIaGhioqKp0XZrPZaWlpysrKPj4+I0aMgNff5uZm7mVkZWVzc3MBABISEra2tjExMTgcLj4+vs895GenogwFrkMDTCgC739DOispKYmLiwsODnZ2dtbW1qZSqRYWFj///HNJSUmXVQ3FxcVxONzChQvz8vL27NlDJpM1NDSGfUHU9+/fa2pqDsKO+I9pyWRyTk7OqVOnVq9e3WNMy2azB6Hz3XFycmKxWGlpadyNYWFhY8aMwYJtcXFxX1/fysrKgwcPXrt2zcfHB1uS/0sF78seHI3kvmgxmcyHDx+SyeQ5c+bw6D+fHZCUlMQmKejo6Jw6dYrPY++bfl6SBXLCeZs3bx4AICEhAWsZ/OLJW7duVVJS2rFjx2Du9OtEIpGioqIePHgQGxsr7L4gCDL0UKnU7du3p6enNzY2ZmZmurq6EgiEyMjILhfG4/HW1tYVFRX79++vrq5ubm5OSkqCSYC5rVu37vXr10wms7Ky8tdff+VwOLNmzepzD/ncqejq7wRkZBB1nj0vqKKLQ0tbW1t2dnZ0dPTu3bvt7OzgPEkAgIqKip2dnb+///nz57Ozs2HdCwsLC+4PPBy4NjIySktL497mn3/+CfhLdz5ElZSUAAD+/PNPYXeka62trWVlZZmZmdHR0REREf7+/s7OzhYWFpqamng8Hnv7YEjs7Ozs4+MTGhoaHR2dkpJSUFDQh9sje+vz589aWlqampr37t2rq6v78uXLiRMnJCUlr1+/zr1YfX09lUrF4XArV67ssAV4pfn111+rqqqampoePXoEs15zvymGhoZUKnX27Nn8ZBWur6/HsgpzJ5XpfMcL/x2YO3culUotLi5++vSpuLj427dv+T92bnze40qlUmfMmPHq1auWlpbPnz/v2bMHABAUFMTzrfiP/p/wXpVl5l08eSDucX3+/DkOh+twUxMyoJYvXz5u3LhB+KuCIIjo4z8/CLygvH37ds6cOdLS0mQyecaMGVhBu84lFTkcTlVVlaen5+jRoyUkJEaOHLlq1apt27bBBWD6w5cvX3p6ek6cOFFSUlJeXn7q1KmnT5+Gc4hg0l3uDXL/6g0ACAkJSUlJ4W7ZvXs3PzsVHQCADt80UOA6lHy1gWtdXV1KSkpERISHh4eFhQWZTAYASEhI6Orqurm5hYaGxsbGVlZWdrmur68vlp9JXFxcSUnp/PnznbMH81NgekiLioqiUChDsbANk8nsLqbFUkYTCAQVFZUuY1oB1tT+8uWLn58fzE01YsSIb7/9tssfAn766ScAQOdEX/xcKnhf9qDq6uqNGzdqaGhISEhQqdQ5c+ZgOfc6XMY6/DTJTwdyc3OtrKwoFMro0aOjoqJ6e+wY3nVcwT+liXlckvnXtxPeh7LMPRZPHojA1c3NbfLkyYLdJsLbhw8fcDhcbGyssDuCIIjw9TZwHej+fFU6B644jojdiYvwYGRkVF1dXVpairVISUkZGRmlpqYKsVcDgUajZWVlZWVlvX37Nicn5927dxwOR1ZWVk9PD+YK0tPT09fX5yfV0Llz59auXYvH48XExH7++eeffvqJu8oLt5UrV+bk5GRlZQn6aETC5MmTDQwMzp8/L+yOCFJra2t1dTWWHYr7wadPn9rb2wEABAJBQUGhQ3Yo+EBdXZ27WpIo6Px/fIi6dOmSm5vb8ePH161bJ+y+DB5xcXETE5OMjAxBbbClpUVRUXH//v0w/TIPubm527ZtS0pKamtr09fX37VrV0RExMOHDwEAMCEci8W6devWmTNn3rx5Q6fTx40bt3btWm9vb+y/AJPJDA4Ojo6OLi4uJpFIFhYW7u7uCxYs4J7y8PWYNWuWsrLylStXhN0RBEGEbMmSJQAA3jlToGFzBRcdOBzu+vXr8C2AhlJizyEhJiYGS4n56dOnrVu33rt3j0AgzJ8///Dhw3Q63dvbOzk5WUpKys7OLjw8nDuVSFVVVWBgYGxsLI1Go1KpVlZWu3btgnm0Oztw4AAcZ0hLS4O3b+HxeNFMbNOj1tbWDx8+YJHq33///eXLFwAANoYGI9W+3Z8JC2AuXrz4119/5Z3aytvb28zM7Pbt2/wnNR0qbt++/fLly5MnTwq7IwJGIBBUVVVVVVU75z1mMplfvnyBoSwWzaalpdFoNFjvFHQT08LHysrKohbTIl+hlJSUxsZGe3t73ovl5+ebm5tTKJSbN2+am5sXFRVt3Ljx9evXRCKxpaUFLpOQkODi4rJv377o6Gg2m3316tWNGzeWlpZiI89eXl43bty4ceOGpaVlfX39gQMHHBwckpKSrK2tB/QYRRPM7MX5b3ZQBEEQRMiEMO77FYB3STk5OWVmZjY0NFy4cAEAMG/ePAcHh7///pvBYMDboGHuaYhGo40dO3bkyJHx8fEMBiM7O3vGjBkkEol3ycEhOlW4pqYGTv11c3PT1dWFv+hLSUkZGxu7ublFRESkpKQ0NDQIZF8tLS3p6el8Luzq6qqpqdn55sAhraWlZfz48W5ubsLuiKhoaWkpKChISUmJjo4ODQ318fGBP46oqKhgX1KJRKKmpqaFhYWzs7O/v39ERER0dHRmZmZZWVlvJ7L2yrCZaMRdlqZzZdphxt/fHztYwU4VDgkJGT16dI+LOTs7AwBu3ryJtVRWVkpKSnLfiHv37l1ra2vutVxdXSUkJLDyvBoaGtOmTeNeQFtbOykpqT/9H7rgrPvCwkJhdwRBECHjZ6pwl/evIv0H0FThweHo6Hjnzp34+Pj58+fDFn19/ZycnMePH0+fPh22aGpqEggEmFETALBq1arz589fvnx5+fLlsKWiokJdXV1fXz8zMxO2DNGpwiwWq7i4GM7ChcrLywEAKioqenp6urq6cPbvxIkThT7GRaPRdHR0Nm7cGBgYKNyeCFBAQEBERMT79+9VVVWF3RdR19LSQqPROsw6xh7AZYhEopqaWufitCoqKtyhb29hcyigHTt2BAUFCeCQhiweZ3L37t0wjdOwt27dug8fPsAZvzzIyMgwGAwGg8Fdb9bY2DgnJwcbce0MfuSePn1qbm4OAFi/fv3x48fd3d1Xr149ZcqUr3OGMObLly+KiooPHz7sT/ZOBEGGAf6nCiMCJ4ipwqWlIDYWPHoEXr0Cnz+D/5YTFCEkEpCTA3p6YOpUYGcHzMwGvwsmJibYY1VV1ZycHO4WNTW1V69eYU9jYmLExMTs7OywFmVlZT09vaysrNLS0qFVvrW+vv7169fw9tSsrKy///67qalJXFxcW1tbT0/Pw8PD2NjY1NQUywYsOlRVVffv379hwwZDQ8PhUTLx5s2b+/bti4qKQlErP0gkEpwt3PmlLmNaWKentrYWW11VVbXLmLbH879ly5YtW7YI/pCGLPSjKgCATqdTqVTeyzCZTAaDQSKRuKNWAICcnFyHTR08ePD27dulpaV1dXVYe1NTE3wQFRVlbm5+/vx5mHrKysrK09Nz+N03wSd42rlPFIIgCCJ0vQlcX78Gu3aBuDggKQlmzQJubkBNDcjIDFjf+qelBVRXg+xscPkyCAoCenpg2zawYgUYxPtVZLhOjpiYGB6P504LhMfjYfIYAACTyaTT6eCfi2UHHz58EPHAFeZSwiLV3Nzc9vZ2KpWqr69vbGy8cuVKOKwKswGLuHXr1r19+/b7778fO3bslClThN2dfnnx4sX333+/YcOGrypBzgDhEdM2Nzd3HqFNTEwsKCjAvvjCmLZzNKulpSUrKzu4h4IMGWw2W1y8h8s0kUiUlpZmMBgNDQ3csWtlZSX3Yvb29ikpKZGRkcuWLVNUVMThcBEREfB2FbgADodzc3Nzc3Nra2tLTk4+cOCAk5PTwYMH/fz8BH5cog+e9iGaNgJBEGS44i9wrakBAQHg5ElgbAyuXgUODuCf+iJDQ1YWOHoUrFoFjh8Hhw+DTnlchI5IJMrKyjY0NDQ3N/f4NYWbUPJGtLW15eXlYZHqs2fPqqqqAFcuJTgBWFdXd4imtTh06FBBQYGNjc21a9fmzZsn7O700f37911cXKytrQ8dOiTsvgxzZDK5VzHt27dv8/Pz4W9VoPuYdty4cT2OtiEIAGDevHnR0dEJCQnYPJGKioq8vDxsATabnZaWpqys7OPjgzU2Nzdzb0RWVjYjI2PChAkSEhK2traWlpYUCiU+Pv7rDFwRBEEQEcRHjJSeDhYtAmJi4P/+D6xcOZgjlgJjbAzOnQO+vsDXF5iaguBg8E81P9Hh5OR09uzZtLS0GTNmYI1hYWFRUVGFhYXdRbOSkpKtra3wsY6OzubNmz08PATet7q6uuzsbCzrb3Z2NpPJJBAI48aNMzY23rFjh56e3qRJkxQUFAS+a6HA4/G3b9/29PS0t7cPDw/39vYeWhE4h8M5cuSIn5+fm5vbyZMnv/J71YSrDzHthw8f6uvr4TLdxbTjx4+XEdnZLsig27dvX2Ji4saNG6lUqrm5+adPn3766SdlZeWKigq4AB6Pt7a2fvTo0f79+3/44c5xkxEAACAASURBVAcKhZKRkQFzBHJbt27d4cOHdXR06HQ6rMGL7vBEEAQRNUMiwc0A6SlwvXoVrF4NbG3BpUuiOyuYT0ZGIDkZHDkC/PzA+/fg5EmRGjcOCQl5/Pjx6tWrjx49Om3aNDabfePGjb179547d47HGOzkyZPT09NLSkpKS0sLCwutrKwE0hmsjCqMVAsLCwEAcnJyurq6FhYWPj4+xsbGEyZMGMYREYFAOHfunI6OzqZNm27duhUZGdldXSJR8/LlS19f39TU1ODg4G2i9wMNguEnpuUOa7OyskpKShj/pBXoHNPCx2PGjOEusoV8DbS0tNLT0/39/RcvXsxisYyMjEJCQnbv3g3nwkDXr1/fuXPnkSNHduzYIS8vP2/evOXLl4eGhtra2hobG2dmZj5+/Pj48eMuLi5FRUUkEklbW/v06dNr1qwR4nEhCIIgCDeegevp08DTE2zaBH79FfAIUVpaQGoqyMoCHz+Cujrwz32bg01aGowcCQwNgbU16C7rDw4HfHzA+PHAxQVUVoLYWF7H1ScZGRkwQyMAgEwm79ixw9HREbtVEofDhYSEWFpaYhEmDoeDGTKVlJSeP38eHBzs5eVVUlIiKys7adKkO3fu2NjYgP9mHMXhcFjG0YiICHd394kTJ8rLy0dGRk6cOLEPfWYwGHl5eVjW35cvXzY2NoqLi48ZM0ZXV9fNzc3Y2HjKlCnKysr9PDlDzrZt22xtbX18fExMTNzc3DZs2MCdXkvUZGZmRkVFXbx40czM7Pnz551LmyJDBY+Ytra2tnPS46ysrOLi4oaGBriMnJxclwmixo4d2yF/DzJsaGtr3759m7ulvLxcUVERe6qoqNh5iDUkJAR7bGho2HkBBEEQBBEd3ZfDefgQzJsHtm8HPKoOvHgBDh8Gv98CTc3tinJsRbl2MkFYc4lxrW14eiO+vBK0c4CZGVi/Hri4gO7GKl+8ANbWYM0acPjw4HZTJMAZiVikCnMpycjIGBgYYPVpJk+ezJ1K6mvG4XAuX74cGhqak5Ojrq4+c+ZMAwMDRUVFEokk7K6B5ubm6urq7OzspKSkT58+6evr+/v7r1ixYmjNbUYEosuYlkajFRUVNTY2wmW6i2nV1dUpFIpw+490xmcZhoqKCl1d3c+fP0tISMCWT58+jR8/3tXV9dy5cwPey2GqcxkGBEG+QoIth1NVVRUYGBgbG0uj0ahUqpWV1a5du+CcvpiYGCyR+8ePH/39/f/44w88Hm9ubh4ZGamlpQU6Vc4DAODxeCyNHJ8bz83NDQgIePjwYU1NDVyL+1dOkdL573A3gWt+PjA1BXPngsuXuw5EaTSwdSu4coU1VrV5qgHzm/HtsiIxOQ3X2kZ4/4n0PIf46j3Q0QFHo4C1ddeL3rwJli4FUVFguCdcZbFY79+/xyLV58+fw2yTMJcSFqmKQhlVEff8+fO7d+9mZGTk5OTU1tbyKJA4aEgkkpycnJ6e3tSpU+3t7U1NTYXdI0QUdRnTFhYWlpSUtLW1wWW6i2k1NDTQb1jCwn/gqqKi8sMPP/zyyy8KCgrZ2dne3t75+fkvXrzoctwe4QcKXBEEAQINXMvLy83NzVtaWs6ePTt9+vSioqINGzY8e/bs0aNH2GxNR0fHO3fuODg4+Pv7f/PNN+np6QsXLtTX13/+/Dm2nS7vceV/4zNmzNizZ4+pqembN28sLCwqKioUFRVnzZr16tWr+Pj4qVOn9v9IBYXvOq5eXmDsWHD2bNdR64kTYMtmNoXc4O7ENNIZmK72EYcgwTQYzzQYj6+skf79EWHmTODiAk6fBp0nyC1eDLZvBz/9BBYuBMOrxCWdTn/z5g13fZqWlhYJCYnx48cbGxv7+fnp6uqam5uL7O8rIsvU1BRFhshQJCcnB3/g6PxSbW1thxHawsLCxMTE4uJi7EdcOTm5zgmiNDU1R48ejQ3xIUKkrKycmJgYFRU1ffp0Go0mJydnY2Nz5coVFLUiCIKIjp9//rmoqOjy5cvz588HAOjp6V27dk1dXd3b2zszM5N7ybVr18Jo08bGZsGCBTdv3qyurub9vZ3/jfv7+1tbWwMAzMzMsAt9e3s7h8MR/QrqXQWud+6ABw9AcjLoPBOSzQabNoGjRxvnWTTNmcaR6E0Z2MHFVpKvW7eYkF0gczkeZzENFxcPRo/uuNDOneD6deDvDy5eFEYfBQbLpQQj1Xfv3nE4HJhLydjY2MPDQ09PT19fn0gkCrunCIKIFjk5OWNj4y7viO5PTDtmzJheVfZC+mn27NmzZ88Wdi8QBEG+RtnZ2QYGBtjTDRs2HD16tPNiMTExYmJidnZ2WIuysrKenl5WVlZpaemoUaOwdiw5DgBg9OjRAAAajcY7cOV/412OwSQnJ/M8RFHR6YsFmw22bAHLloHp0zu+1NoKHB04jx7Vr13EnDRhcPrXT636WrVbVsqevImfYgIePgIdBhyIRBAWBr77Dvj4AK6PiIhrbW398OEDFqn+9ddfcJI6VkYVTgBGv7UjCNIfKKZFEARBkB7p6+v3OFbJZDJh/fYuK7R/+PCBO7bkXoZAIAAA2nnmvu3Vxod0SotO3x7i40FBAbh/v4tlPTw4jx/X+S5vUx9KE2vZCtQaP1fZ4zfE58/DvcgESkr/eXnRIjBpEjh6FJw/L6QO9qy2thZLpJSVlfX+/Xs2my0tLa2tra2rq7tr1y5jY+NJkyYN6Q8igiBDSI8xLXdYm5OTk5iYWFRUxGazsdW7jGnHjh07jItsIchQdOnSJTc3N/iYQqFg2ctFB5auRk1NrbS0lM+1rl27tmzZMgAAkUjkJ2PFs2fPgoKCsrKyGhoa9PX1ly5d6ubmJi8v35+eD4S+nQ0hEuDbt23btrCwMPjYzMwsIyNjAPrbd0QiUVZWtqGhobm5uZ+/3nZOwCnAjYu4Tsl4rl4FM2eCceM6toeEgIsX67+3H1pRK8QhEeke37W3NoN580BTU8eX164Ft24BJlMYXesCi8XKycm5cePGnj177O3tVVRU5OXlrayswsLCysvLbWxszp49m52dXVdXl5mZeeHCBV9fX0tLSxS1IggiCmBM6+zs7OvrGxoaGh0dnZqaWlBQ0NzcXFZWlpmZGR0dvXv3bhsbGzKZnJOTc+rUqdWrV9va2mppaZHJZFVVVRMTkyVLlvj6+oaFhd24cSM1NbWwsBALehFhaWhoGD9+PPc8NIR/A3T2Bu1NOX78OIfDwaJWkfowbNmyhcPhGBoacjf22EMXFxcOh8PnBPu0tDRLS8v29va0tLTy8nJfX19/f/+tW7fy2cPBPF1dng1RJsC3LzQ0FN6lKbI/gDo5ObFYrLS0NO7GsLCwMWPGYJOV+CEpKdna2gof6+jonDp1SoAbF3H/Dco5HPDHH2DXro5LZWWBnTsZ381mGnQKaIeIdgq5zuM7+YMXcYGBgKtyHQAA2NuD9etBSgqwsRFK3+rr61+/fo0lUvrrr7/g7yXa2tp6enqenp7GxsZmZmZKHcaKEQRBhg4JCQlVVVVVVdXO47Stra3V1dWdi9PGxcV9+vQJzo8iEAgKCgqdkx6rqqqqq6ujjOiDgMPhtLe3d5iu1mVyS6SzLs+eyG5WZPfLP8H28MyZMywWKyIiQkNDAwCwdOnSJ0+eMPke8BD90yVqhusZCwkJefz48erVq48ePTpt2jQ2m33jxo29e/eeO3euV8OkkydPTk9PLykpKS0tLSwstLKy6v/GRTOrcGf/PZLCQlBbC/5Jmvw/HA7w9W3TGt1sPWTuAu0SW1mhYYGl9MGD4IcfgLb2vy+MGgVGjQJ//TVogSvMpYRFqjCXEpVK1dfXNzY2Xrlypa6uromJiSiUCUUQBBloBAKhVzFtWloajUb7/PkzimkHk7S0dEFBgbB7MVQN0NkT1psi+h8GwfYQ3r5YUVExfvx42BIVFSWsznwNhusZU1JSev78eXBwsJeXV0lJiays7KRJk+7cuWNjYwMAyMjIwOrWkMnkHTt2BAUFYbOCJ02atGDBgri4OABARESEu7v7xIkT5eXlIyMjJ06c2NuNg38+1RgWizUEswp//AgA6DhP+PJlkJ7O2PYD6KoyztDSPH2y5NPXeD8/EBf3nxe0tf937AOgra0tLy8Py6X08uXL6upqwJVLCVZS1dXV7TxnHUEQ5GvGI6ZlMpllZWUd6tPCmLaiogJefYlEory8PAxlO4S1KioqQvyTW19fLyMjI6y9IwjSK05OTufPn/f29k5NTZXqXF4RQfgmLy9/8ODBgwcPdn5p6tSpnePGLiNJHR2dJ0+e9H/j3LrcoAj670/R9fUAAPDfhFScfcEtZgasUSMHsVcDRkyMsXAGiI8HOTn/aadSQV2doHZSW1ubmpoaGRm5cuVKExMTaWlpfX19d3f3xMREFRWVnTt3pqSkMBgMGo129+7dPXv2wNgVRa0IgiD8IxKJmpqalpaWzs7O/v7+kZGR0dHRmZmZNBqtubm5oKAgJSXl4sWLvr6+FhYWAIDExMSwsLClS5eamJioqamRyWQtLS1LS8slS5Zs27YtMjLyxo0bWVlZNBptEH5yDg8PNzU1jYuLG8yft6uqqnx8fNTV1QkEwogRI5ycnF6+fAlfsrS0xP3D1dUVAGBjY4O11NXVxcTEYE9hKpQDBw7gcLjGxsa0tDTYPrwzgvRH57MHffnyxc/PT0tLi0AgyMnJzZs3LykpqfMqnz59Wrp0qaysrIKCgp2dHTYS1eVmZWVlcZ2IiYlhaW94fAz6czhMJnPXrl0TJkyQlJSUl5e3t7ePjY3t8db0uro67n4GBQUBAFgsFtayePFi2HL9+nVbW1tlZWUymWxgYBAZGcljHml3Jzw3N9fR0ZFKpVIoFCsrK/6nuGtpacnIyLx69WrhwoX8ZHLqsTN9O11Qb88GP7vj8VHkYai8fchw8t/AFd68y33tefYM9y63aUYXqSOHqFY9LfZIRXDu3H9axcVBXzN/sNnswsJCGILa29traWnBXEq//PJLYWGhhYXFqVOnsrOzm5qacnJysFxK6Bc7BEGQAcIjpm1qasJiWg8PDziQC2PaJUuWwJhWUlKyu5hWUD0sKSnJzMy0t7fX19ePjo4ehFu5ysvLp0yZEh0dfezYsZqamuTk5JqaGnNz8/T0dABAamrqy5cvKRSKoaHhyZMnAQDx8fFmZmZXr17lcDiysrKOjo4cDsfBwQHbIEypQqFQLCws4AQz7vwfs2bNUlBQELWsnsLS+ewBACoqKqZMmXLlypXIyMjq6upnz55JSkrOnj37zJkzHVbZuHHjxo0by8rKrl+//ujRI5hMtbvNAgAYDAbnH3v37gUABAcHw2IYvD8G/TkcLy+vw4cPHzly5MuXL+/evZswYYKDg0NKSgrvTcnKynI4nLlz54qJieXn5+/cuRMAIC4uzuFwzM3Nr1y5cvPmTQBAQkKCi4vLrFmz3r17V1JS4uHh4efn5+/v36se5ufnm5ubZ2Zm3rx58/Pnz8eOHQsMDORnPmpSUpKpqenevXsdHBySkpKcnZ2xj7qdnV2HIG1ATxfU27PR4+54fxR5GBJvHzLM9PT7aFxcu5ICa4zyoHRmUOAA85txkndiwIEDfdsAg8HIy8vD6tO8fPmysbERy6Xk5uZmbGw8ZcoUZeVhdNIQBEGGBRKJBKcNd36ppaUFFqTlnn6cmJhYUFBQ98+UHBKJpKqq2rmQj6amppycHP/dKCwshGOtubm5Li4uo0aN2rx587p164hEokAOs7Off/65qKjo8uXL8+fPBwDo6eldu3ZNXV3d29s7MzMTAGBoaHju3LklS5asXLny5s2bnp6es2fPdnFx6dvu2tvbh8TtUkL0888/f/z48erVqzB1qoyMzJUrVzQ1NX18fOzt7UeO/Hea29q1a+HNaTY2NgsWLLh582Z1dbWiomKPu4AZvFetWvXzzz9jO+X9Meizhw8f6unp2draAgDIZPL+/ftjY2P5XHfLli0JCQnh4eHYjaNpaWllZWXOzs7YMtbW1thReHt7P3/+PDIyMiAggP8p99u3b6+rqztz5gzspIGBwblz53qseF9dXb1o0SIrKytfX99169bNnz8/Li7Ozc3t8uXLYmJicXFxHz9+1NPTYzAYvcpk25/TBXp/Nnjvjv+PYpdE+e1Dhp+eAte0tFatUT0sM9S06qhL/pkBamoAfwW4aDQalkgpKysrNze3vb1dRkbGwMBAT0/P2dkZ1jOE9zojCIIgQxGPmLa5ublDgigY0+bn58Oa7+CfmLZzgigtLS1ZWdkOGywqKoIP4FhraWmpn59fWFiYv7+/h4dHr64m2dnZBgYG2NMNGzYcPXq082IxMTFiYmLc5SWUlZX19PSysrJKS0vhcJyzs/OOHTuCg4MtLS3l5eXPnj3Lfzc6SE5O7vO6X4nbt28DABYsWIC1EInE2bNnX7x48Y8//li5ciXWPmXKv6kxR48eDQCg0WjdBa7YjyzPnj37/vvvp0+fDofQIX4+Bn0zd+7c48ePe3h4rF69esqUKXg8/v3793yuO3v27EmTJv3222979+5VUFAAAOzfv3/jxo3Y5HM7O7sOlVEMDQ0vXbqUk5Nj3iGfaPcSEhIAAHPmzMFaVFVVtbW18/LyeKx17tw5Op2+YsUKAACRSLxz587s2bOvXbsmLS0Na5AkJydbWlr2tv5Kf05XH84G793x/1Hskii/fcjw00Pgynn3lmWhPzhdGTQs1REAAJCbC6ZN6+JVFuv9+/dY1t/nz59XVlaCf3Ip2dvb+/v7Gxsbo1xK/OCnrvSQK5bdne6qtEdHRy9dupRAIPCfOv/r8fVUHkeGNDKZ3F1MW1tbW1ZWVlRUVFpaWlZWVlxcXFpa+vz58+Li4ubmZriMrKzsqFGjxowZM2rUKDU1tbFjx3aYdQwHJ8vLyzdv3vzLL7/4+Phs2rSJ+t98E93R19fvcWCTyWTCALvLbX748AGLWAIDAxMTE58+fXr+/HmUkHngwHeERCJJS0tzt8PRrYqKCu5G7neNQCCAf37v4KG4uNjBwWH06NG///47XAX05mPQB1FRUebm5ufPn4elNa2srDw9PRctWsTn6ps3b3Z1dT127FhAQEBeXt6TJ08uXryIvUqn0w8ePHj79u3S0tI6rowkTU1NfG6fyWQyGAwSidThRi0lJSXekQ98FRt1lJKSun///owZM06fPi0tLf3rr79GRkZu376dz25g+nO6+nA2eOyuVx/F7ojs24cMPz1clnA1te3SlEHox7HEZyPX7xu5fp/R9iP8rxWT+RauNdonjP+1OFKSAABQXc3dGJWfv3LlSkNDQ0lJSX19fU9Pz4cPHyorKwcEBDx58qSurg7mUgoNDV25ciXKpcQnfgph9632tMjqUKUdADBixAjsX8zQPUDB+qoqjyPDkpycnL6+/oIFCzw9Pffu3fvbb78lJibm5uY2NTXB+2n//PPPyMhIV1fXUaNG0Wi02NhYLy+v7n7GYrPZtbW1QUFBqqqq27Ztw0rM9xORSJSVlRUXF29ra+N0MnPmTGzJ5ORkOp1uYGCwfv36V69e9bhldCnsGyKRSKVSW1paGAwGd/vnz58BAP281YjBYNjZ2bW1tcXFxclzzSzj/2PQBzgczs3NLTExEaby4nA4Tk5O4eHhfK6+dOnS0aNHHz16lMlkHjx40N3dnTuOsre3DwwMdHd3z8vLg7PQDx06BLpJuNolIpEoLS3d0tLCfXUGANTU1PBeEQ4hvnv3DmuRl5d/8OCBpqZmeHi4ubk5hULhnhPLp/6crj6cDR67E8hHUWTfvq8NzJmHw+H68yOUiOvp99TWVs6gfAtcb2P2+dh2vVFK3I2NzNapu4+7Hovubi1HE93Px7Zb6aj3al8ccTwAAPw3L9y9iorPnz/PnTv3t99+y87OZjAYL168OH36tJeXl5WVFZ+/fCOCMpi1p6WkpCwtLQdu+10GrqJZXHugTwWfRPPkIEhvwXFaGxublStX+vv7nzx58u7du5mZmU+fPuW9IpvNbmpqCgsLi4uLe/PmDfwG2U9OTk4sFistLY27MSwsbMyYMVimmY8fP65Zs+bWrVuxsbFkMtnBwaGqqor3ZiUlJbHoWkdHB06eRPgBx7vi4+OxFiaT+fDhQzKZzD0fsrfYbLaLi0tubu6tW7e0/ylZv3jx4piYGMDfx6BvZGVlc3NzAQASEhK2trYwMSz30fEmLi7u6+tbWVl58ODBa9eu+fj4cB9RWlqasrKyj4/PiBEj4G8l2HQG/s2bNw/8M+MUqq6u7nGCLnybDh06VFtbizWqqKgkJibKysq+ePEC5t/ubWf6fLr6djZ4767/H0WRfftE39SpUwU4hsHPcNFQJ9ITgTgc0M7htA9Kdod4S8s//vgjLCxs+fLlenp6KK2/cMHa0/fu3RN2RwSgy8B1OB2gwKGTgwxvvGfFS0hIwDm6ioqKysrKJBJJIIFrSEiIlpbW6tWr79+/T6fTa2pqTp48uXfv3gMHDsDrXUNDg6OjY0REhK6urrq6+s2bN2k02uLFi9va2nhsdvLkyXl5eSUlJenp6YWFhVZWVrAdZRXuUUhIiIaGxsaNG+Pi4mDSx+XLl5eXl0dGRvaYDoeHTZs23bt379SpU9bW1l3ulPfHoD/WrVv3+vVrJpNZWVn566+/cjicWbNm8b+6h4cHlUrduXOno6Ojmpoa1o7H462trSsqKvbv319dXd3c3JyUlHTixInedm/fvn3y8vIbN278888/Gxoa3r596+rq2mOJBzMzs23bthUVFVlaWt67d6+xsbGpqSktLW3r1q0UCkVOTi4wMPD8+fO97Qzo6+nq89ngsTuBfBRF8+1D+k9EhjQwIh24SpEIz/euv7JhqbA7giB9p6ioiMPhOgSuCIJ8tYqLizsECfAuRDExMS0tLRcXl+PHj2dnZ1dVVU2bNm38+PHffPNN/3eqpKT0/PlzR0dHLy+vESNGTJgw4ffff79z586SJUsAAF5eXtLS0q9fv3ZwcMjOzq6urra2tm5ra3vy5AmBQAgKCoJDNHfu3AEAkMlkWOsVABAREfHNN99MnDhx6dKlkZGREydOhO0sFgtlFcZ0efaUlZVfvHixbNkyHx8fBQUFU1PTxsbGxMREd3d3AEBGRgb3KrDQCA6Hg3fyT5o0yc7OrvNms7Kyjhw5AgD44YcfuAts3rp1C/aE98egP4fz+PHjCRMmuLi4yMvLT5w4MSEh4fTp0726+VNaWtrDw4PD4WzevLnDS9evX/f09Dxy5IiqqqqGhsaFCxeWL18OALC1tTUxMYHTI1+9elVWVobD4Xbu3NllD7W0tNLT06dMmbJ48WIlJaVVq1Z5e3sbGBgwmUwcDrd27druOhYSEhIXF6eurv7999/Lysqqqan5+/ubm5vn5ubGx8eTyeRVq1bB89zlqLXAT1dvz0aPu+P9UeSTyL593Wlqajpx4sSXL196uyIiXLj/XFeio8HSpYC7BYejr1nENJ44OL2Zte9MTUPzy33evVprceSVZwUlJYd51bDqQGn9PnD9OsD+UsMH0d3OSf5qMZnM4ODg6Ojo4uJiEolkYWHh7u6+YMECPB4fFBQUEBAAALCwsIBloBMSEuBcDgUFhWquW4iNjIyqq6sTExM3b96cmpra1tZmZmYWFBRkYWHRYRk4EBETE4OlKGhubiaRSNwtnz592rp167179wgEwvz58w8fPkyn0729vZOTk6WkpOzs7MLDw7GbK1gs1q1bt86cOfPmzRs6nT5u3Li1a9d6e3vDAQ0sMxAGj8djF56qqqrAwMDY2FgajUalUq2srHbt2mVkZNTduYLJmY4fP75u3boOLykoKLi5uUVERMCnnQ+Q96nm/R5xb+3jx4/+/v5//PEHHo83NzePjIzU0tLClvzy5UtwcPCdO3dKSkooFMrUqVO3bt0K72vifSq6VFdXx13/IzAwcOfOnSwWS0JCArZ89913N2/e5P0WQLzfffg4Nzd327ZtSUlJLBZr8uTJISEhe/bsSU1N7VwLXlxc3MTEBA31ICIrICAgODhYTEyMzWaTyWRTU1Nra+tp06ZNnTq1Q3EIGE5Eo2uTMOBwuOvXr/cqohuWeFzaEEQ08fM1oLa2Vl5eHo/H29raurq6Ojg4dDd+O6B/h6dOnaqoqBgXFyfAbXJ/p+o/KSkpIyMj+D1/8HX+OyzIEddWFjss7onFLyfH+v6qsyXc9Xj0H68/sNv/DYNrG5t33Uw03XVslHeo9ubwZUevpeUVdbe1+6/yYOKlkev3Mdv+/QL9oeLL9ydujvM7qL5x/8KDF58VlAjwEJAOeBSt3rlzJ6w+jy08d+5cDodjbGzceTsNDQ3r16/fvn17WVnZkydPampqZs2a9fjx4y532rn2NHeLn5/f1q1bKyoqIiIiLl26tGLFio0bNwYGBpaXl+/Zs+fMmTO7d+/GVuRd9hreDEChUCwsLODgABaqCaRKO2bEiBHcI66CLUfOT5160FOFcR6nojuo8jiC9A2Hw3FxcYmIiPj7778ZDEZycvKePXu+/fZb/ksaIgiCIP3HZrMfPHjg5uamqKi4dOnS2NhYQaXEGyAsFuv69eu2trbKyspkMtnAwCAyMrLHnCBVVVU+Pj7q6uoEAmHEiBFOTk4vX76EL8Hxbej9+/dLlixRUFCAT7dt24bD4RobG9PS0mCLKNxHKcjAddv1P84kvdi35Nv3B/xSd3mOH6mw8sSNZ/nF8NXK+sZvQ8/9npkT7Pztu/2b7vuvIhMkvou8fDntZZdbm2eo/fnY9rnfaHM3fqyqXbD//Kvi8v9zd8oJ8w1bNif8Xuqn6tout4D0H1a0mkwmjxw5cv/+/Viyh16h0+n79u2zsLCQkpIyMTG5dOlSa2urr69vHza1Zs0aY2NjCoXi5uamp6d3//59Pz8/IyMjKSkp0T7GogAAIABJREFUT09PDQ2NDvdGwrLXcnJyioqK3t7ey5cvj4yMrK+v570XWKU9PDx8/vz5UlJSsEo7h8Px9u7ddABIUVERZibkQSCnGtapp1AosE79ixcvsKFvWGE8IiLCzs5ORkZGW1v7ypUrKioqPj4+/bmDbsuWLe3t7dy5ELurPN7bt4AbrDweGRlpa2srJSUFK4+Xl5f3udsIIkRBQUFXrlzx8vIyMjJCSbCRIeHHH3/E4XDolkJElMFAC4fDsdls/teCiY6ZTObt27cdHR3l5eXd3Nzu3r3bz3RlA6S3gwGgp5EY7tECT0/P9evXl5SUZGRk4PH4PgxpDAJBBq4puZ90VEbMmKhBkhAfIUPZ7TRbS+nfPOzBMUnFX+qCFtvaGoyTJhG1lORPrHYcKSO1PfpBVX0jn7vYdyeZ3twS5Gw7Y6IGhUiYqKoUudL+M72h5zWRPpk7d+7Tp089PDwyMjLgH4L37993mfKBNxKJZGZmhj01MDBQVVV99epVH2IPExMT7LGqqmqHFjU1Ne4CiXZ2dklJSdyrGxoatrW15eTk8N4L7yrtve2zuLh4jz9TCeRUd1mnHj7trsJ4c3PzH3/80au9cMMqj2M3inSuPN63t4Bbd5XH+9xtBBGi1NTUQ4cO5efnC7sjCNIzV1dXrGROh2IkfMJ1b8+ePYLu75AnaqdL1PrDA1YVj8Ph9OF2IVgmqrGxMTo6euHChSoqKr6+vgKfIisuLs59Dp89exYfH8/d0mMJot4OBvA/EuPv729tbS0pKWlmZsZisRQVFQVwwIImyDHfWXqavz35a/Ple8unGRqNVcWL4Z7u+feOiHuv3gMAbPTHYS0EcbzVBPUbz7KT3hUuMTPgZxeP3hYAAGbq/lsFXpkqpaWkUFCJ7q4eEP0sKY6BEw+4W5SUlGg0WmVlpYqKSq82xT2bTkxMDI/HS0pKYi14PJ57ykTfyl4PaJX27gjkVHdXp14gFca7gyqPI0ivfP782c/Pz8/PT1NT08nJyc7OztLSEg29iqBDhw7BWx6Q/uBR5vTt27foLuIORO10iVp/BIXHlGD4UnV19fHjxw8fPiwpKamurp6bmzthwoT+77fDoGVv73G1s7PrUD7H0NDw0qVLOTk55ubmXa7CeySG+wutqakpv4chPIIccQ1dOvfo9wuLquu+i7yi5XfA5ei1ey//V2GplcWub2YSJcSlSATuVUZIUwAAlfyNuLay2A0trUQJcQrxPxtRlJbsbhWkn3A91cgWExPr8J+fOzjBwDiQW2VlJQBASUmp88ICxE/Za1ynCmwCr9KenJzcY8q7Hk91f/BZYbzzqeAHqjyOIL2C/QRTWFgYGRlpbW0tJye3bNmya9eudfn3E0EQBEEAAHQ6fdeuXQYGBnJycnCEFmbW7G4wAI5btLe3U6lU7nHdv/76CwDw4cMH7oW509aILEGOuOJwwNlM39lMv43d/jSv6Fhixg+nbv3y3ex1s80I4ngZMrG+mdnQ0sodu1YxGgEASjJ8nSmCOF6KRGhoaW1ktnLHrnVNvS5kjPBJVlY2IyNjwoQJsGi1paUlhUKJj4/38/ODC6ioqJSVlWHLV1RUFBcXd04x0tDQ8OrVK6wm8ps3b2g0mqGhYW+HW3uFu+w11ti57LWkpCQWe+vo6GzevNnDw8PJyens2bNpaWkzZszAlgwLC4uKiiosLByI29N7PNX9tGjRot9++y0+Pt7FxQW2dK4w3uWp6HHLsPL4li1bYOXxt2/fYi/x+Rb0aN68edHR0QkJCYsXL4Ytw6PyOPJ14v5yAKukMhiMGzduwKyVJiYmTk5O9vb2urq6QusiAgAAYNOmTUN3QAlBEB5gVuEuXyIQCK2trYqKisuXL3d2dj58+DAAQCDDrf1nb2+fkpISGRm5bNkyWG0xIiJi06ZN3Q0GwJGYhoaG5ubmvn137duQxsAR5Ijr+M0HP1R8AQBI4MVmTNQ4v84ZhwN/Zv8v8+d8Qx0AQGL2v3f1tLLYKbmfSBLiMydqdrnBzmbraQEAHr0txFpqGpryP6OBlwHEu0b2t99+S6PRjh492tDQUFBQ4Ovr2+UgKoVC8fLyevbsWWNjY2ZmpqurK4FAiIyMHNCe81n2evLkyXl5eSUlJenp6YWFhVZWVkCgVdqzsrIUFRUtLS17TPvWz+rtvPFTYbzLU8EPVHkcQfjX5UeXzWa3t7e3t7e/ePFi586denp66urqr1+/rqqqGqB8GFOnTu0w5QxBEOSrJSEhgcPhKBTKkiVLYmNj4RckS0tLYffrX9yDASNGjIAhZY+DAU5OTiwWKy0tjbsxLCxszJgx/FxcOgxpnDp1qq/dFwwBDxxtvXo/eMm340Yq1De3/PbkLw4HWOmMhS/tcJz59EPxzpt/UogE8/FjPtc3BMckfa5vOLB8/gj+RlwBANsXWj/O/RRw408ZEtFEU62spn7XrUQKkVDf3LGWY2+p3r3brqwMs78qKCiMGDFCUVERe6qgoKCoqDhixIgub3ocxh4/fnz8+HEXF5eioiISiaStrX369Ok1a9ZgCwQFBbW0tOzbt2/r1q3GxsaHDh0qKCjIysrC4XD+/v6KiopwDoOamlp4eLi/v/+LFy/YbLapqemjR49gHVfuCqI4HG7Hjh0mJibYvZ1kMnnFihVeXl7Y3H0ymbxjxw5HR0csEREOhwsJCbG0tMQCLRwOt3v37j179ly/fn3nzp1HjhzZsWOHvLz8vHnzli9fHhoaamtra2xsnJmZCQCIiIhwd3efOHGivLx8ZGTkxIkTwT9V2oODg728vEpKSmRlZSdNmnTnzh0bG5venkM4wZg7xx13qVJ4gJcuXerxVHcnIyOjw8kJCgrCfiGbNGnSggUL4uLiYIXxoKAgHx+f0tJSSUnJqVOnJiYmcsfGXZ4KfsDK4/v37++y8jiPt8DFxaXHd//SpUuw8ri/v//ixYvb2tr09fV379596NChhw8f4nC4NWvWwKI+CDL46uvr4W3YTU1NTCaztraWyWQ2NTVh7Y2NjUwms66urqWlpbm5mU6n854PjGVuLCoqAgDQ6fTU1NQ+pMRDEARBeiQmJsbhcAgEgoODw4oVK+bOnQtThIggOBjw6NGj/fv3//DDDxQKJSMjo8fBgJCQkMePH69evfro0aPTpk1js9k3btzYu3fvuXPn+BmJmTx5cnp6eklJSWlpaa+GNAYI7j+Dy9HRYOlSwN2Cw9HXLGIa8/X9Nae08reUrPQPJaU1dKKEuJaS/IpphsunGWGDzLWNzeH30xJe5ZXX1ZMJEsYaal62Uy111AEAxxKf/fL7Q2xTG+daGI1VWXXy36QI35nqH1u1EABQUFkTePtR6vuiNjZ7guqILQusTj58nvL+EwBg+TTDQ67/Jk3lQWn9PnD9OsCmAC1Zcr2kpHL58i9fvlRXV3/58qWqqgo+qK6ubmn5NyqWkJDA4lgsvoUt8vLycnJy8vLy8IHIfu6RAYKqtIsIfiqPI0hDQwO8+ae5ubmlpaWuro7JZDY2NjIYDCaTWV9f3117hwC1u+3LyMjAjGJSUlLwJnMymUwikWRlZVks1rlz57pbEWaYk5OTc3d3f/PmDYVCGUKF74cTXKfC9wiCDBtwqjAej7e1tXV1dXVwcOhuGhf8IyAif4erq6t37tx57969iooKOBigrKwcGhoKAOgwGAAAgCMZAICamprg4OCYmBhsJOann36CIzHcgx9Qh1nH79+/d3d3/+uvv+Tl5bdt27Z+/fp+HnKvdP47LMjAdQjpHLgCAEA3H8rGxkYYwVZVVWGRLdaCPeWObwEAUlJSHUJZeS7c7R0SvSJDFApcRQQKXIeluro6NptNp9Pb2toaGhrg6GVjY2Nra2t9fT2bza6trWWz2fX19a2trY2NjTDsbGhoaGtro9PpbDa7rq6OxWLB+JNHwEmhUOBNQSQSiUwmU6lUIpHYZfxJJBIpFIq0tDSRSJSRkZGUlCQSiXJycnBFHsfCYDA6JwIAAEhISLBYrOnTp2/YsMHR0VFCQkKkvjB9bVDgiiDDWFNT04ULF5ydnRUUFHgvOaB/hxHeOv8dFnyOmeGHQqFQKJQxY8bwXqy5ubmmpqa2trampqbzg6KiopcvX3758qW2trbDPDEJCQkYwcrJyVH/ISsrCx/IyMhg/1KpVDk5ORkZGVQ4QWT9+OOPP/74I4VC6Vu9O6TPtm3bFhYWJuxeIABGjwCA2tpaAACDwWCxWH2LLeHYJtwCjz1KSUlJSEhQqVQ8Hg/zgcNgUlJSUklJCWalFhcXl5WVxePxVCpVQkJCSkoKizPhkjIyMnDJQThFFAoFh/v3V2M4xCorK+vh4eHu7q6lpTUIfegt7hsccnNzAwICHj58CDN7V1VVKSoqVlVVBQYGxsbG0mg0KpVqZWW1a9cuIyMjuAqTyQwODo6Oji4uLiaRSBYWFu7u7gsWLMDj8UFBQQEBAQAACwsLWDIxISFh3rx5AAAFBYXq6uoOe//06dPWrVvv3btHIBDmz59/+PBhOp3u7e2dnJwsJSVlZ2cXHh7O/T7y7hiCIF8nSUlJNMwwFKHAVWDIZLKamhp3ZprutLe3dxni1tXV0el0Op1eWFgIH9fX19Pp9A5juQAAKSkpLJSFD2DQCx9LS0tTKBQqlUoikSgUCjZjDUW8A8rV1dXV1XUgtswjpRu8lXcgdir0XfdWaGgonC2D8ABjRThoyeFw4I9oMKqEo5cwYsSCz7q6Og6HA0PHLteFefa51+XdARwO1yG2hAEkjC01NDS4Y0s4dEmhUAgEAvzzJScnh8fjZWRkCAQChUKBg5+DcN4ES0xMjEgktrS0wCFWCwsLLy8vBwcHUb7BxNHR8f/bu9OoKK6tb+C7uhFoGqSZBOcxgpeoUUBA4YoMShQehidqjOIAKCxHJLqciEmQqETUYMAxb4i5IUZRQRQxiQHxhiEgEY24VNSIIhJxYB6kod4PldTTNqNM3ej/9yGr+tSpU7s6bVO7z6lzWJZ1d3c/deqUn5/fJ5988s033/zxxx/cVAWPHj2ytrauqan5+uuv//3vf+fn5y9btsza2jopKYkbhLZ8+fKYmJiYmBgbG5uysrKwsDA3N7fk5GQ7O7ugoKCgoCDZQXrOzs4sy5qbm9+7d6/x2QMDAzdu3Pj111+fPHly/vz5T58+VVVV3bJly4gRI6Kjo/39/bW0tPiFxFoNDAAAepDWElc1NUZa30qdnoapkxIRtTiUq0sJBAJu5qc21ucerOJyWj655Uu4jbt37/Il3HQgTTbF3Q5qaWmJRCJuQ11dXUtLS1NTUyQScRvq6uq9e/fmbha5u0nu7pA7lrvvJCKkwd2m7Uuevk6nfu1xXYtExKWCshtchyQR8akgNzKW/sk8iYjrjZRLPrnCJpNPrmOz1aia/GfO5ZZcnqmurs7NHC6RSBiG4Xo7W/iK4L5J+E5RgaAzp7LvucRisbq6+uLFi5csWTJixIjuOamKiorsLHEc2R+nDA0Ni4qKWm1n3bp13GRRlpaWXGf4woUL8/Pzo6Ojp0+fTkSmpqY//PDDkCFDVqxYwc2B98svv5iamjo5ORGRSCTasWNHfHx8+67Cx8fHzMyMiLy8vEJDQxMTE1NSUrgeVD8/v9DQ0LNnz/KJ64YNG1oODAAAepBWEldWRyKobOUX9B6HqawmImptULvyUFNTMzAwMDAweKWjysrKuGF4bdl49OhRdXV1RUVFeXk5v9HGabLV1NS43g+BQMDNuszdnnI3rFyfCdfBQkQ6OjpExOXDfE3ZEq5BIuKfE+MaJyK+EYD24TNDImpoaCgtLeV3cdkd/ZMQEhHXi0hEfMrH/6PgskT6p79R9nB+gxsoyyeW/On4fPKVcDkhyfxz4NJIejmB1NXVFYlErSafXKel3LGtPpkJnSg6OtrOzo77rus2cl/p7X7GdcKECXIlcXFxAoFAdnEdIyMjU1PT7OzsgoKCAQMGODs779u3b8mSJd7e3hYWFkKhsN3rMJubm/Pb/fr1y83NlS3p37//lStX2h5Y+2IAAACFaCVxZUb9S6WwuHtC6TZ/X5FyLCXcdXr37t27d+8mV1Vtu8bjAJvsxmlh/OGzZ89qa2u5HiT+3p2/3edu7l8Vf0dO/9x5k0wPMHcXzu2Vy3X5+3UOn2k3bpbDpdk8/lyyWr3d51Px5sgG3M1a7YXjk7dXrcB/DHh8ByOv8chSPmnk8Skip7lsk2SySrl2+L7KduP/D3K/xchu8P/v+F9eBg0axH0O+R9l+I8N/3HiNvjPG/855D+f/OeWz1fhNTNt2jRFh9B+3E8nPG5yZiJqcrm4vLy8AQMGREZGWltbHz582MHBgYhsbW39/Pz4x1Zfidx3OPejDF/CPTDc9sDaEQAAAChKa0OFJ01SPbC3WyLpPqo379GI4aSrq+hAegDu771c/tYV+FSWTz/4jIhPPPjxk3wKJJvG8DmMbKojl7RUVVVxU31w+AY5st1x1CjRal9H2ZuMz+V4ch8kud8RSKY7kSeX9gsEgqFDh/I/H8ieQrYm3xtJL+d+cj9VyP4SwTfF/xLRQ5+fBOhm3CTMFRUV1dXVza0KyDCMl5eXl5dXXV3dhQsXwsLCPD09d+7cGRgYyFUQCARyP4G1vNptZwUGAAA9SGtf5S4ugpAQlfxH0sF9uyWerseyaldv07wFio4DXsKnE92QJHcuPuVuTsu9ynJdiN2s1dHXrVZonHwCwJvG09Pz66+/Tk1NnTx5Ml8YGhoaGRl59+5dbkrnjIwMExOTXr16OTk52djYiMXihIQEPnHt27fvw4cP+WOLioru37/f8e+WVgPrYPsAAN2poqJi3LhxxsbGb+xKZi9/a3Nf4vX1xE+6Y2nJjjLRuPh7mdeM7g6ta6jm3hX+9YQWLXqpVCql7n3WCF4bTQ5Ck9XjUnEAgFeybdu2lJQUb2/viIiIiRMn1tfXx8TEBAcHR0VF8cmhv7//nj17jI2NS0tL9+3bx7Ksvb0938LUqVMjIiIiIiIWLlz4119/bdy4sU+fPo1n1O+KwAAAegqWZRsaGuT6SzQ1Nd955x1uObHX3ssTPHK34C/3/zAbN6n/9odKwV/dGFWXaWjQik+hGTPI1PSl8tJSevnhRgAAAOBkZGQwDHPq1CkiEolEck/79+nTJzMz093dffny5QYGBiYmJidPnjx16hS/anxKSoqJicn777+vq6s7atSoc+fOHTp0aOPGjXwLISEhvr6+W7du7dOnz8KFC9euXWtkZPT06VOGYdavXy939qCgoEuXLjEM8+OPP9bX1zMMs3379l9//ZVhmJSUlMrKSoZhuMW6Wg0MAKAH0dLSunPnztmzZxUdiMIwLy13cfcuDR9O6elkZfV/hSxLtrZ1jwueB8ylZtd07BlEFy5pxSbTtWs0cuRLOwYMoFWraO1aBcUFAAAgj8uvjh07puhA3kQMwxw9ehQpLsAbTvm/h1/jHtfG38Mv97gOHUo6OpSeLncQhYf3uvNAdCGrW4LsKsKip5oJv9KHH8pnrQUF9PAhjRunoLgAAAAAAOA1V1xcvHLlyiFDhqiqqhoYGHh6eubk5HC7bGxsmH/MmzePiBwdHfmSkpKSuLg4/iX3JEVYWBjDMJWVlampqVz5a/8QxMuJK8PQtGl0+rR8LTMzCgnROvGL2h+3uy2yziWorJYcPMEYm9BHH8nvi48nsZhsbRURFwAAAAAAvOYePXpkYWFx7NixvXv3Pnv27MKFC8+ePbO2tk5PTyeiX3/9NScnRywWjx079sCBA0SUkJBgaWl55MgRlmUlEom7uzvLsm5ubnyDa9asYVlWLBZPmjSJZVmWZWXX67a3t9fT08vIyOj+K+06AvmCOXPowgW63ShB3bCBvLx6Hz7d615h90TWiZiaWu2DJwSqIkpMJJkF3/721Vf0v/+LyZkAAAAAAKArbNiwIT8/f9euXdOnT9fU1DQ1Nf3hhx9Yll2xYgVXYezYsVFRUVeuXJk/fz7Lsn5+fg4ODu+//377TtfQ0MBls513BYrXKHGdMYOGD6ePP26i7sGDzOTJkvDv1S7f6IbIOovwaanuru96ldUwZxOpTx/53bGxlJNDy5crIjQAAAAAAOjBrl27xshY3kxaERcXJxAIXFxc+BIjIyNTU9Ps7OyCggKuZObMmZs2bTp58qSNjc3Tp0+3bNnS7qj4Ht12t6CEGiWuQiHt3ElHjtDFi/K7VFXp9BlmiZ/2V7HiMxeZOql8BeWjeu2OTti3At0+lHVJfiZhIqqtpXXraN48srBQRHQAAAAAANCDvf3226yMiIiIxnVqa2tLS0sbGhq0tbVls9zff/+diPLy8viaW7ZssbS0TEtLmzlzpkDQKFN7szX1dvzP/9DUqbRqFTVeQk0opD17aO9eccrvup/9P7Wcm90QYvsIHz+T7D8u2XtU8O4MJjWNBg5solJICD16RNu3d3t0AAAA0E5Hjx595513uIV5GIa5du2aoiMCAGiJmpqaRCJRUVGpq6tjG5kyZQpf88KFC6WlpaNHj166dOmVK1dabVlufbLXWzN5fEQE5eeTtzc1OTDa359u5QmdnLUPndQN/UZ0MVtQUt6lUbYd86JO7Wqe9ldxeiGHVOtVKDmZjhwhTc0mqh4/Tlu30o4d1K9ft4cJAACgjKysrGRHsilWRUXFW2+9JRdPamrqnDlzpk6dWlxcfPv27QEDBigqPACAtvP09JRKpampqbKFoaGhgwYN4idV+vPPP318fE6cOBEfHy8Sidzc3IqLi1tuVkND48WLF9y2sbHxwYMHuyJ4JdHMpMkjRlBMDL37Lo0cSZ980kSFfv3ou+8oIEAlPFzr5AmtH35s0Nep19dpEKmSgvJ+prZOWFohLCqmBpasrOibwzR7NjU3K3RWFi1YQMuWkb9/94YJAAAA8ppcipBl2YaGhoaGBtnCmJgYlmVXrVqlqampqan54MGD7o0UAKA9tm3blpKS4u3tHRERMXHixPr6+piYmODg4KioKG4Zm4qKCnd39y+++OJf//oXER0/ftzJyem99947f/58r169mmt2/Pjx6enpDx48KCgouHv3ru0/66TY29tfuXIlISHBysqqey6wGzS/2o+DA0VGkp8flZfT55+TUNhEHXNz+s9/6NAh+vVXwe+/C/78k54/p5f/wHQfLS0yNKSxY8nOjgwNW6qZmEjvv092drR7d3cFBwAAAK9GS0vrzp07coVcpqqnp6eIiAAA2qlPnz6ZmZmfffbZ8uXLHzx4IJFIxo0bd+rUKUdHRyJavnx5ZGQkEbm5uf3xxx9GRkZ2dnZEdPHiRVVV1S1btrz99tseHh5cUyKRaO7cud999x0RffHFF4sXLx41apSurm54ePioUaO4OlKp9PWbVbjFZWoXLyZNTfL2prw8+u476t276Wrq6uToSI6OXRFfJ2NZ+vJLCgwkLy86cKDpbBwAAACUVX19vaJDAABoD11d3Z07d+7cubPxroiICLlZnRrnnE1mocbGxhcbT6lL1GRhT9faXFVz5lBSEmVmkokJHT7c9COvPUVODtnZ0erVFBJCUVGkqqrogAAAAHqwuLg4fm7Me/fuzZ49WyKR6Onpubi4yPWUPn36NDAwcPjw4aqqqjo6Ou+++25ycjK3KywsjGGYysrK1NRUrilu1Jxs4zU1NXzJqVOniIibmcnExER2fs6QkBAikkqlfMl7773X3W8KAAB0jTZMsmxtTdevk4cH+fiQlRUdO0b/PAHcY1y6RIsWkbk5SaWUmUnr1ys6IAAAgB7P3d2dZVk3NzciCggICAgIePjw4dGjR5OSkubMmcNXKyoqsrCw+P7778PDw588efLbb79paGg4ODh89dVXRLRmzRqWZcVi8aRJk7iBbdw8JbKNNz5ddXU1y7I3btxgWXbatGkCgeD27dtBQUFEpKKiwrKstbV1dHT08ePHu/k9AQCALtLiUGGeru7fz7tu3kwffEAaGmRvT+PG0YABzY4fVrjqanryhK5do+RkuneP3n6bvvmG5s5V1NxRAAAASkhFRaXx4FvZ9RUMDQ2LiopabcfX15db6d7R0XHGjBnHjx9/8uSJvr4+EW3YsOHPP/88cuQINz9w7969v//++2HDhq1cudLV1dWw5Wkp2iAwMPDHH3/ctWsX94QYEaWmpt6/f3/mzJkdbBkAAJRH2xJXzpgxFBdHBQUUH09JSRQdTX/9RWVlXRZbx6irk44OmZrSvHnk6koTJig6IAAAgFcgFApfdP0QJ34ZBo6VlZW+vv6ZM2detR0LCwt+e+DAgURUWFjIJa6xsbFENGPGDL6Cmpqag4PDf/7znx9//HH+/PntDp4zderU0aNHf/PNN8HBwdykTTt27FixYkUL83C2jHtPVJpbmAAAABTh1b+UBwygpUtp6dIuCAYAAAD+pq2tffv2bUVH0Vba2tr8tqqqKhFxy9jU1taWlpaqq6traWnJ1uc6WtvSl9sWAQEBPj4+e/fu/eijj27dupWUlBQVFdXu1kpLS4lIIpF0SmwAANAp2vCMKwAAAHS7oUOH3rx5U9FRdJSampq2tnZNTU15ebls+V9//UVERkZG3EumYw/yzJ0719DQMCIiora2dufOnQsWLNDR0Wl3a9zbPmzYsI6EBAAAnQuJKwAAgDIyMzMrKCgoKChQdCAdxa09mJCQwJfU1tb+8ssvIpFo2rRpXImGhgY/LtrY2PjgwYOvdAo1NbWlS5c+fvx4586d0dHRq1at6kjAv/32m46OzuDBgzvSCABAy6ysrLgn/6GNkLgCAAAoIxsbG7FYfPr0aUUH0lHbtm0bOnRoQEDAmTNnysvLb9269cEHHzx69Cg8PJyfmWn8+PG3bt168OBBenr63bt3bW1tX/UsS5cuFYlEQUFBjo6OI0aM6EjA8fHxzs7OHewEBgCAzoXEFQAAQBmxFpYzAAAQyElEQVSpq6t7enpya8Yop4yMDNmFVbnVaBiGCQ0NJaJx48ZxnQlGRkZZWVlz5sxZuXKlnp7ehAkTKisrz58/v3jxYr6pL774YsyYMaNGjZo9e3Z4ePioUaPkVm2dN29e43VcMzIy+Bb09fXnzZvHsmxgYGBHLiovLy8lJUV2OR8AAFAGDMuyio4BAAAAmpCVlWVpaXnixAlutC20LCoqKjIy8tKlSx1pZO7cuZmZmTdu3BAKhZ0VGAD0ULNmzSKiY8eOdUXj7Z7F/Q3BMMzRo0e5/wUc9LgCAAAoKQsLi7lz565Zs6ampkbRsfQA+/fv72B3a1pa2pEjR3bt2oWsFQCUCjfkhHPz5s1Zs2bp6elxL588eUJExcXFK1euHDJkiKqqqoGBgaenZ05ODn94bW3t5s2bTUxMNDQ0dHV1XV1d4+PjuUW8Q0JCuHZsbGy4yufOneNKuCXN5M6en58/e/ZsLS0tPT09Ly+v58+f37t3z9XVVUtLq2/fvosXL5abiq/lwF4NCwAAAMrq4cOHmpqaQUFBig5ESR06dMjd3b28vHzfvn1vvfVWXV1du5uqrq5+5513pk2b1onhAUCPNnPmzJkzZ3ZR45aWljNmzHilQ9zc3Iho8uTJycnJlZWVGRkZQqGwuLi4sLBw8ODBhoaGCQkJ5eXl165dmzx5srq6elpaGnegr6+vtrb2Tz/9VFVVVVRUtGbNGiJKTk7mWxaLxZMmTZI9l5mZmZ6eXuOze3p6Xrp0qaKi4ttvvyWid999183N7fLly+Xl5fv37yei1atX84e0GlgLiOjo0aMvlbzSmwUAAADdbN++fQKBICYmRtGBKKNDhw4RkYqKypgxY7Kzs9vdTkNDw5w5c3R0dPLy8joxPADo0To3cW11KIehoWHLLXCp49mzZ+XKFyxYQETR0dF8yaNHj9TU1MzMzLiXQ4cOnThxouwhI0eObF/impCQwJeYmpoSUUpKCl8ydOhQY2PjtgfWgsaJK4YKAwAAKDV/f/9ly5YtWLAgKytL0bEoHV9fX5Zl6+rqrly5Mn78+Ha38+mnnx4/fjwmJqaDMxIDwOtEKBRy42k7hVQqlU3DGve4FhUVtaWdCRMmyJXExcUJBALZxXWMjIxMTU2zs7O5NdWcnZ3T0tKWLFmSkZHBXdHNmzft7OzacRXm5ub8dr9+/eRK+vfvX1hY2PbAmiOVSolIRUVFthCJKwAAgLLbvXu3nZ2do6NjYmKiomN53dTX13/44YfBwcGRkZEODg6KDgcAlIi2tnZpaamio5AnFotlX9bW1paWljY0NGhrazMyfv/9dyLKy8sjosjIyG+//fbu3bsODg69e/d2dnaOjY1t39l79+7NbwsEAqFQqKGhwZcIhcKGhoa2B9Yc7m2XSCSyhUhcAQAAlJ1QKIyNjfX09HR1dd2zZw+LFQE6SVlZmYeHx969e6Ojo2WX5wEAIKKhQ4fevHlT0VG0Qk1NTSKRqKioNPmQ/5QpU4iIYRgvL6/z58+XlJTExcWxLOvp6blr1y6+EYFA8OLFC9lmS0pKuiGw5nBv+7Bhw2QLkbgCAAD0AKqqqlFRUSEhIatXr7azs2v/rIxAREQsyx4+fNjExCQzMzMpKQkLtwJAY2ZmZgUFBS0PalUGnp6eUqk0NTVVtjA0NHTQoEHcmFuJRHLjxg0i6tWrl5OTEzdLcEJCAl+5b9++Dx8+5F8WFRXdv3+/GwJrzm+//aajozN48GDZQiSuAAAAPcb69eszMzOlUqm5ufmiRYs6uGbpm+nFixfHjh2zsrLy8fHx8PC4fv26tbW1ooMCAGVkY2MjFotPnz6t6EBasW3btuHDh3t7eycmJpaWlj579uzAgQPBwcFhYWH8Y6L+/v5Xr16tra19/Pjx559/zrKsvb0938LUqVMLCwsjIiIqKiru3LmzatWqPn36dE9gTYqPj3d2dmYYRraQwXAjAACAnoVl2ejo6O3bt+fm5g4ZMmTKlCmjR4/W19dXV1dXdGjKq6ysrKCg4PLly0lJSVVVVS4uLsHBwWPGjFF0XACg1ObPn5+bm5udnd3pLVtZWenr6585c6YtlTMyMuR+YpNL4p49e/bZZ5/FxcU9ePBAIpGMGzdu7dq1jo6O3N4rV67s27fv4sWL+fn56urqI0eO9PHx8fHx4TPD0tLSNWvWJCQklJSUmJmZ7d6929/fn7vqdevWubu7y55906ZN7u7uFhYWfMm2bdtsbGxsbW35ko8//viTTz5pNbAm5eXlGRsbnzp1ytXVVbYciSsAAEBPlZmZefr06YyMjNzc3OfPn9fU1Cg6IuWlpaVlaGg4duxYe3t7Nze3/v37KzoiAOgBsrKyLC0tT5w44eHhoehY3hRz587NzMy8ceOG3AJCSFwBAAAAAACa5uXllZaWlpubi1Et3SAtLc3GxqZxdyshcQUAAAAAAGhOYWGhsbFxQEDAli1bFB3La66mpsba2trQ0PDcuXON92JyJgAAAAAAgKb169dvx44dW7duPX78uKJjeZ2xLOvt7Z2fnx8REdFkhZZmcwIAAAAAAHjD+fv7X79+fcGCBYMHD5adlAg60aeffnr8+PHExMQRI0Y0WQE9rgAAAAAAAC3ZvXu3nZ2do6NjYmKiomN53dTX13/44YfBwcGRkZEODg7NVUPiCgAAAAAA0BKhUBgbG+vp6enq6rpnzx7ME9RZysrKPDw89u7dGx0dvXjx4hZqInEFAAAAAABohaqqalRUVEhIyOrVq+3s7HJychQdUc/Gsuzhw4dNTEwyMzOTkpLmzJnTcn0krgAAAAAAAG2yfv36zMxMqVRqbm6+aNGiS5cuKTqinufFixfHjh2zsrLy8fHx8PC4fv26tbV1q0dhORwAAAAAAIBXwLJsdHT09u3bc3NzhwwZMmXKlNGjR+vr62Ot1xaUlZUVFBRcvnw5KSmpqqrKxcUlODh4zJgxbTwciSsAAAAAAEB7ZGZmnj59OiMjIzc39/nz5zU1NYqOSHlpaWkZGhqOHTvW3t7ezc2tf//+r3Q4ElcAAAAAAABQanjGFQAAAAAAAJQaElcAAAAAAABQakhcAQAAAAAAQKkhcQUAAAAAAAClhsQVAAAAAAAAlBoSVwAAULCKigpGRnp6enM1165dy1cLCQnpziAVRVNTk2nRV1991blnPHbsGMMwampqndssAABARyBxBQAABdPU1GRZ9vLly9zLLVu2NFnt6dOn+/fvJ6K5c+eyLBsUFNR9IbZXRUXFW2+95eLi0pEWuHfGzc2NbWTy5MmdF+zfDAwM+P8CAAAoCSSuAACgLEQi0eDBgxMTEy9dutR47+7duwcOHNiOZjU1NW1sbNpe3olYlm1oaGhoaOjSs3QuJK4AAKCEkLgCAICyEAgE69evJ6LGw4BLSkr27du3bt06RcTVflpaWnfu3Dl79mwXtX/hwgVfX9/ObROJKwAAKCEkrgAAoEQWLVrUv3//+Pj4q1evypbv2bNn+vTpw4cPV1Rgymb58uUBAQFd0bK+vj7DMEhcAQBAqSBxBQAAJaKmprZ27VqWZT/77DO+sKKi4ssvv9y4cWPj+lKp9OjRo05OTkZGRiKRaPTo0eHh4fzQ3LCwMIZhKisrU1NTuamMVFRUWijnFBcXr1y5csiQIaqqqgYGBp6enjk5OdyuuLg4flakmzdvzpo1S09Pj3v55MkTudhkK9fU1HCFtbW1mzdvNjEx0dDQ0NXVdXV1jY+Pr6+v78ibFhISwp2FH/l87tw5rkRfX79xMPfu3Zs9e7ZEItHT03Nxcblz545sa0KhUEdHB4krAAAol8YzPQAAAHS/y5cvi8VilmWrqqoMDQ0FAsH169e5Xdu3b581axbLsv/973/pn8mZOKdPnyairVu3Pnv2rLi4eM+ePQKBYM2aNbIti8XiSZMmNT5jk+WFhYWDBw82NDRMSEgoLy+/du3a5MmT1dXV09LS+Dpubm5ENHny5OTk5MrKyoyMDKFQWFxc3OR1cZWrq6u5l76+vtra2j/99FNVVVVRUdGaNWuIKDk5ueV3psm/4KtWrWr5cszMzPT09BoH4+bmlpaWVlFR8fPPP4tEIgsLC7kzGhsbh4SEtBASAABAN0OPKwAAKBeRSBQYGNjQ0LB161Yiqqqq2r1796ZNm5qrb2dnt2HDBh0dHX19/RUrVnzwwQfh4eFlZWXtO/uGDRvy8/N37do1ffp0TU1NU1PTH374gWXZFStWyNVct26dnZ2dhoaGpaWlVCrl+zZb9ssvv5iamjo5OYlEIkNDwx07dowcObItB8rNKrxs2bJXvrZ/+Pr6Wltbi8ViR0fHGTNmZGVlyXUX6+vr6+nptbt9AACATofEFQAAlM7SpUv19PSOHDly+/btAwcOWFlZjRkzpsmaLi4uycnJsiVjx46tq6vLzc1t36nj4uIEAoHsAjZGRkampqbZ2dkFBQWyNSdMmNCO9p2dndPS0pYsWZKRkcGNEL5586adnV37om0fCwsLfpubqLmwsFC2goqKiuzYaQAAAIXDnyUAAFA6mpqaAQEBH3300ccff3zhwoVTp041V7O0tHTnzp2xsbEFBQUlJSV8eVVVVTvOW1tbW1paSkTa2tqN9+bl5Q0YMIB/KRaL23GKyMhIa2vrw4cPOzg4EJGtra2fn5+Hh8erthMREdGOs3Nkr05VVZWIetaCPQAA8AZCjysAACijFStWaGtrf//992PHjjU3N2+umqur65YtWxYvXnzr1q2GhgaWZXfv3k1ELMvydRiGafLYxuVqamoSiURFRaWurq7x0zVTpkzp+HUxDOPl5XX+/PmSkpK4uDiWZT09PXft2tXxlgUCwYsXL2RLZDP5V9IVq+wAAAB0BBJXAABQRtra2oGBgdra2kFBQc3Vqa+vT01NNTIyWrlypYGBAZeIVldXy1XT0NDgMzpjY+ODBw+2UO7p6SmVSlNTU2VbCA0NHTRokFQq7fh1SSSSGzduEFGvXr2cnJy4yX4TEhI63nLfvn0fPnzIvywqKrp//37HmwUAAFAGSFwBAEBJbd68uaSkZOLEic1VEAqFdnZ2RUVFO3bsePLkSXV1dXJy8v79++WqjR8//tatWw8ePEhPT797966trW0L5du2bRs+fLi3t3diYmJpaemzZ88OHDgQHBwcFhbWWY99+vv7X716tba29vHjx59//jnLsvb29h1vdurUqYWFhRERERUVFXfu3Fm1alWfPn3a0U52dra+vr6NjQ3GDwMAgBLphpmLAQAAWib7vOi0adOarCP39+vLL79kWba4uNjPz2/gwIG9evUyNDRcuHDh+vXruQpmZmbcgTdu3LC1tRWLxQMHDoyMjOQbbK786dOngYGBw4YN69Wrl4GBwdSpU3/++WduV3p6etv/jMbGxsrW5FbxycnJ8fPzGzVqFLeOq5WV1aFDh7hBzq2+M0RkaGjYXM2SkhJfX9++ffuKRCIbG5usrCwzMzPuqHXr1slFvmnTJrm3dMaMGVw7WVlZXGD19fUtXB0AAEB3YthGtwIAAAAAAAAAygNDhQEAAAAAAECpIXEFAAAAAAAApYbEFQAAAAAAAJQaElcAAAAAAABQakhcAQAAAAAAQKkhcQUAAAAAAAClhsQVAAAAAAAAlBoSVwAAAAAAAFBqSFwBAAAAAABAqSFxBQAAAAAAAKWGxBUAAAAAAACUGhJXAAAAAAAAUGpIXAEAAAAAAECpIXEFAAAAAAAApfb/AfuQOGa6+j4gAAAAAElFTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "machine.auto_transitions_markup = False # hide auto transitions\n", "model.show_graph(force_new=True) # rerender graph" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Previous state and transition notation" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "hide_input": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model.melt()\n", "model.show_graph()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model.evaporate()\n", "model.show_graph()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model.ionize()\n", "model.show_graph()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### One Machine and multiple models" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# multimodel test\n", "model1 = Matter()\n", "model2 = Matter()\n", "machine = GraphMachine(model=[model1, model2], states=states, transitions=transitions, **extra_args)\n", "model1.melt()\n", "model1.show_graph()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model2.sublimate()\n", "model2.show_graph()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Show only the current region of interest" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# show only region of interest which is previous state, active state and all reachable states\n", "model2.show_graph(show_roi=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Example graph from Readme.md" ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "hide_input": false }, "outputs": [ { "data": { "image/png": "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OnXqpJKSEkVGRurVV1/VRx99ZCkovf7664qJiVFoaKjc3d3VsWNHJSYmatKkSXJxcVFmZubfylCVZWZmasGCBVq9erWSkpIqvECWl5dnUDIAAG6u3377TdHR0YqOjtaOHTtkY2Ojnj17atGiRRowYMDfugsHAAAAAAAAYJSyonXbtm3LjZvNZp0+fVqHDx/WL7/8osOHD2vnzp3697//rZycHElSzZo15e/vb1nBOiAgQC1atJCjo6MRpwIANxwrUwMAAACV5OLiosWLF2vWrFny8/NTly5d5OnpqS1btqhr166SpLi4OJlMJkVHR0uSHB0dZTKZKszl6+ur+Ph4DR8+XBMmTJCXl5fatWun3NxcxcTEaOzYsRWOcXV11bhx42Q2mzV58uQKXy9bafrK5x4xYoQkadu2bWrWrJkeeughVatWTXfffbfWr1+vDz74QNOnT//L4yub92rnHxYWJkkymUyaN2+eJKlVq1bq37+/JMnb21s//vijBg0apGeffVY1atRQs2bNtGrVKkVHR2vYsGGWc2zYsKF27dqloKAgPfDAA/L29tZjjz2m8ePHq0WLFiosLJTJZNKYMWMq/42t4kJCQjR79myNHTtWx44dU2lpqcxmsxYtWiTp9xfUAAC4UyUnJ2v+/Plq1aqVGjZsqNmzZ6t27dpasWKFLly4oG+++Ubjxo2jSA0AAAAAAIA7hslkUv369dW3b19NnTpVy5Yt048//qisrCydPHlS3377rUJDQ1W7dm3FxsZq0qRJat++vVxdXeXv76+HH35Yb775pjZt2qTz588bfToAcF2YzLwzDgAAgCrkq6++0oMPPnjNBdHAwEClpaUpKSnpBiWDkUwmk1auXFmuuH2nGTRokKKjo5Wfny8HBwdJUklJiezs7OTt7a1z586V23/u3LmaPn26Nm3apF69ev3pPBI/IwCA20d2drZWrVqlzz//XFu2bJG7u7uGDh2qoUOHqmvXrrK1tTU6IgAAAAAAAHDLKC0t1a+//qp9+/Zp3759SkhI0L59+5ScnCzp91WsAwMDFRAQoFatWikwMFANGzaUlRXrvAK4bUTaGJ0AAAAAAG4FxcXFRke46aytrdWtWzdt2bJF4eHhGj16tJydnRUXF6f333/f6HgAAFw3xcXF2rhxoz7//HNFR0erpKRE//znPxUZGal+/frJ3t7e6IgA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ODk5qVOnTsrOztaQIUN07tw5tWjRQnZ2nHEAAAAAAAAAAPdSoUIF9erVS1arVe+9956WLl2qWrVqqXTp0qbTADx9DvG3NgAAoMBq3LixqlSponnz5plOAQAAwBPSvn17jRo1SgMHDtSmTZuMNFgsFsXExGjBggWaP3++QkNDlZycbKQFAAAAAAAAAGyFs7OzYmJitH//fhUtWlT16tVTZGSkUlNTTacBeMowpgYAAAWWxWJRt27dNH/+fGVkZJjOAQAAwBMyevRotW/fXmFhYfrhhx+Mdbz22mvavn27Dh06pKCgIO3fv99YCwAAAAAAAADYimeffVYbNmzQ3LlztWTJElWrVk3x8fGmswA8RRhTAwCAAq1bt25KTk7WihUrTKcAAADgCbFYLPr4449VsWJFvfLKK7p69aqxlpo1a2rPnj0qV66c6tevr88//9xYCwAAAAAAAADYCovFovDwcCUlJal169bq1q2bQkNDdfr0adNpAJ4CjKkBAECBVrp0ab388sv6+OOPTacAAADgCXJxcdHKlSt1/fp1tW3b1ugnk3h7e2vdunX661//qk6dOikyMlK3bt0y1gMAAAAAAAAAtuKZZ57RrFmztGXLFv3444+qVq2axo8fr+zsbNNpAGwYY2oAAFDg9ezZUxs2bNCpU6dMpwAAAOAJKlmypFavXq19+/ape/fuslqtxlrs7e01btw4ffLJJ1qwYIGaNWumCxcuGOsBAAAAAAAAAFvSsGFD7du3T6NGjdLo0aNVu3Zt7dq1y3QWABvFmBoAABR4r7zyinx8fDRv3jzTKQAAAHjC/P39tWjRIi1evFhjxowxnaPXXntN3377rc6cOcMv+wEAAAAAAADgATg4OGjYsGE6cOCAihUrpnr16ikyMlKpqamm0wDYGMbUAACgwLO3t9frr7+uuXPnKicnx3QOAAAAnrCXX35ZM2bM0KhRozR//nzTOapZs6Z2796t6tWrq2HDhvr4449NJwEAAAAAAACAzahSpYrWr1+vuXPnaunSpfLz81N8fLzpLAA2hDE1AACApF69eun06dNas2aN6RQAAADkgV69emnw4MHq1auXNm/ebDpHRYsW1erVqxUVFaXevXurb9++ysjIMJ0FAAAAAAAAADbBYrEoPDxcSUlJCg0NVbdu3RQaGqpTp06ZTgNgAyxWq9VqOgIAACA/aNKk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mjVasGDBb94vLi5O8fHxOn78uJo2bSoPDw81b948d8ANAABgq3bv3q3w8HAVK1ZMISEhiouL09GjR5WVlfXQz+nh4aGKFSuqdu3aatGihdq0aaPg4GC5ubnxKX64S1ZWlo4eParp06crJCRExYoVU3h4uPbs2fPvoGXsAAAgAElEQVRIz8vJ1AAAAPmIo6Ojpk2bppdeeklr1679w48SBAAAAJ608PBw1alTR507d1ZgYKD++c9/qkuXLqaznlouLi5q1qyZmjVrptjYWB0/flwrV67UV199pV69eiknJ0e+vr4KDg5Ws2bN1LRpUz3zzDOmswEAAGAj7OzslJmZedf1ycnJefL6Tk5O8vT0VEpKiq5du/bAg+o/em4vLy+lpaXpxo0bsrf//TnEw3TY29vrX//6lzw9PVW/fn317t1bvr6+d52abbFY1LVrV3Xt2lW3bt3Sli1bNHHiRLVr106TJk3S4MGDH/p9AgAAmHDu3DkNGzZMn3zyiQICAjRhwgSFhoaqTJkyptNQgJ09e1YrV67URx99pDp16qhLly4aP368SpUq9cDPxcnUAAAA+UxISIjatm2rgQMHKiMjw3QOAAAAID8/P+3cuVPdunVT165dFR4errS0NNNZBUKlSpUUFRWlDRs26MKFC/rss8/UuHFjbd++XZ06dZKPj48CAwM1ePBgrVixgpOrAQAA8LtKliypn3766Y7rzp8/r9OnT+dZw6uvvipJWr169V23BQQEaNCgQQ/93O3atVNWVpa+/fbbu24bP368ypUrl3tq4sN0uLu7q3Tp0nJzc9OKFSvk5uamtm3b6ueff77jfl5eXjpy5IgkycHBQSEhIVq2bJksFotWrVr10O8PAADAhJkzZ8rX11fbt2/Xl19+qYSEBPXt25chNYwrU6aM+vbtq4SEBH355Zfavn27fH19NXPmzAd+LsbUAAAA+VBsbKzOnTunqVOnmk4BAAAAJP3nlLfY2FgtW7ZMq1evVu3atfX999+bzipQihQporCwME2fPl379+/XxYsX9fnnnys4OFgbN27Uq6++qmLFiikgIEBRUVH69NNPdfToUVmtVtPpAAAAyCdeeuklnTt3TtOnT1daWpp+/PFHRUVFycfHJ88axo4dq4oVK2rQoEFatWqVrl27prNnz6pfv376+eefH2lMPXbsWFWuXFk9evTQmjVr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NmyoefPm2fRdkXMFAAAAAAAAAHAuiqkBAAAAAAAAwMl8fX31xRdfqHr16tq0aZM6duyo0NBQDRw4UJ999plyc3OtsQEBATLGKDo6Wq6urjp16pQmT54sSbJYLDLGqFWrVlqxYoVWr14tSXr55Zf13nvv6f3331d6erpOnDih+vXrq1evXtq1a5ckady4cTLGyMfHR23atJExRsYYFRYWWs+dnJys5s2b6/PPP9fChQuVkZGhHTt2KCMjQ61atdLevXslSb1795YxRr169ZIkjR07Vq+++qpSUlL07rvv6pNPPtGAAQM0ZswYTZ06VcnJyZoyZYo+/PBDvf766xU+Z/aOb9OmTerfv786deqkEydO6OzZsxo6dKjGjh2r1157zaG+7J0rAAAAAAAAAIBzuRhjjLOTAAAAAAAAAAD8/gTpVatW6X//+5+++eYb61Oaq1Spovnz56t///7W2M2bNys6OlojRozQggULrO2xsbHq16+ffvnlF7m7u0uSateurdDQUMXGxtqcLzIyUkuWLFGHDh2sbb6+vmrUqJF2795dIr/nnntOy5cv14oVK/T0009b21NSUlSzZk3df//92r9/v7W9d+/eWrt2rdavX69HHnnE2n7//ffr2LFj2rlzpx566CFre+3ateXh4aGTJ0/elDm73vjWrVunOXPmaPv27TbtgwYN0qpVq5SWlqbKlSvb1ZejcwUAAAAAAAAAcIoveDI1AAAAAAAAANwiPD099cwzzygmJkYZGRnatm2b+vfvr/T0dA0cOFAHDx60xnbr1k0NGzbURx99pPT0dGv7rFmzNHLkSGshtSR1795de/bs0dChQxUXF6eioiJJUnx8vE0h9fXExMTI1dVVPXr0sGkPCQlRgwYNdODAAZ07d67Ecc2aNbPZDgsLK7U9PDxcSUlJducjOTZn19OjR48ShdSSFBUVpatXr+rYsWN291XeuQIAAAAAAAAA/L0opgYAAAAAAACAW5DFYlGnTp302Wef6bXXXlNRUZFWr15tEzNmzBjl5uZq4cKFkqSEhAR98803Gjp0qE3cggUL9N///lenT59W586dVblyZXXv3l1r1qyxO5+CggJlZWWpuLhY/v7+cnFxsXn98MMPkqSffvqpxLF/fJqzJLm6usrNzU3e3t427W5ubiouLrY7pz+zZ87+SlZWlv7973+rYcOGCgwMtI5t/PjxkqTc3Fy7+rmRuQIAAAAAAAAA/L0opgYAAAAAAAAAJ4uNjVVwcHCZ+zt27ChJunTpkk37gAEDFBwcrPnz56ugoEBz5szRs88+q8DAQJs4FxcXDRo0SFu3blVmZqZiYmJkjFGfPn30zjvvlIgtjaenpwICAmSxWHT16lUZY0p9Xcv1ZivvnJU1Pknq2bOnpk6dqiFDhighIUHFxcUyxmju3LmSJGOMXX3danMFAAAAAAAAACgbxdQAAAAAAAAA4GTGGKWmpiouLq7U/fv375ckNW7c2Kbd09NTI0aMUGpqqubMmaMVK1Zo9OjRJY4PCAjQyZMnJUnu7u7q2rWrYmJi5OLiovXr19vEent768qVK9btyMhIffDBB5KkPn36qLCwULGxsSXO8fbbbysiIkKFhYUOjLz8yjtnZY2vqKhIsbGxCgkJ0ahRo1S1alVrsXReXl6p57hd5goAAAAAAAAAUDaKqQEAAAAAAADgFvHUU0/p008/VVJSkgoKCnTmzBnNnj1bb775ppo2bapnnnmmxDEjRoyQl5eXJk+erC5duuiee+4pte/hw4fTKJbZAAADEUlEQVTryJEjKigoUGpqqmbOnCljjDp16mQT16RJEyUkJOjs2bPau3evTp8+rXbt2kmSpk+frjp16uiFF17Qxo0blZWVpYyMDC1ZskRvvvmmZs+eLYvFUvET8xccnbOyxufm5qYOHTooJSVFs2bNUlpamvLy8rR9+3YtXry41HPfbnMFAAAAAAAAACjJxfz5ewkBAAAAAAAAAH+r4uJi7d27VzExMdq1a5fOnj2r1NRUeXl5KTIyUn369NHo0aPl7e1d6vFDhw7V0qVLtXPnTj300EMl9h8+fFiLFi3St99+q8TERFWqVEn16tXT4MGDNXjwYOsTmCUpPj5eQ4YM0Q8//KCgoCBNmDBBI0aMsO7PyMjQW2+9pZiYGJ09e1YBAQFq3Lixxo8fry5dukiS4uLi1KpVK5scJk2apN69e6t58+Y27dOnT1fbtm2tRcjXvP7665oyZUqFz9lfjS8tLU2TJ0/Whg0blJKSoqCgID388MMKCQnRjBkzJElNmza1PvW6IuYKAAAAAAAAAOBUX1BMDQAAAAAAAAC3uWXLlmnBggXWIl8AAAAAAAAAAGCXL1ydnQEAAAAAAAAA4MYsXrxYY8eOdXYaAAAAAAAAAADcdiimBgAAAAAAAIDbzIcffqjHH39cOTk5Wrx4sS5duqSnnnrK2WkBAAAAAAAAAHDbsTg7AQAAAAAAAACA42JiYhQYGKj77rtPK1eulMXCx70AAAAAAAAAADjKxRhjnJ0EAAAAAAAAAAAAAAAAAAAAAPzNvnB1dgYAAAAAAAAAAAAAAAAAAAAA4AwUUwMAAAAAAAAAAAAAAAAAAAC4I1FMDQAAAAAAAAAAAAAAAAAAAOCORDE1AAAAAAAAAAAAAAAAAAAAgDsSxdQAAAAAAAAAAAAAAAAAAAAA7kgUUwMAAAAAAAAAAAAAAAAAAAC4I1FMDQAAAAAAAAAAAAAAAAAAAOCORDE1AAAAAAAAAAAAAAAAAAAAgDsSxdQAAAAAAAAAAAAAAAAAAAAA7kgUUwMAAAAAAAAAAAAAAAAAAAC4I/0/PIPV4BE4vDUAAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from transitions.extensions.states import Timeout, Tags, add_state_features\n", "\n", "@add_state_features(Timeout, Tags)\n", "class CustomMachine(GraphMachine):\n", " pass\n", "\n", "\n", "states = ['new', 'approved', 'ready', 'finished', 'provisioned',\n", " {'name': 'failed', 'on_enter': 'notify', 'on_exit': 'reset',\n", " 'tags': ['error', 'urgent'], 'timeout': 10, 'on_timeout': 'shutdown'},\n", " 'in_iv', 'initializing', 'booting', 'os_ready', {'name': 'testing', 'on_exit': 'create_report'},\n", " 'provisioning']\n", "\n", "transitions = [{'trigger': 'approve', 'source': ['new', 'testing'], 'dest':'approved',\n", " 'conditions': 'is_valid', 'unless': 'abort_triggered'},\n", " ['fail', '*', 'failed'],\n", " ['add_to_iv', ['approved', 'failed'], 'in_iv'],\n", " ['create', ['failed','in_iv'], 'initializing'],\n", " ['init', 'in_iv', 'initializing'],\n", " ['finish', 'approved', 'finished'],\n", " ['boot', ['booting', 'initializing'], 'booting'],\n", " ['ready', ['booting', 'initializing'], 'os_ready'],\n", " ['run_checks', ['failed', 'os_ready'], 'testing'],\n", " ['provision', ['os_ready', 'failed'], 'provisioning'],\n", " ['provisioning_done', 'provisioning', 'os_ready']]\n", "\n", "\n", "class CustomModel(Model):\n", " def is_valid(self):\n", " return True\n", " \n", " def abort_triggered(self):\n", " return False\n", "\n", "\n", "extra_args['title'] = \"System State\"\n", "extra_args['initial'] = \"new\"\n", "model = CustomModel()\n", "machine = CustomMachine(model=model, states=states, transitions=transitions, **extra_args)\n", "model.approve()\n", "model.show_graph()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Custom styling\n", "\n", "The `GraphMachine` class uses its attributes `(hierarchical_)machine_attributes` and `style_attributes` to style (sub)graphs, nodes and edges.\n", "You can edit them and add new entries to `style_attributes` to customized you graph's look." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# thanks to @dan-bar-dov (https://github.com/pytransitions/transitions/issues/367)\n", "model = Model()\n", "\n", "transient_states = ['T1', 'T2', 'T3']\n", "target_states = ['G1', 'G2']\n", "fail_states = ['F1', 'F2']\n", "transitions = [['eventA', 'INITIAL', 'T1'], ['eventB', 'INITIAL', 'T2'], ['eventC', 'INITIAL', 'T3'],\n", " ['success', ['T1', 'T2'], 'G1'], ['defered', 'T3', 'G2'], ['fallback', ['T1', 'T2'], 'T3'],\n", " ['error', ['T1', 'T2'], 'F1'], ['error', 'T3', 'F2']]\n", "\n", "machine = GraphMachine(model, states=transient_states + target_states + fail_states,\n", " transitions=transitions, initial='INITIAL', show_conditions=True,\n", " show_state_attributes=True)\n", "\n", "machine.machine_attributes['ratio'] = '0.471'\n", "machine.style_attributes['node']['fail'] = {'fillcolor': 'brown1'}\n", "machine.style_attributes['node']['transient'] = {'fillcolor': 'gold'}\n", "machine.style_attributes['node']['target'] = {'fillcolor': 'chartreuse'}\n", "model.eventC()\n", "\n", "# customize node styling\n", "for s in transient_states:\n", " machine.model_graphs[model].set_node_style(s, 'transient')\n", "for s in target_states:\n", " machine.model_graphs[model].set_node_style(s, 'target')\n", "for s in fail_states:\n", " machine.model_graphs[model].set_node_style(s, 'fail')\n", "\n", "# draw the whole graph ...\n", "model.show_graph()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Enum states\n", "\n", "Enum states can also be used with `GraphSupport`. Their labels will be defined by the enum field name." ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "scrolled": true }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from enum import Enum, auto, unique\n", "\n", "@unique\n", "class States(Enum):\n", " \n", " ONE = auto()\n", " TWO = auto()\n", " THREE = auto()\n", "\n", "model = Model()\n", "machine = GraphMachine(model, states=States, auto_transitions=False, ordered_transitions=True, initial=States.THREE)\n", "model.next_state()\n", "model.show_graph()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Editing the graph object directly\n", "\n", "In case your needed changes are not supported out of the box, you can alter the graph object directly before drawing it.\n", "The capabilities for direct graph editing depends on the backend you use.\n", "`pygraphivz` allows to retrieve elements directly.\n", "This becomes useful, when you for instance want to alter the node labels (maybe because you do not like the ALL CAPS labels generated when using enums)." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from transitions.extensions.diagrams import GraphMachine\n", "\n", "states = ['A', 'B', 'C', 'D']\n", "state_translations = {\n", " 'A': 'Start',\n", " 'B': 'Error',\n", " 'C': 'Pending',\n", " 'D': 'Done'\n", "}\n", "\n", "transitions = [['go', 'A', 'B'], ['process', 'A', 'C'], ['go', 'C', 'D']]\n", "\n", "model = Model()\n", "m = GraphMachine(model, states=states, transitions=transitions, initial='A')\n", "graph = model.get_graph()\n", "\n", "for node in graph.iternodes():\n", " node.attr['label'] = state_translations[node.attr['label']]\n", "\n", "model.show_graph()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3" } }, "nbformat": 4, "nbformat_minor": 1 } transitions-0.9.0/examples/Frequently asked questions.ipynb0000644000232200023220000010724214304350474024557 0ustar debalancedebalance{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Frequently asked questions\n", "\n", "* [How do I load/save state machine configurations with json/yaml](#How-do-I-load/save-state-machine-configurations-with-json/yaml)\n", "* [How to use transitions with django models?](#How-to-use-transitions-with-django-models?)\n", "* [transitions memory footprint is too large for my Django app and adding models takes too long.](#transitions-memory-footprint-is-too-large-for-my-Django-app-and-adding-models-takes-too-long.) \n", "* [Is there a during callback which is called when no transition has been successful?](#Is-there-a-'during'-callback-which-is-called-when-no-transition-has-been-successful?)\n", "* [How to have a dynamic transition destination based on a function's return value?](#How-to-have-a-dynamic-transition-destination-based-on-a-function's-return-value)\n", "* [Machine.get_triggers should only show valid transitions based on some conditions.](#Machine.get_triggers-should-only-show-valid-transitions-based-on-some-conditions.)\n", "* [Transitions does not add convencience methods to my model](#Transitions-does-not-add-convencience-methods-to-my-model)\n", "* [I have several inter-dependent machines/models and experience deadlocks](#I-have-several-inter-dependent-machines/models-and-experience-deadlocks)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### How do I load/save state machine configurations with json/yaml\n", "\n", "The easiest way to load a configuration is by making sure it is structured just as the `Machine` constructor. Your first level elements should be `name`, `transitions`, `states` and so on. When your yaml/json configuration is loaded, you can add your model programatically and pass the whole object to `Machine`.\n", "\n", "#### Loading a JSON configuration" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from transitions import Machine\n", "import json\n", "\n", "\n", "class Model:\n", "\n", " def say_hello(self, name):\n", " print(f\"Hello {name}!\")\n", "\n", "\n", "# import json\n", "json_config = \"\"\"\n", "{\n", " \"name\": \"MyMachine\",\n", " \"states\": [\n", " \"A\",\n", " \"B\",\n", " { \"name\": \"C\", \"on_enter\": \"say_hello\" }\n", " ],\n", " \"transitions\": [\n", " [\"go\", \"A\", \"B\"],\n", " {\"trigger\": \"hello\", \"source\": \"*\", \"dest\": \"C\"}\n", " ],\n", " \"initial\": \"A\"\n", "}\n", "\"\"\"\n", "\n", "model = Model()\n", "\n", "config = json.loads(json_config)\n", "config['model'] = model # adding a model to the configuration\n", "m = Machine(**config) # **config unpacks arguments as kwargs\n", "assert model.is_A()\n", "model.go()\n", "assert model.is_B()\n", "model.hello(\"world\") # >>> Hello world!\n", "assert model.state == 'C'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Loading a YAML configuration\n", "\n", "This example uses [pyyaml](https://pypi.org/project/PyYAML/)." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from transitions import Machine\n", "import yaml\n", "\n", "\n", "class Model:\n", "\n", " def say_hello(self, name):\n", " print(f\"Hello {name}!\")\n", "\n", " \n", "yaml_config = \"\"\"\n", "---\n", "\n", "name: \"MyMachine\"\n", "\n", "states:\n", " - \"A\"\n", " - \"B\"\n", " - name: \"C\"\n", " on_enter: \"say_hello\"\n", "\n", "transitions:\n", " - [\"go\", \"A\", \"B\"]\n", " - {trigger: \"hello\", source: \"*\", dest: \"C\"}\n", "\n", "initial: \"A\"\n", "\"\"\"\n", "\n", "model = Model()\n", "\n", "config = yaml.safe_load(yaml_config) \n", "config['model'] = model # adding a model to the configuration\n", "m = Machine(**config) # **config unpacks arguments as kwargs\n", "assert model.is_A()\n", "model.go()\n", "assert model.is_B()\n", "model.hello(\"world\") # >>> Hello world!\n", "assert model.state == 'C'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "#### Exporting YAML or JSON\n", "\n", "A default `Machine` does not keep track of its configuration but `transitions.extensions.markup.MarkupMachine` does. \n", "`MarkupMachine` cannot just be used to export your configuration but also to visualize or instrospect your configuration conveniently.\n", "Is is also the foundation for `GraphMachine`. You will see that `MarkupMachine` will always export every attribute even unset values. This makes such exports visually cluttered but easier to automatically process.\n", "If you plan to use such a configuration with a 'normal' `Machine`, you should remove the `models` attribute from the markup since `Machine` cannot process it properly.\n", "If you pass the (stored and loaded) configuration to another `MarkupMachine` however, it will attempt to create and initialize models for you." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "#export\n", "from transitions.extensions.markup import MarkupMachine\n", "import json\n", "import yaml\n", "\n", "\n", "class Model:\n", "\n", " def say_hello(self, name):\n", " print(f\"Hello {name}!\")\n", "\n", "\n", "model = Model()\n", "m = MarkupMachine(model=None, name=\"ExportedMachine\")\n", "m.add_state('A')\n", "m.add_state('B')\n", "m.add_state('C', on_enter='say_hello')\n", "m.add_transition('go', 'A', 'B')\n", "m.add_transition(trigger='hello', source='*', dest='C')\n", "m.initial = 'A'\n", "m.add_model(model)\n", "model.go()\n", "\n", "print(\"JSON:\")\n", "print(json.dumps(m.markup, indent=2))\n", "print('\\nYAML:')\n", "print(yaml.dump(m.markup))\n", "\n", "config2 = json.loads(json.dumps(m.markup)) # simulate saving and loading\n", "m2 = MarkupMachine(markup=config2)\n", "model2 = m2.models[0] # get the initialized model\n", "assert model2.is_B() # the model state was preserved\n", "model2.hello('again') # >>> Hello again!\n", "assert model2.state == 'C'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### How to use `transitions` with django models?\n", "\n", "In [this comment](https://github.com/pytransitions/transitions/issues/146#issuecomment-300277397) **proofit404** provided a nice example about how to use `transitions` and django together:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from django.db import models\n", "from django.db.models.signals import post_init\n", "from django.dispatch import receiver\n", "from django.utils.translation import ugettext_lazy as _\n", "from transitions import Machine\n", "\n", "\n", "class ModelWithState(models.Model):\n", " ASLEEP = 'asleep'\n", " HANGING_OUT = 'hanging out'\n", " HUNGRY = 'hungry'\n", " SWEATY = 'sweaty'\n", " SAVING_THE_WORLD = 'saving the world'\n", " STATE_TYPES = [\n", " (ASLEEP, _('asleep')),\n", " (HANGING_OUT, _('hanging out')),\n", " (HUNGRY, _('hungry')),\n", " (SWEATY, _('sweaty')),\n", " (SAVING_THE_WORLD, _('saving the world')),\n", " ]\n", " state = models.CharField(\n", " _('state'),\n", " max_length=100,\n", " choices=STATE_TYPES,\n", " default=ASLEEP,\n", " help_text=_('actual state'),\n", " )\n", "\n", "\n", "@receiver(post_init, sender=ModelWithState)\n", "def init_state_machine(instance, **kwargs):\n", "\n", " states = [state for state, _ in instance.STATE_TYPES]\n", " machine = instance.machine = Machine(model=instance, states=states, initial=instance.state)\n", " machine.add_transition('work_out', instance.HANGING_OUT, instance.HUNGRY)\n", " machine.add_transition('eat', instance.HUNGRY, instance.HANGING_OUT)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `transitions` memory footprint is too large for my Django app and adding models takes too long.\n", "\n", "We analyzed the memory footprint of `transitions` in [this discussion](https://github.com/pytransitions/transitions/issues/146) and could verify that the standard approach is not suitable to handle thousands of models. However, with a static (class) machine and some `__getattribute__` tweaking we can keep the convenience loss minimal:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from transitions import Machine\n", "from functools import partial\n", "from mock import MagicMock\n", "\n", "\n", "class Model(object):\n", "\n", " machine = Machine(model=None, states=['A', 'B', 'C'], initial=None,\n", " transitions=[\n", " {'trigger': 'go', 'source': 'A', 'dest': 'B', 'before': 'before'},\n", " {'trigger': 'check', 'source': 'B', 'dest': 'C', 'conditions': 'is_large'},\n", " ], finalize_event='finalize')\n", "\n", " def __init__(self):\n", " self.state = 'A'\n", " self.before = MagicMock()\n", " self.after = MagicMock()\n", " self.finalize = MagicMock()\n", "\n", " @staticmethod\n", " def is_large(value=0):\n", " return value > 9000\n", "\n", " def __getattribute__(self, item):\n", " try:\n", " return super(Model, self).__getattribute__(item)\n", " except AttributeError:\n", " if item in self.machine.events:\n", " return partial(self.machine.events[item].trigger, self)\n", " raise\n", "\n", "\n", "model = Model()\n", "model.go()\n", "assert model.state == 'B'\n", "assert model.before.called\n", "assert model.finalize.called\n", "model.check()\n", "assert model.state == 'B'\n", "model.check(value=500)\n", "assert model.state == 'B'\n", "model.check(value=9001)\n", "assert model.state == 'C'\n", "assert model.finalize.call_count == 4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You lose `model.is_` convenience functions and the ability to add callbacks such as `Model.on_enter_` automatically. However, the second limitation can be tackled with dynamic resolution in states as pointed out by [mvanderlee](https://github.com/mvanderlee) [here](https://github.com/pytransitions/transitions/issues/146#issuecomment-869049925):" ] }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "from transitions import State\n", "import logging\n", "\n", "logger = logging.getLogger(__name__)\n", "\n", "\n", "class DynamicState(State):\n", " \"\"\" Need to dynamically get the on_enter and on_exit callbacks since the\n", " model can not be registered to the Machine due to Memory limitations\n", " \"\"\"\n", "\n", " def enter(self, event_data):\n", " \"\"\" Triggered when a state is entered. \"\"\"\n", " logger.debug(\"%sEntering state %s. Processing callbacks...\", event_data.machine.name, self.name)\n", " if hasattr(event_data.model, f'on_enter_{self.name}'):\n", " event_data.machine.callbacks([getattr(event_data.model, f'on_enter_{self.name}')], event_data)\n", " logger.info(\"%sFinished processing state %s enter callbacks.\", event_data.machine.name, self.name)\n", "\n", " def exit(self, event_data):\n", " \"\"\" Triggered when a state is exited. \"\"\"\n", " logger.debug(\"%sExiting state %s. Processing callbacks...\", event_data.machine.name, self.name)\n", " if hasattr(event_data.model, f'on_exit_{self.name}'):\n", " event_data.machine.callbacks([getattr(event_data.model, f'on_exit_{self.name}')], event_data)\n", " logger.info(\"%sFinished processing state %s exit callbacks.\", event_data.machine.name, self.name)\n", "\n", "\n", "class DynamicMachine(Machine):\n", " \"\"\"Required to use DynamicState\"\"\"\n", " state_cls = DynamicState" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "markdown", "source": [ "### Is there a 'during' callback which is called when no transition has been successful?\n", "\n", "Currently, `transitions` has no such callback. This example from the issue discussed [here](https://github.com/pytransitions/transitions/issues/342) might give you a basic idea about how to extend `Machine` with such a feature:" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%% md\n" } } }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from transitions.core import Machine, State, Event, EventData, listify\n", "\n", "\n", "class DuringState(State):\n", "\n", " # add `on_during` to the dynamic callback methods\n", " # this way on_during_ can be recognized by `Machine`\n", " dynamic_methods = State.dynamic_methods + ['on_during']\n", " \n", " # parse 'during' and remove the keyword before passing the rest along to state\n", " def __init__(self, *args, **kwargs):\n", " during = kwargs.pop('during', [])\n", " self.on_during = listify(during)\n", " super(DuringState, self).__init__(*args, **kwargs)\n", "\n", " def during(self, event_data):\n", " for handle in self.on_during:\n", " event_data.machine.callback(handle, event_data)\n", "\n", "\n", "class DuringEvent(Event):\n", "\n", " def _trigger(self, model, *args, **kwargs):\n", " # a successful transition returns `res=True` if res is False, we know that\n", " # no transition has been executed\n", " res = super(DuringEvent, self)._trigger(model, *args, **kwargs)\n", " if res is False:\n", " state = self.machine.get_state(model.state)\n", " event_data = EventData(state, self, self.machine, model, args=args, kwargs=kwargs)\n", " event_data.result = res\n", " state.during(event_data)\n", " return res\n", "\n", "\n", "class DuringMachine(Machine):\n", " # we need to override the state and event classes used by `Machine`\n", " state_cls = DuringState\n", " event_cls = DuringEvent\n", "\n", "\n", "class Model:\n", "\n", " def on_during_A(self):\n", " print(\"Dynamically assigned callback\")\n", "\n", " def another_callback(self):\n", " print(\"Explicitly assigned callback\")\n", "\n", "\n", "model = Model()\n", "machine = DuringMachine(model=model, states=[{'name': 'A', 'during': 'another_callback'}, 'B'],\n", " transitions=[['go', 'B', 'A']], initial='A', ignore_invalid_triggers=True)\n", "machine.add_transition('test', source='A', dest='A', conditions=lambda: False)\n", "\n", "assert not model.go()\n", "assert not model.test()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### How to have a dynamic transition destination based on a function's return value\n", "\n", "This has been a feature request [here](https://github.com/pytransitions/transitions/issues/269). We'd encourage to write a wrapper which converts a condensed statement into individual condition-based transitions. However, a less expressive version could look like this:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from transitions import Machine, Transition\n", "from six import string_types\n", "\n", "class DependingTransition(Transition):\n", "\n", " def __init__(self, source, dest, conditions=None, unless=None, before=None,\n", " after=None, prepare=None, **kwargs):\n", "\n", " self._result = self._dest = None\n", " super(DependingTransition, self).__init__(source, dest, conditions, unless, before, after, prepare)\n", " if isinstance(dest, dict):\n", " try:\n", " self._func = kwargs.pop('depends_on')\n", " except KeyError:\n", " raise AttributeError(\"A multi-destination transition requires a 'depends_on'\")\n", " else:\n", " # use base version in case transition does not need special handling\n", " self.execute = super(DependingTransition, self).execute\n", "\n", " def execute(self, event_data):\n", " func = getattr(event_data.model, self._func) if isinstance(self._func, string_types) \\\n", " else self._func\n", " self._result = func(*event_data.args, **event_data.kwargs)\n", " super(DependingTransition, self).execute(event_data)\n", "\n", " @property\n", " def dest(self):\n", " return self._dest[self._result] if self._result is not None else self._dest\n", "\n", " @dest.setter\n", " def dest(self, value):\n", " self._dest = value\n", "\n", "# subclass Machine to use DependingTransition instead of standard Transition\n", "class DependingMachine(Machine):\n", " transition_cls = DependingTransition\n", " \n", "\n", "def func(value):\n", " return value\n", "\n", "m = DependingMachine(states=['A', 'B', 'C', 'D'], initial='A')\n", "# define a dynamic transition with a 'depends_on' function which will return the required value\n", "m.add_transition(trigger='shuffle', source='A', dest=({1: 'B', 2: 'C', 3: 'D'}), depends_on=func)\n", "m.shuffle(value=2) # func returns 2 which makes the transition dest to be 'C'\n", "assert m.is_C()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that this solution has some drawbacks. For instance, the generated graph might not include all possible outcomes." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `Machine.get_triggers` should only show valid transitions based on some conditions.\n", "\n", "This has been requested [here](https://github.com/pytransitions/transitions/issues/256). `Machine.get_triggers` is usually quite naive and only checks for theoretically possible transitions. If you need more sophisticated peeking, this `PeekMachine._can_trigger` might be a solution:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from transitions import Machine, EventData\n", "from transitions.core import listify\n", "from functools import partial\n", "\n", "\n", "class Model(object):\n", "\n", " def fails(self, condition=False):\n", " return False\n", "\n", " def success(self, condition=False):\n", " return True\n", "\n", " # condition is passed by EventData\n", " def depends_on(self, condition=False):\n", " return condition\n", "\n", " def is_state_B(self, condition=False):\n", " return self.state == 'B'\n", "\n", "\n", "class PeekMachine(Machine):\n", "\n", " def _can_trigger(self, model, *args, **kwargs):\n", " # We can omit the first two arguments state and event since they are only needed for\n", " # actual state transitions. We do have to pass the machine (self) and the model as well as\n", " # args and kwargs meant for the callbacks.\n", " e = EventData(None, None, self, model, args, kwargs)\n", "\n", " return [trigger_name for trigger_name in self.get_triggers(model.state)\n", " if any(all(c.check(e) for c in t.conditions)\n", " for t in self.events[trigger_name].transitions[model.state])]\n", "\n", " # override Machine.add_model to assign 'can_trigger' to the model\n", " def add_model(self, model, initial=None):\n", " for mod in listify(model):\n", " mod = self if mod is self.self_literal else mod\n", " if mod not in self.models:\n", " setattr(mod, 'can_trigger', partial(self._can_trigger, mod))\n", " super(PeekMachine, self).add_model(mod, initial)\n", "\n", "states = ['A', 'B', 'C', 'D']\n", "transitions = [\n", " dict(trigger='go_A', source='*', dest='A', conditions=['depends_on']), # only available when condition=True is passed\n", " dict(trigger='go_B', source='*', dest='B', conditions=['success']), # always available\n", " dict(trigger='go_C', source='*', dest='C', conditions=['fails']), # never available\n", " dict(trigger='go_D', source='*', dest='D', conditions=['is_state_B']), # only available in state B\n", " dict(trigger='reset', source='D', dest='A', conditions=['success', 'depends_on']), # only available in state D when condition=True is passed\n", " dict(trigger='forwards', source='A', dest='D', conditions=['success', 'fails']), # never available\n", " dict(trigger='forwards', source='D', dest='D', unless=['depends_on'])\n", "]\n", "\n", "model = Model()\n", "machine = PeekMachine(model, states=states, transitions=transitions, initial='A', auto_transitions=False)\n", "assert model.can_trigger() == ['go_B']\n", "assert set(model.can_trigger(condition=True)) == set(['go_A', 'go_B'])\n", "model.go_B(condition=True)\n", "assert set(model.can_trigger()) == set(['go_B', 'go_D'])\n", "model.go_D()\n", "assert model.can_trigger() == ['go_B', 'forwards']\n", "assert set(model.can_trigger(condition=True)) == set(['go_A', 'go_B', 'reset'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Transitions does not add convencience methods to my model\n", "\n", "There is a high chance that your model *already contained* a `trigger` method or methods with the same name as your even trigger. In this case, `transitions` will not add convenience methods to not accidentaly break your model and only emit a warning. If you defined these methods on purpose and *want* them to be overrided or maybe even call *both* -- the trigger event AND your predefined method, you can extend/override `Machine._checked_assignment` which is always called when something needs to be added to a model:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from transitions import State, Machine\n", "\n", "class StateMachineModel:\n", "\n", " state = None\n", "\n", " def __init__(self):\n", " pass\n", "\n", " def transition_one(self):\n", " print('transitioning states...')\n", "\n", " def transition_two(self):\n", " print('transitioning states...')\n", "\n", "\n", "class OverrideMachine(Machine):\n", "\n", " def _checked_assignment(self, model, name, func):\n", " setattr(model, name, func)\n", "\n", "\n", "class CallingMachine(Machine):\n", "\n", " def _checked_assignment(self, model, name, func):\n", " if hasattr(model, name):\n", " predefined_func = getattr(model, name)\n", " def nested_func(*args, **kwargs):\n", " predefined_func()\n", " func(*args, **kwargs)\n", " setattr(model, name, nested_func)\n", " else:\n", " setattr(model, name, func)\n", "\n", "\n", "states = [State(name='A'), State(name='B'), State(name='C'), State(name='D')]\n", "transitions = [\n", " {'trigger': 'transition_one', 'source': 'A', 'dest': 'B'},\n", " {'trigger': 'transition_two', 'source': 'B', 'dest': 'C'},\n", " {'trigger': 'transition_three', 'source': 'C', 'dest': 'D'}\n", "]\n", "state_machine_model = StateMachineModel()\n", "\n", "print('OverrideMachine ...')\n", "state_machine = OverrideMachine(model=state_machine_model, states=states, transitions=transitions, initial=states[0])\n", "print('state_machine_model (current state): %s' % state_machine_model.state)\n", "state_machine_model.transition_one()\n", "print('state_machine_model (current state): %s' % state_machine_model.state)\n", "state_machine_model.transition_two()\n", "print('state_machine_model (current state): %s' % state_machine_model.state)\n", "\n", "print('\\nCallingMachine ...')\n", "state_machine_model = StateMachineModel()\n", "state_machine = CallingMachine(model=state_machine_model, states=states, transitions=transitions, initial=states[0])\n", "print('state_machine_model (current state): %s' % state_machine_model.state)\n", "state_machine_model.transition_one()\n", "print('state_machine_model (current state): %s' % state_machine_model.state)\n", "state_machine_model.transition_two()\n", "print('state_machine_model (current state): %s' % state_machine_model.state)" ] }, { "cell_type": "markdown", "metadata": { "pycharm": { "name": "#%% md\n" } }, "source": [ "### I have several inter-dependent machines/models and experience deadlocks\n", "\n", "A common use case involves multiple machines where one machine should react to events emitted by the other(s).\n", "Sometimes this involves 'waiting' as in 'all machines are triggered at the same time but machine 1 needs to wait until\n", "machine 2 is ready'. `Machine` will process callbacks sequentially. Thus, if your callbacks contain passages like this\n", "\n", "```python\n", "class Model:\n", " def on_enter_state(self):\n", " while not event:\n", " time.sleep(1)\n", "```\n", "\n", "it is very likely that `event` will never happen because the callback will block the event processing forever.\n", "\n", "Bad news first: there is no one-fits-all-solution for this kind of problem.\n", "Now the good news: There is a solution that fits many use cases. An event bus! We consider transitions to be events that\n", "can be emitted by user input, system events or other machines.\n", "\n", "The event bus approach decouples the need of individual machines to know each other. They communicate via events.\n", "Thus, we can model quite complex inter-dependent behaviour without threading or asynchronous processing.\n", "Furthermore, other components do not need to know which machine processes which event, they can broadcast the message on\n", "the bus and rest assured that whoever is interested in the event will get it.\n", "The challenge is to wrap one's head around the concept of modelling transitions as events rather than actions to be conducted.\n", "\n", "Since we expect events to be emitted in callbacks, and we also expect that not every event bus member will be able to\n", "process every event sent across the bus, we pass `queued=True` (every machine processes one event at a time) and\n", "`ignore_invalid_triggers=True` (when the event cannot be triggered from the current state or is unknown, ignore it)." ] }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "from transitions import Machine\n", "import logging\n", "\n", "\n", "class EventBus:\n", "\n", " def __init__(self):\n", " self.members = []\n", "\n", " def add_member(self, member):\n", " \"\"\"Member can be a model or a machine acting as a model\"\"\"\n", " # We decorate each member with an 'emit' function to fire events.\n", " # EventBus will then broadcast that event to ALL members, including the one that triggered the event.\n", " # Furthermore, we can pass a payload in case there is data that needs to be sent with an event.\n", " setattr(member, 'emit', self.broadcast)\n", " self.members.append(member)\n", "\n", " def broadcast(self, event, payload=None):\n", " for member in self.members:\n", " member.trigger(event, payload)\n", "\n", "\n", "# Our machines can either be off or started\n", "states = ['off', 'started']\n", "\n", "\n", "class Machine1(Machine):\n", "\n", " # this machine can only boot once.\n", " transitions = [['boot', 'off', 'started']]\n", "\n", " def __init__(self):\n", " # we pass 'ignore_invalid_triggers' since a machine on an event bus might get events it cannot process\n", " # right now and we do not want to throw an exception every time that happens.\n", " # Furthermore, we will set 'queued=True' to process events sequentially instead of nested.\n", " super(Machine1, self).__init__(states=states, transitions=self.transitions,\n", " ignore_invalid_triggers=True, initial='off', queued=True)\n", "\n", " def on_enter_started(self, payload=None):\n", " print(\"Starting successful\")\n", " # We emit out start event and attach ourselves as payload just in case\n", " self.emit(\"Machine1Started\", self)\n", "\n", "\n", "class Machine2(Machine):\n", "\n", " # This machine can also reboot (boot from every state) but only when the 'ready' flag has been set.\n", " # 'ready' is set once the event 'Machine1Started' has been processed (before the transition is from 'off' to 'on'\n", " # is actually executed). Furthermore, we will also boot the machine when we catch that event.\n", " transitions = [{'trigger': 'boot', 'source': '*', 'dest': 'started', 'conditions': 'ready'},\n", " {'trigger': 'Machine1Started', 'source': 'off', 'dest': 'started', 'before': 'on_machine1_started'}]\n", "\n", " def __init__(self):\n", " super(Machine2, self).__init__(states=states, transitions=self.transitions,\n", " ignore_invalid_triggers=True, initial='off', queued=True)\n", " self._ready = False\n", "\n", " # Callbacks also work with properties. Passing the string 'ready' will evaluate this property\n", " @property\n", " def ready(self):\n", " return self._ready\n", "\n", " @ready.setter\n", " def ready(self, value):\n", " self._ready = value\n", "\n", " def on_machine1_started(self, payload=None):\n", " self.ready = True\n", " print(\"I am ready now!\")\n", "\n", " def on_enter_started(self, payload=None):\n", " print(\"Booting successful\")\n", "\n", "\n", "logging.basicConfig(level=logging.DEBUG)\n", "bus = EventBus()\n", "machine1 = Machine1()\n", "machine2 = Machine2()\n", "bus.add_member(machine2)\n", "bus.add_member(machine1)\n", "bus.broadcast('boot')\n", "# what will happen:\n", "# - bus will broadcast 'boot' event to machine2\n", "# - machine2 will attempt to boot but fail and return since ready is set to false\n", "# - bus will broadcast 'boot' event to machine1\n", "# - machine1 will boot and emit the 'Machine1Started'\n", "# - bus will broadcast 'Machine1Started' to machine2\n", "# - machine2 will handle the event, boot and return\n", "# - bus will broadcast 'Machine1Started' to machine1\n", "# - machine1 will add that event to its event queue\n", "# - bus broadcast of 'Machine1Started' returns\n", "# - machine1 is done with handling 'boot' and process the next event in the event queue\n", "# - machine1 cannot handle 'Machine1Started' and will ignore it\n", "# - bus broadcast of 'boot' returns\n", "assert machine1.state == machine2.state\n", "bus.broadcast('boot')\n", "# broadcast 'boot' event to all members:\n", "# - machine2 will reboot\n", "# - machine1 won't do anything" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } }, { "cell_type": "markdown", "source": [ "If you consider this too much boilerplate and you don't mind some dependencies and less generalization\n", "you can of course go the leaner asynchronous or threaded route and process your callbacks in parallel.\n", "Having `while event` loops as mentioned above in `async` callbacks is not uncommon. You should consider, however, that\n", "the execution order of callbacks as described in the README is kept for `AsyncMachine` as well.\n", "All callbacks of one stage (e.g. `prepare`) must return before callbacks of the next state (e.g. `conditions`) are triggered." ], "metadata": { "collapsed": false, "pycharm": { "name": "#%% md\n" } } }, { "cell_type": "code", "execution_count": null, "outputs": [], "source": [ "from transitions.extensions.asyncio import AsyncMachine\n", "import asyncio\n", "\n", "states = ['off', 'started']\n", "\n", "\n", "class Machine1(AsyncMachine):\n", "\n", " transitions = [{'trigger': 'boot', 'source': 'off', 'dest': 'started', 'before': 'heavy_processing'}]\n", "\n", " def __init__(self):\n", " super(Machine1, self).__init__(states=states, transitions=self.transitions, initial='off')\n", "\n", " async def heavy_processing(self):\n", " # we need to do some heavy lifting before we can proceed with booting\n", " await asyncio.sleep(0.5)\n", " print(\"Processing done!\")\n", "\n", "\n", "class Machine2(AsyncMachine):\n", "\n", " transitions = [['boot', 'off', 'started']]\n", "\n", " def __init__(self, dependency):\n", " super(Machine2, self).__init__(states=states, transitions=self.transitions, initial='off')\n", " self.dependency = dependency\n", "\n", " async def on_enter_started(self):\n", " while not self.dependency.is_started():\n", " print(\"Waiting for dependency to be ready...\")\n", " await asyncio.sleep(0.1)\n", " print(\"Machine2 up and running\")\n", "\n", "\n", "machine1 = Machine1()\n", "machine2 = Machine2(machine1)\n", "asyncio.get_event_loop().run_until_complete(asyncio.gather(machine1.boot(), machine2.boot()))\n", "assert machine1.state == machine2.state" ], "metadata": { "collapsed": false, "pycharm": { "name": "#%%\n" } } } ], "metadata": { "kernelspec": { "display_name": "Python 3.8.3 64-bit ('transitions': conda)", "language": "python", "name": "python38364bittransitionsconda9f9fdeb4313741768b0dccf7fd8ce480" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3" } }, "nbformat": 4, "nbformat_minor": 2 }transitions-0.9.0/examples/Playground.ipynb0000644000232200023220000002132114304350474021453 0ustar debalancedebalance{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Playground\n", "\n", "Make sure to read the [documentation](https://github.com/pytransitions/transitions#table-of-contents) first.\n", "\n", "* [Rescue those kittens!](#Rescue-those-kittens!)\n", "* [Too much coffee with my hierarchical state machines!](#Too-much-coffee-with-my-hierarchical-state-machines!)\n", "* [Very asynchronous dancing](#Very-asynchronous-dancing)\n", "* [Fun with graphs](#Fun-with-graphs)\n", "\n", "\n", "## Rescue those kittens!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from transitions import Machine\n", "import random\n", "\n", "class NarcolepticSuperhero(object):\n", "\n", " # Define some states. Most of the time, narcoleptic superheroes are just like\n", " # everyone else. Except for...\n", " states = ['asleep', 'hanging out', 'hungry', 'sweaty', 'saving the world']\n", " # A more compact version of the quickstart transitions\n", " transitions = [['wakeup', 'asleep', 'hanging out'],\n", " ['work_out', 'hanging out', 'hungry'],\n", " ['eat', 'hungry', 'hanging out'],\n", " {'trigger': 'distress_call', 'source': '*', 'dest': 'saving the world', 'before': 'change_into_super_secret_costume'},\n", " {'trigger': 'complete_mission', 'source': 'saving the world', 'dest': 'sweaty', 'after': 'update_journal'},\n", " {'trigger': 'clean_up', 'source': 'sweaty', 'dest': 'asleep', 'conditions': 'is_exhausted'},\n", " ['clean_up', 'sweaty', 'hanging out'],\n", " ['nap', '*', 'asleep']]\n", "\n", "\n", " def __init__(self, name):\n", "\n", " # No anonymous superheroes on my watch! Every narcoleptic superhero gets\n", " # a name. Any name at all. SleepyMan. SlumberGirl. You get the idea.\n", " self.name = name\n", " self.kittens_rescued = 0 # What have we accomplished today?\n", "\n", " # Initialize the state machine\n", " self.machine = Machine(model=self, states=NarcolepticSuperhero.states,\n", " transitions=NarcolepticSuperhero.transitions, initial='asleep')\n", "\n", " def update_journal(self):\n", " \"\"\" Dear Diary, today I saved Mr. Whiskers. Again. \"\"\"\n", " self.kittens_rescued += 1\n", "\n", " @property\n", " def is_exhausted(self):\n", " \"\"\" Basically a coin toss. \"\"\"\n", " return random.random() < 0.5\n", "\n", " def change_into_super_secret_costume(self):\n", " print(\"Beauty, eh?\")\n", " \n", " def yell(self):\n", " print(f\"I am {self.name} and I am {self.state}!\")\n", " \n", "batman = NarcolepticSuperhero(\"Batman\")\n", "batman.wakeup()\n", "assert batman.state == 'hanging out'\n", "batman.yell()\n", "# the rest is up to you ..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Too much coffee with my hierarchical state machines!" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from transitions.extensions import HierarchicalMachine as Machine\n", "\n", "states = ['standing', 'walking', {'name': 'caffeinated', 'children':['dithering', 'running']}]\n", "transitions = [\n", " ['walk', 'standing', 'walking'],\n", " ['stop', 'walking', 'standing'],\n", " ['drink', '*', 'caffeinated'],\n", " ['walk', ['caffeinated', 'caffeinated_dithering'], 'caffeinated_running'],\n", " ['relax', 'caffeinated', 'standing']\n", "]\n", "\n", "machine = Machine(states=states, transitions=transitions, initial='standing', ignore_invalid_triggers=True)\n", "\n", "assert machine.walk() # Walking now\n", "# I fancy a coffee right now ..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Very asynchronous dancing" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": false }, "outputs": [], "source": [ "from transitions.extensions.asyncio import AsyncMachine\n", "import asyncio\n", "\n", "class Dancer:\n", " \n", " states = ['start', 'left_food_left', 'left', 'right_food_right']\n", " \n", " def __init__(self, name, beat):\n", " self.my_name = name\n", " self.my_beat = beat\n", " self.moves_done = 0\n", " \n", " async def on_enter_start(self):\n", " self.moves_done += 1\n", " \n", " async def wait(self):\n", " print(f'{self.my_name} stepped {self.state}')\n", " await asyncio.sleep(self.my_beat)\n", "\n", " async def dance(self):\n", " while self.moves_done < 5:\n", " await self.step()\n", " \n", "dancer1 = Dancer('Tick', 1)\n", "dancer2 = Dancer('Tock', 1.1)\n", "\n", "m = AsyncMachine(model=[dancer1, dancer2], states=Dancer.states, initial='start', after_state_change='wait')\n", "m.add_ordered_transitions(trigger='step')\n", "\n", "# it starts okay but becomes quite a mess\n", "_ = await asyncio.gather(dancer1.dance(), dancer2.dance()) " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Fun with graphs\n", "\n", "This requires `pygraphviz` or `graphviz`" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from transitions.extensions.states import Timeout, Tags, add_state_features\n", "from transitions.extensions.diagrams import GraphMachine\n", "\n", "import io\n", "from IPython.display import Image, display, display_png\n", "\n", "\n", "@add_state_features(Timeout, Tags)\n", "class CustomMachine(GraphMachine):\n", " pass\n", "\n", "\n", "states = ['new', 'approved', 'ready', 'finished', 'provisioned',\n", " {'name': 'failed', 'on_enter': 'notify', 'on_exit': 'reset',\n", " 'tags': ['error', 'urgent'], 'timeout': 10, 'on_timeout': 'shutdown'},\n", " 'in_iv', 'initializing', 'booting', 'os_ready', {'name': 'testing', 'on_exit': 'create_report'},\n", " 'provisioning']\n", "\n", "transitions = [{'trigger': 'approve', 'source': ['new', 'testing'], 'dest':'approved',\n", " 'conditions': 'is_valid', 'unless': 'abort_triggered'},\n", " ['fail', '*', 'failed'],\n", " ['add_to_iv', ['approved', 'failed'], 'in_iv'],\n", " ['create', ['failed','in_iv'], 'initializing'],\n", " ['init', 'in_iv', 'initializing'],\n", " ['finish', 'approved', 'finished'],\n", " ['boot', ['booting', 'initializing'], 'booting'],\n", " ['ready', ['booting', 'initializing'], 'os_ready'],\n", " ['run_checks', ['failed', 'os_ready'], 'testing'],\n", " ['provision', ['os_ready', 'failed'], 'provisioning'],\n", " ['provisioning_done', 'provisioning', 'os_ready']]\n", "\n", "\n", "class Model:\n", " \n", " # graph object is created by the machine\n", " def show_graph(self, **kwargs):\n", " stream = io.BytesIO()\n", " self.get_graph(**kwargs).draw(stream, prog='dot', format='png')\n", " display(Image(stream.getvalue()))\n", " \n", " def is_valid(self):\n", " return True\n", " \n", " def abort_triggered(self):\n", " return False\n", "\n", "model = Model()\n", "machine = CustomMachine(model=model, states=states, transitions=transitions, initial='new', title='System State',\n", " show_conditions=True, show_state_attributes=True)\n", "model.approve()\n", "model.show_graph()\n", "\n", "# Your turn! What happens next? " ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.8.3 64-bit ('transitions': conda)", "language": "python", "name": "python38364bittransitionsconda9f9fdeb4313741768b0dccf7fd8ce480" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.3" } }, "nbformat": 4, "nbformat_minor": 4 } transitions-0.9.0/examples/Graph MIxin Demo Nested.ipynb0000644000232200023220000221613214304350474023455 0ustar debalancedebalance{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "hide_input": false }, "outputs": [], "source": [ "import os, sys, inspect, io\n", "\n", "cmd_folder = os.path.realpath(\n", " os.path.dirname(\n", " os.path.abspath(os.path.split(inspect.getfile( inspect.currentframe() ))[0])))\n", "\n", "if cmd_folder not in sys.path:\n", " sys.path.insert(0, cmd_folder)\n", "\n", "from transitions.extensions.states import Timeout, Tags, add_state_features\n", "from transitions.extensions.factory import HierarchicalGraphMachine as Machine\n", "from IPython.display import Image, display, display_png\n", "\n", "@add_state_features(Timeout, Tags)\n", "class CustomStateMachine(Machine):\n", " pass\n", "\n", "class Matter(object):\n", " def do_x(self):\n", " pass\n", " def do_y(self):\n", " pass\n", " def do_z(self):\n", " pass\n", " def is_hot(self):\n", " return True\n", " def is_too_hot(self):\n", " return False\n", " def show_graph(self, **kwargs):\n", " stream = io.BytesIO()\n", " self.get_graph(**kwargs).draw(stream, prog='dot', format='png')\n", " display(Image(stream.getvalue()))\n", "\n", "extra_args = dict(auto_transitions=False, initial='standing', title='Mood Matrix',\n", " show_conditions=True, show_state_attributes=True)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "hide_input": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABLcAAAKCCAYAAAAjnzsqAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzdd1zWVf/H8dfFRkBxMMQR7i1mjtw4aDgSzZWRmWZ6c6uYaSZWt6ZZ5qRB0jIty0GKlqMysdQw0zsxJ7n3QBQBkfn9/cFP7oghKHIJvJ+PBw8f1/me7zmfcxEpn+ucz9dkGIaBiIiIiIiIiIhI8XPWwtwRiIiIiIiIiIiI3Cklt0REREREREREpNhScktERERERERERIotJbdERERERERERKTYUnJLRERERERERESKLSW3RERERERERESk2FJyS0REREREREREii0lt0REREREREREpNhScktERERERERERIotJbdERERERERERKTYUnJLRERERERERESKLSW3RERERERERESk2FJyS0REREREREREii0lt0REREREREREpNiyMncAIverdevW8fnnn5s7DJESoUePHgwdOtTcYYiIiIiISAmknVsiuYiKiuK7774zdxgixV54eDh79uwxdxgiIiIiIlJCaeeWSB4qVKjAypUrzR2GSLHWtm1bc4cgIiIiIiIlmHZuiYiIiIiIiIhIsaXkloiIiIiIiIiIFFtKbomIiIiIiIiISLGl5JaIiIiIiIiIiBRbSm6JSKEKDQ3lwQcfpEyZMphMJkwmE/v27ePChQs888wzeHh4ZLb7+fmZO1yzW7ZsWeb7YWdnZ+5wREREREREih0lt0Sk0ERERDBgwAB8fHy4dOkSR44coWrVqgAMHjyY8PBwvv/+e65fv87EiRMLPH58fDx16tShZ8+ehR262QwaNAjDMOjatau5QxERERERESmWrMwdgIiUHMuXL8cwDAICAnB0dMTR0ZHTp08THR1NeHg4//73v2nSpAkAs2bNwjCMAo1vGAbp6emkp6ffi/Bz5ejoSLNmzdi2bVuRzisiIiIiIiK3p+SWiBSa06dPA1CxYsXbtt86ilcQTk5OHD169C6jFBERERERkZJExxJFpNCkpaXl2V7QZJaIiIiIiIjI7Si5JVIKXblyhfHjx1OrVi1sbW2pWrUq3bp14/PPPycxMTGzX2pqKsuXL8fHxwd3d3fs7e1p0qQJQUFBWY4GhoWFYTKZWLNmDQD29vaZO7NMJhMtW7YEYNq0aZltW7Zsybz/8uXLjB07Fk9P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olmzZqJhw4bi4MGDqvP84IMPhLa2tjh16lS+HA4ODkJPT0+4uLioruHZs2eFvb290NTUFH/99Ve+9fX09ETXrl0LvTalOXZh70dUVJT48MMPhaWlZYnfj6KU5txKe93e9d4r7lylvufV1dVFp06dSnythRBi8eLFwtLSsrCX7rO4RfQWLG79Hy8vL/Hxxx9LHYOqqZpS3Dp58qSwtbUVdevWFf7+/lLHISIiKiArK0tcv35dhIaGii1btoj58+eLzz//XHTu3LnIwlZhRa6+ffuKtWvXCgAiKSmpxBlSUlKEpqam+Oijj1TL0tPThbGxsWjevLnQ0dERT58+Vb02aNAgsW3bNtX3ISEhonv37gX2O3z4cKGhoSGePHmSb3lJiltpaWmiT58+QqFQiOzs7EJzF/eDfkhISL7lQ4YMKXBthg4dKgCI3bt351v38ePHQldXt9yKWyW9PnkFxV9//bXA+h999FG+glVp1v3iiy8KLWAmJCQILS0t4eTklG+5g4ODACAuXryYb3lUVJQAIBwcHPItL6q4VZpjv+39ePDggdDS0iq34lZJz62016087r2izlXqe74sxa2DBw8KmUwm0tLS3nzpPoclElGx+LREqs3S09Ph7e2N999/H82bN0d0dDTGjRsndSwiIqICNDU10bx5c7i5ueHLL7/E0qVLsX37dgQGBpZ4H69evYIQAocOHcK0adOgrq6OK1eulHh7ExMT9OvXD6GhoUhMTAQA7Nu3D506dcKkSZOQkZGBPXv2AABSU1Px119/5Xv62YABA3Ds2LEC+3VwcMCrV68QExNT4iwAEBsbi06dOkFNTQ1r166Furp6qbbP89577+X7Pm86gocPH6qW/fHHHwCAPn365FvX1NQUrVq1KtNx31Sa67N3714AQN++fQusn/f+lmXd4OBgqKmpYcCAAfnWMzMzQ9u2bXH+/Hncv38/32t6enpwdHTMt8zOzg7m5uaIjIxUPV20OKU59tveD3Nzc9ja2pboeCVR0nMry3UD3u3ee5dzrSr3/L9ZWlpCCIEHDx4UeI3FLSIqFieUp9rq5MmTcHR0hL+/PzZt2oSDBw/CwsJC6lhERESlcu/evWLXUVdXV81tpK2tjffffx99+vSBkZFRgR/ciyOXy/H69Wv87//+LwDg559/hlwux6effgp1dXXs2LEDAPDLL79gwIAB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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "states = [{'name': 'caffeinated', 'on_enter': 'do_x',\n", " 'children':['dithering', 'running'], 'transitions': [['drink', 'dithering', '=']]},\n", " {'name': 'standing', 'on_enter': ['do_x', 'do_y'], 'on_exit': 'do_z'},\n", " {'name': 'walking', 'tags': ['accepted', 'pending'], 'timeout': 5, 'on_timeout': 'do_z'},\n", " \n", " ]\n", "transitions = [\n", " ['walk', 'standing', 'walking'],\n", " ['go', 'standing', 'walking'],\n", " ['stop', 'walking', 'standing'],\n", " {'trigger': 'drink', 'source': '*', 'dest': 'caffeinated_dithering',\n", " 'conditions':'is_hot', 'unless': 'is_too_hot'},\n", " ['walk', 'caffeinated_dithering', 'caffeinated_running'],\n", " ['relax', 'caffeinated', 'standing'],\n", " ['sip', 'standing', 'caffeinated']\n", "]\n", "\n", "model = Matter()\n", "machine = CustomStateMachine(model=model, states=states, transitions=transitions, **extra_args)\n", "model.show_graph()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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4oknALh69SqbN2/G09OTsWPH4uHhYSkI/f3Jkjerb9++ZGdns3nz5jzXZs2aRZ06dXIdTn+zbmRejo6OZGZmWt43btyY+fPnFzn/a9tRr22RvCY5OZmDBw/e/ORERERERESkQCqEiZQxM2fOpF69ejzxxBOsXLmSS5cuceLECUaOHMnp06cthTBbW1uCg4M5c+YMs2fPJjk5mStXrrBu3TrefvvtYs3H29ubYcOGsWrVKlJSUjCbzcybN48ZM2YQGxuLnV3x7eK+kXm1adOGQ4cOcfz4cbZu3crRo0fp2LFjkfN/8cUXcXNzY/z48Xz77bekpqby66+/Mnjw4OtulxQREREREZFiZojIdb3yyitGzZo1rZ3GLZGcnGyMHz/eqFevnlGuXDmjevXqxoABA4xDhw7liktKSjIiIyON2rVrG+XKlTOqVatmPPTQQ8bkyZMNwACMtm3bGkuWLLG8//tr69atRvPmzQ1bW1sDMEwmk2Fra2v07ds31zjnzp0zJkyYYNSvX98oV66c4eHhYXTr1s349ttvLTHXG+OBBx4wtm7dmqd96tSphmEYedp79epVpHldc+DAAaNjx46Gk5OTUbt2beONN94ocv7XHDx40IiIiDAqVqxoVKhQwfDz8zNWrFhhhISEWMYePnz4zf0G32b8/f2N8ePHWzsNERERERGROJNh3OQhPyJ3qLi4OOLi4or0xEIRySsgIAB/f3/LGWwiIiIiIiJWMkdbI0VEREREREREpExQIUxERERERERERMoEFcJERERERERERKRMUCFMRERERERERETKBBXCRERERERERESkTFAhTEREREREREREygQVwkREREREREREpExQIUxErMrZ2ZnAwEBrpyEiIiIiIiJlgAphIiIiIiIiIiJSJthZOwERERERuf2kp8PJk3DhgrUzKR0qVAB3d6hWzdqZiIiISEFUCBORf5WUlERMTAxfffUVp06dwtXVlY4dOzJt2jRatWoFwNKlS+nTp4/lnmPHjhEVFcXq1auxtbUlICCA+Ph4vL29AYiNjWXSpEkAbN68GZPJBICtrS3Z2dk3NfaBAwd45plnWLt2LWaz2dJPlSpVbuGnJCJS+m3fDp9/Dl+vhkMH4W9/HUshuVeBjoFw773Qvz84O1s7IxEREfk7k2EYhrWTELkdxcXFERcXx4kTJ6ydilWdPn2a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AABAVUERJumxxx7TY489Jk9PT+svLYC9eu655zRv3jzrexcXF3Xo0EG7du2Sg4ODevfuLV9fXxMT/k9ycrLuu+8+OTg4FDsazNnZWbm5uXJzc1OHDh3Uq1cvRURE6PbbbzchLWxVXl6efv/9dx09elRxcXGKi4uzvj569Kj1oRo+Pj5q1KiRQkND1bt3bz355JMKDQ1VaGholXzCKgAAAGCP7LoIGzp0qIYOHVru+y3J/9mfNm2apk+fXu7HtmdV/bpX9XyXzJ07V3Pnzi207O2339bu3buVn5+v+++/36RkhRmGoSFDhigtLc1agl0qvhwdHdW6dWv17dtXPXv2VJs2beTkZNc/7nANFy5c0LFjx3T06NEihdfx48eVm5srSfL391dISIgaNWqk/v37W4svyi4AAADANvCbYQWw42nXTFXVr/vV8hUUFOjkyZNKS0vTd999V4mpSiY0NFQODg5ydHRUnTp1qkTGd955R1u3brW+DwoKUkREhCIjI9W7d295eXmZmA5V0fnz55WYmFjsbYzHjx+3Fqr+/v7W2xbvvvvuIvN2AQAAALBdFGGASZKSkvTvf/9bH330kfbt22czt+V26dLF7AjFOnnypJYvX64VK1YoJCREERERuueee9StWzfmX7Ijl+brKu7Pb7/9Zi2kL5VdzZs3V0REhLXkCg0NlY+Pj8lnAQAAAKCiUIQBlSwpKUkTJ07Uv//9b3l7e6tv37564IEHdPPNNysgIEDOzs5mRyzWtm3blJeXp969e5sdRWfOnFFAQECRgisjI0O///679u3bp82bN+u1115T06ZNNW/evCo1wT+uz1/Lrkuju44ePaqMjAxJf94mW7duXWvBdXnZ1axZM3l4eJh8FgAAAADMQBEGVJLc3FwtXLhQs2fPVo0aNfTWW29p8ODBcnV1NTtaiTz44IPKz8+Xu7u72VGuentaq1at1L9/f82aNUs///yzXnjhBUVFRalXr15avHixmjRpUolJURaXJqcvblTX5U9idHV1VVBQkIKDg3X77bdr0KBBat68ucLCwlS/fn05OjqafCYAAAAAqhqKMKASpKam6p577tGePXs0fvx4jRs3rkoUSqXh4uJidoRSa9GihVatWqXHH39cTz/9tFq3bq2VK1eqf//+ZkezexcvXtSJEyeKLbt++eUX65MYL5+vKyIiQo8++qj1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vHixevbsKS8vL7Vo0ULLli1TUlJShRzz4YcfVnh4uDw9PdW9e3dFRkZq7969SklJsa4zYcIEHT9+XDExMerbt6+8vLwUFhamNWvWyDAMjR49uth9jx8/Xl27dpWHh4fatWunvLw83XDDDaXOFRERoX79+hXJVdz1CgsL06pVq5SdnX19Fwa4hmbNmmnSpEk6ePCgNm/erD/++EO33Xabtm3bJun6vs8V/d35q/T0dPXr10/5+fnavHmz/P39S34hAAAAABtFEQaYbMuWLZKkO++8s9Dy2rVrq3HjxhVyzDZt2hR6HxQUJElKTEy0Llu/fr0cHBwUGRlZaN3AwECFhYXpu+++04kTJ4rsu23btuWWq27dukVyXel61axZU02bNi3zsYHS6t27t3bv3q0BAwbovvvuU25u7nV9nyv6u3O52NhYtWvXTg4ODlq0aBFzngEAAMBuUIQBJrpw4YIyMzPl5uYmLy+vIp/feOONFXJcX1/fQu8dHP78UXDpaYgXLlxQRkaGCgoK5OvrW2QOoe+//16S9OuvvxbZt6enZ7nlcnFxKZLrateLES2obM7Oznr22Wd15swZHTx48Lq+zxX53blcWlqaoqKiVKdOHW3evFkrV64s83EBAAAAW8NTIwETubq6ytvbW5mZmcrKyiryy3Nqamqp9mexWMotl5+fn7KyspSTk3PFSfcr27Wu1+nTp01KBnuVnZ2tSZMmKSgoSGFhYeX6fa4oTk5O2rZtm3x9fdWhQwc98sgjatKkSZFRZQAAAEB1xIgwwGR9+vSR9L9b/i5JSUlRbGxsqfbl4eGhixcvWt83adJEb7zxRplyDRw4UHl5edq5c2eRz+bNm6d69eopLy+vTPu+Hle6XqdOndKRI0cqLUdubq6+/PJLTZgwocLmckPVdeHCBa1cuVK33HKLdu/erbVr18rJyalcv88VxdvbW0FBQfLy8tLGjRvl5eWlqKgo/h0DAADALlCEASabM2eOAgICFB0dra1btyorK0sHDx7U0KFDi7296mpuu+02HTlyRAkJCdq1a5eOHTumzp07lynXCy+8oJCQEP3f//2fNm/erIyMDKWmpur111/XzJkzNX/+fFNGihV3vQ4cOKCRI0cqMDCwQo8dFxenV199VZGRkfL19VW3bt00d+5c662lqN7y8vK0ZcsW67+1Bx98UF26dNH+/fvVvn17SeX7fa4MDRo00Nq1a5WcnKyBAwfqwoULZkcCAAAAKpbZz60EqqoFCxYYQUFBpdomPDzcGDNmTKmPFRsba0RFRRk+Pj6Gu7u70aZNG2PTpk1Gjx49DEmGJOOhhx4y1q1bZ31/6c+QIUOs+zl8+LDRuXNnw9PT06hbt66xZMkSwzAMY9euXUW2mzRpkmEYRpHl/fr1s+7vzJkzxtixY43g4GDD2dnZqFmzptGrVy9j69at1nWK2/dff7RcKXdZc11+vTw8PIwOHToYX331ldG1a1fDw8Oj1Nc/ISHBkGTs3Lmz0PLMzExj48aNxhNPPGHUr1/fkGQ4OzsbTk5OhbJduHCh1Me0J+3btzeio6PNjlFqZ8+eNbZv327MnTvXiIyMNPz9/Q1JRvPmzY25c+caJ0+eLHa7kn6fK/O7s3r16iLLFy5cWOx+Lv+ZAgAAAFQzMRbDMIzrr9OA6icmJkYxMTHFPhnxSjp06KD27dsrJiamApPhSpo2baqcnBwdP368VNudOHFCdevW1c6dOxUYGKgPP/xQGzZs0I4dO5SbmytnZ2fl5uYWu62bm5tycnLKI361FR4ervbt22vhwoVmRylWWlqaDh8+rIMHDyo2NlaHDh3S4cOHdezYMRUUFKhx48YKDw9Xx44d1bNnTzVo0MDsyAAAAADKZmHVmAEbAEro1KlTat68uf744w85Oztbl8fHxysuLk5Dhw4t1f7y8/P14YcfSvpz/rGzZ8/K2dlZeXl5uvT/Ca5Ugkl/zreEqis7O1vJyck6ceKEfv/9d504cUIJCQk6fvy4EhISlJCQoDNnzkj6c469Jk2aqGnTpho+fLhatmyp8PBw1axZ0+SzAAAAAFBeKMIA2Jy0tDSNGjVKM2bMUI0aNXTgwAGNHj1aPj4+mjJlSqn25ejoqJYtW0r6sxSzWCzKz89XSQfL5uTkqFOnTnJ3d5e/v7/c3d3l7u4uPz8/eXh4yN3dXb6+vvL09JS7u7t8fHzk5eUld3d3eXt7F3qNKzt37pzS09OVkZGhjIyMQq/T0tKUnJyslJQUpaSkKDk5WadOnVJKSorOnTtn3YeTk5OCgoJUt25d1a9fX71791adOnXUqFEjNWnSRPXr1y+3J68CAAAAqJoowoBy5ODgoPz8fLNjVGuBgYHatm2blixZoi5duigxMVH+/v6KiIjQqlWrFBwcXOp91qlTR9KfT/o7duyY5s2bp4MHD8rJyemaT8YMCAhQmzZtrEVNamqqcnJylJ6ernPnziknJ0cZGRnKzs4u9ETP4nh7e8vd3V1eXl7y8fGRu7u7PD09JUnu7u5yc3O76ms3Nze5u7sXee3q6ioPD48ir8tDQUGBMjIyiv0sKytLubm5On36tPbt26d58+YpPz9fZ8+elfRniXj+/HmdPXtWFy9e1NmzZ4tddmk/f+Xg4CBfX1/5+/urRo0aqlmzpmrWrKmmTZuqVq1a1vc33HCD6tSpo8DAQDk6OpbbuQMAAACwPRRhQDny8fFRZmam2TGqvR49eqhHjx7ltr9LxUyNGjXUqVMnDR8+XN99950WLlyoNWvWyMHB4Yq3R95yyy0lnvvqUgmUlZWlnJwcZWZmKjMzU+fOnVN2drYyMjKUk5NjLdVycnKs849dXgYlJydbX19esF3++ty5c9YnAF7+ujJ5eHjI1dVVmZmZSklJUWJioiTJ399f0v9KOW9vb7m4uCg4ONha4Pn4+MjFxcU6gs7X11d+fn7y9fW1vmYUHQAAAIDSoggDylG9evV0+PBhs2OglI4dOyaLxaK6detal91+++1auXKl/vGPf+j111/XSy+9pIyMDOutk9Kft1XWqFGjxMdxdHSUv7+/tQgyw6URV+XJycnpqqVUVZ8sHwAAAID9oAgDytGtt96q1atXW580CNvw7bffKiQkRF5eXkU+u+mmmzR9+nRNmDBBa9as0cKFC/Xjjz/KxcVF+fn58vPzMyFx2V2awwwAAAAA7JGD2QGA6qRnz546e/astm/fbnYUlMJHH32kO++886rruLq6asSIEdq/f7927dqlgQMHymKx2FwRBgAAAAD2jCIMKEchISFq3bq1li1bZnYUlND333+v/fv369577y3xNu3bt9fq1auVkJCge+65pwLTAQAAAADKE0UYUM6eeOIJvffee4qNjTU7Ckrg+eefV4sWLdSlS5dSbxsYGKibb765AlIBAAAAACoCRRhQzoYPH64WLd9OO8AAACAASURBVFpo9OjRZkfBNXz++ef6z3/+oxdffNHsKAAAAACASkARBpQzBwcHxcTEaNu2bdqwYYPZcXAF58+f11NPPaX+/furd+/eZscBAAAAAFQCijCgAnTp0kUjR47Ugw8+qEOHDpkdB39hGIYeeughJSYmauHC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AQAAAACVgyIMgE2bNGmS1q9frx9//NHsKAAAAACAKo4iDIBN69+/v2677TbNnj3b7CgAAAAAgCqOIgyATbNYLJo4caI++OAD/fTTT2bHAQAAAABUYRRhAGzegAEDdMstt1z1CZJRUVHWieotFos6depk/eyzzz6TxWLRhx9+aF0WHR1daP28vDzl5eXp3XffVc+ePRUYGCh3d3e1aNFCixcvVkFBQZnzr1y5stCxLBaLTp06Veb9AQAAAACKRxEGwOZZLBZNnjxZa9eu1c8//1zsOuvXr9eSJUskSf/+97+1Y8cO62crV660Lr9k0aJFWrdunXr06CHDMOTk5KQtW7bovvvuU/fu3XXo0CElJCTo0Ucf1dixYzV+/Pgy57///vs1duxY9ezZU6mpqTIMQ4GBgWXeHwAAAACgeBRhAKqFu+++WzfffPNVnyB53333ycXFRStWrLAuy8nJ0YYNG9SoUSNt3LhRmZmZ1s/eeecdDR8+vNA+unbtqgkTJsjf31833HCDRo8erQceeECLFy/W2bNnS507PT1d/fr1U35+vjZv3ix/f/9S7wMAAAAAUDIUYQCqBYvFokmTJum9997TgQMHil0nICBAffv21datW623Hm7YsEHt2rXTE088oZycHP3nP/+RJKWmpurLL7/UwIEDrdtHRkbqiy++KLLfli1bKjc3V7/88kupMsfGxqpdu3ZycHDQokWL5OjoWKrtAQAAAAClQxEGoNq45557FBYWphdeeOGK6wwfPlz5+flatWqVJGnFihUaPny47r//fjk6Olpvj1y9erUiIyPl5eVl3TYjI0NTp05VixYt5O/vb53Pa9y4cZKkc+fOlThrWlqaoqKiVKdOHW3evNl6eyYAAAAAoOJQhAGoNhwcHDRx4kS9++67Onz4cLHr9OvXTwEBAVqxYoWSk5O1e/duRUVFqVatWurVq5c+//xzJSUlafny5UVui/zb3/6mWbNm6ZFHHtGRI0dUUFAgwzC0cOFCSZJhGCXO6uTkpG3btmnDhg1q0aKFHnnkEe3du7fsJw8AAAAAuCaKMADVyr333qtmzZpd8QmSLi4uGjx4sPbv369Jkyapf//+cnd3lyQNGzZM+fn5mjZtmpKSktS9e3frdvn5+dq5c6cCAwP11FNPqWbNmrJYLJL+nGestLy9vRUUFCQvLy9t3LhRXl5eioqK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Ozvb5CQAAAAAUDoUYQBsimEYZkeoFIZhqKCgQAUFBWZHAQAAAIBqw8nsAACAory9vRUXF2d2DAAAAACoVhgRBgAAAAAAALtAEQagWlu/fr0sFov1T2xsrO69917VqFHDuiw6Otr6ulOnTtZtt2zZYl1+ww03XHGf8fHxGjx4sPz8/FSjRg1FRkYWGs11veufP3++TPu55PDhw4qKipKvr688PDzUtm1bbdq0SREREdZ9PfzwwxVx+QEAAACgSqEIA1CtRUVFyTAM9e/fX5I0atQoPf7440pISNDu3bvl6OioyZMnyzAMeXp6Ftq2d+/eMgxDt99++1X3GR0drejoaJ08eVLvvvuuPv/8c91///3ltn5Z9yNJR48eVXh4uPbt26e1a9fq9OnTWrZsmRYvXqyffvpJrq6uMgxDb7311vVcZgAAAACwCRRhAOzK+PHj1bVrV3l4eKhdu3bKy8srNNqrLB5++GGFh4fL09NTERER6tevn/bu3auUlJRyWf96jjtx4kSlp6dr8eLF6tmzp7y8vBQWFqZVq1bx1EcAAAAAdociDIBdadu2bbnvs02bNoXe161bV5KUmJhYLutfz3G3bNkiSbrzzjsLrVuzZk01bdq0VMcDAAAAAFtHEQbArvz19sfy4OvrW+i9i4uLJKmgoKBc1i/rcS9cuKDMzEy5ubnJy8uryPb+/v6lOh4AAAAA2DqKMAD4LwcHB128eLHI8vT0dBPSXD9XV1d5e3vr/PnzysrKKvL56dOnTUgFAAAAAOahCAOA/7rpppt08uTJQstOnTql33//3aRE169Pnz6S/neL5CWnTp3SkSNHzIgEAAAAAKahCAOA/+rVq5cSExP1yiuvKCsrS3FxcXr66ad14403mh2tzObMmaOAgABFR0dr69atysrK0oEDBzRy5EgFBgaaHQ8AAAAAKhVFGIBqbffu3bJYLNqwYYMkyd3dXRaLpdh1Z8+erYcfflhz5szRjTfeqAcffFDjxo1TYGCgzpw5I4vFoueee67YfU6ePFmSZLFYNG/ePElSq1atFBkZWer1169fX2T9oUOHlno/khQSEqJdu3apTZs2uueee1SrVi2NGjVKEyZMUMOGDeXo6FiOVxsAAAAAqjYnswMAQEVq3769DMMo0bq+vr568803iyzft29fkWVX2mdVWy5JjRs31rp164osT0pK0g03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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model.walk()\n", "model.show_graph()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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/CMAFy5cYNu2bQQGBjJx4kTat29vDXF+/kTCxho2bBiVlZVs27at1nuzZ8/m2muvrXFAemNdzn25u7tz/vx569fdu3fn9ddfb3D91Vs1q7cPVsvPz+fAgQONvzkREREREZGrgMIrkVZu1qxZBAUF8cc//pE1a9ZQXFzM8ePHGT9+PLm5udbwytHRkaioKPLy8njxxRfJz8+ntLSUTZs28dprrzVpPcHBwTz66KN8/PHHFBUVUVBQwMKFC5k5cyZz5szByanpdjRfzn3deuutZGdnc+zYMTIyMrBYLERGRja4/ueffx4/Pz9SUlJYv349JSUl7Nu3j8TExDq3EoqIiIiIiEgdDJGr1GOPPWbExMTYuowrIj8/30hJSTGCgoKMNm3aGNdcc42RkJBgZGdn1+h3+vRpY9y4cUbnzp2NNm3aGB06dDAeeeQR46mnnjIAAzBuu+02Y+XKldavf/7KyMgwQkJCDEdHRwMwTCaT4ejoaAwbNqzGPGfOnDEmT55sXHfddUabNm2M9u3bG/fee6+xfv16a5+65njooYeMjIyMWu1PP/20YRhGrfYhQ4Y06L6q7d+/34iMjDQ8PDyMzp07G3//+98bXH+1AwcOGPHx8Ubbtm0NNzc3Izw83Fi9erURHR1tnfuxxx5r3B9wC3A1/X0TEREREZEmtdZkGI08xEakhUpKSuLo0aN88sknti5FpNXT3zcREREREblM67RtUERERERERERE7JbCKxERERERERERsVsKr0RERERERERExG4pvBIREREREREREbul8EpEREREREREROyWwisREREREREREbFbCq9ERERERERERMRuKbwSkSvK09OTvn372roMERERERERaSEUXomIiIiIiIiIiN1ysnUBIiIiItL6/Pjjj5w8eZIff/zR1qW0CJ6engQEBODr62vrUkREROyOwisRqeX06dOkpaXxwQcfcOLECby9vYmMjOSZZ56hV69eAKSnp3P//fdbr8nJyWHq1KmsW7cOR0dHIiIiMJvNBAcHAzBnzhyefPJJALZt24bJZALA0dGRysrKRs29f/9+/vznP7Nx40YKCgqs47Rr164ZPyUREfm5qqoqPvnkE1asWMHGjRvJycnBMAxbl9XidOrUiXvuuYf4+HiGDh1KmzZtbF2SiIiIzZkM/V+FXKWSkpI4evQon3zyia1LsSu5ublERERQVlbGm2++yV133cWRI0d44okn2L59O59++ikRERHW/vHx8axatYq4uDimTp3KzTffTEZGBvfddx833XQTO3bsqDG+p6cnvXr1YuvWrU029913382MGTPo3bs3//3vf7nzzjvJy8ujXbt29OvXjz179rBmzRruuOOO5vvg5Bfp75tI67Zs2TKmTZuGxWIhPDycQYMGcdttt9G5c2fatm1r6/JahJKSEnJzc9m9ezfr16/n888/JyAggL/85S8kJSXh6Oho6xJFRERsZZ1WXolIDampqRw5coS3336bwYMHAxASEsKSJUvo2rUrEyZMYNeuXbWuS0pKsgZL/fv3Z8iQISxfvpz8/Px6r4C63LmnTp1KVFQUAH369KmxkquqqgrDMPTbfxGRZvDf//6XiRMnsmXLFkaPHs3q1avp0aOHrctqsW6++WYGDBjAtGnTOHLkCPPmzWPChAksXLiQV155RQ88ERGRq5YObBdpxbKysjCZTDVeycnJv3hNeno6Dg4OxMbG1mgPDAwkJCSE3bt3c/z48VrXhYeH1/i6c+fOAJw4caLe9V7u3L17977kmJs3b6agoKDGii0REWm8JUuW0Lt3b8rKysjMzGTRokUKrppQly5dePnll9m7dy8BAQFERUUxb948W5clIiJiE1p5JdKK3XTTTQ1acVReXk5RUREA3t7el+z33Xff0alTpxptF/d3dnYGflr51Nxze3h41GsOERFpPMMw+Nvf/sa0adNITk7mpZde0pa2ZtSjRw/Wrl2L2Wxm8uTJfPPNNyxYsEBnYYmIyFVF4ZWIWLm4uODj40NJSQmlpaU4OTX9t4jqg9ptMbeIiDTeX/7yF1544QX+8Y9/MHbsWFuXc9WYNGkSXbt25aGHHqKyspJFixbZuiQREZErRtsGRaSGYcOGUVlZybZt22q9N3v2bK699toaZ0o1lLu7O+fPn7d+3b17d15//fUrMreIiDTOsmXLePbZZ5k/f76CKxuIi4vj/fff5z//+Q+zZ8+2dTkiIiJXjMIrEalh1qxZBAcH8+ijj/Lxxx9TVFREQUEBCxcuZObMmcyZM6dRq6JuvfVWsrOzOXbsGBkZGVgsFiIjI5tt7n79+uHv709mZuZl1ywiIvDll1/y8MMPM2XKFMaNG2frcprckiVLrOdDurq62rqcSxowYAAvvfQS06ZN4+OP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AHBzc7OuiPq5gIAAduzYQXx8PMnJybRv354ePXqwYsUKVq1axYgRIwCYM2cOJpOJPXv28P3332MymZg+fToAS5cuZdy4ccyfP5+OHTsSFBTE4sWLGTVqFAAxMTEEBQUxduxYvLy82Lt3L3FxcWRlZZGfn09UVBQVFRVs2bIFZ2dnnn322Sv0KTWP4OBgMjIyCA8PZ/jw4QQEBPDII48wYcIEQkNDKS8vx2QykZSUBPy0JXDnzp08+OCDTJw4EX9/f3r37s3Zs2fZsGEDY8aMadD8ycnJV8XnLCIiciWYjLoOQBC5CiQlJXH06FE++eQTW5civ+DLL78kPj6e77//HkdHRyorK2nTpg3nz58nMjKS5cuXExAQYOsy5VfU9+/bjh07ePfdd/nPf/5Dfn4+8NMh1G3btr0SZYq0anfffbc1MImNjSUxMZFBgwbh6up6yWvWrVvHwIEDKSws/MXD5MW2vL29mTt3rjWIExERaWXW6WmDImK3jh49yj333MPZs2epqqqiqqoKgPPnzwM/rWi499572bVr1y9upxH79u233/Luu++yePFijhw5grOzs/XPWESaTvXvK8+fP88HH3zAypUrcXNz44EHHuChhx6iX79+ODo62rhKERERkdq0bVBE7NaMGTMoLS3lwoULdb5fUVFBVlYWixcvvsKVSWMdP34cs9lM7969ufHGG5k9ezZHjhwBUHAlcgVUVlZiGAbnzp3j7bff5t5778Xf359x48axdevWOp9MKCIiImIrCq9ExG6tWLHiVw+zNQyD999//wpVJI1RUVHB4sWLiYqK4tprr+XJJ59k165dgAIrEVuqfophUVERb731FpGRkXTs2JFJkyZx8OBBG1dnf0wm06++ZsyYYesyRUREWhXtsxERu1RSUkJRUdGv9quqqtIPV3Zu9erVfPLJJxw7dozNmzdb2+v7lK127do1U2UiV5fqrde/pDpIzsvL45VXXrG2z58/nz/96U84Ozs3W30thValiYiIXHkKr0TELrm4uGAymer1Q4Kbm9sVqEguV0xMDN27d6ewsNC6DdRkMtXrB2mAqKgonWkm0gR27drF6dOn69XXwcEBwzBo164dp0+fJiEhQcGViIiI2Ix+GhARu9SmTRt69OjBt99++6v9fvvb316hquRyuLi40KVLF0wmE6tWrWL16tUsWrSI9evXYxgG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JT5t8FIcHBz4xz/+YT343tXVlbFjx9boU73q6sCBAwwZMoSnnnqKrl27MmPGDH744QdblC0iIlKDwisRsVsWi4WgoCBblyEiclWprKzkhRde4Oabb2bfvn3NPl9AQAA7duwgPj6e5ORk2rdvT48ePVixYgWrVq1ixIgRACQnJ+Pl5cXevXuJi4sjKyuL/Px8oqKiqKioYMuWLTg7O/Pss8+Snp6OyWRi1apVALi5uZGYmGidc968edx888307NmTkSNHYjab6dmzZ43PoCU+bfBSTCYT8+bN409/+hPJycm0bdu2zn7BwcGYzWYOHz7M//3f/2E2m+nSpQuTJk2qcWi+iIjIlWYyWsu/yiINlJSUxNGjR/nkk09sXYrUoby8HHd3d5YtW8bvfvc7W5cjjaS/byItw9dff82YMWPIyspi6tSphIeHExsbS2FhId7e3rYuTy7B29ubuXPnkpSU9Kt9S0tLcXNzq9e4xcXFvPnmm7z44oucPn2akSNH8tRTT3HjjTc2tmQREZGGWKeVVyJilw4fPkxVVZW2DYqIXAGlpaU89dRT3H777bi6uvLVV18xY8YM63Y9aT3qG1wBeHl5MWnSJCwWC//85z/ZtWsXN910E0OHDq3zjDIREZHmovBKROySxWIB0LZBEZFm9tlnn9GrVy9ee+015s6dy2effUaPHj1sXZbYEWdnZ0aPHk1WVharVq3izJkz9O3bl759+/Lee+9RVVVl6xJFRKSVU3glInbJYrHg7++Pj4+PrUsREWmVfvjhB8aNG8c999xDt27dyMrKYtKkSdan0olczMHBgaFDh/LFF1/w+eef4+vry8iRI61PKCwrK7N1iSIi0krp/05ExC7l5ORoy6CISDN577336NGjBx9++CHLli3jww8/pFOnTrYuS1qQvn378uGHH7Jnzx4iIiJ48sknCQoKYsaMGRQWFtq6PBERaWUUXomIXbJYLAqvRESa2IkTJ7j//vsZOXIkAwYMICsri+HDh9u6LGnBQkNDWbx4MUePHmXcuHHMmzfP+oTCEydO2Lo8ERFpJRReiYhdUnglItJ0qqqqeP311+nRowdZWVls2LCBxYsX4+fnZ+vSbGbJkiWYTCZMJhOurq62LqfFCwwMZMaMGRw9epSZM2eyfPlygoKCGD16NPv377d1eSIi0sIpvBIRu5STk6PD2kVEmkBW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e/boq6++0pIlS/Tmm29q1KhRmjp1qgICAoyOBwAAAADZsOcVgBLr4sWL6t69uzp27KgGDRro6NGjWr16tfr161ekxZWkEllcSZLValWrVq00c+ZMnTp1SnPnztWiRYtUt25dffnll0bHAwAAAIBsKK8AlEgHDhxQixYtdODAAW3evFkrV65UjRo1jI5Vonh4eGjYsGGKiopS165d1atXL02bNk0Oh8PoaAAAAACQidsGAZQ4mzdvVs+ePdW4cWN9+eWXKlu2rNGRSrTQ0FB98MEHuvfeezVixAhFRUVp8eLFslgsRkcDAAAAAMorACXLzz//rMcee0xdunTR4sWL5eXlZXSkUmPo0KEKDw9X9+7dFRISorfeesvoSAAAAADAbYMASo7Y2Fg99thjuvvuuymuikiHDh20dOlSLViwQAsWLDA6DgAAAABQXgEoOQYMGCCz2axVq1ZRXBWhxx9/XNOmTVNERIT27dtndBwAAAAAbo7yCkCJsHr1am3YsEEfffSRypQpY3ScUm/ixIlq2bKlRowYwQbuAAAAAAxFeQXA5aWkpGjcuHHq16+f2rRpY3Qct2AymTRv3jz98MMPWrFihdFxAAAAALgxyisALm/ZsmU6ffq0XnvtNaOjuJV77rlHAwYM0PTp042OAgAAAMCNUV4BcHkLFy5Ur169VKVKFaOjuJ1Ro0bpwIED2rFjh9FRAAAAALgpyisALu3ChQvatWuX+vTpY3QUt3TPPfeodu3aWrt2rdFRAAAAALgpyisALm379u2SpHbt2hkbxI21b98+8+cAAAAAAMWN8gqAS/vll19Us2ZN+fv7Gx3Fbd111106cOCA0TEAAAAAuCnKKwAu7eLFiwoLCzM6hlurUKGC4uPjlZqaanQUAAAAAG6I8gqAS0tOTpaPj4/RMYqczWZT7dq11bVrV6OjZOPr6ytJSkpKMjgJAAAAAHdEeQUALsDhcMhut8tutxsdBQAAAABciofRAQAAUkBAgI4fP250DAAAAABwOay8AgAAAAAAgMuivAJQqqxevVomkynzceTIET355JMqU6ZM5rGIiIjMr1u3bp157TfffJN5vGzZsrnOefLkSfXu3VvBwcEqU6aMunbtmmXV1O2OT05OLtA81xw+fFg9evRQUFCQfH191bx5c3311Vdq37595lyDBg0qircfAAAAAAod5RWAUqVH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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model.drink()\n", "model.show_graph()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABLcAAAKHCAYAAABzUqqZAAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzdf1jV9f3/8fsB5DeCIEimTWWhRog/QmWBQ5GVgYO8/EHOnDPTzUSZcx/D2r5OWurC8lizdG1ufjZTs8SmZR81nUH4c0uzFPJnqKAiQWCCIO/vH12chUcI5Mfx4ON2XefadV7v1/v1er7eXjN88ny93ibDMAxERERERERERETsT76DrSMQERERERERERG5VUpuiYiIiIiIiIiI3VJyS0RERERERERE7JaSWyIiIiIiIiIiYreU3BIREREREREREbul5JaIiIiIiIiIiNgtJbdERERERERERMRuKbklIiIiIiIiIiJ2S8ktERERERERERGxW0puiYiIiIiIiIiI3VJyS0RERERERERE7JaSWyIiIiIiIiIiYreU3BIREREREREREbul5JaIiIiIiIiIiNgtJ1sHIHK7evfdd1m1apWtwxBpEx555BF+9rOf2ToMERERERFpg1S5JVKHzz//nM2bN9s6DBG7t3PnTv7zn//YOgwREREREWmjVLklUg8fHx/efPNNW4chYtciIyNtHYKIiIiIiLRhqtwSERERERERERG7peSWiIiIiIiIiIjYLSW3RERERERERETEbim5JSIiIiIiIiIidkvJLRFpVhs2bKBfv364u7tjMpkwmUwcOXKEgoICHn/8cTp37mxpnzBhgq3Dtbm1a9danoerq6utwxEREREREbE7Sm6JSLPJzs5m7NixxMbGcvHiRY4fP06XLl0AGD9+PDt37uT999/nq6++4te//nWjxy8rK+Pee+8lPj6+uUO3maSkJAzDICYmxtahiIiIiIiI2CUnWwcgIm3HunXrMAyDWbNm4enpiaenJ3l5eRQWFrJz506eeuopQkNDAVi8eDGGYTRqfMMwqK6uprq6uiXCr5Onpyd9+/YlMzOzVecVERERERGR76bklog0m7y8PAD8/Py+s71mK15jeHl5ceLEiSZGKSIiIiIiIm2JtiWKSLO5fv16ve2NTWaJiIiIiIiIfBclt0TuQJcvX2b27NkEBQXh4uJCly5dGD58OH/961+5evWqpV9VVRXr1q0jNjaWwMBA3NzcCA0NxWw219oamJGRgclkYtOmTQC4ublZKrNMJhPh4eEA/O53v7O0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LS0lNzeX8ePHk5+fj9lstmxPbKiysjISExNZunQp9913H926dWPDhg2cP3+e0aNHWx00LCIiIiIiIi1HyS0RsStBQUFkZ2cTHh7O6NGjCQgIYNKkSSQnJxMaGkpFRQUmk4kpU6YA32w53L9/P4899hgzZ87Ez8+PgQMHcuXKFbZv386TTz7ZqPlnzJiBl5cXhw8fJiEhgSNHjlBYWEh0dDSVlZXs3r0bZ2dnnnvuuZZYvoiIiIiIiNxAZ26JSKvas2dPk8cIDg62vAXx2258I2INPz8/XnrpJV566aUmz/3KK6/wyiuvWLUbhtHksUVExJqnpyd9+/YlMzPT1qGIiIjIbUqVWyIiIiIiIiIiYreU3BIREREREREREbul5JaICGAymb7zM3/+fFuHKSJyW7p06RIzZ86kW7duODs74+/vz6hRo/j4448tfTIyMmr9nXr69GnGjRuHj48Pfn5+xMfHc+LECUv/9PR0TCYTV65cISsry3Kfk5NTk+fOyclh7Nix+Pn5WdoKCwtb/kGJiIhIi1ByS0SEb87M+q6PklsiItby8/MJDw9n/fr1LF++nKKiInbt2kVRURERERFkZ2cDkJiYiGEYJCQkAJCSkkJKSgrnzp1j3bp1fPDBBzz22GOWcefMmYNhGHh4ePDggw9a/i6uqqpq8tzTpk1j+vTp5OXlsWfPHhwdHS1jDhs2DD8/v2Y5I1JERERah5JbIiIiInLLUlNTOXPmDC+++CKPPPIInp6ehISEsHbtWgzDIDk5+ab3TZkyhYiICDw8PBg+fDhxcXHs37+/URVUtzr33LlziY6Oxt3dnUGDBlFVVUXHjh0BqK6utiTSRERExD4ouSUiIiIiABw5csRqS/aMGTPqvScjIwMHBwfi4+NrtQcGBhISEsLBgwc5e/as1X3h4eG1vnft2hWA8+fPNzjeW5174MCBdY757covERERsQ9O391FRERERO4E999/f6MqlioqKigpKQHA29u7zn6ff/45Xbp0qdV2Y39nZ2fgm8qplp7bw8OjQXOIiIiIfVByS0RERERuiYuLCz4+PpSVlXH16lWrw96bg8lkstncIiIiYh+0LVFEREREbtmoUaOoqqoiKyvL6trixYu55557ah0C31ju7u5cu3bN8r1nz56sXLmyVeYWERER+6DkloiIiIjcsoULFxIUFMTkyZN57733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EWHPnj2YTCY2bdoEgJubm6Wi6tsCAgLYt28fiYmJzJgxA39/f3r16sXbb7/Npk2bGDt2LADp6emYTCYOHTrEuXPnMJlMPPvsswCsW7eOadOm8fLLL9O5c2e6d+/O6tWrGT9+PACxsbH06NGDadOm4eXlxeHDh0lISODIkSMUFhYSHR1NZWUlu3fvxtnZmeeee66VnlLLCAoKIjs7m/DwcEaPHk1AQACTJk0iOTmZ0NBQKioqMJlMTJkyBfhmy+H+/ft57LHHmDlzJn5+fgwcOJArV66wfft2nnzyyUbNP2PGjDviOYuIiLQFJuNmBziICGazmUWLFt30deNt2blz50hMTOTAgQM4OztTWVlJu3btqKqqonv37mzatImQkBBbhyl2JDIykv79+7Ns2bI6+1y/fp2dO3eyZs0a3nzzTcrKyvD39+fixYutGKnI7S0sLIzDhw/j6upKQkICP/nJT3jooYdwdnau857z589z99138+GHHxIZGdmK0UpjREVF0b9/f8xms61DERERsUf5eluiiFiUl5czdOhQTp8+DcC1a9dq/e+ZM2eIjo7m008/JSAgwFZhShuyd+9e3njjDdasWcOlS5do166dZZuPfvciUlvN/yfKy8t56623WL9+PZ6eniQlJTF+/HiGDBmit/iJiIjIHUk/AYmIxcqVKzl16lSdZ4hUVVVRUlLCokWLWjkyaUuOHj3K/Pnz6d69O4MHD2b58uWWg5l1fo1Iw1RVVWEYBqWlpfztb39j6NChBAYGMmvWLDIzM5UcFhERkTuKklsiYrFhwwauX79eb5/KykrWr1/fShFJW1FWVobZbGbgwIHcd999LFy40FIhqISWSNPUVNdeunSJV199laioKLp27crTTz/N8ePHbRzd7cdkMn3nZ/78+bYOU0RERBpB2xJFxOLkyZMN+m1/fn4+169fx9HRsRWiEntlGAZ//etfOXz4MFlZWbWu1fxjvD5FRUX1niUkcqeprq7+zj41yeJz586xePFiFi9eDMBbb73F4MGD631j451CVW0iIiJtj37CERELNze3BvVr166dElvynUwmE6NHj+b555/H0dGRkpISTCYThmE06B+Xzs7ODB06tBUiFbEPe/bs4csvv/zOfjXVR4ZhcPfdd3P27FmGDx+uxJaIiIi0WfopR0QsBg8ezOnTp6mqqqqzj8lkom/fvq0YldgzLy8vOnXqxIgRI5g/fz6bN2/mL3/5C7t378bJyclybtDNeHp68u6777ZyxCK3rz59+tSb3Kr5/9T3v/99xo8fz8SJE3F1deXuu+/G29u7FSNtOWvXruWxxx4DwMXFhfLychtHJCIiIrcDnbklIhZTp06tN7FVY8aMGa0QjbQ1vr6+TJw4kV27dvHFF1/wwgsv8MADDwBo+6HITZSVlXHvvfcSHx9fZ5927doBcPfdd/OrX/2Ko0ePkpuby/z58+nRo0drhXpTgwcPrjf2W5GUlIRhGMTExDTruCIiImLflNwSEYuoqCjmzp1r2dJyIwcHB8aOHctPfvITG0QnbUmXLl2YNWsW+/bt49NPP+V//ud/6Nq1K6BEl0gNwzCorq62OmurJqHl7+/PzJkzOXDgAGfPnmXRokX06tXLFqGKiIiI2JSSWyJSy6JFi/jb3/5Gly5darX7+fmRnp7OmjVrbpr4ErlV9913H2lpaXzxxRfs2bOHX/ziF3Ts2FHnuskdz8vLixMnTli25zo5OdG+fXsmTZrErl27KCgoID09nQEDBtg4UhERERHb0plbImLl8ccf5/HHH+fQoUNERUXx4osvMnnyZBwclA+XljVo0CAGDRrEkiVL2L9/v63DEbmtvPbaa/Tt21fVjSIiIiI30L9URaROwcHBlJaW0qlTJyW2pFU5OjoyePBgW4ch0iIqKir47W9/S69evXB3d8fX15eRI0fyzjvvcP36dQAyMjIsW8RNJhPl5eUMHDiQZcuWWdq6dOnC/v37iYmJwcvLC3d3d4YOHUpWVpaNV9h8jh07RmJiIt7e3nh4eBAVFUVmZmad/S9fvszs2bMJCgrC2dmZDh06MGLECHbu3NmoeYuLi2s9f5PJxHPPPQdAVVVVrfbRo0c3aY0iIiLSdPrXqojUqWZb2I3nvYiIyK2bMWMGy5Yt4+WXX+by5cscPXqUXr16kZCQwIcffghAYmIihmGQkJBQ6945c+ZgGAZhYWEUFxcza9YsnnvuOQoKCti9ezdFRUUMGzaMf/3rX7ZYWrM6fvw4ERERHDhwgA0bNnDhwgWWL19OWloaJ06csOpfUFBAeHg4a9aswWw2U1hYyN69e3F3dycmJobXX3+9wXP7+PhgGAYPPfQQDg4OHD9+nGeffRb4ZnuoYRhERETwj3/8gw0bNjTbmkVEROTWKLklInWqqdaqqSQQEZGm27FjByEhIcTGxuLm5kanTp144YUXCA4ObtQ4V65cYfny5URERODh4cEDDzzA3//+d65du8asWbNaKPqbc3Jysqp02rt3L1u2bLFqDwwMbNCY8+bNo7i4GLPZTGxsLJ6enoSGhrJq1Sry8/Ot+qempnLq1CmWLl1KfHw87du3Jzg4mDVr1nDXXXcxc+ZMLly40Kh1zZ49m+rqal588cVa7VlZWXzxxReMGTOmUeOJiIhIy1ByS0TqpMotEZHm9/DDD/PRRx8xdepU9uzZY/kFQk5ODtHR0Q0ex8PDg759+9ZqCw0NpXPnzhw6dOimCaCWUlVVhWEYtT6DBg0iLi7Oqr2goKBBY27duhWAhx56qFZ7586db5oI3LhxIwBxcXG12l1cXIiJieHq1au8//77jVrXj370I0JDQ/nrX//K5cuXLe0vvPACycnJljdXioiIiG0puSUidar5Lbsqt0REms8f//hHVq9ezcmTJ4mJiaF9+/Y8/PDDluRMQ/n4+Ny0PSAgAICLFy82OVZbqaiooLS0FFdXVzw9Pa2u16zx2/1LSkpwdXXFy8vLqn+nTp0AGpxY+7aUlBS+/vprli9fDkBubi4ffPABU6dObfRYIiIi0jKU3BKRejk4OKhyS0SkGZlMJh5//HG2b99OcXExGRkZGIbBqFGjrLa/1efy5csYhmHVXpPUujEBZE9cXFzw8vKivLycsrIyq+tFRUVW/b29vSkvL6e0tNSqf812xIZuify2n/zkJ3Tq1IlXXnmFiooKlixZwk9/+lM6dOjQ6LFERESkZSi5JSL1cnR0VOWWiEgz8vHx4dixYwC0a9eO2NhYy9sRt2zZ0uBxysvL2b9/f622Tz75hPPnzxMWFsZdd93VrHG3thEjRgD/3Z5Yo7CwkJycHKv+jz76KIDVM6yoqGDHjh24ublZbXFsCBcXF6ZPn87FixdZsmQJ//jHP1r9TDMRERGpn5JbIlIvVW6JiDS/n//85xw+fJiKigouXrzIH/7wBwzDYNiwYQ0ew9vbm3nz5pGdnc2VK1c4cOAAEyZMwNnZGbPZ3ILRt47nn38eX19fUlJS2LZtG2VlZXz22WdMmDDhplsVFy5cSPfu3UlJSWHz5s2UlpaSm5vL+PHjyc/Px2w2W7YnNtb06dNxc3Pj2WefZfjw4Xz/+99v6vJERESkGSm5JSL1UuWWiEjz+te//kWvXr1ISkrC19eX3r17s3XrVv70pz8xb948AEsl16ZNmwBwc3NjwoQJtcbx9PTk5Zdf5ne/+x133XUXQ4YMoUOHDnzwwQf88Ic/bPV1NbegoCCys7MJDw9n9OjRBAQEMGnSJJKTkwkNDaWiogKTycSUKVOAb7Yc7t+/n8cee4yZM2fi5+fHwIEDuXLlCtu3b+fJJ5+85Vg6duzIhAkTMAyD2bNnN9cSRUREpJk42ToAEbm9qXJLRKR5hYWF8dprr9XbJzEx8abnad2oJjF2O9qzZ0+TxwgODr7pQfs3vhGxhp+fHy+99BIvvfRSk+e+UUREBP/+978ZMmRIs48tIiIiTaPKLRGpl4ODgyq3RETkjvfaa6+paktEROQ2peSWiNTL0dFRlVsiInLHef3113n00UcpKyvjtdde48svv2Ts2LG2DktERERuQsktEamXtiWKiNw+0tPTMZlMHDp0iHPnzmEymXj22WdtHZZdMZlM3/mZP38+8M3ZZx06dODVV19l7dq1ODnpRA8REZHbkf4LLSL10oHyIiK3jzlz5jBnzhxbh2HXGnKWWY2aw+pFRETk9qbKLRGplyq3RERERERE5Ham5JaI1EuVWyIiIi3nypUrjaomExEREWvaligi9VLlloiI2EJZWRn9+vWjZ8+ebN682dbhtJi8vDwOHDjAvn372LBhA35+fgQEBBAQEICvr6/l4+fnV+t7TZuDg35XLSIiouSWiNRLlVsiImILhmFQXV1901+weHp60rdvXzIzM20QWfPq1asXffr0ITc3l/Pnz3P+/Hngm4PvnZyccHBwwDAMqqqqbvos/P39yc3NxcfHp7VDFxERuW0ouSUi9VLlloiI2IKXlxcnTpywdRitwsXFhbFjx7J//34+/fRTKisrMQyDysrKeu9zcHAgNjZWiS0REbnjqY5ZROqlyi0REZGW5+bmRmZmJkOGDMHJqWG/f66uriYlJaWFIxMREbn9KbklIvVS5ZaIiHyXS5cuMXPmTLp164azszP+/v6MGjWKjz/+2NInMjISk8lk+UyYMAGA4cOH12ovLi4mIyOjVlt5eTkA6enpmEwmrly5QlZWluV6Q5NBtzsPDw/effddEhISvvMsLUdHRwYOHEh4eHgrRSciInL7UnJLROrl6Oio5JaIiNQpPz+f8PBw1q9fz/LlyykqKmLXrl0UFRURERFBdnY2AJmZmXz88cd4eHgQFhbGihUrANiyZQuDBg3ijTfewDAMfHx8SExMxDAMEhISas01Z84cDMPAw8ODBx98EMMwLOdRfduwYcPw8/Njz549rfMQmpGzszPr1q1j8uTJmEymOvtVV1fz8MMPt2JkIiIity8lt0SkXg4ODtqWKCIidUpNTeXMmTO8+OKLPPLII3h6ehISEsLatWsxDIPk5GRL37CwMFatWsWhQ4eYOHEihmEwbdo0YmJiSEpKaraYqqurLYkve+To6MjKlSv5zW9+U2cfd3d3FixYQFhYGH/+858t1W0iIiJ3IiW3RKReqtwSEblzHDlypNZ2QJPJxIwZM+q9JyMjAwcHB+Lj42u1BwYGEhISwsGDBzl79qylfcyYMTzzzDO8/fbbREZGcvnyZdLS0pp1Hd+uHLNXJpOJ3/3udyxdutSqgqtdu3Y8++yzHDx4kMGDB5OcnExgYCCzZs3iiy++sFHEIiIitqPklojUS5VbIiJ3jvvvv99S8VTzeeWVV+rsX1FRQUlJCdXV1Xh7e1slxv79738D8Pnnn9e6Ly0tjUGDBvHRRx8xZsyY7zxf6k42a9Ys/vrXv+Lo6Gh5TiaTiSeffJL+/fuzYsUKTp8+TWpqKm+//TY9evRg5MiRbN++3caRi4iItB79JCEi9VLlloiI1MXFxQUfHx+cnJyorKy0SozVfIYOHVrrvl27dlFSUkJoaCjTp0/n0KFDjZq3vrOo2qKJEyfy5ptv4ujoiMlk4vHHH8fPz89yPSAggLlz53LixAneeOMNLl++TGxsLAMGDGDlypXasigiIm2eklsiUi9VbomISH1GjRpFVVUVWVlZVtcWL17MPffcU+vA91OnTvHEE0/w1ltv8c477+Dm5kZCQgKXLl1q8Jzu7u5cu3bN8r1nz56sXLmyaQu5zT366KNs3boVT09PZs2addM+zs7OjBkzho8++ogDBw4QEhLCjBkz6NatG08//TTnzp1r5ahFRERah5JbIlIvBwcHVW6JiEidFi5cSFBQEJMnT+a9996jpKSEoqIiVqxYwYIFC0hPT8fJyQmAsrIyEhMTWbp0Kffddx/dunVjw4YNnD9/ntGjR1NZWdmgOfv3709ubi55eXlkZ2dz8uRJoqKiLNft+W2J9Rk2bBiHDh0iNDT0O/sOGDCA1atXc+bMGX7+85/z5z//mR49ejB27Ng291xERESU3BKRemlbooiIfbpw4QJTp05t8XkCAgLYt28fiYmJzJgxA39/f3r16sXbb7/Npk2bGDt2LAAzZszAy8uLw4cPk5CQwJEjRygsLCQ6OprKykp2796Ns7Mzzz33HBkZGZhMJjZt2gSAm5sbEyZMsMy5dOlS+vTpQ+/evRk3bhxms5nevXtbrldVVdn12xLr071790b1v+uuu5g/fz5nz57lT3/6Ezk5OURERPDAAw+wevXqWlV1IiIi9srJ1gGIyO1N2xJFROzP3/72N375y1/i5eXVKvP5+vqyZMkSlixZUmefV1555aaH09eVgKovMdWzZ092795d5/X6rt2pXFxcmDhxIhMnTiQzM5Nly5YxefJknn76aaZOnUpycnKtc7xERETsiSq3RKReqtwSEbEf+fn5JCYm8rOf/YwxY8bojXlyU5GRkaxfv57c3FwmTpzIyy+/zN13383EiRP55JNPbB2eiIhIoym5JSL1UuWWiMjtzzAMVq9eTUhICEeOHGHHjh2sWLECDw8PW4cmt7EePXqwaNEizpw5w7Jlyzh48CB9+vQhMjKSN998U//9FxERu6HklojUS5VbIiK3t9OnT/OjH/3IUq116NAhhg4dauuwxI54enoydepUjhw5wrZt2+jQoQPjxo0jODiYxYsX8+WXX9o6RBERkXopuSUi9VLllojI7ckwDFauXEloaCj5+flkZ2erWkuaxGQyMXz4cP75z3+Sk5NDfHw8aWlpfO9732PatGkcPXrU1iGKiIjclJJbIlIvVW6JiNx+Tpw4QUxMDE899RRPPfUUBw8eZODAgbYOS9qQe++9F7PZzPnz50lLS+P//u//uP/++4mNjeWf//xnm3wTpYiI2C8lt0SkXqrcEhG5fVRXV7Ny5UrCwsK4fPkye/bsYdGiRbi4uNg6NJtYu3YtJpMJk8mEq6urrcNpk9q3b8+sWbM4ceIEGRkZACQkJNCzZ0/MZjNXrlyxcYQiIiJKbonId1DllojI7eHTTz8lIiKCGTNmMGPGDPbv38+AAQNsHVaDDR48mPj4+GYdMykpCcMwiImJadZxxZqDgwMjR45k27Zt/Oc//2Ho0KHMmzePzp07M2vWLE6fPm3rEEVE5A6m5JaI1EuVWyIitlVVVcXixYsZMGAA165dY9++fSxatAhnZ2dbhyZ3qLCwMFasWMHp06eZN28eGzduJCgoiJEjR7J9+3ZbhyciIncgJbdEpF6q3BIRsZ3Dhw8zePBg5s+fz+9+9zsOHDhA3759bR2WCAD+/v7MnTuXU6dOkZGRQXl5ObGxsfTr14+VK1dy9epVW4coIiJ3CCW3RKReqtwSEWl9lZWVLF68mPDwcFxcXPjPf/7D3LlzcXR0tHVoIlYcHR0tWxYPHDjAwIEDmTVrFt26dePpp58mLy/P1iGKiEgbp+SWiNRLlVsiIq3r448/ZuDAgSxYsIAFCxbw4Ycf0qtXL1uHdVs4duwYiYmJeHt74+HhQVRUFJmZmXX2v3z5MrNnzyYoKAhnZ2c6dOjAiBEj2Llz5y3N7+PjYznA/saPg4MDZ8+evdWltRkDBgywbFmcPXs2f//73wkKCmLs2LFkZWXZOjwREWmjlNwSkXqpcktEpHWUl5fz9NNP88ADD+Dl5cXHH3/M3LlzcXDQj2sAx48fJyIiggMHDrBhwwYuXLjA8uXLSUtL48SJE1b9CwoKCA8PZ82aNZjNZgoLC9m7dy/u7u7ExMTw+uuv31IcpaWlGIZh+SxYsACA3//+93Tp0qVJa2xLOnXqxNy5czl58iT/+Mc/yMvLIzIykgceeIDVq1dTWVlp6xBFRKQN0U9LIlIvVW6JiLS8jz76iH79+vHqq6+yZMkSdu3axb333mvrsG6Zk5OTVWXT3r172bJli1V7YGBgg8acN28excXFmM1mYmNj8fT0JDQ0lFWrVpGfn2/VPzU1lVOnTrF06VLi4+Np3749wcHBrFmzhrvuuouZM2dy4cKFJq1z/fr1/L//9/+YNGkSqampTRqrrXJ2dmbMmDFkZ2dz4MAB7rvvPp544gnuuece5s+fz6VLl2wdooiItAFKbolIvVS5JSLScr7++muefvpphgwZQrdu3fjkk0+YNWtWs1Vr1bxRsbWrZKqqqmpVNxmGwaBBg4iLi7NqLygoaNCYW7duBeChhx6q1d65c2eCg4Ot+m/cuBGAuLi4Wu0uLi7ExMRw9epV3n///Uatq7i4GE9PTwD27t3LT3/6U4YMGcKKFSsaNc6Nrl27dke8/XLAgAGsXr2aM2fOMG3aNF555RW6du3K2LFj2bt3r63DExERO6bklojUy8HBQZVbIiIt4MMPP6Rv376sWLGC5cuX895773HPPfc06xze3t44ODhQVFTUrOO2toqKCkpLS3F1dbUkl74tICDAqn9JSQmurq54eXlZ9e/UqRNAgxNrN/riiy9ISEiga9euvP32201OTBUVFdGhQ4cmjWFPOnfuzPz58zl79iwrV67k6NGjDB482LJlsaqqytYhioiInVFyS0TqpW2JIiLN66uvvmLWrFlER0cTHBzMkSNHmDp1aovM1a5dO7p3785nn33WIuO3FhcXF7y8vCgvL6esrMzq+o3JOxcXF7y9vSkvL6e0tNSqf812xIZuify20tJS4uPjqaysZPPmzfj6+jZ6jG+7evUqp06dumn1WVvn6urKxIkT+eSTT/jwww/p0aMHkydP5nvf+x7z58+3+6SsiIi0HiW3RKRe2pYoItJ8tm7dSmhoKP/7v//Lq6++yubNm7n77rtbdM6BAweye/fuFp2jNYwYMQL47/bEGoWFheTk5Fj1f/TRRwHYsmVLrfaKigp27NiBm5ub1RbH73L9+nWSkpI4duwYb731Vq2E1OjRo8nIyGjUeABZWVlcv36d8PDwRt/blkRGRrJ+/XpycnJ4/PHHWbZsGXfffTcTJ07kyJEjtg5PRERuc0puiUi9VLklItJ0xcXFTJs2jREjRjBo0CBycnJarFrrRo888gi7d+/m8uXLrTJfS3n++efx9fUlJSWFbdu2UVZWxmeffcaECRNuulVx4cKFdO/enZSUFDZv3kxpaSm5ubmMHz+e/Px8zGazZXtiQ/3yl7/k3XffZeXKlURHRzfLujZu3Mj999/P9773vWYZz94FBQWxaNEizpw5g9ls5sCBA4SGhhIZGcmbb76pX7iJiMhNKbklIvVS5ZaISNNs2bKF+++/n02bNrFhwwbWr1+Pv79/q82fmJiIm5sbf/nLX1ptzpYQFBREdnY24eHhjB49moCAACZNmkRycjKhoaFUVFRg+v/s3XlYVeX6PvB7g4LMIEdBQWWIQRFRMTTFIhnUFMUByUyOU1BpYqhBWobYKTjqSSwj0L4lahZaoVuzgNRCxAESGQxQFAcERVEcUZD390c/diHIJLAY7s91cXWx9hrud+2VbB6e9S6ZDPPmzQPw1y2Hx48fx/Tp07Fw4ULo6+vDwcEBd+/eRXx8PF577bUGHT8lJQWffvopAGD27NnVnvr4/fffN3hMt2/fxrZt2/Dvf/+7wdu2d1paWvDx8UFGRgbi4uKgp6cHLy8vWFlZITQ0FDdv3pQ6IhERtSIyIYSQOgRRaxQWFoaQkJAaHy/ekbz99ts4duwYEhMTpY5CbZSjoyMGDx6M9evXSx2FqEXduHEDgYGBiIyMhKenJ8LDw6Gvry9JlsDAQGzatAk5OTlPPUcUNZ13330XEREROHPmDN+XesjJycGGDRvw5ZdfQklJCdOnT8fbb78Na2trqaMREZG0Cti5RUS1YucWEVHD7dixA1ZWVpDL5YiJiUF0dLRkhS0AWL58OVRVVbFixQrJMlBVubm5+OSTTxAcHMzCVj1ZWloiLCwM+fn5WLVqFX755RfYBgg+7AAAIABJREFU2NjA1dUVcrkc/Js9EVHHxeIWEdWKc24REdXflStXMHXqVHh5eWHMmDHIzMzExIkTpY4FLS0tfPTRR/jiiy+QkJAgdZwOr7y8HD4+PrCwsMDrr78udZw2R0dHB35+fjh79qxiEv8JEybA2toaYWFhuHfvnsQJiYiopbG4RUS1YucWEVH97NixAzY2NkhJSUFsbCyioqKgp6cndSwFb29vTJw4EZMnT0Zubq7UcVqNx+fOqukrKCioSY+5cOFCHD16FJs3b0anTp2adN8diZKSEtzd3REXF4c//vgDTk5OePfdd9GzZ0/4+fnh/PnzUkckIqIWwuIWEdWKnVtERLUrKCiAh4cHvLy8MGXKFKSnp8PFxUXqWNXIZDJs2bIFffr0gbu7O4qKiqSO1CoIIer8asri1po1axAREYEtW7Zg8ODBTbbfjm7QoEGIiIhAXl4e3n33Xfzwww8wMzODu7s74uPjpY5HRETNjMUtIqoVO7eIiGomhEBUVBRsbGyQkZGB/fv3IyIiApqamlJHeyJ1dXXs3r0bDx48wLBhw3Dq1CmpI3UYjx49wuLFi/HOO+9g7dq1mDRpktSR2qXu3bsjICAAubm5+Pbbb1FcXAxXV1cMHjwYkZGRuH//vtQRiYioGbC4RUS1YucWEVF1eXl5cHNzw+zZs+Hp6YmTJ0/CyclJ6lj10rNnTxw5cgQ9e/bE8OHDsWvXLqkjtXtFRUWYNGkSPv/8c2zbtg2LFi2SOlK7p6KiAk9PTyQmJiI5ORn9+/fHggULYGJigsDAQFy6dEnqiERE1IRY3CKiWrFzi4job0IIREZGwtbWFgUFBUhKSkJERAQ0NDSkjtYg3bp1Q3x8PKZMmQIPDw+MHz8eOTk5Usdqd8rLyxEWFgZLS0ucOHECBw4cwPTp06WO1eHY29sjKioKFy5cwBtvvIEvv/wS5ubmmDZtGpKSkqSOR0RETYDFLSKqlZKSEju3iIgA5ObmwtnZGfPnz8f8+fORkpICBwcHqWM1mqqqKr788kscOHAAFy9ehK2tLf7973/jt99+4x81nlJ+fj7WrVuHfv36ITAwEG+++SaysrIwbNgwqaN1aIaGhggKCsKlS5ewceNGZGdnY/jw4RgyZAiioqJQVlYmdUQiImokPp6FiGqlrKzMX3KIqEOrqKjApk2b4O/vD3Nzcxw5cgT29vZSx2oyTk5O+OOPP7B582Z89tlncHJygq6uLuzt7WFmZgY9PT3IZDKpY7Z69+7dw9WrV5GWloasrCxoaWnhlVdewdKlS2FmZiZ1PPoHVVVVeHt7w9vbG4cOHcL69esxd+5cBAYGwsfHBwsWLMC//vUvqWMSEVEDsLhFRLVi5xYRdWSZmZmYM2cOTpw4AX9/fwQHB0NFRUXqWE1OWVkZc+bMwZw5c3D69Gn8/PPPOHnyJM6dO4cTJ05ACCF1xGZ169YtlJWVQV9fv9H7UFNTg76+PiZNmoSRI0fCyckJXbp0acKU1BwcHR3h6OiIc+fOISIiAp9++ilCQkIwbdo0LFmyBAMGDJA6IhER1QOLW0RUK3ZuEVFHVF5ejrVr1+KDDz5A3759cezYMQwcOFDqWC3CwsICFhYWUsdoUUFBQVi3bh1SUlLQtWtXqeOQBExNTRESEoL33nsP33zzDdavXw87OzuMGDECfn5+mDRpEjp14q9OREStFefcIqJasXOLiDqatLQ0DBs2DEFBQVi5ciWSk5M7TGGro1qyZAlUVFTwySefSB2FJKapqQkfHx+kp6cjLi4OPXv2xPTp02FlZYXQ0FAUFxdLHZGIiGrA4hYR1YrFLSLqKMrKyhAaGopnn30WqqqqOHHiBAICAqCsrCx1NGpmmpqaWLx4MdatW4erV69KHYdaAZlMBhcXF0RHRyMrKwuenp4ICQlBnz594Ovri1OnTkkdkYiI/oHFLSKqFW9LJKKOIDU1FQ4ODggODkZwcDASEhJgbW0tdSxqQQsXLoS2tjb++9//Sh2FWplnnnkGISEhOH/+PNauXYvffvsN/fv3h6urK+Ryebufk46IqC1gcYuIasXOLSJqz0pLSxEYGIghQ4ZAS0sLqampCAgIgJISPyJ1NGpqanjnnXewYcMGXLp0Seo41Appa2vDx8cHp06dQmxsLLp06YKJEyfCysoKYWFhuHPnjtQRiYg6LH5yI6JasXOLiNqrw4cPY9CgQQgPD8fatWtx8ODBDjeROlX1+uuvo1u3bvjwww+ljkKtmJKSElxcXCCXy/Hnn39i7NixWLZsGYyMjODn54e8vDypIxIRdTgsbhFRrdi5RUTtzb179xAYGIiRI0fCxMQE6enp8PPzY7cWQVVVFatWrcKmTZuQnp4udRxqAyq7ti5fvozg4GDExMTA3Nwc7u7uiI+P5y2LREQthJ/iiKhW7NwiovYkISEBAwcOREREBMLDw7Fv3z707t1b6ljUinh7e8Pe3h6LFi2SOgq1ITo6OvDz88O5c+cQExOD0tJSuLq6YtCgQYiMjMS9e/ekjkhE1K6xuEVEtWLnFhG1B7du3YKfnx+cnJxgaWmJjIwM+Pj4SB2LWiGZTIZ169bhwIED2LVrl9RxqI1RUlKCu7s74uLikJKSgqFDh8LPz09xy+KFCxekjkhE1C6xuEVEtWLnFhG1dT///DNsbW2xZcsWhIeHY8+ePTAyMpI6FrVizz33HLy8vODv748HDx5IHYfaqMGDByMiIgJ5eXkIDAzE999/DzMzM8Uti0RE1HRY3CKiWrFzi4jaqps3b8LX1xdjx47F0KFDkZ2dzW4tqrfVq1fjypUr+PTTT6WOQm2cgYEBAgICcPbsWWzfvh3Xrl2Dq6srhgwZgsjISJSWlkodkYiozWNxi4hqxc4tImqL9u7di/79+2PXrl3YuXMnoqOj0a1bN6ljURtibGyMxYsX48MPP0RhYaHUcagdUFFRgaenJ5KSkpCcnIx+/fph/vz5MDExQWBgIPLz86WOSETUZrG4RUS1YucWEbUlN27cgK+vL8aPH4/hw4cjMzMTU6ZMkToWtVEBAQHo2rUrFi5cKHUUamfs7e0RFRWFCxcu4PXXX8eXX34JMzMzTJs2DUeOHJE6HhFRm8PiFhHVSllZGUIIPsqaiFq9HTt2wMrKCnK5HDExMYiOjoa+vr7UsagNU1dXx6ZNm7Bz505OLk/NokePHggKCsKlS5ewceNGZGVl4bnnnsOQIUMQFRWF8vJyqSMSEbUJLG4RUa2UlP76Z4K3JhJRa3XlyhVMnToVXl5eGDNmDDIzMzFx4kSpY1E7MWrUKMyYMQNvvvkmSkpKpI5D7ZSqqiq8vb2RlpaGhIQEmJmZYc6cOejduzeCgoJw/fp1qSMSEbVqLG4RUa2UlZUBgLcmElGrtGPHDtjY2CAlJQWxsbGIioqCnp6e1LGonVm3bh3Ky8vx3nvvSR2FOgBHR0dER0cjJycH3t7eWL9+PYyNjeHt7Y2MjAyp4xERtUosbhFRrdi5RUStUUFBATw8PODl5YUpU6YgPT0dLi4uUseidkpfXx9r1qzB559/jsTERKnjUAdhZmaGkJAQnD9/HmFhYUhJSYGtrS0cHR2xY8cOfjYjIvoHFreIqFbs3CKi1kQIgaioKNjY2CAjIwP79+9HREQENDU1pY5G7dzMmTPh6uoKX19flJaWSh2HOhAtLS34+PggPT0dcXFx0NPTg5eXF6ysrBAaGoobN25IHZGISHIsbhFRrdi5RUStRV5eHtzc3DB79mx4enri5MmTcHJykjoWdSCRkZHIz8/H0qVLpY5CHZCSkhJcXFwgl8uRnZ2NcePGYdWqVejTpw98fX3x559/Sh2RiEgyLG4RUa0qi1vs3CIiqQghEBkZCVtbWxQUFCApKQkRERHQ0NCQOhp1ML1798bGjRuxYcMGyOVyqeNQB2ZhYYGwsDBcvnwZq1atQmxsLPr37w9XV1fI5XI+5ZqIOhwWt4ioVrwtkYiklJubC2dnZ8yfPx/z589HSkoKHBwcpI5FHdjUqVMxc+ZMzJ07FwUFBVLHoQ5OW1sbfn5+yM3NRUxMDABgwoQJsLa2RlhYGO7evStxQiKilsHiFhHVirclEpEUKioqEBkZCTs7O1y/fh1HjhxBSEgIVFVVpY5GhA0bNkBPTw+zZs1ihwy1CkpKSnB3d0dcXBxOnDgBJycnvPvuuzAyMoKfnx/Onz8vdUQiombF4hYR1YqdW0TU0jIzM/Hcc89hwYIFWLBgAY4fPw57e3upYxEpaGpqYtu2bThw4ADWr18vdRyiKgYOHIiIiAicP38e7777Ln788UeYmZnB3d0d8fHxUscjImoWLG4RUa3YuUVELaW8vByhoaGwt7fHw4cPcezYMYSEhEBFRUXqaETVDBkyBCtWrEBAQACOHDkidZxWbcmSJXyiqQS6deuGgIAA5Obm4ttvv8WNGzfg6uqKwYMHIzIyEvfv35c6IhFRk2Fxi4hqxc4tImoJaWlpGDZsGIKCgrBy5UokJydj4MCBUsciqtWyZcvg6uqKSZMmIT8/X+o4DbZmzRrIZDLIZDIYGxvXuZzaps6dO8PT0xOHDh1CcnIy+vfvjwULFsDExASBgYG4dOmS1BGJiJ4ai1tEVCt2bhFRcyorK0NoaCieffZZqKqq4sSJEwgICFAU1olaMyUlJXzzzTfo2rUrpk6digcPHkgdqUGWLFkCIQTs7OzqtZzaPnt7e0RFReHChQvw9/fHli1bYG5ujmnTpuHw4cNSxyMiajQWt4ioVuzcIqLmkpqaCgcHBwQHByM4OBgJCQmwtraWOhZRg2hpaeGHH35AVlYWfHx8pI5DVC+GhoYICAjA2bNnsXXrVly4cAEjRozAkCFDEBUVhbKyMqkj1pumpiYcHR2ljkFEEmNxi4hqxc4tImpqpaWlCAwMxJAhQ6ClpYXU1FQEBAQo/r0hamusrKzw7bffYtu2bfj888+ljkNUb6qqqvD09MSRI0eQnJyMfv36Ye7cuejduzeCgoJw7do1qSMSEdULP0USUa3YuUVETenw4cMYNGgQwsPDsXbtWhw8eBAWFhZSxyJ6aqNHj0ZQUBAWLVqE/fv3Sx2HqMEqb1k8f/48fH198dlnn8HY2Bje3t44efKk1PGIiGrF4hYR1YqdW0TUFO7du4fAwECMHDkSJiYmSE9Ph5+fH7u1qF1Zvnw5pk6dikmTJiElJaVR+/Dw8FBM5i6TyarcbvXrr79CJpNBLpcrli1atKjK+uXl5SgvL8d3330HV1dXGBoaQk1NDba2tggLC3uqP1Zt3bq1yrFkMhkKCwsbvb8nycrKgoeHB3R0dKCurg4HBwfs2bMHLi4uiuPOmzdPsf7169fh7+8Pc3NzqKioQE9PD2PHjsWBAweaPFtH0LNnTwQFBeHSpUuIjIzEiRMnMHDgQDg6OmLHjh0oLy9v9gwPHjzAihUrYG1tDXV1dXTt2hXu7u7YvXu34jNp5YMP7t69i8TERMW10alTpyr7qs/18fhDFI4fPw5nZ2doaWlBXV0dL774IhITE5t93ET0FAQR1WjdunXC0NBQ6hiSy8zMFABERkaG1FGojRoxYoR46623pI5BEvr999+FhYWF0NXVFREREVLHIWpWDx8+FGPHjhX/+te/xJ9//tmofWzYsEEAENu2bauyfNasWQKA8PLyqrL8xx9/FM7Ozorv5XK5ACA++ugjUVxcLIqKisT69euFkpKSWLJkSbXj2dnZCSMjozqXl5eXC39/f+Hq6iqKi4vrPZ7FixcLDQ2Neq17+vRpoaurK4yMjERsbKy4ffu2yMjIEC4uLqJbt25CVVW1yvoFBQXC1NRUGBgYCLlcLkpKSkR2draYPHmykMlkYuPGjfXOSU+WkJAgPD09hbKysjA1NRUhISHi+vXrzXa8efPmCR0dHREbGyvu3bsnCgsLxZIlSwQAceDAgSrramhoiBEjRtS4n4ZeH3Z2dkJDQ0M899xz4vDhw+LOnTvi+PHjYsCAAUJFRUUcPHiwuYZMRE/nMotbRE/A4tZf/vzzTwFAnDx5Uuoo1EaxuNVxlZSUiIULFwolJSUxbtw4cenSJakjEbWIu3fvCkdHR2FsbCzy8vIavP3169eFioqKGDNmjGLZvXv3hJ6ennjmmWeEmpqauHXrluK1SZMmic2bNyu+l8vlwsnJqdp+X331VdG5c2dRUlJSZXl9ils3btwQo0ePFn5+fqK8vLxB42lIccvT01MAEDt37qyy/OrVq0JdXb1acauy4Ld9+/Yqy0tLS0XPnj2FmpqaKCwsbFBeerIzZ86IgIAAoaurKzQ1NYWPj0+z/AHU1NRUDB8+vNpyS0vLBhW3Gnp92NnZCQDixIkTVdZPS0sTAISdnV0jR0REzewy7wUgolpxzi0iaoyff/4Ztra22LJlC8LDw7Fnzx4YGRlJHYuoRairq2PPnj3Q19eHq6srrl692qDtu3btipdeeglxcXGK2/527dqFoUOHYv78+bh//z5++OEHAEBxcTEOHjyIyZMnK7YfP358jbfk2dnZoaysDJmZmQ3Kk52djaFDh0JJSQnr1q1TfDZoDj///DOAv+Yw+6du3brV+DTVH3/8EQAwbty4KstVVVXh7OyM+/fv45dffmmmtB2Pubk5QkJCcOHCBaxduxa///47+vfvr7hlsammsRgzZgwOHz4MHx8fHDlyRLHf7OxsODk51Xs/jbk+NDQ0MHDgwCrLbG1t0bNnT5w8eRIFBQWNGBERNTcWt4ioVpxzi4ga4ubNm/D19cXYsWMxdOhQZGdnw8fHR+pYRC1OR0cHe/fuxcOHDzFhwgSUlJQ0aHtvb288evQI33zzDQBgy5Yt8Pb2xvTp06GsrIxt27YBALZv347x48dDU1NTsW1JSQlWrFgBW1tb6OnpKeYSWrp0KYC/5sCrrxs3bsDDwwPGxsbYt28ftm7d2qBxNMSDBw9w+/ZtdOnSpcp4Kunp6VVbv6SkBF26dIGWlla19Q0MDACgWeYF6+i0tLTg4+ODzMxMxMXFQU9PD15eXrC2tkZoaChu3rz5VPvfsGEDoqKicPbsWTg7O0NbWxtjxoxRFKvqo7HXh66ubo376969OwA0uFhNRC2DxS0iqhU7t4iovvbu3Yv+/ftj165d2LlzJ6Kjo9GtWzepYxFJxsjICLGxsbh48SJGjRqFoqKiem87btw4dO3aFVu2bEFRURGOHDkCDw8PGBgYwM3NDfv370dBQQE2b94Mb2/vKtu6u7tj1apVeO2115CTk4OKigoIIfDJJ58AAIQQ9c7RqVMnxMfHY9euXbC1tcVrr72G48eP13v7hlBVVYWWlhZKS0tx586daq8/XlRQVVWFjo4OSktLcfv27WrrX7lyBQBgaGjYLHnprz+Curi4QC6XIysrCy+99BJWrVqFPn36wNfXF1lZWY3ar0wmw8yZMxEfH4+bN28iJiYGQghMnjwZ//vf/6qtW5PGXh/Xr1+v8f+RyuuvsshFRK0Li1tEVCt2bhFRXW7cuAFfX1+MHz8ew4cPR2ZmJqZMmSJ1LKJWwdLSEomJibh16xaef/55XLp0qV7bqaiowMvLC6mpqVi+fDkmTpwINTU1AMDMmTPx6NEjfPDBBygoKMCoUaMU2z169AiJiYkwNDTEwoUL0a1bN8Uv//fv329wfi0tLRgZGUFTUxO7d++GpqYmPDw8mu3WrLFjxwL4+/bESoWFhcjJyam2/qRJkwD8VVz/pwcPHuDXX3+FmppatVscqXlYWloiLCwM+fn5CA4Oxi+//AIbGxu4urpCLpc3qKiqq6urKIx17twZrq6uiImJgUwmq/Zeq6ur4+HDh4rvraysEBkZCaBx10dpaWm1Am56ejouX74MOzs79OjRo97jIKKWw+IWEdWqsrjFzi0iqsmOHTtgZWUFuVyOmJgYREdHQ19fX+pYRK2KiYkJEhIS0LlzZzg6OuL06dP12m7mzJkAgI0bN1bpzvLw8ICWlhY2btyIGTNmKH5WA391XDs5OaGwsBCrV6/GtWvXcP/+fRw4cABffPHFU49j586dKCoqwuTJk/HgwYOn2l9NPvroI3Tt2hWLFi1CXFwc7ty5g4yMDMyePbvGDqyPP/4YpqamWLRoEfbs2YPbt28jJycHr7zyCgoKChAWFqa4/Yxaho6ODvz8/HD27FnExMQAACZMmIC+ffsiLCys3rfFvv7660hLS8ODBw9w9epV/Pe//4UQokoxFwAGDx6MnJwcXLx4EUlJSTh79ixGjhwJoHHXh46ODpYtW4akpCTcvXsXycnJePXVV6GiooKwsLAmOENE1CyknM6eqDXj0xL/cvnyZQFAJCQkSB2F2ig+LbF9KiwsFFOmTBEymUzMnDlTFBcXSx2JqNUrLi4Ww4YNE4aGhvV+CrGFhYXo3bu3qKioqLK88ilwmZmZ1bYpKioSvr6+olevXqJz587CwMBAzJo1SwQGBgoAAoCwt7cXq1evVnxf+bV8+XKxffv2ass/+eQTkZSUVG35jBkz6hxDQ56WKIQQ2dnZwsPDQ2hrawt1dXUxfPhw8dtvvwknJyehrq5ebf1r166JRYsWCVNTU9G5c2eho6MjRo8eLX799dd6H5Oa1x9//CF8fHyEmpqa0NHREQsXLhTnz59/4vqpqanC19dX9O3bV6irq4uuXbuKYcOGiY0bN1b7fyErK0uMHDlSaGhoiF69eokNGzZUeb0h10flE0JPnTolRo8eLbS0tISampp44YUXxKFDh5rmZBBRc7gsE6IB/aFEHUhYWBhCQkI6/BNRrly5AkNDQxw8eBAvvPCC1HGoDXJ0dMTgwYOxfv16qaNQE9mxYwfeeOMNReeIi4uL1JGI2oxbt27B3d0dGRkZ2LlzJ1588UWpIzW7JUuW4IsvvqhxHq2GsLa2xv3793H+/PkmSkYt7erVq/jqq6/w2Wef4fLly3jppZfg5+fXan6ODBw4ENeuXav37cNE1GoU8LZEIqoVJ5QnokoFBQXw8PCAl5cXpkyZgvT09FbzCwlRW6GtrY2ff/4ZLi4ucHNzw7p166SO1KoUFhaia9euKCsrq7I8Ly8Pubm51W5Jo7ale/fuCAgIQG5uLr799lsUFxfD1dUV9vb2iIyMRGlpqdQRiaiNYnGLiGrFCeWJSAiBqKgo2NjYICMjA/v370dERAQ0NTWljkbUJqmpqeG7777Dhg0bsHTpUrzyyiv1noeoI6h8SMXFixdx7949HDt2DF5eXtDW1sb7778vdTxqAioqKvD09ERiYiKSk5NhY2ODBQsWwMTEBIGBgcjPz5c6IhG1MSxuEVGt2LlF1LHl5eXBzc0Ns2fPhqenJ06ePAknJyepYxG1Cz4+PoiLi0N8fDyGDx+Oc+fOSR1JcoaGhoiPj8fNmzfx/PPPQ09PDxMmTICFhQWOHTsGMzMzqSNSE7O3t0dUVBTOnz+P119/HV9++SXMzMwwbdo0JCUltUiGNWvWQCaT4eTJk8jPz4dMJsN7773XIscmoqbB4hYR1YqdW0QdkxACkZGRsLW1RUFBAZKSkhAREQENDQ2poxG1K05OTkhKSkJFRQUcHBwQGxsrdaQmt2bNmgbNt+Xs7IwffvgB586dw4MHD1BYWIitW7fC3Ny8GVOS1Hr06IGgoCBcunQJGzduRHZ2NoYPH44hQ4YgKiqq2q2qTWnJkiUQQlT5+vDDD5vteETU9FjcIqJasXOLqOOpnNdm/vz5mD9/PlJSUuDg4CB1LKJ2y9zcHElJSXB1dcWYMWPw1ltv8TZF6rBUVVXh7e2NkydPIiEhAWZmZpg7dy769OmDoKAgXLt2TeqIRNQKsbhFRLVi5xZRx1FRUYHIyEjY2dmhuLgYR44cQUhICFRVVaWORtTuaWho4JtvvsGWLVuwdetWDBo0CAcPHpQ6FpGkHB0dER0djezsbHh7e+PTTz+FsbExvL29kZ6eLnU8ImpFWNwiolqxc4uoY8jMzMRzzz2HBQsWYMGCBTh+/Djs7e2ljkXU4cyYMQPp6emwtLTEqFGjMGvWLBQVFUkdi0hSZmZmCAkJwfnz57F+/XqkpKRgwIABcHR0xI4dO/hHWCJicYuIasfOLaL2rby8HKGhobC3t8fDhw9x7NgxhISEQEVFRepoRB2WsbEx5HI5du3ahQMHDsDMzAyBgYG4deuW1NGIJKWpqQkfHx9kZGQgLi4Oenp68PLygqWlJUJDQ3Hjxg2pIxKRRFjcIqJaVRa32LlF1P6kpaVh2LBhCAoKwsqVK5GcnIyBAwdKHYuI/j93d3dkZmZi6dKl+Pzzz2FtbY3w8PBmnVibqC2QyWRwcXGBXC5HTk4Oxo8fjw8//BB9+vSBr68vTp06JXVEImphLG4RUa1kMhmUlJTYuUXUjpSVlSE0NBTPPvssVFVVceLECQQEBChuQyai1kNTUxMrVqzAuXPn4O3tDX9/f1hYWCAyMpJ/eCIC8MwzzyAsLAz5+flYtWoV4uLiYGtrC1dXV8jlcgghpI5IRC2AxS0iqpOSkhI/QBO1E6mpqXBwcEBwcDCCg4ORkJAAa2trqWMRUR309fUREhKCP//8E88//zzeeOMNDBo0CFFRUXj48KHU8Ygkp62tDT8/P5w5cwYxMTEAgIkTJ8LKygphYWG4e/euxAmJqDmxuEVEdVJWVmbnFlEbV1paisDAQAwZMgRaWlpITU1FQECA4tZjImobTExMEBUVhdTUVAwYMADz5s2DmZkZQkNDcfPmTanjEUlOSUkJ7u7uiIuLw59//omxY8di2bJl6NmzJ/z8/JCXlyd1RCJqBvxES0R1YucWUdt2+PBhDBo0COHh4Vi7di0OHjwICwsLqWMR0VOwtbXFli1bcOHCBcybNw+hoaHo1asXfH19kZOTI3U8olahsmsrPz8fwcHBiImJgbm5Odzd3REfH89bFonaERa3iKhO7Nwiapvu3btJ+YjxAAAgAElEQVSHwMBAjBw5EiYmJkhPT4efnx+7tYjaEUNDQwQFBSEvLw8rV67EL7/8AhsbG0ycOBFyuRzl5eVSRySSnK6uLvz8/HD27FnExMSgtLQUrq6uGDx4MCIjI3Hv3j2pIxLRU+KnWyKqEzu3iNqehIQEDBw4EBEREQgPD8e+ffvQu3dvqWMRUTPR1taGv78/zpw5g61bt+Lu3bvw8PBAnz59sGzZMpw5c0bqiESSU1ZWVtyymJycDAcHB/j5+cHExASBgYG4ePGi1BGJqJFY3CKiOrG4RdR23Lp1C35+fnBycoKlpSUyMjLg4+MjdSwiaiGdOnWCl5cX4uPjcf78eSxcuBDbt2+HhYUFhgwZgsjISE6sTQTA3t4eERERyMvLw+LFi7F161aYm5tj2rRpSExMlDoeETUQi1tEVCfelkjUNvz888+KeXjCw8OxZ88eGBkZSR2LiCRibGyMgIAA5ObmIi4uDmZmZnjrrbfQvXt3TJs2DXK5nE9apA7PwMAAAQEBOHv2LLZt24aLFy/C0dFRUQwuLS2VOiIR1QOLW0RUJ3ZuEbVuN2/ehK+vL8aOHYuhQ4ciOzub3VpEpKCkpAQXFxdER0fjwoUL+Pjjj5Gfn4+JEyfC0NAQc+fOxS+//ML5uahDU1FRgaenJ5KSkpCcnIx+/fph/vz5MDU1RWBgIC5fvix1RCKqBYtbRFQndm4RtV579+5F//79sWvXLuzcuRPR0dHo1q2b1LGIqJUyMDDAwoULkZiYiLy8PCxfvhwZGRkYM2YMDA0N4ePjg/j4eJSVlUkdlUgy9vb2iIqKwoULF+Dr64tNmzbBzMwM06ZNw9GjR6WOR0Q1YHGLiOrEzi2i1ufGjRvw9fXF+PHjMXz4cGRmZmLKlClSxyKiNqR3795YvHgxjh49ivPnz+P999/HqVOn4ObmBj09Pbi7uyMyMhKFhYVSRyWSRI8ePRAUFIT8/HxERkYiKysLw4YNw5AhQxAVFcVuR6JWhMUtIqoTO7eIWpcdO3bAysoKcrkcMTExiI6Ohr6+vtSxiKgN6927N/z8/HDo0CGcOXMG//nPf1BaWoq33noLxsbGeOGFF7B69WpkZWVJHZWoxamqqsLb2xtpaWlISEiAmZkZ5syZgz59+iAoKAjXr1+XOiJRh8fiFhHViZ1bRK3DlStXMHXqVHh5eWHMmDHIzMzExIkTpY5FRO2MmZkZ/Pz8EBcXh6KiImzfvh19+vTBf//7X/Tt2xcWFhZYtGgR9u7dizt37kgdl6hFOTo6Ijo6GtnZ2Zg5cybWr18PY2NjeHt7IyMjQ+p4RB0Wi1tEVCd2bhFJb8eOHbCxsUFKSgpiY2MRFRUFPT09qWMRUTunra0NT09PREVFobCwEAkJCZgyZQoOHjwId3d3dO3aFc8//zyCg4ORlJTE27SowzA3N0dISAjOnz+PsLAwJCcnw9bWFo6OjtixYwc/OxO1MBa3iKhO7Nwikk5BQQE8PDzg5eWFKVOmID09HS4uLlLHIqIOSFlZGY6OjggJCUFqaioKCwuxefNmPPPMM9i0aROGDx8OfX19eHh44LPPPuMtjNQhaGlpwcfHBxkZGYiLi4Oenh68vLxgZWWF0NBQ3Lx5U+qIRB0Ci1tEVCd2bhG1PCEEoqKiYGNjg4yMDOzfvx8RERHQ1NSUOhoREQCge/fumD59Ov7v//4PFy5cQG5uLlavXg0VFRWsWLECffv2hYGBAdzd3REaGopDhw7xKYzUbikpKcHFxQVyuRxZWVkYN24cVq1ahd69e8PX15fFXqJmxuIWEdWJnVtELSsvLw9ubm6YPXs2PD09cfLkSTg5OUkdi4ioVmZmZvDx8UF0dDSKiopw5MgRLF26FDKZDKGhoRg5ciS6d++O8ePHIzQ0FIcPH2axi9olS0tLhIWFIT8/H6tWrcIvv/wCGxsbuLq6Qi6XQwghdUSidofFLSKqk7KyMotbRC1ACIHIyEjY2tqioKAASUlJiIiIgIaGhtTRiIgaRFlZGUOHDsWSJUuwe/duXLt2DWlpaVi1ahU0NDQQFhaGESNGQFdXFy+++CKWL1+O3bt348qVK1JHJ2oyOjo68PPzw9mzZxETEwMAmDBhAqytrREWFoa7d+9KnJCo/egkdQAiav2UlJR4WyJRM8vNzcW8efNw6NAhLF68GCtXroSqqqrUsYiImoSSkhJsbW1ha2uLBQsWAABOnz6NhIQEHDp0CDExMQgJCUFFRQVMTEwwbNgwDB06FMOGDcOgQYP472Eb8uDBA6SkpCAtLQ1FRUUs4PyDvb09jI2NkZycjMWLF2PZsmXw9fWFioqK1NGIWpSOjg569uwJOzs7DBgwAEpKT993xeIWEdWJnVtEzaeiogKbNm2Cv78/zM3NceTIEdjb20sdi4io2VlYWMDCwgJz5swBAJSUlODo0aOKr//85z+4du0aVFRUMGjQIAwdOhRDhgzB4MGDYW1tDWVlZYlHQJWEEIiPj0dkZCT27duHu3fvQldXF4aGhuw+roGqqir69++P27dv4/fff5c6DlGLKykpQX5+Pu7fv4/u3btj8uTJeP3112FnZ9fofbK4RUR1YucWUfPIzMzEnDlzcOLECfj7+yM4OJh/vSWiDktHRwdubm5wc3NTLDt9+rSi2FV5q/aDBw+goaGBgQMHYvDgwbC3t8fgwYPRt29fdOrEX29aWmpqKvz8/PD7779j5MiRWLNmDdzc3GBmZiZ1NCJqxR49eoTMzEzs27cPmzdvRkREBF555RWEhobCyMiowfvjv/5EVCd2bhE1rfLycqxduxYffPAB+vbti2PHjmHgwIFSxyIianUqu7teffVVAEBZWRkyMjKQkpKCP/74A0ePHsXGjRtRWloKNTU12NnZwd7eHoMGDcLAgQPRr18/qKmpSTyK9qm0tBSLFy9GREQEHBwccOzYMTz77LNSxyKiNkJZWRkDBgzAgAED8M4772DXrl1YvHgxrK2tsXLlSrz99tuQyWT13h+LW0RUJz4tkajppKWlYc6cOcjMzMTKlSuxZMkS3lpDRFRPnTt3xqBBgzBo0CDFsrKyMpw6dUpR8EpJScH//d//4f79+1BWVoalpSVsbW0xcOBA2NraYsCAAejdu7eEo2j7rl69Cg8PD2RlZeHrr7/GjBkzGvRLKBHRP8lkMnh4eGDMmDFYs2YNAgICkJqaio0bN9Z7zkUWt4ioTrwtkejplZWV4X//+x9WrFiBIUOG4MSJE7C2tpY6FhFRm9e5c2fY2dnBzs5OMX/Xo0ePcObMGaSlpeHkyZNIS0tDZGQk8vLyAAB6enoYMGCAotjVv39/9O3bF7q6uhKOpG3Izs7GmDFj0KlTJyQlJcHKykrqSETUTnTp0gXvvfceHBwcMG3aNJw9exZ79uyp17/NLG4RUZ14WyLR00lNTcXs2bORk5OD4OBgLF26tEmeCkNERDVTVlaGlZUVrKys4OnpqVheUlKCtLQ0pKen4+TJk0hOTsbXX3+NO3fuAACMjY3Rt29f2NjYoF+/for/suj1l6KiIrz00kswMDDA3r17oa+vL3UkImqH3NzccPjwYbi5uWHatGn46aef6pxTkZ+siahO7NwiapzS0lIEBgZiyJAh0NLSQmpqKgICAljYIiKSiI6ODkaOHIk333wTERERSEpKwq1bt3Du3Dns3bsXCxcuhJGRERITE+Hv748RI0ZAT08PxsbGcHNzw9tvv40vvvgCv/76Ky5evAghhNRDajFlZWWYNm0aKioqsHv3bskLW2vWrIFMJoNMJoOxsXGdy9uSrVu3KsYgk8mgqakpdaR249tvv1Wc1y5dukgdp1m1xrEGBgZWubaHDRv2xHX79esHuVyOpKQkvP7663Xum5+uiahO7NwiarjDhw9j0KBBCA8Px9q1a3Hw4EFYWFhIHYuIiB4jk8lgYmKCl156CUuXLsVXX32FY8eO4datW4pbYhYuXIiePXvi0KFDCAwMhIuLC3r37g1NTU0MHDgQnp6eWLZsGb766iscPnwY165dk3pY1TxtIW7ZsmU4ceIE9u7di+7duzdRqsZbsmQJhBCws7Or1/La3LlzBxYWFhg/fnxTx3wq4eHhEEIoOgvp6b388ssQQsDZ2VnqKM2utrFKdc2HhIRACAEhRL3mnB00aBC2bt2Kr776Ctu3b691Xd6WSER1YucWUf3du3cPwcHBWL16Ndzc3BAbG4tevXpJHYuIiBpIJpPB1NQUpqamGDduXJXXbty4gbNnz+Ls2bPIzMzEqVOnEBsbi08//VRRiNDV1YW5uTnMzMwUX/369cOAAQOgra3d4uPZtWsXvvrqKyxfvhwODg4N2vb06dP49NNPsX79evTr16+ZEkpHCIGKigr+MbeVqCwaHzp0SOoo7VZbuuYnTpyIuXPnYunSpXB3d39iJyOLW0RUJ3ZuEdVPQkIC5s6di6KiIoSHh8PHx0fqSERE1Az09PRgb28Pe3v7KnN6VVRU4OLFizh9+jROnz6NnJwc5OTk4Pvvv0deXh7Ky8sBAD169IClpSUsLCxgYWEBS0tLWFpawszMrNluH7pw4QJ2796N3bt348UXX8QHH3yAF154oV7b+vn5oW/fvpg7d26zZJOalpYWcnNzpY5B1GLa2jX/8ccf4/vvv0dISAg+/PDDGtdhcYuI6sTOLaLa3bp1C++//z4+++wzjB07FgcOHICRkZHUsYiIqIUpKSmhT58+6NOnD1xcXKq8Vl5ejgsXLig6viq7vvbv34+8vDzFHxL19PSqdHuZmZmhR48e6NmzJ6ytraGhodGobBcvXoSKigoePnyIhIQEODk5wcHBAe+99x7Gjx8PmUxW43bHjh3Dvn37sH///nrdRkRE1NT09fXx7rvvYuXKlXjnnXdq7H7lnFtEVCd2bhE92c8//wxbW1ts2bIF4eHh2LNnDwtbRERUTadOnWBmZgYXFxf4+PggJCQEcrkcubm5uHPnDk6ePIkff/wRK1aswIgRI1BaWoqffvoJS5YswYQJEzBkyBBoa2ujV69eGDlyJLy9vfHBBx/gq6++woEDB3Du3DlFZ1hNLly4oHi98r8pKSmYMGECbGxsEBUVVeMfMzdt2oQBAwbgxRdfrHOMHh4eVSaLdnR0VLz266+/QiaTQS6XK5YtWrSoyvrl5eUoLy/Hd999B1dXVxgaGkJNTQ22trYICwt7qs+jj0/SLpPJUFhYiJiYmCrLSktLAaDa8ry8PHh5eUFXVxf6+voYP358jZ0vWVlZ8PDwgI6ODtTV1eHg4IA9e/bAxcVFsa958+Y1ehwNPT/Xr1+Hv78/zM3NoaqqCmNjY7i4uODrr7/G/fv3G71uUVERFi5cCBMTE6ioqKBbt26YPHkyUlNTFes8Prn/8ePH4ezsDC0tLairq+PFF19EYmJitfXv3r2LxMRExbaPPyWvPseu9M/3Q0NDAyNHjmyS2x0bOraGZG+Ka6+2sba1a77SvHnzIITAt99+W/MKgohqtG7dOmFoaCh1jFZhwoQJYsaMGVLHoDZqxIgR4q233pI6RpO7ceOG8PHxEQCEp6enuHr1qtSRiIionbp27Zo4fvy42LFjh1i9erWYP3++eOmll0S/fv2EmpqaACAAiE6dOgkTExPh5OQkZs2aJYKCgsTmzZvF77//LgYOHKhY7/EvJSUlIZPJhIWFhdi8ebMoKysTQgjx6NEjYWhoKD766KN6Z92wYYMAILZt21Zl+axZswQA4eXlVWX5jz/+KJydnRXfy+VyAUB89NFHori4WBQVFYn169cLJSUlsWTJkmrHs7OzE0ZGRnUuLy8vF/7+/sLV1VUUFxdXW3/ixIkCgLh//36NyydOnCgOHz4s7ty5I+Li4oSampp49tlnq6x7+vRpoaurK4yMjERsbKy4ffu2yMjIEC4uLqJbt25CVVW1ljP3ty1btggAIjw8vNprDTk/BQUFwtTUVBgaGgq5XC5u3bolCgsLxapVqwQA8cknnzRq3cuXL4s+ffoIAwMDsXfvXsU4X3jhBdGlSxdx+PDhKjns7OyEhoaGeO655xTn8Pjx42LAgAFCRUVFHDx4sMr6GhoaYsSIETWem4Ycu6b3Iy0tTbi5uQkTE5N6vx+1acjYGnrenvbaq2usUl/zysrKYujQofU+10IIMXnyZPHSSy/V9NJlFreInoDFrb9NmjRJTJ8+XeoY1Ea1x+LWnj17hJGRkTAwMBA7d+6UOg4REXVwxcXFIjk5WURHR4uQkBCxcOFC4enpKezt7YWGhoYAINTV1Z9Y3Hq8yGVkZCTWrVsn0tLSBABx9OjReme5fv26UFFREWPGjFEsu3fvntDT0xPPPPOMUFNTE7du3VK8NmnSJLF582bF93K5XDg5OVXb76uvvio6d+4sSkpKqiyvT3Hrxo0bYvTo0cLPz0+Ul5fXmLuuX/TlcnmV5VOnThUARFFRkWKZp6enAFDts8HVq1eFurp6kxW36nt+KguK3333XbX1x4wZU6Vg1ZB1//3vf9dYwCwoKBCqqqrC3t6+ynI7OzsBQJw4caLK8srry87Orsry2opbDTn2k96P/Px8oaqq2mTFrfqOraHnrSmuvdrGKvU135ji1ueffy50dHRERUXF4y+xuEX0JCxu/W3KlCli2rRpUsegNqo9FbeKi4urdGtdu3ZN6khERES1qqioEOfPnxdKSkp1Frcqv2QymQAgdHV1hUwma/DPOw8PD6GsrCwKCgqEEEJs375dUSABIL7++mshxF+FMD09PXH79u0697l69WoBoMauoNqKW1lZWcLS0lKMHTu21v3X9Yt+YWFhleVvv/22ACBOnjypWKalpSUA1DiewYMHN0lx60lqOj86OjoCQJVi4pM0dF0lJaVqhUYh/honAHHx4kXFssruppr07NlTABCXL19WLKutuNWQY9f2ftja2jZp51ZNHh9bQ89bU117Txqr1Nd8Y4pbhw4dqnae/r/LnHOLiOrEObeIgB07dsDKygpyuRwxMTGIjo6Gvr6+1LGIiIhqJZPJGvRZTkVFRTG5/KNHj9CpUyfExcU16Jje3t549OgRvvnmGwDAli1b4O3tjenTp0NZWRnbtm0DAGzfvh3jx4+HpqamYtuSkhKsWLECtra20NPTU8zZs3TpUgDAvXv36p3jxo0b8PDwgLGxMfbt24etW7c2aBz/pKOjU+V7FRUVAFCc1wcPHuD27dvo0qVLlfFU0tPTa/Sx/6m+5+fBgwcoKSlBly5doKWlVes+G7NuRUUFdHR0qs1j9scffwAATp8+XWU7XV3dGvfXvXt3AMDVq1frHHtDjl3X+1F53KZQn7E19rwBT3/tNXasreWa/ycDAwMAf81d9jgWt4ioTnxaInVkV65cwdSpU+Hl5YUxY8YgMzMTEydObPEc3377reIDUHM9Jr4uj0+e+jQen9i3pg9FzelJk6m2JkePHoW7uzt69uwJbW1tDB8+HGFhYSguLm70PqOjoyGTyaCqqtqESdsPqa+LwMDAKscfNmxYix6f2q8LFy7UuPyf/x4oKSnB3Nwcs2bNwldffYWMjAx8+OGH+Ne//oWXX365QccbN24cunbtii1btqCoqAhHjhyBh4cHDAwM4Obmhv3796OgoACbN2+Gt7d3lW3d3d2xatUqvPbaa8jJyUFFRQWEEPjkk08AAEKIeufo1KkT4uPjsWvXLtja2uK1117D8ePHGzSW+lJVVYWWlhZKS0tx586daq/Xp3hTH/U9P6qqqtDR0UFpaSlu375dZ/aGrKurq4tOnTqhrKwMQogavx5/AMH169drfO8qz8s/CzBPenJnQ45d1/vxND9LH1efsTX2vNVHS461Icdtqmv+n9TV1QEAd+/erfYai1tEVCd2blFHtWPHDtjY2CAlJQWxsbGIiopqlr9C1cfLL78MIQScnZ0btf2dO3dgYWGB8ePHNzrDkiVLIISAnZ1do/fxuPDwcAghqnwoaoqsdfHw8IAQQpJCZX0kJibC0dERFRUVSExMREFBAfz8/BAQEIB33nmn0fvt1q1blf/+U0uc99ZO6usiJCRE8QuOsrKyJBmofbp06RKAvz7TVV5bGhoacHZ2xvLly/Hrr7+ipKQEZ86cQUREBLy9vWFjY9OgQtI/qaiowMvLC6mpqVi+fDkmTpwINTU1AMDMmTPx6NEjfPDBBygoKMCoUaMU2z169AiJiYkwNDTEwoUL0a1bN0Wh4/Gn9dWHlpYWjIyMoKmpid27d0NTUxMeHh4oKCho1LjqMnbsWAB/PUn5nwoLC5GTk/PU+2/o+Zk0aRIA4Keffqr22qBBg/D22283at3JkyejvLy8xqcBhoaGonfv3tWe3FlaWlqtsJieno7Lly/Dzs4OPXr0UCxXV1fHw4cPFd9bWVkhMjKywcd+0vtx7do1ZGdnV9u+seo7tsact/pqqbHW97hNdc03BItbRFQndm5RR1NQUAAPDw94eXlhypQpSE9Ph4uLi9SxnooQAhUVFW2iUN2WstZGU1MTjo6Ojdp206ZNKC8vx7p162BqagoNDQ14eXlh7ty5T5WptuJWS573pzk3bV1HHjtJ5+LFizA1NcWMGTPw+eefIyMjA7du3UJcXBzef/99jBo1qsk7aGfOnAkA2LhxY5XuLA8PD2hpaWHjxo2YMWMGlJT+/pVUWVkZTk5OKCwsxOrVq3Ht2jXcv38fBw4cwBdffPFUeUxMTLBz504UFRVh8uTJePDgwVPtryYfffQRunbtikWLFiEuLg537txBRkYGZs+eDUNDw6fef0PPz8cffwxTU1O8/fbb2Lt3L27fvo1Lly7hzTffREFBQZWCVUPXNTc3x5w5c7Bv3z6UlJSguLgYERERCA4Oxpo1a9CpU6cqWXR0dLBs2TIkJSXh7t27SE5OxquvvgoVFRWEhYVVWXfw4MHIycnBxYsXkZSUhLNnz2LkyJENPnZN78epU6fw6quvPvF6f/XVVyGTyXDu3Ll6vy/1HVtjzlt9NWasTaG5r/kGadDsXUQdCCeU/9usWbOe9MhVojq1pQnlKyoqxObNm4Wenp4wNzcXBw4ckDpSNc7Ozk0yAerTeNLkvQ3RmMlym8OTJlNtCrVNiFuXyicq/f77702aqbCwUAAQrq6uTbrfhnqac9MSWsN10ZiJdomepKysrFHbrVu3TvTo0aPRx7WwsBC9e/eu9mSzyifzZWZmVtumqKhI+Pr6il69eonOnTsLAwMDMWvWLBEYGKiY8N7e3l4xgfo/v5YvXy62b99ebfknn3wikpKSqi2fMWOG+PHHH2tcXtP6y5cvF0KIasvHjRunyJ+dnS08PDyEtra2UFdXF8OHDxe//fabcHJyEurq6vU6b7X9jKzv+al07do1sWjRImFqaio6d+4sevToIV5++WWRk5NTbd8NWff69evC399fmJmZic6dO4tu3boJNzc3ERcXV23dys8Np06dEqNHjxZaWlpCTU1NvPDCC+LQoUPV1s/KyhIjR44UGhoaolevXmLDhg2NPvY/3w81NTXx7LPPij179ghnZ2fF+Zo7d65i/VGjRglNTc0nPlXzacdWn+xNce3VNtbWcs035udcfn6+ACASEhIef4lPSyR6Eha3/jZnzpwqj3Mmaoi2Utw6d+6ccHFxEUpKSsLHx0fcuXNH6kg1YnGrabWGIkZNdu3apXiEeH2eIlZf5eXlQiaTiVdeeaXJ9tkYLG6xuEVtw9MWt+hvVlZWonfv3vVat7X8jGwqTfG5oSXcuHFDqKmpiXnz5tV7m7YyNinUdc03dXGLtyUSUZ14WyK1Z0IIREZGwtbWFgUFBUhKSkJERAQ0NDQkzZWVlQUPDw/o6OhAQ0MDI0eOxKFDh6qt9/gE2NnZ2Zg2bRr09fUVyzZt2lTjJNmPb5uXlwcvLy/o6upCX18f48ePR25ubp1ZH58cXiaTobCwsFHjrm1C7wcPHmDFihWwtraGuro6unbtCnd3d+zevfup/40qLCys19ivX78Of39/mJubQ0VFBXp6ehg7diwOHDigWKdy4v27d+8iMTFRMZaG3Gpgbm4ObW1tnDx5EhMmTGiyic2VlZWhp6dX7bbEljrv9T039TnPjVm3oVrbdUFErVthYSG6du2KsrKyKsvz8vKQm5tbZX4xal2EEFi4cCG0tbWxatUqqeO0Ga3qmm9o9Y2oo2Dn1t98fX2Fs7Oz1DGojWrNnVtnzpwRTk5OolOnTiIgIECUlpZKHUkIIcTp06eFrq6uMDIyErGxseL27dsiLS1NuLm5CRMTkxo7tyo7TV544QVx4MABcffuXXHkyBGhrKwsioqKqqzzeDdK5fKJEyeKw4cPizt37oi4uDhFS/vjHv8rZXl5ufD39xeurq6iuLi4XmOs66/SNWWdN2+e0NHREbGxseLevXuisLBQLFmyRABo9C2kNY39119/Fdra2tXGXlBQIExNTYWBgYGQy+WipKREZGdni8mTJwuZTCY2btxYZf3Gdift379fqKuri3Xr1inyjR8/vsptRePGjatye8CUKVPqvX8rKyvx4Ycf1vhaS5332s5NQ85zQ9+T+moN1wU7t6g1YOdWwxQUFAgAYvbs2eLChQvi7t274ujRo8LBwUF07dpV5Obm1ms/lT8jK780NDSaOXnzagvdTQUFBWLEiBEiIyOjQdu1hbE1p4Ze8wEBAVWubd6WSNQCWNz62xtvvCGcnJykjkFtVGssbj169EhEREQIDQ0NMWDAAJGcnCx1pCo8PT0FALFz584qy/Pz84Wqqmqtxa2ffvrpifutq7gll8urLJ86daoAoCiOVfrnB7kbN26I0aNHCz8/v3rPTyFE44pbpqamYvjw4dXWtbS0fOri1uNjf+WVV6qNvXKOmO3bt1dZt7S0VPTs2VOoqamJwsJCxfLGFLeKioqEjo6OGD16tGLfo0aNEgDEyy+/LB49eqRY9+zZs2y23LEAACAASURBVEJNTa1B512Iv/6flPq813ZuGnKeG/qe1FdruC5Y3KLWgMWthouPjxeTJk0SJiYmQkVFRRgYGIgZM2aIM2fOSB2txT1pXrT2oD2PraFa8prnbYlE9FSUlZXb/FPLiCplZmbiueeew4IFC7BgwQIcP34c9vb2UseqovJxyqNHj66yvGfPnrC0tKx1WwcHh0Yf99lnn63yfa9evQAAly9frnH97OxsDB06FEpKSli3bp3i8fLNZcyYMTh8+DB8fHxw5MgRxS1x2dnZcHJyeqp9Pz52IyMjAFXH/uOPP+L/sXfncVFX+//AX8M27JsrogmDCoqluSuQ3gDNxCSM9IbcFhW1MgktqW7uFZYLePOSS7dfN8tCb2645F6upSaaKIOC5gKYxi4wgpzfH35nYpwBZoDhA/h6Ph7zuM5nPvM573M+n5vw9pz3AYBRo0ZpnSuXyxEYGIjS0lL88MMP9Yrjiy++QEFBASIiIjTX3rJlCwYMGIBvv/0WU6dO1Zx78OBB+Pv7Gz3uFhYWRi2FM+W462PMOJv6njSV54KImo/AwEB8//33uHz5MlQqFXJycrBu3Tp4eXlJHVqjmzVrFoQQWq9FixZJHVaDaMl9M1ZTeeaZ3CKiWrHmFrUEFRUVWLx4Mfr27Yu7d+/il19+QVxcHKysrKQOTYtKpUJRURGsra31bt3ctm3bGr9fn1phTk5OWu/VY6MvuZ2Xl4fQ0FB07NgRO3fuxLp16+rcrqFWrlyJ//73v8jMzERgYCAcHR3x1FNPaZIL9fFg39Vb06v7rlKpUFBQAGtrazg4OOh8v127dgBQ51pjaunp6VrXAwB7e3vs3LkTPXv2xJo1azBz5kzcu3cPCQkJmDRpUr3aM4Qpx/1BxoxzY9yTpvJcEBERUc2Y3CKiWnHmFjV3Z8+exaBBgzBv3jzMnz8fJ0+eRO/evaUOSy+5XA4HBweUlZWhuLhY5/Pc3FwJotJlYWGBvXv3YsuWLXj00UcxefJknDhxwqRtymQyREZGYu/evcjPz8fmzZshhEBYWBiWLVtm0rblcjmcnJxQVlaGoqIinc9v3rwJAGjfvr1WvMZq1aoVAODChQtax11dXbF7924oFAosW7YMgwcPhp2dHcLDw41u4+DBg0YlxUwx7tWNjTHjXJd70tAa67kgIpLC77//jmeeeQaFhYWaY/7+/jqbyKhf0dHRdWonNjYW3333XUOFLRl94/Wgb7/9VjNe1tbWjRhdzVrCPWByi4hqxZlb1FyVl5dj8eLF6N+/P+RyOU6fPo3Zs2ebfPlcfY0cORLAX8sT1W7fvg2lUilFSDocHBzg7u4Oe3t7bN26Ffb29ggNDUV2drbJ2nR2dkZaWhoAwNLSEsHBwZpd/rZv326ydtWeffZZANBpS6VSYd++fbCxsdFaSmpra4u7d+9q3nt7e2P16tUGtbF8+XLk5eVpfebm5oa9e/fC2dkZJ06cQFBQUKMkSkwx7jWNjTHjbOw9MYXGeC6IyPSKi4vRtWtXhISESB1Kk5CSkoJ+/fph+PDhcHR0NGlbkydPxjvvvIP333/fpO2YkqHjNX78eAghEBgY2IjR1a4l3AMmt4ioVpy5Rc1RSkoKBgwYgAULFmDBggU4dOgQfHx8pA7LIB9++CFcXV0RHR2NPXv2oLi4GOfPn8eECRP0LlWUmoeHBzZu3Ihbt24hLCwMKpXKZG1NnToVZ8+ehUqlwh9//IGPP/4YQohG2Wr6o48+gqenJ6Kjo5GcnIyioiKkp6fjhRdeQHZ2NhISErSWE/bp0wfp6em4du0ajh07hszMTAQEBNTYxsCBAxEbG4vff/8d/v7+2LFjB+7cuYOSkhIcOXIEb7/9Nuzs7ODi4oKFCxfiyy+/NKoPp06dQuvWreHv72/Uf9cbetxrGhtjxtnYe2IKjfFcEFHDsLe3h7+/v97PhBCorKx8KH7mrWkcAKCwsBCjR4/G2LFj8frrr+t8fuLECZ16U0IIxMfH1ykeLy8vbNq0CR988AGSkpLqdA0p1TZezUFzvwcAwN0SiarB3RL/EhsbKx5//HGpw6BmqrF3SywtLRWzZ88W5ubmIiAgQKSnpzda2w1JqVSK0NBQ4ejoKGxsbET//v1FcnKyCAwM1OzKM3HiRHHs2DGd3Xoe/Ot906ZNOp9HRETo/a56p58Hj48aNUqsX79e5/jy5cv1XiciIqLG/lW3W2J1sQohREpKipgyZYro3r27sLW1Fa6urmLQoEFizZo1orKy0qjxNbbvardv3xbR0dHC09NTWFpaanY23Ldvn04baWlpIiAgQNjZ2YlOnTqJlStXGhxfcnKyePrpp0Xr1q2FhYWFcHZ2Fn5+fmLp0qWiqKhIHD16VNja2mrFWV5eXut1T5w4oRm3qjsvNta4q9U2NsaMszHn1qYpPRfcLZGagpa2W2JddrFtiWobh/fee09YWFiIGzdu6Hzm5+cnTpw4YZK4wsPDRceOHQ36+6wuevfuLeLi4sTvv//eoNetabyqExgYqHf3a6mZ+h7UV027JTK5RVQNJrf+8t5774levXpJHQY1U42Z3Dpy5Ijw8fERjo6OIj4+XuuXd2paqktuEdF9TG5RU8DkVstU0zhUVlaKdu3aVfu5KZNb33zzjQAgNm/ebJLrjxw5UpibmwuZTCaGDh0qVq9eLfLy8up1zdrGqzpNNbll6ntQXzUlt7gskYhqxZpb1NSVlJQgNjYWAQEB8PDwwLlz5zBjxgzNzmZERET08FqyZAlkMhnu3LmDI0eOaAp6W1hYAICmjqD6VVZWpvf477//jnHjxsHBwQGtWrVCZGQk8vLycOXKFYwePRoODg5wc3PD5MmT9W4ycevWLbzxxhvw8PCAlZUV2rRpg7CwMKSkpOic++effyImJgZeXl6wsrKCi4sLRo4ciQMHDmjOWbRokSa2qssMd+3apTneunVrg8cBAM6cOYObN2+iV69e1Y7nV199hd69e8POzg5OTk4ICAjAN998o3OeSqXCnDlz4OPjA1tbW7i6umL06NHYunWr3t8t1Jv9/PDDD9W2XR87duzA9evXsWTJEhQWFiIqKgrt27dHWFgYvv/++zqVVahtvNLS0hAaGgonJyfY2dkhICAAhw8frvZ6htx3Yzg7O1e7AYCZmRmuX7+udb6p74Ep8ad+IqqVmZnZQ1F/gJqnQ4cOoXfv3li1ahUSExOxc+dOdOrUSeqwyEDTpk2DTCZrkrXEiBpbbGys5pcO/qMSUcOZNWsWhBCws7ODn5+fpkZURUUFACA0NBRCCIwZM0brew8ej4mJwdtvv42cnBzEx8dj3bp1iIiIQHR0NBYuXIjs7GzMmzcPa9euxdy5c7WulZ2djf79+yMpKQn//ve/kZubi4MHDyI3NxeDBw/GsWPHNOfm5OSgf//++Oabb5CQkIDbt2/j559/hq2tLQIDA7F27VoAwD//+U9Nv6p66qmnIIRA3759jRoHADh37hwAoGPHjtWOZ15eHv7zn//gjz/+wC+//AJPT09ERETgjTfe0Drv9ddfx4oVK/Cvf/0Lf/75Jy5cuAAfHx+MGTMGhw4d0rmuu7u7Vgym0L59e8TExODXX3/F+fPnERMTg1OnTmHs2LFo3749Jk+ejIMHD0IIYdD1ahqvS5cuYfDgwTh58iQ2btyImzdv4t///jcWLlyIjIwMnfMNve/GKioq0qqNtmDBAgDABx98oBN3Y9wDk2mcyWNEzQ+XJf5lwYIFwtvbW+owqJky1bLEgoIC8cYbbwgzMzMxatQocf369QZvg5of6Kk/9uBr7ty5UofZ4jT1cW/q8RE1VQ/bssQxY8YIAKK0tFTv8e3bt2sd9/X1FQDEjz/+qHXc09NT52fnF198UQAQX3/9tdbx7OxsIZfLRd++fTXHXnrpJQFArF+/XuvcsrIy0aFDB2FjYyNycnJq7Vffvn1Fq1atdI7XNA4ff/yxAGBUnUghhBgwYIAAII4fP6455unpKYYMGaJzbrdu3cSBAwf0Xkcmk4kuXboY1XZ9VVZWioMHD4pJkyYJZ2dnAUA89thjBn23pvEKDw8XAMTGjRu1jt+4cUPI5XKdZYnG3ndDODk5iaKiIs377777TshkMvHSSy9V+x0p7oGhuCyRiOqFM7eoqdm1axceffRRfPXVV0hMTERycrLmX5ro4Sb07N704GvevHlSh9niNPVxb+rxETVVMplM6hD0OnfunM4Sq8bYpa5fv35a7zt06KD3uLu7O7KysrSObd68GWZmZggJCdE63r59e/j6+uLUqVOaJWKbNm0CAIwaNUrrXLlcjsDAQJSWlpps2Zh6SaalpaVR33vuuecAANu2bdMce+qpp3D06FFERUXh+PHjmhmpSqUSw4YN03sdCwsLlJaW1iHyuj8XMpkM1tbWsLa2NrrfNY3Xrl27AAAjRozQOt6hQwd069ZN53xT3Pf8/HzN7Piff/4ZL774Ip544gmsWrWq2u/U5x40Fn3/bbLQcx4RkRZzc3Muj6AmIT8/H7Nnz8bq1asRHh6OlStXok2bNlKHRURE1CLZ2tqipKRE6jB09OzZ0+BlYw3J0dFR672ZmRnMzc1ha2urddzc3FzrH4ZVKhUKCgoAAE5OTtVe/+LFi2jTpg0KCgpgbW0NBwcHnXPatWsH4P4SNlOwtrYGAJSXlxv1PTc3NwDAH3/8oTm2cuVKDB48GF9++SUCAwMBAAEBAZgyZQqeffZZvdepqKiAjY1NXUI3+rlIT0/H119/ja+//hoZGRlwdnbG2LFjERERUW3y7UHVjZdKpUJRURGsra31ll5o27Yt0tPTtc435X2/evUqxowZg06dOuH777+HlZVVtefW5x6YWnFxMQDoHVPO3CKiWnHmFjUF27dvR8+ePbFlyxZs3LgRSUlJTGwRERGZUNu2bVFYWIg7d+5IHUqDkGommlwuh7OzMywsLFBeXl7tDNK//e1vkMvlcHJyQllZmd6i9Ddv3gRwf8aXmpmZGe7evatzbn5+vt54ahoHdZJKnYwzlHqmWtu2bbXaiYyMxN69e5Gfn4/NmzdDCIGwsDAsW7ZM5xqFhYUQQmhiMIWbN29ixYoVGDBgALy9vREXF4dHH30UGzduRE5ODtauXYu//e1vBj8r1Y2XXC6Hg4MDysrKNAmZqnJzc3XON/a+G6qoqAghISEoLy9HcnIyXF1dqz23Me5BfajHQd/vAExuEVGtmNwiKeXl5WHKlCkICQnBkCFDkJqairFjx0odFhERUYunnglz5swZqUNpELa2tlpJIG9vb6xevbpR2g4LC0NFRQWOHDmi89nixYvxyCOPaAq7q2c1bd++Xes8lUqFffv2wcbGRmupm5ubG27cuKF1bk5ODq5evao3lprGoWfPngCgs4seAKxdu1anSD1wf+l3UlISAGD06NGa487OzkhLSwNwf9lecHCwZgfKB/sGQNMHdQwNbdSoUXB3d0d0dDRsbGywatUq5OTkYNOmTRg7dizkcrnR16xpvEaOHAngr+WJardv34ZSqdQ539j7boh79+5h/PjxSEtLw//+9z+t5ZDPPfccNm/erHW+qe9BfaWkpMDFxUWzJLgqJreIqFZclkhS2bBhA7y9vbFt2zZs3rwZSUlJaNWqldRhERERPRQUCgU6d+6MPXv2SB1Kg+jTpw/S09Nx7do1HDt2DJmZmQgICGiUtj/66CN4eXnhlVdewc6dO1FQUIDc3FysWrUKCxYswJIlS2BhYaE519PTE9HR0UhOTkZRURHS09PxwgsvIDs7GwkJCZplagAwfPhwZGVl4dNPP0VxcTEyMjIwY8YMrVlUho5Dr1690LZt22oTmr/++itee+01XLp0CWVlZVAqlYiMjMSpU6cwffp0DBw4UOv8qVOn4uzZs1CpVPjjjz/w8ccfQwiBJ598UufaKSkpmv6YQlZWFhYtWoQrV67gxx9/RFRUFFxcXOp1zZrG68MPP4Srqyuio6OxZ88eFBcX4/z585gwYYLeZXXG3ndDvPnmm9ixYwdWr15t0FJLU9+D+tq9ezeGDh2q/8MGLFxP1KJwt8S/tLSdcqhx1WW3xJycHDF27Fghk8lEZGSkyM3NNVF0REREVJPXXntN+Pj4iMrKSqlDqbe0tDQREBAg7OzsRKdOnTQ73G3atElnB9WIiAhx7NgxnePvvfeeOHHihM7xjz76SBw6dKjGnVj//PNPERMTIxQKhbC0tBRt2rQRw4cPF3v27NGJ9fbt2yI6Olp4enoKS0tL4eTkJEaMGCH27dunc25+fr6YNGmScHNzEzY2NsLf31+cOHFC9O3bVxPH7Nmzax0HtXfffVdYWFiIGzduaB0vKysTGzZsEM8++6zw8vIScrlcODk5iWHDholvvvlGJ66UlBQxZcoU0b17d2FraytcXV3FoEGDxJo1a/Q+T+Hh4cLd3V3cvXu35hvZxFQ3XkIIoVQqRWhoqHB0dBQ2Njaif//+Ijk5WQQGBmruzcSJEzXnG3Pfa3Py5MladwretGmT1nea8j24deuWkMvl4osvvtD3cZZMCAkq8RE1AwkJCYiLi0N2drbUoUju008/xcKFCzVrnImM4e/vjz59+mDFihUGnb9hwwZMmzYNDg4OWLNmDYKCgkwcIREREVXnzJkz6N27N7Zv346nn35a6nCoERQUFMDX1xchISH47LPPGqXNM2fO4PHHH8c333yD8ePHN0qbDUWK8TKFpn4PFi5ciKVLl+LGjRuws7N78ONsLkskolqx5hY1huzsbISGhmLcuHEYO3YsfvvtNya2iIiIJNarVy+EhYVh1qxZRu+gR82Tk5MTtm3bho0bN2LlypUmby8zMxNhYWF45513mmRSpTaNPV6m0NTvwY0bN/Dxxx/j7bff1pfYAsCaW0RkANbcIlMSQuC///0vfH19ce7cOezfvx+rVq3SW4uAiIiIGt/y5cvx+++/49NPP5U6FGokjz/+OE6ePImdO3eisLDQpG2tWrUKH3zwAT744AOTtmNKjTleptDU78Hbb7+Ntm3bIiYmptpzLBoxHiJqpjhzi0zlypUrmDx5Mvbv349JkyZh2bJl1f5rDBEREUnjkUcewaxZs/DPf/4TTzzxhN4d86jl8fDwQHJyssnbWbx4scnbaAyNNV4ymazWc+bOnYt58+YZfM2mfA/WrVuH9evXY/PmzbC2tq72PCa3iKhWnLlFDU0IgTVr1mDmzJno3Lkzjh07hgEDBkgdFhEREVVjzpw5+PXXXzF69Gj8/PPP6NSpk9QhET2UHqay6UeOHMGkSZPw9ttv45lnnqnxXC5LJKJaceYWNaSMjAw8+eSTeO211/Daa6/h1KlTTGwRERE1cebm5li3bh1cXFwwatQo3LhxQ+qQiKgFO3HiBEJDQzFy5Eh8+OGHtZ7P5BYR1Yozt6ghVFZWYvXq1ejVqxdyc3Nx/PhxxMXFQS6XSx0aERERGcDJyQk7duzAvXv3MHDgQPz6669Sh0RELdDGjRsxbNgw9O/fH+vWrYOZWe2pKya3iKhWnLlF9ZWbm4vBgwfj9ddfx+uvv44TJ06wXgcREVEz1LlzZxw9ehS+vr544okn8K9//QsVFRVSh0VELUBhYSFmzpyJ559/HhMnTsS2bdsMrsfL5BYR1Yozt6iuKioqcP36dXz77be4e/cufvnlF8TFxcHKykrq0IiIiOgBlZWVuHz5Mnbt2oXly5cjOjpa73lOTk7Yvn07oqOj8dZbb6F3797YvXt3I0dLRC1FRUUFvvjiC3h7e+PLL7/E559/jhUrVsDc3Nzga7CgPBHVijO3qC7Onj2LV155BdeuXcOgQYPw008/GfUXFBEREZlGaWkplEollEolLly4gLS0NM370tJSAEDbtm3RvXt3lJaWwsbGRucaFhYWWLRoEV5++WXExMRgxIgR6NmzJ1544QUEBwfjscce4z9mEVG1CgsLcfr0aezYsQNff/01bt68ialTp2L+/PlwdXU1+npMbhFRrdQJicrKSoPWO9PDrby8HMuWLcOcOXPQr18/9O7dG3379mVii4iIqJHl5eUhMzMTqampOH/+vObPSqUS9+7dg4WFBR555BEoFAo88cQTmDZtGhQKBXr27In27dsb1IaXlxe2bNmCkydPYs2aNUhISMC7774LCwsLuLq6wt7e3sS9JKLmJj8/H3l5eRBCoGvXrnjxxRcxadIkeHp61vmaTG4RUa3UCa179+4xuUU1SklJwcsvv4z09HQsWLAAb731Fp544gmpwyIiImqxKioqcPXqVZ0k1m+//YabN28CAORyOby8vODr64vRo0dj9uzZ8PX1RY8ePfTOyqqLfv36oV+/fkhMTIRSqcRvv/2GW7duobi4uEGuT0Qth5OTEzp06IBevXqhc+fODXJNJreIqFZVZ24R6VNWVoZ58+ZhyZIlGDJkCFJSUtC1a1epwyIiImoxVCoVLl26hPPnz2slsc6fP69ZSuji4oIePXrA19cXQUFBmj97enpCJpM1SpxmZmbo3r07unfv3ijtEREBTG4RkQGqztwietDRo0cxceJEZGVlYenSpZg+fTpn+BEREdVRXl6ezjLC8+fP4/LlyxBCwNLSEp06dUKPHj0QFBSEqKgo9OjRA7169YKDg4PU4RMRSYLJLSKqlTpRwZlbVFVJSQkWLFiATz75BMOHD8fu3bvRqVMnqcMiIiJq8srLy3Ht2jWdJNbZs2dRVFQE4P4sLIVCAYVCgcjISM0yQh8fH9axJCJ6AJNbRFQrLkukBx06dAgTJ07ErVu3kJiYiKioKKlDIiIianJqK+gOAG5ubvD19YWvry/Cw8Ph6+urSWoREZFhmNwiolpxWSKpFRYW4v3338enn36KkSNH4sCBA3B3d5c6LCIiIkllZWXpLCPMzMxEZmYmAMDKygpdunTRKeju4+MDOzs7iaMnImr+mNwiolpx5hYBwK5duxAVFYXi4mLO1iIioofO3bt3cfHiRZ0k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tWzZUh988ME5ZWjbtq2OHj1KuQUAAICa5CAztwBvYxgqKipSUVFRiV0XNWyoi2JitHjlShOCncFpcputW4++kuLkcMQpNDRYvr6+7ssBMzMzZRiGfHx8JKlEfh8fH82dO1e33npr9QevgXx8fBQeHu6+dLEicnNzlZqaqgMHDujgwYPav3+/+89Dhw5p69atOnDggFJSUiS5islGjRqpefPmio6OVqtWrXTJJZeobdu2ps/6klxru3nqvx0AAADAE1BuAV4m2G7X599+a3aMcvP83M20YsUxde1afGtGRoa+/fZbbd68WZs2bdLXX3+t3377TZJrsfj8/Hzt3bvXhLwoS2BgoHum1umkpaVp586d2rlzp3bs2KEdO3Zo8+bNevPNN5WamipfX19dfPHF6tChgzp06KCuXbuqTZs21fQu/uRwOLRr165qf10AAADAW1BuAcBpOBwOde/eXd27d3dvczqd2rx5s7vwMmMNJZy70NBQtW/fXu3bty+xb9euXcW+x2+//bYyMjLUsGFD9e3bV4MGDdLll18ui8ViQnIAAAAAp/IxOwAAadeOHRo2eLDaNGqk1g0a6Ia+fbVp/foS4/63YoUaR0S4HydOnJAkvfTcc2ocEaHs7Gxt3rDBvb9Z3bqlvl7K4cO67/bbFdO4sdo2a6bbBw7U3l9/LTEu9ehR/evBB9UlNlbR9eqpXfPmGj50qH7+4YcyM+3euVP33nab2jZr5t628I03Ss3912N//+23s8p16ufVKipK1/bsqU8++kiDrrvOfa4Jo0ZV6HtxNsLCwtSrVy89+OCDevfdd/Wf//ynyl4L5mjWrJluuukmTZkyRWvXrpXT6dSGDRs0bNgwbdiwQd27d1fLli316quvqrCw+B1Sf/nlFyUkJCg0NFTBwcG6/PLLtW7duhKvsXTpUlksFvcjOTlZN954o8477zz3tjlz5hQbc7JI/euxe/bs0U033eReaL9///5nNdtr/vz5xc5jsVh06NChyvkQAQAAgGpCuQWYbM/u3bquTx/98N13en7ePG3evl2Tp07VzClTShQ7ffr1057UVPXu27fY9rvuu097UlMVFBSkDp06aU9qqvakpmrXH2sK/dW/H3pIt99zjzb8/LNmv/qqNn79tUb9cXfGk44cPqxrevbUB0uW6PGpU7V1924tXL5czuPHdV2fPvp206ZSM028/34NueMOff3jj1q6erWsVqv69O1bau6/HntqrudeeUVfff55iVx//by+2bFDU2bN0qsvvKBtP/0k/4AA7UlN1X/PYvFy4Gz5+PgoLi5OjzzyiLZs2aIffvhB3bp109133634+HgdPnxYkrRz50517txZmzdv1uLFi3X48GHNnj1bkydPLlE2JSQkyDAMXXvttZKk4cOHa8SIEdq3b5/Wr18vq9VaYkxZx44ZM0ZjxozR/v37tWjRIn366afuOzSezs0336zExET17t1bqampMgxDkZGRlfGRAQAAANWGcgsw2ZTJk5WelqZHn3pKl8fHKzg4WK0uukhTZ83SkT9+Ya5sA4cMUbuOHRUUFKTLunVTzyuv1NbvvlPqsWPuMf997DHt37dP/3ziCV3Ru7eCg4PVolUrPTd3rgxJj06YUOq57xk9Wpd27Sqbzaa27dtrV0qKIs47r9y5unbvrh59+pTIVdrn1aJVK818+WXl/OUueUBVadOmjebMmaPNmzfryJEjGjBggCTpoYcektPpVFJSknr37i273a6YmBi9+uqrZ7zz6oQJExQfH6+goCB16tRJBQUFqlOnzlnlufPOO9W5c2cFBwerV69e6tevnzZt2qSjR4+WeYzT6VS/fv1UWFiolStXntMi/gAAAICZKLcAk6395BNJUrcePYptrxcZqabNmlXJa8a2a1fseWT9+pKkI6dcjvS/FSvk4+OjnldeWWxs3fPPV4tWrfTDli06eODAGc99LrnqN2hQIldZn1dEnTpq1qJFhV8bqIiYmBi9/vrr+uqrr7Rjxw6tWrVKknTlX/7dREVFqcUZ/n7GxcVVOEfHjh2LPb/gggskSQdK+TcqScnJyerUqZN8fHw0Y8YMWa3WCr82AAAAYDbKLcBEeSdOKCszUwEBAQoODi6x/7wy1sw6V46QkGLPfXxcPwqKiorcuTLS01VUVKQ2jRoVWxercUSEfty6VZK0p5Q1fYJKeR8VzeXv718i1+k+r9CwsAq/NlBRGzdulNVqlcPhUEZGhgIDA2W320uMO//88097ntL+Tp+t0NDQYs//+m/nVMePH1dCQoIaNmyolStXav78+RV+XQAAAMATcLdEwET+AQEKttuVlZmprKysEr/cOo8fL9f5KuvObf4BAQoJDVV2VpZ+OXBAvr6e8aPiTJ/XsTLWGKsqhmFoy5Yt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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model.walk()\n", "model.show_graph()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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7BjTsQljOjZJs081r8JpFqtPr4h9SbcC/Pxe96c297+lN5eIiIg8G3QsUUREREREREREciwlt0REREREREREJMdScktERERERERERHIsJbdERERERERERCTHUnJLRERERERERERyLCW3RERERLLB9OnTMRgMGAwGihQpYu5wngurD53EzX8ibv4TKTpwirnDERERETNRcjoZaVIAACAASURBVEtEREQkGwwePBiTyYS3t7e5QzGLV6Yuptv8H7J0TN/q5bk5fwT1y3hm6bgiIiKSsyi5JSIiIiIiIiIiOZaSWyIiIiIiIiIikmMpuSUiIiIiIiIiIjmWklsiIiIiqVi9enVSAXiDwcCZM2fo0qULBQoUSGq7desWACEhIQwcOBBPT0+sra1xcXGhQ4cOHDlyJENzxcXF8f333+Pj40OhQoWws7OjUqVKzJkzh4SEhKR+9erVSxZTt27dAGjatGmy9jt37mT9G/IMOHcjlDcXrqTkezPwfGcabWd8zf7AK2n2vx11n1Ert1Bz1HyKDJhM6UEzeW3ed+w5eynTc7eZsTSpeL2b/0T8F68BoNOc5cnaw+8/eOz1iYiIyONRcktEREQkFb6+vphMJtq1awdA37598ff358qVK+zbtw8LCwsArl+/To0aNfjhhx+YP38+YWFh7Nixg7CwMGrXrs3evXsfOdfGjRvp2rUrjRs35tSpU1y5coU+ffrw3nvvMWzYsKR+u3fv5siRIzg4OODt7c2iRYsAWLduHbVq1eLbb7/FZDLh5OT0FN4R87oQcptW05Zw9PJ1vujdgRNTApjyWnNmrt/NxVu3U/QPjoii2eSv+OnQCSZ0bsapae+yYVgP7Kyt6DhnGcv2ZCzx+NDaQX5sG/Ef7K2tqFDElemvvwLA8v97laqeHizq6cvN+SPIZ2ebJesVERGRjLM0dwAiIiIiOcGwYcNo2LAhALVq1SIuLg6AHj16cOnSJZYtW0bLli0BqFChAt999x2enp4MGDCAQ4cOPXL8hg0bMnz48KTXAwYM4MCBA8yZM4cPP/wQR0dHALy9vfnqq6/o0qULfn5+rFy5kr59+9KkSRO6du2axat+PB79JxGfYEr1mpv/xGSvXRwdOD454JFjTvx5B+H3HzCzW0salPMCoJyHK3P82lDjw09S9J+wejuXQ++wqKcvPpVKApDX1oaFPX2p8eEn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69y5M7t27cpwXCcnJ549e8bx48eznQUgJiaGli1bolarWbBgARqNJkfPT9O8efN0f04bR3D16lXjtu3btwPw3nvvpdu3UqVKNGzYMFfnfVFOXp+NGzcCvLTzLu37m5t9g4ODUavVdO7cOd1+tra2NG7cmIiICC5fvpzusbJly+Ls7Jxum4ODA9WqVSMyMjLbBZicnPtV349q1apRv379bJ0vO7J7bbl53eD13nuvc62F5T3/PDs7OwwGA1euXMnwmBS3hBBZUqvVsixRlEh79+5N163122+/Ub16daVjCSGEEDly6dKlLPfRaDTG2Ubm5ua8/fbbvPfee1hbW2f4wT0rOp2O5ORkfv75ZwBWrlyJTqejd+/eaDQa49LEX375hc6dO2NhYWF87j///MOUKVNwcHDAxsbGOLNn3LhxAFl2oD3v7t27eHt7U6NGDbZt22ZcGpkb1tbW6f5samoKYFzdkJiYyIMHDzA3N093PWly0y32Mtl9fRITE/nnn38wNzfH0tIy02PmZt+UlBSsra0zzDH7+++/ATh9+nS655UrV+6lx6tcuTIAN2/ezPLac3LurL4faefNC9m5tty+bvD6773cXmthec8/L+39+bIOTiluCSGyJAPlRUmT1q31zjvvUL9+/QLt1lq9erXxg465uXmBnPNFLw5JfR0vDvB92Yef/PSqoamFyYEDB9BqtVSrVg0rKytat26NXq8nPj4+18dcu3YtKpUqWwOgSyKl3xcTJ05Md/5WrVoV6PlFyXP58mXU6vQ/+pUqVQqVSgWk/vD70UcfMX/+fCIiInjw4AG7d+/mvffeo3Tp0lhZWeXofJ06daJ8+fKsXLmSW7duER4ejre3N1WqVOHdd99l586dXLt2jR9//DHDkkStVsuMGTMYNGgQsbGxpKSkYDAYmD9/PkCGQfmZMTExYceOHWzatAkHBwcGDRrEoUOHcnQt2WVmZoalpSVPnjzh4cOHGR7PTvEmO7L7+piZmWFtbc2TJ0/SLQN9Vfac7FuuXDlMTEyMXX4v+2rXrl265925c+el37u01+X5Akza+/J1zp3V9+N1/o19UXauLbevW3YU5LXm5Lx59Z5/XtrfYy/72VSKW0KILKnUapKlc0uUEHv27MHJyYnAwECWLl3Kli1bCrRbq1evXhgMBjp06JCr5z98+JB69eplaHnPieeHpOaV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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model.relax()\n", "model.show_graph()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "model.show_graph(show_roi=True)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "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/CMAFy5cYNu2bQQGBjJx4kTat29vDXF+/kTCxho2bBiVlZVs27at1nuzZ8/m2muvrXFAemNdzn25u7tz/vx569fdu3fn9ddfb3D91Vs1q7cPVsvPz+fAgQONvzkREREREZGrgMIrkVZu1qxZBAUF8cc//pE1a9ZQXFzM8ePHGT9+PLm5udbwytHRkaioKPLy8njxxRfJz8+ntLSUTZs28dprrzVpPcHBwTz66KN8/PHHFBUVUVBQwMKFC5k5cyZz5szByanpdjRfzn3deuutZGdnc+zYMTIyMrBYLERGRja4/ueffx4/Pz9SUlJYv349JSUl7Nu3j8TExDq3EoqIiIiIiEgdDJGr1GOPPWbExMTYuowrIj8/30hJSTGCgoKMNm3aGNdcc42RkJBgZGdn1+h3+vRpY9y4cUbnzp2NNm3aGB06dDAeeeQR46mnnjIAAzBuu+02Y+XKldavf/7KyMgwQkJCDEdHRwMwTCaT4ejoaAwbNqzGPGfOnDEmT55sXHfddUabNm2M9u3bG/fee6+xfv16a5+65njooYeMjIyMWu1PP/20YRhGrfYhQ4Y06L6q7d+/34iMjDQ8PDyMzp07G3//+98bXH+1AwcOGPHx8Ubbtm0NNzc3Izw83Fi9erURHR1tnfuxxx5r3B9wC3A1/X0TEREREZEmtdZkGI08xEakhUpKSuLo0aN88sknti5FpNXT3zcREREREblM67RtUERERERERERE7JbCKxERERERERERsVsKr0RERERERERExG4pvBIREREREREREbul8EpEREREREREROyWwisREREREREREbFbCq9ERERERERERMRuKbwSkSvK09OTvn372roMERERERERaSEUXomIiIiIiIiIiN1ysnUBIiIiItL6/Pjjj5w8eZIff/zR1qW0CJ6engQEBODr62vrUkREROyOwisRqeX06dOkpaXxwQcfcOLECby9vYmMjOSZZ56hV69eAKSnp3P//fdbr8nJyWHq1KmsW7cOR0dHIiIiMJvNBAcHAzBnzhyefPJJALZt24bJZALA0dGRysrKRs29f/9+/vznP7Nx40YKCgqs47Rr164ZPyUREfm5qqoqPvnkE1asWMHGjRvJycnBMAxbl9XidOrUiXvuuYf4+HiGDh1KmzZtbF2SiIiIzZkM/V+FXKWSkpI4evQon3zyia1LsSu5ublERERQVlbGm2++yV133cWRI0d44okn2L59O59++ikRERHW/vHx8axatYq4uDimTp3KzTffTEZGBvfddx833XQTO3bsqDG+p6cnvXr1YuvWrU029913382MGTPo3bs3//3vf7nzzjvJy8ujXbt29OvXjz179rBmzRruuOOO5vvg5Bfp75tI67Zs2TKmTZuGxWIhPDycQYMGcdttt9G5c2fatm1r6/JahJKSEnJzc9m9ezfr16/n888/JyAggL/85S8kJSXh6Oho6xJFRERsZZ1WXolIDampqRw5coS3336bwYMHAxASEsKSJUvo2rUrEyZMYNeuXbWuS0pKsgZL/fv3Z8iQISxfvpz8/Px6r4C63LmnTp1KVFQUAH369KmxkquqqgrDMPTbfxGRZvDf//6XiRMnsmXLFkaPHs3q1avp0aOHrctqsW6++WYGDBjAtGnTOHLkCPPmzWPChAksXLiQV155RQ88ERGRq5YObBdpxbKysjCZTDVeycnJv3hNeno6Dg4OxMbG1mgPDAwkJCSE3bt3c/z48VrXhYeH1/i6c+fOAJw4caLe9V7u3L17977kmJs3b6agoKDGii0REWm8JUuW0Lt3b8rKysjMzGTRokUKrppQly5dePnll9m7dy8BAQFERUUxb948W5clIiJiE1p5JdKK3XTTTQ1acVReXk5RUREA3t7el+z33Xff0alTpxptF/d3dnYGflr51Nxze3h41GsOERFpPMMw+Nvf/sa0adNITk7mpZde0pa2ZtSjRw/Wrl2L2Wxm8uTJfPPNNyxYsEBnYYmIyFVF4ZWIWLm4uODj40NJSQmlpaU4OTX9t4jqg9ptMbeIiDTeX/7yF1544QX+8Y9/MHbsWFuXc9WYNGkSXbt25aGHHqKyspJFixbZuiQREZErRtsGRaSGYcOGUVlZybZt22q9N3v2bK699toaZ0o1lLu7O+fPn7d+3b17d15//fUrMreIiDTOsmXLePbZZ5k/f76CKxuIi4vj/fff5z//+Q+zZ8+2dTkiIiJXjMIrEalh1qxZBAcH8+ijj/Lxxx9TVFREQUEBCxcuZObMmcyZM6dRq6JuvfVWsrOzOXbsGBkZGVgsFiIjI5tt7n79+uHv709mZuZl1ywiIvDll1/y8MMPM2XKFMaNG2frcprckiVLrOdDurq62rqcSxowYAAvvfQS06ZN4+OP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AHBzc7OuiPq5gIAAduzYQXx8PMnJybRv354ePXqwYsUKVq1axYgRIwCYM2cOJpOJPXv28P3332MymZg+fToAS5cuZdy4ccyfP5+OHTsSFBTE4sWLGTVqFAAxMTEEBQUxduxYvLy82Lt3L3FxcWRlZZGfn09UVBQVFRVs2bIFZ2dnnn322Sv0KTWP4OBgMjIyCA8PZ/jw4QQEBPDII48wYcIEQkNDKS8vx2QykZSUBPy0JXDnzp08+OCDTJw4EX9/f3r37s3Zs2fZsGEDY8aMadD8ycnJV8XnLCIiciWYjLoOQBC5CiQlJXH06FE++eQTW5civ+DLL78kPj6e77//HkdHRyorK2nTpg3nz58nMjKS5cuXExAQYOsy5VfU9+/bjh07ePfdd/nPf/5Dfn4+8NMh1G3btr0SZYq0anfffbc1MImNjSUxMZFBgwbh6up6yWvWrVvHwIEDKSws/MXD5MW2vL29mTt3rjWIExERaWXW6WmDImK3jh49yj333MPZs2epqqqiqqoKgPPnzwM/rWi499572bVr1y9upxH79u233/Luu++yePFijhw5grOzs/XPWESaTvXvK8+fP88HH3zAypUrcXNz44EHHuChhx6iX79+ODo62rhKERERkdq0bVBE7NaMGTMoLS3lwoULdb5fUVFBVlYWixcvvsKVSWMdP34cs9lM7969ufHGG5k9ezZHjhwBUHAlcgVUVlZiGAbnzp3j7bff5t5778Xf359x48axdevWOp9MKCIiImIrCq9ExG6tWLHiVw+zNQyD999//wpVJI1RUVHB4sWLiYqK4tprr+XJJ59k165dgAIrEVuqfophUVERb731FpGRkXTs2JFJkyZx8OBBG1dnf0wm06++ZsyYYesyRUREWhXtsxERu1RSUkJRUdGv9quqqtIPV3Zu9erVfPLJJxw7dozNmzdb2+v7lK127do1U2UiV5fqrde/pDpIzsvL45VXXrG2z58/nz/96U84Ozs3W30thValiYiIXHkKr0TELrm4uGAymer1Q4Kbm9sVqEguV0xMDN27d6ewsNC6DdRkMtXrB2mAqKgonWkm0gR27drF6dOn69XXwcEBwzBo164dp0+fJiEhQcGViIiI2Ix+GhARu9SmTRt69OjBt99++6v9fvvb316hquRyuLi40KVLF0wmE6tWrWL16tUsWrSI9evXYxgG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JT5t8FIcHBz4xz/+YT343tXVlbFjx9boU73q6sCBAwwZMoSnnnqKrl27MmPGDH744QdblC0iIlKDwisRsVsWi4WgoCBblyEiclWprKzkhRde4Oabb2bfvn3NPl9AQAA7duwgPj6e5ORk2rdvT48ePVixYgWrVq1ixIgRACQnJ+Pl5cXevXuJi4sjKyuL/Px8oqKiqKioYMuWLTg7O/Pss8+Snp6OyWRi1apVALi5uZGYmGidc968edx888307NmTkSNHYjab6dmzZ43PoCU+bfBSTCYT8+bN409/+hPJycm0bdu2zn7BwcGYzWYOHz7M//3f/2E2m+nSpQuTJk2qcWi+iIjIlWYyWsu/yiINlJSUxNGjR/nkk09sXYrUoby8HHd3d5YtW8bvfvc7W5cjjaS/byItw9dff82YMWPIyspi6tSphIeHExsbS2FhId7e3rYuTy7B29ubuXPnkpSU9Kt9S0tLcXNzq9e4xcXFvPnmm7z44oucPn2akSNH8tRTT3HjjTc2tmQREZGGWKeVVyJilw4fPkxVVZW2DYqIXAGlpaU89dRT3H777bi6uvLVV18xY8YM63Y9aT3qG1wBeHl5MWnSJCwWC//85z/ZtWsXN910E0OHDq3zjDIREZHmovBKROySxWIB0LZBEZFm9tlnn9GrVy9ee+015s6dy2effUaPHj1sXZbYEWdnZ0aPHk1WVharVq3izJkz9O3bl759+/Lee+9RVVVl6xJFRKSVU3glInbJYrHg7++Pj4+PrUsREWmVfvjhB8aNG8c999xDt27dyMrKYtKkSdan0olczMHBgaFDh/LFF1/w+eef4+vry8iRI61PKCwrK7N1iSIi0krp/05ExC7l5ORoy6CISDN577336NGjBx9++CHLli3jww8/pFOnTrYuS1qQvn378uGHH7Jnzx4iIiJ48sknCQoKYsaMGRQWFtq6PBERaWUUXomIXbJYLAqvRESa2IkTJ7j//vsZOXIkAwYMICsri+HDh9u6LGnBQkNDWbx4MUePHmXcuHHMmzfP+oTCEydO2Lo8ERFpJRReiYhdUnglItJ0qqqqeP311+nRowdZWVls2LCBxYsX4+fnZ+vSbGbJkiWYTCZMJhOurq62LqfFCwwMZMaMGRw9epSZM2eyfPlygoKCGD16NPv377d1eSIi0sIpvBIRu5STk6PD2kVEmkBWVhZ33nknycnJjB8/nqysLPr162frshrkjjvuIDY2tknHTEhIwDAMoqOjm3Tcq13btm1rPKFwx44dhISEMHToUDIzM21dnoiItFAKr0TE7pw+fZoff/xRK69ERBqhoqKC2bNnc9ttt3H+/HkyMzN54YUXcHFxsXVpchVwcXFh9OjR7Nu3j/T0dE6fPk1ERIT1rCzDMGxdooiItCAKr0TE7lgsFgCFVyIil2nr1q2EhYUxc+ZMZs6cyY4dO7j11lttXZZchaqfUJiZmWl9QmFcXBy9evVi8eLFVFZW2rpEERFpARReiYjdsVgsODk50blzZ1uXIiLSohQVFTFp0iTuvvtugoKC2LdvH1OnTsXR0dHWpYlYV1199dVXhIWF8dhjj3H99ddjNps5e/asrcsTERE7pvBKROyOxWKhS5cuODk52boUEZEW48MPP+Smm25iyZIlLFq0iDVr1tClSxdbl2U39u/fT3x8PN7e3nh4eBAZGcnWrVsv2f/MmTNMnjyZ4OBgnJ2d8fX1ZdCgQWzatOmy5vfx8bEeEH/xy8HBgePHj1/urbU4YWFhLF68mO+++464uDimTZtG165deeqpp8jNzbV1eSIiYocUXomI3cnJydGWQRGResrLy2PEiBHcd999RERE8M033zB69Ghbl2VXDh48SEREBLt27WL58uWcPHmSBQsWkJaWxqFDh2r1z8vLIzw8nHfeeQez2Ux+fj7bt2/H3d2d6Oho3njjjcuqo7i4GMMwrK+ZM2cC8Nxzz9GpU6dG3WNL1LVrV8xmM0eOHOGJJ57gjTfesD6hMDs729bliYiIHVF4JSJ2x2KxKLwSEfkVhmGwePFiQkJC2LVrF+vWrWPZsmW0a9fO1qU1ipOTU62VSdu3b2fNmjW12gMDA+s15rRp0ygsLMRsNhMTE4OnpyehoaEsWrSozpU+qamp5OTkMG/ePGJjY2nbti3dunXjnXfe4ZprrmHixImcPHmyUfe5bNky/vKXv/DII4+QmpraqLFaunbt2jFjxgyOHDnCK6+8QmZmJj179mTo0KHs3LnT1uWJiIgdUHglInbHYrEQFBRk6zJEROzWoUOH6N+/P4899hiJiYns3buXe++9t8nncXZ2Bn56cuGVUllZWWN1kmEY9OnThyFDhtRqz8vLq9eYa9euBWDAgAE12jt27Ei3bt1q9V+5ciUAQ4YMqdHu4uJCdHQ0paWlrFu3rkH3VVhYiKenJwDbt2/n4Ycf5q677mLhwoUNGqcu58+fbxVPkfTw8GDs2LHs37+f9PR0Tp48Se/eva1nZYmIyNVL4ZWI2JWKigqOHz+ulVciInWorKxk9uzZ3HTTTeTn5/PFF19gNputoUhT8/X1BaCgoKBZxr8SysvLKS4uxtXVtc7PKSAgoFb/oqIiXF1d8fLyqtW/Q4cOAPUOzi529OhR4uLi6Ny5MytWrLAGhJfr3LlzlJWVWf+sWoPqJxTu2LHD+oTC++67j1tuuUVPKBQRuUopvBIRu3L48GEuXLig8EpE5CJfffUVffr04a9//StTp05l586dhIeHN+uc119/PQ4ODuzbt69Z52lOLi4ueHl5UVZWRklJSa33Lw7mXFxc8Pb2pqysjOLi4lr9q7cL1nfL4s8VFxcTGxtLRUUFq1evxs/Pr8FjXKz6z6auFWStQfWqqy+//JLQ0FAeffRRunXrhtls5ty5c7YuT0RErhCFVyJiVywWC4DCKxGR/+/cuXM89dRThIeH4+npyVdffcWMGTMavWKnPjw9PbnxxhvZsmVLs8/VnAYNGgT8b/tgtfz8fA4cOFCr//333w/AmjVrarSXl5ezceNG3Nzcam1B/DUXLlwgISGB/fv38/7779cIm4YPH056enqDxqu2ZcsW/Pz8CA4OvqzrW4rqVVfZ2dkMHTqU1NRUunbtyowZM1r0ykAREakfhVciYlcsFgs+Pj6tavuDiMjl+vjjj7nxxhtZuHAhCxYsYPPmzXTv3v2K1jB48GDS09Opqqq6ovM2peeffx4/Pz9SUlJYv349JSUl7Nu3j8TExDq3Es6aNYugoCBSUlJYvXo1xcXFZGdnM2rUKHJzczGbzdbtg/X1xz/+kY8++ojXX3+dqKioJrqzn87nGjhwII6Ojk02pj277rrrMJvNHD58mPHjxzN//ny6dOnCpEmTOHr0qK3LExGRZqLwSkTsSk5OTqv/7bGIyK8pKChg3LhxDB48mNDQULL+H3t3Hldj3v8P/HXaVy2krJWkpAWJkLGGGW3C1GDOWFIG9xzjNncZM0TGZDQ3x2BUfjdiboOxJGPf0+IuSxQVrpOtopSmtEzL5/fH/e3ccxTOSXW1vJ+PRw+Prq7l9bmu6+icd5/r80lNhb+/PwQCQbNn+eyzzyCRSHD69OlmP3ZjsbCwQEJCApycnDB16lR07twZs2bNwt/+9jfY2dmhoqICAoEAfn5+AP77SGBSUhI++eQTfPHFF+jYsSMGDx6MV69e4ezZs5g3b55Cx7927Rp++uknAMDs2bPrzJp48ODBBrUrNTUVV65cwWeffdag7Vuzzp07S2coXLNmDQ4fPozevXtDKBQiNTWV73iEEEIamYAxxvgOQQgf/Pz88OjRo1b9Zrwtmjp1KpSUlLB//36+o5BGRK83QuR34MABLFy4EKqqqvjpp5/g7e3NdyRMmjQJ2dnZSE5Objc9fFqDSZMm4enTp7h+/TqUlNr336QrKyuxd+9e/PDDD0hLTnpFogAAIABJREFUS8Pw4cMRGBgId3d3vqMRQgh5f6fa9285QkiLw3EcjXdFCGmXJBIJJk6cCB8fH0yePBl3795tEYUrABCLxbh79y4iIyP5jkL+z7Fjx3D8+HFs3Lix3ReuAEBVVRVCoRC3b9/G0aNHoampCQ8PDzg6OiIqKgrV1dV8RySEEPIe6DcdIaRFkUgkMDc35zsGIYQ0m5qaGkRERMDe3h4cx+H8+fMIDw9Hhw4d+I4m1bt3byxatAjffPMNsrKy+I7T7hUUFEAkEuHjjz9u1PGz2gKBQAB3d3ecOXMGycnJ6NevH+bMmQMrKyuIxWKUlZXxHZEQQkgDUPGKENJiFBQU4OXLl9TzihDSbty6dQtDhw7FokWLsHDhQty+fbvFFiOCg4PRo0cPuLu7448//uA7Tovw+thV9X0FBwc36jErKysxdepUVFVVYdOmTY2677amttdVeno6Jk2ahKCgIJibmyM4OBiFhYV8xyOEEKIAKl4RQloMjuMAgIpXhJA2r6ysDMHBwXBycoKKigpu3ryJ0NBQqKur8x3tjXR0dHD06FG8ePECPj4+KC8v5zsS7xhj7/xqzOJVdXU1/P39kZycjJiYGIVnPGyvevfuLZ2hcP78+RCLxdIZCp88ecJ3PEIIIXKg4hUhpMXgOA7Kysro2bMn31EIIaTJxMbGYuDAgdiwYQN++OEHxMbGwsbGhu9YcunRoweio6ORmJiIsWPHIi8vj+9I7UZJSQm8vb3x66+/4tdff4W9vT3fkVodY2NjBAcH49GjRwgJCcHBgwdhYWEBoVCIO3fu8B2PEELIW1DxihDSYnAch549e0JVVZXvKIQQ0uhevnyJgIAAjBw5EhYWFkhNTYVIJGp1g207OTkhPj4ez549w5AhQ5CcnMx3pDbv3r17GDFiBBITE3H+/Hl89NFHfEdq1XR1dSESicBxHCIjI5GcnAw7Ozu4u7sjPj6e73iEEELq0breLRFC2jSJREKPDBJC2qSYmBjY2toiOjoaO3fuxLFjx9CjRw++YzVY3759kZiYCHNzcwwZMgT+/v7UC6sJFBcXIzAwELa2thAIBLh69SqGDh3Kd6w2Q01NDUKhEKmpqThy5AhevHiB4cOHw8XFBTExMWCM8R2REELI/6HiFSGkxeA4jmYaJIS0KTk5OZg6dSo8PT0xZswYpKWlQSgU8h2rUXTq1Alnz57Fnj17cOLECVhaWuLLL7/EjRs3+I7W6qWnp+Pbb7+FpaUltm/fjg0bNiApKQlmZmZ8R2uTlJSUpL2uYmNjYWBgAE9PT+kMhTS+GyGE8E+F7wCEEFKL4ziMHj2a7xiEEPLeGGOIjIzEV199hU6dOuH06dMYN24c37EanUAgwCeffAIPDw9s3rwZ4eHh2LhxI7p06YKBAweiR48e0NPT4ztmq1BcXIzs7GzcuHEDDx8+RJcuXeDn54cvv/wSHTt25Dteu+Hi4gIXFxfcvn0b69evx1dffYXQ0FAEBARg8eLF0NfX5zsiIYS0SwJG/WFJO+Xn54dHjx7h9OnTfEchAKqqqqClpYWoqCj4+vryHYc0Mnq9kfbk3r17CAgIQGxsLBYsWIC1a9dCW1ub71jNgjGG69ev49y5c0hJSUFubi6Kior4jtVkXr16hefPnzdKr2EdHR107twZ9vb2GD16NJydnaGsrNwIKcn7ePjwIX7++Wds27YNjDHMmjULgYGB6Nq1K9/RCCGkPTlFPa8IIS3Co0ePUFlZSWNeEUJarcrKSvzzn//EypUr0bdvXyQkJGDQoEF8x2pWAoEAjo6OcHR05DtKs7h79y5sbW0RGBiIadOm8R2HNAFTU1OEhobi66+/xo4dO7Bu3TqEh4fj448/xvLly2FlZcV3REIIaRdozCtCSIvAcRwAUPGKENIqxcfHY8CAAVi1ahVWrVqF5OTkdle4ao/69u2LqVOnYtWqVaipqeE7DmlCHTp0gEgkgkQiQUREBP7zn//AxsYG7u7uSExM5DseIYS0eVS8IoS0CBzHQVdXF506deI7CiGEyK20tBRBQUH44IMP0KlTJ6SkpCAwMJAe92pHVqxYgbt37yI6OprvKKQZqKurQygU4s6dOzhy5Ajy8vIwdOhQmqGQEEKaGBWvCCEtgkQigYWFBd8xCCFEbr///jv69u2LiIgIbN26FRcuXIClpSXfsUgz69evH7y8vLB69WoqXLQjtTMUJiYmysxQ2L9/f0RFRaGqqorviIQQ0qZQ8YoQ0iJwHEePDBJCWoVnz55BKBTCzc0NQ4YMQUZGBvz9/SEQCPiORniyYsUKpKSk4NixY3xHITyo7XV148YNODg4YO7cubC0tIRYLMarV6/4jkcIIW0CFa8IIS0CFa8IIa3BgQMHYGtri/Pnz+Pw4cPYv38/jIyM+I5FeObg4AAPDw8EBwdT76t2zMHBAVFRUcjMzISHhwe+/vprmJmZITg4GPn5+XzHI4SQVo2KV4SQFoHjuEaZapwQQpoCx3FwdXWFr68vvL29cffuXXh5efEdi7Qg33//PW7duoW9e/fyHYXwzNzcHGKxGFlZWVi4cCE2b96M7t27QygU4t69e3zHI4SQVomKV4QQ3hUVFaGgoIB6XhFCWpyqqiqIxWLY29vj2bNniI+PR3h4OHR1dfmORlqYvn37QigUYvny5aioqOA7DmkBjIyMEBwcjIcPH2LdunW4dOkSrK2t4e7ujqSkJL7jEUJIq0LFK0II7x48eAAAVLwihLQoKSkpGDp0KIKCgrB06VIkJydjyJAhfMciLVhISAieP3+OzZs38x2FtCDa2toQiUSQSCQ4cuQIcnNzMXjwYOlYWYQQQt6NileEEN5xHAclJSWYmpryHYUQQlBWVoagoCA4OjpCQ0MD169fR3BwMNTU1PiORlq4rl27YvHixfjuu+9QUFDAdxzSwtTOUJiUlCSdodDDwwMDBgygGQoJIeQdqHhFCOEdx3Ho3r071NXV+Y5CCGnnLl26hP79+2Pbtm348ccfcenSJfTt25fvWKQVCQoKgpqaGkJDQ/mOQlqw2l5X169fh52dHebMmQMrKyuIxWKUlZXxHY8QQlocKl4RQngnkUjokUFCCK8KCwsREBCA0aNHo0+fPkhNTYVIJIKSEr1VIorR1dXF8uXL8dNPP0kfiyfkTWp7XWVmZsLNzQ3Lli2DqakpgoODqfceIYT8Bb0jI4TwjuM4Kl4RQnhz4MABWFtb4+jRo9i/fz9iYmLQvXt3vmORVuzzzz+HlZUVFi5cyHcU0kr06tVLOkPhggULsGnTJpiamkIkEuHx48d8xyOEEN5R8YoQwjuO42Bubs53DEJIO5OdnQ1vb2/4+PhgwoQJSEtLw9SpU/mORdoAFRUVbN68GadPn8ahQ4f4jkNakc6dOyM4OBiPHj3CmjVrcPjwYVhYWEAoFCItLY3veIQQwhsqXhFCeFVdXY1Hjx5RzytCSLOpqalBREQErK2tcfv2bZw9exZRUVEwNDTkOxppQ1xcXCAUCiESiVBSUsJ3HNLK6OjoQCQS4f79+9i+fTuuXbsGOzs7uLq60gyFhJB2iYpXhBBePX78GH/++ScVrwghzSI1NRXDhw/HokWLsGDBAty+fRtjxozhOxZpo3788UeUl5dj9erVfEchrZSamhqEQiFSU1MRHR2NsrIyeHh4wNHREVFRUaiuruY7IiGENAsqXhFCeMVxHABQ8YoQ0qQqKyuxbt06DBo0CBUVFUhMTERoaCg0NDT4jkbasI4dOyIkJAQbNmxASkoK33FIKyYQCODu7o4rV64gOTkZ/fr1k5mhsLy8nO+IhBDSpKh4RQjhFcdx0NHRQefOnfmOQghpo+Li4uDg4IDVq1dj1apVSEpKwsCBA/mORdoJf39/ODo64vPPP6deMqRR1Pa6Sk9Px6RJkxAUFAQzMzMEBwejsLCQ73iEENIkqHhFCOGVRCKhXleEkCZRVFQEkUiEDz74AGZmZrhz5w4CAwOhrKzMdzTSjigpKWHHjh24efMm1q1bx3cc0ob07t1bOkPh/PnzIRaLpTMUPnnyhO94hBDSqKh4RQjhFcdxVLwihDS6mJgY2NnZYc+ePfj5559x/PhxmJqa8h2LtFN9+/bF6tWrERwcjOTkZL7jkDbG2NhYOkNhSEgIDh48KJ2h8O7du3zHI4SQRkHFK0IIr6h4RQhpTLm5uRAKhfDw8ICzszMyMjLg7+/PdyxCsGTJEgwbNgyfffYZjU9EmoSuri5EIhE4jkNkZCSSkpJga2sLd3d3xMfH8x2PEELeCxWvCCG84jgO5ubmfMcghLRyjDFERUXB1tYWV65cwalTp7B//3506tSJ72iEAPjf44OPHz/GypUr+Y5D2rDaGQrT0tJw5MgR5OfnY/jw4XBxcUFMTAwYY3xHJIQQhVHxihDCm+LiYuTn51PPK0LIe3nw4AFcXV0xd+5czJgxA7du3cL48eP5jkVIHebm5vjnP/+JsLAwXLlyhe84pI1TUlKCu7s7EhISEBsbCwMDA3h6esLe3h4RERGoqKjgOyIhhMiNileEEN5wHAcAVLwihDRIVVUV1q1bB1tbW+Tl5SE+Ph5isRg6Ojp8RyPkjfz8/PDRRx9h+vTpyM/P5ztOi7V06VJ6LTei2l5XKSkpGDBgABYtWiSdobCoqIjveIQQ8k5UvCKE8IbjOAgEApiZmfEdhRDSyty4cQPOzs5YtWoVAgMDkZSUBCcnJ75jESKXqKgoqKqqwsfHB9XV1XzHUUhYWBgEAgEEAgG6d+/+zuWkZbGzs0NUVBTu3buHjz/+GGFhYejZsydEIhGys7P5jkcIIW9ExStCCG84jkO3bt2goaHBdxRCSCtRWlqKoKAgODk5QVtbGzdu3EBwcDDU1NT4jkaI3AwMDHDo0CEkJCS0uvGvli5dCsYYHBwc5FpOWiZTU1OIxWI8ffoUq1evxoEDB9CrVy8IhUJkZGTwHY8QQuqg4hUhhDcSiYQeGSSEyO3EiROwsbFBeHg4tm7diosXL8LKyorvWIQ0iIODAzZt2oS1a9fi8OHDfMch7ZSenh5EIhEkEgkiIiJw9epV2NjYwN3dHVevXuU73jvp6OjAxcWF7xiEkGZAxStCCG84jqPiFSHknQoLCxEQEICPPvoIdnZ2SE1Nhb+/PwQCAd/RCHkvfn5+mDNnDubMmYMHDx7wHYe0Y+rq6hAKhbh79y6OHDmC58+fw9nZmWYoJIS0GFS8IoTwhuM4mJub8x2DENKCHThwAFZWVoiJicHBgwcRExODbt268R2LkEazefNm9OrVC1OmTEFxcTHfcUg7VztD4dWrV2VmKBwwYACioqJQVVXFd0RCSDtFxStCCC9qamqQlZVFPa8IIfWSSCSYOHEifHx8MHnyZKSnp8Pb25vvWIQ0Og0NDRw8eBDPnz/HlClTUFlZqfA+vLy8pIOlCwQCmceozp07B4FAgJiYGOmyxYsXy6xfVVWFqqoq7Nu3D66urjAxMYGmpibs7OwgFotRU1PT4Pbt2bNH5lgCgQC5ubkN3t+bpKenw8vLC3p6etDS0sLgwYNx7NgxjBs3TnpcPz8/6fovXrzAkiVLYGFhATU1NRgYGODDDz/EhQsXGj1ba1Xb6+rGjRuwt7fH3LlzYWlpCbFYjNLS0iY7bkVFBVasWAFra2toaWnB0NAQ7u7uOHr0qHSCg9oJAl69eoW4uDjpNVZRUZHZlzzX+fXJBpKSkjB27Fjo6upCS0sLo0ePRlxcXJO1lxAiJ0ZIOzV37lzm6urKd4x269GjRwwAu3LlCt9RSDOg1xuRV3V1NQsPD2c6OjrM0tKSXbhwge9IhDSLW7duMX19ffbJJ5+wmpoahbffsmULA8B++eUXmeWzZs1iAJiPj4/M8sOHD7OxY8dKv4+JiWEA2Nq1a1lBQQHLy8tjmzZtYkpKSmzp0qV1jufg4MC6dev2zuVVVVVsyZIlzNXVlRUUFMjdnr///e9MW1tbrnXv3bvH9PX1Wbdu3djp06dZcXExS01NZePGjWNGRkZMXV1dZv2cnBxmbm7OjI2NWUxMDCsqKmIZGRnM29ubCQQCFhkZKXfO9oTjOPbFF18wLS0t1qlTJ7Zy5UqWn5/f6Mfx8/Njenp67PTp06y0tJTl5uaypUuXMgB1fidoa2uz4cOH17sfRa+zg4MD09bWZkOHDmXx8fGspKSEJSUlMXt7e6ampsYuXrzY6G0lhMjtJBWvSLtFH6b5dfHiRQaAZWdn8x2FNAN6vRF5pKSksMGDBzNVVVUWGBjIysvL+Y5ESLM6f/48U1dXZ8uWLVN42xcvXjA1NTU2ceJE6bLS0lJmYGDAevfuzTQ1Ndkff/wh/dnkyZPZrl27pN/HxMSwUaNG1dnvzJkzmaqqKisqKpJZLk/xqrCwkE2YMIGJRCJWVVWlUHsUKV5NmzaNAWC//fabzPLnz58zLS2tOsWr2oLe3r17ZZaXl5ezrl27Mk1NTZabm6tQ3vbk+fPnbOXKlaxjx45MW1ub+fv7s8zMzEbbv7m5ORs2bFid5X369FGoeKXodXZwcGAA2I0bN2TWv3XrFgPAHBwcGtgiQkgjOEmPDRJCeMFxHDQ1NWFiYsJ3FEIIz8rLyxEcHAwnJyeoqKjg5s2bCA0Nhbq6Ot/RCGlWo0ePxo4dOxAaGopNmzYptK2hoSE++ugjnDlzRvpYXnR0NIYMGYKFCxeirKwMhw4dAgAUFBTg4sWLMo/iurm51fvInIODAyorK5GWlqZQnoyMDAwZMgRKSkrYuHEjlJWVFdpeESdPngQATJgwQWa5kZERrK2t66xfO7vjpEmTZJarq6tj7NixKCsrw6lTp5oobetnZGSE4OBgZGVl4bvvvsPJkydhbW0Nd3d3JCUlvff+J06ciPj4ePj7+yMxMVH6qGBGRgZGjRol934acp21tbXRv39/mWV2dnbo2rUrUlJSkJOT04AWEUIaAxWvCCG8kEgk6NWrF80WRkg7FxsbiwEDBiAsLAyrV6/G5cuXYWNjw3csQnjzySef4LvvvsOSJUtw4MABhbYVCoWorq7Gv//9bwDA7t27IRQK8cknn0BZWRm//PILAGDv3r1wc3ODjo6OdNuioiKsWLECdnZ2MDAwkI4B9NVXXwGAQmMcFRYWwsvLC927d8eJEyewZ88ehdqhiIqKChQXF0NDQ0OmPbUMDAzqrF9UVAQNDQ3o6urWWd/Y2BgAmmRcrrZGR0cHIpEI9+/fx6+//orc3FwMHjxYOlZWQ23ZsgVRUVHgOA5jx45Fhw4dMHHiRGkxSh4Nvc76+vr17q9z584AgOfPn8udgRDSuKh4RQjhBcdxNFg7Ie3Yy5cvIRKJMGrUKFhYWODOnTsIDAxs0t4ZhLQWy5Ytw6JFizB9+nTs3btX7u0mTZoEQ0ND7N69G3l5eUhMTISXlxeMjY0xfvx4nD9/Hjk5Odi1axeEQqHMtu7u7ggJCcG8efOQmZmJmpoaMMawYcMGAABjTO4cKioqOHv2LKKjo2FnZ4d58+Y1So+c+qirq0NXVxfl5eUoKSmp8/PXiw3q6urQ09NDeXl5vbM7Pnv2DACoZ7gCVFVVMW3aNCQlJUlnKPTw8MDAgQMRFRUl7TklL4FAgE8//RRnz57Fy5cvceTIETDG4O3tjX/+85911q1PQ6/zixcv6r3Xa++j2iIWIaT5UfGKEMILKl4R0n7FxMTA1tYW+/btw44dO3Ds2DH07NmT71iEtCgbN25EUFAQPv30U+zYsUOubdTU1ODj44ObN29i+fLl8PT0hKamJgDg008/RXV1NVauXImcnByMGTNGul11dTXi4uJgYmKCL774AkZGRtKiQFlZmcLZdXV10a1bN+jo6ODo0aPQ0dGBl5dXkz1y9eGHHwL43+ODtXJzc5GZmVln/cmTJwMAfv/9d5nlFRUVOHfuHDQ1Nes8gkjkU9vr6tq1a7C1tcWcOXPQp08fiMViue8lfX19pKenA/hvYczV1RVHjhyBQCCoc820tLTw559/Sr+3srJCREQEgIZd5/Ly8jqF1tu3byM7OxsODg7o0qWLXG0ghDQ+Kl4RQnjBcRzMzc35jkEIaUY5OTmYOnUqPD09MWbMGKSlpdXp/UEI+Z+QkBB88803mDt3LjZv3izXNp9++ikAIDIyUub15eXlBV1dXURGRmLGjBlQUvrfxwBlZWWMGjUKubm5WL9+PfLz81FWVoYLFy5g27Zt79UGMzMz/Pbbb8jLy4O3tzcqKirea3/1Wbt2LQwNDbF48WKcOXMGJSUlSE1NxezZs+vtQfX999/D3NwcixcvxrFjx1BcXIzMzExMnz4dOTk5EIvF0sfKSMPU9rrKyMiAm5sbli1bBjMzMwQHB6OgoOCd28+fPx+3bt1CRUUFnj9/jh9++AGMMZmia+1xMjMz8fjxYyQkJIDjOIwYMQJAw66znp4evv76ayQkJODVq1dITk7GzJkzoaamBrFY3HgniBCiOF7HiyeERzT7GX9KSkqYQCBgR48e5TsKaSb0emvfampqWHh4OOvQoQPr1asXO3PmDN+RCGlVQkNDmUAgYBs2bJBrfUtLS9azZ09WU1Mjs7x29rW0tLQ62+Tl5bGAgADWo0cPpqqqyoyNjdmsWbNYUFAQA8AAMEdHR7Z+/Xrp97Vfy5cvZ3v37q2zfMOGDSwhIaHO8hkzZryzDYrMNsgYYxkZGczLy4t16NCBaWlpsWHDhrFLly6xUaNGMS0trTrr5+fns8WLFzNzc3OmqqrK9PT02IQJE9i5c+fkPiaR37Nnz9jKlSuZgYEB09HRYV988QV79OhRvevevHmTBQQEsL59+zItLS1maGjInJ2dWWRkZJ17Oj09nY0YMYJpa2uzHj16sC1btsj8XJHrXDtT5p07d9iECROYrq4u09TUZCNHjmRXrlxpvJNBCGmIkwLGFHiAnZA2xM/PD48ePcLp06f5jtLu3L59G/b29khNTUW/fv34jkOaAb3e2q/79+/D398fsbGxWLBgAdauXQttbW2+YxHS6vzwww8ICgrCypUrsWLFijY/4cnSpUuxbdu2esexUoS1tTXKysrw8OHDRkpG3kdxcTH+9a9/ISwsDM+ePYOvry8CAwNbxPvB/v37Iz8/H0+ePOE7CiGkrlP02CAhpNlxHAeBQECPDRLShlVWVmLdunWwtbVFYWEhEhISIBaLqXBFSAP94x//wLZt2/Ddd9/Bx8dHodn/2rrc3FwYGhqisrJSZnlWVhYePHhQ51Ezwh9dXV2IRCI8ePAA27dvx7Vr12BnZwd3d3ecPXuW73iEkBaMileEkGbHcRxMTEygpaXFdxRCSBNISEjAgAEDsGrVKqxatQrJyckYNGgQ37EIafX8/f1x/vx5XLp0CcOGDaPeRH9RWFiIgIAAPH78GKWlpfjPf/4DHx8fdOjQAd9++y3f8chr1NTUIBQKkZqaiujoaBQWFsLV1RWDBg1q0AyFhJC2j4pXhJBmJ5FIaKZBQtqg0tJSBAUFYcSIEejUqRNu3ryJwMBAKCsr8x2NkDbDxcUFCQkJqK6uxqBBg3D58mW+I/HOxMQEZ8+excuXL/HBBx/AwMAAHh4esLS0xH/+8x96z9GCCQQCuLu748qVK4iNjUWvXr0we/ZsWFtbQywWo7y8vMkzhIWFQSAQICUlBU+fPoVAIMA333zT5MclhCiGxrwi7RaNwcMfNzc3GBoaIioqiu8opJnQ663tO378OD7//HMUFxcjNDQU8+bNa/Nj8hDCp+LiYkyfPh1nzpzBli1bMHfuXL4jEdIo7t+/j59++gkRERHQ09PD/PnzsXjxYujr6/MdjRDCHxrzihDS/DiOo7+CEtJGPHv2DEKhEJMmTcKQIUOQnp4Of39/KlwR0sR0dXURHR2NJUuWwN/fH56ennj27BnfsQh5b71794ZYLIZEIsH8+fMhFovRs2dPiEQiPH36lO94hBCeUPGKENKsGGPIysqiwdoJaQMOHDgAW1tbnDt3DocPH8b+/fvRuXNnvmMR0m4oKSlh7dq1iI2Nxd27d2FtbY3du3fzHYuQRmFiYoLg4GA8fPgQISEhOHjwIHr16gWhUIi7d+/yHY8Q0syoeEUIaVbZ2dkoKyujnleEtGIcx2H8+PHw9fWFt7c30tPT4eXlxXcsQtqtYcOG4fr16/Dx8cFnn30GX19fZGdn8x2LkEbRoUMHiEQicByHyMhIJCUlwdbWFu7u7khISOA7HiGkmVDxihDSrDiOAwAqXhHSClVVVUEsFsPe3h65ubmIi4tDeHg4dHV1+Y5GSLuno6ODbdu24cSJE0hMTISVlRVCQkJQWlrKdzRCGkXtDIVpaWk4cuQI8vPzMWzYMLi4uCAmJgY0lDMhbRsVrwghzYrjOGhoaKBLly58RyGEKCAlJQXDhg3DV199hUWLFiE5ORnOzs58xyKEvGbChAnIzMzEmjVrEBYWhj59+iAiIgI1NTV8RyOkUSgpKUl7XcXGxsLAwACenp5wcHBAVFQUKisr+Y5ICGkCVLwihDQriUQCc3NzKCnRfz+EtAZlZWUIDg6Gk5MT1NTUkJKSgtDQUKipqfEdjRDyBmpqahCJRMjMzMRHH32EBQsWYOjQoTh16hTf0QhpVLW9rm7evIn+/ftj7ty56NmzJ4KDg1FUVMR3PEJII6JPj4SQZkUzDRLSely+fBn9+/fHxo0bsX79ely+fBl9+/blOxYhRE7GxsaIiIjA9evX0bFjR0ycOBGDBg3C4cOHqScWaVPs7e0RFRWF+/fv4+OPP0ZYWJh0hkIa/42QtoGKV4SQZkXFK0JavpcvXyIgIACjRo1Cnz59kJqaCpFIRD0mCWml7O3tcfz4caSkpMDGxgbTpk2DlZUVIiIiUFVVxXc8QhqNqakpxGIxnj59itWrV+PAgQPSGQozMjL4jkcIeQ/0LpQQ0qw4joO5uTnfMQghb3DgwAHqnS4JAAAgAElEQVRYWVnh6NGj2LdvH2JiYtC9e3e+YxFCGkFt75Rbt27B2dkZCxcuhJWVFcLCwlBQUMB3PEIajZ6eHkQiESQSCSIiInD16lXY2NjA3d0dV69e5TseIaQBqHhFCGk2ZWVlyM3NpZ5XhLRA2dnZ8Pb2ho+PDyZMmIC0tDRMmzaN71iEkCZgY2OD3bt3IyMjA5MmTcKaNWvQvXt3zJkzB0lJSXzHI6TRqKurQygU4u7duzhy5AieP38OZ2dnmqGQkFaIileEkGbDcRwYY1S8IqQFYYwhIiIC1tbWuHXrFs6ePYuoqCgYGhryHY0Q0sR69eqFTZs24cmTJ9iwYQOuXbuGwYMHY/Dgwdi5cyfKysr4jkhIo6idofDq1asyMxQOGDAAUVFR9PgsIa0AFa8IIc2G4zgAoMcGCWkhUlNTMWzYMCxcuBALFixAamoqxowZw3csQkgz09HRQUBAAFJSUpCcnIwBAwZgwYIFMDExgVAoRExMDKqrq/mOSUijqO11df36ddjb22Pu3LmwtLSEWCxGaWkp3/EIIW9AxStCSLORSCQwNjaGjo4O31EIadcqKyuxbt06DBo0CBUVFbh69SpCQ0OhoaHBdzRCCM8cHR0RHh6OrKwsrF69GmlpafDw8ICFhQW++eYbGvSatBn9+/dHVFQUMjMz4eHhga+//hqmpqYIDg7Gixcv+I5HCHkNFa8IIc1GIpHQI4OE8CwuLg4ODg5YvXo1Vq1ahaSkJAwcOJDvWISQFqZz584QiUS4du0aUlNT4evri127dsHa2hrOzs7YsGEDHj16xHdMQt6bubk5xGIxsrKysHDhQvz0008wNTVFQEAA7t27x3c8Qsj/oeIVIaTZcBxHxStCeFJUVASRSIQPPvgAZmZmuHPnDgIDA6GsrMx3NEJIC9evXz+Ehobi4cOHOHPmDKytrbF69WqYmZlh8ODBWLduHe7fv893TELei5GREYKDg/Hw4UN89913OHnyJKytreHu7o7k5GS+4xHS7lHxihDSbKh4RQg/jh07Bjs7O+zZswc///wzjh8/DlNTU75jEUJaGSUlJYwbNw47d+7Es2fPcPz4cTg4OCAsLAyWlpbo378/QkJCkJaWxndUQhpMR0cHIpEI9+/fx44dO5CVlQUnJyfpWFmEEH5Q8YoQ0iwYY5BIJDRYOyHNKDc3F0KhEO7u7nB2dkZ6ejr8/f35jkUIaQPU1NQwceJEREZGIjc3F7GxsRg5ciS2bdsGW1tbmJubIyAgAAcOHEBJSQnfcQlRmKqqKoRCIW7fvi2dodDDwwMDBw5EVFQUTWJASDOj4hUhpFk8e/YMr169op5XhDQDxhiioqJga2uLK1eu4NSpU9i/fz+MjIz4jkYIaYOUlZXh4uICsViMx48fIyEhATNmzEBSUhJ8fHxgbGwMd3d3bNu2jcbJIq1Sba+ra9euwdbWFnPmzEGfPn0gFotRVlbGdzxC2gUqXhFCmgXHcQBAPa8IaWIPHjyAq6srZs+ejSlTpuDWrVsYP34837EIIe2EkpISnJ2dsWbNGly/fh1PnjyBWCyGqqoqvvrqK5iamsLOzg5ffvklfv/9d+qVRVqV2l5XGRkZcHNzw7Jly2BmZobg4GAUFBTwHY+QNo2KV4SQZsFxHNTU1NCtWze+oxDSJlVVVUEsFsPBwQF5eXlISEhAeHg4dHR0+I5GCGnHunbtCj8/Pxw6dAj5+fk4ffo0xo8fjwsXLsDd3R2GhoYYMWIEVq1ahStXrqCyspLvyIS8k4WFhXSGws8//xybNm2CqakpRCIRHj9+zHc8QtokKl4RQpoFx3EwMzOjmc0IaQI3btyAs7Mzli1bhqVLlyIpKQmDBw/mOxYhhMhQV1eHq6srfvzxR9y8eRO5ubmIioqClZUVduzYgREjRsDQ0BBubm4ICwvD1atXUVVVxXdsQt6oc+fO0hkK16xZg0OHDqF3794QCoU0cQEhjYyKV4SQZiGRSGi8K0IaWWlpKYKCguDk5AQtLS1cv34dwcHBUFNT4zsaIYS8U+fOneHr64vt27cjKysL9+7dw/r166GlpYWwsDA4OztDX18frq6uWL16NS5dukTjC5EWSVdXFyKRCA8ePEBkZCSuXbsGOzs7uLu7Iy4uju94hLQJVLwihDQLjuOoeEVIIzp58iT69euH8PBwbN26FZcuXYK1tTXfsQghpMF69+6N+fPnY//+/cjNzcXdu3exYcMGdOnSBf/6178watQo6Ovrw8XFBcuWLUNMTAzy8vL4jk2IlJqamnSGwujoaBQUFMDFxQWDBg2iGQoJeU8qfAcghLQPHMfB3d2d7xiEtHqFhYUICgpCREQE3NzcsG3bNhpLjhDSJllbW8Pa2hrz5s0DADx69AiXL19GbGwsjh49inXr1oExht69e8PZ2RnOzs4YOnQo7O3toaJCH3Oayh9//IGkpCSkpaWhoKAA5eXlfEdqsUaMGAFzc3MkJibis88+Q2hoKDw8PPiORUiTEggE0NfXh5mZGQYMGIA+ffo0yn7pf3VCSJOrqKhAdnY29bwi5D0dOHAACxcuhIqKCn777TdMmTKF70iEENJsevbsiZkzZ2LmzJkAgJcvXyIxMVH6tXz5chQVFUFLSwuDBg2Cs7MzBg0ahIEDB8LCwoLn9K1bZWUlDh06hO3bt+PSpUuorKxE586dYWRkBA0NDb7jtXj6+vqwsbFBTU0Nzp49y3ccQpoUYwwFBQV4+vQpKisrYW5uDl9fXwQEBMDU1LTB+6XiFSGkyUkkEtTU1FDxipAGysrKwvz583H69GnMmzcP69evR4cOHfiORQghvNLX18fEiRMxceJEAEBNTQ3S09ORmJiI+Ph4HD9+HD/++COqq6uhr6+PAQMGYODAgdKvPn36QEmJRlF5l1OnTmHx4sW4d+8e3NzcsHPnTowZMwYmJiZ8RyOEtGB//vknkpOTcezYMezatQs//vgjRCIRvv32W+jq6iq8PypeEUKaHMdxAEDFK0IUVFNTg+3bt+Pvf/87unTpgnPnzmH06NF8xyKEkBZJSUkJNjY2sLGxwZw5cwD8t8dQZmYmrl27hmvXriExMRFbtmxBeXk5dHR0YGVlBRsbGzg6OsLR0RFOTk5QV1fnuSUtQ15eHvz8/HD06FFMmTIFx48fh7m5Od+xCCGthJqaGoYNG4Zhw4Zh9erViIiIwIoVK7Bnzx5s3rwZ3t7eCu2PileEkCbHcRw6depEPUUIUcDt27fh5+eHGzduYMmSJVi1ahV9oCKEEAWpqqqiX79+6NevH4RCIQCgqqoKGRkZ0oLWtWvXcPDgQZSWlkJVVRWWlpbSYlbtl6amJs8taV5paWlwd3eHkpISzp07hzFjxvAdiRDSiqmoqGDBggXw9fVFUFAQpk6dilWrVuGbb76BQCCQbx9NnJEQQiCRSKjXFSFyKi8vR2hoKL7//nsMGjQIN27cQL9+/fiORQghbYaKikq9Ba07d+7g+vXr0q/Dhw+jpKQEqqqqsLW1hb29vXQ7GxsbmJmZ8duQJnLu3Dl4e3vDwcEBhw4dQqdOnfiORAhpIwwNDREREQFHR0csWrQImZmZ2LlzJ5SVld+5LRWvCCFNjuM4Kl4RIofY2Fj4+/vj8ePHWL16NZYuXSrXL3NCCCHvR0VFBfb29rC3t8esWbMA/PfR7czMTGkx6/bt2zh79iyePn0KANDV1UXfvn1ha2sLGxsb6b89evTgpQ1//PEHNDU1oaqq2uB93L59G5MnT8akSZOwc+dO6vFLCGkSAQEB6NWrFzw9PWFgYIBNmza9cxsaoZAQ0uSoeEXI2xUVFUEkEmHUqFGwsLDAnTt3EBgYSIUrQgjhkZKSEqytrTF9+nSEhYXh1KlTePLkCV6+fInk5GRs3rwZo0ePxvPnz7F161Z8+OGH6NmzJ/T09DBo0CAIhUKsW7cOMTEx4DgOjLEmzXv8+HH07t0b/+///T9UVlYqvH1+fj4mT56M/v37t4jCVVhYGAQCAQQCAbp37/7O5a3Jnj17pG0QCATQ0dHhO1Kb8euvv0rPa1ufCbMltjUoKEjm3nZ2dn7juq6urti9eze2bNmCLVu2vHPfVLwihDQ5iURCA3wS8gYxMTGwtbXFvn37sGPHDhw7dgw9e/bkOxYhhJA30NPTg6OjI4RCIUJDQxETE4MHDx4gPz8fly5dwrp16+Ds7IwnT57gxx9/hIeHBywsLNCxY0eMGDEC8+fPx08//YQzZ87g4cOHqKmpaZRcEokET548gb+/PywsLLBjxw5UVVXJvf3MmTOhpKSEw4cP8164AoClS5eCMQYHBwe5lr9NSUkJLC0t4ebm1tgx38vPP/8MxhhKSkr4jtJm+Pr6gjGGsWPH8h2lyb2trXzd86GhoWCMgTEm1x9hp0yZgpCQECxevBg3b95867r02CAhpEk9f/4cxcXF1POKkNfk5OTgb3/7Gw4ePIhp06Zh69atNK4IIYS0YoaGhvjggw/wwQcfyCwvLCxEWloa7ty5I/03Ojoaubm5AP47I1f37t3Rq1cv2NjYoF+/fujVqxd69eoFc3NzuQcz5jgOSkpKqKqqwpMnT+Dn54dvv/0WK1aswJw5c6Ci8uaPfkeOHMHp06dx6dIldOzYseEnoYVijKGmpqbRCoXk/ejo6KB///64cuUK31HarNZ0zy9btgwnT57EokWLEBsb+8b/86h4RQhpUhzHAQAVrwj5P4wx7N69G19++SX09fVx5swZjBs3ju9YhBBCmoiBgQFcXFzg4uIis7ywsBAcx0m/0tLSEBcXhx07dqC4uBgAoK6uDgsLC5mCVq9evWBrawsTExOZ/WVmZkp7WtX2fMjOzsbnn3+OkJAQfPvtt/UWsSoqKvCPf/wD06dPx4gRI5rwTPBHV1cXDx484DsGIc2mNd3zAoEAGzduhJOTE/bt2wdfX99616PiFSGkSXEcB1VVVd4GLyWkJbl//z78/f0RGxuLBQsWYO3atdDW1uY7FiGEEB4YGBjA0dERjo6OdX725MkTZGZm4t69e9KvI0eOQCKR4M8//wQAGBkZwdLSElZWVrC0tMSdO3fq7Ke2iPX06VPMnz9fWsSaO3eu9JGePXv24NGjRzh//nzTNpgQQt5g4MCBmDlzJtasWfPG4hWNeUUIaVIcx8HU1JQGnibtWmVlJdatWwdbW1sUFBQgISEBYrGYCleEEELq1b17d4wZMwYBAQEICwtDdHQ00tPTUVpaivv37+PEiRP49ttvMWDAADx9+hQRERF48eLFG/f3155Y8+fPh5WVFaKiolBdXY3t27dj6tSpcg1+7uXlJTMY8197k507dw4CgQAxMTHSZYsXL5ZZv6qqClVVVdi3bx9cXV1hYmICTU1N2NnZQSwWv9cjTq8Pgi4QCJCbm4sjR47ILCsvLweAOsuzsrLg4+MDfX19dOzYEW5ubvX2XElPT4eXlxf09PSgpaWFwYMH49ixYxg3bpx0X35+fg1uh6Ln58WLF1iyZAksLCygrq6O7t27Y9y4cdi5cyfKysoavG5eXh6++OILmJmZQU1NDUZGRvD29pYZl+j1wfOTkpIwduxY6OrqQktLC6NHj0ZcXFyd9V+9eoW4uDjptq/3BpTn2LX+ej20tbUxYsSIRnkcUdG2KZK9Me69t7W1td3ztUQiEdLS0hAfH1//CoyQdmru3LnM1dWV7xht3pw5c9j48eP5jkF41p5fb/Hx8axfv35MU1OThYaGsqqqKr4jEUIIaWMePHjAAMj9JRAIGABmYWHBBAIBO3r0qNzH2rJlCwPAfvnlF5nls2bNYgCYj4+PzPLDhw+zsWPHSr+PiYlhANjatWtZQUEBy8vLY5s2bWJKSkps6dKldY7n4ODAunXr9s7lVVVVbMmSJczV1ZUVFBTUWd/T05MBYGVlZfUu9/T0ZPHx8aykpISdOXOGaWpqMicnJ5l17927x/T19Vm3bt3Y6dOnWXFxMUtNTWXjxo1jRkZGTF1d/S1n7n92797NALCff/65zs8UOT85OTnM3NycmZiYsJiYGPbHH3+w3NxcFhISwgCwDRs2NGjd7OxsZmpqyoyNjdnvv/8ubefIkSOZhoYGi4+Pl8nh4ODAtLW12dChQ6XnMCkpidnb2zM1NTV28eJFmfW1tbXZ8OHD6z03ihy7vutx69YtNn78eGZmZib39XgbRdqm6Hl733vvXW3l+55XVlZmQ4YMkftcM8aYpaUlCwwMrO9HJ6l4Rdqt9vxhujmNGjWKzZ8/n+8YhGft8fX26tUrFhgYyJSVldnIkSNZRkYG35EIIYS0UWfPnpW7aKWuri793sDAgAkEAnbw4EG5j/XixQumpqbGJk6cKF1WWlrKDAwMWO/evZmmpib7448/pD+bPHky27Vrl/T7mJgYNmrUqDr7nTlzJlNVVWVFRUUyy+UpXhUWFrIJEyYwkUj0xj8SveuDfExMjMzyqVOnMgAsLy9PumzatGkMAPvtt99k1n3+/DnT0tJqtOKVvOentmC4b9++OutPnDhRpiClyLqfffZZvQXKnJwcpq6uzhwdHWWWOzg4MADsxo0bMstv3brFADAHBweZ5W8rXily7Dddj6dPnzJ1dfVGK17J2zZFz1tj3Htvayvf93xDileff/75m+6Nk/TYICGkSXEcB3Nzc75jENKsjh8/jr59+yIiIgJbt27FhQsX0KdPH75jEUIIaaMePHhQ72yCampqUFL670e+2sd9AgICsH//fuTk5GDx4sXo3bs3vL295T6WoaEhPvroI5w5c0Y6Y2J0dDSGDBmChQsXoqysDIcOHQIAFBQU4OLFizL7d3Nzw4ULF+rs18HBAZWVlUhLS1Oo7RkZGRgyZAiUlJSwcePGBg9V4eTkJPN97Xit2dnZ0mUnT54EAEyYMEFmXSMjI1hbWzfouK9T5PwcPnwYAPDhhx/WWf/EiRNYvHhxg9Y9cuQIlJSU4ObmJrOeiYkJ+vXrh2vXruHJkycyP9PW1kb//v1lltnZ2aFr165ISUlBTk7OG9v8V4oc+03Xo2vXro36vkvetjXkvAHvd++9T1tbyj3/V/b29m/8P4CKV4SQJvPnn3/i6dOnNNMgaTeePXsGoVCISZMmYciQIUhPT4e/v7/c05wTQgghDZGVlYXq6mpp4UZTUxNDhw7F3/72N/z73/8Gx3F49eoVEhMTIRaLMW3aNJiYmCAvL6/OrIXyEAqFqK6uxr///W8AwO7duyEUCvHJJ59AWVkZv/zyCwBg7969cHNzg46OjnTboqIirFixAnZ2djAwMJCOmfPVV18BAEpLS+XOUVhYCC8vL3Tv3h0nTpzAnj17FG5LLT09PZnv1dTUAEA6zlRFRQWKi4uhoaEh055aBgYGDT72X8l7fioqKlBUVAQNDQ3o6uq+dZ8NWbempgZ6enp1xhG7fv06AODevXsy2+nr69e7v86dOwMAnj9//s62K3Lsd12P2uM2Bnna1tDzBrz/vdfQtraUe/6vjI2N8fLlS+nEFH9FxStCSJOpfSNFxSvSHhw4cAC2trY4d+4cDh06hP379zfqG6c3+fXXX6VvjDQ0NJr8ePV5fVDT9/H6gLv1vVlqSm8a5LQluXr1Ktzd3dG1a1d06NABw4YNg1gsRkFBQYP3uX//fggEAqirqzdi0raD7/siKChI5vjOzs7NenzS8mloaGD+/PmIjIzE7du3UVxcjPj4eISFhcHHx+eNveDLy8uhqamp8PEmTZoEQ0ND7N69G3l5eUhMTISXlxeMjY0xfvx4nD9/Hjk5Odi1axeEQqHMtu7u7ggJCcG8efOQmZmJmpoaMMawYcMGAP8dXF5eKioqOHv2LKKjo2FnZ4d58+YhKSlJ4fbIQ11dHbq6uigvL0dJSUmdn8tTnJGHvOdHXV0denp6KC8vR3Fx8TuzK7Kuvr4+VFRUUFlZKR3s//Wv0aNHy2z34sWLeq9d7Xn563uiN/1RT5Fjv+t6vM/vxNfJ07aGnjd5NGdbFTluY93zf6WlpQUAdSYQAKh4RQhpQhzHAQAVr0ibxnEcxo8fD19fX3h7eyM9PR2TJ09utuP7+vqCMYaxY8c2aPuSkhJYWlrW6eKuiKVLl4IxBgcHhwbv43U///wzGGMyb5YaI+u7eHl5gTEGT0/PJjvG+4iLi4OLiwtqamoQFxeHnJwciEQiBAYG4h//+EeD92tkZCTz7181x3lv6fi+L0JDQ6UffGj2XlKfFStWYOvWrZg9ezZsbW2b/D5RU1ODj48Pbt68ieXLl8PT01NaBPv0009RXV2NlStXIicnB2PGjJFuV11djbi4OJiYmOCLL76AkZGRtJBR34fVd9HV1UW3bt2go6ODo0ePQkdHB15eXnI/oqao2kfuah+lqpWbm4vMzMz33r+i56f2/cbx48fr/GzAgAH48ssvG7Sut7c3qqqq6p1Nb926dejZsyeqqqpklpeXl9cpHN6+fRvZ2dlwcHBAly5dpMu1tLRketZYWVkhIiJC4WO/6Xrk5+cjIyOjzvYNJW/bGnLe5NVcbZX3uI11zyuCileEkCbDcRwMDQ3f2NWWkNasqqoKYrEYDg4OyMnJQVxcHMLDw9/ZHb+lYYyhpqbmvaYnby6tKevb6OjoyEwvr4jt27ejqqoKGzduhLm5ObS1teHj44O5c+e+V6a3Fa+a87y/z7lp7dpz20nr9OmnnwIAIiMjZXpXeXl5QVdXF5GRkZgxY4Z0zC0AUFZWxqhRo5Cbm4v169cjPz8fZWVluHDhArZt2/ZeeczMzPDbb78hLy8P3t7eqKioeK/91Wft2rUwNDTE4sWLcebMGZSUlCA1NRWzZ89u0OOXr1P0/Hz//fcwNzfHl19+id9//x3FxcV48uQJFixYgJycHJmClKLrWlhYYM6cOThx4gSKiopQUFCA8PBwrF69GmFhYXXGWNPT08PXX3+NhIQEvHr1CsnJyZg5cybU1NQgFotl1h04cCAyMzPx+PFjJCQkgOM4jBgxQuFj13c97ty5g5kzZ76x5/bMmTMhEAggkUjkvi7ytq0h501eDWlrY2jqe14hCg39Tkgb0h5nP2tuS5cuZYMGDeI7BmkB2trr7ebNm8zJyYmpqqqywMBAVlFRwXckNnbs2EaZVed9vGlGKEW8bQam5vSmGXoaw9tmWXqX2pmMLl++3KiZcnNzGQDeX6fvc26aQ0u4LxoyexMhb+Ln58fGjx/f4O0tLS1Zz549WU1Njczy2pnt0tLS6myTl5fHAgICWI8ePZiqqiozNjZms2bNYkFBQdJZEB0dHdn69evrzJa4fPlytnfv3jrLN2zYwBISEuosnzFjBjt8+HC9y+tbf/ny5YwxVmf5pEmTpPkzMjKYl5cX69ChA9PS0mLDhg1jly5dYqNGjWJaWlpynbe3/a6T9/zUys/PZ4sXL2bm5uZMVVWVdenShfn6+rLMzMw6+1Zk3RcvXrAlS5awXr16MVVVVWZkZMTGjx/Pzpw5U2fd2t//d+7cYRMmTGC6urpMU1OTjRw5kl25cqXO+unp6WzEiBFMW1ub9ejRg23ZsqXBx/7r9dDU1GROTk7s2LFjbOzYsdLzNXfuXOn6Y8aMYTo6Om+clfJ92yZP9sa4997W1pZyzzfk99XJkycZAPby5cs6P6LiFWm32tqH6ZbI29ubffzxx3zHIC1AW3m9lZaWspUrVzJVVVU2fPhwdufOHb4jSVHxqnG1hCJFfaKjo6VTcxcXFzdapqqqKiYQCNj06dMbbZ8NQcUrKl6R5vW+xSvyP1ZWVqxnz55yrdtSftc1lsb4/d8cCgsLmaamJvPz85N7m9bSNj68655v7OIVPTZICGkyEomExrsibcbly5cxYMAAbNy4EevXr8fly5fRt2/fZs+Rnp4OLy8v6OnpQVtbGyNGjMCVK1fqrPf6ANMZGRn4+OOP0bFjR+my7du31zsI9evbZmVlwcfHB/r6+ujYsSPc3Nzw4MGDd2Z9ffB1gUAgnVZdUW8bMLuiogIrVqyAtbU1tLS0YGhoCHd3dxw9ehTV1dUNOl6t3Nxcudr+4sULLFmyBBYWFlBTU4OBgQE+/PBDmenOawe2f/XqFeLi4qRtUeQRAgsLC3To0AEpKSnw8PBotIHDlZWVYWBgUOexweY67/KeG3nOc0PWVVRLuy8IIc0jNzcXhoaGqKyslFmelZWFBw8eyIzvRVoWxhi++OILdOjQASEhIXzHaTVa1D2vcHmNkDairfQEacn09fVZeHg43zFIC9CaX2+FhYXM39+fCQQC5ubmxh49esRblnv37jF9fX3WrVs3dvr0aVZcXMxu3brFxo8fz8zMzOrteVXbU2TkyJHswoUL7NWrVywxMZEpKyuzvLw8mXVe701Su9zT05PFx8ezkpISdubMGWlX9de9/tfJqqoqtmTJEubq6soKCgrkauO7/hpdX1Y/Pz+mp6fHTp8+zUpLS1lubi5bunQpA8AuXLgg13HfdJy/tv3cuXOsQ4cOddqek5PDzM3NmbGxMYuJiWFFRUUsIyODeXt7M4FAwCIjI2XWb2jvovPnzzMtLS22ceNGaT43NzdWWVkpXWfSpEky3f6nTJki9/6trKzYmjVr6v1Zc533t50bRc6zotdEXi3hvqCeV6QxUc8rxeTk5DAAbPbs2ezRo0fs1atX7OrVq2zw4MHM0NCQPXjwQK791P6uq/3S1tZu4uRNqzX0TsrJyWHDhw9nqampCm3XGtrWlBS95wMDA2XubXpskJBG0Jo/TLcG+fn5DEC9z6aT9qe1vt6OHj3KunXrxkxMTNiuXbv4jsOmTZvGALDffvtNZvnTp0+Zurr6W4tXx48ff+N+31W8iomJkVk+depUBkBa/Kr11zd4hYWFbMKECUwkEsk9rgRjDStemZubs2HDhtVZt0+fPu9dvHq97dOnT6/T9tqxXfbu3Suzbnl5OevatSvT1NRkuZBBa9oAACAASURBVLm50uUNKV7l5eUxPT09NmHCBOm+x4wZwwAwX19fVl1dLV2X4zimqamp0HlnjLHhw4fzft7fdm4UOc+KXhN5tYT7gopXpDFR8UpxZ8+eZZMnT2ZmZmZMTU2NGRsbsxkzZrD79+/zHa3ZvWlcsragLbdNUc15z9Njg4SQZsdxHADQY4OkVcrOzoa3tzc8PT0xZswYpKamysykxJfaaYonTJggs7xr167o06fPW7cdPHhwg4/r5OQk832PHj0A/Pc81ScjIwNDhgyBkpISNm7c2ORTtk+cOBHx8fHw9/dHYmKi9JG1jIwMjBo16r32/Xrbu3XrBkC27YcPHwYATJo0SWZddXV1jB07FmVlZTh16tR75dixYweKioowY8YM6b6jo6MxePBg/Prrr5g/f7503YsXL8LFxUXh866ioqLQo2pNed7ro8h5bupr0lLuC0JI8xs7diwOHToEiUSCiooK5ObmYs+ePbCwsOA7WrNbunQpGGMyX2vWrOE7VqNoy21TVEu556l4RQhpEhzHQUVFRfohl5DWgDGGiIgIWFtb49atWzhz5gyioqLQsWNHvqOhoqLi/7N372FNXWn/8L+BQIAAARQVER8SrGBi1ap4ArSVoLVCRVpaf1VsZypBbS0Mjy20dsYeFa0nOqUO6jOt1R7G2mpFqwUcqWdHbVERQWFj8QBaC8SAEA5Z7x++ZAwBJEDYAe7PdXGZ7Ozsda+1N0Ju9roXNBoN7Ozsml0SuV+/fq2+XywWt7ttiURi8NzW1hYAoNPpjPYtLy9HeHg4Bg0ahP3792P79u3tbretUlJS8MUXX4DjOAQHB8PZ2RlPPvmkPnnQEU373rjke2PftVot1Go17Ozs4OTkZPT+/v37A0C7a301unz5ssHxAMDR0RH79+/H8OHDsXnzZvzv//4vGhoakJycjAULFnSovbYw57g3Zco4d8U5sZTrghBCCOktKHlFCDELjuPg5eUFGxsbvkMhpE1ycnIwadIkvPLKK1i8eDFycnIQHBzMd1h6IpEITk5OqKmpQWVlpdHrZWVlPERlTCgUIjMzEz/88AMeffRRREdH4/Tp02ZtUyAQICoqCpmZmaioqMDu3bvBGENERATWrVtn1rZFIhEkEglqamqg0WiMXr916xYAYMCAAQbxmqoxgXrp0iWD7W5ubkhPT4dMJsO6deswceJEiMViREZGmtxGVlaWSUkvc4x7S2Njyji355x0tq66LgghpCN+++03PP3007h7965+W2BgoNFiK41fcXFx7WonMTER//rXvzorbN40N15NffPNN/rxsrOz68LoWtcTzgElrwghZkErDZLuoq6uDqtWrcLYsWOh1Wpx6tQpJCUlWdQvHI1mzJgB4L/TBxvduXMH+fn5fIRkxMnJCZ6ennB0dMSePXvg6OiI8PBwlJSUmK1NFxcX5OXlAQBsbGwQEhKiXyVv3759Zmu30ezZswHAqC2tVouDBw/C3t7eYKqng4MDamtr9c99fX2xadOmNrWxfv16lJeXG7zm4eGBzMxMuLi44PTp01AqlV2SCDHHuLc2NqaMs6nnxBy64roghLRdZWUlHnnkEYSGhvIdikXIzs7G2LFjMW3aNDg7O5u1rejoaLz55pv461//atZ2zKmt4zVnzhwwxizqD6BAzzgHlLwihJgFx3GUvCIW79ixYxg1ahTee+89vPvuuzh9+jRGjx7Nd1gtWrFiBdzc3BAXF4eMjAxUVlYiNzcX8+bNa3YqId+8vb2xc+dO/P7774iIiIBWqzVbWwsXLsT58+eh1Wpx+/ZtrF69GoyxLlnCeeXKlZBKpYiLi8PevXuh0Whw+fJlvPDCCygpKUFycrLBdL/Ro0fj8uXLuHbtGk6cOAGO4xAUFNRqG+PHj0diYiJ+++03BAYG4scff0RVVRXu3buHY8eO4Y033oBYLIarqyvef/99bN261aQ+nD17Fn379kVgYGCz00Fb0tnj3trYmDLOpp4Tc+iK64IQYsjR0RGBgYHNvsYYg06nM+n/uO6qtXEAgLt37yIsLAzPPPMMXn31VaPXT58+bVTviTGGDRs2tCseHx8f7Nq1Cx9++CF27NjRrmPw6WHj1R1093MAALTaIOm1uuvqZ92FVCplK1as4DsMYiEs7ftNrVaz1157jVlZWbEZM2awq1ev8h1Sm+Xn57Pw8HDm7OzM7O3tmb+/P9u7dy8LDg7Wr4bz8ssvsxMnThitktP0x/6uXbuMXp87d26z721cYafp9pkzZ7Kvv/7aaPv69eubPc7cuXNb7V9Lqw22FCtjjGVnZ7OYmBg2bNgw5uDgwNzc3NiECRPY5s2bmU6nM2l8Te17ozt37rC4uDgmlUqZjY2NfmXAgwcPGrWRl5fHgoKCmFgsZl5eXiwlJaXN8e3du5c99dRTrG/fvkwoFDIXFxcWEBDA1q5dyzQaDTt+/DhzcHAwiLOuru6hxz19+rR+3B5cubCrxr3Rw8bGlHE2Zd+HsaTrglYbJJ2pp6022J7VXHuih43DsmXLmFAoZDdu3DB6LSAggJ0+fdoscUVGRrJBgwa16edSe4waNYolJSWx3377rVOP29p4tSQ4OLjZVaD5Zu5z0FGtrTYoYIyxzkuFEdJ9LFiwAMXFxUhPT+c7lB6nvr4e9vb22L59O55//nm+wyEWwJK+3/bu3YvFixejsrISSUlJUKlUfIdEHrB9+3ZERUVh48aNBivoEULuEwqFGDt2LE6ePMl3KKQHiI6ORnFxcY9Z+dLR0RGjRo3C0aNH+Q6FV62NA2MMHh4eGDJkSLOvBwYGYsOGDRg7dmynx/X111/jhRdewO7duzFr1qxOP/5TTz2F9PR06HQ6TJ48GXPnzkVkZCRcXFzafcyHjVdLlEoljh49ipqamna3bQ7mPgcd9dNPP+HJJ59ERUVF08VRfqJpg4SQTvfbb7+hvr6epg0Si1JaWor58+cjLCwMEyZMQH5+PiWuCCGEkB5gzZo1EAgEqKqqwrFjx/QFs4VCIQDo6/E1fjUmFJpu/+233/D888/DyckJffr0QVRUFMrLy3H16lWEhYXByckJHh4eiI6ObnYxht9//x2vvfYavL29YWtrC3d3d0RERCA7O9to3z/++APx8fHw8fGBra0tXF1dMWPGDBw6dEi/zwcffKCP7cFpgAcOHNBv79u3b5vHAQDOnTuHW7duYeTIkS2O57Zt2zBq1CiIxWJIJBIEBQXhq6++MtpPq9Xib3/7G/z8/ODg4AA3NzeEhYVhz549aGhoMNp/1KhRAGC2ZOmPP/6I69evY82aNbh79y5UKhUGDBiAiIgIfP/99+0qX/Cw8crLy0N4eDgkEgnEYjGCgoJaTXK15bybwsXFpcUC+1ZWVrh+/brB/uY+B+ZEyStCSKfjOA4AKHlFLAJjDF988QWGDx+Oo0eP4sCBA9ixYwfc3d35Do20YtGiRRAIBBZZy4uQrpaYmKj/MNLcB0JCerulS5eCMQaxWIyAgAB9jab6+noAQHh4OBhjRneaNN0eHx+PN954A6WlpdiwYQO2b9+OuXPnIi4uDu+//z5KSkrwzjvvYMuWLVi+fLnBsUpKSuDv748dO3bg008/RVlZGbKyslBWVoaJEyfixIkT+n1LS0vh7++Pr776CsnJybhz5w5OnToFBwcHBAcHY8uWLQCAt99+W9+vBz355JNgjGHMmDEmjQNwf3VlABg0aFCL41leXo5//vOfuH37Nv7zn/9AKpVi7ty5eO211wz2e/XVV/Hxxx/j73//O/744w9cunQJfn5+mDVrFo4cOWJ0XE9PT4MYzGHAgAGIj4/HL7/8gtzcXMTHx+Ps2bN45plnMGDAAERHRyMrKwttnYDW2ngVFBRg4sSJOHPmDHbu3Ilbt27h008/xfvvv4/CwkKj/dt63k2l0WgMapO99957AIAPP/zQKO6uOAdmY/ZJi4RYKEurwdOT/OMf/2ASiYTvMIgF4ev7raCggCmVSmZlZcVUKhXTaDRdHgOxDGim/lfTr+XLl/MdZo9j6eNu6fERYm69rebVrFmzGABWXV3d7PZ9+/YZbFcoFAwA+/nnnw22S6VS5uvra7DtxRdfZADYl19+abC9pKSEiUQiNmbMGP22l156iQFgX3/9tcG+NTU1bODAgcze3p6VlpY+tF9jxoxhffr0Mdre2jisXr2aATCp3iJjjI0bN44BYCdPntRvk0qlbNKkSUb7Dh06lB06dKjZ4wgEAjZkyBCT2u4onU7HsrKy2IIFC5iLiwsDwEaMGNGm97Y2XpGRkQwA27lzp8H2GzduMJFIZFTzytTz3hYSicTg99t//etfTCAQsJdeeqnF9/BxDtqqtZpXdOcVIaTTFRUV0V1XhFf19fVITk7GyJEjcfv2bZw4cQKpqal0F08vxppZNanp1zvvvMN3mD2OpY+7pcdHSG+Vk5NjNAWqK1Z5a1rnaeDAgc1u9/T0xM2bNw227d69G1ZWVggNDTXYPmDAACgUCpw9e1Y/hWvXrl0AgJkzZxrsKxKJEBwcjOrqarNN62qcMmljY2PS+5599lkAQFpamn7bk08+iePHj0OlUuHkyZP6O0Pz8/Px+OOPN3scoVCI6urqdkTe/utCIBDAzs4OdnZ2Jve7tfE6cOAAAGD69OkG2wcOHIihQ4ca7W+O815RUaH//fbUqVN48cUXMXnyZKSmprb4no6cAz4JH74LIYSYhuM4Sl4R3mRnZ2PBggW4ePEiEhIS8NZbb8HW1pbvsAghhBCLIxaLce/ePb7DMDJ8+PA2T+vqTM7OzgbPraysYG1tDQcHB4Pt1tbW0Ol0+udarRZqtRoAmhaZNnDlyhW4u7tDrVbDzs4OTk5ORvv0798fwP0pZuZgZ2cHAKirqzPpfR4eHgCA27dv67elpKRg4sSJ2Lp1K4KDgwEAQUFBiImJwezZs5s9TuPCTu1h6nVx+fJlfPnll/jyyy9RWFgIFxcXPPPMM5g7d26LybWmWhovrVYLjUYDOzu7Zv842q9fP1y+fNlgf3Oe9+LiYsyaNQteXl74/vvvW/3dtyPnwNwqKyshEAiMpsoCVPOKEGIGlLwifLh37x4SExMxduxYODg44Ndff8U777xDiStCCCGkBe7u7igpKeE7jE4jEAh4aVckEsHFxQVCoRB1dXUt3sn5xBNPQCQSQSKRoKamptmi77du3QJw/46tRlZWVqitrTXat6Kiotl4WhuHxiRUY7KtrRrvNOvXr59BO1FRUcjMzERFRQV2794NxhgiIiKwbt06o2PcvXtXv3qfudy6dQsff/wxxo0bB19fXyQlJeHRRx/Fzp07UVpaii1btuCJJ55o87XS0niJRCI4OTmhpqYGlZWVRu8rKysz2t/U895WGo0GoaGhqKurw969e+Hm5tbivl1xDjri1q1bcHNzM1hkoBElrwghnY7jOEilUr7DIL1IVlYWRo0ahdTUVKxduxZZWVnw8/PjOyxCCCHEog0fPhxFRUW4e/cu36F0CgcHB4Mkj6+vLzZt2tQlbUdERKC+vh7Hjh0zem3VqlUYPHiwvnB6411J+/btM9hPq9Xi4MGDsLe3N5iK5uHhgRs3bhjsW1paiuLi4mZjaW0chg8fDgBGq9ABwJYtW4yKwAP3p1jv2LEDABAWFqbf7uLigry8PAD3p9WFhIToV3Bs2jcA+j40xtDZZs6cCU9PT8TFxcHe3h6pqakoLS3Frl278Mwzz0AkEpl8zNbGa8aMGQD+O32w0Z07d5Cfn2+0v6nnvS0aGhowZ84c5OXl4bvvvjOYrvjss89i9+7dBvub+xx0VHZ2NhQKRbOvUfKKENKpKioqUF5eTndekS5RXl6OmJgYTJ06Fb6+vsjJyUFsbCysrOjHGyGEEPIwQUFBEAgEyMzM5DuUTjF69GhcvnwZ165dw4kTJ8BxHIKCgrqk7ZUrV8LHxwd//vOfsX//fqjVapSVlSE1NRXvvfce1qxZo7+bZOXKlZBKpYiLi8PevXuh0Whw+fJlvPDCCygpKUFycrJ+GhkATJs2DTdv3sQnn3yCyspKFBYWIjY21uAuqLaOw8iRI9GvXz+cO3eu2ff+8ssveOWVV1BQUICamhrk5+cjKioKZ8+exZIlSzB+/HiD/RcuXIjz589Dq9Xi9u3bWL16NRhjmDp1qtGxs7Oz9f0xh5s3b+KDDz7A1atX8fPPP0OlUsHV1bVDx2xtvFasWAE3NzfExcUhIyMDlZWVyM3Nxbx585qdSmjqeW+Lv/zlL/jxxx+xadOmNk2FNPc56KiMjAxMmTKl+Rc7szI8Id0JrTZoHmfOnGEA2OXLl/kOhVgQc3y/7dixg7m7uzMPDw+jVV4IIYQQ0jaTJ09mzz77LN9hdIq8vDwWFBTExGIx8/Ly0q8Qt2vXLqOVROfOnctOnDhhtH3ZsmXs9OnTRttXrlzJjhw50uqKpH/88QeLj49nMpmM2djYMHd3dzZt2jSWkZFhFOudO3dYXFwck0qlzMbGhkkkEjZ9+nR28OBBo30rKirYggULmIeHB7O3t2eBgYHs9OnTbMyYMfo4EhISHjoOjd566y0mFArZjRs3DLbX1NSwb7/9ls2ePZv5+PgwkUjEJBIJe/zxx9lXX31lFFd2djaLiYlhw4YNYw4ODszNzY1NmDCBbd68mel0OqP9IyMjmaenJ6utrW39RFqYlsaLMcby8/NZeHg4c3Z2Zvb29szf35/t3buXBQcH68/Nyy+/rN/flPP+MI2fu1r72rVrl8F7LPkcHDt2jAFgp0+fbu7lAwLGeKiER4gFWLBgAYqLi5Gens53KD3Kt99+izlz5uDevXvtujWX9Eyd+f129epVLFy4EOnp6YiOjsZHH31kVGCVEEIIIW2zfft2/PnPf0ZeXh7dOd9LqNVqKBQKhIaG4h//+EeXtHnu3Dk89thj+OqrrzBnzpwuabOz8DFe5mDp5+C5555DQUEBfvnll+Ze/onmVRBCOhXHcfDy8qLEFel0Op0OmzZtwogRI1BYWIiDBw8iNTWVEleEEEJIB8yZMwd+fn5YunQp36GQLiKRSJCWloadO3ciJSXF7O1xHIeIiAi8+eabFpk0eZiuHi9zsPRzcOzYMezcuRPvvvtui/tQ8ooQ0qmKioror3ak0124cAGTJk3Cq6++isWLFyMnJwdPPPEE32ERQggh3Z5QKMT69euxa9cu/PTTT3yHQ7rIY489hjNnzmD//v1mL9ifmpqKDz/8EB9++KFZ2zGnrhwvc7Dkc6DT6RAXFwelUmmwIEBTxusPEkJIB3AcR8kr0mlqamqQlJSElStXYsyYMfj1119bXIGEEEIIIe0THByM2bNnIzo6GqdOnYKHhwffIZEu4O3tjb1795q9nVWrVpm9ja7QVeMlEAgeus/y5cvxzjvvtPmYlnwO3nrrLVy4cEFfTL4llLwihHQqjuNaXiGCEBMcPXoU0dHRKC4uxnvvvYelS5fC2tqa77AIIYSQHunzzz/HpEmTEBoaisOHD0MsFvMdEiG9Um8qS/75559j9erV2Lp1K/z8/Frdl6YNEkI6TUNDA4qLi+nOK9IharUasbGxmDJlCmQyGS5duoSEhARKXBFCCCFm5OzsjN27d+O3337D888/j6qqKr5DIoT0YN999x1iYmLw1ltvISoq6qH7U/KKENJpiouLUVdXR8kr0m5paWkYPnw4/vWvf+Gzzz7Dvn37MHjwYL7DIoQQQnqFIUOGYN++ffjPf/6DoKAgXL9+ne+QCCE9UFJSEp577jmoVCq8//77bXoPJa8IIZ2G4zgAoOQVMVlJSQkiIyPx9NNPY+LEicjJycH8+fP5DosQQgjpsXQ6XbPJqfHjx+PUqVOora3F+PHj8d133/EQHSGkJ7px4wYiIyPx9ttvIzk5GX//+9/bVOMLoJpXhJBOxHEcHB0d4e7uzncopJtgjGHbtm34y1/+AhcXF6SnpyMkJITvsAghhJAeo7a2FleuXEFubi44jsPFixeRm5uLvLw86HQ6VFZWwsrK8J4GqVSKY8eOITY2FpGRkXjiiSewbt06jBw5kqdeEEK6s6qqKiQnJ2PFihUYMGAADhw4AKVSadIxKHlFCOk0RUVF8PHx4TsM0k0UFBQgJiYGhw8fxuLFi7FixQoqDksIIYS0U2lpKS5duoT8/HxcunQJeXl5yM/PR3FxMRhjsLGxgUwmw7Bhw6BUKvHqq69i2LBhLR5PIpHg888/x6JFi7BkyRKMGjUKkydPRmRkJIKDgzF06FCqR0kIadGdO3dw6tQppKWl4ZtvvkFDQwOWLVuG+Ph4iEQik49HyStCSKfhOI6mDJKHqqurw7p167B8+XL4+fnh+PHj8Pf35zssQgghxOLV19ejuLjY4A4qjuNw4cIF3Lp1C8D9pNOQIUMgk8nw0ksvQaFQQCaTQS6Xw97e3uQ2x48fj5MnTyIzMxP/93//h2XLlmHJkiUQiURwc3Nr1zEJIT2XTqdDeXk51Go1BAIBRo8ejbfffhsvvfQS+vbt2+7jUvKKENJpOI7D5MmT+Q6DWLBffvkF0dHRuHTpEhITE7Fs2TLY2NjwHRYhhBBiUdRqNQoKCoySVLm5uaiurgYAuLq6Qi6XQ6FQQKlU6h9LpdI215BpKysrK0ybNg3Tpk1DXV0dLly4gNzcXJSVlenjIYQQABAIBHBxcYG3tzdGjRqFfv36dcpxKXlFCOk0HMfhxRdf5DsMYoHq6+tx5coVjBs3DgEBAcjOzsbQoUP5DosQQgjhVXl5uT459WCSqqioSD/Vz8vLC3K5HEqlEiqVCnK5HCNHjoSTkxMvMdvY2GD06NEYPXo0L+0TQnonSl4RQjqFRqPBH3/8QdMGiZEff/wR3333HWpqavDpp58iOjq60/8iTAghhFiquro6XLt2zSA5dfHiRZw/fx4ajQbA/buoGqf2KZVK/WM/Pz+qK0UIIaDkFSGkkxQWFgIAJa+I3u3bt7F06VJs27YNUqkUgwcPhkql4jssQgghxCzKy8uNpvldvHgR+fn5aGhoAAB4eHhAoVBAoVAgMjJS/9jDw4Pn6AkhxLJR8ooQ0ik4joOVlRX+53/+h+9QiAX49ttvsXjxYtja2uL777/Hvn37UFxczHdYhBBCSIfdvHnTIDnVOOWvpKQEACASieDj4wOFQoGwsDAkJCRAoVBg2LBhcHBw4Dl6Qgjpnih5RQjpFBzHwdPTE3Z2dnyHQnhUVFSEhQsXIiMjA9HR0VizZg2cnJywb98+vkMjhBBC2kyr1aKgoMAoSXXp0iXcu3cPQMsF0729vWFlZcVzDwghpGeh5BUhpFMUFRVBKpXyHQbhSX19PVJSUvD222/D29sbx48fx4QJE/gOixBCCGnVgwXTH0xSXb16FTqdTl8wXSaTISAgQF8wfcSIEXB2duY7fEII6TUoeUUI6RQcx1G9q17q/PnzWLBgAbKzsxEfH493330XIpGI77AIIYQQAP8tmN50mt+FCxdw9+5dAICLiwt8fHwgk8kQFRUFhUIBmUwGhUJBd5UTQogFoOQVIaRTcByHiRMn8h0G6ULV1dVYtWoVVq5cCX9/f5w7dw7Dhg3jOyxCCCG9VEVFBQoLC5stml5TUwOg+YLpMpkMUqmUVsIlhBALRskrQkiH6XQ6/Pbbb3TnVS9y+PBhqFQqlJaWYvXq1ViyZAnV9yCEENIlmiuYznEcioqKwBiDra0tBg0aBLlcDqVSqZ/qN2rUKDg6OvIdPiGEkHag5BUhpMOuX78OrVZLyateoKKiAgkJCdi8eTNmzpyJjIwMeHl58R0WIYSQHqa2thbXr183mOaXm5uL/Px8VFZWArhfMF0mk+mTVI2P/fz8YG1tzXMPCCGEdCZKXhFCOozjOACg5FUPl5aWhkWLFqGhoQGff/455s+fz3dIhBBCurny8vJmp/nl5+ejoaEBQqEQgwcPNiiYLpPJMHz4cAwYMIDv8AkhhHQRSl4RQjqM4zg4ODigf//+fIdCzODmzZtYsmQJdu3ahXnz5mH9+vXo06cP32ERQgjpJurr61FcXGyUpMrJyUFpaSkAQCQSwcfHBwqFAmFhYUhISIBCocCwYcPg4ODAcw8IIYTwjZJXhJAOKyoqgkwmo0KnPQxjDJs3b8brr78Od3d3ZGRkIDg4mO+wCCGEWCitVouCggKjelS5ubmorq4GcH+qn1wuh0KhgFKp1D/29vam2omEEEJaRMkrQkiHcRxHUwZ7mCtXrkClUuHo0aNYvHgxVqxYAbFYzHdYhBBCLEB5ebnRNL/c3Fx9wXQbGxt4eXkZFUwfMWIEnJ2d+Q6fEEJIN0TJK0JIh3EchwkTJvAdBukEdXV1WLduHZYvXw65XI6TJ09izJgxfIdFCCGki9XV1eHatWtGSaoLFy7g7t27AAAXFxf4+PhAJpMhKioKCoUCcrkcvr6+EArpYwYhhJDOQz9VCCEdxnEc/t//+398h0E66Pjx44iOjsbVq1fx7rvvYunSpbRaEyGE9HAVFRUoLCw0uIPq4sWLuHz5Murr6wEAHh4eUCgUUCgUiIyMhEKhgEwmo7uuCSGEdBlKXhFCOqSyshK3b9+mX2C7sbt37+Kvf/0rPvnkE0ybNg379u2Dt7c332ERQgjpRDdv3jSa5sdxnH7FYFtbWwwZMkRfML2xFpWfnx9NGyeEEMI7Sl4RQjqk8ZdeSl51T/v27cOiRYtQWVmJjRs3QqVS8R0SIYSQdqqtrcWVK1eMklR5eXmoqqoCcL9gukwm09ejanw8bNgwKphOCCHEYlHyihDSIRzHQSAQ0J063cytW7fw+uuvY9u2bYiMjERKSgrc3d35DosQQkgblJeXG03zy83NxdWrV6HT6SAUCjF48GDIZDIEBARApVJBJpPh0UcfRf/+/fkOnxBCCDEZJa8IIR3CcRw8PDzg4ODAdyikDRhj2LZtG+Lj4+Hk5IQDfewIXwAAIABJREFUBw5g+vTpfIdFCCGkifr6ehQXFxtN87tw4QJu3boFAJBIJBgyZIhBwfTGO6ns7e157gEhhBDSeSh5RQjpkKKiIpoy2E1wHIeYmBj8+9//xoIFC7B27Vo4OjryHRYhhPRqarUaBQUFRkmq3NxcVFdXA7g/1a+xBpVSqdQ/lkqlEAgEPPeAEEIIMT9KXhFCOoTjOEpeWbj6+nqkpKRg2bJlkMlkOHHiBMaNG8d3WIQQ0quUl5cbJKcaHxcVFYExBhsbG3h5eelrUalUKsjlcowcORJOTk58h08IIYTwipJXhJAO4TgO/v7+fIdBWpCdnY3o6Gjk5OQgISEBb731FmxtbfkOixBCeqS6ujpcu3bNKEl1/vx5aDQaAIYF0xtrUcnlcvj5+cHa2prnHhBCCCGWiZJXhJB2Y4zh6tWrdOeVBaqursa7776LNWvWYNKkSfj111/h5+fHd1iEENIjNC2Y3vg4Pz8fDQ0NAAAPDw8oFAooFApERkbq61HRz0xCCCHEdLQeLiGk3W7cuIGamhr6RdzC/Pzzzxg5ciRSU1Oxdu1aZGVlUeKKEELa4ebNm8jMzMSmTZsQGxuLkJAQDBw4EG5ubhg7diyio6ORlpYGAAgLC8M///lPnDlzBlVVVbh58yYyMjKQmpqK2NhY3LlzBz4+PhAIBLCzs+OlP2vWrIFAIIBAIMCgQYM6dKzt27frjyUQCLq8huLu3bsN2q+pqenS9tvi1KlTCAsLw8CBA+Hs7IxJkyYhOTkZZWVl7T7mjh07IBAIIBKJOjHSnoPv6yIxMdGg/QkTJnRp+4T0ZJS8IoS0G8dxAEDJKwtRXl6OmJgYPPHEE/D19cWFCxcQGxsLKyv6r54QQlqi1Wpx8eJFfPvtt1i1ahXmz5+PsWPHQiwWw9PTEyEhIUhMTMTZs2chk8kQGxuLPXv2oLCwENXV1bh48SJ27NiBpKQkzJ8/H2PGjGl2Bd45c+aAMYbg4OB2xVlZWYlHHnkEoaGh7e7r0qVLwRjDyJEj232MpjZu3AjGGCorK/XbOiPWhwkPDwdjDLNmzTJbGx1x7NgxBAYGQqfT4dixYygpKUFsbCwSEhLwxhtvtPu47u7uBv8+qCvG3dLxfV0kJSWBMQbGGE0DJqST0bRBQki7cRwHOzs7eHh48B1Kr/ftt9/ilVdegVAoxLfffotnnnmG75AIIcSitFQw/erVq9DpdBAKhRg8eDBkMhkCAgL09ahGjBiBfv368R0+GGPQ6XTQ6XR8h/JQ3SnW1jg6OmLUqFE4evSoye/dsmUL6uvrsWHDBkilUgDA888/j8OHD0Or1bY7ptaSV1057h0Zm+6uN/edED5R8ooQ0m5FRUWQyWS0TDePbty4gVdffRU//PAD5s2bhw0bNsDNzY3vsAghhBeNBdOb1qM6f/48bt++DQCQSCQYMmQIZDIZoqKi9LWoFAoFb9P52sLJyQmFhYV8h9Em3SlWc2GMAQBKS0vxyCOP6LenpKR06LitJa9o3AkhPRklrwgh7cZxHE0Z5IlOp8OWLVuwdOlS9O/fHwcPHsQTTzzBd1iEENIl1Go1CgoKmi2a3ljjprFgukwmQ2hoqP6xVCqlP7oQs4uIiMDWrVuxZMkSHD16tNNqgvXt2xcCgaDZ5BUhhPRkVAiFENJulLzix4ULFzBp0iS8+uqrWLx4MXJycihxRQjpkZormO7j4wNXV1eMHTsW8+bNw7Zt21BdXQ2lUonk5GQcOXIEGo3GqGC6Uqns0ruF8/LyEB4eDolEArFYjKCgoGanGTUtMJ2fn4/nnnsOffr00W/bsmVLs0Wom7736tWreP755+Hi4oI+ffogNDS0TXfiNC2+LhAIUFpa2q5+t1YwW6vV4m9/+xv8/Pzg4OAANzc3hIWFYc+ePfpVGturtLS0TX3/448/EB8fDx8fH9ja2sLV1RUzZszAoUOH9Ps0FravqqrCsWPH9H0RCtv+d38fHx84Ozvj3LlzePrppzutcLi1tTVcXV2NklddNe5tHZu2jHN79jWVpV0XhJAOYIT0Ui+//DILCQnhO4xubcCAAWz9+vV8h9FrVFdXs+XLlzNbW1s2ceJElpOTw3dIbUbfb4SQlmi1WlZYWMj27NnDkpKSmEqlYgEBAczR0ZEBYACYq6srGzNmDIuKimJJSUlsx44dLCcnh9XX1/MdfrOuXLnCXFxcmKenJ0tPT2cajYadP3+eTZs2jXl7ezORSGT0nlmzZjEAbMqUKezQoUOsqqqKnTx5kllbW7Pff//dYJ/q6upm3ztr1ix2/PhxVllZyTIyMpi9vT3z9/c3amvkyJHM09NT/7y+vp7Fx8ezkJAQVlZW1qY+btu2jQFgGzdubPb15mJdsGABk0gkLD09nd27d4+VlpaypUuXMgDs0KFDbWq3pXYe7PvBgweZs7OzUd9LSkqYVCpl/fv3Z2lpaUytVrP8/HwWERHBBAIB27x5s8H+YrGYBQQEmBzTv//9b+bg4MA2bNigjy80NJTV1dXp95k5c6b++gbAnnnmmTYf39fXl33wwQfNvtZV497a2Jgyzqaek7ayhOvC2tqajR8/vl3xE0KMHKDkFem16MN0x1RVVTGBQMB++OEHvkPpFY4cOcKGDRvGHBwcWFJSksV+YGsJfb8RQsrKytiZM2fY1q1bWUJCAouMjGRyuZxZW1vrP8B7eHgwpVLJXnvtNZaamsoyMjJYSUkJ36GbLDIykgFgO3fuNNh+48YNJhKJWk1e/fjjjy0e92HJq7S0NIPtzz77LAOgT341ejB5VV5ezqZPn85iY2NN+tnSnuSVVCplkyZNMtp36NChHU5eNe37Cy+8YNT3l156iQFgX3/9tcG+NTU1bODAgcze3p6Vlpbqt7cnefX7778ziUTCpk+frj/21KlTGQA2Z84c1tDQoN+X4zhmb29v8s/0gIAA3se9tbExZZxNPSdtZQnXBSWvCOlUB2jaICGkXYqKisAYo2mDZqZWqxEbG4spU6ZAKpXi0qVLSEhIoOWXCSEWqb6+HhzHITMzE8nJyYiJiUFISAg8PDzg5uaGsWPHQqVSIS0tDQAQFhaGf/7znzhz5gyqqqr0U/2Sk5OhUqmgVCoxYMAAnntlugMHDgAApk+fbrB94MCBGDp0aKvvHTduXLvb9ff3N3ju5eUF4P70y+bk5+dj/PjxsLKywoYNG8z+s+XJJ5/E8ePHoVKpcPLkSf2Utfz8fDz++OMdOnbTvnt6egIw7PuuXbsAADNnzjTYVyQSITg4GNXV1fjpp586FMdnn30GtVqNuXPn6o/9ww8/YNy4cfjmm2+wcOFC/b5ZWVkIDAw0edyFQqFJU9XMOe7NMWWczX1OLOW6IIR0HE3QJYS0C8dxAABvb29+A+nB0tLSsHjxYtTV1eGzzz7D/Pnz+Q6JEEIA3K+hU1BQYFAoPTc3F5cuXcK9e/cAAK6urpDL5VAoFFAqlfrH3t7esLLquX8/1Wq10Gg0sLOza7ZId79+/XD58uUW3y8Wi9vdtkQiMXhua2sL4P4iH02Vl5cjPDwcgwYNwv79+7F9+3bMmzev3W23RUpKCiZOnIitW7ciODgYABAUFISYmBjMnj27Q8du2vfGa6yx71qtFmq1GnZ2dnBycjJ6f//+/QGg3bW+GjWe28bjAYCjoyP279+PKVOmYPPmzXBycsLq1auRnJyMt956q0PttYU5x70pU8a5K86JpVwXhJCOo+QVIaRdOI7DgAEDOm31HPJfpaWlWLJkCXbu3InIyEh8+umn6Nu3L99hEUJ6ofLycqPV/HJzc3H16lXodDrY2NjAy8sLcrkcSqUSKpUKcrkcI0aMgLOzM9/h80IkEsHJyQkajQaVlZVGPyfLysp4isyQUChEZmYmJBIJJk2ahOjoaPj6+hrdqdKZBAIBoqKiEBUVhbq6OmRlZWHNmjWIiIjA2rVrER8fb7a2RSIRJBIJ1Go1NBqNUaLi1q1bAGBwp197ivv36dMHAHDp0iVMmzZNv93NzQ3p6ekIDAzEunXrcOTIEYjFYkRGRprcRlZWlkn7m2PcWxobU8a5Peeks3XVdUEI6bie+2cvQohZFRUV0ZTBTsYYwxdffAGFQoFffvkF6enp2LFjByWuCCFmVVdXB47jkJaWhlWrViEmJgaBgYGQSCRwc3NDUFAQEhISkJmZCXt7e0RFReGbb77BmTNnoNFoUFhYiLS0NCQlJUGlUiEwMLDXJq4azZgxA8B/pw82unPnDvLz8/kIyYiTkxM8PT3h6OiIPXv2wNHREeHh4SgpKTFbmy4uLsjLywMA2NjYICQkRL9K3r59+8zWbqPGu4yatqXVanHw4EHY29sbTPV0cHBAbW2t/rmvry82bdrUpjbWr1+P8vJyg9c8PDyQmZkJFxcXnD59GkqlsksSIeYY99bGxpRxNvWcmENXXBeEkI6jO68IIe3CcRwlrzpRQUEBYmJicPjwYSxevBgffvgh3dVGCOlUFRUVKCwsNLiDiuM45OTkQKvVArj/4VqhUEChUCAyMhIKhQIymYz+vzfRihUrkJmZibi4OEgkEkycOBHFxcWIj4+Ho6Mj1Go13yEa8Pb2xs6dOxESEoKIiAhkZWVBJBKZpa2FCxfi448/hq+vL9RqNTZu3AjGGKZOnWqW9h60cuVK/Pzzz4iLi4OjoyOmTJmCkpISvPnmmygpKUFqaqrBdL/Ro0fjxIkTuHbtGq5fvw6O4xAUFNRqG+PHj0diYiKSkpIQGBiIjz76CFOmTIFAIMCvv/6KDRs2QCwWQyAQ4P3334dMJsOLL77Y5j6cPXsW06dPh5+fHw4fPtzmKbidPe6tjY0p42zqOTGHrrguCCGdgN+C8YTwh1Y/6xiFQsH++te/8h1Gt1dbW8uSkpKYnZ0dGzlyJPvPf/7Dd0hmQd9vhHSdGzdusIyMDJaamspee+01plQqmUwm06/oZ2try+RyOYuMjGQJCQls69at7MyZM6yyspLv0HuU/Px8Fh4ezpydnZm9vT3z9/dne/fuZcHBwfpz8fLLL7MTJ07onz/49aBdu3YZvT537txm37ts2TLGGDPaPnPmTPb1118bbV+/fn2zx5k7d26r/WtptcGWYmWMsezsbBYTE6NfPdfNzY1NmDCBbd68mel0OpPG19S+N7pz5w6Li4tjUqmU2djY6FcGPHjwoFEbeXl5LCgoiInFYubl5cVSUlLaHN/evXvZU089xfr27cuEQiFzcXFhAQEBbO3atUyj0bDjx48zBwcHgzjr6uoeetzTp0/rx+3BlQu7atwbPWxsTBlnU/Z9GEu6Lmi1QUI61QEBY4x1WiaMkG5kwYIFKC4uRnp6Ot+hdDuMMTg6OuKTTz7Bn/70J77D6bZ+/fVXLFiwAJcuXcIbb7yBZcuWwcbGhu+wzIK+3wjpXLW1tbhy5YpRLaq8vDxUVVUBuF8wXSaT6QulNz4eNmxYjy6YTrrG9u3bERUVhY0bNxqsoEcIuU8oFGLs2LE4efIk36EQ0hP8RNMGCSEmKy0txb1792gaSTvdu3cP7733HtasWYOAgAD8+uuv8PX15TssQogFKi8vN5rmd/HiReTl5UGn00EoFGLw4MGQyWQICAiASqWCTCbDo48+avapNoQQQgghXYWSV4QQk3EcBwCUvGqH/fv3Y9GiRVCr1fj0008RHR1Nq9YQ0svV19ejuLjYKEl14cIF/UpXIpEIPj4+RrWo5HI57O3tee4B6c0WLVqERYsWQSwWo7Kyku9wCOFVYmIiVq1axXcYhPRIlLwihJiM4ziIRCJ4enryHUq3UVZWhjfffBObNm1CaGgoUlNTMXDgQL7DIoR0IbVajYKCAqMkVW5uLqqrqwHcn+rXOM1PqVTqH0ulUkp0E4syb948zJs3r9OP25brfPny5XjnnXc6ve3ezNLH3dLja5SUlISkpCReYyCkp6LkFSHEZBzHwdvbm2qmtNG3336LxYsXw9bWFt9//71+SWZCSM9UXl5uNM0vNzcXRUVFYIzBxsYGXl5ekMvlUCqVUKlUkMvlGDlyJJycnPgOnxBeUTleflj6uFt6fIQQ86PkFSHEZEVFRTRlsA2KioqwcOFCZGRkIDo6GmvWrKEPpoT0EHV1dbh27ZpRkur8+fPQaDQADAumN9aiksvl8PPzg7W1Nc89IIQQQgjpPih5RQgxGcdxGDFiBN9hWKz6+nqkpKTg7bffhre3N44fP44JEybwHRYhpB1aKpien5+PhoYGAICHhwcUCoVRPSpK8hNCCCGEdA5KXhFCTMZxHGbNmsV3GBbp/PnzWLBgAbKzsxEfH493330XIpGI77AIIQ9x8+ZNo2l+HMfpF6iwtbXFkCFDoFAoEBYWhoSEBCgUCvj5+UEsFvMcPSGEEEJIz0bJK0KISWpqalBSUkJ3FDRRXV2NVatWYeXKlfD390d2djbkcjnfYRFCHlBbW4srV64YJany8vJQVVUFoOWC6VTnjxBCCCGEPyb9FvbNN99AIBBAIBDAzs7OXDG1as2aNfoYBg0a1KFjbd++XX8sgUAAR0fHToqybXbv3m3Qfk1NTZe23xanTp1CWFgYBg4cCGdnZ0yaNAnJyckoKytr9zF37NgBgUBAd6O0gO/rIjEx0aD9ptPdioqKoNPpKHn1gMOHD+Oxxx7D+vXrsXr1ahw+fJgSV4TwqLy8HEePHsWmTZuQmJiIsLAw+Pj4wN7eHsOHD8cLL7yATZs2oaSkBAEBAVi3bh0yMjJw69YtlJWV4ejRo0hNTUVCQgLCwsIgk8kocUUIIYQQwiOTfhObM2cOGGMIDg5uV2OVlZV45JFHEBoa2q73A8DSpUvBGMPIkSPbfYymNm7cCMYYKisr9ds6I9aHCQ8PB2PMYqdfHTt2DIGBgdDpdDh27BhKSkoQGxuLhIQEvPHGG+0+rru7u8G/D+qKcbd0fF8XSUlJYIyBMdZsQeHGKTRSqbSrQ7M4FRUViImJweOPP45HHnkEOTk5iI2NpQ+5hHSB+vp6cByHzMxMJCcnIyYmBiEhIejfvz/c3NwQFBSEN954A5mZmbC3t0dUVBS++eYbnDlzBhqNBoWFhcjIyEBycjJUKhWUSiX69evHd7cIIYQQQkgzunTaIGMMOp0OOp2uK5ttl+4Ua2scHR0xatQoHD161OT3btmyBfX19diwYYM+UfH888/j8OHD0Gq17Y6pteRVV4771q1bu/xuO0vRkeuC4zi4u7vD2dnZDJF1H2lpaVi0aBEaGhrw+eefY/78+XyHREiPpFarUVBQ0GzR9MY7Ux+c6hcaGqovmC6VSiEQCHjuASGEEEII6aguTV45OTmhsLCwK5tst+4Uq7kwxgAApaWleOSRR/TbU1JSOnTc1pJXNO6Wr6ioqFdPGSwpKcGrr76KXbt2Yd68eVi/fj369OnDd1iEdHstFUwvKioCYwy2trYYNGgQ5HI5lEolVCoV5HI5Ro0a1Wv/EEEIIYQQ0ltQwXbSooiICGzduhVLlizB0aNHO+3DQd++fSEQCJpNXhHL0/QuOI7jemXyijGGzZs34/XXX4e7uzvS09OhVCr5DouQbqW2thbXr183uoPq3Llz+qn7rq6ukMlk+iRV42M/P79mpzITQgghhJCer9XCLHl5eQgPD4dEIoFYLEZQUFCz04yaFpjOz8/Hc889hz59+ui3bdmypdki1E3fe/XqVTz//PNwcXFBnz59EBoa2qY7cZoWXxcIBCgtLW3XoLRWMFur1eJvf/sb/Pz84ODgADc3N4SFhWHPnj1oaGhoV3uNSktL29T3P/74A/Hx8fDx8YGtrS1cXV0xY8YMHDp0SL9PY2H7qqoqHDt2TN8XobDt+UofHx84Ozvj3LlzePrppzutcLi1tTVcXV2NklddNe6NY1NfX4+KiooWx6Yt49yefU3F53Wh0+lw+vRpuLu7Y8KECXjxxRdx7do1CAQCfR203uDKlSuYOnUqXnnlFbz00ks4d+4cJa4IaUV5eTnOnj2LL774AomJiXjuueegUCjg4OAAHx8fPP3000hOTgbHcRgzZgzWrl2LjIwM3Lx5E2VlZThz5gy++OILJCQkIDIyEgqFghJXhBBCCCG9GWvBlStXmIuLC/P09GTp6elMo9Gw8+fPs2nTpjFvb28mEomM3jNr1iwGgE2ZMoUdOnSIVVVVsZMnTzJra2v2+++/G+xTXV3d7HtnzZrFjh8/ziorK1lGRgazt7dn/v7+Rm2NHDmSeXp66p/X19ez+Ph4FhISwsrKylrqloFt27YxAGzjxo3Nvt5crAsWLGASiYSlp6eze/fusdLSUrZ06VIGgB06dKhN7bbUzoN9P3jwIHN2djbqe0lJCZNKpax///4sLS2NqdVqlp+fzyIiIphAIGCbN2822F8sFrOAgACTY/r3v//NHBwc2IYNG/TxhYaGsrq6Ov0+M2fOZAD0X88880ybj+/r68s++OCDZl/rqnEXCoXMxcWl2ddMGWdTz0lbWcJ1YWVlZXCOra2tmUgkMthua2vLfH19WW5ubrv6aclqa2tZUlISE4lEbNSoUezMmTN8h9RtvfzyyywkJITvMEgnu3HjBsvIyGAbNmxgKpWKKZVKNmDAAP3/DyKRiMnlchYZGckSEhLY1q1b2ZkzZ1hVVRXfoRNCCCGEkO7jQIvJq8jISAaA7dy502D7jRs3mEgkajV59eOPP7bY4sOSV2lpaQbbn332WQZAn/xq9GDyqry8nE2fPp3Fxsay+vr6Fttuqj3JK6lUyiZNmmS079ChQzucvGra9xdeeMGo7y+99BIDwL7++muDfWtqatjAgQOZvb09Ky0t1W9vT/Lq999/ZxKJhE2fPl1/7KlTpzIAbM6cOayhoUG/L8dxzN7e3qRxZ4yxgIAA3se9teSVKeNs6jlpK0u4LqytrQ2SV819WVlZsTFjxpjcPz7l5OQwnU7X6j7Hjh1jcrmcOTg4sKSkJJOvcWKIklfdV01NDcvJyWE7duxgSUlJLCoqio0ZM4Y5ODjo/x9wdXVlAQEBTKVSsaSkJLZnzx5WWFho8POCEEIIIYSQdjrQ4rTBAwcOAACmT59usH3gwIEYOnRoq3dzjRs3rtXXW+Pv72/w3MvLC8D9Qq7Nyc/Px/jx42FlZYUNGzaYfVrBk08+iePHj0OlUuHkyZP6KWv5+fl4/PHHO3Tspn339PQEYNj3Xbt2AQBmzpxpsK9IJEJwcDCqq6vx008/dSiOzz77DGq1GnPnztUf+4cffsC4cePwzTffYOHChfp9s7KyEBgYaPK4C4VCk6YwmnPcm2PKOJv7nPB9XTzs3Op0OqxcubJdx+bDjRs38MQTT2DLli3Nvl5VVYXExERMnjwZ/fr1Q3Z2NhISEmjKEunxysvLcfToUWzatAmJiYkICwuDj48PHBwcMHz4cMydOxebNm1CeXk5lEol1q9fjyNHjkCtVqOsrAxHjx5FamoqEhISEBYWBplMBiurVqsTEEIIIYQQ0ibNZg+0Wi00Gg3s7OyaLdLdr18/XL58ucWDisXidgckkUgMntva2gIwLhoN3P9FOzw8HIMGDcL+/fuxfft2zJs3r91tt0VKSgomTpyIrVu3Ijg4GAAQFBSEmJgYzJ49u0PHbtr3xl/6G/uu1WqhVqthZ2cHJycno/f3798fANpd66tR47ltPB4AODo6Yv/+/ZgyZQo2b94MJycnrF69GsnJyXjrrbc61F5bmHPcmzJlnLvinPB9XTg4OECj0TT7mrW1NUaPHo2QkJB2Hbur1dbWYvbs2bhz5w7i4+MRGhoKDw8P/ev79u3D4sWLodFo8OmnnyI6OhoCgYDHiAnpXHV1dbh27ZpRwfQLFy7g7t27AAAXFxf4+PhAJpMhKioKCoUCMpkMCoUCdnZ2PPeAEEIIIYT0Rs0mr0QiEZycnKDRaFBZWWmUwCorK+uS4B5GKBQiMzMTEokEkyZNQnR0NHx9fY3uVOlMAoEAUVFRiIqKQl1dHbKysrBmzRpERERg7dq1iI+PN1vbIpEIEokEarUaGo3GKFFx69YtAMCAAQMM4jVVnz59AACXLl3CtGnT9Nvd3NyQnp6OwMBArFu3DkeOHIFYLEZkZKTJbWRlZZm0vznGvaWxMWWc23NOOpu5rwsnJydotVrU1tYavdbQ0ICkpKR2Rt71YmNj8csvv4AxBq1Wi1deeQXff/89bt26hddffx3btm1DZGQkUlJSaDVM0q1VVFSgsLBQn5xqTFTl5ORAq9UCADw8PKBQKKBQKPRF0WUyGaRSKSVtCSGEEEKIRWnxfv4ZM2YA+O/0wUZ37txBfn6+eaNqIycnJ3h6esLR0RF79uyBo6MjwsPDzboCmouLC/Ly8gAANjY2CAkJ0a+St2/fPrO126jxLqOmbWm1Whw8eBD29vYGUz0dHBwMkg6+vr7YtGlTm9pYv349ysvLDV7z8PBAZmYmXFxccPr0aSiVyi75kGOOcRcKhQZ39D04NqaMs6nnxBzMeV2IxWLU1dUZbRcKhRg/fjymTp3aGV0wuy+//BL/+Mc/9FNO6+rqsGvXLixduhTDhg3DkSNHcODAAezYsYMSV6TbuHnzJjIzM7Fp0ybExsYiJCQEPj4+cHV1xdixYzFv3jxs27YN1dXVUCqV2LRpE86cOQONRoObN28iIyMDqampiI2NhVKphEwmo8QVIYQQQgixOC0WHVqxYgUyMzMRFxcHiUSCiRMnori4GPHx8XB0dIRare7KOB/K29sbO3fuREhICCIiIpCVlQWRSGSWthYuXIiPP/4Yvr6+UKvV2LhxIxhjXfIhfuXKlfj5558RFxcHR0dHTJkyBSUlJXjzzTdRUlKC1NRUg+l+o0ePxokTJ3Dt2jVcv34dHMchKCio1TbGjx+PxMREJCUlITAwEB999BGmTJkCgUCAX3/9FRs2bIBYLIZAIMD7778PmUyGF198sc19OHv2LKbJ/D64AAAgAElEQVRPnw4/Pz8cPny4zTVROnvc+/Tpg9LS0mbHxpRxNvWcmIM5rwtHR0cwxoy219fXd5u7rs6dO4eXX37ZaLtAIMDmzZsxb948rF69ukNTngkxl9raWly5csVgml9ubi7y8vJQVVUFAHB1dYVMJoNcLtcnoeRyOfz8/KheGyGEEEII6f5aK+een5/PwsPDmbOzM7O3t2f+/v5s7969LDg4WL/C0Msvv8xOnDjR7CpkD9q1a5fR63Pnzm32vcuWLWPs/qdlg6+ZM2eyr7/+2mj7+vXrmz3O3LlzWy1X39Jqgy3Fyhhj2dnZLCYmhg0bNow5ODgwNzc3NmHCBLZ58+aHrl7WlKl9b3Tnzh0WFxfHpFIps7Gx0a8MePDgQaM28vLyWFBQEBOLxczLy4ulpKS0Ob69e/eyp556ivXt21e/Ml9AQABbu3Yt02g07Pjx4warTQFgdXV1Dz3u6dOn9eP24EpUXTXujZ599lnm6ura4tiYMs6m7PswlnRdWFtbs/Hjx7M+ffoYtCsUCtnkyZNN7hsfysrKmJeXFxMKhc3+P2VjY8MWLlzId5g9Hq02+HBlZWXszJkzbOvWrSwhIYFFRkYyuVzOrKys9N93MpmMKZVK9tprr7HU1FSWkZHBSkpK+A6dEEIIIYQQczogYKyZWyp6ie3btyMqKgobN240WEGP9A4LFixAcXEx0tPT+Q7FYgmFQowdOxZubm746aefDKZZ/vzzz5g8eTKP0T2cTqfDjBkzcOjQoWanPjYSCAT4+eefH3pXImk/+n67r76+HsXFxUa1qC5cuKCvTycSieDj4wOFQgG5XK6vRSWXy2Fvb89zDwghhBBCCOlyP7U4bZAQQhpNmDABBw8eRG1tLYRCIYKCgiw+cQUA77zzDjIzM5tdrfRBVlZW+NOf/oSLFy+abbox6V20Wi0KCgqQm5trkKTKzc1FdXU1gPtT/RqTU0qlUv+YCqYTQgghhBBiiJJXABYtWoRFixZBLBajsrKS73AI4VViYiJWrVplsM3f319f4L2+vh7vvvsuH6GZJC0tDR988EGz9boeJBAIYGVlhcLCQqxYsaJb9I1YjvLycoPkVOPjoqIiMMZgY2MDLy8vfS0qlUoFuVyOkSNHGq0MSgghhBBCCGler542aC5t+Yv58uXL8c4775g/mF7E1HHv6mlM3fm6+P3339GvXz8IBAJMnToVmZmZfIfUqoKCAjz22GOoqqoySl5ZWVnBysoK9fX1EIlEGDVqFB5//HEEBARg8uTJkEgkPEXds3XnaYN1dXW4du2aUZLq/Pnz0Gg0AAwLpj84zY8KphNCCCGEENJhNG3QHCgfyA9LH3dLj6817u7uGDhwIG7evIkPP/yQ73BaVVVVhaefflqfuGpMHDQ0NMDFxQVTpkzRJ6see+wxCIX03yC5r7y83KgW1cWLF5Gfn4+GhgYAgIeHBxQKBRQKBSIjI/WJKplMxnP0hBBCCCGE9Fz0qY0Qc6itBQ4fBg4eBM6dA0pKgLt3+Y6qQyaq1ai0t8f4F17gO5RWqcrKcKmiAgAw2N0dj0+bhilTpyIgIAC+vr48R0cswc2bN42m+XEcB47jAAC2trYYMmQIFAoFwsLCkJCQAIVCAT8/P4jFYp6jJ4QQQgghpPeh5BUhnemPP4CPPgL+7/+AO3cAuRwYPRp47DHA2Znv6Dpk/OHDmCKVAl5efIfSooMFBeh77hx2ODoi8PZteFy6BKSlARIJMG0a3+GRLlRbW4srV64YJany8vJQVVUFwHCq34MF0729vWFlZcVzDwghhBBCCCGNKHlFSGdoaABSU4G//hWwtQVeew2YPx/4n//hO7JOEx0TAxcXF77DaFXw//+lV1oKfPUV8MknwNatwJtvAv/7v4CdHU8Rks7WUsH0q1evQqfTQSgUYvDgwZDJZAgICIBKpYJMJsOIESPQr18/vsMnhBBCCCGEtAElrwjpqOvXgdmzgfPngbg44O23gR64ipilJ66aNWAAEB8PvPIKsH498OGH95NYu3ffvyuOdAv19fUoLi42muZ3/vx53L59GwAgkUgwZMgQyP4/9u47PKoyYf/4PemVJNRQhdANiKiAKCCLQSlRIqJUsVH2ByxEBELVV2miSFHBhgiCCspKWZUOFlCWsiJKCUU6CRAhkED6zO+PYyIhCSQhmTPJfD/XNddMznnOmXsmi++V+33Oc0JC9NRTT2WtRRUaGiovykoAAACgRKO8Am7Fzp1Sly5SUJBRXrGmkmPy9JRGjzZmw3XvLt13n/TFF1xK6GAuXbqkw4cP57poenJysiTjUr/My/vCw8OzSqpatWrl646eAAAAAEoeyiugsL7/XurUSWrdWlq61FhXKT+OHzdKrz/+kOLjjUsOUXAWixQYKNWsaawpVq/ezY+pUkXasEHq31/q3Fn69FPpySeLPSqyu/ZSv2tLqqNHj8pms8nd3V3Vq1fPWotqwIABuv3223XnnXfKz8/P7PgAAAAA7IzyCiiMQ4ekxx83yqvPP5fcbvJP6exZad48adEnUvRBycVF1rKBsvp6Sy7MFikUm00uV5LlcjFeSs+Q7bYasvTqLQ0ceOO1xjw9jUsHg4Kkp5+WatSQ7r3XfrmdRGpqqk6dOpVVTm3dulWxsbHy9/dXYmKipJwLpme+btCggVxdXU3+BAAAAAAchcVms9nMDgGYoV+/fjpx4oTWrVtXsAPj442yIyBA+u47yds777EpKdKMGdLkSbJZLEpqdrtS76irtFpVZfNwv6X8MFjSM+R2Ikaevx2W1/a9ckm8aqw9NmHCjdcey8iQIiKkHTuk7duNEgsFdvHixVwv84uOjlbGX7MKK1euLIvFIjc3N40bNy5rLarKlSubnB4AAABACbCW8gpOq9Dl1eDB0vLl0v/+ZywInpfvvpOee1a2mBhdfailrj7YXDZ3JjsWK6tV3lt+kd83W2Tx8ZXmvit17Zr3+IQEo4isXVtatcp+OUugM2fO5LjMb+/evYqJiZEkeXp6qnbt2llrUGWuS9WwYUP5+PgU/t8bAAAAAGe3lr+kgYL4/Xfpgw+k+fNvXFx9+KE0aJBSGtdRQv8BsgaWvrsPOiQXFyW1uVspd98u35XfybtbN+mVV4w7QOa2mLe/v/T++1KbNtK33xqXgTqxlJQUHT58OFs5tW/fPu3fv19Xr16VlH3B9LCwsKzXNWvWlIuLi8mfAAAAAEBpRHkFFMTQodI990h9+uQ9ZtQoafp0XenUSlc6tZZY0srurL7eSujVUenVg+X/yitSdLSxzlVu6yi1amWsXzZ8uPTww7mPKWWuXTD92pLq2LFjslqtWQumh4SE6P77789aMP2OO+5QmTJlzI4PAAAAwMlQXgH59csv0ubN0qZNuc/ikaQ33pDefFOXn35Eyc0b2Tcfckhq3VQZ5QMV8P6XspQtK731Vu4Dp0yR6tc3Zl898oh9QxaTtLQ0nTx5MkdJ9dtvv+ny5cuSpMDAQNWuXVshISF66qmnsi75Cw0NlZeXl8mfAAAAAAAMlFdAfi1aZBQcbdvmvv/bb6XRo5X4+IMUVw4ktWEtXX46XAFz3jF+f4MH5xxUt67Urp3xOy5geWW1Wk29XC4+Pl5HjhzJddH05ORkScaC6aGhoQoNDdUTTzyRVVLVqlVLlryKWAAAAABwEJRXQH6tXm3cnS63P/ZPn5aefEJJrZrq6j+a2T8bbiilaQNdCX9AvsOGSfffL915Z85BERHSuHFSerrkdvP/NKalpemjjz7SwoUL9fPPPxdD6uwyF0y/vqQ6evSobDabPDw8VK1aNd1+++0KCwvT0KFDFRoaqvr168vPz6/Y8wEAAABAcaG8AvLj8mVj3aT77899/8iRyvD1VuLjD9o3F/LtysP3yePAUbkPGiRt3ZqzhLz/fuP3fOiQ1LBhnuex2Wz68ssvFRUVpWPHjslisejq1avy8fG55Yypqak6depUVjmV+RwdHa3ExERJxoLpmXfzCwsLy3rdoEEDuTrBel0AAAAAnA/lFZAfhw9LNpvUoEHOfT/9JC1ZosSB3WRz55+Uw7JICY8/qLLTPpaWLpV69Mi+P7OwOnw4z/Jq69atGj58uHbs2JF1uZ3NZlN0dLSaNm2a7ygXL17M9TK/6OhoZWRkyM3NTTVq1Mi2YHpISIgaNWqk4Bvd5RIAAAAASiH+0gbyIz7eeA4Kyrnvlf9TWv2aSrmjrn0zocDSqwcruXljeb76iizXl1deXpK3t3TxYo7jfv/9d7300ktavny53NzcZLPZZLPZJEkuLi46cOBAjvIqPT1dJ06cyFFS/f7774qNjZUkeXp6qnbt2goNDdUjjzyiqKgohYaG6vbbb5e3t3fxfAkAAAAAUMJQXgH5kZZmPLu7Z99+/Li0YaOuDnjc/plQKFf/cY+8ps43Zszdd1/2ne7uUmpq1o/Hjx/XpEmT9NFHH8ntr3Ww0tPTrzvEXT/++KPS09O1f/9+RUdH68CBAzp8+LBS/zpX9erVVb9+fTVo0ECPPfZY1uuqVasW74cFAAAAgFKA8gq4FatWyeblqdTbQ8xOgnxKrx6sjOAKcl21Kmd59Ze4uDi98cYbmjlzpiTj0sC0zALzOmlpaVq1apXmzZun6tWr6/bbb9cjjzyStRZVkyZN5O/vX2yfBwAAAABKO8or4FZs2aK0OtVlc2Oh7JIktV51ef/wfY7tl202TV+5UtOHDlV6enqehdW1rFarfHx8lJSUVGwLpl+5YkwIS001XktSQoJxY0SrVbp0ydiWnCwlJRmvL10y9l0rt23XnjO/fH0lD4/s23x8JE/Pv38OCJBcXIzXLi7SmTO368KFstq1y7iZo7+/Md7Hx7ha08urYBkAAAAAOA/KK+AW2H7bo7TbypsdAwWUXrWi9M1PWT9brVa9/fbbmpSYqLivvy7w+Y4fPy6LxaLERGU9Ll0yHomJRtGUmGgsnZb5OinJeJ2WZmxPSZGuXjX2paUZS28VpljK5O9vlETXyq10cnExiqb8yizSrpdZpknGvQ0yl4n723BJ0j335H1uPz/jys2AAKlMGePh7288BwRIgYHZt5UrJ5UvbzwqVTK2AQAAACh9KK+AW2A5f17WxjVu6Rwrdu7TwPkrJEkebq46+VbULZ1v9a8H9cz7y7J+PjF7lDy5C2I2Vn9f6fJlo4Xx8JCLi4uee+453T1ugrZ17KZdbh769ddd+uOPvUpJSZLFYpGrq6cyMlJls1lznC81NVVubsdks+V++aiHh1G4ZJYyfn7GTKMyZYyyJiTEGOPr+3fBFBho7PP3/3tmUuaMJSn7TKfM+whknsPRpKZKzz8/VKdOxeijj75UWppR0mUWdklJxqyxzGLs0iXj15OQYDxfviz98cff5V/mtuuLPQ+Pv8usChWkihWNUuu226Tq1aVq1YznypWlv24WaTdLlixRz549JRkL9ScnJ9s3gKTp06dr5MiRkqSqVavq1KlTds8AAAAAFAZ/0QK3IjlFusViKOKe2xVxz+3qNvsz/ffIyWz7rqSk6sEpH6lOpXJaPOjJfJ2vY5N6Ojt3rJ5+b5nW7Dl4S9kKqzC57cnm8dfC+0lJWVOR/P395asmGrls/jUjrXJ1/UO+vrvl7r5HVusvSkr6RcnJpyVJrq7GeTIy0jR6dLRatw6Rn1/22UL+/jlnOzkbDw/J0/Oq3N0vKaQIl4dLTpbi4qTz56WzZ43XmY9z54ztP/8sLV0qxcYaM8Iy81SpYhRZdetK9etLDRsaj1q1pOK4+rNHjx7q0aOHwsLCtGXLlgIfn5iYqKZNm6p+/fr6uhCzAyVpxIgRGjFihO68807FxcUV6hwAAACAGSivAAdms0lWm03WzL+6r1Er8g01ql5J/3mxrwnJbuxGuR1ZfZdD2vTiNwrq01lBQVLZsi7y968jqY6kblnj4uPjtWfPHv3666/as2ePdu3apRo1jqtjR9OiOyUvL2M2VbVqNx+bmiqdOSOdPCmdOCGdOmW8PnhQWr/eeC0Zs9nq1ZMaNJCaN5datjQudbx2PS8z2Gw2Wa1WWa9ftAwAAABwApRXgAPz8/LQ9lcHmR2jwEpqbh9Lkv7RIEa688bjAgMD1aZNG7Vp08Y+wXDLPDykmjWNR24SEqQDB6T9+43Hvn3S9OnGjC5PT+nuu42bUz7wgPTgg8alnPbk7++vI0eO2PdNAQAAAAdBeQUAcHr+/lKzZsbjWkeOSD/9ZDzWrpVmzDBmfD38sPTcc1LHjsVzmSEAAACAv1FeAXZ2KPZPTVqxWVsPHle61ao7qgdrXETbHOPyWnh97ob/6pWvNkqSth85pUqDpkiSXF0sOvPOmBznOXf5iiau2KTN+/6Qi4uLmtWqqklPtFfNCkHZxv2ZeFUzvt2iNXsO6eylBPl7e+neOtX1YqdWalStUq6Ztr48UNP+84N+iD6m+CtJkqQZvTtp+Kff5sh9/bE7Jw7OV65rv6+0jAw1qFJBIzq11vubtuvH6GOSpF73NdHMPp1v+t0DBVW7tvF46inj59hYadUq6YsvpEcfNRaDf+klqW/f7CXWgQMHNHr0aG3evFnp6em66667NHXq1BznX7FihR577LFsx02YMEEbN27UhQsXJEkffvih+vfvnzUmKSlJXl5eOY49evSooqKitHbtWrm6uqply5aaPXu2ateufcPPuHjxYj2V+QH/EhMTo+Dg4Hx/TwAAAEBxcjE7AOBMjp6/qM5vLNSvJ2L0Uf+u2jttmKb1fFgzvt2iY3EXs43NXHi9wx31sm0fFNZCZ+eOlY+Hu5rXrqazc8fq7NyxuRZXkjT+y/Ua8I/m+nXqUH3U7zFtO3wy6+6Gmc5eStRDr32slf/br2k9Oih6+nCteKG34q8kqdMbC7Xzj9O5Zhr52Wo92+Yu7Z48RKtHPSNXF0ueua/ffm2uD5+P0I/Rx3Lkuv772vd6pN7qG64PNu/QvtPn5OHmqrNzx1JcwW6Cg6UBA6QNG4z1sh5+WBo4UGrf3lggXpIOHz6sli1baufOnVq2bJnOnj2ruXPnauLEiTku/YuIiJDNZlOXLl0kSQMHDtSgQYN08uRJbdu2Ta6urjnG5HVsZGSkIiMjdfr0aS1dulSbNm3KusPhjfTs2VPDhw9X+/btdeHCBdlsNoorAAAAOBTKK8COpqz8TpeSkjXpifZ6oGEt+Xp6qGGViprd9xGdvZRYLO/Z5/47dU9IVfl4uKtV/Zpq37iOdh+P0YXEq1ljJq/crFMXLunVx8MU1qi2fD09VL9yBb3//GOy2Wwa+8XaXM895KGWuq/ebfL2cNddNavozDtjVNbPp8C52jSopfaNcubK7fuqX7mC3nuui66mpt3aFwPcojp1pPfek3bskI4fl7p2ldLTpbFjxyo+Pl6zZ89W+/bt5efnp8aNG+vjjz9WTEzMDc8ZFRWltm3bysfHRy1atFB6errKly+frzz9+vVTy5Yt5evrq7CwMHXu3Fk7duy44Z0F4+Pj1blzZ2VkZGj16tUKCgrKcywAAABgFsorwI427TNmXfzj9pBs24MD/FS7Yrliec87b6uc7efKgf6SpNhryrLVvx6Ui8Wi9o3rZBtbsYyvGlSuoF9PxOpMfEKOc99Vs0qR5aoSVCZHrry+r3J+PqpbqXi+L6CgmjQxLiXcskXatk1as2aNJOnhhx/ONq5KlSqqV69ebqfI0rx580LnaHbdgl3Vq1eXJJ05cybX8dHR0WrRooVcXFw0a9YsubJ4FwAAABwUa14BdpKanqHE5FR5urvJ19Mjx/7y/j46cu7PIn/fMt6e2X52sVgkSVabLSvX5aQUSVKd4W/meZ6j5y6oyl/FVyYfD/ciy+Xh5poj142+rwAfr0K/N1DUqlQx1rw6dy5FCQkJ8vLykp+fX45xFStW1MGDB/M8j6+vb6EzBAQEZPvZw8P4d2O1WnOMvXjxoiIiIlStWjWtXr1aixcvVp8+fQr93gAAAEBxorwC7MTDzVV+Xh5KTE7VlZTUHIVM/NWkAp3P8lcJVRS5Ary9dCUlVcffGiU3F8eYkHmz7ysu4WoeRwL2lZhoLOgeHCyFhXnK399fCQkJSkxMzFFgZS7CbjY3Nzdt2LBBAQEBuu+++9S/f3/Vr18/x+wtAAAAwBE4xl+pgJN4MNS469emfX9k234h8aoOny3YH7XeHu5KTc/I+vm+/3tPi7b8UqhcnZvWV7rVqu1HTuXY9/a6n9V03DtKz2X2RnHL6/s6d/lKscxSAwrCapW+/NK4bHDHDunf/5bKlJE6duwo6e/LBzPFxcUpOjrajKg5+Pv7q2rVqvLz89OqVavk5+eniIiIm67JBQAAAJiB8gqwo7GPtlWgr7cmfLle3+8/qispqToYE6dBC1blemncjdxRvZL+OHdBZy5e1s4/Tut4XLzurVO9ULnGdWmrmhWCFLnoa23ce0SXk1IUfyVJn/z4i978dov+r+uDpszIyu37OnDmvIZ98h9VLJPzkix7unJF+vZbadgwqX596dgxU+PAjg4dkiZNMhZs79FDuv9+6ZdfpBYtjP1TpkxR2bJlFRkZqfXr1ysxMVH79u1Tnz59cr2U0Gw1a9bUsmXLdP78eXXt2lUpKSlmRwIAAACysdhsfy0wAziZfv366cSJE1q3bt3NB69dK3XoIMXHS9euK+Pvr4QubZR0/535ft8j5y5o4vJN2hJ9XGkZGWpQpYJGdG6t9zdu14/RxyRJve5rooca19Uz7y/LduzjzRtp7jOPSpIOn/1TL376rfaciFWgr7eGPtxSz7a5W7uOnlanNxZmOy6yw/0a8+gDqjRoSrbt7RvV0eJBT0qS4q8kaeaan7T612iduXhZZby91Lh6JQ1uf6/aNKglSbmeW5LOzh2b9Xr1rwdzzf38A3cXKte131e61apG1SppXERbvf71j/rl2BkdmzUy7y87Dx77/lDgO0ty/j4DAqQ335T69ctxjM0m7dlj/E9h9Wpp61YpLc1Y5ygjI+epkF2B/r05mLNnpe++k77/3njev1+qVEnq2VMaNEiqWzfnMQcPHlRUVJQ2bdqktLQ0NWrUSC+//LJmzpypjRs3SpKef/75rDsEXu/a/9O8YsUKPfbYY9n29+7dW0OGDMlx7Lhx4zRp0qQclxV37txZffr0Uc+ePbNtnzlzpu69994c5+ndu7cWL158s68GAAAAsIe1lFdwWmaVVyga97/yvpLS0vS/SUMKfGx+y6u4OGnzZmn9emnlSuncOcnd3Sirrr2K0tXVKLKKaBmyUqmklFenT0u//24Ulb/9Ju3aJe3bJ7m5SffcI7VtK7VvLz3wgPF7BwAAAFDs1rJgOwCHde7yFbV+9X39Pi1S7q5/X7Z48s9LOnb+oro1b1Sk75chV+0+Xl4bpklffWWsYyQZJUV6uvE6LS3ncX5+FFclSUyMdPSocann0aPG4/Bho6zKXE+9alWpUSPp0Uel6dOl1q2N3zMAAAAA+6O8AuDQ4q8ma+Rn32pUeBsF+XrrwJnzGvPFOvl5e2p4p1ZF8h7p6dLUqdIbCSeUMClnQ5FZXOXFz0+6eFHy9zdm6MAccXHGJX5nz0pnzhgz5c6cMX6OjTVmVR09KiUnG+Pd3aUaNaSaNY11y7p1MwqrO+6QypY19aMAAAAAuAZ/ZgG3wsNdyrD/XficRcUyvlo2rJfmf79Lj85YpNhLiQr08VKbBrX03rNddFv5wEKd15Lx110aPYxF8t3cpAkTpLBpj2n27e/r37+EyMVFSk3N3/kSEv4uO7y8jDKrTBnjKkQ/v78fQUHGs6/v3w8PDykw0Hj285N8fCRPT+NYd3fjPB4extjSKjlZSkoyCsCkJOnqVenSJWNR/KQk6fJlKTHR2H/hQt7P114E7+EhVaggValirE91223Gwuo1a0q1ahnP1apx6R8AAABQElBeAbfAFhgol6tJZsco1VrXr6nW9WsW6TktV5KNlsnbO9v2lq7b1XLAJp19JEQLFkgzZxqzd1xcjHWu8hIaKr36qlGwZD4uXfq7dElIMJ7/+MN4vnr17+eUFGPprfyuPhgQYOS5ttDK3ObpaZRfmYKCsh97/X7JKMcKUuCkpBi5r5VZPl0rKcnYnp5ufP7jxyfoyhV31a799+dOSzO+hxtxdTUy+vsbJV/ZssbnqlZNatzYeJ25rXx5KThYqljRKK4AAAAAlA6UV8AtsDRoKNeYE2bHQAG5xcbJVqeO8lqmqlIlKSpKeuEFY6H2d96RfvjBmAl1/ZpXFosxqycs7NYyZRY51xZaqanGtmvLoYsXjefMciivbRkZRnl2rYsXjcvnrt9WEG5uRpF0s22BgUZR5uJilGurV+/T1atn1a/fM1m9YWYxlVmqZR7j7W28zpyZBgAAAMC5UV4Bt6JFC3m89bNkk/JsQuBwPP44LUvbh24+zkN64gnj8b//Se+9Jy1caNxpMHMdLDe3nDOcCsPd3ThPUZzLEcXF/VsnTpxQVNQzZkcBAAAAUMK43HwIgDx16iSXPy/K/USM2UmQTy7xCXI7clLq3LlAx911l/TBB9LJk9LLLxuXplksxgynwMItvQUAAAAAyAfKKyA/MhcFsl63OPs998jWsIG8f/zF/plQKN5bfjEWSerYMedOq/WmC0BVrCiNHy+dOiV9/rnUokXpnS0FAAAAAI6A8grIjzJljOeEhBy7LKOi5PXf3+QWc97OoVBQLpevyOe7XdKwYcZCS9fKyDBub5f5u74Jd3epe3fpp5+koUOLISwAAAAAQBLlFZA/1asbz0eO5NzXt6/UtKn8l220byYUmN/KzbIEBUkvvphz59Gjxi3/atQo8Hmv78EAAAAAAEWH8grIj8qVjVvQbd+ec5+Li/T223I/cFReP++xfzbki8f+o/La9ps0a7ZxS7vrbd9uTKcKDbV/OAAAAABAniivgPx66CHpm29y33fvve5H1ogAACAASURBVNLo0SqzZK3cD5+0by7clFtsnALmr5R69ZK6dct90DffSK1a5V5sAQAAAABMQ3kF5NeTT0pbtkiHDuW+f9IkKTxcgfOWyzX2T/tmQ55cLiUq4L1/y3LHHdJHH+U+6OJFafly43cMAAAAAHAolFdAfnXsKNWqJU2enPt+Fxdp8WJZbm+ksjMWy+PgcfvmQw5up86q7PRP5BpYVlq5Ku/Fqd5809jXu7d9AwIAAAAAboryCsgvV1fp9delTz4xZmDlxsdH2rRJlk6dFfjOEnl/v8tYBBx257lrv4JmLJbLHU2lbf+VKlTIfeAffxjl1f/9n+Tvb9eMAAAAAICbo7wCCuLxx6V//EMaPlxKS8t9jLe3tGSJNH6C/JdtUNnpi+R+9LR9czoxt5g4Bb6zRAHzV8jy3HPS2rVSUFDug2026YUXpJAQadAg+wYFAAAAAOQL5RVQUO+8I+3fLw0ZkvcYi0V6+WVp92653VZHQdM/UeB7y+T52yFZ0tLtl9VZZFjlEX1MAR+vUtkpH8nDs4wxO27OXOMOgnmZPFn69ltp7k3GAQAAAABM42Z2AKDEadhQ+uIL6ZFHpPr1jVlYeWnUSNq8WVq5Uh4zZ8rjvWWyebgrvUYVZVQIkNXHy1grCwVns8lyNVluf16S24lYWa4mSffcLX38sbF21c2+12XLpJdeMsrIBx6wT2YAAAAAQIFRXgGF0bGjNG2aNHKklJoqjR594/FduhiP06dlWbtW7jt3yv3wYdkuXJAymIlVKBYXWYLKSq2bSXfeKXXoYFz+lx8LF0oDBkhDh3K5IAAAAAA4OMoroLBefNFY4HvwYOngQem99yQPjxsfU7Wq9NxzxkOSxQ4xcQ2bTXrlFeMxdKg0Y4bZiQAAAAAAN8H1SsCtGDBA+uYb6auvpMaNjfWT4Jh27ZJatZKmTpUWLJBmz+aSTQAAAAAoAfjLDbhVDz0k/fKLFBoqde5sXB74009mp0KmPXukp5+Wmjc3Zsbt3Gn8DAAAAAAoEbhsECgKtWoZs682bDDWv7r/fqlOHWNtrLvukmrUkAICzE7pHC5fls6cMQrFdeuk334zFtZfskR64gmz0wEAAAAACojyCihKYWHGzJ4dO6R//1vauFGaN09KSjI7md2kSFos6SlJN1kBrPi4uxt3hWzXTnr7balNG8nCCmMAAAAAUBJRXgHFoVkz4yFJGRlSfLx06ZK5mezkfGysBrVtK9srr6hf9+72D+DvLwUGGgUWAAAAAKDEo7wCipurq1SunPFwAtVCQtT36ac1dd48PTNypNzc+M8MAAAAAKDwWLAdQJEbM2aMTpw4oS+++MLsKAAAAACAEo7yCkCRCwkJ0ZNPPqlJkybJarWaHQcAAAAAUIJRXgEoFuPHj1d0dLRWrVpldhQAAAAAQAlGeQWgWDRs2FCPPvqoXn31VdlsNrPjAAAAAABKKMorAMXmpZde0u7du7V+/XqzowAAAAAASijKKwDFpmnTpmrfvr0mT55sdhQAAAAAQAlFeQWgWI0bN04//PCDfvzxR7OjAAAAAABKIMorAMWqTZs2at26taZMmWJ2FAAAAABACUR5BaDYjR07VmvWrNHOnTvNjgIAAAAAKGEorwAUuw4dOuiee+7R1KlTzY4CAAAAAChhKK8A2MWYMWO0fPly/f7772ZHAQAAAACUIJRXAOziscceU2hoqKZNm2Z2FAAAAABACUJ5BcAuLBaLoqKi9Pnnn+vQoUNmxwEAAAAAlBCUVwDspmfPngoJCdH06dPNjgIAAAAAKCEorwDYjaurq0aMGKGPP/5YJ06cMDsOAAAAAKAEoLwCYFfPPvusKleurJkzZ5odBQAAAABQAlBeAbArd3d3vfDCC/rggw907tw5s+MAAAAAABwc5RUAuxswYID8/Pw0e/Zss6MAAAAAABwc5RUAu/Px8dGwYcP0zjvvKD4+3uw4AAAAAAAHRnkFwBRDhgyRi4uL5syZY3YUAAAAAIADo7wCYIoyZcpo8ODBmjlzphITE82OAwAAAABwUJRXAEzzwgsvKCUlRR9++KHZUQAAAAAADoryCoBpypUrp/79++v1119XcnKy2XEAAAAAAA6I8gqAqUaNGqX4+HgtWLDA7CgAAAAAAAdEeQXAVMHBwXr66ac1depUpaWlmR0HAAAAAOBgKK8AmG7s2LGKiYnR559/bnYUAAAAAICDobwCYLoaNWqoR48emjp1qqxWq9lxAAAAAAAOhPIKgEMYO3asDh48qK+++srsKAAAAAAAB0J5BcAhNGjQQF27dtWkSZNks9nMjgMAAAAAcBCUVwAcxvjx47Vnzx6tXr3a7CgAAAAAAAdBeQXAYTRp0kQdO3bUxIkTzY4CAAAAAHAQlFcAHMqECRO0bds2fffdd2ZHAQAAAAA4AMorAA7l3nvvVdu2bTV58mSzowAAAAAAHADlFQCHM27cOG3YsEE//fST2VEAAAAAACajvALgcMLCwnTfffdp2rRpZkcBAAAAAJiM8gqAQ4qKitJ//vMf7dmzx+woAAAAAAATUV4BcEiPPPKIGjdurKlTp5odBQAAAABgIsorAA7JYrFozJgx+vLLL3Xw4EGz4wAAAAAATEJ5BcBhPfHEE6pduzZrXwEAAACAE6O8AuCwXF1dFRUVpUWLFun48eNmxwEAAAAAmIDyCoBDe+qpp1SlShVNnz7d7CgAAAAAABNQXgFwaO7u7hoxYoTmzZunmJgYs+MAAAAAAOyM8gqAw+vXr5+CgoI0a9Yss6MAAAAAAOyM8gqAw/Py8lJkZKTmzJmjuLg4s+MAAAAAAOyI8gpAiTB48GB5e3trzpw5ZkcBAAAAANgR5RWAEsHX11eDBw/WW2+9pYSEBLPjAAAAAADshPIKQIkxdOhQpaWl6b333jM7CgAAAADATiivAJQYZcuW1T//+U+9+eabSkpKMjsOAAAAAMAOKK8AlCgvvviiLl++rPnz55sdJZvp06fLYrHIYrGoWrVqN90OAAAAAMgfyisAJUqlSpX03HPPadq0aUpNTTU7TpYRI0bIZrOpSZMm+doOAAAAAMgfyisAJU5UVJTOnj2rTz/91OwoAAAAAIBiRnkFoMSpXr26evfurcmTJysjI8PsOAAAAACAYkR5BaBEGjdunI4dO6Yvv/zS7CgAAAAAgGJEeQWgRKpdu7a6deumiRMnymq15jomIiIia7F0i8WiVq1aZe3buHGjLBaL/vOf/2Rti4yMzDY+PT1d6enpWrp0qdq3b6/g4GB5e3urcePGmj17dp7vmx+LFy/O9l4Wi0WxsbGFPh8AAAAAlFaUVwBKrAkTJujAgQP6+uuvc92/YsUKzZkzR5L06aefasuWLVn7Fi9enLU906xZs7R8+XI9+OCDstlscnNz05o1a9SjRw+1a9dO+/fv18mTJzVgwAANHz5cUVFRhc7es2dPDR8+XO3bt9eFCxdks9kUHBxc6PMBAAAAQGlFeQWgxAoNDVXnzp01efLkPMf06NFDHh4eWrRoUda2pKQkrVy5UnXq1NGqVauUkJCQte+TTz5R3759s52jbdu2GjNmjIKCglS+fHn961//Uq9evTR79mxdvny5wLnj4+PVuXNnZWRkaPXq1QoKCirwOQAAAADAWVBeASjRxo8fr+3bt2vDhg257i9btqw6deqk9evXZ12Wt3LlSrVo0UKDBw9WUlKSvvrqK0nShQsX9N1336lr165Zx4eHh2vz5s05ztukSROlpaVp7969BcobHR2tFi1ayMXFRbNmzZKrq2uBjgcAAAAAZ0N5BaBEa968ucLCwm44+6pv377KyMjQZ599JklatGiR+vbtq549e8rV1TXr0sHPP/9c4eHh8vPzyzr20qVLeumll9S4cWMFBQVlrU81cuRISdLVq1fznfXixYuKiIhQtWrVtHr16qxLFwEAAAAAeaO8AlDijRs3Tt999122Na2u1blzZ5UtW1aLFi3S+fPntW3bNkVERKhSpUp66KGHtGnTJsXExGjhwoU5Lhl85JFHNHHiRPXv318HDx6U1WqVzWbTzJkzJUk2my3fOd3c3LRhwwatXLlSjRs3Vv/+/bVjx47Cf3AAAAAAcAKUVwBKvLZt26pVq1aaOnVqrvs9PDzUvXt37d69W+PGjVOXLl3k7e0tSXrqqaeUkZGhl19+WTExMWrXrl3WcRkZGdq6dauCg4M1dOhQVahQQRaLRZKxblZB+fv7q2rVqvLz89OqVavk5+eniIgIxcTEFOJTAwAAAIBzoLwCUCqMGTNG3377rXbt2pXr/qeeekqS9OGHH2abXRURESF/f399+OGH6t27t1xc/v7Poqurq9q2bavY2Fi98cYbiouLU1JSkjZv3qz33nvvlvLWrFlTy5Yt0/nz59W1a1elpKTc0vkAAAAAoLSivAJQKnTq1El33323XnvttVz3t2zZUnXr1lWNGjX0wAMPZG339vbW448/Lkk5LhmUpKVLl2rgwIF6++23VaVKFdWqVUuffPKJevXqJUlq37697rnnHk2fPl0Wi0W//vqrTp8+LYvFovHjx2vJkiU5ts+aNUvbtm1T27ZtlZaWpm3btsnLy0t9+vQphm8GAAAAAEo2i60gC7YApUi/fv104sQJrVu3zuwoKCLLli1T9+7dtWfPHoWGhpodB9fg3xsAAACAQlrLzCsApUbXrl3VsGFDvf7662ZHAQAAAAAUEcorAKWGi4uLRo0apU8//VSHDx82Ow4AAAAAoAhQXgEoVXr37q1atWrpzTffNDsKAAAAAKAIUF4BKFVcXV314osv6uOPP9bp06fNjgMAAAAAuEWUVwBKnWeffVbly5fXjBkzzI4CAAAAALhFlFcASh1PT08NHz5c77//vs6fP292HAAAAADALaC8AlAqDRw4UD4+PnrrrbfMjgIAAAAAuAWUVwBKJV9fXw0dOlRvv/224uPjzY4DAAAAACgkyisApda//vUvWSwWvfvuu2ZHAQAAAAAUEuUVgFIrICBA/+///T+9+eabSkxMNDsOAAAAAKAQKK8AlGovvviiUlJS9NFHH5kdBQAAAABQCJRXAEq1cuXK6fnnn9f06dOVkpJidhwAAAAAQAFRXgEo9UaMGKHz58/rk08+MTsKAAAAAKCAKK8AlHrVqlVT37599dprryk9Pd3sOAAAAACAAqC8AuAURo8erRMnTmjp0qVmRwEAAAAAFADlFQCnEBISou7du2vy5MmyWq1mxwEAAAAA5BPlFQCnMW7cOEVHR2vlypVmRwEAAAAA5BPlFQCn0bBhQ3Xp0kUTJ06UzWYzOw4AAAAAIB8orwA4lQkTJmj37t1au3at2VEAAAAAAPlAeQXAqTRt2lQPPfSQXn31VbOjAAAAAADygfIKgNN5+eWX9fPPP+uHH34wOwoAAAAA4CYorwA4nZYtW6pNmzaaPHmy2VEAAAAAADdBeQXAKY0bN07r1q3Tjh07zI4CAAAAALgByisATumhhx5Ss2bNNGXKFLOjAAAAAABugPIKgNMaO3asVq5cqd9++83sKAAAAACAPFBeAXBaXbp0UaNGjfTaa6+ZHQUAAAAAkAfKKwBOy2KxaPTo0Vq6dKkOHTpkdhwAAAAAQC4orwA4te7duyskJESvv/662VEAAAAAALmgvALg1FxdXTVq1CgtXLhQx48fNzsOAAAAAOA6lFcAnN7TTz+tKlWqaMaMGWZHAQAAAABch/IKgNNzd3fX8OHD9cEHHygmJsbsOAAAAACAa1BeAYCkAQMGKCgoSG+99ZbZUQAAAAAA16C8AgBJXl5eGjp0qObOnauLFy+aHQcAAAAA8BfKKwD4y6BBg+Tq6qp33nnH7CgAAAAAgL9QXgHAX8qUKaMhQ4Zo1qxZSkhIMDsOAAAAAECUVwCQTWRkpNLS0vTBBx+YHQUAAAAAIMorAMimbNmyGjBggKZPn66kpCSz4wAAAACA06O8AoDrjBgxQpcuXdKCBQty7LPZbLJarfYPBQAAAABOivIKAK4THBysZ555Rq+99ppSU1MlSRkZGVqyZInuvPNOHTp0yOSEAAAAAOA8KK8AIBejR49WbGysFi9erI8//lh169ZVr169tGfPHp08edLseAAAAADgNNzMDgAAjqhSpUq67777NHz4cCUkJMhms8lms8nV1VWnTp0yOx4AAAAAOA1mXgHANRITEzV79mxVr15dP/zwgy5fviyr1SqbzSZJcnNzY+YVAAAAANgRM68A4C9Tp07Va6+9pqtXryo9PT3XMVarlZlXAAAAAGBHzLwCgL80btxYSUlJysjIyHNMWlqajh07Zr9QAAAAAODkKK8A4C/h4eFatWqV3Nzc5OKS938eKa8AAAAAwH4orwDgGh06dNCqVavk6uqaZ4F15swZO6cCAAAAAOdFeQUA1+nQoYNWrlyZZ4GVmJiohIQEE5IBAAAAgPOhvAKAXHTs2PGGBRaLtgMAAACAfVBeAUAeblRgUV4BAAAAgH1QXgHADeRWYLm6uurkyZMmJwMAAAAA50B5BQA3cX2B5ebmRnkFAAAAAHZCeQUA+dCxY0d9+eWXcnFxUUpKCpcNAgAAAICduJkdAACK2uXLl7Vjxw7t3btXFy5cUHJycpGd+9FHH9WKFSu0YcMGjR49usjOW9wsFosCAwNVs2ZNNW3aVPXq1TM7EgAAAADkC+UVgFIhLS1NX331lebNm6fvv/9eaWlpqlixoipUqCAvL68ifa+QkBCdOXNGGzZsKNLzFiebzaYLFy7o9OnTSktLU61atdSjRw8NHDhQt912m9nxAAAAACBPlFcASry1a9cqMjJShw4dUnh4uBYsWKB27dopODi42N5z06ZNateuXbGdv7ikpqZq586d+vrrr7Vw4UK9+eabGjZsmCZMmCB/f3+z4wEAAABADqx5BaDEOn/+vLp06aIOHTooNDRUhw4d0ooVK9SrV69iLa4klcjiSpI8PDx03333acqUKTp+/Lhmzpyp+fPnq379+vrqq6/MjgcAAAAAOVBeASiR9u7dqxYtWmjv3r3auHGjli1bplq1apkdq0Rxc3PToEGDdPDgQYWHh6tbt26aOHGibDab2dEAAAAAIAuXDQIocTZu3KiuXbuqSZMm+uqrr1S+fHmzI5VoZcuW1QcffKC7775bQ4YM0cGDB7VgwQK5urqaHQ0AAAAAKK8AlCy//fabHnvsMXXu3FkLFiyQp6en2ZFKjYEDByokJERdunRRUFCQ3nrrLbMjAQAAAACXDQIoOeLi4vTYY4/pzjvvpLgqJu3bt9eiRYs0Z84czZkzx+w4AAAAAEB5BaDk6NOnj1xcXLR8+XKKq2L0+OOPa+LEiYqMjNTu3bvNjgMAAADAyVFeASgRVqxYoXXr1umjjz5SuXLlzI5T6o0ZM0YtW7bUkCFDWMAdAAAAgKkorwA4vJSUFI0aNUq9evVS69atzY7jFCwWi2bNmqWff/5ZS5cuNTsOAAAAACdGeQXA4S1evFgnTpzQa6+9ZnYUp3LXXXepT58+mjRpktlRAAAAADgxyisADm/evHnq1q2bqlWrZnYUpzNs2DDt3btXP/30k9lRAAAAADgpyisADu3cuXPavn27evToYXYUp3TXXXepbt26WrVqldlRAAAAADgpyisADm3Lli2SpLZt25obxImFhYVl/R4AAAAAwN4orwA4tN9//121a9eWn5+f2VGc1h133KG9e/eaHQMAAACAk6K8AuDQzp8/r+DgYLNjOLVKlSopPj5eqampZkcBAAAA4IQorwA4tOTkZHl7e5sdo9glJiaqbt26Cg8PNztKDj4+PpKkpKQkk5MAAAAAcEaUVwDgAGw2m6xWq6xWq9lRAAAAAMChuJkdAAAg+fv768iRI2bHAAAAAACHw8wrAAAAAAAAOCzKKwClyooVK2SxWLIe0dHRevLJJ1WuXLmsbZGRkVmvW7VqlXXsmjVrsraXL18+z3MeO3ZM3bt3V2BgoMqVK6fw8PBss6ZudXxycnKhzpPpwIEDioiIUEBAgHx8fNS8eXN9/fXXCgsLyzpXv379iuPrBwAAAIAiR3kFoFSJiIiQzWZTly5dJEkDBw7UoEGDdPLkSW3btk2urq4aP368bDabfH19sx3boUMH2Ww23X333Tc8Z2RkpCIjI3X69GktXbpUmzZtUs+ePYtsfGHPI0mHDx9Wy5YttXPnTi1btkznzp3Txx9/rNmzZ2vPnj3y9PSUzWbTvHnzbuVrBgAAAAC7obwCUKpFRUWpbdu28vHxUYsWLZSenp5tVlVh9OvXTy1btpSvr6/CwsLUuXNn7dixQ3FxcUUy/lbed+zYsYqPj9fs2bPVvn17+fn5KTQ0VJ999pmuXLlyS58bAAAAAMxAeQWgVGvevHmRn7NZs2bZfq5evbok6cyZM0Uy/lbed82aNZKkhx9+ONvYChUqqEGDBgV6PwAAAABwBJRXAEq16y8NLAoBAQHZfvbw8JAkWa3WIhlf2PdNSUlRQkKCvLy85Ofnl+P4oKCgAr0fAAAAADgCyisATsvFxUWpqak5tsfHx5uQ5tZ5enrK399fycnJSkxMzLH/3LlzJqQCAAAAgFtDeQXAaVWuXFmnT5/Oti02NlYnTpwwKdGt69ixo6S/Lx/MFBsbq4MHD5oRCQAAAABuCeUVAKf10EMP6cyZM3rnnXeUmJioI0eOaNiwYapYsaLZ0QptypQpKlu2rCIjI7V+/XolJibq999/17PPPqvg4GCz4wEAAABAgVFeAShVtm3bJovFopUrV0qSvL29ZbFYch07adIk9evXT1OmTFHFihX1zDPPaOTIkQoODtaff/4pi8Wi0aNH53rO8ePHS5IsFoumTZsmSWratKnCw8MLPH7FihU5xvfp06fA55Gk2rVr6+eff1azZs3UrVs3VapUSQMHDtSYMWNUq1Ytubq6FuG3DQAAAADFz83sAABQlO69917ZbLZ8jQ0ICNCHH36YY/vOnTtzbMvrnI62XZLq1aun5cuX59geExOj8uXL53kcAAAAADgiZl4BQCkSGxursmXLKi0tLdv2Y8eO6ciRI2rXrp1JyQAAAACgcCivAKCUuXjxogYOHKiTJ0/q6tWr2r59u7p3764yZcpowoQJZscDAAAAgAKhvALg0Dw8PJSammp2jBIjODhYGzZsUHx8vNq0aaOgoCA9+uijqlu3rrZv366QkJACnzPz+/fw8CjquAAAAABwU6x5BcChBQUF6cKFC2bHKFEefPBBPfjgg0V2vgsXLsjb21ve3t5Fdk4AAAAAyC9mXgFwaPXq1dPBgweVnp5udhSntX//ftWrV8/sGAAAAACcFOUVAIfWrFkzJScna/v27WZHcVo//PCDmjVrZnYMAAAAAE6K8gqAQ2vYsKFCQkK0YsUKs6M4pdOnT+u///2vOnfubHYUAAAAAE6K8gqAw+vbt68WLFigpKQks6M4nQ8++EDlypVTx44dzY4CAAAAwElRXgFweP/85z+VnJys6dOnmx3FqcTGxmrWrFn617/+JU9PT7PjAAAAAHBSlFcAHF6lSpU0btw4TZ06VcePHzc7jtMYPXq0AgIC9OKLL5odBQAAAIATo7wCUCK88MILqlatmgYPHiyr1Wp2nFJv3bp1+uSTTzRjxgz5+PiYHQcAAACAE6O8AlAieHh4aOHChdq4caNGjRpldpxSbf/+/erevbt69+6tbt26mR0HAAAAgJOjvAJQYrRs2VLz58/XjBkzNHfuXLPjlEoxMTEKDw9XaGio5s2bZ3YcAAAAAJCb2QEAoCB69uypo0ePasiQITp9+rQmTZoki8VidqxSYffu3Xr00Ufl6+ur5cuXs0g7AAAAAIfAzCsAJc7YsWM1f/58TZ8+XU8++aQuXLhgdqQS74svvlDr1q1Vr149/fTTT6pQoYLZkQAAAABAEuUVgBLqmWee0fr167VlyxbVq1dP7777rjIyMsyOVeLs27dP7du3V48ePdS3b1+tXr1aQUFBZscCAAAAgCyUVwBKrDZt2ig6OlrPPvusIiMj1bhxY7399tuKjY01O5pDS0tL08aNG9WrVy81adJEFy9e1JYtWzRnzhy5u7ubHQ8AAAAAsmHNKwAlWpkyZfTGG2+of//+euONNzRmzBgNGzZMoaGhaty4sSpUqCBvb2+zY5rOarXq4sWLOnLkiHbt2qXLly+refPmmj9/vnr37i0XF/5/GQAAAAAcE+UVgFKhXr16+vDDDzV79mxt2rRJW7du1b59+3Ty5EklJSWZHc90FotFgYGBqlOnjrp166YOHTooJCTE7FgAAAAAcFOUVwBKFR8fH4WHhys8PNzsKAAAAACAIsB1IgAAAAAAAHBYlFcAAAAAAABwWJRXAAAAAAAAcFiUVwAAAAAAAHBYlFcAAAAAAABwWJRXAAAAAAAAcFiUVwAAAAAAAHBYlFcAAAAAAABwWG5mBwDMtGXLFoWEhJgdAyj14uLidO+995odAwAAAEAJRHkFp/X444+rTp06ZscAnEatWrXMjgAAAACgBLLYbDab2SEAAAAAAACAXKxlzSsAAAAAAAA4LMorAAAAAAAAOCzKKwAAAAAAADgsyisAAAAAAAA4LMorAAAAAAAAOCzKKwAAAAAAADgsyisAAAAAAAA4LMorAAAAAAAAOCzKKwAAAAAAADgsyisAAAAAAAA4LMorAAAAAAAAOCzKKwAAAAAAADgsyisAAAAAAAA4LMorAAAAAAAAOCzKKwAAAAAAADgsyisAAFAsEhMTZbFYsj1+/vnnmx43cuTIbMdMmjTJDmmzW7JkSdb7e3l53XR8Sf6sAAAAjs5is9lsZocAAACl1+7du9W0aVNJUseOHfXtt9/mOfbPP/9UzZo1lZiYqN69e2vx4sX2ipmrsLAwbdmyRcnJyfkaX1I/a2Jiopo2bar69evr66+/Ni0HAABALtYy8woAABQ7b29vSdDqvQAAB3dJREFU3XbbbVq9erV27tyZ57iZM2eqevXqdkxW9Mz4rH5+fmrVqlWhj7fZbLJarbJarUWSBwAAoChRXgEAgGLn4uKi0aNHS1Kel8bFx8fr3XffVVRUlD2jFbmS+Fn9/f115MiRG84UAwAAMAvlFQAAsItnn31WVatW1apVq7Rnz54c+9966y116tRJtWvXNiFd0XKmzwoAAFDcKK8AAIBdeHp6auTIkbLZbJo8eXK2fYmJiXr77bc1duzYG57jzz//1PDhw1W7dm15eHgoKChIHTt21ObNm29p7IEDBxQREaGAgAD5+vqqdevW2rJli2mfNT09XUuXLlX79u0VHBwsb29vNW7cWLNnz852ad/06dNlsVh05coVbd26NWvhdzc3N0nSihUrsi0IHx0drSeffFLlypXL2jZv3rxsYzLX92rVqlW27X369JFkrAN27fb4+PhCf08AAAD5QXkFAADsZsCAAapUqZKWLVum/fv3Z22fM2eO2rVrp4YNG+Z5bGxsrJo1a6bPPvtMs2fPVlxcnP773//Kx8dHDz74oObNm1eosYcPH1bLli21c+dOLVu2TGfPntXcuXM1ceJEHTlyxJTPumbNGvXo0UPt2rXT/v37dfLkSQ0YMEDDhw/PdqnhiBEjZLPZ5Ovrq/vvv182m002m03p6emSpIiICNlsNnXp0kWSNHDgQA0aNEgnT57Utm3b5OrqmmNMpi1btmj37t3y9fVVkyZN9P7770uSvvnmG7Vo0UKff/65bDabAgMDC/0dAQAA5AflFQAAsBtvb28NHz5cVqtVU6ZMkf5/O/cT0vQfx3H8ZSE6N/1iWWog5MUgWIP+GZEwGDIiI4OEsIhARDCUEUSZYYdBHQp0RFBevNmlEsKDElKX8ixR5Ig8BFlshWujaaafDtJ++pu/1eYv+x6eD9hh+74+3+/nfRsv9pmkr1+/qre3V93d3RnXdnV1aWpqSn19fWpoaFBJSYlqamo0ODioyspKdXZ26uPHj1lnL1++rJmZGYVCIdXX18vlcsntdmtgYEDT09N/ZVZJ8nq96urqUmlpqcrKytTR0aHm5maFQiF9+fIlpz1dvHhRXq9XRUVFqq2t1ffv31VWVvafeY/Ho4GBAU1MTOjMmTMyxqitrU0+n08nT57MaQ8AAADZorwCAADrqr29XZs3b9a9e/f05s0b3b17VwcOHNCuXbsyrhsaGpIkHTlyZMXnBQUF8vl8SiaTGh0dzTo7MjIiSfL7/Suy27ZtU01NTY5TLsl11oaGhlWPN3o8Hs3Pz+vly5c57Wf//v1Zr2lqalJ3d7cePnyoQ4cO6dOnTwoGgzk9HwAAIBeUVwAAYF25XC4FAgEtLCzo6tWrunnzpq5cuZJxzdzcnGKxmAoLC1VcXJx2vby8XNLSccFss/F4XIWFhXK5XGnZrVu35jJiSi6zSlIsFlNPT4/cbrdKS0tT/y914cIFSUu/4MqF0+nMaV0wGFRtba2eP3+upqYmbdjAV0gAALB++OYBAADWXUdHhyzL0uDgoDwej/bu3ZsxX1BQIMuyNDs7q3g8nnb95xHAioqKrLPFxcWanZ1VIpFIy37+/DmX8VbIdlZJOnr0qILBoFpbWxUOh7W4uChjjHp7eyVJxpgV+by8vDXvM5OnT58qFovJ7Xarvb1dExMTf/R5AAAAy1FeAQCAdWdZls6fPy/Lsn7rl0iSdPz4cUlLfxi+3NzcnMbGxuRwOFJH/7LJHj58WNI/xwd/ikajmpyczHKydNnOurCwoGfPnqmiokKdnZ3asmVLqpxKJpOrrikqKtK3b99S73fs2KH+/v41712Spqam1NLSogcPHujRo0dyOBw6duyYIpHI/3J/AACAX6G8AgAAf0VPT49mZmZ08ODB38pfv35d1dXVCgQCGh4eVjweVzgcVnNzs6anpxUKhVJHArPJXrt2TZs2bVIgENDjx4+VSCT06tUrnT59etWjhH961o0bN8rr9erDhw+6ceOGotGoksmknjx5ojt37qy6Zvfu3QqHw3r37p3Gx8f19u1b1dXVrXnfiURCjY2N6uvr086dO7V9+3bdv39f79+/14kTJzQ/P7/mZwAAAPySAQAA+EOcTqeRlHr5/f6M+eXZn69bt26lrkejURMIBEx1dbXJz883lmUZv99vxsbG0u6VTXZyctI0NjaakpIS43A4zL59+8zw8LDx+XypfbS0tKzbrJFIxLS1tZmqqiqTn59vysvLzdmzZ82lS5dS2T179qTu9fr1a1NXV2ecTqepqqoyt2/fNsYYMz4+vupzlhsaGkq7furUKXPu3LkVn7148cJEIpG0bDAYzDgnAADAGo3kGfOvP00AAAAAAAAA7GGUY4MAAAAAAACwLcorAAAAAAAA2BblFQAAAAAAAGyL8goAAAAAAAC2RXkFAAAAAAAA26K8AgAAAAAAgG1RXgEAAAAAAMC2KK8AAAAAAABgW5RXAAAAAAAAsC3KKwAAAAAAANgW5RUAAAAAAABsi/IKAAAAAAAAtkV5BQAAAAAAANuivAIAAAAAAIBt/QBfU4L8gygxGQAAAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# multimodel test\n", "model1 = Matter()\n", "model2 = Matter()\n", "machine = CustomStateMachine(model=[model1, model2], states=states, transitions=transitions, **extra_args)\n", "model1.drink()\n", "model1.drink()\n", "model2.walk()\n", "model1.show_graph()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.1" } }, "nbformat": 4, "nbformat_minor": 1 } transitions-0.9.0/transitions.egg-info/0000755000232200023220000000000014304350474020516 5ustar debalancedebalancetransitions-0.9.0/transitions.egg-info/requires.txt0000644000232200023220000000005214304350474023113 0ustar debalancedebalancesix [diagrams] pygraphviz [test] pytest transitions-0.9.0/transitions.egg-info/PKG-INFO0000644000232200023220000024037314304350474021624 0ustar debalancedebalanceMetadata-Version: 2.1 Name: transitions Version: 0.9.0 Summary: A lightweight, object-oriented Python state machine implementation with many extensions. Home-page: http://github.com/pytransitions/transitions Download-URL: https://github.com/pytransitions/transitions/archive/0.9.0.tar.gz Author: Tal Yarkoni Author-email: tyarkoni@gmail.com Maintainer: Alexander Neumann Maintainer-email: aleneum@gmail.com License: MIT Classifier: License :: OSI Approved :: MIT License Classifier: Programming Language :: Python :: 2 Classifier: Programming Language :: Python :: 2.7 Classifier: Programming Language :: Python :: 3 Classifier: Programming Language :: Python :: 3.3 Classifier: Programming Language :: Python :: 3.4 Classifier: Programming Language :: Python :: 3.5 Classifier: Programming Language :: Python :: 3.6 Classifier: Programming Language :: Python :: 3.7 Classifier: Programming Language :: Python :: 3.8 Description-Content-Type: text/markdown Provides-Extra: diagrams Provides-Extra: test License-File: LICENSE ## Quickstart They say [a good example is worth](https://www.google.com/webhp?ie=UTF-8#q=%22a+good+example+is+worth%22&start=20) 100 pages of API documentation, a million directives, or a thousand words. Well, "they" probably lie... but here's an example anyway: ```python from transitions import Machine import random class NarcolepticSuperhero(object): # Define some states. Most of the time, narcoleptic superheroes are just like # everyone else. Except for... states = ['asleep', 'hanging out', 'hungry', 'sweaty', 'saving the world'] def __init__(self, name): # No anonymous superheroes on my watch! Every narcoleptic superhero gets # a name. Any name at all. SleepyMan. SlumberGirl. You get the idea. self.name = name # What have we accomplished today? self.kittens_rescued = 0 # Initialize the state machine self.machine = Machine(model=self, states=NarcolepticSuperhero.states, initial='asleep') # Add some transitions. We could also define these using a static list of # dictionaries, as we did with states above, and then pass the list to # the Machine initializer as the transitions= argument. # At some point, every superhero must rise and shine. self.machine.add_transition(trigger='wake_up', source='asleep', dest='hanging out') # Superheroes need to keep in shape. self.machine.add_transition('work_out', 'hanging out', 'hungry') # Those calories won't replenish themselves! self.machine.add_transition('eat', 'hungry', 'hanging out') # Superheroes are always on call. ALWAYS. But they're not always # dressed in work-appropriate clothing. self.machine.add_transition('distress_call', '*', 'saving the world', before='change_into_super_secret_costume') # When they get off work, they're all sweaty and disgusting. But before # they do anything else, they have to meticulously log their latest # escapades. Because the legal department says so. self.machine.add_transition('complete_mission', 'saving the world', 'sweaty', after='update_journal') # Sweat is a disorder that can be remedied with water. # Unless you've had a particularly long day, in which case... bed time! self.machine.add_transition('clean_up', 'sweaty', 'asleep', conditions=['is_exhausted']) self.machine.add_transition('clean_up', 'sweaty', 'hanging out') # Our NarcolepticSuperhero can fall asleep at pretty much any time. self.machine.add_transition('nap', '*', 'asleep') def update_journal(self): """ Dear Diary, today I saved Mr. Whiskers. Again. """ self.kittens_rescued += 1 @property def is_exhausted(self): """ Basically a coin toss. """ return random.random() < 0.5 def change_into_super_secret_costume(self): print("Beauty, eh?") ``` There, now you've baked a state machine into `NarcolepticSuperhero`. Let's take him/her/it out for a spin... ```python >>> batman = NarcolepticSuperhero("Batman") >>> batman.state 'asleep' >>> batman.wake_up() >>> batman.state 'hanging out' >>> batman.nap() >>> batman.state 'asleep' >>> batman.clean_up() MachineError: "Can't trigger event clean_up from state asleep!" >>> batman.wake_up() >>> batman.work_out() >>> batman.state 'hungry' # Batman still hasn't done anything useful... >>> batman.kittens_rescued 0 # We now take you live to the scene of a horrific kitten entreement... >>> batman.distress_call() 'Beauty, eh?' >>> batman.state 'saving the world' # Back to the crib. >>> batman.complete_mission() >>> batman.state 'sweaty' >>> batman.clean_up() >>> batman.state 'asleep' # Too tired to shower! # Another productive day, Alfred. >>> batman.kittens_rescued 1 ``` While we cannot read the mind of the actual batman, we surely can visualize the current state of our `NarcolepticSuperhero`. ![batman diagram](https://user-images.githubusercontent.com/205986/104932302-c2f24580-59a7-11eb-8963-5dce738b9305.png) Have a look at the [Diagrams](#diagrams) extensions if you want to know how. ## The non-quickstart ### Basic initialization Getting a state machine up and running is pretty simple. Let's say you have the object `lump` (an instance of class `Matter`), and you want to manage its states: ```python class Matter(object): pass lump = Matter() ``` You can initialize a (_minimal_) working state machine bound to `lump` like this: ```python from transitions import Machine machine = Machine(model=lump, states=['solid', 'liquid', 'gas', 'plasma'], initial='solid') # Lump now has state! lump.state >>> 'solid' ``` I say "minimal", because while this state machine is technically operational, it doesn't actually _do_ anything. It starts in the `'solid'` state, but won't ever move into another state, because no transitions are defined... yet! Let's try again. ```python # The states states=['solid', 'liquid', 'gas', 'plasma'] # And some transitions between states. We're lazy, so we'll leave out # the inverse phase transitions (freezing, condensation, etc.). transitions = [ { 'trigger': 'melt', 'source': 'solid', 'dest': 'liquid' }, { 'trigger': 'evaporate', 'source': 'liquid', 'dest': 'gas' }, { 'trigger': 'sublimate', 'source': 'solid', 'dest': 'gas' }, { 'trigger': 'ionize', 'source': 'gas', 'dest': 'plasma' } ] # Initialize machine = Machine(lump, states=states, transitions=transitions, initial='liquid') # Now lump maintains state... lump.state >>> 'liquid' # And that state can change... lump.evaporate() lump.state >>> 'gas' lump.trigger('ionize') lump.state >>> 'plasma' ``` Notice the shiny new methods attached to the `Matter` instance (`evaporate()`, `ionize()`, etc.). Each method triggers the corresponding transition. You don't have to explicitly define these methods anywhere; the name of each transition is bound to the model passed to the `Machine` initializer (in this case, `lump`). To be more precise, your model **should not** already contain methods with the same name as event triggers since `transitions` will only attach convenience methods to your model if the spot is not already taken. If you want to modify that behaviour, have a look at the [FAQ](examples/Frequently%20asked%20questions.ipynb). Furthermore, there is a method called `trigger` now attached to your model (if it hasn't been there before). This method lets you execute transitions by name in case dynamic triggering is required. ### States The soul of any good state machine (and of many bad ones, no doubt) is a set of states. Above, we defined the valid model states by passing a list of strings to the `Machine` initializer. But internally, states are actually represented as `State` objects. You can initialize and modify States in a number of ways. Specifically, you can: - pass a string to the `Machine` initializer giving the name(s) of the state(s), or - directly initialize each new `State` object, or - pass a dictionary with initialization arguments The following snippets illustrate several ways to achieve the same goal: ```python # import Machine and State class from transitions import Machine, State # Create a list of 3 states to pass to the Machine # initializer. We can mix types; in this case, we # pass one State, one string, and one dict. states = [ State(name='solid'), 'liquid', { 'name': 'gas'} ] machine = Machine(lump, states) # This alternative example illustrates more explicit # addition of states and state callbacks, but the net # result is identical to the above. machine = Machine(lump) solid = State('solid') liquid = State('liquid') gas = State('gas') machine.add_states([solid, liquid, gas]) ``` States are initialized _once_ when added to the machine and will persist until they are removed from it. In other words: if you alter the attributes of a state object, this change will NOT be reset the next time you enter that state. Have a look at how to [extend state features](#state-features) in case you require some other behaviour. #### Callbacks A `State` can also be associated with a list of `enter` and `exit` callbacks, which are called whenever the state machine enters or leaves that state. You can specify callbacks during initialization by passing them to a `State` object constructor, in a state property dictionary, or add them later. For convenience, whenever a new `State` is added to a `Machine`, the methods `on_enter_«state name»` and `on_exit_«state name»` are dynamically created on the Machine (not on the model!), which allow you to dynamically add new enter and exit callbacks later if you need them. ```python # Our old Matter class, now with a couple of new methods we # can trigger when entering or exit states. class Matter(object): def say_hello(self): print("hello, new state!") def say_goodbye(self): print("goodbye, old state!") lump = Matter() # Same states as above, but now we give StateA an exit callback states = [ State(name='solid', on_exit=['say_goodbye']), 'liquid', { 'name': 'gas', 'on_exit': ['say_goodbye']} ] machine = Machine(lump, states=states) machine.add_transition('sublimate', 'solid', 'gas') # Callbacks can also be added after initialization using # the dynamically added on_enter_ and on_exit_ methods. # Note that the initial call to add the callback is made # on the Machine and not on the model. machine.on_enter_gas('say_hello') # Test out the callbacks... machine.set_state('solid') lump.sublimate() >>> 'goodbye, old state!' >>> 'hello, new state!' ``` Note that `on_enter_«state name»` callback will _not_ fire when a Machine is first initialized. For example if you have an `on_enter_A()` callback defined, and initialize the `Machine` with `initial='A'`, `on_enter_A()` will not be fired until the next time you enter state `A`. (If you need to make sure `on_enter_A()` fires at initialization, you can simply create a dummy initial state and then explicitly call `to_A()` inside the `__init__` method.) In addition to passing in callbacks when initializing a `State`, or adding them dynamically, it's also possible to define callbacks in the model class itself, which may increase code clarity. For example: ```python class Matter(object): def say_hello(self): print("hello, new state!") def say_goodbye(self): print("goodbye, old state!") def on_enter_A(self): print("We've just entered state A!") lump = Matter() machine = Machine(lump, states=['A', 'B', 'C']) ``` Now, any time `lump` transitions to state `A`, the `on_enter_A()` method defined in the `Matter` class will fire. #### Checking state You can always check the current state of the model by either: - inspecting the `.state` attribute, or - calling `is_«state name»()` And if you want to retrieve the actual `State` object for the current state, you can do that through the `Machine` instance's `get_state()` method. ```python lump.state >>> 'solid' lump.is_gas() >>> False lump.is_solid() >>> True machine.get_state(lump.state).name >>> 'solid' ``` If you'd like you can choose your own state attribute name by passing the `model_attribute` argument while initializing the `Machine`. This will also change the name of `is_«state name»()` to `is_«model_attribute»_«state name»()` though. Similarly, auto transitions will be named `to_«model_attribute»_«state name»()` instead of `to_«state name»()`. This is done to allow multiple machines to work on the same model with individual state attribute names. ```python lump = Matter() machine = Machine(lump, states=['solid', 'liquid', 'gas'], model_attribute='matter_state', initial='solid') lump.matter_state >>> 'solid' # with a custom 'model_attribute', states can also be checked like this: lump.is_matter_state_solid() >>> True lump.to_matter_state_gas() >>> True ``` #### Enumerations So far we have seen how we can give state names and use these names to work with our state machine. If you favour stricter typing and more IDE code completion (or you just can't type 'sesquipedalophobia' any longer because the word scares you) using [Enumerations](https://docs.python.org/3/library/enum.html) might be what you are looking for: ```python import enum # Python 2.7 users need to have 'enum34' installed from transitions import Machine class States(enum.Enum): ERROR = 0 RED = 1 YELLOW = 2 GREEN = 3 transitions = [['proceed', States.RED, States.YELLOW], ['proceed', States.YELLOW, States.GREEN], ['error', '*', States.ERROR]] m = Machine(states=States, transitions=transitions, initial=States.RED) assert m.is_RED() assert m.state is States.RED state = m.get_state(States.RED) # get transitions.State object print(state.name) # >>> RED m.proceed() m.proceed() assert m.is_GREEN() m.error() assert m.state is States.ERROR ``` You can mix enums and strings if you like (e.g. `[States.RED, 'ORANGE', States.YELLOW, States.GREEN]`) but note that internally, `transitions` will still handle states by name (`enum.Enum.name`). Thus, it is not possible to have the states `'GREEN'` and `States.GREEN` at the same time. ### Transitions Some of the above examples already illustrate the use of transitions in passing, but here we'll explore them in more detail. As with states, each transition is represented internally as its own object – an instance of class `Transition`. The quickest way to initialize a set of transitions is to pass a dictionary, or list of dictionaries, to the `Machine` initializer. We already saw this above: ```python transitions = [ { 'trigger': 'melt', 'source': 'solid', 'dest': 'liquid' }, { 'trigger': 'evaporate', 'source': 'liquid', 'dest': 'gas' }, { 'trigger': 'sublimate', 'source': 'solid', 'dest': 'gas' }, { 'trigger': 'ionize', 'source': 'gas', 'dest': 'plasma' } ] machine = Machine(model=Matter(), states=states, transitions=transitions) ``` Defining transitions in dictionaries has the benefit of clarity, but can be cumbersome. If you're after brevity, you might choose to define transitions using lists. Just make sure that the elements in each list are in the same order as the positional arguments in the `Transition` initialization (i.e., `trigger`, `source`, `destination`, etc.). The following list-of-lists is functionally equivalent to the list-of-dictionaries above: ```python transitions = [ ['melt', 'solid', 'liquid'], ['evaporate', 'liquid', 'gas'], ['sublimate', 'solid', 'gas'], ['ionize', 'gas', 'plasma'] ] ``` Alternatively, you can add transitions to a `Machine` after initialization: ```python machine = Machine(model=lump, states=states, initial='solid') machine.add_transition('melt', source='solid', dest='liquid') ``` The `trigger` argument defines the name of the new triggering method that gets attached to the base model. When this method is called, it will try to execute the transition: ```python >>> lump.melt() >>> lump.state 'liquid' ``` By default, calling an invalid trigger will raise an exception: ```python >>> lump.to_gas() >>> # This won't work because only objects in a solid state can melt >>> lump.melt() transitions.core.MachineError: "Can't trigger event melt from state gas!" ``` This behavior is generally desirable, since it helps alert you to problems in your code. But in some cases, you might want to silently ignore invalid triggers. You can do this by setting `ignore_invalid_triggers=True` (either on a state-by-state basis, or globally for all states): ```python >>> # Globally suppress invalid trigger exceptions >>> m = Machine(lump, states, initial='solid', ignore_invalid_triggers=True) >>> # ...or suppress for only one group of states >>> states = ['new_state1', 'new_state2'] >>> m.add_states(states, ignore_invalid_triggers=True) >>> # ...or even just for a single state. Here, exceptions will only be suppressed when the current state is A. >>> states = [State('A', ignore_invalid_triggers=True), 'B', 'C'] >>> m = Machine(lump, states) >>> # ...this can be inverted as well if just one state should raise an exception >>> # since the machine's global value is not applied to a previously initialized state. >>> states = ['A', 'B', State('C')] # the default value for 'ignore_invalid_triggers' is False >>> m = Machine(lump, states, ignore_invalid_triggers=True) ``` If you need to know which transitions are valid from a certain state, you can use `get_triggers`: ```python m.get_triggers('solid') >>> ['melt', 'sublimate'] m.get_triggers('liquid') >>> ['evaporate'] m.get_triggers('plasma') >>> [] # you can also query several states at once m.get_triggers('solid', 'liquid', 'gas', 'plasma') >>> ['melt', 'evaporate', 'sublimate', 'ionize'] ``` #### Automatic transitions for all states In addition to any transitions added explicitly, a `to_«state»()` method is created automatically whenever a state is added to a `Machine` instance. This method transitions to the target state no matter which state the machine is currently in: ```python lump.to_liquid() lump.state >>> 'liquid' lump.to_solid() lump.state >>> 'solid' ``` If you desire, you can disable this behavior by setting `auto_transitions=False` in the `Machine` initializer. #### Transitioning from multiple states A given trigger can be attached to multiple transitions, some of which can potentially begin or end in the same state. For example: ```python machine.add_transition('transmogrify', ['solid', 'liquid', 'gas'], 'plasma') machine.add_transition('transmogrify', 'plasma', 'solid') # This next transition will never execute machine.add_transition('transmogrify', 'plasma', 'gas') ``` In this case, calling `transmogrify()` will set the model's state to `'solid'` if it's currently `'plasma'`, and set it to `'plasma'` otherwise. (Note that only the _first_ matching transition will execute; thus, the transition defined in the last line above won't do anything.) You can also make a trigger cause a transition from _all_ states to a particular destination by using the `'*'` wildcard: ```python machine.add_transition('to_liquid', '*', 'liquid') ``` Note that wildcard transitions will only apply to states that exist at the time of the add_transition() call. Calling a wildcard-based transition when the model is in a state added after the transition was defined will elicit an invalid transition message, and will not transition to the target state. #### Reflexive transitions from multiple states A reflexive trigger (trigger that has the same state as source and destination) can easily be added specifying `=` as destination. This is handy if the same reflexive trigger should be added to multiple states. For example: ```python machine.add_transition('touch', ['liquid', 'gas', 'plasma'], '=', after='change_shape') ``` This will add reflexive transitions for all three states with `touch()` as trigger and with `change_shape` executed after each trigger. #### Internal transitions In contrast to reflexive transitions, internal transitions will never actually leave the state. This means that transition-related callbacks such as `before` or `after` will be processed while state-related callbacks `exit` or `enter` will not. To define a transition to be internal, set the destination to `None`. ```python machine.add_transition('internal', ['liquid', 'gas'], None, after='change_shape') ``` #### Ordered transitions A common desire is for state transitions to follow a strict linear sequence. For instance, given states `['A', 'B', 'C']`, you might want valid transitions for `A` → `B`, `B` → `C`, and `C` → `A` (but no other pairs). To facilitate this behavior, Transitions provides an `add_ordered_transitions()` method in the `Machine` class: ```python states = ['A', 'B', 'C'] # See the "alternative initialization" section for an explanation of the 1st argument to init machine = Machine(states=states, initial='A') machine.add_ordered_transitions() machine.next_state() print(machine.state) >>> 'B' # We can also define a different order of transitions machine = Machine(states=states, initial='A') machine.add_ordered_transitions(['A', 'C', 'B']) machine.next_state() print(machine.state) >>> 'C' # Conditions can be passed to 'add_ordered_transitions' as well # If one condition is passed, it will be used for all transitions machine = Machine(states=states, initial='A') machine.add_ordered_transitions(conditions='check') # If a list is passed, it must contain exactly as many elements as the # machine contains states (A->B, ..., X->A) machine = Machine(states=states, initial='A') machine.add_ordered_transitions(conditions=['check_A2B', ..., 'check_X2A']) # Conditions are always applied starting from the initial state machine = Machine(states=states, initial='B') machine.add_ordered_transitions(conditions=['check_B2C', ..., 'check_A2B']) # With `loop=False`, the transition from the last state to the first state will be omitted (e.g. C->A) # When you also pass conditions, you need to pass one condition less (len(states)-1) machine = Machine(states=states, initial='A') machine.add_ordered_transitions(loop=False) machine.next_state() machine.next_state() machine.next_state() # transitions.core.MachineError: "Can't trigger event next_state from state C!" ``` #### Queued transitions The default behaviour in Transitions is to process events instantly. This means events within an `on_enter` method will be processed _before_ callbacks bound to `after` are called. ```python def go_to_C(): global machine machine.to_C() def after_advance(): print("I am in state B now!") def entering_C(): print("I am in state C now!") states = ['A', 'B', 'C'] machine = Machine(states=states, initial='A') # we want a message when state transition to B has been completed machine.add_transition('advance', 'A', 'B', after=after_advance) # call transition from state B to state C machine.on_enter_B(go_to_C) # we also want a message when entering state C machine.on_enter_C(entering_C) machine.advance() >>> 'I am in state C now!' >>> 'I am in state B now!' # what? ``` The execution order of this example is ``` prepare -> before -> on_enter_B -> on_enter_C -> after. ``` If queued processing is enabled, a transition will be finished before the next transition is triggered: ```python machine = Machine(states=states, queued=True, initial='A') ... machine.advance() >>> 'I am in state B now!' >>> 'I am in state C now!' # That's better! ``` This results in ``` prepare -> before -> on_enter_B -> queue(to_C) -> after -> on_enter_C. ``` **Important note:** when processing events in a queue, the trigger call will _always_ return `True`, since there is no way to determine at queuing time whether a transition involving queued calls will ultimately complete successfully. This is true even when only a single event is processed. ```python machine.add_transition('jump', 'A', 'C', conditions='will_fail') ... # queued=False machine.jump() >>> False # queued=True machine.jump() >>> True ``` When a model is removed from the machine, `transitions` will also remove all related events from the queue. ```python class Model: def on_enter_B(self): self.to_C() # add event to queue ... self.machine.remove_model(self) # aaaand it's gone ``` #### Conditional transitions Sometimes you only want a particular transition to execute if a specific condition occurs. You can do this by passing a method, or list of methods, in the `conditions` argument: ```python # Our Matter class, now with a bunch of methods that return booleans. class Matter(object): def is_flammable(self): return False def is_really_hot(self): return True machine.add_transition('heat', 'solid', 'gas', conditions='is_flammable') machine.add_transition('heat', 'solid', 'liquid', conditions=['is_really_hot']) ``` In the above example, calling `heat()` when the model is in state `'solid'` will transition to state `'gas'` if `is_flammable` returns `True`. Otherwise, it will transition to state `'liquid'` if `is_really_hot` returns `True`. For convenience, there's also an `'unless'` argument that behaves exactly like conditions, but inverted: ```python machine.add_transition('heat', 'solid', 'gas', unless=['is_flammable', 'is_really_hot']) ``` In this case, the model would transition from solid to gas whenever `heat()` fires, provided that both `is_flammable()` and `is_really_hot()` return `False`. Note that condition-checking methods will passively receive optional arguments and/or data objects passed to triggering methods. For instance, the following call: ```python lump.heat(temp=74) # equivalent to lump.trigger('heat', temp=74) ``` ... would pass the `temp=74` optional kwarg to the `is_flammable()` check (possibly wrapped in an `EventData` instance). For more on this, see the [Passing data](#passing-data) section below. #### Check transitions If you want to check whether a transition is possible before you execute it ('look before you leap'), you can use `may_` convenience functions that have been attached to your model: ```python # check if the current temperature is hot enough to trigger a transition if lump.may_heat(): lump.heat() ``` This will execute all `prepare` callbacks and evaluate the conditions assigned to the potential transitions. Transition checks can also be used when a transition's destination is not available (yet): ```python machine.add_transition('elevate', 'solid', 'spiritual') assert not lump.may_elevate() # not ready yet :( ``` #### Callbacks You can attach callbacks to transitions as well as states. Every transition has `'before'` and `'after'` attributes that contain a list of methods to call before and after the transition executes: ```python class Matter(object): def make_hissing_noises(self): print("HISSSSSSSSSSSSSSSS") def disappear(self): print("where'd all the liquid go?") transitions = [ { 'trigger': 'melt', 'source': 'solid', 'dest': 'liquid', 'before': 'make_hissing_noises'}, { 'trigger': 'evaporate', 'source': 'liquid', 'dest': 'gas', 'after': 'disappear' } ] lump = Matter() machine = Machine(lump, states, transitions=transitions, initial='solid') lump.melt() >>> "HISSSSSSSSSSSSSSSS" lump.evaporate() >>> "where'd all the liquid go?" ``` There is also a `'prepare'` callback that is executed as soon as a transition starts, before any `'conditions'` are checked or other callbacks are executed. ```python class Matter(object): heat = False attempts = 0 def count_attempts(self): self.attempts += 1 def heat_up(self): self.heat = random.random() < 0.25 def stats(self): print('It took you %i attempts to melt the lump!' %self.attempts) @property def is_really_hot(self): return self.heat states=['solid', 'liquid', 'gas', 'plasma'] transitions = [ { 'trigger': 'melt', 'source': 'solid', 'dest': 'liquid', 'prepare': ['heat_up', 'count_attempts'], 'conditions': 'is_really_hot', 'after': 'stats'}, ] lump = Matter() machine = Machine(lump, states, transitions=transitions, initial='solid') lump.melt() lump.melt() lump.melt() lump.melt() >>> "It took you 4 attempts to melt the lump!" ``` Note that `prepare` will not be called unless the current state is a valid source for the named transition. Default actions meant to be executed before or after _every_ transition can be passed to `Machine` during initialization with `before_state_change` and `after_state_change` respectively: ```python class Matter(object): def make_hissing_noises(self): print("HISSSSSSSSSSSSSSSS") def disappear(self): print("where'd all the liquid go?") states=['solid', 'liquid', 'gas', 'plasma'] lump = Matter() m = Machine(lump, states, before_state_change='make_hissing_noises', after_state_change='disappear') lump.to_gas() >>> "HISSSSSSSSSSSSSSSS" >>> "where'd all the liquid go?" ``` There are also two keywords for callbacks which should be executed _independently_ a) of how many transitions are possible, b) if any transition succeeds and c) even if an error is raised during the execution of some other callback. Callbacks passed to `Machine` with `prepare_event` will be executed _once_ before processing possible transitions (and their individual `prepare` callbacks) takes place. Callbacks of `finalize_event` will be executed regardless of the success of the processed transitions. Note that if an error occurred it will be attached to `event_data` as `error` and can be retrieved with `send_event=True`. ```python from transitions import Machine class Matter(object): def raise_error(self, event): raise ValueError("Oh no") def prepare(self, event): print("I am ready!") def finalize(self, event): print("Result: ", type(event.error), event.error) states=['solid', 'liquid', 'gas', 'plasma'] lump = Matter() m = Machine(lump, states, prepare_event='prepare', before_state_change='raise_error', finalize_event='finalize', send_event=True) try: lump.to_gas() except ValueError: pass print(lump.state) # >>> I am ready! # >>> Result: Oh no # >>> initial ``` Sometimes things just don't work out as intended and we need to handle exceptions and clean up the mess to keep things going. We can pass callbacks to `on_exception` to do this: ```python from transitions import Machine class Matter(object): def raise_error(self, event): raise ValueError("Oh no") def handle_error(self, event): print("Fixing things ...") del event.error # it did not happen if we cannot see it ... states=['solid', 'liquid', 'gas', 'plasma'] lump = Matter() m = Machine(lump, states, before_state_change='raise_error', on_exception='handle_error', send_event=True) try: lump.to_gas() except ValueError: pass print(lump.state) # >>> Fixing things ... # >>> initial ``` ### Callable resolution As you have probably already realized, the standard way of passing callables to states, conditions and transitions is by name. When processing callbacks and conditions, `transitions` will use their name to retrieve the related callable from the model. If the method cannot be retrieved and it contains dots, `transitions` will treat the name as a path to a module function and try to import it. Alternatively, you can pass names of properties or attributes. They will be wrapped into functions but cannot receive event data for obvious reasons. You can also pass callables such as (bound) functions directly. As mentioned earlier, you can also pass lists/tuples of callables names to the callback parameters. Callbacks will be executed in the order they were added. ```python from transitions import Machine from mod import imported_func import random class Model(object): def a_callback(self): imported_func() @property def a_property(self): """ Basically a coin toss. """ return random.random() < 0.5 an_attribute = False model = Model() machine = Machine(model=model, states=['A'], initial='A') machine.add_transition('by_name', 'A', 'A', conditions='a_property', after='a_callback') machine.add_transition('by_reference', 'A', 'A', unless=['a_property', 'an_attribute'], after=model.a_callback) machine.add_transition('imported', 'A', 'A', after='mod.imported_func') model.by_name() model.by_reference() model.imported() ``` The callable resolution is done in `Machine.resolve_callable`. This method can be overridden in case more complex callable resolution strategies are required. **Example** ```python class CustomMachine(Machine): @staticmethod def resolve_callable(func, event_data): # manipulate arguments here and return func, or super() if no manipulation is done. super(CustomMachine, CustomMachine).resolve_callable(func, event_data) ``` ### Callback execution order In summary, there are currently three ways to trigger events. You can call a model's convenience functions like `lump.melt()`, execute triggers by name such as `lump.trigger("melt")` or dispatch events on multiple models with `machine.dispatch("melt")` (see section about multiple models in [alternative initialization patterns](#alternative-initialization-patterns)). Callbacks on transitions are then executed in the following order: | Callback | Current State | Comments | | ------------------------------- | :------------------: | ------------------------------------------------------------------------------------------- | | `'machine.prepare_event'` | `source` | executed _once_ before individual transitions are processed | | `'transition.prepare'` | `source` | executed as soon as the transition starts | | `'transition.conditions'` | `source` | conditions _may_ fail and halt the transition | | `'transition.unless'` | `source` | conditions _may_ fail and halt the transition | | `'machine.before_state_change'` | `source` | default callbacks declared on model | | `'transition.before'` | `source` | | | `'state.on_exit'` | `source` | callbacks declared on the source state | | `` | | | | `'state.on_enter'` | `destination` | callbacks declared on the destination state | | `'transition.after'` | `destination` | | | `'machine.after_state_change'` | `destination` | default callbacks declared on model | | `'machine.on_exception'` | `source/destination` | callbacks will be executed when an exception has been raised | | `'machine.finalize_event'` | `source/destination` | callbacks will be executed even if no transition took place or an exception has been raised | If any callback raises an exception, the processing of callbacks is not continued. This means that when an error occurs before the transition (in `state.on_exit` or earlier), it is halted. In case there is a raise after the transition has been conducted (in `state.on_enter` or later), the state change persists and no rollback is happening. Callbacks specified in `machine.finalize_event` will always be executed unless the exception is raised by a finalizing callback itself. Note that each callback sequence has to be finished before the next stage is executed. Blocking callbacks will halt the execution order and therefore block the `trigger` or `dispatch` call itself. If you want callbacks to be executed in parallel, you could have a look at the [extensions](#extensions) `AsyncMachine` for asynchronous processing or `LockedMachine` for threading. ### Passing data Sometimes you need to pass the callback functions registered at machine initialization some data that reflects the model's current state. Transitions allows you to do this in two different ways. First (the default), you can pass any positional or keyword arguments directly to the trigger methods (created when you call `add_transition()`): ```python class Matter(object): def __init__(self): self.set_environment() def set_environment(self, temp=0, pressure=101.325): self.temp = temp self.pressure = pressure def print_temperature(self): print("Current temperature is %d degrees celsius." % self.temp) def print_pressure(self): print("Current pressure is %.2f kPa." % self.pressure) lump = Matter() machine = Machine(lump, ['solid', 'liquid'], initial='solid') machine.add_transition('melt', 'solid', 'liquid', before='set_environment') lump.melt(45) # positional arg; # equivalent to lump.trigger('melt', 45) lump.print_temperature() >>> 'Current temperature is 45 degrees celsius.' machine.set_state('solid') # reset state so we can melt again lump.melt(pressure=300.23) # keyword args also work lump.print_pressure() >>> 'Current pressure is 300.23 kPa.' ``` You can pass any number of arguments you like to the trigger. There is one important limitation to this approach: every callback function triggered by the state transition must be able to handle _all_ of the arguments. This may cause problems if the callbacks each expect somewhat different data. To get around this, Transitions supports an alternate method for sending data. If you set `send_event=True` at `Machine` initialization, all arguments to the triggers will be wrapped in an `EventData` instance and passed on to every callback. (The `EventData` object also maintains internal references to the source state, model, transition, machine, and trigger associated with the event, in case you need to access these for anything.) ```python class Matter(object): def __init__(self): self.temp = 0 self.pressure = 101.325 # Note that the sole argument is now the EventData instance. # This object stores positional arguments passed to the trigger method in the # .args property, and stores keywords arguments in the .kwargs dictionary. def set_environment(self, event): self.temp = event.kwargs.get('temp', 0) self.pressure = event.kwargs.get('pressure', 101.325) def print_pressure(self): print("Current pressure is %.2f kPa." % self.pressure) lump = Matter() machine = Machine(lump, ['solid', 'liquid'], send_event=True, initial='solid') machine.add_transition('melt', 'solid', 'liquid', before='set_environment') lump.melt(temp=45, pressure=1853.68) # keyword args lump.print_pressure() >>> 'Current pressure is 1853.68 kPa.' ``` ### Alternative initialization patterns In all of the examples so far, we've attached a new `Machine` instance to a separate model (`lump`, an instance of class `Matter`). While this separation keeps things tidy (because you don't have to monkey patch a whole bunch of new methods into the `Matter` class), it can also get annoying, since it requires you to keep track of which methods are called on the state machine, and which ones are called on the model that the state machine is bound to (e.g., `lump.on_enter_StateA()` vs. `machine.add_transition()`). Fortunately, Transitions is flexible, and supports two other initialization patterns. First, you can create a standalone state machine that doesn't require another model at all. Simply omit the model argument during initialization: ```python machine = Machine(states=states, transitions=transitions, initial='solid') machine.melt() machine.state >>> 'liquid' ``` If you initialize the machine this way, you can then attach all triggering events (like `evaporate()`, `sublimate()`, etc.) and all callback functions directly to the `Machine` instance. This approach has the benefit of consolidating all of the state machine functionality in one place, but can feel a little bit unnatural if you think state logic should be contained within the model itself rather than in a separate controller. An alternative (potentially better) approach is to have the model inherit from the `Machine` class. Transitions is designed to support inheritance seamlessly. (just be sure to override class `Machine`'s `__init__` method!): ```python class Matter(Machine): def say_hello(self): print("hello, new state!") def say_goodbye(self): print("goodbye, old state!") def __init__(self): states = ['solid', 'liquid', 'gas'] Machine.__init__(self, states=states, initial='solid') self.add_transition('melt', 'solid', 'liquid') lump = Matter() lump.state >>> 'solid' lump.melt() lump.state >>> 'liquid' ``` Here you get to consolidate all state machine functionality into your existing model, which often feels more natural than sticking all of the functionality we want in a separate standalone `Machine` instance. A machine can handle multiple models which can be passed as a list like `Machine(model=[model1, model2, ...])`. In cases where you want to add models _as well as_ the machine instance itself, you can pass the class variable placeholder (string) `Machine.self_literal` during initialization like `Machine(model=[Machine.self_literal, model1, ...])`. You can also create a standalone machine, and register models dynamically via `machine.add_model` by passing `model=None` to the constructor. Furthermore, you can use `machine.dispatch` to trigger events on all currently added models. Remember to call `machine.remove_model` if machine is long-lasting and your models are temporary and should be garbage collected: ```python class Matter(): pass lump1 = Matter() lump2 = Matter() # setting 'model' to None or passing an empty list will initialize the machine without a model machine = Machine(model=None, states=states, transitions=transitions, initial='solid') machine.add_model(lump1) machine.add_model(lump2, initial='liquid') lump1.state >>> 'solid' lump2.state >>> 'liquid' # custom events as well as auto transitions can be dispatched to all models machine.dispatch("to_plasma") lump1.state >>> 'plasma' assert lump1.state == lump2.state machine.remove_model([lump1, lump2]) del lump1 # lump1 is garbage collected del lump2 # lump2 is garbage collected ``` If you don't provide an initial state in the state machine constructor, `transitions` will create and add a default state called `'initial'`. If you do not want a default initial state, you can pass `initial=None`. However, in this case you need to pass an initial state every time you add a model. ```python machine = Machine(model=None, states=states, transitions=transitions, initial=None) machine.add_model(Matter()) >>> "MachineError: No initial state configured for machine, must specify when adding model." machine.add_model(Matter(), initial='liquid') ``` Models with multiple states could attach multiple machines using different `model_attribute` values. As mentioned in [Checking state](#checking-state), this will add custom `is/to__` functions: ```python lump = Matter() matter_machine = Machine(lump, states=['solid', 'liquid', 'gas'], initial='solid') # add a second machine to the same model but assign a different state attribute shipment_machine = Machine(lump, states=['delivered', 'shipping'], initial='delivered', model_attribute='shipping_state') lump.state >>> 'solid' lump.is_solid() # check the default field >>> True lump.shipping_state >>> 'delivered' lump.is_shipping_state_delivered() # check the custom field. >>> True lump.to_shipping_state_shipping() >>> True lump.is_shipping_state_delivered() >>> False ``` ### Logging Transitions includes very rudimentary logging capabilities. A number of events – namely, state changes, transition triggers, and conditional checks – are logged as INFO-level events using the standard Python `logging` module. This means you can easily configure logging to standard output in a script: ```python # Set up logging; The basic log level will be DEBUG import logging logging.basicConfig(level=logging.DEBUG) # Set transitions' log level to INFO; DEBUG messages will be omitted logging.getLogger('transitions').setLevel(logging.INFO) # Business as usual machine = Machine(states=states, transitions=transitions, initial='solid') ... ``` ### (Re-)Storing machine instances Machines are picklable and can be stored and loaded with `pickle`. For Python 3.3 and earlier `dill` is required. ```python import dill as pickle # only required for Python 3.3 and earlier m = Machine(states=['A', 'B', 'C'], initial='A') m.to_B() m.state >>> B # store the machine dump = pickle.dumps(m) # load the Machine instance again m2 = pickle.loads(dump) m2.state >>> B m2.states.keys() >>> ['A', 'B', 'C'] ``` ### Extensions Even though the core of transitions is kept lightweight, there are a variety of MixIns to extend its functionality. Currently supported are: - **Diagrams** to visualize the current state of a machine - **Hierarchical State Machines** for nesting and reuse - **Threadsafe Locks** for parallel execution - **Async callbacks** for asynchronous execution - **Custom States** for extended state-related behaviour There are two mechanisms to retrieve a state machine instance with the desired features enabled. The first approach makes use of the convenience `factory` with the four parameters `graph`, `nested`, `locked` or `asyncio` set to `True` if the feature is required: ```python from transitions.extensions import MachineFactory # create a machine with mixins diagram_cls = MachineFactory.get_predefined(graph=True) nested_locked_cls = MachineFactory.get_predefined(nested=True, locked=True) async_machine_cls = MachineFactory.get_predefined(asyncio=True) # create instances from these classes # instances can be used like simple machines machine1 = diagram_cls(model, state, transitions) machine2 = nested_locked_cls(model, state, transitions) ``` This approach targets experimental use since in this case the underlying classes do not have to be known. However, classes can also be directly imported from `transitions.extensions`. The naming scheme is as follows: | | Diagrams | Nested | Locked | Asyncio | | -----------------------------: | :------: | :----: | :----: | :-----: | | Machine | ✘ | ✘ | ✘ | ✘ | | GraphMachine | ✓ | ✘ | ✘ | ✘ | | HierarchicalMachine | ✘ | ✓ | ✘ | ✘ | | LockedMachine | ✘ | ✘ | ✓ | ✘ | | HierarchicalGraphMachine | ✓ | ✓ | ✘ | ✘ | | LockedGraphMachine | ✓ | ✘ | ✓ | ✘ | | LockedHierarchicalMachine | ✘ | ✓ | ✓ | ✘ | | LockedHierarchicalGraphMachine | ✓ | ✓ | ✓ | ✘ | | AsyncMachine | ✘ | ✘ | ✘ | ✓ | | AsyncGraphMachine | ✓ | ✘ | ✘ | ✓ | | HierarchicalAsyncMachine | ✘ | ✓ | ✘ | ✓ | | HierarchicalAsyncGraphMachine | ✓ | ✓ | ✘ | ✓ | To use a feature-rich state machine, one could write: ```python from transitions.extensions import LockedHierarchicalGraphMachine as LHGMachine machine = LHGMachine(model, states, transitions) ``` #### Diagrams Additional Keywords: - `title` (optional): Sets the title of the generated image. - `show_conditions` (default False): Shows conditions at transition edges - `show_auto_transitions` (default False): Shows auto transitions in graph - `show_state_attributes` (default False): Show callbacks (enter, exit), tags and timeouts in graph Transitions can generate basic state diagrams displaying all valid transitions between states. To use the graphing functionality, you'll need to have `graphviz` and/or `pygraphviz` installed: To generate graphs with the package `graphviz`, you need to install [Graphviz](https://graphviz.org/) manually or via a package manager. sudo apt-get install graphviz graphviz-dev # Ubuntu and Debian brew install graphviz # MacOS conda install graphviz python-graphviz # (Ana)conda Now you can install the actual Python packages pip install graphviz pygraphviz # install graphviz and/or pygraphviz manually... pip install transitions[diagrams] # ... or install transitions with 'diagrams' extras which currently depends on pygraphviz Currently, `GraphMachine` will use `pygraphviz` when available and fall back to `graphviz` when `pygraphviz` cannot be found. This can be overridden by passing `use_pygraphviz=False` to the constructor. Note that this default might change in the future and `pygraphviz` support may be dropped. With `Model.get_graph()` you can get the current graph or the region of interest (roi) and draw it like this: ```python # import transitions from transitions.extensions import GraphMachine m = Model() # without further arguments pygraphviz will be used machine = GraphMachine(model=m, ...) # when you want to use graphviz explicitly machine = GraphMachine(model=m, use_pygraphviz=False, ...) # in cases where auto transitions should be visible machine = GraphMachine(model=m, show_auto_transitions=True, ...) # draw the whole graph ... m.get_graph().draw('my_state_diagram.png', prog='dot') # ... or just the region of interest # (previous state, active state and all reachable states) roi = m.get_graph(show_roi=True).draw('my_state_diagram.png', prog='dot') ``` This produces something like this: ![state diagram example](https://user-images.githubusercontent.com/205986/47524268-725c1280-d89a-11e8-812b-1d3b6e667b91.png) Independent of the backend you use, the draw function also accepts a file descriptor or a binary stream as the first argument. If you set this parameter to `None`, the byte stream will be returned: ```python import io with open('a_graph.png', 'bw') as f: # you need to pass the format when you pass objects instead of filenames. m.get_graph().draw(f, format="png", prog='dot') # you can pass a (binary) stream too b = io.BytesIO() m.get_graph().draw(b, format="png", prog='dot') # or just handle the binary string yourself result = m.get_graph().draw(None, format="png", prog='dot') assert result == b.getvalue() ``` References and partials passed as callbacks will be resolved as good as possible: ```python from transitions.extensions import GraphMachine from functools import partial class Model: def clear_state(self, deep=False, force=False): print("Clearing state ...") return True model = Model() machine = GraphMachine(model=model, states=['A', 'B', 'C'], transitions=[ {'trigger': 'clear', 'source': 'B', 'dest': 'A', 'conditions': model.clear_state}, {'trigger': 'clear', 'source': 'C', 'dest': 'A', 'conditions': partial(model.clear_state, False, force=True)}, ], initial='A', show_conditions=True) model.get_graph().draw('my_state_diagram.png', prog='dot') ``` This should produce something similar to this: ![state diagram references_example](https://user-images.githubusercontent.com/205986/110783076-39087f80-8268-11eb-8fa1-fc7bac97f4cf.png) If the format of references does not suit your needs, you can override the static method `GraphMachine.format_references`. If you want to skip reference entirely, just let `GraphMachine.format_references` return `None`. Also, have a look at our [example](./examples) IPython/Jupyter notebooks for a more detailed example about how to use and edit graphs. ### Hierarchical State Machine (HSM) Transitions includes an extension module which allows nesting states. This allows us to create contexts and to model cases where states are related to certain subtasks in the state machine. To create a nested state, either import `NestedState` from transitions or use a dictionary with the initialization arguments `name` and `children`. Optionally, `initial` can be used to define a sub state to transit to, when the nested state is entered. ```python from transitions.extensions import HierarchicalMachine states = ['standing', 'walking', {'name': 'caffeinated', 'children':['dithering', 'running']}] transitions = [ ['walk', 'standing', 'walking'], ['stop', 'walking', 'standing'], ['drink', '*', 'caffeinated'], ['walk', ['caffeinated', 'caffeinated_dithering'], 'caffeinated_running'], ['relax', 'caffeinated', 'standing'] ] machine = HierarchicalMachine(states=states, transitions=transitions, initial='standing', ignore_invalid_triggers=True) machine.walk() # Walking now machine.stop() # let's stop for a moment machine.drink() # coffee time machine.state >>> 'caffeinated' machine.walk() # we have to go faster machine.state >>> 'caffeinated_running' machine.stop() # can't stop moving! machine.state >>> 'caffeinated_running' machine.relax() # leave nested state machine.state # phew, what a ride >>> 'standing' # machine.on_enter_caffeinated_running('callback_method') ``` A configuration making use of `initial` could look like this: ```python # ... states = ['standing', 'walking', {'name': 'caffeinated', 'initial': 'dithering', 'children': ['dithering', 'running']}] transitions = [ ['walk', 'standing', 'walking'], ['stop', 'walking', 'standing'], # this transition will end in 'caffeinated_dithering'... ['drink', '*', 'caffeinated'], # ... that is why we do not need do specify 'caffeinated' here anymore ['walk', 'caffeinated_dithering', 'caffeinated_running'], ['relax', 'caffeinated', 'standing'] ] # ... ``` The `initial` keyword of the `HierarchicalMachine` constructor accepts nested states (e.g. `initial='caffeinated_running'`) and a list of states which is considered to be a parallel state (e.g. `initial=['A', 'B']`) or the current state of another model (`initial=model.state`) which should be effectively one of the previous mentioned options. Note that when passing a string, `transition` will check the targeted state for `initial` substates and use this as an entry state. This will be done recursively until a substate does not mention an initial state. Parallel states or a state passed as a list will be used 'as is' and no further initial evaluation will be conducted. Note that your previously created state object _must be_ a `NestedState` or a derived class of it. The standard `State` class used in simple `Machine` instances lacks features required for nesting. ```python from transitions.extensions.nesting import HierarchicalMachine, NestedState from transitions import State m = HierarchicalMachine(states=['A'], initial='initial') m.add_state('B') # fine m.add_state({'name': 'C'}) # also fine m.add_state(NestedState('D')) # fine as well m.add_state(State('E')) # does not work! ``` Some things that have to be considered when working with nested states: State _names are concatenated_ with `NestedState.separator`. Currently the separator is set to underscore ('\_') and therefore behaves similar to the basic machine. This means a substate `bar` from state `foo` will be known by `foo_bar`. A substate `baz` of `bar` will be referred to as `foo_bar_baz` and so on. When entering a substate, `enter` will be called for all parent states. The same is true for exiting substates. Third, nested states can overwrite transition behaviour of their parents. If a transition is not known to the current state it will be delegated to its parent. **This means that in the standard configuration, state names in HSMs MUST NOT contain underscores.** For `transitions` it's impossible to tell whether `machine.add_state('state_name')` should add a state named `state_name` or add a substate `name` to the state `state`. In some cases this is not sufficient however. For instance if state names consist of more than one word and you want/need to use underscore to separate them instead of `CamelCase`. To deal with this, you can change the character used for separation quite easily. You can even use fancy unicode characters if you use Python 3. Setting the separator to something else than underscore changes some of the behaviour (auto_transition and setting callbacks) though: ```python from transitions.extensions import HierarchicalMachine from transitions.extensions.nesting import NestedState NestedState.separator = '↦' states = ['A', 'B', {'name': 'C', 'children':['1', '2', {'name': '3', 'children': ['a', 'b', 'c']} ]} ] transitions = [ ['reset', 'C', 'A'], ['reset', 'C↦2', 'C'] # overwriting parent reset ] # we rely on auto transitions machine = HierarchicalMachine(states=states, transitions=transitions, initial='A') machine.to_B() # exit state A, enter state B machine.to_C() # exit B, enter C machine.to_C.s3.a() # enter C↦a; enter C↦3↦a; machine.state >>> 'C↦3↦a' assert machine.is_C.s3.a() machine.to('C↦2') # not interactive; exit C↦3↦a, exit C↦3, enter C↦2 machine.reset() # exit C↦2; reset C has been overwritten by C↦3 machine.state >>> 'C' machine.reset() # exit C, enter A machine.state >>> 'A' # s.on_enter('C↦3↦a', 'callback_method') ``` Instead of `to_C_3_a()` auto transition is called as `to_C.s3.a()`. If your substate starts with a digit, transitions adds a prefix 's' ('3' becomes 's3') to the auto transition `FunctionWrapper` to comply with the attribute naming scheme of Python. If interactive completion is not required, `to('C↦3↦a')` can be called directly. Additionally, `on_enter/exit_<>` is replaced with `on_enter/exit(state_name, callback)`. State checks can be conducted in a similar fashion. Instead of `is_C_3_a()`, the `FunctionWrapper` variant `is_C.s3.a()` can be used. To check whether the current state is a substate of a specific state, `is_state` supports the keyword `allow_substates`: ```python machine.state >>> 'C.2.a' machine.is_C() # checks for specific states >>> False machine.is_C(allow_substates=True) >>> True assert machine.is_C.s2() is False assert machine.is_C.s2(allow_substates=True) # FunctionWrapper support allow_substate as well ``` _new in 0.8.0_ You can use enumerations in HSMs as well but keep in mind that `Enum` are compared by value. If you have a value more than once in a state tree those states cannot be distinguished. ```python states = [States.RED, States.YELLOW, {'name': States.GREEN, 'children': ['tick', 'tock']}] states = ['A', {'name': 'B', 'children': states, 'initial': States.GREEN}, States.GREEN] machine = HierarchicalMachine(states=states) machine.to_B() machine.is_GREEN() # returns True even though the actual state is B_GREEN ``` _new in 0.8.0_ `HierarchicalMachine` has been rewritten from scratch to support parallel states and better isolation of nested states. This involves some tweaks based on community feedback. To get an idea of processing order and configuration have a look at the following example: ```python from transitions.extensions.nesting import HierarchicalMachine import logging states = ['A', 'B', {'name': 'C', 'parallel': [{'name': '1', 'children': ['a', 'b', 'c'], 'initial': 'a', 'transitions': [['go', 'a', 'b']]}, {'name': '2', 'children': ['x', 'y', 'z'], 'initial': 'z'}], 'transitions': [['go', '2_z', '2_x']]}] transitions = [['reset', 'C_1_b', 'B']] logging.basicConfig(level=logging.INFO) machine = HierarchicalMachine(states=states, transitions=transitions, initial='A') machine.to_C() # INFO:transitions.extensions.nesting:Exited state A # INFO:transitions.extensions.nesting:Entered state C # INFO:transitions.extensions.nesting:Entered state C_1 # INFO:transitions.extensions.nesting:Entered state C_2 # INFO:transitions.extensions.nesting:Entered state C_1_a # INFO:transitions.extensions.nesting:Entered state C_2_z machine.go() # INFO:transitions.extensions.nesting:Exited state C_1_a # INFO:transitions.extensions.nesting:Entered state C_1_b # INFO:transitions.extensions.nesting:Exited state C_2_z # INFO:transitions.extensions.nesting:Entered state C_2_x machine.reset() # INFO:transitions.extensions.nesting:Exited state C_1_b # INFO:transitions.extensions.nesting:Exited state C_2_x # INFO:transitions.extensions.nesting:Exited state C_1 # INFO:transitions.extensions.nesting:Exited state C_2 # INFO:transitions.extensions.nesting:Exited state C # INFO:transitions.extensions.nesting:Entered state B ``` When using `parallel` instead of `children`, `transitions` will enter all states of the passed list at the same time. Which substate to enter is defined by `initial` which should _always_ point to a direct substate. A novel feature is to define local transitions by passing the `transitions` keyword in a state definition. The above defined transition `['go', 'a', 'b']` is only valid in `C_1`. While you can reference substates as done in `['go', '2_z', '2_x']` you cannot reference parent states directly in locally defined transitions. When a parent state is exited, its children will also be exited. In addition to the processing order of transitions known from `Machine` where transitions are considered in the order they were added, `HierarchicalMachine` considers hierarchy as well. Transitions defined in substates will be evaluated first (e.g. `C_1_a` is left before `C_2_z`) and transitions defined with wildcard `*` will (for now) only add transitions to root states (in this example `A`, `B`, `C`) Starting with _0.8.0_ nested states can be added directly and will issue the creation of parent states on-the-fly: ```python m = HierarchicalMachine(states=['A'], initial='A') m.add_state('B_1_a') m.to_B_1() assert m.is_B(allow_substates=True) ``` #### Reuse of previously created HSMs Besides semantic order, nested states are very handy if you want to specify state machines for specific tasks and plan to reuse them. Before _0.8.0_, a `HierarchicalMachine` would not integrate the machine instance itself but the states and transitions by creating copies of them. However, since _0.8.0_ `(Nested)State` instances are just **referenced** which means changes in one machine's collection of states and events will influence the other machine instance. Models and their state will not be shared though. Note that events and transitions are also copied by reference and will be shared by both instances if you do not use the `remap` keyword. This change was done to be more in line with `Machine` which also uses passed `State` instances by reference. ```python count_states = ['1', '2', '3', 'done'] count_trans = [ ['increase', '1', '2'], ['increase', '2', '3'], ['decrease', '3', '2'], ['decrease', '2', '1'], ['done', '3', 'done'], ['reset', '*', '1'] ] counter = HierarchicalMachine(states=count_states, transitions=count_trans, initial='1') counter.increase() # love my counter states = ['waiting', 'collecting', {'name': 'counting', 'children': counter}] transitions = [ ['collect', '*', 'collecting'], ['wait', '*', 'waiting'], ['count', 'collecting', 'counting'] ] collector = HierarchicalMachine(states=states, transitions=transitions, initial='waiting') collector.collect() # collecting collector.count() # let's see what we got; counting_1 collector.increase() # counting_2 collector.increase() # counting_3 collector.done() # collector.state == counting_done collector.wait() # collector.state == waiting ``` If a `HierarchicalMachine` is passed with the `children` keyword, the initial state of this machine will be assigned to the new parent state. In the above example we see that entering `counting` will also enter `counting_1`. If this is undesired behaviour and the machine should rather halt in the parent state, the user can pass `initial` as `False` like `{'name': 'counting', 'children': counter, 'initial': False}`. Sometimes you want such an embedded state collection to 'return' which means after it is done it should exit and transit to one of your super states. To achieve this behaviour you can remap state transitions. In the example above we would like the counter to return if the state `done` was reached. This is done as follows: ```python states = ['waiting', 'collecting', {'name': 'counting', 'children': counter, 'remap': {'done': 'waiting'}}] ... # same as above collector.increase() # counting_3 collector.done() collector.state >>> 'waiting' # be aware that 'counting_done' will be removed from the state machine ``` As mentioned above, using `remap` will **copy** events and transitions since they could not be valid in the original state machine. If a reused state machine does not have a final state, you can of course add the transitions manually. If 'counter' had no 'done' state, we could just add `['done', 'counter_3', 'waiting']` to achieve the same behaviour. In cases where you want states and transitions to be copied by value rather than reference (for instance, if you want to keep the pre-0.8 behaviour) you can do so by creating a `NestedState` and assigning deep copies of the machine's events and states to it. ```python from transitions.extensions.nesting import NestedState from copy import deepcopy # ... configuring and creating counter counting_state = NestedState(name="counting", initial='1') counting_state.states = deepcopy(counter.states) counting_state.events = deepcopy(counter.events) states = ['waiting', 'collecting', counting_state] ``` For complex state machines, sharing configurations rather than instantiated machines might be more feasible. Especially since instantiated machines must be derived from `HierarchicalMachine`. Such configurations can be stored and loaded easily via JSON or YAML (see the [FAQ](examples/Frequently%20asked%20questions.ipynb)). `HierarchicalMachine` allows defining substates either with the keyword `children` or `states`. If both are present, only `children` will be considered. ```python counter_conf = { 'name': 'counting', 'states': ['1', '2', '3', 'done'], 'transitions': [ ['increase', '1', '2'], ['increase', '2', '3'], ['decrease', '3', '2'], ['decrease', '2', '1'], ['done', '3', 'done'], ['reset', '*', '1'] ], 'initial': '1' } collector_conf = { 'name': 'collector', 'states': ['waiting', 'collecting', counter_conf], 'transitions': [ ['collect', '*', 'collecting'], ['wait', '*', 'waiting'], ['count', 'collecting', 'counting'] ], 'initial': 'waiting' } collector = HierarchicalMachine(**collector_conf) collector.collect() collector.count() collector.increase() assert collector.is_counting_2() ``` #### Threadsafe(-ish) State Machine In cases where event dispatching is done in threads, one can use either `LockedMachine` or `LockedHierarchicalMachine` where **function access** (!sic) is secured with reentrant locks. This does not save you from corrupting your machine by tinkering with member variables of your model or state machine. ```python from transitions.extensions import LockedMachine from threading import Thread import time states = ['A', 'B', 'C'] machine = LockedMachine(states=states, initial='A') # let us assume that entering B will take some time thread = Thread(target=machine.to_B) thread.start() time.sleep(0.01) # thread requires some time to start machine.to_C() # synchronized access; won't execute before thread is done # accessing attributes directly thread = Thread(target=machine.to_B) thread.start() machine.new_attrib = 42 # not synchronized! will mess with execution order ``` Any python context manager can be passed in via the `machine_context` keyword argument: ```python from transitions.extensions import LockedMachine from threading import RLock states = ['A', 'B', 'C'] lock1 = RLock() lock2 = RLock() machine = LockedMachine(states=states, initial='A', machine_context=[lock1, lock2]) ``` Any contexts via `machine_model` will be shared between all models registered with the `Machine`. Per-model contexts can be added as well: ```python lock3 = RLock() machine.add_model(model, model_context=lock3) ``` It's important that all user-provided context managers are re-entrant since the state machine will call them multiple times, even in the context of a single trigger invocation. #### Using async callbacks If you are using Python 3.7 or later, you can use `AsyncMachine` to work with asynchronous callbacks. You can mix synchronous and asynchronous callbacks if you like but this may have undesired side effects. Note that events need to be awaited and the event loop must also be handled by you. ```python from transitions.extensions.asyncio import AsyncMachine import asyncio import time class AsyncModel: def prepare_model(self): print("I am synchronous.") self.start_time = time.time() async def before_change(self): print("I am asynchronous and will block now for 100 milliseconds.") await asyncio.sleep(0.1) print("I am done waiting.") def sync_before_change(self): print("I am synchronous and will block the event loop (what I probably shouldn't)") time.sleep(0.1) print("I am done waiting synchronously.") def after_change(self): print(f"I am synchronous again. Execution took {int((time.time() - self.start_time) * 1000)} ms.") transition = dict(trigger="start", source="Start", dest="Done", prepare="prepare_model", before=["before_change"] * 5 + ["sync_before_change"], after="after_change") # execute before function in asynchronously 5 times model = AsyncModel() machine = AsyncMachine(model, states=["Start", "Done"], transitions=[transition], initial='Start') asyncio.get_event_loop().run_until_complete(model.start()) # >>> I am synchronous. # I am asynchronous and will block now for 100 milliseconds. # I am asynchronous and will block now for 100 milliseconds. # I am asynchronous and will block now for 100 milliseconds. # I am asynchronous and will block now for 100 milliseconds. # I am asynchronous and will block now for 100 milliseconds. # I am synchronous and will block the event loop (what I probably shouldn't) # I am done waiting synchronously. # I am done waiting. # I am done waiting. # I am done waiting. # I am done waiting. # I am done waiting. # I am synchronous again. Execution took 101 ms. assert model.is_Done() ``` So, why do you need to use Python 3.7 or later you may ask. Async support has been introduced earlier. `AsyncMachine` makes use of `contextvars` to handle running callbacks when new events arrive before a transition has been finished: ```python async def await_never_return(): await asyncio.sleep(100) raise ValueError("That took too long!") async def fix(): await m2.fix() m1 = AsyncMachine(states=['A', 'B', 'C'], initial='A', name="m1") m2 = AsyncMachine(states=['A', 'B', 'C'], initial='A', name="m2") m2.add_transition(trigger='go', source='A', dest='B', before=await_never_return) m2.add_transition(trigger='fix', source='A', dest='C') m1.add_transition(trigger='go', source='A', dest='B', after='go') m1.add_transition(trigger='go', source='B', dest='C', after=fix) asyncio.get_event_loop().run_until_complete(asyncio.gather(m2.go(), m1.go())) assert m1.state == m2.state ``` This example actually illustrates two things: First, that 'go' called in m1's transition from `A` to be `B` is not cancelled and second, calling `m2.fix()` will halt the transition attempt of m2 from `A` to `B` by executing 'fix' from `A` to `C`. This separation would not be possible without `contextvars`. Note that `prepare` and `conditions` are NOT treated as ongoing transitions. This means that after `conditions` have been evaluated, a transition is executed even though another event already happened. Tasks will only be cancelled when run as a `before` callback or later. `AsyncMachine` features a model-special queue mode which can be used when `queued='model'` is passed to the constructor. With a model-specific queue, events will only be queued when they belong to the same model. Furthermore, a raised exception will only clear the event queue of the model that raised that exception. For the sake of simplicity, let's assume that every event in `asyncio.gather` below is not triggered at the same time but slightly delayed: ```python asyncio.gather(model1.event1(), model1.event2(), model2.event1()) # execution order with AsyncMachine(queued=True) # model1.event1 -> model1.event2 -> model2.event1 # execution order with AsyncMachine(queued='model') # (model1.event1, model2.event1) -> model1.event2 asyncio.gather(model1.event1(), model1.error(), model1.event3(), model2.event1(), model2.event2(), model2.event3()) # execution order with AsyncMachine(queued=True) # model1.event1 -> model1.error # execution order with AsyncMachine(queued='model') # (model1.event1, model2.event1) -> (model1.error, model2.event2) -> model2.event3 ``` Note that queue modes must not be changed after machine construction. #### Adding features to states If your superheroes need some custom behaviour, you can throw in some extra functionality by decorating machine states: ```python from time import sleep from transitions import Machine from transitions.extensions.states import add_state_features, Tags, Timeout @add_state_features(Tags, Timeout) class CustomStateMachine(Machine): pass class SocialSuperhero(object): def __init__(self): self.entourage = 0 def on_enter_waiting(self): self.entourage += 1 states = [{'name': 'preparing', 'tags': ['home', 'busy']}, {'name': 'waiting', 'timeout': 1, 'on_timeout': 'go'}, {'name': 'away'}] # The city needs us! transitions = [['done', 'preparing', 'waiting'], ['join', 'waiting', 'waiting'], # Entering Waiting again will increase our entourage ['go', 'waiting', 'away']] # Okay, let' move hero = SocialSuperhero() machine = CustomStateMachine(model=hero, states=states, transitions=transitions, initial='preparing') assert hero.state == 'preparing' # Preparing for the night shift assert machine.get_state(hero.state).is_busy # We are at home and busy hero.done() assert hero.state == 'waiting' # Waiting for fellow superheroes to join us assert hero.entourage == 1 # It's just us so far sleep(0.7) # Waiting... hero.join() # Weeh, we got company sleep(0.5) # Waiting... hero.join() # Even more company \o/ sleep(2) # Waiting... assert hero.state == 'away' # Impatient superhero already left the building assert machine.get_state(hero.state).is_home is False # Yupp, not at home anymore assert hero.entourage == 3 # At least he is not alone ``` Currently, transitions comes equipped with the following state features: - **Timeout** -- triggers an event after some time has passed - keyword: `timeout` (int, optional) -- if passed, an entered state will timeout after `timeout` seconds - keyword: `on_timeout` (string/callable, optional) -- will be called when timeout time has been reached - will raise an `AttributeError` when `timeout` is set but `on_timeout` is not - Note: A timeout is triggered in a thread. This implies several limitations (e.g. catching Exceptions raised in timeouts). Consider an event queue for more sophisticated applications. - **Tags** -- adds tags to states - keyword: `tags` (list, optional) -- assigns tags to a state - `State.is_` will return `True` when the state has been tagged with `tag_name`, else `False` - **Error** -- raises a `MachineError` when a state cannot be left - inherits from `Tags` (if you use `Error` do not use `Tags`) - keyword: `accepted` (bool, optional) -- marks a state as accepted - alternatively the keyword `tags` can be passed, containing 'accepted' - Note: Errors will only be raised if `auto_transitions` has been set to `False`. Otherwise every state can be exited with `to_` methods. - **Volatile** -- initialises an object every time a state is entered - keyword: `volatile` (class, optional) -- every time the state is entered an object of type class will be assigned to the model. The attribute name is defined by `hook`. If omitted, an empty VolatileObject will be created instead - keyword: `hook` (string, default='scope') -- The model's attribute name for the temporal object. You can write your own `State` extensions and add them the same way. Just note that `add_state_features` expects _Mixins_. This means your extension should always call the overridden methods `__init__`, `enter` and `exit`. Your extension may inherit from _State_ but will also work without it. Using `@add_state_features` has a drawback which is that decorated machines cannot be pickled (more precisely, the dynamically generated `CustomState` cannot be pickled). This might be a reason to write a dedicated custom state class instead. Depending on the chosen state machine, your custom state class may need to provide certain state features. For instance, `HierarchicalMachine` requires your custom state to be an instance of `NestedState` (`State` is not sufficient). To inject your states you can either assign them to your `Machine`'s class attribute `state_cls` or override `Machine.create_state` in case you need some specific procedures done whenever a state is created: ```python from transitions import Machine, State class MyState(State): pass class CustomMachine(Machine): # Use MyState as state class state_cls = MyState class VerboseMachine(Machine): # `Machine._create_state` is a class method but we can # override it to be an instance method def _create_state(self, *args, **kwargs): print("Creating a new state with machine '{0}'".format(self.name)) return MyState(*args, **kwargs) ``` If you want to avoid threads in your `AsyncMachine` entirely, you can replace the `Timeout` state feature with `AsyncTimeout` from the `asyncio` extension: ```python import asyncio from transitions.extensions.states import add_state_features from transitions.extensions.asyncio import AsyncTimeout, AsyncMachine @add_state_features(AsyncTimeout) class TimeoutMachine(AsyncMachine): pass states = ['A', {'name': 'B', 'timeout': 0.2, 'on_timeout': 'to_C'}, 'C'] m = TimeoutMachine(states=states, initial='A', queued=True) # see remark below asyncio.run(asyncio.wait([m.to_B(), asyncio.sleep(0.1)])) assert m.is_B() # timeout shouldn't be triggered asyncio.run(asyncio.wait([m.to_B(), asyncio.sleep(0.3)])) assert m.is_C() # now timeout should have been processed ``` You should consider passing `queued=True` to the `TimeoutMachine` constructor. This will make sure that events are processed sequentially and avoid asynchronous [racing conditions](https://github.com/pytransitions/transitions/issues/459) that may appear when timeout and event happen in close proximity. #### Using transitions together with Django You can have a look at the [FAQ](examples/Frequently%20asked%20questions.ipynb) for some inspiration or checkout `django-transitions`. It has been developed by Christian Ledermann and is also hosted on [Github](https://github.com/PrimarySite/django-transitions). [The documentation](https://django-transitions.readthedocs.io/en/latest/) contains some usage examples. ### I have a [bug report/issue/question]... First, congratulations! You reached the end of the documentation! If you want to try out `transitions` before you install it, you can do that in an interactive Jupyter notebook at mybinder.org. Just click this button 👉 [![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/pytransitions/transitions/master?filepath=examples%2FPlayground.ipynb). For bug reports and other issues, please [open an issue](https://github.com/pytransitions/transitions) on GitHub. For usage questions, post on Stack Overflow, making sure to tag your question with the [`pytransitions` tag](https://stackoverflow.com/questions/tagged/pytransitions). Do not forget to have a look at the [extended examples](./examples)! For any other questions, solicitations, or large unrestricted monetary gifts, email [Tal Yarkoni](mailto:tyarkoni@gmail.com) (initial author) and/or [Alexander Neumann](mailto:aleneum@gmail.com) (current maintainer). transitions-0.9.0/transitions.egg-info/SOURCES.txt0000644000232200023220000000350114304350474022401 0ustar debalancedebalance.coveragerc .pylintrc Changelog.md LICENSE MANIFEST.in README.md conftest.py mypy.ini pytest.ini requirements.txt requirements_diagrams.txt requirements_mypy.txt requirements_test.txt setup.cfg setup.py tox.ini binder/apt.txt binder/postBuild binder/requirements.txt examples/Frequently asked questions.ipynb examples/Graph MIxin Demo Nested.ipynb examples/Graph MIxin Demo.ipynb examples/Playground.ipynb tests/__init__.py tests/test_add_remove.py tests/test_async.py tests/test_codestyle.py tests/test_core.py tests/test_enum.py tests/test_factory.py tests/test_graphviz.py tests/test_markup.py tests/test_nesting.py tests/test_parallel.py tests/test_pygraphviz.py tests/test_reuse.py tests/test_states.py tests/test_threading.py tests/utils.py transitions/__init__.py transitions/__init__.pyi transitions/core.py transitions/core.pyi transitions/py.typed transitions/version.py transitions/version.pyi transitions.egg-info/PKG-INFO transitions.egg-info/SOURCES.txt transitions.egg-info/dependency_links.txt transitions.egg-info/requires.txt transitions.egg-info/top_level.txt transitions/extensions/__init__.py transitions/extensions/asyncio.py transitions/extensions/asyncio.pyi transitions/extensions/diagrams.py transitions/extensions/diagrams.pyi transitions/extensions/diagrams_base.py transitions/extensions/diagrams_base.pyi transitions/extensions/diagrams_graphviz.py transitions/extensions/diagrams_graphviz.pyi transitions/extensions/diagrams_pygraphviz.py transitions/extensions/diagrams_pygraphviz.pyi transitions/extensions/factory.py transitions/extensions/factory.pyi transitions/extensions/locking.py transitions/extensions/locking.pyi transitions/extensions/markup.py transitions/extensions/markup.pyi transitions/extensions/nesting.py transitions/extensions/nesting.pyi transitions/extensions/states.py transitions/extensions/states.pyitransitions-0.9.0/transitions.egg-info/top_level.txt0000644000232200023220000000001414304350474023243 0ustar debalancedebalancetransitions transitions-0.9.0/transitions.egg-info/dependency_links.txt0000644000232200023220000000000114304350474024564 0ustar debalancedebalance transitions-0.9.0/pytest.ini0000644000232200023220000000017514304350474016503 0ustar debalancedebalance[pytest] filterwarnings = error ignore:.*With-statements.*:DeprecationWarning addopts = -x -rf junit_family = xunit2 transitions-0.9.0/requirements_test.txt0000644000232200023220000000011414304350474020766 0ustar debalancedebalancepytest pytest-cov pytest-runner pytest-xdist mock dill graphviz pycodestyle transitions-0.9.0/requirements_mypy.txt0000644000232200023220000000003014304350474021002 0ustar debalancedebalancemypy graphviz types-six transitions-0.9.0/.pylintrc0000644000232200023220000003510214304350474016315 0ustar debalancedebalance[MASTER] # A comma-separated list of package or module names from where C extensions may # be loaded. Extensions are loading into the active Python interpreter and may # run arbitrary code extension-pkg-whitelist= # Add files or directories to the blacklist. They should be base names, not # paths. ignore=CVS # Add files or directories matching the regex patterns to the blacklist. The # regex matches against base names, not paths. ignore-patterns= # Python code to execute, usually for sys.path manipulation such as # pygtk.require(). #init-hook= # Use multiple processes to speed up Pylint. jobs=1 # List of plugins (as comma separated values of python modules names) to load, # usually to register additional checkers. load-plugins= # Pickle collected data for later comparisons. persistent=yes # Specify a configuration file. #rcfile= # Allow loading of arbitrary C extensions. Extensions are imported into the # active Python interpreter and may run arbitrary code. unsafe-load-any-extension=no [MESSAGES CONTROL] # Only show warnings with the listed confidence levels. Leave empty to show # all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED confidence= # Disable the message, report, category or checker with the given id(s). You # can either give multiple identifiers separated by comma (,) or put this # option multiple times (only on the command line, not in the configuration # file where it should appear only once).You can also use "--disable=all" to # disable everything first and then reenable specific checks. For example, if # you want to run only the similarities checker, you can use "--disable=all # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use"--disable=all --enable=classes # --disable=W" disable=print-statement,parameter-unpacking,unpacking-in-except,old-raise-syntax,backtick,long-suffix,old-ne-operator, old-octal-literal,import-star-module-level,raw-checker-failed,bad-inline-option,locally-disabled,locally-enabled, file-ignored,suppressed-message,useless-suppression,deprecated-pragma,apply-builtin,basestring-builtin, buffer-builtin,cmp-builtin,coerce-builtin,execfile-builtin,file-builtin,long-builtin,raw_input-builtin, reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method, getslice-method,setslice-method,no-absolute-import,old-division,dict-iter-method,dict-view-method, next-method-called,metaclass-assignment,indexing-exception,raising-string,reload-builtin,oct-method, hex-method,nonzero-method,cmp-method,input-builtin,round-builtin,intern-builtin,unichr-builtin, map-builtin-not-iterating,zip-builtin-not-iterating,range-builtin-not-iterating,filter-builtin-not-iterating, using-cmp-argument,eq-without-hash,div-method,idiv-method,rdiv-method,exception-message-attribute,invalid-str-codec, sys-max-int,bad-python3-import,deprecated-string-function,deprecated-str-translate-call, too-few-public-methods, super-with-arguments, useless-object-inheritance, raise-missing-from # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option # multiple time (only on the command line, not in the configuration file where # it should appear only once). See also the "--disable" option for examples. enable= [REPORTS] # Python expression which should return a note less than 10 (10 is the highest # note). You have access to the variables errors warning, statement which # respectively contain the number of errors / warnings messages and the total # number of statements analyzed. This is used by the global evaluation report # (RP0004). evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) # Template used to display messages. This is a python new-style format string # used to format the message information. See doc for all details #msg-template= # Set the output format. Available formats are text, parseable, colorized, json # and msvs (visual studio).You can also give a reporter class, eg # mypackage.mymodule.MyReporterClass. output-format=text # Tells whether to display a full report or only the messages reports=no # Activate the evaluation score. score=yes [REFACTORING] # Maximum number of nested blocks for function / method body max-nested-blocks=5 [BASIC] # Naming hint for argument names argument-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ # Regular expression matching correct argument names argument-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ # Naming hint for attribute names attr-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ # Regular expression matching correct attribute names attr-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ # Bad variable names which should always be refused, separated by a comma bad-names=foo,bar,baz,toto,tutu,tata # Naming hint for class attribute names class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ # Regular expression matching correct class attribute names class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ # Naming hint for class names class-name-hint=[A-Z_][a-zA-Z0-9]+$ # Regular expression matching correct class names class-rgx=[A-Z_][a-zA-Z0-9]+$ # Naming hint for constant names const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$ # Regular expression matching correct constant names const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ # Minimum line length for functions/classes that require docstrings, shorter # ones are exempt. docstring-min-length=-1 # Naming hint for function names function-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ # Regular expression matching correct function names function-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ # Good variable names which should always be accepted, separated by a comma good-names=i,j,k,ex,Run,_ # Include a hint for the correct naming format with invalid-name include-naming-hint=no # Naming hint for inline iteration names inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$ # Regular expression matching correct inline iteration names inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ # Naming hint for method names method-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ # Regular expression matching correct method names method-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ # Naming hint for module names module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ # Regular expression matching correct module names module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ # Colon-delimited sets of names that determine each other's naming style when # the name regexes allow several styles. name-group= # Regular expression which should only match function or class names that do # not require a docstring. no-docstring-rgx=^_ # List of decorators that produce properties, such as abc.abstractproperty. Add # to this list to register other decorators that produce valid properties. property-classes=abc.abstractproperty # Naming hint for variable names variable-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ # Regular expression matching correct variable names variable-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ [FORMAT] # Expected format of line ending, e.g. empty (any line ending), LF or CRLF. expected-line-ending-format= # Regexp for a line that is allowed to be longer than the limit. ignore-long-lines=^\s*(# )??$ # Number of spaces of indent required inside a hanging or continued line. indent-after-paren=4 # String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 # tab). indent-string=' ' # Maximum number of characters on a single line. max-line-length=120 # Maximum number of lines in a module max-module-lines=1000 # List of optional constructs for which whitespace checking is disabled. `dict- # separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. # `trailing-comma` allows a space between comma and closing bracket: (a, ). # `empty-line` allows space-only lines. no-space-check=trailing-comma,dict-separator # Allow the body of a class to be on the same line as the declaration if body # contains single statement. single-line-class-stmt=no # Allow the body of an if to be on the same line as the test if there is no # else. single-line-if-stmt=no [LOGGING] # Logging modules to check that the string format arguments are in logging # function parameter format logging-modules=logging [MISCELLANEOUS] # List of note tags to take in consideration, separated by a comma. notes=FIXME,XXX,TODO [SIMILARITIES] # Ignore comments when computing similarities. ignore-comments=yes # Ignore docstrings when computing similarities. ignore-docstrings=yes # Ignore imports when computing similarities. ignore-imports=no # Minimum lines number of a similarity. min-similarity-lines=4 [SPELLING] # Spelling dictionary name. Available dictionaries: none. To make it working # install python-enchant package. spelling-dict= # List of comma separated words that should not be checked. spelling-ignore-words= # A path to a file that contains private dictionary; one word per line. spelling-private-dict-file= # Tells whether to store unknown words to indicated private dictionary in # --spelling-private-dict-file option instead of raising a message. spelling-store-unknown-words=no [TYPECHECK] # List of decorators that produce context managers, such as # contextlib.contextmanager. Add to this list to register other decorators that # produce valid context managers. contextmanager-decorators=contextlib.contextmanager # List of members which are set dynamically and missed by pylint inference # system, and so shouldn't trigger E1101 when accessed. Python regular # expressions are accepted. generated-members= # Tells whether missing members accessed in mixin class should be ignored. A # mixin class is detected if its name ends with "mixin" (case insensitive). ignore-mixin-members=yes # This flag controls whether pylint should warn about no-member and similar # checks whenever an opaque object is returned when inferring. The inference # can return multiple potential results while evaluating a Python object, but # some branches might not be evaluated, which results in partial inference. In # that case, it might be useful to still emit no-member and other checks for # the rest of the inferred objects. ignore-on-opaque-inference=yes # List of class names for which member attributes should not be checked (useful # for classes with dynamically set attributes). This supports the use of # qualified names. ignored-classes=optparse.Values,thread._local,_thread._local # List of module names for which member attributes should not be checked # (useful for modules/projects where namespaces are manipulated during runtime # and thus existing member attributes cannot be deduced by static analysis. It # supports qualified module names, as well as Unix pattern matching. ignored-modules= # Show a hint with possible names when a member name was not found. The aspect # of finding the hint is based on edit distance. missing-member-hint=yes # The minimum edit distance a name should have in order to be considered a # similar match for a missing member name. missing-member-hint-distance=1 # The total number of similar names that should be taken in consideration when # showing a hint for a missing member. missing-member-max-choices=1 [VARIABLES] # List of additional names supposed to be defined in builtins. Remember that # you should avoid to define new builtins when possible. additional-builtins= # Tells whether unused global variables should be treated as a violation. allow-global-unused-variables=yes # List of strings which can identify a callback function by name. A callback # name must start or end with one of those strings. callbacks=cb_,_cb # A regular expression matching the name of dummy variables (i.e. expectedly # not used). dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ # Argument names that match this expression will be ignored. Default to name # with leading underscore ignored-argument-names=_.*|^ignored_|^unused_ # Tells whether we should check for unused import in __init__ files. init-import=no # List of qualified module names which can have objects that can redefine # builtins. redefining-builtins-modules=six.moves,future.builtins,builtins [CLASSES] # List of method names used to declare (i.e. assign) instance attributes. defining-attr-methods=__init__,__new__,setUp # List of member names, which should be excluded from the protected access # warning. exclude-protected=_asdict,_fields,_replace,_source,_make # List of valid names for the first argument in a class method. valid-classmethod-first-arg=cls # List of valid names for the first argument in a metaclass class method. valid-metaclass-classmethod-first-arg=mcs [DESIGN] # Maximum number of arguments for function / method max-args=5 # Maximum number of attributes for a class (see R0902). max-attributes=7 # Maximum number of boolean expressions in a if statement max-bool-expr=5 # Maximum number of branch for function / method body max-branches=12 # Maximum number of locals for function / method body max-locals=15 # Maximum number of parents for a class (see R0901). max-parents=7 # Maximum number of public methods for a class (see R0904). max-public-methods=20 # Maximum number of return / yield for function / method body max-returns=6 # Maximum number of statements in function / method body max-statements=50 # Minimum number of public methods for a class (see R0903). min-public-methods=2 [IMPORTS] # Allow wildcard imports from modules that define __all__. allow-wildcard-with-all=no # Analyse import fallback blocks. This can be used to support both Python 2 and # 3 compatible code, which means that the block might have code that exists # only in one or another interpreter, leading to false positives when analysed. analyse-fallback-blocks=no # Deprecated modules which should not be used, separated by a comma deprecated-modules=regsub,TERMIOS,Bastion,rexec # Create a graph of external dependencies in the given file (report RP0402 must # not be disabled) ext-import-graph= # Create a graph of every (i.e. internal and external) dependencies in the # given file (report RP0402 must not be disabled) import-graph= # Create a graph of internal dependencies in the given file (report RP0402 must # not be disabled) int-import-graph= # Force import order to recognize a module as part of the standard # compatibility libraries. known-standard-library= # Force import order to recognize a module as part of a third party library. known-third-party=enchant [EXCEPTIONS] # Exceptions that will emit a warning when being caught. Defaults to # "Exception" overgeneral-exceptions=Exception transitions-0.9.0/tests/0000755000232200023220000000000014304350474015611 5ustar debalancedebalancetransitions-0.9.0/tests/utils.py0000644000232200023220000000511514304350474017325 0ustar debalancedebalancefrom transitions import Machine class Stuff(object): is_false = False is_True = True def __init__(self, states=None, machine_cls=Machine, extra_kwargs={}): self.state = None self.message = None states = ['A', 'B', 'C', 'D', 'E', 'F'] if states is None else states args = [self] kwargs = { 'states': states, 'initial': 'A', 'name': 'Test Machine', } kwargs.update(extra_kwargs) if machine_cls is not None: self.machine = machine_cls(*args, **kwargs) self.level = 1 self.transitions = 0 self.machine_cls = machine_cls @staticmethod def this_passes(): return True @staticmethod def this_fails(): return False @staticmethod def this_raises(exception, *args, **kwargs): raise exception @staticmethod def this_fails_by_default(boolean=False): return boolean @staticmethod def extract_boolean(event_data): return event_data.kwargs['boolean'] def goodbye(self): self.message = "So long, suckers!" def hello_world(self): self.message = "Hello World!" def greet(self): self.message = "Hi" def meet(self): self.message = "Nice to meet you" def hello_F(self): if self.message is None: self.message = '' self.message += "Hello F!" def increase_level(self): self.level += 1 self.transitions += 1 def decrease_level(self): self.level -= 1 self.transitions += 1 def set_message(self, message="Hello World!"): self.message = message def extract_message(self, event_data): self.message = event_data.kwargs['message'] def on_enter_E(self, msg=None): self.message = "I am E!" if msg is None else msg def on_exit_E(self): self.exit_message = "E go home..." def on_enter_F(self): self.message = "I am F!" @property def property_that_fails(self): return self.is_false class InheritedStuff(Machine): def __init__(self, states, initial='A'): self.state = None Machine.__init__(self, states=states, initial=initial) @staticmethod def this_passes(): return True class DummyModel(object): pass class SomeContext(object): def __init__(self, event_list): self._event_list = event_list def __enter__(self): self._event_list.append((self, "enter")) def __exit__(self, type, value, traceback): self._event_list.append((self, "exit")) transitions-0.9.0/tests/test_pygraphviz.py0000644000232200023220000000756514304350474021442 0ustar debalancedebalancetry: from builtins import object except ImportError: pass from .utils import Stuff from .test_graphviz import TestDiagrams, TestDiagramsNested from transitions.extensions.states import add_state_features, Timeout, Tags from unittest import skipIf try: # Just to skip tests if graphviz not installed import pygraphviz as pgv # @UnresolvedImport except ImportError: # pragma: no cover pgv = None @skipIf(pgv is None, 'Graph diagram requires pygraphviz') class PygraphvizTest(TestDiagrams): use_pygraphviz = True def setUp(self): super(PygraphvizTest, self).setUp() def test_if_multiple_edges_are_supported(self): transitions = [ ['event_0', 'a', 'b'], ['event_1', 'a', 'b'], ['event_2', 'a', 'b'], ['event_3', 'a', 'b'], ] m = self.machine_cls( states=['a', 'b'], transitions=transitions, initial='a', auto_transitions=False, use_pygraphviz=self.use_pygraphviz ) graph = m.get_graph() self.assertIsNotNone(graph) self.assertTrue("digraph" in str(graph)) triggers = [transition[0] for transition in transitions] for trigger in triggers: self.assertTrue(trigger in str(graph)) def test_multi_model_state(self): m1 = Stuff(machine_cls=None) m2 = Stuff(machine_cls=None) m = self.machine_cls(model=[m1, m2], states=self.states, transitions=self.transitions, initial='A', use_pygraphviz=self.use_pygraphviz) m1.walk() self.assertEqual(m1.get_graph().get_node(m1.state).attr['color'], m1.get_graph().style_attributes['node']['active']['color']) self.assertEqual(m2.get_graph().get_node(m1.state).attr['color'], m2.get_graph().style_attributes['node']['default']['color']) # backwards compatibility test self.assertEqual(id(m.get_graph()), id(m1.get_graph())) def test_to_method_filtering(self): m = self.machine_cls(states=['A', 'B', 'C'], initial='A') m.add_transition('to_state_A', 'B', 'A') m.add_transition('to_end', '*', 'C') e = m.get_graph().get_edge('B', 'A') self.assertEqual(e.attr['label'], 'to_state_A') e = m.get_graph().get_edge('A', 'C') self.assertEqual(e.attr['label'], 'to_end') with self.assertRaises(KeyError): m.get_graph().get_edge('A', 'B') m2 = self.machine_cls(states=['A', 'B'], initial='A', show_auto_transitions=True) self.assertEqual(len(m2.get_graph().get_edge('B', 'A')), 2) self.assertEqual(m2.get_graph().get_edge('A', 'B').attr['label'], 'to_B') def test_roi(self): m = self.machine_cls(states=['A', 'B', 'C', 'D', 'E', 'F'], initial='A') m.add_transition('to_state_A', 'B', 'A') m.add_transition('to_state_C', 'B', 'C') m.add_transition('to_state_F', 'B', 'F') g1 = m.get_graph(show_roi=True) self.assertEqual(len(g1.edges()), 0) self.assertEqual(len(g1.nodes()), 1) m.to_B() g2 = m.get_graph(show_roi=True) self.assertEqual(len(g2.edges()), 4) self.assertEqual(len(g2.nodes()), 4) def test_state_tags(self): @add_state_features(Tags, Timeout) class CustomMachine(self.machine_cls): # type: ignore pass self.states[0] = {'name': 'A', 'tags': ['new', 'polling'], 'timeout': 5, 'on_enter': 'say_hello', 'on_exit': 'say_goodbye', 'on_timeout': 'do_something'} m = CustomMachine(states=self.states, transitions=self.transitions, initial='A', show_state_attributes=True) g = m.get_graph(show_roi=True) @skipIf(pgv is None, 'NestedGraph diagram requires pygraphviz') class TestPygraphvizNested(TestDiagramsNested, PygraphvizTest): use_pygraphviz = True transitions-0.9.0/tests/test_states.py0000644000232200023220000001407714304350474020536 0ustar debalancedebalancefrom transitions import Machine, MachineError from transitions.extensions.states import * from transitions.extensions import MachineFactory from time import sleep from unittest import TestCase from .test_graphviz import TestDiagramsLockedNested try: from unittest.mock import MagicMock except ImportError: from mock import MagicMock # type: ignore class TestTransitions(TestCase): def test_tags(self): @add_state_features(Tags) class CustomMachine(Machine): pass states = [{"name": "A", "tags": ["initial", "success", "error_state"]}] m = CustomMachine(states=states, initial='A') s = m.get_state(m.state) self.assertTrue(s.is_initial) self.assertTrue(s.is_success) self.assertTrue(s.is_error_state) self.assertFalse(s.is_not_available) def test_error(self): @add_state_features(Error) class CustomMachine(Machine): pass states = ['A', 'B', 'F', {'name': 'S1', 'tags': ['accepted']}, {'name': 'S2', 'accepted': True}] transitions = [['to_B', ['S1', 'S2'], 'B'], ['go', 'A', 'B'], ['fail', 'B', 'F'], ['success1', 'B', 'S2'], ['success2', 'B', 'S2']] m = CustomMachine(states=states, transitions=transitions, auto_transitions=False, initial='A') m.go() m.success1() self.assertTrue(m.get_state(m.state).is_accepted) m.to_B() m.success2() self.assertTrue(m.get_state(m.state).is_accepted) m.to_B() with self.assertRaises(MachineError): m.fail() def test_error_callback(self): @add_state_features(Error) class CustomMachine(Machine): pass mock_callback = MagicMock() states = ['A', {"name": "B", "on_enter": mock_callback}, 'C'] transitions = [ ["to_B", "A", "B"], ["to_C", "B", "C"], ] m = CustomMachine(states=states, transitions=transitions, auto_transitions=False, initial='A') m.to_B() self.assertEqual(m.state, "B") self.assertTrue(mock_callback.called) def test_timeout(self): mock = MagicMock() @add_state_features(Timeout) class CustomMachine(Machine): def timeout(self): mock() states = ['A', {'name': 'B', 'timeout': 0.3, 'on_timeout': 'timeout'}, {'name': 'C', 'timeout': 0.3, 'on_timeout': mock}] m = CustomMachine(states=states) m.to_B() m.to_A() sleep(0.4) self.assertFalse(mock.called) m.to_B() sleep(0.4) self.assertTrue(mock.called) m.to_C() sleep(0.4) self.assertEqual(mock.call_count, 2) with self.assertRaises(AttributeError): m.add_state({'name': 'D', 'timeout': 0.3}) def test_timeout_callbacks(self): timeout = MagicMock() notification = MagicMock() counter = MagicMock() @add_state_features(Timeout) class CustomMachine(Machine): pass class Model(object): def on_timeout_B(self): counter() def timeout(self): timeout() def notification(self): notification() def another_notification(self): notification() states = ['A', {'name': 'B', 'timeout': 0.05, 'on_timeout': 'timeout'}] model = Model() machine = CustomMachine(model=model, states=states, initial='A') model.to_B() sleep(0.1) self.assertTrue(timeout.called) self.assertTrue(counter.called) machine.get_state('B').add_callback('timeout', 'notification') machine.on_timeout_B('another_notification') model.to_B() sleep(0.1) self.assertEqual(timeout.call_count, 2) self.assertEqual(counter.call_count, 2) self.assertTrue(notification.called) machine.get_state('B').on_timeout = [] model.to_B() sleep(0.1) self.assertEqual(timeout.call_count, 2) self.assertEqual(notification.call_count, 2) def test_timeout_transitioning(self): timeout_mock = MagicMock() @add_state_features(Timeout) class CustomMachine(Machine): pass states = ['A', {'name': 'B', 'timeout': 0.05, 'on_timeout': ['to_A', timeout_mock]}] machine = CustomMachine(states=states, initial='A') machine.to_B() sleep(0.1) self.assertTrue(machine.is_A()) self.assertTrue(timeout_mock.called) def test_volatile(self): class TemporalState(object): def __init__(self): self.value = 5 def increase(self): self.value += 1 @add_state_features(Volatile) class CustomMachine(Machine): pass states = ['A', {'name': 'B', 'volatile': TemporalState}] m = CustomMachine(states=states, initial='A') m.to_B() self.assertEqual(m.scope.value, 5) # should call method of TemporalState m.scope.increase() self.assertEqual(m.scope.value, 6) # re-entering state should reset default volatile object m.to_A() self.assertFalse(hasattr(m.scope, 'value')) m.scope.foo = 'bar' m.to_B() # custom attribute of A should be gone self.assertFalse(hasattr(m.scope, 'foo')) # value should be reset self.assertEqual(m.scope.value, 5) class TestStatesDiagramsLockedNested(TestDiagramsLockedNested): def setUp(self): machine_cls = MachineFactory.get_predefined(locked=True, nested=True, graph=True) @add_state_features(Error, Timeout, Volatile) class CustomMachine(machine_cls): # type: ignore pass super(TestStatesDiagramsLockedNested, self).setUp() self.machine_cls = CustomMachine def test_nested_notebook(self): # test will create a custom state machine already. This will cause errors when inherited. self.assertTrue(True) transitions-0.9.0/tests/test_factory.py0000644000232200023220000000365014304350474020675 0ustar debalancedebalancetry: from builtins import object except ImportError: pass from unittest import TestCase from transitions.extensions import MachineFactory class TestFactory(TestCase): def setUp(self): self.factory = MachineFactory() def test_mixins(self): machine_cls = self.factory.get_predefined() self.assertFalse(hasattr(machine_cls, 'set_edge_state')) graph_cls = self.factory.get_predefined(graph=True) self.assertTrue(hasattr(graph_cls, '_get_graph')) nested_cls = self.factory.get_predefined(nested=True) self.assertFalse(hasattr(nested_cls, '_get_graph')) self.assertTrue(hasattr(nested_cls, 'get_nested_triggers')) locked_cls = self.factory.get_predefined(locked=True) self.assertFalse(hasattr(locked_cls, '_get_graph')) self.assertFalse(hasattr(locked_cls, 'get_nested_triggers')) self.assertTrue('__getattribute__' in locked_cls.__dict__) locked_nested_cls = self.factory.get_predefined(nested=True, locked=True) self.assertFalse(hasattr(locked_nested_cls, '_get_graph')) self.assertTrue(hasattr(locked_nested_cls, 'get_nested_triggers')) self.assertEqual(locked_nested_cls.__getattribute__, locked_cls.__getattribute__) self.assertNotEqual(machine_cls.__getattribute__, locked_cls.__getattribute__) graph_locked_cls = self.factory.get_predefined(graph=True, locked=True) self.assertTrue(hasattr(graph_locked_cls, '_get_graph')) self.assertEqual(graph_locked_cls.__getattribute__, locked_cls.__getattribute__) graph_nested_cls = self.factory.get_predefined(graph=True, nested=True) self.assertNotEqual(nested_cls._create_transition, graph_nested_cls._create_transition) locked_nested_graph_cls = self.factory.get_predefined(nested=True, locked=True, graph=True) self.assertNotEqual(locked_nested_graph_cls._create_event, graph_cls._create_event) transitions-0.9.0/tests/__init__.py0000644000232200023220000000000014304350474017710 0ustar debalancedebalancetransitions-0.9.0/tests/test_async.py0000644000232200023220000005110414304350474020340 0ustar debalancedebalancefrom transitions.extensions.asyncio import AsyncMachine, HierarchicalAsyncMachine from transitions.extensions.factory import AsyncGraphMachine, HierarchicalAsyncGraphMachine try: import asyncio except (ImportError, SyntaxError): asyncio = None # type: ignore from unittest.mock import MagicMock from unittest import skipIf from functools import partial import weakref from .test_core import TestTransitions, MachineError, TYPE_CHECKING from .utils import DummyModel from .test_graphviz import pgv as gv from .test_pygraphviz import pgv if TYPE_CHECKING: from typing import Type @skipIf(asyncio is None, "AsyncMachine requires asyncio and contextvars suppport") class TestAsync(TestTransitions): @staticmethod async def await_false(): await asyncio.sleep(0.1) return False @staticmethod async def await_true(): await asyncio.sleep(0.1) return True @staticmethod async def cancel_soon(): await asyncio.sleep(1) raise TimeoutError("Callback was not cancelled!") @staticmethod def raise_value_error(): raise ValueError("ValueError raised.") @staticmethod def synced_true(): return True @staticmethod async def call_delayed(func, time): await asyncio.sleep(time) await func() def setUp(self): super(TestAsync, self).setUp() self.machine_cls = AsyncMachine # type: Type[AsyncMachine] self.machine = self.machine_cls(states=['A', 'B', 'C'], transitions=[['go', 'A', 'B']], initial='A') def test_new_state_in_enter_callback(self): machine = self.machine_cls(states=['A', 'B'], initial='A') async def on_enter_B(): state = self.machine_cls.state_cls(name='C') machine.add_state(state) await machine.to_C() machine.on_enter_B(on_enter_B) asyncio.run(machine.to_B()) def test_dynamic_model_state_attribute(self): class Model: def __init__(self): self.status = None self.state = 'some_value' m = self.machine_cls(Model(), states=['A', 'B'], initial='A', model_attribute='status') self.assertEqual(m.model.status, 'A') self.assertEqual(m.model.state, 'some_value') m.add_transition('move', 'A', 'B') asyncio.run(m.model.move()) self.assertEqual(m.model.status, 'B') self.assertEqual(m.model.state, 'some_value') def test_async_machine_cb(self): mock = MagicMock() async def async_process(): await asyncio.sleep(0.1) mock() m = self.machine m.after_state_change = [async_process] asyncio.run(m.go()) self.assertEqual(m.state, 'B') self.assertTrue(mock.called) def test_async_condition(self): m = self.machine m.add_transition('proceed', 'A', 'C', conditions=self.await_true, unless=self.await_false) asyncio.run(m.proceed()) self.assertEqual(m.state, 'C') def test_async_enter_exit(self): enter_mock = MagicMock() exit_mock = MagicMock() async def async_enter(): await asyncio.sleep(0.1) enter_mock() async def async_exit(): await asyncio.sleep(0.1) exit_mock() m = self.machine m.on_exit_A(async_exit) m.on_enter_B(async_enter) asyncio.run(m.go()) self.assertTrue(exit_mock.called) self.assertTrue(enter_mock.called) def test_sync_conditions(self): mock = MagicMock() def sync_process(): mock() m = self.machine m.add_transition('proceed', 'A', 'C', conditions=self.synced_true, after=sync_process) asyncio.run(m.proceed()) self.assertEqual(m.state, 'C') self.assertTrue(mock.called) def test_multiple_models(self): m1 = self.machine_cls(states=['A', 'B', 'C'], initial='A', name="m1") m2 = self.machine_cls(states=['A'], initial='A', name='m2') m1.add_transition(trigger='go', source='A', dest='B', before=self.cancel_soon) m1.add_transition(trigger='fix', source='A', dest='C', after=self.cancel_soon) m1.add_transition(trigger='check', source='C', dest='B', conditions=self.await_false) m1.add_transition(trigger='reset', source='C', dest='A') m2.add_transition(trigger='go', source='A', dest=None, conditions=m1.is_C, after=m1.reset) async def run(): _ = asyncio.gather(m1.go(), # should block before B self.call_delayed(m1.fix, 0.05), # should cancel task and go to C self.call_delayed(m1.check, 0.07), # should exit before m1.fix self.call_delayed(m2.go, 0.1)) # should cancel m1.fix assert m1.is_A() asyncio.run(run()) def test_async_callback_arguments(self): async def process(should_fail=True): if should_fail is not False: raise ValueError("should_fail has been set") self.machine.on_enter_B(process) with self.assertRaises(ValueError): asyncio.run(self.machine.go()) asyncio.run(self.machine.to_A()) asyncio.run(self.machine.go(should_fail=False)) def test_async_callback_event_data(self): state_a = self.machine_cls.state_cls('A') state_b = self.machine_cls.state_cls('B') def sync_condition(event_data): return event_data.state == state_a async def async_conditions(event_data): return event_data.state == state_a async def async_callback(event_data): self.assertEqual(event_data.state, state_b) def sync_callback(event_data): self.assertEqual(event_data.state, state_b) m = self.machine_cls(states=[state_a, state_b], initial='A', send_event=True) m.add_transition('go', 'A', 'B', conditions=[sync_condition, async_conditions], after=[sync_callback, async_callback]) m.add_transition('go', 'B', 'A', conditions=sync_condition) asyncio.run(m.go()) self.assertTrue(m.is_B()) asyncio.run(m.go()) self.assertTrue(m.is_B()) def test_async_invalid_triggers(self): asyncio.run(self.machine.to_B()) with self.assertRaises(MachineError): asyncio.run(self.machine.go()) self.machine.ignore_invalid_triggers = True asyncio.run(self.machine.go()) self.assertTrue(self.machine.is_B()) def test_async_dispatch(self): model1 = DummyModel() model2 = DummyModel() model3 = DummyModel() machine = self.machine_cls(model=None, states=['A', 'B', 'C'], transitions=[['go', 'A', 'B'], ['go', 'B', 'C'], ['go', 'C', 'A']], initial='A') machine.add_model(model1) machine.add_model(model2, initial='B') machine.add_model(model3, initial='C') asyncio.run(machine.dispatch('go')) self.assertTrue(model1.is_B()) self.assertEqual('C', model2.state) self.assertEqual(machine.initial, model3.state) def test_queued(self): states = ['A', 'B', 'C', 'D'] # Define with list of dictionaries async def change_state(machine): self.assertEqual(machine.state, 'A') if machine.has_queue: await machine.run(machine=machine) self.assertEqual(machine.state, 'A') else: with self.assertRaises(MachineError): await machine.run(machine=machine) async def raise_machine_error(event_data): self.assertTrue(event_data.machine.has_queue) await event_data.model.to_A() event_data.machine._queued = False await event_data.model.to_C() async def raise_exception(event_data): await event_data.model.to_C() raise ValueError("Clears queue") transitions = [ {'trigger': 'walk', 'source': 'A', 'dest': 'B', 'before': change_state}, {'trigger': 'run', 'source': 'B', 'dest': 'C'}, {'trigger': 'sprint', 'source': 'C', 'dest': 'D'} ] m = self.machine_cls(states=states, transitions=transitions, initial='A') asyncio.run(m.walk(machine=m)) self.assertEqual('B', m.state) m = self.machine_cls(states=states, transitions=transitions, initial='A', queued=True) asyncio.run(m.walk(machine=m)) self.assertEqual('C', m.state) m = self.machine_cls(states=states, initial='A', queued=True, send_event=True, before_state_change=raise_machine_error) with self.assertRaises(MachineError): asyncio.run(m.to_C()) m = self.machine_cls(states=states, initial='A', queued=True, send_event=True) m.add_transition('go', 'A', 'B', after='go') m.add_transition('go', 'B', 'C', before=raise_exception) with self.assertRaises(ValueError): asyncio.run(m.go()) self.assertEqual('B', m.state) def test_model_queue(self): mock = MagicMock() def check_mock(): self.assertTrue(mock.called) m1 = DummyModel() m2 = DummyModel() async def run(): transitions = [{'trigger': 'mock', 'source': ['A', 'B'], 'dest': 'B', 'after': mock}, {'trigger': 'delayed', 'source': 'A', 'dest': 'B', 'before': partial(asyncio.sleep, 0.1)}, {'trigger': 'check', 'source': 'B', 'dest': 'A', 'after': check_mock}, {'trigger': 'error', 'source': 'B', 'dest': 'C', 'before': self.raise_value_error}] m = self.machine_cls(model=[m1, m2], states=['A', 'B', 'C'], transitions=transitions, initial='A', queued='model') # call m1.delayed and m2.mock should be called immediately # m1.check should be delayed until after m1.delayed await asyncio.gather(m1.delayed(), self.call_delayed(m1.check, 0.02), self.call_delayed(m2.mock, 0.04)) self.assertTrue(m1.is_A()) self.assertTrue(m2.is_B()) mock.reset_mock() with self.assertRaises(ValueError): # m1.error raises an error which should cancel m1.to_A but not m2.mock and m2.check await asyncio.gather(m1.to_A(), m2.to_A(), self.call_delayed(m1.delayed, 0.01), self.call_delayed(m2.delayed, 0.01), self.call_delayed(m1.error, 0.02), self.call_delayed(m1.to_A, 0.03), self.call_delayed(m2.mock, 0.03), self.call_delayed(m2.check, 0.04)) await asyncio.sleep(0.05) # give m2 events time to finish self.assertTrue(m1.is_B()) self.assertTrue(m2.is_A()) asyncio.run(run()) def test_queued_remove(self): def remove_model(event_data): event_data.machine.remove_model(event_data.model) def check_queue(expect, event_data): self.assertEqual(expect, len(event_data.machine._transition_queue_dict[id(event_data.model)])) transitions = [ {'trigger': 'go', 'source': 'A', 'dest': 'B', 'after': partial(asyncio.sleep, 0.1)}, {'trigger': 'go', 'source': 'B', 'dest': 'C'}, {'trigger': 'remove', 'source': 'B', 'dest': None, 'prepare': ['to_A', 'to_C'], 'before': partial(check_queue, 4), 'after': remove_model}, {'trigger': 'remove_queue', 'source': 'B', 'dest': None, 'prepare': ['to_A', 'to_C'], 'before': partial(check_queue, 3), 'after': remove_model} ] async def run(): m1 = DummyModel() m2 = DummyModel() self.machine_cls = HierarchicalAsyncMachine m = self.machine_cls(model=[m1, m2], states=['A', 'B', 'C'], transitions=transitions, initial='A', queued=True, send_event=True) await asyncio.gather(m1.go(), m2.go(), self.call_delayed(m1.remove, 0.02), self.call_delayed(m2.go, 0.04)) _ = repr(m._transition_queue_dict) # check whether _DictionaryMock returns a valid representation self.assertTrue(m1.is_B()) self.assertTrue(m2.is_C()) m.remove_model(m2) self.assertNotIn(id(m1), m._transition_queue_dict) self.assertNotIn(id(m2), m._transition_queue_dict) m1 = DummyModel() m2 = DummyModel() m = self.machine_cls(model=[m1, m2], states=['A', 'B', 'C'], transitions=transitions, initial='A', queued='model', send_event=True) await asyncio.gather(m1.go(), m2.go(), self.call_delayed(m1.remove_queue, 0.02), self.call_delayed(m2.go, 0.04)) self.assertTrue(m1.is_B()) self.assertTrue(m2.is_C()) m.remove_model(m2) asyncio.run(run()) def test_async_timeout(self): from transitions.extensions.states import add_state_features from transitions.extensions.asyncio import AsyncTimeout timeout_called = MagicMock() @add_state_features(AsyncTimeout) class TimeoutMachine(self.machine_cls): # type: ignore pass states = ['A', {'name': 'B', 'timeout': 0.2, 'on_timeout': ['to_C', timeout_called]}, {'name': 'C', 'timeout': 0, 'on_timeout': 'to_D'}, 'D'] m = TimeoutMachine(states=states, initial='A') with self.assertRaises(AttributeError): m.add_state('Fail', timeout=1) async def run(): await m.to_B() await asyncio.sleep(0.1) self.assertTrue(m.is_B()) # timeout shouldn't be triggered await m.to_A() # cancel timeout self.assertTrue(m.is_A()) await m.to_B() await asyncio.sleep(0.3) self.assertTrue(m.is_C()) # now timeout should have been processed self.assertTrue(timeout_called.called) m.get_state('C').timeout = 0.05 await m.to_B() await asyncio.sleep(0.3) self.assertTrue(m.is_D()) self.assertEqual(2, timeout_called.call_count) asyncio.run(run()) def test_callback_order(self): finished = [] class Model: async def before(self): await asyncio.sleep(0.1) finished.append(2) async def after(self): await asyncio.sleep(0.1) finished.append(3) async def after_state_change(): finished.append(4) async def before_state_change(): finished.append(1) model = Model() m = self.machine_cls( model=model, states=['start', 'end'], after_state_change=after_state_change, before_state_change=before_state_change, initial='start', ) m.add_transition('transit', 'start', 'end', after='after', before='before') asyncio.run(model.transit()) assert finished == [1, 2, 3, 4] def test_task_cleanup(self): models = [DummyModel() for i in range(100)] m = self.machine_cls(model=models, states=['A', 'B'], initial='A') self.assertEqual(0, len(m.async_tasks)) # check whether other tests were already leaking tasks async def run(): for model in m.models: await model.to_B() asyncio.run(run()) self.assertEqual(0, len(m.async_tasks)) def test_on_exception_callback(self): mock = MagicMock() def on_exception(event_data): self.assertIsInstance(event_data.error, (ValueError, MachineError)) mock() m = self.machine_cls(states=['A', 'B'], initial='A', transitions=[['go', 'A', 'B']], send_event=True, after_state_change=partial(self.stuff.this_raises, ValueError)) async def run(): with self.assertRaises(ValueError): await m.to_B() m.on_exception.append(on_exception) await m.to_B() await m.go() self.assertTrue(mock.called) self.assertEqual(2, mock.call_count) self.assertTrue(mock.called) asyncio.run(run()) def test_weakproxy_model(self): d = DummyModel() pr = weakref.proxy(d) self.machine_cls(pr, states=['A', 'B'], transitions=[['go', 'A', 'B']], initial='A') asyncio.run(pr.go()) self.assertTrue(pr.is_B()) def test_may_transition_with_auto_transitions(self): states = ['A', 'B', 'C'] d = DummyModel() self.machine_cls(model=d, states=states, initial='A') async def run(): assert await d.may_to_A() assert await d.may_to_B() assert await d.may_to_C() asyncio.run(run()) def test_machine_may_transitions(self): states = ['A', 'B', 'C'] m = self.machine_cls(states=states, initial='A', auto_transitions=False) m.add_transition('walk', 'A', 'B', conditions=[lambda: False]) m.add_transition('stop', 'B', 'C') m.add_transition('run', 'A', 'C') async def run(): assert not await m.may_walk() assert not await m.may_stop() assert await m.may_run() await m.run() assert not await m.may_run() assert not await m.may_stop() assert not await m.may_walk() asyncio.run(run()) def test_may_transition_with_invalid_state(self): states = ['A', 'B', 'C'] d = DummyModel() m = self.machine_cls(model=d, states=states, initial='A', auto_transitions=False) m.add_transition('walk', 'A', 'UNKNOWN') async def run(): assert not await d.may_walk() asyncio.run(run()) @skipIf(asyncio is None or (pgv is None and gv is None), "AsyncGraphMachine requires asyncio and (py)gaphviz") class TestAsyncGraphMachine(TestAsync): def setUp(self): super(TestAsync, self).setUp() self.machine_cls = AsyncGraphMachine # type: Type[AsyncGraphMachine] self.machine = self.machine_cls(states=['A', 'B', 'C'], transitions=[['go', 'A', 'B']], initial='A') class TestHierarchicalAsync(TestAsync): def setUp(self): super(TestAsync, self).setUp() self.machine_cls = HierarchicalAsyncMachine # type: Type[HierarchicalAsyncMachine] self.machine = self.machine_cls(states=['A', 'B', 'C'], transitions=[['go', 'A', 'B']], initial='A') def test_nested_async(self): mock = MagicMock() async def sleep_mock(): await asyncio.sleep(0.1) mock() states = ['A', 'B', {'name': 'C', 'children': ['1', {'name': '2', 'children': ['a', 'b'], 'initial': 'a'}, '3'], 'initial': '2'}] transitions = [{'trigger': 'go', 'source': 'A', 'dest': 'C', 'after': [sleep_mock] * 100}] machine = self.machine_cls(states=states, transitions=transitions, initial='A') asyncio.run(machine.go()) self.assertEqual('C{0}2{0}a'.format(machine.state_cls.separator), machine.state) self.assertEqual(100, mock.call_count) def test_parallel_async(self): states = ['A', 'B', {'name': 'P', 'parallel': [ {'name': '1', 'children': ['a'], 'initial': 'a'}, {'name': '2', 'children': ['b', 'c'], 'initial': 'b'}, {'name': '3', 'children': ['x', 'y', 'z'], 'initial': 'y'}]}] machine = self.machine_cls(states=states, initial='A') asyncio.run(machine.to_P()) self.assertEqual(['P{0}1{0}a'.format(machine.state_cls.separator), 'P{0}2{0}b'.format(machine.state_cls.separator), 'P{0}3{0}y'.format(machine.state_cls.separator)], machine.state) asyncio.run(machine.to_B()) self.assertTrue(machine.is_B()) @skipIf(asyncio is None or (pgv is None and gv is None), "AsyncGraphMachine requires asyncio and (py)gaphviz") class TestAsyncHierarchicalGraphMachine(TestHierarchicalAsync): def setUp(self): super(TestHierarchicalAsync, self).setUp() self.machine_cls = HierarchicalAsyncGraphMachine # type: Type[HierarchicalAsyncGraphMachine] self.machine = self.machine_cls(states=['A', 'B', 'C'], transitions=[['go', 'A', 'B']], initial='A') transitions-0.9.0/tests/test_codestyle.py0000644000232200023220000000312514304350474021216 0ustar debalancedebalanceimport unittest import subprocess from os.path import exists import pycodestyle try: import mypy except ImportError: mypy = None # type: ignore class TestCodeFormat(unittest.TestCase): def test_conformance(self): """Test that we conform to PEP-8.""" style = pycodestyle.StyleGuide(quiet=False, ignore=['E501', 'W605']) if exists('transitions'): # when run from root directory (e.g. tox) style.input_dir('transitions') style.input_dir('tests') else: # when run from test directory (e.g. pycharm) style.input_dir('../transitions') style.input_dir('.') result = style.check_files() self.assertEqual(result.total_errors, 0, "Found code style errors (and warnings).") @unittest.skipIf(mypy is None, "mypy not found") def test_mypy_package(self): call = ['mypy', '--config-file', 'mypy.ini', 'transitions'] # when run from root directory (e.g. tox) else when run from test directory (e.g. pycharm) project_root = '.' if exists('transitions') else '..' subprocess.check_call(call, cwd=project_root) @unittest.skipIf(mypy is None, "mypy not found") def test_mypy_tests(self): call = ['mypy', 'tests', '--disable-error-code', 'attr-defined', '--disable-error-code', 'no-untyped-def'] # when run from root directory (e.g. tox) else when run from test directory (e.g. pycharm) project_root = '.' if exists('transitions') else '..' subprocess.check_call(call, cwd=project_root) transitions-0.9.0/tests/test_core.py0000644000232200023220000013443514304350474020164 0ustar debalancedebalancetry: from builtins import object except ImportError: pass import sys from typing import TYPE_CHECKING from functools import partial from unittest import TestCase, skipIf import weakref from transitions import Machine, MachineError, State, EventData from transitions.core import listify, _prep_ordered_arg from .utils import InheritedStuff from .utils import Stuff, DummyModel try: from unittest.mock import MagicMock except ImportError: from mock import MagicMock # type: ignore if TYPE_CHECKING: from typing import List, Union, Dict, Callable def on_exit_A(event): event.model.exit_A_called = True def on_exit_B(event): event.model.exit_B_called = True class TestTransitions(TestCase): def setUp(self): self.stuff = Stuff() self.machine_cls = Machine def tearDown(self): pass def test_init_machine_with_hella_arguments(self): states = [ State('State1'), 'State2', { 'name': 'State3', 'on_enter': 'hello_world' } ] transitions = [ {'trigger': 'advance', 'source': 'State2', 'dest': 'State3' } ] s = Stuff() m = s.machine_cls(model=s, states=states, transitions=transitions, initial='State2') s.advance() self.assertEqual(s.message, 'Hello World!') def test_listify(self): self.assertEqual(listify(4), [4]) self.assertEqual(listify(None), []) self.assertEqual(listify((4, 5)), (4, 5)) self.assertEqual(listify([1, 3]), [1, 3]) class Foo: pass obj = Foo() proxy = weakref.proxy(obj) del obj self.assertEqual(listify(proxy), [proxy]) def test_weakproxy_model(self): d = DummyModel() pr = weakref.proxy(d) self.machine_cls(pr, states=['A', 'B'], transitions=[['go', 'A', 'B']], initial='A') pr.go() self.assertTrue(pr.is_B()) def test_property_initial(self): states = ['A', 'B', 'C', 'D'] # Define with list of dictionaries transitions = [ {'trigger': 'walk', 'source': 'A', 'dest': 'B'}, {'trigger': 'run', 'source': 'B', 'dest': 'C'}, {'trigger': 'sprint', 'source': 'C', 'dest': 'D'} ] m = self.stuff.machine_cls(states=states, transitions=transitions, initial='A') self.assertEqual(m.initial, 'A') m = self.stuff.machine_cls(states=states, transitions=transitions, initial='C') self.assertEqual(m.initial, 'C') m = self.stuff.machine_cls(states=states, transitions=transitions) self.assertEqual(m.initial, 'initial') def test_transition_definitions(self): states = ['A', 'B', 'C', 'D'] # Define with list of dictionaries transitions = [ {'trigger': 'walk', 'source': 'A', 'dest': 'B'}, {'trigger': 'run', 'source': 'B', 'dest': 'C'}, {'trigger': 'sprint', 'source': 'C', 'dest': 'D'} ] # type: List[Union[List[str], Dict[str, str]]] m = Machine(states=states, transitions=transitions, initial='A') m.walk() self.assertEqual(m.state, 'B') # Define with list of lists transitions = [ ['walk', 'A', 'B'], ['run', 'B', 'C'], ['sprint', 'C', 'D'] ] m = Machine(states=states, transitions=transitions, initial='A') m.to_C() m.sprint() self.assertEqual(m.state, 'D') def test_add_states(self): s = self.stuff s.machine.add_state('X') s.machine.add_state('Y') s.machine.add_state('Z') event = s.machine.events['to_{0}'.format(s.state)] self.assertEqual(1, len(event.transitions['X'])) def test_transitioning(self): s = self.stuff s.machine.add_transition('advance', 'A', 'B') s.machine.add_transition('advance', 'B', 'C') s.machine.add_transition('advance', 'C', 'D') s.advance() self.assertEqual(s.state, 'B') self.assertFalse(s.is_A()) self.assertTrue(s.is_B()) s.advance() self.assertEqual(s.state, 'C') def test_pass_state_instances_instead_of_names(self): state_A = State('A') state_B = State('B') states = [state_A, state_B] m = Machine(states=states, initial=state_A) assert m.state == 'A' m.add_transition('advance', state_A, state_B) m.advance() assert m.state == 'B' state_B2 = State('B', on_enter='this_passes') with self.assertRaises(ValueError): m.add_transition('advance2', state_A, state_B2) m2 = Machine(states=states, initial=state_A.name) assert m.initial == m2.initial with self.assertRaises(ValueError): Machine(states=states, initial=State('A')) def test_conditions(self): s = self.stuff s.machine.add_transition('advance', 'A', 'B', conditions='this_passes') s.machine.add_transition('advance', 'B', 'C', unless=['this_fails']) s.machine.add_transition('advance', 'C', 'D', unless=['this_fails', 'this_passes']) s.advance() self.assertEqual(s.state, 'B') s.advance() self.assertEqual(s.state, 'C') s.advance() self.assertEqual(s.state, 'C') def test_uncallable_callbacks(self): s = self.stuff s.machine.add_transition('advance', 'A', 'B', conditions=['property_that_fails', 'is_false']) # make sure parameters passed by trigger events can be handled s.machine.add_transition('advance', 'A', 'C', before=['property_that_fails', 'is_false']) s.advance(level='MaximumSpeed') self.assertTrue(s.is_C()) def test_conditions_with_partial(self): def check(result): return result s = self.stuff s.machine.add_transition('advance', 'A', 'B', conditions=partial(check, True)) s.machine.add_transition('advance', 'B', 'C', unless=[partial(check, False)]) s.machine.add_transition('advance', 'C', 'D', unless=[partial(check, False), partial(check, True)]) s.advance() self.assertEqual(s.state, 'B') s.advance() self.assertEqual(s.state, 'C') s.advance() self.assertEqual(s.state, 'C') def test_multiple_add_transitions_from_state(self): s = self.stuff s.machine.add_transition( 'advance', 'A', 'B', conditions=['this_fails']) s.machine.add_transition('advance', 'A', 'C') s.advance() self.assertEqual(s.state, 'C') def test_use_machine_as_model(self): states = ['A', 'B', 'C', 'D'] m = Machine(states=states, initial='A') m.add_transition('move', 'A', 'B') m.add_transition('move_to_C', 'B', 'C') m.move() self.assertEqual(m.state, 'B') def test_state_change_listeners(self): s = self.stuff s.machine.add_transition('advance', 'A', 'B') s.machine.add_transition('reverse', 'B', 'A') s.machine.on_enter_B('hello_world') s.machine.on_exit_B('goodbye') s.advance() self.assertEqual(s.state, 'B') self.assertEqual(s.message, 'Hello World!') s.reverse() self.assertEqual(s.state, 'A') self.assertTrue(s.message is not None and s.message.startswith('So long')) def test_before_after_callback_addition(self): m = Machine(Stuff(), states=['A', 'B', 'C'], initial='A') m.add_transition('move', 'A', 'B') trans = m.events['move'].transitions['A'][0] trans.add_callback('after', 'increase_level') m.model.move() self.assertEqual(m.model.level, 2) def test_before_after_transition_listeners(self): m = Machine(Stuff(), states=['A', 'B', 'C'], initial='A') m.add_transition('move', 'A', 'B') m.add_transition('move', 'B', 'C') m.before_move('increase_level') m.model.move() self.assertEqual(m.model.level, 2) m.model.move() self.assertEqual(m.model.level, 3) def test_prepare(self): m = Machine(Stuff(), states=['A', 'B', 'C'], initial='A') m.add_transition('move', 'A', 'B', prepare='increase_level') m.add_transition('move', 'B', 'C', prepare='increase_level') m.add_transition('move', 'C', 'A', prepare='increase_level', conditions='this_fails') m.add_transition('dont_move', 'A', 'C', prepare='increase_level') m.prepare_move('increase_level') m.model.move() self.assertEqual(m.model.state, 'B') self.assertEqual(m.model.level, 3) m.model.move() self.assertEqual(m.model.state, 'C') self.assertEqual(m.model.level, 5) # State does not advance, but increase_level still runs m.model.move() self.assertEqual(m.model.state, 'C') self.assertEqual(m.model.level, 7) # An invalid transition shouldn't execute the callback try: m.model.dont_move() except MachineError as e: self.assertTrue("Can't trigger event" in str(e)) self.assertEqual(m.model.state, 'C') self.assertEqual(m.model.level, 7) def test_state_model_change_listeners(self): s = self.stuff s.machine.add_transition('go_e', 'A', 'E') s.machine.add_transition('go_f', 'E', 'F') s.machine.on_enter_F('hello_F') s.go_e() self.assertEqual(s.state, 'E') self.assertEqual(s.message, 'I am E!') s.go_f() self.assertEqual(s.state, 'F') self.assertEqual(s.exit_message, 'E go home...') self.assertIn('I am F!', s.message or "") self.assertIn('Hello F!', s.message or "") def test_inheritance(self): states = ['A', 'B', 'C', 'D', 'E'] s = InheritedStuff(states=states, initial='A') s.add_transition('advance', 'A', 'B', conditions='this_passes') s.add_transition('advance', 'B', 'C') s.add_transition('advance', 'C', 'D') s.advance() self.assertEqual(s.state, 'B') self.assertFalse(s.is_A()) self.assertTrue(s.is_B()) s.advance() self.assertEqual(s.state, 'C') class NewMachine(Machine): def __init__(self, *args, **kwargs): super(NewMachine, self).__init__(*args, **kwargs) n = NewMachine(states=states, transitions=[['advance', 'A', 'B']], initial='A') self.assertTrue(n.is_A()) n.advance() self.assertTrue(n.is_B()) with self.assertRaises(ValueError): NewMachine(state=['A', 'B']) def test_send_event_data_callbacks(self): states = ['A', 'B', 'C', 'D', 'E'] s = Stuff() # First pass positional and keyword args directly to the callback m = Machine(model=s, states=states, initial='A', send_event=False, auto_transitions=True) m.add_transition( trigger='advance', source='A', dest='B', before='set_message') s.advance(message='Hallo. My name is Inigo Montoya.') self.assertTrue(s.message is not None and s.message.startswith('Hallo.')) s.to_A() s.advance('Test as positional argument') self.assertTrue(s.message is not None and s.message.startswith('Test as')) # Now wrap arguments in an EventData instance m.send_event = True m.add_transition( trigger='advance', source='B', dest='C', before='extract_message') s.advance(message='You killed my father. Prepare to die.') self.assertTrue(s.message is not None and s.message.startswith('You')) def test_send_event_data_conditions(self): states = ['A', 'B', 'C', 'D'] s = Stuff() # First pass positional and keyword args directly to the condition m = Machine(model=s, states=states, initial='A', send_event=False) m.add_transition( trigger='advance', source='A', dest='B', conditions='this_fails_by_default') s.advance(boolean=True) self.assertEqual(s.state, 'B') # Now wrap arguments in an EventData instance m.send_event = True m.add_transition( trigger='advance', source='B', dest='C', conditions='extract_boolean') s.advance(boolean=False) self.assertEqual(s.state, 'B') def test_auto_transitions(self): states = ['A', {'name': 'B'}, State(name='C')] # type: List[Union[str, Dict[str, str], State]] m = Machine(states=states, initial='A', auto_transitions=True) m.to_B() self.assertEqual(m.state, 'B') m.to_C() self.assertEqual(m.state, 'C') m.to_A() self.assertEqual(m.state, 'A') # Should fail if auto transitions is off... m = Machine(states=states, initial='A', auto_transitions=False) with self.assertRaises(AttributeError): m.to_C() def test_ordered_transitions(self): states = ['beginning', 'middle', 'end'] m = Machine(states=states) m.add_ordered_transitions() self.assertEqual(m.state, 'initial') m.next_state() self.assertEqual(m.state, 'beginning') m.next_state() m.next_state() self.assertEqual(m.state, 'end') m.next_state() self.assertEqual(m.state, 'initial') # Include initial state in loop m = Machine(states=states) m.add_ordered_transitions(loop_includes_initial=False) m.to_end() m.next_state() self.assertEqual(m.state, 'beginning') # Do not loop transitions m = Machine(states=states) m.add_ordered_transitions(loop=False) m.to_end() with self.assertRaises(MachineError): m.next_state() # Test user-determined sequence and trigger name m = Machine(states=states, initial='beginning') m.add_ordered_transitions(['end', 'beginning'], trigger='advance') m.advance() self.assertEqual(m.state, 'end') m.advance() self.assertEqual(m.state, 'beginning') # Via init argument m = Machine(states=states, initial='beginning', ordered_transitions=True) m.next_state() self.assertEqual(m.state, 'middle') # Alter initial state m = Machine(states=states, initial='middle', ordered_transitions=True) m.next_state() self.assertEqual(m.state, 'end') m.next_state() self.assertEqual(m.state, 'beginning') # Partial state machine without the initial state m = Machine(states=states, initial='beginning') m.add_ordered_transitions(['middle', 'end']) self.assertEqual(m.state, 'beginning') with self.assertRaises(MachineError): m.next_state() m.to_middle() for s in ('end', 'middle', 'end'): m.next_state() self.assertEqual(m.state, s) def test_ordered_transition_error(self): m = Machine(states=['A'], initial='A') with self.assertRaises(ValueError): m.add_ordered_transitions() m.add_state('B') m.add_ordered_transitions() m.add_state('C') with self.assertRaises(ValueError): m.add_ordered_transitions(['C']) def test_ignore_invalid_triggers(self): a_state = State('A') transitions = [['a_to_b', 'A', 'B']] # Exception is triggered by default b_state = State('B') m1 = Machine(states=[a_state, b_state], transitions=transitions, initial='B') with self.assertRaises(MachineError): m1.a_to_b() # Set default value on machine level m2 = Machine(states=[a_state, b_state], transitions=transitions, initial='B', ignore_invalid_triggers=True) m2.a_to_b() # Exception is suppressed, so this passes b_state = State('B', ignore_invalid_triggers=True) m3 = Machine(states=[a_state, b_state], transitions=transitions, initial='B') m3.a_to_b() # Set for some states but not others new_states = ['C', 'D'] m1.add_states(new_states, ignore_invalid_triggers=True) m1.to_D() m1.a_to_b() # passes because exception suppressed for D m1.to_B() with self.assertRaises(MachineError): m1.a_to_b() # State value overrides machine behaviour m3 = Machine(states=[a_state, b_state], transitions=transitions, initial='B', ignore_invalid_triggers=False) m3.a_to_b() def test_string_callbacks(self): m = Machine(states=['A', 'B'], before_state_change='before_state_change', after_state_change='after_state_change', send_event=True, initial='A', auto_transitions=True) m.before_state_change = MagicMock() m.after_state_change = MagicMock() m.to_B() self.assertTrue(m.before_state_change[0].called) self.assertTrue(m.after_state_change[0].called) # after_state_change should have been called with EventData event_data = m.after_state_change[0].call_args[0][0] self.assertIsInstance(event_data, EventData) self.assertTrue(event_data.result) def test_function_callbacks(self): before_state_change = MagicMock() after_state_change = MagicMock() m = Machine(states=['A', 'B'], before_state_change=before_state_change, after_state_change=after_state_change, send_event=True, initial='A', auto_transitions=True) self.assertEqual(before_state_change, m.before_state_change[0]) self.assertEqual(after_state_change, m.after_state_change[0]) m.to_B() self.assertTrue(before_state_change.called) self.assertTrue(after_state_change.called) def test_state_callbacks(self): class Model: def on_enter_A(self): pass def on_exit_A(self): pass def on_enter_B(self): pass def on_exit_B(self): pass states = [State(name='A', on_enter='on_enter_A', on_exit='on_exit_A'), State(name='B', on_enter='on_enter_B', on_exit='on_exit_B')] machine = Machine(Model(), states=states) state_a = machine.get_state('A') state_b = machine.get_state('B') self.assertEqual(len(state_a.on_enter), 1) self.assertEqual(len(state_a.on_exit), 1) self.assertEqual(len(state_b.on_enter), 1) self.assertEqual(len(state_b.on_exit), 1) def test_state_callable_callbacks(self): class Model: def __init__(self): self.exit_A_called = False self.exit_B_called = False def on_enter_A(self, event): pass def on_enter_B(self, event): pass states = [State(name='A', on_enter='on_enter_A', on_exit='tests.test_core.on_exit_A'), State(name='B', on_enter='on_enter_B', on_exit=on_exit_B), State(name='C', on_enter='tests.test_core.AAAA')] model = Model() machine = Machine(model, states=states, send_event=True, initial='A') state_a = machine.get_state('A') state_b = machine.get_state('B') self.assertEqual(len(state_a.on_enter), 1) self.assertEqual(len(state_a.on_exit), 1) self.assertEqual(len(state_b.on_enter), 1) self.assertEqual(len(state_b.on_exit), 1) model.to_B() self.assertTrue(model.exit_A_called) model.to_A() self.assertTrue(model.exit_B_called) with self.assertRaises(AttributeError): model.to_C() def test_pickle(self): import sys if sys.version_info < (3, 4): import dill as pickle else: import pickle states = ['A', 'B', 'C', 'D'] # Define with list of dictionaries transitions = [ {'trigger': 'walk', 'source': 'A', 'dest': 'B'}, {'trigger': 'run', 'source': 'B', 'dest': 'C'}, {'trigger': 'sprint', 'source': 'C', 'dest': 'D'} ] m = Machine(states=states, transitions=transitions, initial='A') m.walk() dump = pickle.dumps(m) self.assertIsNotNone(dump) m2 = pickle.loads(dump) self.assertEqual(m.state, m2.state) m2.run() def test_pickle_model(self): import sys if sys.version_info < (3, 4): import dill as pickle else: import pickle self.stuff.to_B() dump = pickle.dumps(self.stuff) self.assertIsNotNone(dump) model2 = pickle.loads(dump) self.assertEqual(self.stuff.state, model2.state) model2.to_F() def test_queued(self): states = ['A', 'B', 'C', 'D'] # Define with list of dictionaries def change_state(machine): self.assertEqual(machine.state, 'A') if machine.has_queue: machine.run(machine=machine) self.assertEqual(machine.state, 'A') else: with self.assertRaises(MachineError): machine.run(machine=machine) transitions = [ {'trigger': 'walk', 'source': 'A', 'dest': 'B', 'before': change_state}, {'trigger': 'run', 'source': 'B', 'dest': 'C'}, {'trigger': 'sprint', 'source': 'C', 'dest': 'D'} ] m = Machine(states=states, transitions=transitions, initial='A') m.walk(machine=m) self.assertEqual(m.state, 'B') m = Machine(states=states, transitions=transitions, initial='A', queued=True) m.walk(machine=m) self.assertEqual(m.state, 'C') def test_queued_errors(self): def before_change(machine): if machine.has_queue: machine.to_A(machine) machine._queued = False def after_change(machine): machine.to_C(machine) states = ['A', 'B', 'C'] transitions = [{'trigger': 'do', 'source': '*', 'dest': 'C', 'before': partial(self.stuff.this_raises, ValueError)}] m = Machine(states=states, transitions=transitions, queued=True, before_state_change=before_change, after_state_change=after_change) with self.assertRaises(MachineError): m.to_B(machine=m) with self.assertRaises(ValueError): m.do(machine=m) def test_queued_remove(self): m = self.machine_cls(model=None, states=['A', 'B', 'C'], initial='A', queued=True) assert_equal = self.assertEqual class BaseModel: def on_enter_A(self): pass def on_enter_B(self): pass def on_enter_C(self): pass class SubModel(BaseModel): def __init__(self): self.inner = BaseModel() def on_enter_A(self): self.to_B() self.inner.to_B() def on_enter_B(self): self.to_C() self.inner.to_C() # queue should contain to_B(), inner.to_B(), to_C(), inner.to_C() assert_equal(4, len(m._transition_queue)) m.remove_model(self) # since to_B() is currently executed it should still be in the list, to_C should be gone assert_equal(3, len(m._transition_queue)) def on_enter_C(self): raise RuntimeError("Event was not cancelled") model = SubModel() m.add_model([model, model.inner]) model.to_A() # test whether models can be removed outside event queue m.remove_model(model.inner) self.assertTrue(model.inner.is_C()) def test___getattr___and_identify_callback(self): m = self.machine_cls(Stuff(), states=['A', 'B', 'C'], initial='A') m.add_transition('move', 'A', 'B') m.add_transition('move', 'B', 'C') callback = m.__getattr__('before_move') self.assertTrue(callable(callback)) with self.assertRaises(AttributeError): m.__getattr__('before_no_such_transition') with self.assertRaises(AttributeError): m.__getattr__('before_no_such_transition') with self.assertRaises(AttributeError): m.__getattr__('__no_such_method__') with self.assertRaises(AttributeError): m.__getattr__('') type, target = m._identify_callback('on_exit_foobar') self.assertEqual(type, 'on_exit') self.assertEqual(target, 'foobar') type, target = m._identify_callback('on_exitfoobar') self.assertEqual(type, None) self.assertEqual(target, None) type, target = m._identify_callback('notacallback_foobar') self.assertEqual(type, None) self.assertEqual(target, None) type, target = m._identify_callback('totallyinvalid') self.assertEqual(type, None) self.assertEqual(target, None) type, target = m._identify_callback('before__foobar') self.assertEqual(type, 'before') self.assertEqual(target, '_foobar') type, target = m._identify_callback('before__this__user__likes__underscores___') self.assertEqual(type, 'before') self.assertEqual(target, '_this__user__likes__underscores___') type, target = m._identify_callback('before_stuff') self.assertEqual(type, 'before') self.assertEqual(target, 'stuff') type, target = m._identify_callback('before_trailing_underscore_') self.assertEqual(type, 'before') self.assertEqual(target, 'trailing_underscore_') type, target = m._identify_callback('before_') self.assertIs(type, None) self.assertIs(target, None) type, target = m._identify_callback('__') self.assertIs(type, None) self.assertIs(target, None) type, target = m._identify_callback('') self.assertIs(type, None) self.assertIs(target, None) def test_state_and_transition_with_underscore(self): m = Machine(Stuff(), states=['_A_', '_B_', '_C_'], initial='_A_') m.add_transition('_move_', '_A_', '_B_', prepare='increase_level') m.add_transition('_after_', '_B_', '_C_', prepare='increase_level') m.add_transition('_on_exit_', '_C_', '_A_', prepare='increase_level', conditions='this_fails') m.model._move_() self.assertEqual(m.model.state, '_B_') self.assertEqual(m.model.level, 2) m.model._after_() self.assertEqual(m.model.state, '_C_') self.assertEqual(m.model.level, 3) # State does not advance, but increase_level still runs m.model._on_exit_() self.assertEqual(m.model.state, '_C_') self.assertEqual(m.model.level, 4) def test_callback_identification(self): m = Machine(Stuff(), states=['A', 'B', 'C', 'D', 'E', 'F'], initial='A') m.add_transition('transition', 'A', 'B', before='increase_level') m.add_transition('after', 'B', 'C', before='increase_level') m.add_transition('on_exit_A', 'C', 'D', before='increase_level', conditions='this_fails') m.add_transition('check', 'C', 'E', before='increase_level') m.add_transition('prepare', 'E', 'F', before='increase_level') m.add_transition('before', 'F', 'A', before='increase_level') m.before_transition('increase_level') m.before_after('increase_level') m.before_on_exit_A('increase_level') m.after_check('increase_level') m.before_prepare('increase_level') m.before_before('increase_level') m.model.transition() self.assertEqual(m.model.state, 'B') self.assertEqual(m.model.level, 3) m.model.after() self.assertEqual(m.model.state, 'C') self.assertEqual(m.model.level, 5) m.model.on_exit_A() self.assertEqual(m.model.state, 'C') self.assertEqual(m.model.level, 5) m.model.check() self.assertEqual(m.model.state, 'E') self.assertEqual(m.model.level, 7) m.model.prepare() self.assertEqual(m.model.state, 'F') self.assertEqual(m.model.level, 9) m.model.before() self.assertEqual(m.model.state, 'A') self.assertEqual(m.model.level, 11) # An invalid transition shouldn't execute the callback with self.assertRaises(MachineError): m.model.on_exit_A() def test_process_trigger(self): m = Machine(states=['raw', 'processed'], initial='raw') m.add_transition('process', 'raw', 'processed') m.process() self.assertEqual(m.state, 'processed') def test_multiple_models(self): s1, s2 = Stuff(), Stuff() states = ['A', 'B', 'C'] m = Machine(model=[s1, s2], states=states, initial=states[0]) self.assertEqual(len(m.models), 2) self.assertTrue(isinstance(m.model, list) and len(m.model) == 2) m.add_transition('advance', 'A', 'B') s1.advance() self.assertEqual(s1.state, 'B') self.assertEqual(s2.state, 'A') m = Machine(model=s1, states=states, initial=states[0]) # for backwards compatibility model should return a model instance # rather than a list self.assertNotIsInstance(m.model, list) def test_dispatch(self): s1, s2 = Stuff(), Stuff() states = ['A', 'B', 'C'] m = Machine(model=s1, states=states, ignore_invalid_triggers=True, initial=states[0], transitions=[['go', 'A', 'B'], ['go', 'B', 'C']]) m.add_model(s2, initial='B') m.dispatch('go') self.assertEqual(s1.state, 'B') self.assertEqual(s2.state, 'C') def test_remove_model(self): m = self.machine_cls() self.assertIn(m, m.models) m.remove_model(m) self.assertNotIn(m, m.models) def test_string_trigger(self): def return_value(value): return value class Model: def trigger(self, value): return value self.stuff.machine.add_transition('do', '*', 'C') self.stuff.trigger('do') self.assertTrue(self.stuff.is_C()) self.stuff.machine.add_transition('maybe', 'C', 'A', conditions=return_value) self.assertFalse(self.stuff.trigger('maybe', value=False)) self.assertTrue(self.stuff.trigger('maybe', value=True)) self.assertTrue(self.stuff.is_A()) with self.assertRaises(AttributeError): self.stuff.trigger('not_available') with self.assertRaises(MachineError): self.stuff.trigger('maybe') model = Model() m = Machine(model=model) self.assertEqual(model.trigger(5), 5) self.stuff.machine.add_transition('do_raise_keyerror', '*', 'C', before=partial(self.stuff.this_raises, KeyError)) with self.assertRaises(KeyError): self.stuff.trigger('do_raise_keyerror') self.stuff.machine.get_model_state(self.stuff).ignore_invalid_triggers = True self.stuff.trigger('should_not_raise_anything') self.stuff.trigger('to_A') self.assertTrue(self.stuff.is_A()) self.stuff.machine.ignore_invalid_triggers = True self.stuff.trigger('should_not_raise_anything') def test_get_triggers(self): states = ['A', 'B', 'C'] transitions = [['a2b', 'A', 'B'], ['a2c', 'A', 'C'], ['c2b', 'C', 'B']] machine = Machine(states=states, transitions=transitions, initial='A', auto_transitions=False) self.assertEqual(len(machine.get_triggers('A')), 2) self.assertEqual(len(machine.get_triggers('B')), 0) self.assertEqual(len(machine.get_triggers('C')), 1) # self stuff machine should have to-transitions to every state m = self.stuff.machine self.assertEqual(len(m.get_triggers('B')), len(m.states)) trigger_name = m.get_triggers('B') trigger_state = m.get_triggers(m.states['B']) self.assertEqual(trigger_name, trigger_state) def test_skip_override(self): local_mock = MagicMock() class Model(object): def go(self): local_mock() model = Model() transitions = [['go', 'A', 'B'], ['advance', 'A', 'B']] m = self.stuff.machine_cls(model=model, states=['A', 'B'], transitions=transitions, initial='A') model.go() self.assertEqual(model.state, 'A') self.assertTrue(local_mock.called) model.advance() self.assertEqual(model.state, 'B') model.to_A() model.trigger('go') self.assertEqual(model.state, 'B') @skipIf(sys.version_info < (3, ), "String-checking disabled on PY-2 because is different") def test_repr(self): def a_condition(event_data): self.assertRegex( str(event_data.transition.conditions), r"\[" r".a_condition at [^>]+>\)@\d+>\]") return True # No transition has been assigned to EventData yet def check_prepare_repr(event_data): self.assertRegex( str(event_data), r"', " r"None\)@\d+>") def check_before_repr(event_data): self.assertRegex( str(event_data), r"', " r"\)@\d+>") m.checked = True m = Machine(states=['A', 'B'], prepare_event=check_prepare_repr, before_state_change=check_before_repr, send_event=True, initial='A') m.add_transition('do_strcheck', 'A', 'B', conditions=a_condition) self.assertTrue(m.do_strcheck()) self.assertIn('checked', vars(m)) def test_machine_prepare(self): global_mock = MagicMock() local_mock = MagicMock() def global_callback(): global_mock() def local_callback(): local_mock() def always_fails(): return False transitions = [ {'trigger': 'go', 'source': 'A', 'dest': 'B', 'conditions': always_fails, 'prepare': local_callback}, {'trigger': 'go', 'source': 'A', 'dest': 'B', 'conditions': always_fails, 'prepare': local_callback}, {'trigger': 'go', 'source': 'A', 'dest': 'B', 'conditions': always_fails, 'prepare': local_callback}, {'trigger': 'go', 'source': 'A', 'dest': 'B', 'conditions': always_fails, 'prepare': local_callback}, {'trigger': 'go', 'source': 'A', 'dest': 'B', 'prepare': local_callback}, ] m = Machine(states=['A', 'B'], transitions=transitions, prepare_event=global_callback, initial='A') m.go() self.assertEqual(global_mock.call_count, 1) self.assertEqual(local_mock.call_count, len(transitions)) def test_machine_finalize(self): finalize_mock = MagicMock() def always_fails(event_data): return False transitions = [ {'trigger': 'go', 'source': 'A', 'dest': 'B'}, {'trigger': 'planA', 'source': 'B', 'dest': 'A', 'conditions': always_fails}, {'trigger': 'planB', 'source': 'B', 'dest': 'A', 'conditions': partial(self.stuff.this_raises, RuntimeError)} ] m = self.stuff.machine_cls(states=['A', 'B'], transitions=transitions, finalize_event=finalize_mock, initial='A', send_event=True) m.go() self.assertEqual(finalize_mock.call_count, 1) m.planA() event_data = finalize_mock.call_args[0][0] self.assertIsInstance(event_data, EventData) self.assertEqual(finalize_mock.call_count, 2) self.assertFalse(event_data.result) with self.assertRaises(RuntimeError): m.planB() m.finalize_event.append(partial(self.stuff.this_raises, ValueError)) # ValueError in finalize should be suppressed # but mock should have been called anyway with self.assertRaises(RuntimeError): m.planB() self.assertEqual(4, finalize_mock.call_count) def test_machine_finalize_exception(self): def finalize_callback(event): self.assertIsInstance(event.error, ZeroDivisionError) m = self.stuff.machine_cls(states=['A', 'B'], send_event=True, initial='A', before_state_change=partial(self.stuff.this_raises, ZeroDivisionError), finalize_event=finalize_callback) with self.assertRaises(ZeroDivisionError): m.to_B() def test_prep_ordered_arg(self): self.assertTrue(len(_prep_ordered_arg(3, None)) == 3) self.assertTrue(all(a is None for a in _prep_ordered_arg(3, None))) with self.assertRaises(ValueError): # deliberately passing wrong arguments _prep_ordered_arg(3, [None, None]) # type: ignore def test_ordered_transition_callback(self): class Model: def __init__(self): self.flag = False def make_true(self): self.flag = True model = Model() states = ['beginning', 'middle', 'end'] transits = [None, None, 'make_true'] m = Machine(model, states, initial='beginning') m.add_ordered_transitions(before=transits) model.next_state() self.assertFalse(model.flag) model.next_state() model.next_state() self.assertTrue(model.flag) def test_ordered_transition_condition(self): class Model: def __init__(self): self.blocker = False def check_blocker(self): return self.blocker model = Model() states = ['beginning', 'middle', 'end'] m = Machine(model, states, initial='beginning') m.add_ordered_transitions(conditions=[None, None, 'check_blocker']) model.to_end() self.assertFalse(model.next_state()) model.blocker = True self.assertTrue(model.next_state()) def test_get_transitions(self): states = ['A', 'B', 'C', 'D'] m = self.machine_cls(states=states, initial='A', auto_transitions=False) m.add_transition('go', ['A', 'B', 'C'], 'D') m.add_transition('run', 'A', 'D') self.assertEqual( {(t.source, t.dest) for t in m.get_transitions('go')}, {('A', 'D'), ('B', 'D'), ('C', 'D')}) self.assertEqual( [(t.source, t.dest) for t in m.get_transitions(source='A', dest='D')], [('A', 'D'), ('A', 'D')]) self.assertEqual( sorted([(t.source, t.dest) for t in m.get_transitions(dest='D')]), [('A', 'D'), ('A', 'D'), ('B', 'D'), ('C', 'D')]) self.assertEqual( [(t.source, t.dest) for t in m.get_transitions(source=m.states['A'], dest=m.states['D'])], [('A', 'D'), ('A', 'D')]) self.assertEqual( sorted([(t.source, t.dest) for t in m.get_transitions(dest=m.states['D'])]), [('A', 'D'), ('A', 'D'), ('B', 'D'), ('C', 'D')]) def test_remove_transition(self): self.stuff.machine.add_transition('go', ['A', 'B', 'C'], 'D') self.stuff.machine.add_transition('walk', 'A', 'B') self.stuff.go() self.assertEqual(self.stuff.state, 'D') self.stuff.to_A() self.stuff.machine.remove_transition('go', source='A') with self.assertRaises(MachineError): self.stuff.go() self.stuff.machine.add_transition('go', 'A', 'D') self.stuff.walk() self.stuff.go() self.assertEqual(self.stuff.state, 'D') self.stuff.to_C() self.stuff.machine.remove_transition('go', dest='D') self.assertFalse(hasattr(self.stuff, 'go')) def test_reflexive_transition(self): self.stuff.machine.add_transition('reflex', ['A', 'B'], '=', after='increase_level') self.assertEqual(self.stuff.state, 'A') self.stuff.reflex() self.assertEqual(self.stuff.state, 'A') self.assertEqual(self.stuff.level, 2) self.stuff.to_B() self.assertEqual(self.stuff.state, 'B') self.stuff.reflex() self.assertEqual(self.stuff.state, 'B') self.assertEqual(self.stuff.level, 3) self.stuff.to_C() with self.assertRaises(MachineError): self.stuff.reflex() self.assertEqual(self.stuff.level, 3) def test_internal_transition(self): m = Machine(Stuff(), states=['A', 'B'], initial='A') m.add_transition('move', 'A', None, prepare='increase_level') m.model.move() self.assertEqual(m.model.state, 'A') self.assertEqual(m.model.level, 2) def test_dynamic_model_state_attribute(self): class Model: def __init__(self): self.status = None self.state = 'some_value' m = self.machine_cls(Model(), states=['A', 'B'], initial='A', model_attribute='status') self.assertEqual(m.model.status, 'A') self.assertEqual(m.model.state, 'some_value') m.add_transition('move', 'A', 'B') m.model.move() self.assertEqual(m.model.status, 'B') self.assertEqual(m.model.state, 'some_value') def test_multiple_machines_per_model(self): class Model: def __init__(self): self.car_state = None self.driver_state = None instance = Model() machine_a = Machine(instance, states=['A', 'B'], initial='A', model_attribute='car_state') machine_a.add_transition('accelerate_car', 'A', 'B') machine_b = Machine(instance, states=['A', 'B'], initial='B', model_attribute='driver_state') machine_b.add_transition('driving', 'B', 'A') assert instance.car_state == 'A' assert instance.driver_state == 'B' assert instance.is_car_state_A() assert instance.is_driver_state_B() instance.accelerate_car() assert instance.car_state == 'B' assert instance.driver_state == 'B' assert not instance.is_car_state_A() assert instance.is_car_state_B() instance.driving() assert instance.driver_state == 'A' assert instance.car_state == 'B' assert instance.is_driver_state_A() assert not instance.is_driver_state_B() assert instance.to_driver_state_B() assert instance.driver_state == 'B' def test_initial_not_registered(self): m1 = self.machine_cls(states=['A', 'B'], initial=self.machine_cls.state_cls('C')) self.assertTrue(m1.is_C()) self.assertTrue('C' in m1.states) def test_trigger_name_cannot_be_equal_to_model_attribute(self): m = self.machine_cls(states=['A', 'B']) with self.assertRaises(ValueError): m.add_transition(m.model_attribute, "A", "B") def test_new_state_in_enter_callback(self): machine = self.machine_cls(states=['A', 'B'], initial='A') def on_enter_B(): state = self.machine_cls.state_cls(name='C') machine.add_state(state) machine.to_C() machine.on_enter_B(on_enter_B) machine.to_B() def test_on_exception_callback(self): mock = MagicMock() def on_exception(event_data): self.assertIsInstance(event_data.error, (ValueError, MachineError)) mock() m = self.machine_cls(states=['A', 'B'], initial='A', transitions=[['go', 'A', 'B']], send_event=True, after_state_change=partial(self.stuff.this_raises, ValueError)) with self.assertRaises(ValueError): m.to_B() self.assertTrue(m.is_B()) with self.assertRaises(MachineError): m.go() m.on_exception.append(on_exception) m.to_B() m.go() self.assertTrue(mock.called) self.assertEqual(2, mock.call_count) def test_may_transition(self): states = ['A', 'B', 'C'] d = DummyModel() m = Machine(model=d, states=states, initial='A', auto_transitions=False) m.add_transition('walk', 'A', 'B') m.add_transition('stop', 'B', 'C') assert d.may_walk() assert not d.may_stop() d.walk() assert not d.may_walk() assert d.may_stop() def test_may_transition_for_autogenerated_triggers(self): states = ['A', 'B', 'C'] m = Machine(states=states, initial='A') assert m.may_to_A() m.to_A() assert m.to_B() m.to_B() assert m.may_to_C() m.to_C() def test_may_transition_with_conditions(self): states = ['A', 'B', 'C'] d = DummyModel() m = Machine(model=d, states=states, initial='A', auto_transitions=False) m.add_transition('walk', 'A', 'B', conditions=[lambda: False]) m.add_transition('stop', 'B', 'C') m.add_transition('run', 'A', 'C') assert not d.may_walk() assert not d.may_stop() assert d.may_run() d.run() assert not d.may_run() def test_may_transition_with_auto_transitions(self): states = ['A', 'B', 'C'] d = DummyModel() self.machine_cls(model=d, states=states, initial='A') assert d.may_to_A() assert d.may_to_B() assert d.may_to_C() def test_machine_may_transitions(self): states = ['A', 'B', 'C'] m = self.machine_cls(states=states, initial='A', auto_transitions=False) m.add_transition('walk', 'A', 'B', conditions=[lambda: False]) m.add_transition('stop', 'B', 'C') m.add_transition('run', 'A', 'C') m.add_transition('reset', 'C', 'A') assert not m.may_walk() assert not m.may_stop() assert m.may_run() m.run() assert not m.may_run() assert not m.may_stop() assert not m.may_walk() def test_may_transition_with_invalid_state(self): states = ['A', 'B', 'C'] d = DummyModel() m = self.machine_cls(model=d, states=states, initial='A', auto_transitions=False) m.add_transition('walk', 'A', 'UNKNOWN') assert not d.may_walk() transitions-0.9.0/tests/test_markup.py0000644000232200023220000001737414304350474020535 0ustar debalancedebalancetry: from builtins import object except ImportError: pass from functools import partial from transitions.extensions.markup import MarkupMachine, HierarchicalMarkupMachine, rep from .test_core import TYPE_CHECKING from .utils import Stuff from unittest import TestCase, skipIf try: from unittest.mock import MagicMock except ImportError: from mock import MagicMock # type: ignore try: import enum from enum import Enum except ImportError: enum = None # type: ignore # placeholder for Python < 3.4 without enum class Enum: # type: ignore pass if TYPE_CHECKING: from typing import List, Dict, Type, Union class SimpleModel(object): def after_func(self): pass class TestRep(TestCase): def test_rep_string(self): self.assertEqual(rep("string"), "string") def test_rep_function(self): def check(): return True self.assertTrue(check()) self.assertEqual(rep(check, MarkupMachine.format_references), "check") def test_rep_partial_no_args_no_kwargs(self): def check(): return True pcheck = partial(check) self.assertTrue(pcheck()) self.assertEqual(rep(pcheck, MarkupMachine.format_references), "check()") def test_rep_partial_with_args(self): def check(result): return result pcheck = partial(check, True) self.assertTrue(pcheck()) self.assertEqual(rep(pcheck, MarkupMachine.format_references), "check(True)") def test_rep_partial_with_kwargs(self): def check(result=True): return result pcheck = partial(check, result=True) self.assertTrue(pcheck()) self.assertEqual(rep(pcheck, MarkupMachine.format_references), "check(result=True)") def test_rep_partial_with_args_and_kwargs(self): def check(result, doublecheck=True): return result == doublecheck pcheck = partial(check, True, doublecheck=True) self.assertTrue(pcheck()) self.assertEqual(rep(pcheck, MarkupMachine.format_references), "check(True, doublecheck=True)") def test_rep_callable_class(self): class Check(object): def __init__(self, result): self.result = result def __call__(self): return self.result def __repr__(self): return "%s(%r)" % (type(self).__name__, self.result) ccheck = Check(True) self.assertTrue(ccheck()) self.assertEqual(rep(ccheck, MarkupMachine.format_references), "Check(True)") class TestMarkupMachine(TestCase): def setUp(self): self.machine_cls = MarkupMachine self.states = ['A', 'B', 'C', 'D'] # type: Union[List[Union[str, Dict]], Type[Enum]] self.transitions = [ {'trigger': 'walk', 'source': 'A', 'dest': 'B'}, {'trigger': 'run', 'source': 'B', 'dest': 'C'}, {'trigger': 'sprint', 'source': 'C', 'dest': 'D'} ] # type: List[Union[str, Dict[str, Union[str, Enum]]]] self.num_trans = len(self.transitions) self.num_auto = len(self.states) ** 2 def test_markup_self(self): m1 = self.machine_cls(states=self.states, transitions=self.transitions, initial='A') m1.walk() m2 = self.machine_cls(markup=m1.markup) self.assertTrue(m1.state == m2.state or m1.state.name == m2.state) self.assertEqual(len(m1.models), len(m2.models)) self.assertEqual(sorted(m1.states.keys()), sorted(m2.states.keys())) self.assertEqual(sorted(m1.events.keys()), sorted(m2.events.keys())) m2.run() m2.sprint() self.assertNotEqual(m1.state, m2.state) def test_markup_model(self): model1 = SimpleModel() m1 = self.machine_cls(model1, states=self.states, transitions=self.transitions, initial='A') model1.walk() m2 = self.machine_cls(markup=m1.markup) model2 = m2.models[0] self.assertIsInstance(model2, SimpleModel) self.assertEqual(len(m1.models), len(m2.models)) self.assertTrue(model1.state == model2.state or model1.state.name == model2.state) self.assertEqual(sorted(m1.states.keys()), sorted(m2.states.keys())) self.assertEqual(sorted(m1.events.keys()), sorted(m2.events.keys())) def test_conditions_unless(self): s = Stuff(machine_cls=self.machine_cls) s.machine.add_transition('go', 'A', 'B', conditions='this_passes', unless=['this_fails', 'this_fails_by_default']) t = s.machine.markup['transitions'] self.assertEqual(len(t), 1) self.assertEqual(t[0]['trigger'], 'go') self.assertEqual(len(t[0]['conditions']), 1) self.assertEqual(len(t[0]['unless']), 2) def test_auto_transitions(self): m1 = self.machine_cls(states=self.states, transitions=self.transitions, initial='A') m2 = self.machine_cls(states=self.states, transitions=self.transitions, initial='A', auto_transitions_markup=True) self.assertEqual(len(m1.markup['transitions']), self.num_trans) self.assertEqual(len(m2.markup['transitions']), self.num_trans + self.num_auto) m1.add_transition('go', 'A', 'B') m2.add_transition('go', 'A', 'B') self.num_trans += 1 self.assertEqual(len(m1.markup['transitions']), self.num_trans) self.assertEqual(len(m2.markup['transitions']), self.num_trans + self.num_auto) m1.auto_transitions_markup = True m2.auto_transitions_markup = False self.assertEqual(len(m1.markup['transitions']), self.num_trans + self.num_auto) self.assertEqual(len(m2.markup['transitions']), self.num_trans) class TestMarkupHierarchicalMachine(TestMarkupMachine): def setUp(self): self.states = ['A', 'B', {'name': 'C', 'children': ['1', '2', {'name': '3', 'children': ['a', 'b', 'c']}]}] self.transitions = [ {'trigger': 'walk', 'source': 'A', 'dest': 'C_1'}, {'trigger': 'run', 'source': 'C_1', 'dest': 'C_3_a'}, {'trigger': 'sprint', 'source': 'C', 'dest': 'B'} ] # MarkupMachine cannot be imported via get_predefined as of now # We want to be able to run these tests without (py)graphviz self.machine_cls = HierarchicalMarkupMachine self.num_trans = len(self.transitions) self.num_auto = len(self.states) * 9 def test_nested_definitions(self): states = [{'name': 'A'}, {'name': 'B'}, {'name': 'C', 'children': [ {'name': '1'}, {'name': '2'}], 'transitions': [ {'trigger': 'go', 'source': '1', 'dest': '2'}], 'initial': '2'}] # type: List[Dict] machine = self.machine_cls(states=states, initial='A', auto_transitions=False, name='TestMachine') markup = {k: v for k, v in machine.markup.items() if v and k != 'models'} self.assertEqual(dict(initial='A', states=states, name='TestMachine'), markup) @skipIf(enum is None, "enum is not available") class TestMarkupMachineEnum(TestMarkupMachine): class States(Enum): A = 1 B = 2 C = 3 D = 4 def setUp(self): self.machine_cls = MarkupMachine self.states = TestMarkupMachineEnum.States self.transitions = [ {'trigger': 'walk', 'source': self.states.A, 'dest': self.states.B}, {'trigger': 'run', 'source': self.states.B, 'dest': self.states.C}, {'trigger': 'sprint', 'source': self.states.C, 'dest': self.states.D} ] self.num_trans = len(self.transitions) self.num_auto = len(self.states)**2 transitions-0.9.0/tests/test_threading.py0000644000232200023220000002502614304350474021174 0ustar debalancedebalancetry: from builtins import object except ImportError: pass import time from threading import Thread import logging from transitions.extensions import LockedHierarchicalMachine, LockedMachine from .test_nesting import TestNestedTransitions from .test_core import TestTransitions, TYPE_CHECKING from .utils import Stuff, DummyModel, SomeContext try: from unittest.mock import MagicMock except ImportError: from mock import MagicMock # type: ignore if TYPE_CHECKING: from typing import List, Type, Tuple, Any logger = logging.getLogger(__name__) logger.addHandler(logging.NullHandler()) def heavy_processing(): time.sleep(1) def heavy_checking(): time.sleep(0.5) return False class TestLockedTransitions(TestTransitions): def setUp(self): self.machine_cls = LockedMachine # type: Type[LockedMachine] self.stuff = Stuff(machine_cls=self.machine_cls) self.stuff.heavy_processing = heavy_processing self.stuff.machine.add_transition('forward', 'A', 'B', before='heavy_processing') def tearDown(self): pass def test_thread_access(self): thread = Thread(target=self.stuff.forward) thread.start() # give thread some time to start time.sleep(0.01) self.assertTrue(self.stuff.is_B()) def test_parallel_access(self): thread = Thread(target=self.stuff.forward) thread.start() # give thread some time to start time.sleep(0.01) self.stuff.to_C() # if 'forward' has not been locked, it is still running # we have to wait to be sure it is done time.sleep(1) self.assertEqual(self.stuff.state, "C") def test_parallel_deep(self): self.stuff.machine.add_transition('deep', source='*', dest='C', after='to_D') thread = Thread(target=self.stuff.deep) thread.start() time.sleep(0.01) self.stuff.to_C() time.sleep(1) self.assertEqual(self.stuff.state, "C") def test_conditional_access(self): self.stuff.heavy_checking = heavy_checking # checking takes 1s and returns False self.stuff.machine.add_transition('advance', 'A', 'B', conditions='heavy_checking') self.stuff.machine.add_transition('advance', 'A', 'D') t = Thread(target=self.stuff.advance) t.start() time.sleep(0.1) logger.info('Check if state transition done...') # Thread will release lock before Transition is finished res = self.stuff.is_D() self.assertTrue(res) def test_pickle(self): import sys if sys.version_info < (3, 4): import dill as pickle else: import pickle # go to non initial state B self.stuff.to_B() # pickle Stuff model dump = pickle.dumps(self.stuff) self.assertIsNotNone(dump) stuff2 = pickle.loads(dump) self.assertTrue(stuff2.is_B()) # check if machines of stuff and stuff2 are truly separated stuff2.to_A() self.stuff.to_C() self.assertTrue(stuff2.is_A()) thread = Thread(target=stuff2.forward) thread.start() # give thread some time to start time.sleep(0.01) # both objects should be in different states # and also not share locks begin = time.time() # stuff should not be locked and execute fast self.assertTrue(self.stuff.is_C()) fast = time.time() # stuff2 should be locked and take about 1 second # to be executed self.assertTrue(stuff2.is_B()) blocked = time.time() self.assertAlmostEqual(fast - begin, 0, delta=0.1) self.assertAlmostEqual(blocked - begin, 1, delta=0.1) def test_context_managers(self): class CounterContext(object): def __init__(self): self.counter = 0 self.level = 0 self.max = 0 super(CounterContext, self).__init__() def __enter__(self): self.counter += 1 self.level += 1 self.max = max(self.level, self.max) def __exit__(self, *exc): self.level -= 1 M = LockedMachine c = CounterContext() m = M(states=['A', 'B', 'C', 'D'], transitions=[['reset', '*', 'A']], initial='A', machine_context=c) m.get_triggers('A') self.assertEqual(c.max, 1) # was 3 before self.assertEqual(c.counter, 4) # was 72 (!) before # This test has been used to quantify the changes made in locking in version 0.5.0. # See https://github.com/tyarkoni/transitions/issues/167 for the results. # def test_performance(self): # import timeit # states = ['A', 'B', 'C'] # transitions = [['go', 'A', 'B'], ['go', 'B', 'C'], ['go', 'C', 'A']] # # M1 = MachineFactory.get_predefined() # M2 = MachineFactory.get_predefined(locked=True) # # def test_m1(): # m1 = M1(states=states, transitions=transitions, initial='A') # m1.get_triggers('A') # # def test_m2(): # m2 = M2(states=states, transitions=transitions, initial='A') # m2.get_triggers('A') # # t1 = timeit.timeit(test_m1, number=20000) # t2 = timeit.timeit(test_m2, number=20000) # self.assertAlmostEqual(t2/t1, 1, delta=0.5) class TestMultipleContexts(TestTransitions): def setUp(self): self.event_list = [] # type: List[Tuple[Any, str]] self.s1 = DummyModel() self.c1 = SomeContext(event_list=self.event_list) self.c2 = SomeContext(event_list=self.event_list) self.c3 = SomeContext(event_list=self.event_list) self.c4 = SomeContext(event_list=self.event_list) self.machine_cls = LockedMachine # type: Type[LockedMachine] self.stuff = Stuff(machine_cls=self.machine_cls, extra_kwargs={ 'machine_context': [self.c1, self.c2] }) self.stuff.machine.add_model(self.s1, model_context=[self.c3, self.c4]) del self.event_list[:] self.stuff.machine.add_transition('forward', 'A', 'B') def tearDown(self): self.stuff.machine.remove_model(self.s1) def test_ordering(self): self.stuff.forward() # There are a lot of internal enter/exits, but the key is that the outermost are in the expected order self.assertEqual((self.c1, "enter"), self.event_list[0]) self.assertEqual((self.c2, "enter"), self.event_list[1]) self.assertEqual((self.c2, "exit"), self.event_list[-2]) self.assertEqual((self.c1, "exit"), self.event_list[-1]) def test_model_context(self): self.s1.forward() self.assertEqual((self.c1, "enter"), self.event_list[0]) self.assertEqual((self.c2, "enter"), self.event_list[1]) # Since there are a lot of internal enter/exits, we don't actually know how deep in the stack # to look for these. Should be able to correct when https://github.com/tyarkoni/transitions/issues/167 self.assertIn((self.c3, "enter"), self.event_list) self.assertIn((self.c4, "enter"), self.event_list) self.assertIn((self.c4, "exit"), self.event_list) self.assertIn((self.c3, "exit"), self.event_list) self.assertEqual((self.c2, "exit"), self.event_list[-2]) self.assertEqual((self.c1, "exit"), self.event_list[-1]) # Same as TestLockedTransition but with LockedHierarchicalMachine class TestLockedHierarchicalTransitions(TestNestedTransitions, TestLockedTransitions): def setUp(self): states = ['A', 'B', {'name': 'C', 'children': ['1', '2', {'name': '3', 'children': ['a', 'b', 'c']}]}, 'D', 'E', 'F'] self.machine_cls = LockedHierarchicalMachine # type: Type[LockedHierarchicalMachine] self.state_cls = self.machine_cls.state_cls self.state_cls.separator = '_' self.stuff = Stuff(states, machine_cls=self.machine_cls) self.stuff.heavy_processing = heavy_processing self.stuff.machine.add_transition('forward', '*', 'B', before='heavy_processing') def test_parallel_access(self): thread = Thread(target=self.stuff.forward) thread.start() # give thread some time to start time.sleep(0.01) self.stuff.to_C() # if 'forward' has not been locked, it is still running # we have to wait to be sure it is done time.sleep(1) self.assertEqual(self.stuff.state, "C") def test_callbacks(self): class MachineModel(self.stuff.machine_cls): # type: ignore def __init__(self): self.mock = MagicMock() super(MachineModel, self).__init__(self, states=['A', 'B', 'C']) def on_enter_A(self): self.mock() model = MachineModel() model.to_A() self.assertTrue(model.mock.called) def test_pickle(self): import sys if sys.version_info < (3, 4): import dill as pickle else: import pickle states = ['A', 'B', {'name': 'C', 'children': ['1', '2', {'name': '3', 'children': ['a', 'b', 'c']}]}, 'D', 'E', 'F'] transitions = [ {'trigger': 'walk', 'source': 'A', 'dest': 'B'}, {'trigger': 'run', 'source': 'B', 'dest': 'C'}, {'trigger': 'sprint', 'source': 'C', 'dest': 'D'} ] m = self.stuff.machine_cls(states=states, transitions=transitions, initial='A') m.heavy_processing = heavy_processing m.add_transition('forward', 'A', 'B', before='heavy_processing') # # go to non initial state B m.to_B() # pickle Stuff model dump = pickle.dumps(m) self.assertIsNotNone(dump) m2 = pickle.loads(dump) self.assertTrue(m2.is_B()) m2.to_C_3_a() m2.to_C_3_b() # check if machines of stuff and stuff2 are truly separated m2.to_A() m.to_C() self.assertTrue(m2.is_A()) thread = Thread(target=m2.forward) thread.start() # give thread some time to start time.sleep(0.01) # both objects should be in different states # and also not share locks begin = time.time() # stuff should not be locked and execute fast self.assertTrue(m.is_C()) fast = time.time() # stuff2 should be locked and take about 1 second # to be executed self.assertTrue(m2.is_B()) blocked = time.time() self.assertAlmostEqual(fast - begin, 0, delta=0.1) self.assertAlmostEqual(blocked - begin, 1, delta=0.1) transitions-0.9.0/tests/test_graphviz.py0000644000232200023220000004400414304350474021056 0ustar debalancedebalancetry: from builtins import object except ImportError: pass from .utils import Stuff, DummyModel from .test_core import TestTransitions, TYPE_CHECKING from transitions.extensions import ( LockedGraphMachine, GraphMachine, HierarchicalGraphMachine, LockedHierarchicalGraphMachine ) from transitions.extensions.nesting import NestedState from transitions.extensions.states import add_state_features, Timeout, Tags from unittest import skipIf import tempfile import os import re try: # Just to skip tests if graphviz not installed import graphviz as pgv # @UnresolvedImport except ImportError: # pragma: no cover pgv = None if TYPE_CHECKING: from typing import Type, List, Collection, Union @skipIf(pgv is None, 'Graph diagram test requires graphviz.') class TestDiagrams(TestTransitions): machine_cls = GraphMachine # type: Type[GraphMachine] use_pygraphviz = False def parse_dot(self, graph): if self.use_pygraphviz: dot = graph.string() else: dot = graph.source nodes = [] edges = [] for line in dot.split('\n'): if '->' in line: src, rest = line.split('->') dst, attr = rest.split(None, 1) nodes.append(src.strip().replace('"', '')) nodes.append(dst) edges.append(attr) return dot, set(nodes), edges def tearDown(self): pass # for m in ['pygraphviz', 'graphviz']: # if 'transitions.extensions.diagrams_' + m in sys.modules: # del sys.modules['transitions.extensions.diagrams_' + m] def setUp(self): self.stuff = Stuff(machine_cls=self.machine_cls, extra_kwargs={'use_pygraphviz': self.use_pygraphviz}) self.states = ['A', 'B', 'C', 'D'] # type: List[Union[str, Collection[str]]] self.transitions = [ {'trigger': 'walk', 'source': 'A', 'dest': 'B'}, {'trigger': 'run', 'source': 'B', 'dest': 'C'}, {'trigger': 'sprint', 'source': 'C', 'dest': 'D', 'conditions': 'is_fast'}, {'trigger': 'sprint', 'source': 'C', 'dest': 'B'} ] def test_diagram(self): m = self.machine_cls(states=self.states, transitions=self.transitions, initial='A', auto_transitions=False, title='a test', use_pygraphviz=self.use_pygraphviz) graph = m.get_graph() self.assertIsNotNone(graph) self.assertTrue(graph.directed) _, nodes, edges = self.parse_dot(graph) # Test that graph properties match the Machine self.assertEqual(set(m.states.keys()), nodes) self.assertEqual(len(edges), len(self.transitions)) for e in edges: # label should be equivalent to the event name match = re.match(r'\[label=([^\]]+)\]', e) self.assertIsNotNone(match and getattr(m, match.group(1))) # write diagram to temp file target = tempfile.NamedTemporaryFile(suffix='.png', delete=False) graph.draw(target.name, format='png', prog='dot') self.assertTrue(os.path.getsize(target.name) > 0) # backwards compatibility check m.get_graph().draw(target.name, format='png', prog='dot') self.assertTrue(os.path.getsize(target.name) > 0) # cleanup temp file target.close() os.unlink(target.name) def test_transition_custom_model(self): m = self.machine_cls(model=None, states=self.states, transitions=self.transitions, initial='A', auto_transitions=False, title='a test', use_pygraphviz=self.use_pygraphviz) model = DummyModel() m.add_model(model) model.walk() def test_add_custom_state(self): m = self.machine_cls(states=self.states, transitions=self.transitions, initial='A', auto_transitions=False, title='a test', use_pygraphviz=self.use_pygraphviz) m.add_state('X') m.add_transition('foo', '*', 'X') m.foo() def test_if_multiple_edges_are_supported(self): transitions = [ ['event_0', 'a', 'b'], ['event_1', 'a', 'b'], ['event_2', 'a', 'b'], ['event_3', 'a', 'b'], ] m = self.machine_cls( states=['a', 'b'], transitions=transitions, initial='a', auto_transitions=False, use_pygraphviz=self.use_pygraphviz ) graph = m.get_graph() self.assertIsNotNone(graph) self.assertTrue("digraph" in str(graph)) triggers = [transition[0] for transition in transitions] for trigger in triggers: self.assertTrue(trigger in str(graph)) def test_multi_model_state(self): m1 = Stuff(machine_cls=None, extra_kwargs={'use_pygraphviz': self.use_pygraphviz}) m2 = Stuff(machine_cls=None, extra_kwargs={'use_pygraphviz': self.use_pygraphviz}) m = self.machine_cls(model=[m1, m2], states=self.states, transitions=self.transitions, initial='A', use_pygraphviz=self.use_pygraphviz) m1.walk() self.assertEqual(m.model_graphs[id(m1)].custom_styles['node'][m1.state], 'active') self.assertEqual(m.model_graphs[id(m2)].custom_styles['node'][m1.state], '') # backwards compatibility test dot1, _, _ = self.parse_dot(m1.get_graph()) dot, _, _ = self.parse_dot(m.get_graph()) self.assertEqual(dot, dot1) def test_model_method_collision(self): class GraphModel: def get_graph(self): return "This method already exists" model = GraphModel() with self.assertRaises(AttributeError): m = self.machine_cls(model=model) self.assertEqual(model.get_graph(), "This method already exists") def test_to_method_filtering(self): m = self.machine_cls(states=['A', 'B', 'C'], initial='A', use_pygraphviz=self.use_pygraphviz) m.add_transition('to_state_A', 'B', 'A') m.add_transition('to_end', '*', 'C') _, _, edges = self.parse_dot(m.get_graph()) self.assertEqual(len([e for e in edges if e == '[label=to_state_A]']), 1) self.assertEqual(len([e for e in edges if e == '[label=to_end]']), 3) m2 = self.machine_cls(states=['A', 'B', 'C'], initial='A', show_auto_transitions=True, use_pygraphviz=self.use_pygraphviz) _, _, edges = self.parse_dot(m2.get_graph()) self.assertEqual(len(edges), 9) self.assertEqual(len([e for e in edges if e == '[label=to_A]']), 3) self.assertEqual(len([e for e in edges if e == '[label=to_C]']), 3) def test_loops(self): m = self.machine_cls(states=['A'], initial='A', use_pygraphviz=self.use_pygraphviz) m.add_transition('reflexive', 'A', '=') m.add_transition('fixed', 'A', None) g1 = m.get_graph() if self.use_pygraphviz: dot_string = g1.string() else: dot_string = g1.source try: self.assertRegex(dot_string, r'A\s+->\s*A\s+\[label="(fixed|reflexive)') except AttributeError: # Python 2 backwards compatibility self.assertRegexpMatches(dot_string, r'A\s+->\s*A\s+\[label="(fixed|reflexive)') def test_roi(self): m = self.machine_cls(states=['A', 'B', 'C', 'D', 'E', 'F'], initial='A', use_pygraphviz=self.use_pygraphviz) m.add_transition('to_state_A', 'B', 'A') m.add_transition('to_state_C', 'B', 'C') m.add_transition('to_state_F', 'B', 'F') g1 = m.get_graph(show_roi=True) dot, nodes, edges = self.parse_dot(g1) self.assertEqual(0, len(edges)) self.assertIn(r'label="A\l"', dot) # make sure that generating a graph without ROI has not influence on the later generated graph # this has to be checked since graph.custom_style is a class property and is persistent for multiple # calls of graph.generate() m.to_C() m.to_E() _ = m.get_graph() g2 = m.get_graph(show_roi=True) dot, _, _ = self.parse_dot(g2) self.assertNotIn(r'label="A\l"', dot) m.to_B() g3 = m.get_graph(show_roi=True) _, nodes, edges = self.parse_dot(g3) self.assertEqual(len(edges), 3) self.assertEqual(len(nodes), 4) def test_state_tags(self): @add_state_features(Tags, Timeout) class CustomMachine(self.machine_cls): # type: ignore pass self.states[0] = {'name': 'A', 'tags': ['new', 'polling'], 'timeout': 5, 'on_enter': 'say_hello', 'on_exit': 'say_goodbye', 'on_timeout': 'do_something'} m = CustomMachine(states=self.states, transitions=self.transitions, initial='A', show_state_attributes=True, use_pygraphviz=self.use_pygraphviz) g = m.get_graph(show_roi=True) def test_label_attribute(self): class LabelState(self.machine_cls.state_cls): # type: ignore def __init__(self, *args, **kwargs): self.label = kwargs.pop('label') super(LabelState, self).__init__(*args, **kwargs) class CustomMachine(self.machine_cls): # type: ignore state_cls = LabelState m = CustomMachine(states=[{'name': 'A', 'label': 'LabelA'}, {'name': 'B', 'label': 'NotLabelA'}], transitions=[{'trigger': 'event', 'source': 'A', 'dest': 'B', 'label': 'LabelEvent'}], initial='A', use_pygraphviz=self.use_pygraphviz) dot, _, _ = self.parse_dot(m.get_graph()) self.assertIn(r'label="LabelA\l"', dot) self.assertIn(r'label="NotLabelA\l"', dot) self.assertIn("label=LabelEvent", dot) self.assertNotIn(r'label="A\l"', dot) self.assertNotIn("label=event", dot) def test_binary_stream(self): from io import BytesIO m = self.machine_cls(states=['A', 'B', 'C'], initial='A', auto_transitions=True, title='A test', show_conditions=True, use_pygraphviz=self.use_pygraphviz) b1 = BytesIO() g = m.get_graph() g.draw(b1, format='png', prog='dot') b2 = g.draw(None, format='png', prog='dot') self.assertEqual(b2, b1.getvalue()) b1.close() def test_graphviz_fallback(self): try: from unittest import mock # will raise an ImportError in Python 2.7 from transitions.extensions.diagrams_graphviz import Graph from transitions.extensions import diagrams_pygraphviz from importlib import reload with mock.patch.dict('sys.modules', {'pygraphviz': None}): # load and reload diagrams_pygraphviz to make sure # an ImportError is raised for pygraphviz reload(diagrams_pygraphviz) m = self.machine_cls(states=['A', 'B', 'C'], initial='A', use_pygraphviz=True) # make sure to reload after test is done to avoid side effects with other tests reload(diagrams_pygraphviz) print(m.graph_cls, pgv) self.assertTrue(issubclass(m.graph_cls, Graph)) except ImportError: pass @skipIf(pgv is None, 'Graph diagram test requires graphviz') class TestDiagramsLocked(TestDiagrams): machine_cls = LockedGraphMachine # type: Type[LockedGraphMachine] @skipIf(pgv is None, 'NestedGraph diagram test requires graphviz') class TestDiagramsNested(TestDiagrams): machine_cls = HierarchicalGraphMachine \ # type: Type[HierarchicalGraphMachine | LockedHierarchicalGraphMachine] def setUp(self): super(TestDiagramsNested, self).setUp() self.states = ['A', 'B', {'name': 'C', 'children': [{'name': '1', 'children': ['a', 'b', 'c']}, '2', '3']}, 'D'] # type: List[Union[str, Collection[str]]] self.transitions = [ {'trigger': 'walk', 'source': 'A', 'dest': 'B'}, # 1 edge {'trigger': 'run', 'source': 'B', 'dest': 'C'}, # + 1 edge {'trigger': 'sprint', 'source': 'C', 'dest': 'D', # + 1 edge 'conditions': 'is_fast'}, {'trigger': 'sprint', 'source': 'C', 'dest': 'B'}, # + 1 edge {'trigger': 'reset', 'source': '*', 'dest': 'A'}] # + 4 edges (from base state) = 8 def test_diagram(self): m = self.machine_cls(states=self.states, transitions=self.transitions, initial='A', auto_transitions=False, title='A test', show_conditions=True, use_pygraphviz=self.use_pygraphviz) graph = m.get_graph() self.assertIsNotNone(graph) self.assertTrue("digraph" in str(graph)) _, nodes, edges = self.parse_dot(graph) self.assertEqual(len(edges), 8) # Test that graph properties match the Machine self.assertEqual(set(m.states.keys()) - set(['C', 'C%s1' % NestedState.separator]), set(nodes) - set(['C_anchor', 'C%s1_anchor' % NestedState.separator])) m.walk() m.run() # write diagram to temp file target = tempfile.NamedTemporaryFile(suffix='.png', delete=False) m.get_graph().draw(target.name, prog='dot') self.assertTrue(os.path.getsize(target.name) > 0) # backwards compatibility check m.get_graph().draw(target.name, prog='dot') self.assertTrue(os.path.getsize(target.name) > 0) # cleanup temp file target.close() os.unlink(target.name) def test_roi(self): class Model: def is_fast(self, *args, **kwargs): return True model = Model() m = self.machine_cls(model, states=self.states, transitions=self.transitions, initial='A', title='A test', use_pygraphviz=self.use_pygraphviz, show_conditions=True) model.walk() model.run() g1 = model.get_graph(show_roi=True) _, nodes, edges = self.parse_dot(g1) self.assertEqual(len(edges), 4) self.assertEqual(len(nodes), 4) model.sprint() g2 = model.get_graph(show_roi=True) dot, nodes, edges = self.parse_dot(g2) self.assertEqual(len(edges), 2) self.assertEqual(len(nodes), 3) def test_internal(self): states = ['A', 'B'] transitions = [['go', 'A', 'B'], dict(trigger='fail', source='A', dest=None, conditions=['failed']), dict(trigger='fail', source='A', dest='B', unless=['failed'])] m = self.machine_cls(states=states, transitions=transitions, initial='A', show_conditions=True, use_pygraphviz=self.use_pygraphviz) _, nodes, edges = self.parse_dot(m.get_graph()) self.assertEqual(len(nodes), 2) self.assertEqual(len([e for e in edges if '[internal]' in e]), 1) def test_internal_wildcards(self): internal_only_once = r'^(?:(?!\[internal\]).)*\[internal\](?!.*\[internal\]).*$' states = [ "initial", "ready", "running" ] transitions = [ ["booted", "initial", "ready"], {"trigger": "polled", "source": "ready", "dest": "running", "conditions": "door_closed"}, ["done", "running", "ready"], ["polled", "*", None] ] m = self.machine_cls(states=states, transitions=transitions, show_conditions=True, use_pygraphviz=self.use_pygraphviz, initial='initial') _, nodes, edges = self.parse_dot(m.get_graph()) self.assertEqual(len(nodes), 3) self.assertEqual(len([e for e in edges if re.match(internal_only_once, e)]), 3) def test_nested_notebook(self): states = [{'name': 'caffeinated', 'on_enter': 'do_x', 'children': ['dithering', 'running'], 'transitions': [['walk', 'dithering', 'running'], ['drink', 'dithering', '=']], }, {'name': 'standing', 'on_enter': ['do_x', 'do_y'], 'on_exit': 'do_z'}, {'name': 'walking', 'tags': ['accepted', 'pending'], 'timeout': 5, 'on_timeout': 'do_z'}] transitions = [ ['walk', 'standing', 'walking'], ['go', 'standing', 'walking'], ['stop', 'walking', 'standing'], {'trigger': 'drink', 'source': '*', 'dest': 'caffeinated{0}dithering'.format(self.machine_cls.state_cls.separator), 'conditions': 'is_hot', 'unless': 'is_too_hot'}, ['relax', 'caffeinated', 'standing'], ['sip', 'standing', 'caffeinated'] ] @add_state_features(Timeout, Tags) class CustomStateMachine(self.machine_cls): # type: ignore def is_hot(self): return True def is_too_hot(self): return False def do_x(self): pass def do_z(self): pass extra_args = dict(auto_transitions=False, initial='standing', title='Mood Matrix', show_conditions=True, show_state_attributes=True, use_pygraphviz=self.use_pygraphviz) machine = CustomStateMachine(states=states, transitions=transitions, **extra_args) g1 = machine.get_graph() # dithering should have 4 'drink' edges, a) from walking, b) from initial, c) from running and d) from itself if self.use_pygraphviz: dot_string = g1.string() else: dot_string = g1.source count = re.findall('-> "?caffeinated{0}dithering"?'.format(machine.state_cls.separator), dot_string) self.assertEqual(4, len(count)) self.assertTrue(True) machine.drink() machine.drink() g1 = machine.get_graph() self.assertIsNotNone(g1) @skipIf(pgv is None, 'NestedGraph diagram test requires graphviz') class TestDiagramsLockedNested(TestDiagramsNested): def setUp(self): super(TestDiagramsLockedNested, self).setUp() self.machine_cls = LockedHierarchicalGraphMachine # type: Type[LockedHierarchicalGraphMachine] transitions-0.9.0/tests/test_nesting.py0000644000232200023220000011241314304350474020673 0ustar debalancedebalance# -*- coding: utf-8 -*- try: from builtins import object except ImportError: pass import sys import tempfile from os.path import getsize from os import unlink from functools import partial from transitions.extensions.nesting import NestedState, HierarchicalMachine from transitions.extensions import HierarchicalGraphMachine from unittest import skipIf from .test_core import TestTransitions, TestCase, TYPE_CHECKING from .utils import Stuff, DummyModel try: from unittest.mock import MagicMock except ImportError: from mock import MagicMock # type: ignore try: # Just to skip tests if graphviz not installed import graphviz as pgv # @UnresolvedImport except ImportError: # pragma: no cover pgv = None if TYPE_CHECKING: from typing import List, Dict, Union, Type default_separator = NestedState.separator class Dummy(object): pass test_states = ['A', 'B', {'name': 'C', 'children': ['1', '2', {'name': '3', 'children': ['a', 'b', 'c']}]}, 'D', 'E', 'F'] class TestNestedTransitions(TestTransitions): def setUp(self): self.states = test_states self.machine_cls = HierarchicalMachine # type: Type[HierarchicalMachine] self.state_cls = NestedState self.stuff = Stuff(self.states, self.machine_cls) def test_add_model(self): model = Dummy() self.stuff.machine.add_model(model, initial='E') def test_init_machine_with_hella_arguments(self): states = [ self.state_cls('State1'), 'State2', { 'name': 'State3', 'on_enter': 'hello_world' } ] transitions = [ {'trigger': 'advance', 'source': 'State2', 'dest': 'State3' } ] s = Stuff() self.stuff.machine_cls( model=s, states=states, transitions=transitions, initial='State2') s.advance() self.assertEqual(s.message, 'Hello World!') def test_init_machine_with_nested_states(self): State = self.state_cls a = State('A') b = State('B') b_1 = State('1') b_2 = State('2') b.add_substate(b_1) b.add_substates([b_2]) m = self.stuff.machine_cls(states=[a, b]) self.assertEqual(m.states['B'].states['1'], b_1) m.to("B{0}1".format(State.separator)) self.assertEqual(m.state, "B{0}1".format(State.separator)) def test_property_initial(self): # Define with list of dictionaries states = ['A', 'B', {'name': 'C', 'children': ['1', '2', '3']}, 'D'] # Define with list of dictionaries transitions = [ {'trigger': 'walk', 'source': 'A', 'dest': 'B'}, {'trigger': 'run', 'source': 'B', 'dest': 'C'}, {'trigger': 'sprint', 'source': 'C', 'dest': 'D'} ] m = self.stuff.machine_cls(states=states, transitions=transitions, initial='A') self.assertEqual(m.initial, 'A') m = self.stuff.machine_cls(states=states, transitions=transitions, initial='C') self.assertEqual(m.initial, 'C') m = self.stuff.machine_cls(states=states, transitions=transitions) self.assertEqual(m.initial, 'initial') def test_transition_definitions(self): State = self.state_cls states = ['A', 'B', {'name': 'C', 'children': ['1', '2', '3']}, 'D'] # Define with list of dictionaries transitions = [ {'trigger': 'walk', 'source': 'A', 'dest': 'B'}, {'trigger': 'run', 'source': 'B', 'dest': 'C'}, {'trigger': 'sprint', 'source': 'C', 'dest': 'D'}, {'trigger': 'run', 'source': 'C', 'dest': 'C%s1' % State.separator} ] # type: List[Union[List[str], Dict[str, str]]] m = self.stuff.machine_cls(states=states, transitions=transitions, initial='A') m.walk() self.assertEqual(m.state, 'B') m.run() self.assertEqual(m.state, 'C') m.run() self.assertEqual(m.state, 'C%s1' % State.separator) # Define with list of lists transitions = [ ['walk', 'A', 'B'], ['run', 'B', 'C'], ['sprint', 'C', 'D'] ] m = self.stuff.machine_cls(states=states, transitions=transitions, initial='A') m.to_C() m.sprint() self.assertEqual(m.state, 'D') def test_nested_definitions(self): separator = self.state_cls.separator state = { 'name': 'B', 'children': ['1', '2'], 'transitions': [['jo', '1', '2']], 'initial': '2' } m = self.stuff.machine_cls(initial='A', states=['A', state], transitions=[['go', 'A', 'B'], ['go', 'B{0}2'.format(separator), 'B{0}1'.format(separator)]]) self.assertTrue(m.is_A()) m.go() self.assertEqual(m.state, 'B{0}2'.format(separator)) m.go() self.assertEqual(m.state, 'B{0}1'.format(separator)) m.jo() def test_transitioning(self): s = self.stuff s.machine.add_transition('advance', 'A', 'B') s.machine.add_transition('advance', 'B', 'C') s.machine.add_transition('advance', 'C', 'D') s.machine.add_transition('reset', '*', 'A') self.assertEqual(len(s.machine.events['reset'].transitions), 6) self.assertEqual(len(s.machine.events['reset'].transitions['C']), 1) s.advance() self.assertEqual(s.state, 'B') self.assertFalse(s.is_A()) self.assertTrue(s.is_B()) s.advance() self.assertEqual(s.state, 'C') def test_conditions(self): s = self.stuff s.machine.add_transition('advance', 'A', 'B', conditions='this_passes') s.machine.add_transition('advance', 'B', 'C', unless=['this_fails']) s.machine.add_transition('advance', 'C', 'D', unless=['this_fails', 'this_passes']) s.advance() self.assertEqual(s.state, 'B') s.advance() self.assertEqual(s.state, 'C') s.advance() self.assertEqual(s.state, 'C') def test_multiple_add_transitions_from_state(self): State = self.state_cls s = self.stuff s.machine.add_transition( 'advance', 'A', 'B', conditions=['this_fails']) s.machine.add_transition('advance', 'A', 'C') s.machine.add_transition('advance', 'C', 'C%s2' % State.separator) s.advance() self.assertEqual(s.state, 'C') s.advance() self.assertEqual(s.state, 'C%s2' % State.separator) self.assertFalse(s.is_C()) self.assertTrue(s.is_C(allow_substates=True)) def test_use_machine_as_model(self): states = ['A', 'B', 'C', 'D'] m = self.stuff.machine_cls(states=states, initial='A') m.add_transition('move', 'A', 'B') m.add_transition('move_to_C', 'B', 'C') m.move() self.assertEqual(m.state, 'B') def test_add_custom_state(self): State = self.state_cls s = self.stuff s.machine.add_states([{'name': 'E', 'children': ['1', '2']}]) s.machine.add_state('E%s3' % State.separator) s.machine.add_transition('go', '*', 'E%s1' % State.separator) s.machine.add_transition('walk', '*', 'E%s3' % State.separator) s.machine.add_transition('run', 'E', 'C{0}3{0}a'.format(State.separator)) s.go() self.assertEqual('E{0}1'.format(State.separator), s.state) s.walk() self.assertEqual('E{0}3'.format(State.separator), s.state) s.run() self.assertEqual('C{0}3{0}a'.format(State.separator), s.state) def test_add_nested_state(self): m = self.machine_cls(states=['A'], initial='A') m.add_state('B{0}1{0}a'.format(self.state_cls.separator)) self.assertIn('B', m.states) self.assertIn('1', m.states['B'].states) self.assertIn('a', m.states['B'].states['1'].states) with self.assertRaises(ValueError): m.add_state(m.states['A']) def test_enter_exit_nested_state(self): State = self.state_cls mock = MagicMock() def callback(): mock() states = ['A', 'B', {'name': 'C', 'on_enter': callback, 'on_exit': callback, 'children': [{'name': '1', 'on_enter': callback, 'on_exit': callback}, '2', '3']}, {'name': 'D', 'on_enter': callback, 'on_exit': callback}] transitions = [['go', 'A', 'C{0}1'.format(State.separator)], ['go', 'C', 'D']] m = self.stuff.machine_cls(states=states, transitions=transitions, initial='A') m.go() self.assertTrue(mock.called) self.assertEqual(2, mock.call_count) m.go() self.assertTrue(m.is_D()) self.assertEqual(5, mock.call_count) m.to_C() self.assertEqual(7, mock.call_count) m.to('C{0}1'.format(State.separator)) self.assertEqual(8, mock.call_count) m.to('C{0}2'.format(State.separator)) self.assertEqual(9, mock.call_count) def test_ordered_transitions(self): State = self.state_cls states = [{'name': 'first', 'children': ['second', 'third', {'name': 'fourth', 'children': ['fifth', 'sixth']}, 'seventh']}, 'eighth', 'ninth'] m = self.stuff.machine_cls(states=states) m.add_ordered_transitions() self.assertEqual('initial', m.state) m.next_state() self.assertEqual('first', m.state) m.next_state() m.next_state() self.assertEqual('first{0}third'.format(State.separator), m.state) m.next_state() m.next_state() self.assertEqual('first{0}fourth{0}fifth'.format(State.separator), m.state) m.next_state() m.next_state() self.assertEqual('first{0}seventh'.format(State.separator), m.state) m.next_state() m.next_state() self.assertEqual('ninth', m.state) # Include initial state in loop m = self.stuff.machine_cls(states=states) m.add_ordered_transitions(loop_includes_initial=False) m.to_ninth() m.next_state() self.assertEqual(m.state, 'first') # Test user-determined sequence and trigger name m = self.stuff.machine_cls(states=states, initial='first') m.add_ordered_transitions(['first', 'ninth'], trigger='advance') m.advance() self.assertEqual(m.state, 'ninth') m.advance() self.assertEqual(m.state, 'first') # Via init argument m = self.stuff.machine_cls(states=states, initial='first', ordered_transitions=True) m.next_state() self.assertEqual(m.state, 'first{0}second'.format(State.separator)) def test_pickle(self): print("separator", self.state_cls.separator) if sys.version_info < (3, 4): import dill as pickle else: import pickle states = ['A', 'B', {'name': 'C', 'children': ['1', '2', {'name': '3', 'children': ['a', 'b', 'c']}]}, 'D', 'E', 'F'] transitions = [ {'trigger': 'walk', 'source': 'A', 'dest': 'B'}, {'trigger': 'run', 'source': 'B', 'dest': 'C'}, {'trigger': 'sprint', 'source': 'C', 'dest': 'D'} ] m = self.stuff.machine_cls(states=states, transitions=transitions, initial='A') m.walk() dump = pickle.dumps(m) self.assertIsNotNone(dump) m2 = pickle.loads(dump) self.assertEqual(m.state, m2.state) m2.run() m2.to_C_3_a() m2.to_C_3_b() def test_callbacks_duplicate(self): transitions = [ {'trigger': 'walk', 'source': 'A', 'dest': 'C', 'before': 'before_change', 'after': 'after_change'}, {'trigger': 'run', 'source': 'B', 'dest': 'C'} ] m = self.stuff.machine_cls(states=['A', 'B', 'C'], transitions=transitions, before_state_change='before_change', after_state_change='after_change', send_event=True, initial='A', auto_transitions=True) m.before_change = MagicMock() m.after_change = MagicMock() m.walk() self.assertEqual(m.before_change.call_count, 2) self.assertEqual(m.after_change.call_count, 2) def test_example_one(self): State = self.state_cls State.separator = '_' states = ['standing', 'walking', {'name': 'caffeinated', 'children': ['dithering', 'running']}] transitions = [['walk', 'standing', 'walking'], ['stop', 'walking', 'standing'], ['drink', 'caffeinated_dithering', '='], ['drink', 'caffeinated', 'caffeinated_dithering'], ['drink', '*', 'caffeinated'], ['walk', 'caffeinated', 'caffeinated_running'], ['relax', 'caffeinated', 'standing']] machine = self.stuff.machine_cls(states=states, transitions=transitions, initial='standing', ignore_invalid_triggers=True, name='Machine 1') machine.walk() # Walking now machine.stop() # let's stop for a moment machine.drink() # coffee time machine.state self.assertEqual(machine.state, 'caffeinated') machine.drink() # again! self.assertEqual(machine.state, 'caffeinated_dithering') machine.drink() # and again! self.assertEqual(machine.state, 'caffeinated_dithering') machine.walk() # we have to go faster self.assertEqual(machine.state, 'caffeinated_running') machine.stop() # can't stop moving! machine.state self.assertEqual(machine.state, 'caffeinated_running') machine.relax() # leave nested state machine.state # phew, what a ride self.assertEqual(machine.state, 'standing') machine.to_caffeinated_running() # auto transition fast track machine.on_enter_caffeinated_running('callback_method') def test_multiple_models(self): class Model(object): pass s1, s2 = Model(), Model() m = self.stuff.machine_cls(model=[s1, s2], states=['A', 'B', 'C'], initial='A') self.assertEqual(len(m.models), 2) m.add_transition('advance', 'A', 'B') self.assertNotEqual(s1.advance, s2.advance) s1.advance() self.assertEqual(s1.state, 'B') self.assertEqual(s2.state, 'A') def test_excessive_nesting(self): states = [{'name': 'A', 'children': []}] # type: List[Dict[str, Union[str, List[Dict]]]] curr = states[0] # type: Dict for i in range(10): curr['children'].append({'name': str(i), 'children': []}) curr = curr['children'][0] m = self.stuff.machine_cls(states=states, initial='A') def test_intial_state(self): separator = self.state_cls.separator states = [{'name': 'A', 'children': ['1', '2'], 'initial': '2'}, {'name': 'B', 'initial': '2', 'children': ['1', {'name': '2', 'initial': 'a', 'children': ['a', 'b']}]}] transitions = [['do', 'A', 'B'], ['do', 'B{0}2'.format(separator), 'B{0}1'.format(separator)]] m = self.stuff.machine_cls(states=states, transitions=transitions, initial='A') self.assertEqual(m.state, 'A{0}2'.format(separator)) m.do() self.assertEqual(m.state, 'B{0}2{0}a'.format(separator)) self.assertTrue(m.is_B(allow_substates=True)) m.do() self.assertEqual(m.state, 'B{0}1'.format(separator)) m = self.stuff.machine_cls(states=states, transitions=transitions, initial='B{0}2{0}b'.format(separator)) self.assertTrue('B{0}2{0}b'.format(separator), m.state) def test_get_triggers(self): seperator = self.state_cls.separator states = ['standing', 'walking', {'name': 'caffeinated', 'children': ['dithering', 'running']}] transitions = [ ['walk', 'standing', 'walking'], ['go', 'standing', 'walking'], ['stop', 'walking', 'standing'], {'trigger': 'drink', 'source': '*', 'dest': 'caffeinated{0}dithering'.format(seperator), 'conditions': 'is_hot', 'unless': 'is_too_hot'}, ['walk', 'caffeinated{0}dithering'.format(seperator), 'caffeinated{0}running'.format(seperator)], ['relax', 'caffeinated', 'standing'] ] machine = self.stuff.machine_cls(states=states, transitions=transitions, auto_transitions=False) trans = machine.get_triggers('caffeinated{0}dithering'.format(seperator)) self.assertEqual(len(trans), 3) self.assertTrue('relax' in trans) def test_get_nested_transitions(self): seperator = self.state_cls.separator states = ['A', {'name': 'B', 'children': ['1', '2', {'name': '3', 'children': ['a', 'b'], 'transitions': [['inner', 'a', 'b'], ['inner', 'b', 'a']]}], 'transitions': [['mid', '1', '1'], ['mid', '2', '3'], ['mid', '3', '1'], ['mid2', '2', '3'], ['mid_loop', '1', '1']]}] transitions = [['outer', 'A', 'B'], ['outer', ['A', 'B'], 'C']] machine = self.stuff.machine_cls(states=states, transitions=transitions, initial='A', auto_transitions=False) self.assertEqual(10, len(machine.get_transitions())) self.assertEqual(2, len(machine.get_transitions(source='A'))) self.assertEqual(2, len(machine.get_transitions('inner'))) self.assertEqual(3, len(machine.get_transitions('mid'))) self.assertEqual(3, len(machine.get_transitions(dest='B{0}1'.format(seperator)))) self.assertEqual(2, len(machine.get_transitions(source='B{0}2'.format(seperator), dest='B{0}3'.format(seperator)))) self.assertEqual(1, len(machine.get_transitions(source='B{0}3{0}a'.format(seperator), dest='B{0}3{0}b'.format(seperator)))) self.assertEqual(1, len(machine.get_transitions(source=machine.states['B'].states['3'].states['b']))) # should be B_3_b -> B_3_a, B_3 -> B_1 and B -> C self.assertEqual(3, len(machine.get_transitions(source=machine.states['B'].states['3'].states['b'], delegate=True))) def test_internal_transitions(self): s = self.stuff s.machine.add_transition('internal', 'A', None, prepare='increase_level') s.internal() self.assertEqual(s.state, 'A') self.assertEqual(s.level, 2) def test_transition_with_unknown_state(self): s = self.stuff with self.assertRaises(ValueError): s.machine.add_transition('next', 'A', s.machine.state_cls('X')) def test_skip_to_override(self): mock = MagicMock() class Model: def to(self): mock() model1 = Model() model2 = DummyModel() machine = self.machine_cls([model1, model2], states=['A', 'B'], initial='A') model1.to() model2.to('B') self.assertTrue(mock.called) self.assertTrue(model2.is_B()) def test_trigger_parent(self): parent_mock = MagicMock() exit_mock = MagicMock() enter_mock = MagicMock() class Model: def on_exit_A(self): parent_mock() def on_exit_A_1(self): exit_mock() def on_enter_A_2(self): enter_mock() model = Model() machine = self.machine_cls(model, states=[{'name': 'A', 'children': ['1', '2']}], transitions=[['go', 'A', 'A_2'], ['enter', 'A', 'A_1']], initial='A') model.enter() self.assertFalse(parent_mock.called) model.go() self.assertTrue(exit_mock.called) self.assertTrue(enter_mock.called) self.assertFalse(parent_mock.called) def test_trigger_parent_model_self(self): exit_mock = MagicMock() enter_mock = MagicMock() class CustomMachine(self.machine_cls): # type: ignore def on_enter_A(self): raise AssertionError("on_enter_A must not be called!") def on_exit_A(self): raise AssertionError("on_exit_A must not be called!") def on_exit_A_1(self): exit_mock() def on_enter_A_2(self): enter_mock() machine = CustomMachine(states=[{'name': 'A', 'children': ['1', '2']}], transitions=[['go', 'A', 'A_2'], ['enter', 'A', 'A_1']], initial='A') machine.enter() self.assertFalse(exit_mock.called) self.assertFalse(enter_mock.called) machine.go() self.assertTrue(exit_mock.called) self.assertTrue(enter_mock.called) machine.go() self.assertEqual(2, enter_mock.call_count) def test_child_condition_persistence(self): # even though the transition is invalid for the parent it is valid for the nested child state # no invalid transition exception should be thrown machine = self.machine_cls(states=[{'name': 'A', 'children': ['1', '2'], 'initial': '1', 'transitions': [{'trigger': 'go', 'source': '1', 'dest': '2', 'conditions': self.stuff.this_fails}]}, 'B'], transitions=[['go', 'B', 'A']], initial='A') self.assertFalse(False, machine.go()) def test_exception_in_state_enter_exit(self): # https://github.com/pytransitions/transitions/issues/486 # NestedState._scope needs to be reset when an error is raised in a state callback class Model: def on_enter_B_1(self): raise RuntimeError("Oh no!") def on_exit_C_1(self): raise RuntimeError("Oh no!") states = ['A', {'name': 'B', 'initial': '1', 'children': ['1', '2']}, {'name': 'C', 'initial': '1', 'children': ['1', '2']}] model = Model() machine = self.machine_cls(model, states=states, initial='A') with self.assertRaises(RuntimeError): model.to_B() self.assertTrue(model.is_B_1()) machine.set_state('A', model) with self.assertRaises(RuntimeError): model.to_B() with self.assertRaises(RuntimeError): model.to_C() model.to_A() self.assertTrue(model.is_C_1()) machine.set_state('A', model) model.to_C() self.assertTrue(model.is_C_1()) def test_correct_subclassing(self): from transitions.core import State class WrongStateClass(self.machine_cls): # type: ignore state_cls = State class MyNestedState(NestedState): pass class CorrectStateClass(self.machine_cls): # type: ignore state_cls = MyNestedState with self.assertRaises(AssertionError): m = WrongStateClass() m = CorrectStateClass() def test_queued_callbacks(self): states = [ "initial", {'name': 'A', 'children': [{'name': '1', 'on_enter': 'go'}, '2'], 'transitions': [['go', '1', '2']], 'initial': '1'} ] machine = self.machine_cls(states=states, initial='initial', queued=True) machine.to_A() self.assertEqual("A{0}2".format(self.state_cls.separator), machine.state) def test_nested_transitions(self): states = [{ 'name': 'A', 'states': [ {'name': 'B', 'states': [ {'name': 'C', 'states': ['1', '2'], 'initial': '1'}], 'transitions': [['go', 'C_1', 'C_2']], 'initial': 'C', }], 'initial': 'B' }] machine = self.machine_cls(states=states, initial='A') machine.go() def test_auto_transitions_from_nested_callback(self): def fail(): self.fail("C should not be exited!") states = [ {'name': 'b', 'children': [ {'name': 'c', 'on_exit': fail, 'on_enter': 'to_b_c_ca', 'children': ['ca', 'cb']}, 'd' ]}, ] machine = self.machine_cls(states=states, queued=True, initial='b') machine.to_b_c() def test_machine_may_transitions_for_generated_triggers(self): states = ['A', 'B', {'name': 'C', 'children': ['1', '2', '3']}, 'D'] m = self.stuff.machine_cls(states=states, initial='A') assert m.may_to_A() m.to_A() assert m.may_to_B() m.to_B() assert m.may_to_C() m.to_C() assert m.may_to_C_1() m.to_C_1() assert m.may_to_D() m.to_D() def test_get_nested_triggers(self): transitions = [ ['goB', 'A', 'B'], ['goC', 'B', 'C'], ['goA', '*', 'A'], ['goF1', ['C{0}1'.format(self.machine_cls.separator), 'C{0}2'.format(self.machine_cls.separator)], 'F'], ['goF2', 'C', 'F'] ] m = self.machine_cls(states=test_states, transitions=transitions, auto_transitions=False, initial='A') self.assertEqual(1, len(m.get_nested_triggers(['C', '1']))) with m('C'): m.add_transition('goC1', '1', '2') self.assertEqual(len(transitions) + 1, len(m.get_nested_triggers())) self.assertEqual(2, len(m.get_nested_triggers(['C', '1']))) self.assertEqual(2, len(m.get_nested_triggers(['C']))) def test_stop_transition_evaluation(self): states = ['A', {'name': 'B', 'states': ['C', 'D']}] transitions = [['next', 'A', 'B_C'], ['next', 'B_C', 'B_D'], ['next', 'B', 'A']] mock = MagicMock() def process_error(event_data): assert isinstance(event_data.error, ValueError) mock() m = self.machine_cls(states=states, transitions=transitions, initial='A', send_event=True) m.on_enter_B_D(partial(self.stuff.this_raises, ValueError())) m.next() with self.assertRaises(ValueError): m.next() assert m.is_B_D() assert m.to_B_C() m.on_exception = [process_error] m.next() assert mock.called assert m.is_B_D() def test_nested_queued_remap(self): states = ['A', 'done', {'name': 'B', 'remap': {'done': 'done'}, 'initial': 'initial', 'transitions': [['go', 'initial', 'a']], 'states': ['done', 'initial', {'name': 'a', 'remap': {'done': 'done'}, 'initial': 'initial', 'transitions': [['go', 'initial', 'x']], 'states': ['done', 'initial', {'name': 'x', 'remap': {'done': 'done'}, 'initial': 'initial', 'states': ['initial', 'done'], 'transitions': [['done', 'initial', 'done']]}]}]}] m = self.machine_cls(states=states, initial='A', queued=True) m.on_enter_B('go') m.on_enter_B_a('go') m.on_enter_B_a_x_initial('done') m.to_B() assert m.is_done() # https://github.com/pytransitions/transitions/issues/568 def test_wildcard_src_reflexive_dest(self): states = ['A', 'B', {'name': 'C', 'children': ['1', '2', '3']}, 'D'] machine = self.machine_cls(states=states, transitions=[["reflexive", "*", "="]], initial="A") self.assertTrue(machine.is_A()) machine.reflexive() self.assertTrue(machine.is_A()) state_name = 'C{0}2'.format(self.state_cls.separator) machine.set_state(state_name) self.assertEqual(state_name, machine.state) machine.reflexive() self.assertEqual(state_name, machine.state) class TestSeparatorsBase(TestCase): separator = default_separator def setUp(self): class CustomNestedState(NestedState): separator = self.separator class CustomHierarchicalMachine(HierarchicalMachine): state_cls = CustomNestedState self.states = test_states self.machine_cls = CustomHierarchicalMachine self.state_cls = CustomNestedState self.stuff = Stuff(self.states, self.machine_cls) def test_enter_exit_nested(self): separator = self.state_cls.separator s = self.stuff s.machine.add_transition('advance', 'A', 'C{0}3'.format(separator)) s.machine.add_transition('reverse', 'C', 'A') s.machine.add_transition('lower', ['C{0}1'.format(separator), 'C{0}3'.format(separator)], 'C{0}3{0}a'.format(separator)) s.machine.add_transition('rise', 'C{0}3'.format(separator), 'C{0}1'.format(separator)) s.machine.add_transition('fast', 'A', 'C{0}3{0}a'.format(separator)) for state_name in s.machine.get_nested_state_names(): state = s.machine.get_state(state_name) state.on_enter.append('increase_level') state.on_exit.append('decrease_level') s.advance() self.assertEqual('C{0}3'.format(separator), s.state) self.assertEqual(2, s.level) self.assertEqual(3, s.transitions) # exit A; enter C,3 s.lower() self.assertEqual(s.state, 'C{0}3{0}a'.format(separator)) self.assertEqual(3, s.level) self.assertEqual(4, s.transitions) # enter a s.rise() self.assertEqual('C%s1' % separator, s.state) self.assertEqual(2, s.level) self.assertEqual(7, s.transitions) # exit a, 3; enter 1 s.reverse() self.assertEqual('A', s.state) self.assertEqual(1, s.level) self.assertEqual(10, s.transitions) # exit 1, C; enter A s.fast() self.assertEqual(s.state, 'C{0}3{0}a'.format(separator)) self.assertEqual(s.level, 3) self.assertEqual(s.transitions, 14) # exit A; enter C, 3, a s.to_A() self.assertEqual(s.state, 'A') self.assertEqual(s.level, 1) self.assertEqual(s.transitions, 18) # exit a, 3, C; enter A s.to_A() self.assertEqual(s.state, 'A') self.assertEqual(s.level, 1) self.assertEqual(s.transitions, 20) # exit A; enter A if separator == '_': s.to_C_3_a() else: print("separator", separator) s.to_C.s3.a() self.assertEqual(s.state, 'C{0}3{0}a'.format(separator)) self.assertEqual(s.level, 3) self.assertEqual(s.transitions, 24) # exit A; enter C, 3, a def test_state_change_listeners(self): State = self.state_cls s = self.stuff s.machine.add_transition('advance', 'A', 'C%s1' % State.separator) s.machine.add_transition('reverse', 'C', 'A') s.machine.add_transition('lower', 'C%s1' % State.separator, 'C{0}3{0}a'.format(State.separator)) s.machine.add_transition('rise', 'C%s3' % State.separator, 'C%s1' % State.separator) s.machine.add_transition('fast', 'A', 'C{0}3{0}a'.format(State.separator)) s.machine.on_enter_C('hello_world') s.machine.on_exit_C('goodbye') s.machine.on_enter('C{0}3{0}a'.format(State.separator), 'greet') s.machine.on_exit('C%s3' % State.separator, 'meet') s.advance() self.assertEqual(s.state, 'C%s1' % State.separator) self.assertEqual(s.message, 'Hello World!') s.lower() self.assertEqual(s.state, 'C{0}3{0}a'.format(State.separator)) self.assertEqual(s.message, 'Hi') s.rise() self.assertEqual(s.state, 'C%s1' % State.separator) self.assertTrue(s.message is not None and s.message.startswith('Nice to')) s.reverse() self.assertEqual(s.state, 'A') self.assertTrue(s.message is not None and s.message.startswith('So long')) s.fast() self.assertEqual(s.state, 'C{0}3{0}a'.format(State.separator)) self.assertEqual(s.message, 'Hi') s.to_A() self.assertEqual(s.state, 'A') self.assertTrue(s.message is not None and s.message.startswith('So long')) def test_nested_auto_transitions(self): State = self.state_cls s = self.stuff s.to_C() self.assertEqual(s.state, 'C') state = 'C{0}3{0}a'.format(State.separator) s.to(state) self.assertEqual(s.state, state) # backwards compatibility check (can be removed in 0.7) self.assertEqual(s.state, state) for state_name in s.machine.get_nested_state_names(): event_name = 'to_{0}'.format(state_name) num_base_states = len(s.machine.states) self.assertTrue(event_name in s.machine.events) self.assertEqual(len(s.machine.events[event_name].transitions), num_base_states) @skipIf(pgv is None, 'NestedGraph diagram test requires graphviz') def test_ordered_with_graph(self): class CustomHierarchicalGraphMachine(HierarchicalGraphMachine): state_cls = self.state_cls states = ['A', 'B', {'name': 'C', 'children': ['1', '2', {'name': '3', 'children': ['a', 'b', 'c']}]}, 'D', 'E', 'F'] machine = CustomHierarchicalGraphMachine(states=states, initial='A', auto_transitions=False, ignore_invalid_triggers=True, use_pygraphviz=False) machine.add_ordered_transitions(trigger='next_state') machine.next_state() self.assertEqual(machine.state, 'B') target = tempfile.NamedTemporaryFile(suffix='.png', delete=False) machine.get_graph().draw(target.name, prog='dot') self.assertTrue(getsize(target.name) > 0) target.close() unlink(target.name) def test_example_two(self): separator = self.state_cls.separator states = ['A', 'B', {'name': 'C', 'children': ['1', '2', {'name': '3', 'children': ['a', 'b', 'c']}] }] transitions = [ ['reset', 'C', 'A'], ['reset', 'C%s2' % separator, 'C'] # overwriting parent reset ] # we rely on auto transitions machine = self.stuff.machine_cls(states=states, transitions=transitions, initial='A') machine.to_B() # exit state A, enter state B machine.to_C() # exit B, enter C if separator == '_': machine.to_C_3_a() self.assertTrue(machine.is_C(allow_substates=True)) self.assertFalse(machine.is_C()) self.assertTrue(machine.is_C_3(allow_substates=True)) self.assertFalse(machine.is_C_3()) self.assertTrue(machine.is_C_3_a()) else: machine.to_C.s3.a() # enter C↦a; enter C↦3↦a; self.assertTrue(machine.is_C(allow_substates=True)) self.assertFalse(machine.is_C()) self.assertTrue(machine.is_C.s3(allow_substates=True)) self.assertFalse(machine.is_C.s3()) self.assertTrue(machine.is_C.s3.a()) self.assertEqual(machine.state, 'C{0}3{0}a'.format(separator)) machine.to('C{0}2'.format(separator)) # exit C↦3↦a, exit C↦3, enter C↦2 self.assertEqual(machine.state, 'C{0}2'.format(separator)) machine.reset() # exit C↦2; reset C has been overwritten by C↦3 self.assertEqual('C', machine.state) machine.reset() # exit C, enter A self.assertEqual('A', machine.state) def test_machine_may_transitions(self): states = ['A', 'B', {'name': 'C', 'children': ['1', '2', '3']}, 'D'] transitions = [ {'trigger': 'walk', 'source': 'A', 'dest': 'B'}, {'trigger': 'run', 'source': 'B', 'dest': 'C'}, {'trigger': 'run_fast', 'source': 'C', 'dest': 'C{0}1'.format(self.separator)}, {'trigger': 'sprint', 'source': 'C', 'dest': 'D'} ] m = self.stuff.machine_cls( states=states, transitions=transitions, initial='A', auto_transitions=False ) assert m.may_walk() assert not m.may_run() assert not m.may_run_fast() assert not m.may_sprint() m.walk() assert not m.may_walk() assert m.may_run() assert not m.may_run_fast() m.run() assert m.may_run_fast() assert m.may_sprint() m.run_fast() class TestSeparatorsSlash(TestSeparatorsBase): separator = '/' class TestSeparatorsDot(TestSeparatorsBase): separator = '.' @skipIf(sys.version_info[0] < 3, "Unicode separators are only supported for Python 3") class TestSeparatorUnicode(TestSeparatorsBase): separator = u'↦' transitions-0.9.0/tests/test_parallel.py0000644000232200023220000002054214304350474021021 0ustar debalancedebalancetry: from builtins import object except ImportError: pass from collections import OrderedDict from transitions.extensions.nesting import NestedState as State, _build_state_list from transitions.extensions import HierarchicalGraphMachine from transitions import MachineError from .test_nesting import TestNestedTransitions as TestNested from .test_pygraphviz import pgv from .test_graphviz import pgv as gv from unittest import skipIf try: from unittest.mock import MagicMock except ImportError: from mock import MagicMock # type: ignore class TestParallel(TestNested): def setUp(self): super(TestParallel, self).setUp() self.states = ['A', 'B', {'name': 'C', 'parallel': [{'name': '1', 'children': ['a', 'b'], 'initial': 'a', 'transitions': [['go', 'a', 'b']]}, {'name': '2', 'children': ['a', 'b'], 'initial': 'a', 'transitions': [['go', 'a', 'b']]}]}] self.transitions = [['reset', 'C', 'A']] def test_init(self): m = self.stuff.machine_cls(states=self.states) m.to_C() self.assertEqual(['C{0}1{0}a'.format(State.separator), 'C{0}2{0}a'.format(State.separator)], m.state) def test_enter(self): m = self.stuff.machine_cls(states=self.states, transitions=self.transitions, initial='A') m.to_C() m.go() self.assertEqual(['C{0}1{0}b'.format(State.separator), 'C{0}2{0}b'.format(State.separator)], m.state) def test_exit(self): class Model: def __init__(self): self.mock = MagicMock() def on_exit_C(self): self.mock() def on_exit_C_1(self): self.mock() def on_exit_C_2(self): self.mock() model1 = Model() m = self.stuff.machine_cls(model1, states=self.states, transitions=self.transitions, initial='A') m.add_transition('reinit', 'C', 'C') model1.to_C() self.assertEqual(['C{0}1{0}a'.format(State.separator), 'C{0}2{0}a'.format(State.separator)], model1.state) model1.reset() self.assertTrue(model1.is_A()) self.assertEqual(3, model1.mock.call_count) model2 = Model() m.add_model(model2, initial='C') model2.reinit() self.assertEqual(['C{0}1{0}a'.format(State.separator), 'C{0}2{0}a'.format(State.separator)], model2.state) self.assertEqual(3, model2.mock.call_count) model2.reset() self.assertTrue(model2.is_A()) self.assertEqual(6, model2.mock.call_count) for mod in m.models: mod.trigger('to_C') for mod in m.models: mod.trigger('reset') self.assertEqual(6, model1.mock.call_count) self.assertEqual(9, model2.mock.call_count) def test_parent_transition(self): m = self.stuff.machine_cls(states=self.states) m.add_transition('switch', 'C{0}2{0}a'.format(State.separator), 'C{0}2{0}b'.format(State.separator)) m.to_C() m.switch() self.assertEqual(['C{0}1{0}a'.format(State.separator), 'C{0}2{0}b'.format(State.separator)], m.state) def test_shallow_parallel(self): sep = self.state_cls.separator states = [ { 'name': 'P', 'parallel': [ '1', # no initial state {'name': '2', 'children': ['a', 'b'], 'initial': 'b'} ] }, 'X' ] m = self.machine_cls(states=states, initial='P') self.assertEqual(['P{0}1'.format(sep), 'P{0}2{0}b'.format(sep)], m.state) m.to_X() self.assertEqual('X', m.state) m.to_P() self.assertEqual(['P{0}1'.format(sep), 'P{0}2{0}b'.format(sep)], m.state) with self.assertRaises(MachineError): m.to('X') def test_multiple(self): states = ['A', {'name': 'B', 'parallel': [ {'name': '1', 'parallel': [ {'name': 'a', 'children': ['x', 'y', 'z'], 'initial': 'z'}, {'name': 'b', 'children': ['x', 'y', 'z'], 'initial': 'y'} ]}, {'name': '2', 'children': ['a', 'b', 'c'], 'initial': 'a'}, ]}] m = self.stuff.machine_cls(states=states, initial='A') self.assertTrue(m.is_A()) m.to_B() self.assertEqual([['B{0}1{0}a{0}z'.format(State.separator), 'B{0}1{0}b{0}y'.format(State.separator)], 'B{0}2{0}a'.format(State.separator)], m.state) # check whether we can initialize a new machine in a parallel state m2 = self.machine_cls(states=states, initial=m.state) self.assertEqual([['B{0}1{0}a{0}z'.format(State.separator), 'B{0}1{0}b{0}y'.format(State.separator)], 'B{0}2{0}a'.format(State.separator)], m2.state) m.to_A() self.assertEqual('A', m.state) m2.to_A() self.assertEqual(m.state, m2.state) def test_deep_initial(self): m = self.machine_cls(initial=['A', 'B{0}2{0}a'.format(State.separator)]) m.to_B() self.assertEqual('B', m.state) def test_parallel_initial(self): m = self.machine_cls(states=['A', 'B', {'name': 'C', 'parallel': ['1', '2']}], initial='C') m = self.machine_cls(states=['A', 'B', {'name': 'C', 'parallel': ['1', '2']}], initial=['C_1', 'C_2']) def test_multiple_deeper(self): sep = self.state_cls.separator states = ['A', {'name': 'P', 'parallel': [ '1', {'name': '2', 'parallel': [ {'name': 'a'}, {'name': 'b', 'parallel': [ {'name': 'x', 'parallel': ['1', '2']}, 'y' ]} ]}, ]}] ref_state = ['P{0}1'.format(sep), ['P{0}2{0}a'.format(sep), [['P{0}2{0}b{0}x{0}1'.format(sep), 'P{0}2{0}b{0}x{0}2'.format(sep)], 'P{0}2{0}b{0}y'.format(sep)]]] m = self.stuff.machine_cls(states=states, initial='A') self.assertTrue(m.is_A()) m.to_P() self.assertEqual(ref_state, m.state) m.to_A() def test_model_state_conversion(self): sep = self.state_cls.separator states = ['P{0}1'.format(sep), ['P{0}2{0}a'.format(sep), [['P{0}2{0}b{0}x{0}1'.format(sep), 'P{0}2{0}b{0}x{0}2'.format(sep)], 'P{0}2{0}b{0}y'.format(sep)]]] tree = OrderedDict( [('P', OrderedDict( [('1', OrderedDict()), ('2', OrderedDict( [('a', OrderedDict()), ('b', OrderedDict( [('x', OrderedDict( [('1', OrderedDict()), ('2', OrderedDict())])), ('y', OrderedDict())] ))] ))] ))] ) m = self.machine_cls() self.assertEqual(tree, m.build_state_tree(states, sep)) self.assertEqual(states, _build_state_list(tree, sep)) @skipIf(pgv is None, "pygraphviz is not available") class TestParallelWithPyGraphviz(TestParallel): def setUp(self): class PGVMachine(HierarchicalGraphMachine): def __init__(self, *args, **kwargs): kwargs['use_pygraphviz'] = True super(PGVMachine, self).__init__(*args, **kwargs) super(TestParallelWithPyGraphviz, self).setUp() self.machine_cls = PGVMachine @skipIf(gv is None, "graphviz is not available") class TestParallelWithGraphviz(TestParallel): def setUp(self): class GVMachine(HierarchicalGraphMachine): def __init__(self, *args, **kwargs): kwargs['use_pygraphviz'] = False super(GVMachine, self).__init__(*args, **kwargs) super(TestParallelWithGraphviz, self).setUp() self.machine_cls = GVMachine transitions-0.9.0/tests/test_enum.py0000644000232200023220000003334314304350474020174 0ustar debalancedebalancefrom unittest import TestCase, skipIf from transitions.core import Machine from transitions.extensions.diagrams import GraphMachine, HierarchicalGraphMachine from transitions.extensions.nesting import HierarchicalMachine try: import enum except ImportError: enum = None # type: ignore from .test_core import TYPE_CHECKING from .test_pygraphviz import pgv from .test_graphviz import pgv as gv if TYPE_CHECKING: from typing import Type, List, Union, Dict @skipIf(enum is None, "enum is not available") class TestEnumsAsStates(TestCase): def setUp(self): class States(enum.Enum): RED = 1 YELLOW = 2 GREEN = 3 self.machine_cls = Machine self.States = States def test_pass_enums_as_states(self): m = self.machine_cls(states=self.States, initial=self.States.YELLOW) assert m.state == self.States.YELLOW assert m.is_RED() is False assert m.is_YELLOW() is True assert m.is_RED() is False m.to_RED() assert m.state == self.States.RED assert m.is_RED() is True assert m.is_YELLOW() is False assert m.is_GREEN() is False def test_transitions(self): m = self.machine_cls(states=self.States, initial=self.States.RED) m.add_transition('switch_to_yellow', self.States.RED, self.States.YELLOW) m.add_transition('switch_to_green', 'YELLOW', 'GREEN') m.switch_to_yellow() assert m.is_YELLOW() is True m.switch_to_green() assert m.is_YELLOW() is False assert m.is_GREEN() is True def test_if_enum_has_string_behavior(self): class States(str, enum.Enum): __metaclass__ = enum.EnumMeta RED = 'red' YELLOW = 'yellow' m = self.machine_cls(states=States, auto_transitions=False, initial=States.RED) m.add_transition('switch_to_yellow', States.RED, States.YELLOW) m.switch_to_yellow() assert m.is_YELLOW() is True def test_property_initial(self): transitions = [ {'trigger': 'switch_to_yellow', 'source': self.States.RED, 'dest': self.States.YELLOW}, {'trigger': 'switch_to_green', 'source': 'YELLOW', 'dest': 'GREEN'}, ] m = self.machine_cls(states=self.States, initial=self.States.RED, transitions=transitions) m.switch_to_yellow() assert m.is_YELLOW() m.switch_to_green() assert m.is_GREEN() def test_pass_state_instances_instead_of_names(self): state_A = self.machine_cls.state_cls(self.States.YELLOW) state_B = self.machine_cls.state_cls(self.States.GREEN) states = [state_A, state_B] m = self.machine_cls(states=states, initial=state_A) assert m.state == self.States.YELLOW m.add_transition('advance', state_A, state_B) m.advance() assert m.state == self.States.GREEN def test_state_change_listeners(self): class States(enum.Enum): ONE = 1 TWO = 2 class Stuff(object): def __init__(self, machine_cls): self.state = None self.machine = machine_cls(states=States, initial=States.ONE, model=self) self.machine.add_transition('advance', States.ONE, States.TWO) self.machine.add_transition('reverse', States.TWO, States.ONE) self.machine.on_enter_TWO('hello') self.machine.on_exit_TWO('goodbye') def hello(self): self.message = 'Hello' def goodbye(self): self.message = 'Goodbye' s = Stuff(self.machine_cls) s.advance() assert s.is_TWO() assert s.message == 'Hello' s.reverse() assert s.is_ONE() assert s.message == 'Goodbye' def test_enum_zero(self): from enum import IntEnum class State(IntEnum): FOO = 0 BAR = 1 transitions = [ ['foo', State.FOO, State.BAR], ['bar', State.BAR, State.FOO] ] m = self.machine_cls(states=State, initial=State.FOO, transitions=transitions) m.foo() self.assertTrue(m.is_BAR()) m.bar() self.assertTrue(m.is_FOO()) def test_get_transitions(self): m = self.machine_cls(states=self.States, initial=self.States.RED) self.assertEqual(3, len(m.get_transitions(source=self.States.RED))) self.assertEqual(3, len(m.get_transitions(dest=self.States.RED))) self.assertEqual(1, len(m.get_transitions(source=self.States.RED, dest=self.States.YELLOW))) self.assertEqual(9, len(m.get_transitions())) m.add_transition('switch_to_yellow', self.States.RED, self.States.YELLOW) self.assertEqual(4, len(m.get_transitions(source=self.States.RED))) # we expect two return values. 'switch_to_yellow' and 'to_YELLOW' self.assertEqual(2, len(m.get_transitions(source=self.States.RED, dest=self.States.YELLOW))) def test_get_triggers(self): m = self.machine_cls(states=self.States, initial=self.States.RED) trigger_name = m.get_triggers(m.state.name) trigger_enum = m.get_triggers(m.state) self.assertEqual(trigger_enum, trigger_name) def test_may_transition(self): class TrafficLight(object): pass t = TrafficLight() m = Machine(states=self.States, model=t, initial=self.States.RED, auto_transitions=False) m.add_transition('go', self.States.RED, self.States.GREEN) m.add_transition('stop', self.States.YELLOW, self.States.RED) assert t.may_go() assert not t.may_stop() @skipIf(enum is None, "enum is not available") class TestNestedStateEnums(TestEnumsAsStates): def setUp(self): super(TestNestedStateEnums, self).setUp() self.machine_cls = HierarchicalMachine # type: Type[HierarchicalMachine] def test_root_enums(self): states = [self.States.RED, self.States.YELLOW, {'name': self.States.GREEN, 'children': ['tick', 'tock'], 'initial': 'tick'}] \ # type: List[Union[enum.Enum, Dict]] m = self.machine_cls(states=states, initial=self.States.GREEN) self.assertTrue(m.is_GREEN(allow_substates=True)) self.assertTrue(m.is_GREEN_tick()) m.to_RED() self.assertTrue(m.state is self.States.RED) def test_nested_enums(self): states = ['A', self.States.GREEN, {'name': 'C', 'children': self.States, 'initial': self.States.GREEN}] \ # type: List[Union[str, enum.Enum,Dict]] m1 = self.machine_cls(states=states, initial='C') m2 = self.machine_cls(states=states, initial='A') self.assertEqual(m1.state, self.States.GREEN) self.assertTrue(m1.is_GREEN()) # even though it is actually C_GREEN m2.to_GREEN() self.assertTrue(m2.is_C_GREEN()) # even though it is actually just GREEN self.assertEqual(m1.state, m2.state) m1.to_A() self.assertNotEqual(m1.state, m2.state) def test_initial_enum(self): m1 = self.machine_cls(states=self.States, initial=self.States.GREEN) self.assertEqual(self.States.GREEN, m1.state) self.assertEqual(m1.state.name, self.States.GREEN.name) def test_duplicate_states(self): with self.assertRaises(ValueError): self.machine_cls(states=['A', 'A']) def test_duplicate_states_from_enum_members(self): class Foo(enum.Enum): A = 1 with self.assertRaises(ValueError): self.machine_cls(states=[Foo.A, Foo.A]) def test_add_enum_transition(self): class Foo(enum.Enum): A = 0 B = 1 class Bar(enum.Enum): FOO = Foo C = 2 m = self.machine_cls(states=Bar, initial=Bar.C, auto_transitions=False) m.add_transition('go', Bar.C, Foo.A, conditions=lambda: False) trans = m.events['go'].transitions['C'] self.assertEqual(1, len(trans)) self.assertEqual('FOO_A', trans[0].dest) m.add_transition('go', Bar.C, 'FOO_B') self.assertEqual(2, len(trans)) self.assertEqual('FOO_B', trans[1].dest) m.go() self.assertTrue(m.is_FOO_B()) m.add_transition('go', Foo.B, 'C') trans = m.events['go'].transitions['FOO_B'] self.assertEqual(1, len(trans)) self.assertEqual('C', trans[0].dest) m.go() self.assertEqual(m.state, Bar.C) def test_add_nested_enums_as_nested_state(self): class Foo(enum.Enum): A = 0 B = 1 class Bar(enum.Enum): FOO = Foo C = 2 m = self.machine_cls(states=Bar, initial=Bar.C) self.assertEqual(sorted(m.states['FOO'].states.keys()), ['A', 'B']) m.add_transition('go', 'FOO_A', 'C') m.add_transition('go', 'C', 'FOO_B') m.add_transition('foo', Bar.C, Bar.FOO) m.to_FOO_A() self.assertFalse(m.is_C()) self.assertTrue(m.is_FOO(allow_substates=True)) self.assertTrue(m.is_FOO_A()) self.assertTrue(m.is_FOO_A(allow_substates=True)) m.go() self.assertEqual(Bar.C, m.state) m.go() self.assertEqual(Foo.B, m.state) m.to_state(m, Bar.C.name) self.assertEqual(Bar.C, m.state) m.foo() self.assertEqual(Bar.FOO, m.state) def test_enum_model_conversion(self): class Inner(enum.Enum): I1 = 1 I2 = 2 I3 = 3 I4 = 0 class Middle(enum.Enum): M1 = 10 M2 = 20 M3 = 30 M4 = Inner class Outer(enum.Enum): O1 = 100 O2 = 200 O3 = 300 O4 = Middle m = self.machine_cls(states=Outer, initial=Outer.O1) def test_enum_initial(self): class Foo(enum.Enum): A = 0 B = 1 class Bar(enum.Enum): FOO = dict(children=Foo, initial=Foo.A) C = 2 m = self.machine_cls(states=Bar, initial=Bar.FOO) self.assertTrue(m.is_FOO_A()) def test_separator_naming_error(self): class UnderscoreEnum(enum.Enum): STATE_NAME = 0 # using _ in enum names in the default config should raise an error with self.assertRaises(ValueError): self.machine_cls(states=UnderscoreEnum) # changing the separator should make it work class DotNestedState(self.machine_cls.state_cls): # type: ignore separator = '.' # make custom machine use custom state with dot separator class DotMachine(self.machine_cls): # type: ignore state_cls = DotNestedState m = DotMachine(states=UnderscoreEnum) def test_get_nested_transitions(self): class Errors(enum.Enum): NONE = self.States UNKNOWN = 2 POWER = 3 m = self.machine_cls(states=Errors, initial=Errors.NONE.value.RED, auto_transitions=False) m.add_transition('error', Errors.NONE, Errors.UNKNOWN) m.add_transition('outage', [Errors.NONE, Errors.UNKNOWN], Errors.POWER) m.add_transition('reset', '*', self.States.RED) m.add_transition('toggle', self.States.RED, self.States.GREEN) m.add_transition('toggle', self.States.GREEN, self.States.YELLOW) m.add_transition('toggle', self.States.YELLOW, self.States.RED) self.assertEqual(5, len(m.get_transitions(dest=self.States.RED))) self.assertEqual(1, len(m.get_transitions(source=self.States.RED, dest=self.States.RED, delegate=True))) self.assertEqual(1, len(m.get_transitions(source=self.States.RED, dest=self.States.GREEN))) self.assertEqual(1, len(m.get_transitions(dest=self.States.GREEN))) self.assertEqual(3, len(m.get_transitions(trigger='toggle'))) def test_multiple_deeper(self): class X(enum.Enum): X1 = 1 X2 = 2 class B(enum.Enum): B1 = dict(parallel=X) B2 = 2 class A(enum.Enum): A1 = dict(parallel=B) A2 = 2 class Q(enum.Enum): Q1 = 1 Q2 = dict(parallel=A) class P(enum.Enum): P1 = 1 P2 = dict(parallel=Q) class States(enum.Enum): S1 = 1 S2 = dict(parallel=P) m = self.machine_cls(states=States, initial=States.S1) self.assertEqual(m.state, States.S1) m.to_S2() ref_state = [P.P1, [Q.Q1, [[[X.X1, X.X2], B.B2], A.A2]]] self.assertEqual(ref_state, m.state) @skipIf(enum is None or (pgv is None and gv is None), "enum and (py)graphviz are not available") class TestEnumWithGraph(TestEnumsAsStates): def setUp(self): super(TestEnumWithGraph, self).setUp() self.machine_cls = GraphMachine # type: Type[GraphMachine] def test_get_graph(self): m = self.machine_cls(states=self.States, initial=self.States.GREEN) roi = m.get_graph(show_roi=False) self.assertIsNotNone(roi) def test_get_graph_show_roi(self): m = self.machine_cls(states=self.States, initial=self.States.GREEN) roi = m.get_graph(show_roi=True) self.assertIsNotNone(roi) @skipIf(enum is None or (pgv is None and gv is None), "enum and (py)graphviz are not available") class TestNestedStateGraphEnums(TestNestedStateEnums): def setUp(self): super(TestNestedStateGraphEnums, self).setUp() self.machine_cls = HierarchicalGraphMachine def test_invalid_enum_path(self): class States(enum.Enum): ONE = 1 TWO = 2 THREE = 3 class Invalid(enum.Enum): INVALID = 1 with self.assertRaises(ValueError): self.machine_cls(states=States, transitions=[['go', '*', Invalid.INVALID]], initial=States.ONE) transitions-0.9.0/tests/test_reuse.py0000644000232200023220000004062314304350474020352 0ustar debalancedebalancetry: from builtins import object except ImportError: pass from transitions import MachineError from transitions.extensions import MachineFactory from transitions.extensions.nesting import NestedState, HierarchicalMachine from .utils import Stuff from .test_core import TYPE_CHECKING from unittest import TestCase try: from unittest.mock import MagicMock except ImportError: from mock import MagicMock # type: ignore if TYPE_CHECKING: from typing import List, Union, Dict, Any test_states = ['A', 'B', {'name': 'C', 'children': ['1', '2', {'name': '3', 'children': ['a', 'b', 'c']}]}, 'D', 'E', 'F'] class TestReuseSeparatorBase(TestCase): separator = '_' def setUp(self): class CustomState(NestedState): separator = self.separator class CustomMachine(HierarchicalMachine): state_cls = CustomState self.states = test_states self.machine_cls = CustomMachine self.state_cls = self.machine_cls.state_cls self.stuff = Stuff(self.states, self.machine_cls) def test_wrong_nesting(self): correct = ['A', {'name': 'B', 'children': self.stuff.machine}] wrong_type = ['A', {'name': 'B', 'children': self.stuff}] siblings = ['A', {'name': 'B', 'children': ['1', self.stuff.machine]}] collision = ['A', {'name': 'B', 'children': ['A', self.stuff.machine]}] m = self.machine_cls(states=correct) if m.state_cls.separator != '_': m.to_B.C.s3.a() else: m.to_B_C_3_a() with self.assertRaises(ValueError): m = self.machine_cls(states=wrong_type) with self.assertRaises(ValueError): m = self.machine_cls(states=collision) m = self.machine_cls(states=siblings) if m.state_cls.separator != '_': m.to_B.s1() m.to_B.A() else: m.to_B_1() m.to_B_A() class TestReuseSeparatorDot(TestReuseSeparatorBase): separator = '.' class TestReuse(TestCase): def setUp(self): self.states = test_states self.machine_cls = HierarchicalMachine self.state_cls = self.machine_cls.state_cls self.stuff = Stuff(self.states, self.machine_cls) def test_blueprint_reuse(self): State = self.state_cls states = ['1', '2', '3'] transitions = [ {'trigger': 'increase', 'source': '1', 'dest': '2'}, {'trigger': 'increase', 'source': '2', 'dest': '3'}, {'trigger': 'decrease', 'source': '3', 'dest': '2'}, {'trigger': 'decrease', 'source': '1', 'dest': '1'}, {'trigger': 'reset', 'source': '*', 'dest': '1'}, ] counter = self.machine_cls(states=states, transitions=transitions, before_state_change='check', after_state_change='clear', initial='1') new_states = ['A', 'B', {'name': 'C', 'children': counter}] new_transitions = [ {'trigger': 'forward', 'source': 'A', 'dest': 'B'}, {'trigger': 'forward', 'source': 'B', 'dest': 'C%s1' % State.separator}, {'trigger': 'backward', 'source': 'C', 'dest': 'B'}, {'trigger': 'backward', 'source': 'B', 'dest': 'A'}, {'trigger': 'calc', 'source': '*', 'dest': 'C'}, ] walker = self.machine_cls(states=new_states, transitions=new_transitions, before_state_change='watch', after_state_change='look_back', initial='A') walker.watch = lambda: 'walk' walker.look_back = lambda: 'look_back' walker.check = lambda: 'check' walker.clear = lambda: 'clear' with self.assertRaises(MachineError): walker.increase() self.assertEqual(walker.state, 'A') walker.forward() walker.forward() self.assertEqual(walker.state, 'C%s1' % State.separator) walker.increase() self.assertEqual(walker.state, 'C%s2' % State.separator) walker.reset() self.assertEqual(walker.state, 'C%s1' % State.separator) walker.to_A() self.assertEqual(walker.state, 'A') walker.calc() self.assertEqual(walker.state, 'C{0}1'.format(State.separator)) def test_blueprint_initial_false(self): child = self.machine_cls(states=['A', 'B'], initial='A') parent = self.machine_cls(states=['a', 'b', {'name': 'c', 'children': child, 'initial': False}]) parent.to_c() self.assertEqual(parent.state, 'c') def test_blueprint_remap(self): State = self.state_cls states = ['1', '2', '3', 'finished'] transitions = [ {'trigger': 'increase', 'source': '1', 'dest': '2'}, {'trigger': 'increase', 'source': '2', 'dest': '3'}, {'trigger': 'decrease', 'source': '3', 'dest': '2'}, {'trigger': 'decrease', 'source': '1', 'dest': '1'}, {'trigger': 'reset', 'source': '*', 'dest': '1'}, {'trigger': 'done', 'source': '3', 'dest': 'finished'} ] counter = self.machine_cls(states=states, transitions=transitions, initial='1') new_states = ['A', 'B', {'name': 'C', 'children': [counter, {'name': 'X', 'children': ['will', 'be', 'filtered', 'out']}], 'remap': {'finished': 'A', 'X': 'A'}}] \ # type: List[Union[str, Dict[str, Union[str, Dict, List]]]] new_transitions = [ {'trigger': 'forward', 'source': 'A', 'dest': 'B'}, {'trigger': 'forward', 'source': 'B', 'dest': 'C%s1' % State.separator}, {'trigger': 'backward', 'source': 'C', 'dest': 'B'}, {'trigger': 'backward', 'source': 'B', 'dest': 'A'}, {'trigger': 'calc', 'source': '*', 'dest': 'C%s1' % State.separator}, ] walker = self.machine_cls(states=new_states, transitions=new_transitions, before_state_change='watch', after_state_change='look_back', initial='A') walker.watch = lambda: 'walk' walker.look_back = lambda: 'look_back' counter.increase() counter.increase() counter.done() self.assertEqual(counter.state, 'finished') with self.assertRaises(MachineError): walker.increase() self.assertEqual(walker.state, 'A') walker.forward() walker.forward() self.assertEqual(walker.state, 'C%s1' % State.separator) walker.increase() self.assertEqual(walker.state, 'C%s2' % State.separator) walker.reset() self.assertEqual(walker.state, 'C%s1' % State.separator) walker.to_A() self.assertEqual(walker.state, 'A') walker.calc() self.assertEqual(walker.state, 'C%s1' % State.separator) walker.increase() walker.increase() walker.done() self.assertEqual(walker.state, 'A') self.assertFalse('C.finished' in walker.states) def test_example_reuse(self): State = self.state_cls count_states = ['1', '2', '3', 'done'] count_trans = [ ['increase', '1', '2'], ['increase', '2', '3'], ['decrease', '3', '2'], ['decrease', '2', '1'], {'trigger': 'done', 'source': '3', 'dest': 'done', 'conditions': 'this_passes'}, ] counter = self.machine_cls(states=count_states, transitions=count_trans, initial='1') counter.increase() # love my counter states = ['waiting', 'collecting', {'name': 'counting', 'children': counter}] states_remap = ['waiting', 'collecting', {'name': 'counting', 'children': counter, 'remap': {'done': 'waiting'}}] \ # type: List[Union[str, Dict[str, Union[str, HierarchicalMachine, Dict]]]] transitions = [ ['collect', '*', 'collecting'], ['wait', '*', 'waiting'], ['count', '*', 'counting%s1' % State.separator] ] collector = self.stuff.machine_cls(states=states, transitions=transitions, initial='waiting') collector.this_passes = self.stuff.this_passes collector.collect() # collecting collector.count() # let's see what we got collector.increase() # counting_2 collector.increase() # counting_3 collector.done() # counting_done self.assertEqual(collector.state, 'counting{0}done'.format(State.separator)) collector.wait() # go back to waiting self.assertEqual(collector.state, 'waiting') # reuse counter instance with remap collector = self.machine_cls(states=states_remap, transitions=transitions, initial='waiting') collector.this_passes = self.stuff.this_passes collector.collect() # collecting collector.count() # let's see what we got collector.increase() # counting_2 collector.increase() # counting_3 collector.done() # counting_done self.assertEqual(collector.state, 'waiting') # # same as above but with states and therefore stateless embedding states_remap[2]['children'] = count_states # type: ignore transitions.append(['increase', 'counting%s1' % State.separator, 'counting%s2' % State.separator]) transitions.append(['increase', 'counting%s2' % State.separator, 'counting%s3' % State.separator]) transitions.append(['done', 'counting%s3' % State.separator, 'waiting']) collector = self.machine_cls(states=states_remap, transitions=transitions, initial='waiting') collector.collect() # collecting collector.count() # let's see what we got collector.increase() # counting_2 collector.increase() # counting_3 collector.done() # counting_done self.assertEqual(collector.state, 'waiting') # check if counting_done was correctly omitted collector.add_transition('fail', '*', 'counting%sdone' % State.separator) with self.assertRaises(ValueError): collector.fail() def test_reuse_prepare(self): class Model: def __init__(self): self.prepared = False def preparation(self): self.prepared = True ms_model = Model() ms = self.machine_cls(ms_model, states=["C", "D"], transitions={"trigger": "go", "source": "*", "dest": "D", "prepare": "preparation"}, initial="C") ms_model.go() self.assertTrue(ms_model.prepared) m_model = Model() m = self.machine_cls(m_model, states=["A", "B", {"name": "NEST", "children": ms}]) m_model.to('NEST%sC' % self.state_cls.separator) m_model.go() self.assertTrue(m_model.prepared) def test_reuse_self_reference(self): separator = self.state_cls.separator class Nested(self.machine_cls): # type: ignore def __init__(self, parent): self.parent = parent self.mock = MagicMock() states = ['1', '2'] transitions = [{'trigger': 'finish', 'source': '*', 'dest': '2', 'after': self.print_msg}] super(Nested, self).__init__(states=states, transitions=transitions, initial='1') def print_msg(self): self.mock() self.parent.print_top() class Top(self.machine_cls): # type: ignore def print_msg(self): self.mock() def __init__(self): self.nested = Nested(self) self.mock = MagicMock() states = ['A', {'name': 'B', 'children': self.nested}] transitions = [dict(trigger='print_top', source='*', dest='=', after=self.print_msg), dict(trigger='to_nested', source='*', dest='B{0}1'.format(separator))] super(Top, self).__init__(states=states, transitions=transitions, initial='A') top_machine = Top() self.assertEqual(top_machine, top_machine.nested.parent) top_machine.to_nested() top_machine.finish() self.assertTrue(top_machine.mock.called) self.assertTrue(top_machine.nested.mock.called) self.assertIs(top_machine.nested.get_state('2').on_enter, top_machine.get_state('B{0}2'.format(separator)).on_enter) def test_reuse_machine_config(self): simple_config = { "name": "Child", "states": ["1", "2"], "transitions": [['go', '1', '2']], "initial": "1" } # type: Dict[str, Any] simple_cls = MachineFactory.get_predefined() simple = simple_cls(**simple_config) self.assertTrue(simple.is_1()) self.assertTrue(simple.go()) self.assertTrue(simple.is_2()) machine = self.machine_cls(states=['A', simple_config], initial='A') machine.to_Child() machine.go() self.assertTrue(machine.is_Child_2()) def test_reuse_wrong_class(self): m1 = MachineFactory.get_predefined()(states=['A', 'B'], initial='A') with self.assertRaises(ValueError): m2 = MachineFactory.get_predefined(nested=True)(states=['X', {'name': 'Y', 'states': m1}], initial='Y') def test_reuse_remap(self): class GenericMachine(self.machine_cls): # type: ignore def __init__(self, states, transitions, model=None): generic_states = [ {"name": "initial", "on_enter": self.entry_initial}, {"name": "done", "on_enter": self.entry_done}, ] states += generic_states super(GenericMachine, self).__init__( states=states, transitions=transitions, model=model, send_event=True, queued=True, auto_transitions=False ) def entry_initial(self, event_data): raise NotImplementedError def entry_done(self, event_data): raise NotImplementedError class DeeperMachine(GenericMachine): def __init__(self): states = [ {"name": "working", "on_enter": self.entry_working}, ] transitions = [ ["go", "initial", "working"], ["go", "working", "done"], ] super(DeeperMachine, self).__init__(states, transitions, model=self) def entry_initial(self, event_data): event_data.model.go() def entry_working(self, event_data): event_data.model.go() class NestedMachine(GenericMachine): def __init__(self): states = [ {"name": "deeper", "children": DeeperMachine(), "remap": {"done": "done"}}, ] transitions = [ ["go", "initial", "deeper"], ] super(NestedMachine, self).__init__(states, transitions) def entry_initial(self, event_data): event_data.model.go() class MainMachine(GenericMachine): def __init__(self): states = [ {"name": "nested", "children": NestedMachine(), "remap": {"done": "done"}}, ] transitions = [ ["go", "initial", "nested"], ] super(MainMachine, self).__init__(states, transitions, model=self) def entry_done(self, event_data): print("job finished") machine = MainMachine() machine.go() assert machine.is_done() def test_reuse_callback_copy(self): selfs = [] class Model(object): def check_self(self): selfs.append(self) return True m = Model() transitions = [ {"trigger": "go", "source": "A", "dest": "B", "conditions": m.check_self, "prepare": m.check_self, "before": m.check_self, "after": m.check_self} ] child = self.machine_cls(None, states=["A", "B"], transitions=transitions, initial="A") parent = self.machine_cls(m, states=[{"name": "P", "states": child, "remap": {}}], initial="P") m.go() self.assertEqual("P_B", m.state) # selfs should only contain references to the same model. If the set is larger than one this means # that at some poin the model was falsely copied. self.assertEqual(1, len(set(selfs))) transitions-0.9.0/tests/test_add_remove.py0000644000232200023220000000520114304350474021325 0ustar debalancedebalancetry: from builtins import object except ImportError: pass from transitions import Machine from unittest import TestCase import gc import weakref import threading class Dummy(object): pass class TestTransitionsAddRemove(TestCase): def test_garbage_collection(self): states = ['A', 'B', 'C', 'D', 'E', 'F'] machine = Machine(model=[], states=states, initial='A', name='Test Machine') machine.add_transition('advance', 'A', 'B') machine.add_transition('advance', 'B', 'C') machine.add_transition('advance', 'C', 'D') s1 = Dummy() s2 = Dummy() s2_collected = threading.Event() s2_proxy = weakref.proxy(s2, lambda _: s2_collected.set()) machine.add_model([s1, s2]) self.assertTrue(s1.is_A()) self.assertTrue(s2.is_A()) s1.advance() self.assertTrue(s1.is_B()) self.assertTrue(s2.is_A()) self.assertFalse(s2_collected.is_set()) machine.remove_model(s2) del s2 gc.collect() self.assertTrue(s2_collected.is_set()) s3 = Dummy() machine.add_model(s3) s3.advance() s3.advance() self.assertTrue(s3.is_C()) def test_add_model_initial_state(self): states = ['A', 'B', 'C', 'D', 'E', 'F'] machine = Machine(model=[], states=states, initial='A', name='Test Machine') machine.add_transition('advance', 'A', 'B') machine.add_transition('advance', 'B', 'C') machine.add_transition('advance', 'C', 'D') s1 = Dummy() s2 = Dummy() s3 = Dummy() machine.add_model(s1) machine.add_model(s2, initial='B') machine.add_model(s3, initial='C') s1.advance() s2.advance() s3.advance() self.assertTrue(s1.is_B()) self.assertTrue(s2.is_C()) self.assertTrue(s3.is_D()) def test_add_model_no_initial_state(self): states = ['A', 'B', 'C', 'D', 'E', 'F'] machine = Machine(model=[], states=states, name='Test Machine', initial=None) machine.add_transition('advance', 'A', 'B') machine.add_transition('advance', 'B', 'C') machine.add_transition('advance', 'C', 'D') s1 = Dummy() s2 = Dummy() s3 = Dummy() with self.assertRaises(ValueError): machine.add_model(s1) machine.add_model(s1, initial='A') machine.add_model(s2, initial='B') machine.add_model(s3, initial='C') s1.advance() s2.advance() s3.advance() self.assertTrue(s1.is_B()) self.assertTrue(s2.is_C()) self.assertTrue(s3.is_D()) transitions-0.9.0/tox.ini0000644000232200023220000000123314304350474015761 0ustar debalancedebalance[tox] envlist = mypy, py27, py37, py38, py39, py310, nogv, check-manifest skip_missing_interpreters = True [testenv] deps = -rrequirements.txt -rrequirements_diagrams.txt -rrequirements_test.txt commands = pytest -nauto --doctest-modules [testenv:mypy] basepython = python3.10 deps = -rrequirements.txt -rrequirements_diagrams.txt -rrequirements_mypy.txt commands = mypy transitions [testenv:check-manifest] deps = check-manifest commands = check-manifest [testenv:nogv] deps = -rrequirements.txt pytest pytest-cov pytest-xdist mock dill pycodestyle commands = pytest -nauto --doctest-modules