From b717282f1e5d3ea577013b77cbb4cf855004a1aa Mon Sep 17 00:00:00 2001 From: Rick Berger Date: Thu, 9 Nov 2017 12:12:29 -0700 Subject: [PATCH 01/12] Added statedefs. --- dist/state-machine.js | 33 +++++++++++++++++++++++++++++---- dist/state-machine.min.js | 2 +- examples/demo/demo.js | 6 +++++- examples/matter.js | 5 +++++ lib/state-machine.js | 33 +++++++++++++++++++++++++++++---- src/config.js | 33 +++++++++++++++++++++++++++++---- 6 files changed, 98 insertions(+), 14 deletions(-) diff --git a/dist/state-machine.js b/dist/state-machine.js index b8b9e37..eb08e7d 100644 --- a/dist/state-machine.js +++ b/dist/state-machine.js @@ -210,9 +210,15 @@ function Config(options, StateMachine) { this.init = this.configureInitTransition(options.init); this.data = this.configureData(options.data); this.methods = this.configureMethods(options.methods); + this.hasStateDefs = false; this.map[this.defaults.wildcard] = {}; + if (options['statedefs']) { + this.hasStateDefs = true; + this.configureStateDefs(options['statedefs']); + } + this.configureTransitions(options.transitions || []); this.plugins = this.configurePlugins(options.plugins, StateMachine.plugin); @@ -311,16 +317,35 @@ mixin(Config.prototype, { return plugins }, + configureStateDefs: function(statedefs) { + var n; + for (n = 0; n < statedefs.length; n++) { + this.addState(statedefs[n].name); + } + }, + configureTransitions: function(transitions) { - var i, n, transition, from, to, wildcard = this.defaults.wildcard; + var i, n, transition, fromStates, from, to, wildcard = this.defaults.wildcard; + var undefinedStates = []; for(n = 0 ; n < transitions.length ; n++) { transition = transitions[n]; - from = Array.isArray(transition.from) ? transition.from : [transition.from || wildcard] + fromStates = Array.isArray(transition.from) ? transition.from : [transition.from || wildcard] to = transition.to || wildcard; - for(i = 0 ; i < from.length ; i++) { - this.mapTransition({ name: transition.name, from: from[i], to: to }); + if (this.hasStateDefs && to !== wildcard && this.states.indexOf(to) === -1) { + undefinedStates.push(to); + } + for(i = 0 ; i < fromStates.length ; i++) { + from = fromStates[i]; + if (this.hasStateDefs && from !== wildcard && from !== 'none' && + this.states.indexOf(from) === -1) { + undefinedStates.push(from); + } + this.mapTransition({ name: transition.name, from: from, to: to }); } } + if (undefinedStates.length > 0) { + throw 'Undefined states in transitions: "' + undefinedStates.join(', ') + '"'; + } }, transitionFor: function(state, transition) { diff --git a/dist/state-machine.min.js b/dist/state-machine.min.js index b9439bc..1895a43 100644 --- a/dist/state-machine.min.js +++ b/dist/state-machine.min.js @@ -1 +1 @@ -!function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define("StateMachine",[],n):"object"==typeof exports?exports.StateMachine=n():t.StateMachine=n()}(this,function(){return function(t){function n(e){if(i[e])return i[e].exports;var s=i[e]={i:e,l:!1,exports:{}};return t[e].call(s.exports,s,s.exports,n),s.l=!0,s.exports}var i={};return n.m=t,n.c=i,n.i=function(t){return t},n.d=function(t,i,e){n.o(t,i)||Object.defineProperty(t,i,{configurable:!1,enumerable:!0,get:e})},n.n=function(t){var i=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(i,"a",i),i},n.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},n.p="",n(n.s=5)}([function(t,n,i){"use strict";t.exports=function(t,n){var i,e,s;for(i=1;i=0:this.state===t},isPending:function(){return this.pending},can:function(t){return!this.isPending()&&!!this.seek(t)},cannot:function(t){return!this.can(t)},allStates:function(){return this.config.allStates()},allTransitions:function(){return this.config.allTransitions()},transitions:function(){return this.config.transitionsFor(this.state)},seek:function(t,n){var i=this.config.defaults.wildcard,e=this.config.transitionFor(this.state,t),s=e&&e.to;return"function"==typeof s?s.apply(this.context,n):s===i?this.state:s},fire:function(t,n){return this.transit(t,this.state,this.seek(t,n),n)},transit:function(t,n,i,e){var s=this.config.lifecycle,r=this.config.options.observeUnchangedState||n!==i;return i?this.isPending()?this.context.onPendingTransition(t,n,i):(this.config.addState(i),this.beginTransit(),e.unshift({transition:t,from:n,to:i,fsm:this.context}),this.observeEvents([this.observersForEvent(s.onBefore.transition),this.observersForEvent(s.onBefore[t]),r?this.observersForEvent(s.onLeave.state):a,r?this.observersForEvent(s.onLeave[n]):a,this.observersForEvent(s.on.transition),r?["doTransit",[this]]:a,r?this.observersForEvent(s.onEnter.state):a,r?this.observersForEvent(s.onEnter[i]):a,r?this.observersForEvent(s.on[i]):a,this.observersForEvent(s.onAfter.transition),this.observersForEvent(s.onAfter[t]),this.observersForEvent(s.on[t])],e)):this.context.onInvalidTransition(t,n,i)},beginTransit:function(){this.pending=!0},endTransit:function(t){return this.pending=!1,t},failTransit:function(t){throw this.pending=!1,t},doTransit:function(t){this.state=t.to},observe:function(t){if(2===t.length){var n={};n[t[0]]=t[1],this.observers.push(n)}else this.observers.push(t[0])},observersForEvent:function(t){for(var n,i=0,e=this.observers.length,s=[];i0)throw'Undefined states in transitions: "'+f.join(", ")+'"'},transitionFor:function(t,n){var i=this.defaults.wildcard;return this.map[t][n]||this.map[i][n]},transitionsFor:function(t){var n=this.defaults.wildcard;return Object.keys(this.map[t]).concat(Object.keys(this.map[n]))},allStates:function(){return this.states},allTransitions:function(){return this.transitions}}),t.exports=e},function(t,n,i){function e(t,n){this.context=t,this.config=n,this.state=n.init.from,this.observers=[t]}var s=i(0),r=i(6),o=i(1),a=[null,[]];s(e.prototype,{init:function(t){if(s(this.context,this.config.data.apply(this.context,t)),o.hook(this,"init"),this.config.init.active)return this.fire(this.config.init.name,[])},is:function(t){return Array.isArray(t)?t.indexOf(this.state)>=0:this.state===t},isPending:function(){return this.pending},can:function(t){return!this.isPending()&&!!this.seek(t)},cannot:function(t){return!this.can(t)},allStates:function(){return this.config.allStates()},allTransitions:function(){return this.config.allTransitions()},transitions:function(){return this.config.transitionsFor(this.state)},seek:function(t,n){var i=this.config.defaults.wildcard,e=this.config.transitionFor(this.state,t),s=e&&e.to;return"function"==typeof s?s.apply(this.context,n):s===i?this.state:s},fire:function(t,n){return this.transit(t,this.state,this.seek(t,n),n)},transit:function(t,n,i,e){var s=this.config.lifecycle,r=this.config.options.observeUnchangedState||n!==i;return i?this.isPending()?this.context.onPendingTransition(t,n,i):(this.config.addState(i),this.beginTransit(),e.unshift({transition:t,from:n,to:i,fsm:this.context}),this.observeEvents([this.observersForEvent(s.onBefore.transition),this.observersForEvent(s.onBefore[t]),r?this.observersForEvent(s.onLeave.state):a,r?this.observersForEvent(s.onLeave[n]):a,this.observersForEvent(s.on.transition),r?["doTransit",[this]]:a,r?this.observersForEvent(s.onEnter.state):a,r?this.observersForEvent(s.onEnter[i]):a,r?this.observersForEvent(s.on[i]):a,this.observersForEvent(s.onAfter.transition),this.observersForEvent(s.onAfter[t]),this.observersForEvent(s.on[t])],e)):this.context.onInvalidTransition(t,n,i)},beginTransit:function(){this.pending=!0},endTransit:function(t){return this.pending=!1,t},failTransit:function(t){throw this.pending=!1,t},doTransit:function(t){this.state=t.to},observe:function(t){if(2===t.length){var n={};n[t[0]]=t[1],this.observers.push(n)}else this.observers.push(t[0])},observersForEvent:function(t){for(var n,i=0,e=this.observers.length,s=[];i 0) { + throw 'Undefined states in transitions: "' + undefinedStates.join(', ') + '"'; + } }, transitionFor: function(state, transition) { diff --git a/src/config.js b/src/config.js index 21601df..0e22b96 100644 --- a/src/config.js +++ b/src/config.js @@ -20,9 +20,15 @@ function Config(options, StateMachine) { this.init = this.configureInitTransition(options.init); this.data = this.configureData(options.data); this.methods = this.configureMethods(options.methods); + this.hasStateDefs = false; this.map[this.defaults.wildcard] = {}; + if (options['statedefs']) { + this.hasStateDefs = true; + this.configureStateDefs(options['statedefs']); + } + this.configureTransitions(options.transitions || []); this.plugins = this.configurePlugins(options.plugins, StateMachine.plugin); @@ -121,16 +127,35 @@ mixin(Config.prototype, { return plugins }, + configureStateDefs: function(statedefs) { + var n; + for (n = 0; n < statedefs.length; n++) { + this.addState(statedefs[n].name); + } + }, + configureTransitions: function(transitions) { - var i, n, transition, from, to, wildcard = this.defaults.wildcard; + var i, n, transition, fromStates, from, to, wildcard = this.defaults.wildcard; + var undefinedStates = []; for(n = 0 ; n < transitions.length ; n++) { transition = transitions[n]; - from = Array.isArray(transition.from) ? transition.from : [transition.from || wildcard] + fromStates = Array.isArray(transition.from) ? transition.from : [transition.from || wildcard] to = transition.to || wildcard; - for(i = 0 ; i < from.length ; i++) { - this.mapTransition({ name: transition.name, from: from[i], to: to }); + if (this.hasStateDefs && to !== wildcard && this.states.indexOf(to) === -1) { + undefinedStates.push(to); + } + for(i = 0 ; i < fromStates.length ; i++) { + from = fromStates[i]; + if (this.hasStateDefs && from !== wildcard && from !== 'none' && + this.states.indexOf(from) === -1) { + undefinedStates.push(from); + } + this.mapTransition({ name: transition.name, from: from, to: to }); } } + if (undefinedStates.length > 0) { + throw 'Undefined states in transitions: "' + undefinedStates.join(', ') + '"'; + } }, transitionFor: function(state, transition) { From 46d96dbad59b1bd92f484e02a39221739bad8e67 Mon Sep 17 00:00:00 2001 From: Rick Berger Date: Fri, 10 Nov 2017 14:16:19 -0700 Subject: [PATCH 02/12] graph outputs state node attributes. --- bin/examples | 36 ++++++++--- examples/traffic_light_statedefs.dot | 12 ++++ examples/traffic_light_statedefs.js | 25 ++++++++ examples/traffic_light_statedefs.png | Bin 0 -> 26279 bytes examples/traffic_light_statedefs.svg | 86 +++++++++++++++++++++++++++ src/plugin/visualize.js | 36 ++++++++++- 6 files changed, 185 insertions(+), 10 deletions(-) create mode 100644 examples/traffic_light_statedefs.dot create mode 100644 examples/traffic_light_statedefs.js create mode 100644 examples/traffic_light_statedefs.png create mode 100644 examples/traffic_light_statedefs.svg diff --git a/bin/examples b/bin/examples index e726661..c5b464f 100755 --- a/bin/examples +++ b/bin/examples @@ -4,6 +4,14 @@ // // This script is used to regenerate the example visualizations // +// It will scan all the .js files in the 'examples' folder and generate a +// * .dot - file with dot directives for graphviz +// * .svg - svg graphics representation +// * .png - png graphics representation +// +// If provided with an argument, it will only generate output for the specified +// argument. +// //================================================================================================= var fs = require('fs'), @@ -12,9 +20,23 @@ var fs = require('fs'), //------------------------------------------------------------------------------------------------- -fs.readdirSync('examples') - .filter(function(file) { return path.extname(file) === ".js" }) - .map(visualize); +if (process.argv.length > 2) { + var fn = process.argv[2]; + process.chdir(path.dirname(process.argv[1])); + if (!fs.existsSync('../examples/' + fn)) { + console.log('File: ' + fn + ' does not exist'); + } + + else { + visualize(process.argv[2]); + } +} + +else { + fs.readdirSync('examples') + .filter(function(file) { return path.extname(file) === ".js" }) + .map(visualize); +} //------------------------------------------------------------------------------------------------- @@ -24,10 +46,10 @@ function visualize(example) { dot = fsm.visualize(), svg = dot2svg(dot), png = dot2png(dot); - console.log('visualizing examples/' + example); - fs.writeFileSync('examples/' + name + '.dot', dot); - fs.writeFileSync('examples/' + name + '.svg', svg); - fs.writeFileSync('examples/' + name + '.png', png, 'binary'); + console.log('visualizing ../examples/' + example); + fs.writeFileSync('../examples/' + name + '.dot', dot); + fs.writeFileSync('../examples/' + name + '.svg', svg); + fs.writeFileSync('../examples/' + name + '.png', png, 'binary'); } //------------------------------------------------------------------------------------------------- diff --git a/examples/traffic_light_statedefs.dot b/examples/traffic_light_statedefs.dot new file mode 100644 index 0000000..f33c60a --- /dev/null +++ b/examples/traffic_light_statedefs.dot @@ -0,0 +1,12 @@ +digraph "Traffic_Light" { + "green" [ fillcolor="green", style="filled" ]; + "yellow" [ fillcolor="yellow", shape="rect", style="filled" ]; + "red" [ fillcolor="red", style="filled" ]; + "none" -> "green" [ color="blue" ; label=" start " ]; + "green" -> "yellow" [ color="blue" ; label=" warn " ]; + "green" -> "red" [ color="red" ; label=" panic " ]; + "yellow" -> "red" [ color="red" ; label=" panic " ]; + "red" -> "yellow" [ color="blue" ; label=" calm " ]; + "red" -> "green" [ color="green" ; label=" clear " ]; + "yellow" -> "green" [ color="green" ; label=" clear " ]; +} \ No newline at end of file diff --git a/examples/traffic_light_statedefs.js b/examples/traffic_light_statedefs.js new file mode 100644 index 0000000..d89fb72 --- /dev/null +++ b/examples/traffic_light_statedefs.js @@ -0,0 +1,25 @@ +var StateMachine = require('../src/app'), + visualize = require('../src/plugin/visualize'); + +var fsm = new StateMachine({ + statedefs: [ + {name: 'green', dot: {style: "filled", fillcolor: "green"}}, + {name: 'yellow', dot: {shape: "rect", style: "filled", fillcolor: "yellow"}}, + {name: 'red', dot: {style: "filled", fillcolor: "red"}} + ], + transitions: [ + { name: 'start', from: 'none', to: 'green', dot: {color:'blue'}}, + { name: 'warn', from: 'green', to: 'yellow', dot: {color:'blue'}}, + { name: 'panic', from: 'green', to: 'red', dot: {color:'red'} }, + { name: 'panic', from: 'yellow', to: 'red', dot: {color:'red'} }, + { name: 'calm', from: 'red', to: 'yellow', dot: {color:'blue'} }, + { name: 'clear', from: 'red', to: 'green', dot: {color:'green'} }, + { name: 'clear', from: 'yellow', to: 'green', dot: {color:'green'} }, + ] +}); + +fsm.visualize = function() { + return visualize(fsm, { name: 'Traffic_Light' }); +} + +module.exports = fsm; diff --git a/examples/traffic_light_statedefs.png b/examples/traffic_light_statedefs.png new file mode 100644 index 0000000000000000000000000000000000000000..315acff8bc0f9ca65023efed06885eef175e3850 GIT binary patch literal 26279 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 literal 0 HcmV?d00001 diff --git a/examples/traffic_light_statedefs.svg b/examples/traffic_light_statedefs.svg new file mode 100644 index 0000000..97fc1e7 --- /dev/null +++ b/examples/traffic_light_statedefs.svg @@ -0,0 +1,86 @@ + + + + + + +Traffic_Light + + + +green + +green + + + +yellow + +yellow + + + +green->yellow + + + warn + + + +red + +red + + + +green->red + + + panic + + + +yellow->green + + + clear + + + +yellow->red + + + panic + + + +red->green + + + clear + + + +red->yellow + + + calm + + + +none + +none + + + +none->green + + + start + + + diff --git a/src/plugin/visualize.js b/src/plugin/visualize.js index 0bee32b..354a57d 100644 --- a/src/plugin/visualize.js +++ b/src/plugin/visualize.js @@ -20,6 +20,7 @@ function dotcfg(fsm, options) { name = options.name, rankdir = dotcfg.rankdir(options.orientation), states = dotcfg.states(config, options), + statedefs = dotcfg.statedefs(config, options), transitions = dotcfg.transitions(config, options), result = { } @@ -32,6 +33,9 @@ function dotcfg(fsm, options) { if (states && states.length > 0) result.states = states + if (statedefs && statedefs.length > 0) + result.statedefs = statedefs; + if (transitions && transitions.length > 0) result.transitions = transitions @@ -61,6 +65,11 @@ dotcfg.states = function(config, options) { return states; } +dotcfg.statedefs = function(config, options) { + return config.options['statedefs']; + // can be null +} + dotcfg.transitions = function(config, options) { var n, max, transition, init = config.init, @@ -95,7 +104,6 @@ dotcfg.transition = function(name, from, to, dot, config, options, output) { else { output.push(mixin({}, { from: from, to: to, label: pad(name) }, dot || {})) } - } //------------------------------------------------------------------------------------------------- @@ -115,6 +123,7 @@ function dotify(dotcfg) { var name = dotcfg.name || 'fsm', states = dotcfg.states || [], transitions = dotcfg.transitions || [], + statedefs = dotcfg.statedefs, rankdir = dotcfg.rankdir, output = [], n, max; @@ -122,8 +131,16 @@ function dotify(dotcfg) { output.push("digraph " + quote(name) + " {") if (rankdir) output.push(" rankdir=" + rankdir + ";") - for(n = 0, max = states.length ; n < max ; n++) - output.push(dotify.state(states[n])) + + if (statedefs) { + for(n = 0, max = statedefs.length ; n < max ; n++) + output.push(dotify.statedef(statedefs[n])) + } + else { + for(n = 0, max = states.length ; n < max ; n++) + output.push(dotify.state(states[n])) + } + for(n = 0, max = transitions.length ; n < max ; n++) output.push(dotify.edge(transitions[n])) output.push("}") @@ -135,6 +152,10 @@ dotify.state = function(state) { return " " + quote(state) + ";" } +dotify.statedef = function(statedef) { + return " " + quote(statedef.name) + dotify.state.attr(statedef.dot) + ";" +} + dotify.edge = function(edge) { return " " + quote(edge.from) + " -> " + quote(edge.to) + dotify.edge.attr(edge) + ";" } @@ -149,6 +170,15 @@ dotify.edge.attr = function(edge) { return output.length > 0 ? " [ " + output.join(" ; ") + " ]" : "" } +dotify.state.attr = function(statedef_dot) { + var n, max, key, keys = Object.keys(statedef_dot).sort(), output = []; + for(n = 0, max = keys.length ; n < max ; n++) { + key = keys[n]; + output.push(key + "=" + quote(statedef_dot[key])) + } + return output.length > 0 ? " [ " + output.join(", ") + " ]" : "" +} + //------------------------------------------------------------------------------------------------- visualize.dotcfg = dotcfg; From a95faee92c0554fcbc01a472912928a4e1ae5dfb Mon Sep 17 00:00:00 2001 From: Rick Berger Date: Fri, 10 Nov 2017 16:27:03 -0700 Subject: [PATCH 03/12] Add dotPrefix for general graphviz styling --- examples/traffic_light_statedefs.dot | 3 ++ examples/traffic_light_statedefs.png | Bin 26279 -> 23919 bytes examples/traffic_light_statedefs.svg | 66 +++++++++++++-------------- 3 files changed, 36 insertions(+), 33 deletions(-) diff --git a/examples/traffic_light_statedefs.dot b/examples/traffic_light_statedefs.dot index f33c60a..9c98a39 100644 --- a/examples/traffic_light_statedefs.dot +++ b/examples/traffic_light_statedefs.dot @@ -1,4 +1,7 @@ digraph "Traffic_Light" { + graph [ fontcolor="dimgray", fontname="Helvetica" ]; + node [ color="dimgray", fontcolor="dimgray", fontname="Helvetica", fontsize="13" ]; + edge [ fontcolor="dimgray", fontname="Arial", fontsize="10" ]; "green" [ fillcolor="green", style="filled" ]; "yellow" [ fillcolor="yellow", shape="rect", style="filled" ]; "red" [ fillcolor="red", style="filled" ]; diff --git a/examples/traffic_light_statedefs.png b/examples/traffic_light_statedefs.png index 315acff8bc0f9ca65023efed06885eef175e3850..c8c181bed14f4b0097032b49569120be965261a8 100644 GIT binary patch literal 23919 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 Js!*_w_#ZFpb}|3} literal 26279 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 diff --git a/examples/traffic_light_statedefs.svg b/examples/traffic_light_statedefs.svg index 97fc1e7..1de51d2 100644 --- a/examples/traffic_light_statedefs.svg +++ b/examples/traffic_light_statedefs.svg @@ -4,83 +4,83 @@ - - + + Traffic_Light - + green - -green + +green yellow - -yellow + +yellow green->yellow - - - warn + + + warn red - -red + +red green->red - - - panic + + + panic yellow->green - - - clear + + + clear yellow->red - - - panic + + + panic red->green - - - clear + + + clear red->yellow - - - calm + + + calm none - -none + +none none->green - - - start + + + start From a8b72876203a3d937bae57686541c5cbf501d4e3 Mon Sep 17 00:00:00 2001 From: Rick Berger Date: Fri, 10 Nov 2017 16:34:54 -0700 Subject: [PATCH 04/12] Added dotPrefix for overall graphviz styling --- examples/traffic_light_statedefs.dot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/traffic_light_statedefs.dot b/examples/traffic_light_statedefs.dot index 9c98a39..7b34274 100644 --- a/examples/traffic_light_statedefs.dot +++ b/examples/traffic_light_statedefs.dot @@ -1,5 +1,5 @@ digraph "Traffic_Light" { - graph [ fontcolor="dimgray", fontname="Helvetica" ]; + graph [ fontcolor="dimgray", fontname="Helvetica", splines="spline" ]; node [ color="dimgray", fontcolor="dimgray", fontname="Helvetica", fontsize="13" ]; edge [ fontcolor="dimgray", fontname="Arial", fontsize="10" ]; "green" [ fillcolor="green", style="filled" ]; From a2d98e3c278181840431f48eb294b40db0c19817 Mon Sep 17 00:00:00 2001 From: Rick Berger Date: Fri, 10 Nov 2017 16:36:12 -0700 Subject: [PATCH 05/12] visualization changes --- dist/state-machine-visualize.js | 57 +++++++++++++++++++++++++++-- dist/state-machine-visualize.min.js | 2 +- dist/state-machine.js | 6 +++ dist/state-machine.min.js | 2 +- lib/state-machine.js | 6 +++ lib/visualize.js | 57 +++++++++++++++++++++++++++-- src/app.js | 5 +++ src/config.js | 1 + src/plugin/visualize.js | 29 +++++++++++++-- 9 files changed, 151 insertions(+), 14 deletions(-) diff --git a/dist/state-machine-visualize.js b/dist/state-machine-visualize.js index 9c18e13..07c67b1 100644 --- a/dist/state-machine-visualize.js +++ b/dist/state-machine-visualize.js @@ -123,7 +123,9 @@ function dotcfg(fsm, options) { name = options.name, rankdir = dotcfg.rankdir(options.orientation), states = dotcfg.states(config, options), + statedefs = dotcfg.statedefs(config, options), transitions = dotcfg.transitions(config, options), + dotPrefix = dotcfg.dotPrefix, result = { } if (name) @@ -135,9 +137,15 @@ function dotcfg(fsm, options) { if (states && states.length > 0) result.states = states + if (statedefs && statedefs.length > 0) + result.statedefs = statedefs; + if (transitions && transitions.length > 0) result.transitions = transitions + if (dotPrefix) + result.dotPrefix = dotPrefix; + return result } @@ -164,6 +172,11 @@ dotcfg.states = function(config, options) { return states; } +dotcfg.statedefs = function(config, options) { + return config.options['statedefs']; + // can be null +} + dotcfg.transitions = function(config, options) { var n, max, transition, init = config.init, @@ -198,7 +211,6 @@ dotcfg.transition = function(name, from, to, dot, config, options, output) { else { output.push(mixin({}, { from: from, to: to, label: pad(name) }, dot || {})) } - } //------------------------------------------------------------------------------------------------- @@ -218,6 +230,8 @@ function dotify(dotcfg) { var name = dotcfg.name || 'fsm', states = dotcfg.states || [], transitions = dotcfg.transitions || [], + statedefs = dotcfg.statedefs, + dotPrefix = dotcfg.dotPrefix, rankdir = dotcfg.rankdir, output = [], n, max; @@ -225,8 +239,20 @@ function dotify(dotcfg) { output.push("digraph " + quote(name) + " {") if (rankdir) output.push(" rankdir=" + rankdir + ";") - for(n = 0, max = states.length ; n < max ; n++) - output.push(dotify.state(states[n])) + + if (dotPrefix) { + output.push(dotify.dotPrefix(dotPrefix)); + } + + if (statedefs) { + for(n = 0, max = statedefs.length ; n < max ; n++) + output.push(dotify.statedef(statedefs[n])) + } + else { + for(n = 0, max = states.length ; n < max ; n++) + output.push(dotify.gen(states[n])) + } + for(n = 0, max = transitions.length ; n < max ; n++) output.push(dotify.edge(transitions[n])) output.push("}") @@ -234,14 +260,28 @@ function dotify(dotcfg) { } -dotify.state = function(state) { +dotify.gen = function(state) { return " " + quote(state) + ";" } +dotify.statedef = function(statedef) { + return " " + quote(statedef.name) + dotify.gen.attr(statedef.dot) + ";" +} + dotify.edge = function(edge) { return " " + quote(edge.from) + " -> " + quote(edge.to) + dotify.edge.attr(edge) + ";" } +dotify.docPrefix = function(dotPrefix) { + prefixStr = ''; + var ix; + var keys = Object.keys(dotPrefix); + for (ix = 0; ix < keys.length; ix++) { + var key = keys[ix]; + prefixStr += ' ' + quote(key) + ' ' + dotify.gen.attr(dotprefix[key]) + "\n"; + } +} + dotify.edge.attr = function(edge) { var n, max, key, keys = Object.keys(edge).sort(), output = []; for(n = 0, max = keys.length ; n < max ; n++) { @@ -252,6 +292,15 @@ dotify.edge.attr = function(edge) { return output.length > 0 ? " [ " + output.join(" ; ") + " ]" : "" } +dotify.gen.attr = function(statedef_dot) { + var n, max, key, keys = Object.keys(statedef_dot).sort(), output = []; + for(n = 0, max = keys.length ; n < max ; n++) { + key = keys[n]; + output.push(key + "=" + quote(statedef_dot[key])) + } + return output.length > 0 ? " [ " + output.join(", ") + " ]" : "" +} + //------------------------------------------------------------------------------------------------- visualize.dotcfg = dotcfg; diff --git a/dist/state-machine-visualize.min.js b/dist/state-machine-visualize.min.js index e517d3b..435b671 100644 --- a/dist/state-machine-visualize.min.js +++ b/dist/state-machine-visualize.min.js @@ -1 +1 @@ -!function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define("StateMachineVisualize",[],n):"object"==typeof exports?exports.StateMachineVisualize=n():t.StateMachineVisualize=n()}(this,function(){return function(t){function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var e={};return n.m=t,n.c=e,n.i=function(t){return t},n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:r})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},n.p="",n(n.s=1)}([function(t,n,e){"use strict";t.exports=function(t,n){var e,r,o;for(e=1;e0&&(u.states=s),a&&a.length>0&&(u.transitions=a),u}function i(t){return" "+t+" "}function s(t){return'"'+t+'"'}function a(t){t=t||{};var n,e,r=t.name||"fsm",o=t.states||[],i=t.transitions||[],u=t.rankdir,f=[];for(f.push("digraph "+s(r)+" {"),u&&f.push(" rankdir="+u+";"),n=0,e=o.length;n "+s(t.to)+a.edge.attr(t)+";"},a.edge.attr=function(t){var n,e,r,o=Object.keys(t).sort(),i=[];for(n=0,e=o.length;n0?" [ "+i.join(" ; ")+" ]":""},r.dotcfg=o,r.dotify=a,t.exports=r}])}); \ No newline at end of file +!function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define("StateMachineVisualize",[],n):"object"==typeof exports?exports.StateMachineVisualize=n():t.StateMachineVisualize=n()}(this,function(){return function(t){function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var e={};return n.m=t,n.c=e,n.i=function(t){return t},n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:r})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},n.p="",n(n.s=1)}([function(t,n,e){"use strict";t.exports=function(t,n){var e,r,o;for(e=1;e0&&(c.states=s),f&&f.length>0&&(c.statedefs=f),a&&a.length>0&&(c.transitions=a),u&&(c.dotPrefix=u),c}function i(t){return" "+t+" "}function s(t){return'"'+t+'"'}function f(t){t=t||{};var n,e,r=t.name||"fsm",o=t.states||[],i=t.transitions||[],a=t.statedefs,u=t.dotPrefix,c=t.rankdir,d=[];if(d.push("digraph "+s(r)+" {"),c&&d.push(" rankdir="+c+";"),u&&d.push(f.dotPrefix(u)),a)for(n=0,e=a.length;n "+s(t.to)+f.edge.attr(t)+";"},f.docPrefix=function(t){prefixStr="";var n,e=Object.keys(t);for(n=0;n0?" [ "+i.join(" ; ")+" ]":""},f.gen.attr=function(t){var n,e,r,o=Object.keys(t).sort(),i=[];for(n=0,e=o.length;n0?" [ "+i.join(", ")+" ]":""},r.dotcfg=o,r.dotify=f,t.exports=r}])}); \ No newline at end of file diff --git a/dist/state-machine.js b/dist/state-machine.js index eb08e7d..23dc4c3 100644 --- a/dist/state-machine.js +++ b/dist/state-machine.js @@ -210,6 +210,7 @@ function Config(options, StateMachine) { this.init = this.configureInitTransition(options.init); this.data = this.configureData(options.data); this.methods = this.configureMethods(options.methods); + this.dotPrefix = options['dotPrefix'] || this.defaults.dotPrefix; this.hasStateDefs = false; this.map[this.defaults.wildcard] = {}; @@ -665,6 +666,11 @@ StateMachine.defaults = { init: { name: 'init', from: 'none' + }, + dotPrefix: { + graph: [ { fontcolor: "dimgray", fontname:"Helvetica"} ], + node: [ {color: "dimgray", fontsize: 13, fontcolor: "dimgray", fontname: "Helvetica"} ], + edge: [ { fontcolor: "dimgray", fontsize: 10, fontname: "Arial"} ] } } diff --git a/dist/state-machine.min.js b/dist/state-machine.min.js index 1895a43..091d4dd 100644 --- a/dist/state-machine.min.js +++ b/dist/state-machine.min.js @@ -1 +1 @@ -!function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define("StateMachine",[],n):"object"==typeof exports?exports.StateMachine=n():t.StateMachine=n()}(this,function(){return function(t){function n(e){if(i[e])return i[e].exports;var s=i[e]={i:e,l:!1,exports:{}};return t[e].call(s.exports,s,s.exports,n),s.l=!0,s.exports}var i={};return n.m=t,n.c=i,n.i=function(t){return t},n.d=function(t,i,e){n.o(t,i)||Object.defineProperty(t,i,{configurable:!1,enumerable:!0,get:e})},n.n=function(t){var i=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(i,"a",i),i},n.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},n.p="",n(n.s=5)}([function(t,n,i){"use strict";t.exports=function(t,n){var i,e,s;for(i=1;i0)throw'Undefined states in transitions: "'+f.join(", ")+'"'},transitionFor:function(t,n){var i=this.defaults.wildcard;return this.map[t][n]||this.map[i][n]},transitionsFor:function(t){var n=this.defaults.wildcard;return Object.keys(this.map[t]).concat(Object.keys(this.map[n]))},allStates:function(){return this.states},allTransitions:function(){return this.transitions}}),t.exports=e},function(t,n,i){function e(t,n){this.context=t,this.config=n,this.state=n.init.from,this.observers=[t]}var s=i(0),r=i(6),o=i(1),a=[null,[]];s(e.prototype,{init:function(t){if(s(this.context,this.config.data.apply(this.context,t)),o.hook(this,"init"),this.config.init.active)return this.fire(this.config.init.name,[])},is:function(t){return Array.isArray(t)?t.indexOf(this.state)>=0:this.state===t},isPending:function(){return this.pending},can:function(t){return!this.isPending()&&!!this.seek(t)},cannot:function(t){return!this.can(t)},allStates:function(){return this.config.allStates()},allTransitions:function(){return this.config.allTransitions()},transitions:function(){return this.config.transitionsFor(this.state)},seek:function(t,n){var i=this.config.defaults.wildcard,e=this.config.transitionFor(this.state,t),s=e&&e.to;return"function"==typeof s?s.apply(this.context,n):s===i?this.state:s},fire:function(t,n){return this.transit(t,this.state,this.seek(t,n),n)},transit:function(t,n,i,e){var s=this.config.lifecycle,r=this.config.options.observeUnchangedState||n!==i;return i?this.isPending()?this.context.onPendingTransition(t,n,i):(this.config.addState(i),this.beginTransit(),e.unshift({transition:t,from:n,to:i,fsm:this.context}),this.observeEvents([this.observersForEvent(s.onBefore.transition),this.observersForEvent(s.onBefore[t]),r?this.observersForEvent(s.onLeave.state):a,r?this.observersForEvent(s.onLeave[n]):a,this.observersForEvent(s.on.transition),r?["doTransit",[this]]:a,r?this.observersForEvent(s.onEnter.state):a,r?this.observersForEvent(s.onEnter[i]):a,r?this.observersForEvent(s.on[i]):a,this.observersForEvent(s.onAfter.transition),this.observersForEvent(s.onAfter[t]),this.observersForEvent(s.on[t])],e)):this.context.onInvalidTransition(t,n,i)},beginTransit:function(){this.pending=!0},endTransit:function(t){return this.pending=!1,t},failTransit:function(t){throw this.pending=!1,t},doTransit:function(t){this.state=t.to},observe:function(t){if(2===t.length){var n={};n[t[0]]=t[1],this.observers.push(n)}else this.observers.push(t[0])},observersForEvent:function(t){for(var n,i=0,e=this.observers.length,s=[];i0)throw'Undefined states in transitions: "'+f.join(", ")+'"'},transitionFor:function(t,n){var i=this.defaults.wildcard;return this.map[t][n]||this.map[i][n]},transitionsFor:function(t){var n=this.defaults.wildcard;return Object.keys(this.map[t]).concat(Object.keys(this.map[n]))},allStates:function(){return this.states},allTransitions:function(){return this.transitions}}),t.exports=e},function(t,n,i){function e(t,n){this.context=t,this.config=n,this.state=n.init.from,this.observers=[t]}var s=i(0),r=i(6),o=i(1),a=[null,[]];s(e.prototype,{init:function(t){if(s(this.context,this.config.data.apply(this.context,t)),o.hook(this,"init"),this.config.init.active)return this.fire(this.config.init.name,[])},is:function(t){return Array.isArray(t)?t.indexOf(this.state)>=0:this.state===t},isPending:function(){return this.pending},can:function(t){return!this.isPending()&&!!this.seek(t)},cannot:function(t){return!this.can(t)},allStates:function(){return this.config.allStates()},allTransitions:function(){return this.config.allTransitions()},transitions:function(){return this.config.transitionsFor(this.state)},seek:function(t,n){var i=this.config.defaults.wildcard,e=this.config.transitionFor(this.state,t),s=e&&e.to;return"function"==typeof s?s.apply(this.context,n):s===i?this.state:s},fire:function(t,n){return this.transit(t,this.state,this.seek(t,n),n)},transit:function(t,n,i,e){var s=this.config.lifecycle,r=this.config.options.observeUnchangedState||n!==i;return i?this.isPending()?this.context.onPendingTransition(t,n,i):(this.config.addState(i),this.beginTransit(),e.unshift({transition:t,from:n,to:i,fsm:this.context}),this.observeEvents([this.observersForEvent(s.onBefore.transition),this.observersForEvent(s.onBefore[t]),r?this.observersForEvent(s.onLeave.state):a,r?this.observersForEvent(s.onLeave[n]):a,this.observersForEvent(s.on.transition),r?["doTransit",[this]]:a,r?this.observersForEvent(s.onEnter.state):a,r?this.observersForEvent(s.onEnter[i]):a,r?this.observersForEvent(s.on[i]):a,this.observersForEvent(s.onAfter.transition),this.observersForEvent(s.onAfter[t]),this.observersForEvent(s.on[t])],e)):this.context.onInvalidTransition(t,n,i)},beginTransit:function(){this.pending=!0},endTransit:function(t){return this.pending=!1,t},failTransit:function(t){throw this.pending=!1,t},doTransit:function(t){this.state=t.to},observe:function(t){if(2===t.length){var n={};n[t[0]]=t[1],this.observers.push(n)}else this.observers.push(t[0])},observersForEvent:function(t){for(var n,i=0,e=this.observers.length,s=[];i 0) result.states = states + if (statedefs && statedefs.length > 0) + result.statedefs = statedefs; + if (transitions && transitions.length > 0) result.transitions = transitions + if (dotPrefix) + result.dotPrefix = dotPrefix; + return result } @@ -164,6 +172,11 @@ dotcfg.states = function(config, options) { return states; } +dotcfg.statedefs = function(config, options) { + return config.options['statedefs']; + // can be null +} + dotcfg.transitions = function(config, options) { var n, max, transition, init = config.init, @@ -198,7 +211,6 @@ dotcfg.transition = function(name, from, to, dot, config, options, output) { else { output.push(mixin({}, { from: from, to: to, label: pad(name) }, dot || {})) } - } //------------------------------------------------------------------------------------------------- @@ -218,6 +230,8 @@ function dotify(dotcfg) { var name = dotcfg.name || 'fsm', states = dotcfg.states || [], transitions = dotcfg.transitions || [], + statedefs = dotcfg.statedefs, + dotPrefix = dotcfg.dotPrefix, rankdir = dotcfg.rankdir, output = [], n, max; @@ -225,8 +239,20 @@ function dotify(dotcfg) { output.push("digraph " + quote(name) + " {") if (rankdir) output.push(" rankdir=" + rankdir + ";") - for(n = 0, max = states.length ; n < max ; n++) - output.push(dotify.state(states[n])) + + if (dotPrefix) { + output.push(dotify.dotPrefix(dotPrefix)); + } + + if (statedefs) { + for(n = 0, max = statedefs.length ; n < max ; n++) + output.push(dotify.statedef(statedefs[n])) + } + else { + for(n = 0, max = states.length ; n < max ; n++) + output.push(dotify.gen(states[n])) + } + for(n = 0, max = transitions.length ; n < max ; n++) output.push(dotify.edge(transitions[n])) output.push("}") @@ -234,14 +260,28 @@ function dotify(dotcfg) { } -dotify.state = function(state) { +dotify.gen = function(state) { return " " + quote(state) + ";" } +dotify.statedef = function(statedef) { + return " " + quote(statedef.name) + dotify.gen.attr(statedef.dot) + ";" +} + dotify.edge = function(edge) { return " " + quote(edge.from) + " -> " + quote(edge.to) + dotify.edge.attr(edge) + ";" } +dotify.docPrefix = function(dotPrefix) { + prefixStr = ''; + var ix; + var keys = Object.keys(dotPrefix); + for (ix = 0; ix < keys.length; ix++) { + var key = keys[ix]; + prefixStr += ' ' + quote(key) + ' ' + dotify.gen.attr(dotprefix[key]) + "\n"; + } +} + dotify.edge.attr = function(edge) { var n, max, key, keys = Object.keys(edge).sort(), output = []; for(n = 0, max = keys.length ; n < max ; n++) { @@ -252,6 +292,15 @@ dotify.edge.attr = function(edge) { return output.length > 0 ? " [ " + output.join(" ; ") + " ]" : "" } +dotify.gen.attr = function(statedef_dot) { + var n, max, key, keys = Object.keys(statedef_dot).sort(), output = []; + for(n = 0, max = keys.length ; n < max ; n++) { + key = keys[n]; + output.push(key + "=" + quote(statedef_dot[key])) + } + return output.length > 0 ? " [ " + output.join(", ") + " ]" : "" +} + //------------------------------------------------------------------------------------------------- visualize.dotcfg = dotcfg; diff --git a/src/app.js b/src/app.js index 786e7f7..f8ae1b0 100644 --- a/src/app.js +++ b/src/app.js @@ -94,6 +94,11 @@ StateMachine.defaults = { init: { name: 'init', from: 'none' + }, + dotPrefix: { + graph: { fontcolor: "dimgray", fontname:"Helvetica", splines: "spline"}, + node: {color: "dimgray", fontsize: 13, fontcolor: "dimgray", fontname: "Helvetica"}, + edge: { fontcolor: "dimgray", fontsize: 10, fontname: "Arial"} } } diff --git a/src/config.js b/src/config.js index 0e22b96..7288a83 100644 --- a/src/config.js +++ b/src/config.js @@ -20,6 +20,7 @@ function Config(options, StateMachine) { this.init = this.configureInitTransition(options.init); this.data = this.configureData(options.data); this.methods = this.configureMethods(options.methods); + this.dotPrefix = options['dotPrefix'] || this.defaults.dotPrefix; this.hasStateDefs = false; this.map[this.defaults.wildcard] = {}; diff --git a/src/plugin/visualize.js b/src/plugin/visualize.js index 354a57d..1ec20b6 100644 --- a/src/plugin/visualize.js +++ b/src/plugin/visualize.js @@ -22,6 +22,7 @@ function dotcfg(fsm, options) { states = dotcfg.states(config, options), statedefs = dotcfg.statedefs(config, options), transitions = dotcfg.transitions(config, options), + dotPrefix = config.dotPrefix, result = { } if (name) @@ -39,6 +40,9 @@ function dotcfg(fsm, options) { if (transitions && transitions.length > 0) result.transitions = transitions + if (dotPrefix) + result.dotPrefix = dotPrefix; + return result } @@ -124,6 +128,7 @@ function dotify(dotcfg) { states = dotcfg.states || [], transitions = dotcfg.transitions || [], statedefs = dotcfg.statedefs, + dotPrefix = dotcfg.dotPrefix, rankdir = dotcfg.rankdir, output = [], n, max; @@ -132,13 +137,17 @@ function dotify(dotcfg) { if (rankdir) output.push(" rankdir=" + rankdir + ";") + if (dotPrefix) { + output.push(dotify.dotPrefix(dotPrefix)); + } + if (statedefs) { for(n = 0, max = statedefs.length ; n < max ; n++) output.push(dotify.statedef(statedefs[n])) } else { for(n = 0, max = states.length ; n < max ; n++) - output.push(dotify.state(states[n])) + output.push(dotify.gen(states[n])) } for(n = 0, max = transitions.length ; n < max ; n++) @@ -148,18 +157,30 @@ function dotify(dotcfg) { } -dotify.state = function(state) { +dotify.gen = function(state) { return " " + quote(state) + ";" } dotify.statedef = function(statedef) { - return " " + quote(statedef.name) + dotify.state.attr(statedef.dot) + ";" + return " " + quote(statedef.name) + dotify.gen.attr(statedef.dot) + ";" } dotify.edge = function(edge) { return " " + quote(edge.from) + " -> " + quote(edge.to) + dotify.edge.attr(edge) + ";" } +dotify.dotPrefix = function(dotPrefix) { + var prefixStrAry = []; + var ix, key; + var keys = Object.keys(dotPrefix); + for (ix = 0; ix < keys.length; ix++) { + key = keys[ix]; + prefixStrAry.push(' ' + key + ' ' + dotify.gen.attr(dotPrefix[key]) + ";" ); + } + + return prefixStrAry.join("\n"); +} + dotify.edge.attr = function(edge) { var n, max, key, keys = Object.keys(edge).sort(), output = []; for(n = 0, max = keys.length ; n < max ; n++) { @@ -170,7 +191,7 @@ dotify.edge.attr = function(edge) { return output.length > 0 ? " [ " + output.join(" ; ") + " ]" : "" } -dotify.state.attr = function(statedef_dot) { +dotify.gen.attr = function(statedef_dot) { var n, max, key, keys = Object.keys(statedef_dot).sort(), output = []; for(n = 0, max = keys.length ; n < max ; n++) { key = keys[n]; From 83b66a1362e756ec0c37eb9482bc093c23fd300e Mon Sep 17 00:00:00 2001 From: Rick Berger Date: Fri, 10 Nov 2017 20:08:15 -0700 Subject: [PATCH 06/12] Fixed test/plugin/visualize.js test for new fsm config --- dist/state-machine-visualize.js | 14 +++-- dist/state-machine-visualize.min.js | 2 +- dist/state-machine.js | 6 +- dist/state-machine.min.js | 2 +- examples/demo/demo.js | 5 -- lib/state-machine.js | 6 +- lib/visualize.js | 14 +++-- test/plugin/visualize.js | 98 ++++++++++++++--------------- 8 files changed, 72 insertions(+), 75 deletions(-) diff --git a/dist/state-machine-visualize.js b/dist/state-machine-visualize.js index 07c67b1..0f84199 100644 --- a/dist/state-machine-visualize.js +++ b/dist/state-machine-visualize.js @@ -125,7 +125,7 @@ function dotcfg(fsm, options) { states = dotcfg.states(config, options), statedefs = dotcfg.statedefs(config, options), transitions = dotcfg.transitions(config, options), - dotPrefix = dotcfg.dotPrefix, + dotPrefix = config.dotPrefix, result = { } if (name) @@ -272,14 +272,16 @@ dotify.edge = function(edge) { return " " + quote(edge.from) + " -> " + quote(edge.to) + dotify.edge.attr(edge) + ";" } -dotify.docPrefix = function(dotPrefix) { - prefixStr = ''; - var ix; +dotify.dotPrefix = function(dotPrefix) { + var prefixStrAry = []; + var ix, key; var keys = Object.keys(dotPrefix); for (ix = 0; ix < keys.length; ix++) { - var key = keys[ix]; - prefixStr += ' ' + quote(key) + ' ' + dotify.gen.attr(dotprefix[key]) + "\n"; + key = keys[ix]; + prefixStrAry.push(' ' + key + ' ' + dotify.gen.attr(dotPrefix[key]) + ";" ); } + + return prefixStrAry.join("\n"); } dotify.edge.attr = function(edge) { diff --git a/dist/state-machine-visualize.min.js b/dist/state-machine-visualize.min.js index 435b671..0356c7f 100644 --- a/dist/state-machine-visualize.min.js +++ b/dist/state-machine-visualize.min.js @@ -1 +1 @@ -!function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define("StateMachineVisualize",[],n):"object"==typeof exports?exports.StateMachineVisualize=n():t.StateMachineVisualize=n()}(this,function(){return function(t){function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var e={};return n.m=t,n.c=e,n.i=function(t){return t},n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:r})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},n.p="",n(n.s=1)}([function(t,n,e){"use strict";t.exports=function(t,n){var e,r,o;for(e=1;e0&&(c.states=s),f&&f.length>0&&(c.statedefs=f),a&&a.length>0&&(c.transitions=a),u&&(c.dotPrefix=u),c}function i(t){return" "+t+" "}function s(t){return'"'+t+'"'}function f(t){t=t||{};var n,e,r=t.name||"fsm",o=t.states||[],i=t.transitions||[],a=t.statedefs,u=t.dotPrefix,c=t.rankdir,d=[];if(d.push("digraph "+s(r)+" {"),c&&d.push(" rankdir="+c+";"),u&&d.push(f.dotPrefix(u)),a)for(n=0,e=a.length;n "+s(t.to)+f.edge.attr(t)+";"},f.docPrefix=function(t){prefixStr="";var n,e=Object.keys(t);for(n=0;n0?" [ "+i.join(" ; ")+" ]":""},f.gen.attr=function(t){var n,e,r,o=Object.keys(t).sort(),i=[];for(n=0,e=o.length;n0?" [ "+i.join(", ")+" ]":""},r.dotcfg=o,r.dotify=f,t.exports=r}])}); \ No newline at end of file +!function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define("StateMachineVisualize",[],n):"object"==typeof exports?exports.StateMachineVisualize=n():t.StateMachineVisualize=n()}(this,function(){return function(t){function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var e={};return n.m=t,n.c=e,n.i=function(t){return t},n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:r})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},n.p="",n(n.s=1)}([function(t,n,e){"use strict";t.exports=function(t,n){var e,r,o;for(e=1;e0&&(c.states=s),f&&f.length>0&&(c.statedefs=f),a&&a.length>0&&(c.transitions=a),u&&(c.dotPrefix=u),c}function i(t){return" "+t+" "}function s(t){return'"'+t+'"'}function f(t){t=t||{};var n,e,r=t.name||"fsm",o=t.states||[],i=t.transitions||[],a=t.statedefs,u=t.dotPrefix,c=t.rankdir,d=[];if(d.push("digraph "+s(r)+" {"),c&&d.push(" rankdir="+c+";"),u&&d.push(f.dotPrefix(u)),a)for(n=0,e=a.length;n "+s(t.to)+f.edge.attr(t)+";"},f.dotPrefix=function(t){var n,e,r=[],o=Object.keys(t);for(n=0;n0?" [ "+i.join(" ; ")+" ]":""},f.gen.attr=function(t){var n,e,r,o=Object.keys(t).sort(),i=[];for(n=0,e=o.length;n0?" [ "+i.join(", ")+" ]":""},r.dotcfg=o,r.dotify=f,t.exports=r}])}); \ No newline at end of file diff --git a/dist/state-machine.js b/dist/state-machine.js index 23dc4c3..bd7a185 100644 --- a/dist/state-machine.js +++ b/dist/state-machine.js @@ -668,9 +668,9 @@ StateMachine.defaults = { from: 'none' }, dotPrefix: { - graph: [ { fontcolor: "dimgray", fontname:"Helvetica"} ], - node: [ {color: "dimgray", fontsize: 13, fontcolor: "dimgray", fontname: "Helvetica"} ], - edge: [ { fontcolor: "dimgray", fontsize: 10, fontname: "Arial"} ] + graph: { fontcolor: "dimgray", fontname:"Helvetica", splines: "spline"}, + node: {color: "dimgray", fontsize: 13, fontcolor: "dimgray", fontname: "Helvetica"}, + edge: { fontcolor: "dimgray", fontsize: 10, fontname: "Arial"} } } diff --git a/dist/state-machine.min.js b/dist/state-machine.min.js index 091d4dd..574637f 100644 --- a/dist/state-machine.min.js +++ b/dist/state-machine.min.js @@ -1 +1 @@ -!function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define("StateMachine",[],n):"object"==typeof exports?exports.StateMachine=n():t.StateMachine=n()}(this,function(){return function(t){function n(e){if(i[e])return i[e].exports;var s=i[e]={i:e,l:!1,exports:{}};return t[e].call(s.exports,s,s.exports,n),s.l=!0,s.exports}var i={};return n.m=t,n.c=i,n.i=function(t){return t},n.d=function(t,i,e){n.o(t,i)||Object.defineProperty(t,i,{configurable:!1,enumerable:!0,get:e})},n.n=function(t){var i=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(i,"a",i),i},n.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},n.p="",n(n.s=5)}([function(t,n,i){"use strict";t.exports=function(t,n){var i,e,s;for(i=1;i0)throw'Undefined states in transitions: "'+f.join(", ")+'"'},transitionFor:function(t,n){var i=this.defaults.wildcard;return this.map[t][n]||this.map[i][n]},transitionsFor:function(t){var n=this.defaults.wildcard;return Object.keys(this.map[t]).concat(Object.keys(this.map[n]))},allStates:function(){return this.states},allTransitions:function(){return this.transitions}}),t.exports=e},function(t,n,i){function e(t,n){this.context=t,this.config=n,this.state=n.init.from,this.observers=[t]}var s=i(0),r=i(6),o=i(1),a=[null,[]];s(e.prototype,{init:function(t){if(s(this.context,this.config.data.apply(this.context,t)),o.hook(this,"init"),this.config.init.active)return this.fire(this.config.init.name,[])},is:function(t){return Array.isArray(t)?t.indexOf(this.state)>=0:this.state===t},isPending:function(){return this.pending},can:function(t){return!this.isPending()&&!!this.seek(t)},cannot:function(t){return!this.can(t)},allStates:function(){return this.config.allStates()},allTransitions:function(){return this.config.allTransitions()},transitions:function(){return this.config.transitionsFor(this.state)},seek:function(t,n){var i=this.config.defaults.wildcard,e=this.config.transitionFor(this.state,t),s=e&&e.to;return"function"==typeof s?s.apply(this.context,n):s===i?this.state:s},fire:function(t,n){return this.transit(t,this.state,this.seek(t,n),n)},transit:function(t,n,i,e){var s=this.config.lifecycle,r=this.config.options.observeUnchangedState||n!==i;return i?this.isPending()?this.context.onPendingTransition(t,n,i):(this.config.addState(i),this.beginTransit(),e.unshift({transition:t,from:n,to:i,fsm:this.context}),this.observeEvents([this.observersForEvent(s.onBefore.transition),this.observersForEvent(s.onBefore[t]),r?this.observersForEvent(s.onLeave.state):a,r?this.observersForEvent(s.onLeave[n]):a,this.observersForEvent(s.on.transition),r?["doTransit",[this]]:a,r?this.observersForEvent(s.onEnter.state):a,r?this.observersForEvent(s.onEnter[i]):a,r?this.observersForEvent(s.on[i]):a,this.observersForEvent(s.onAfter.transition),this.observersForEvent(s.onAfter[t]),this.observersForEvent(s.on[t])],e)):this.context.onInvalidTransition(t,n,i)},beginTransit:function(){this.pending=!0},endTransit:function(t){return this.pending=!1,t},failTransit:function(t){throw this.pending=!1,t},doTransit:function(t){this.state=t.to},observe:function(t){if(2===t.length){var n={};n[t[0]]=t[1],this.observers.push(n)}else this.observers.push(t[0])},observersForEvent:function(t){for(var n,i=0,e=this.observers.length,s=[];i0)throw'Undefined states in transitions: "'+f.join(", ")+'"'},transitionFor:function(t,n){var i=this.defaults.wildcard;return this.map[t][n]||this.map[i][n]},transitionsFor:function(t){var n=this.defaults.wildcard;return Object.keys(this.map[t]).concat(Object.keys(this.map[n]))},allStates:function(){return this.states},allTransitions:function(){return this.transitions}}),t.exports=e},function(t,n,i){function e(t,n){this.context=t,this.config=n,this.state=n.init.from,this.observers=[t]}var s=i(0),r=i(6),o=i(1),a=[null,[]];s(e.prototype,{init:function(t){if(s(this.context,this.config.data.apply(this.context,t)),o.hook(this,"init"),this.config.init.active)return this.fire(this.config.init.name,[])},is:function(t){return Array.isArray(t)?t.indexOf(this.state)>=0:this.state===t},isPending:function(){return this.pending},can:function(t){return!this.isPending()&&!!this.seek(t)},cannot:function(t){return!this.can(t)},allStates:function(){return this.config.allStates()},allTransitions:function(){return this.config.allTransitions()},transitions:function(){return this.config.transitionsFor(this.state)},seek:function(t,n){var i=this.config.defaults.wildcard,e=this.config.transitionFor(this.state,t),s=e&&e.to;return"function"==typeof s?s.apply(this.context,n):s===i?this.state:s},fire:function(t,n){return this.transit(t,this.state,this.seek(t,n),n)},transit:function(t,n,i,e){var s=this.config.lifecycle,r=this.config.options.observeUnchangedState||n!==i;return i?this.isPending()?this.context.onPendingTransition(t,n,i):(this.config.addState(i),this.beginTransit(),e.unshift({transition:t,from:n,to:i,fsm:this.context}),this.observeEvents([this.observersForEvent(s.onBefore.transition),this.observersForEvent(s.onBefore[t]),r?this.observersForEvent(s.onLeave.state):a,r?this.observersForEvent(s.onLeave[n]):a,this.observersForEvent(s.on.transition),r?["doTransit",[this]]:a,r?this.observersForEvent(s.onEnter.state):a,r?this.observersForEvent(s.onEnter[i]):a,r?this.observersForEvent(s.on[i]):a,this.observersForEvent(s.onAfter.transition),this.observersForEvent(s.onAfter[t]),this.observersForEvent(s.on[t])],e)):this.context.onInvalidTransition(t,n,i)},beginTransit:function(){this.pending=!0},endTransit:function(t){return this.pending=!1,t},failTransit:function(t){throw this.pending=!1,t},doTransit:function(t){this.state=t.to},observe:function(t){if(2===t.length){var n={};n[t[0]]=t[1],this.observers.push(n)}else this.observers.push(t[0])},observersForEvent:function(t){for(var n,i=0,e=this.observers.length,s=[];i " + quote(edge.to) + dotify.edge.attr(edge) + ";" } -dotify.docPrefix = function(dotPrefix) { - prefixStr = ''; - var ix; +dotify.dotPrefix = function(dotPrefix) { + var prefixStrAry = []; + var ix, key; var keys = Object.keys(dotPrefix); for (ix = 0; ix < keys.length; ix++) { - var key = keys[ix]; - prefixStr += ' ' + quote(key) + ' ' + dotify.gen.attr(dotprefix[key]) + "\n"; + key = keys[ix]; + prefixStrAry.push(' ' + key + ' ' + dotify.gen.attr(dotPrefix[key]) + ";" ); } + + return prefixStrAry.join("\n"); } dotify.edge.attr = function(edge) { diff --git a/test/plugin/visualize.js b/test/plugin/visualize.js index a2b9388..6b9fdb2 100644 --- a/test/plugin/visualize.js +++ b/test/plugin/visualize.js @@ -5,6 +5,23 @@ import visualize from '../../src/plugin/visualize' var dotcfg = visualize.dotcfg, // converts FSM to DOT CONFIG dotify = visualize.dotify; // converts DOT CONFIG to DOT OUTPUT +var pfxStr = '\ + graph [ fontcolor="dimgray", fontname="Helvetica", splines="spline" ];\n\ + node [ color="dimgray", fontcolor="dimgray", fontname="Helvetica", fontsize="13" ];\n\ + edge [ fontcolor="dimgray", fontname="Arial", fontsize="10" ];\ +'; + +var pfxObj = { dotPrefix: { + graph: { fontcolor: 'dimgray', + fontname: 'Helvetica', + splines: 'spline' }, + node: { color: 'dimgray', + fontsize: 13, + fontcolor: 'dimgray', + fontname: 'Helvetica' }, + edge: { fontcolor: 'dimgray', fontsize: 10, fontname: 'Arial' } + }}; + //------------------------------------------------------------------------------------------------- test('visualize state machine', t => { @@ -20,6 +37,7 @@ test('visualize state machine', t => { }) t.is(visualize(fsm), `digraph "fsm" { +${pfxStr} "solid"; "liquid"; "gas"; @@ -45,6 +63,7 @@ test('visualize state machine factory', t => { }) t.is(visualize(FSM), `digraph "fsm" { +${pfxStr} "solid"; "liquid"; "gas"; @@ -71,6 +90,7 @@ test('visualize with custom .dot markup', t => { t.is(visualize(fsm, { name: 'matter', orientation: 'horizontal' }), `digraph "matter" { rankdir=LR; +${pfxStr} "solid"; "liquid"; "gas"; @@ -97,7 +117,7 @@ test('dotcfg simple state machine', t => { ] }) - t.deepEqual(dotcfg(fsm), { + t.deepEqual(dotcfg(fsm), Object.assign({ states: [ 'solid', 'liquid', 'gas' ], transitions: [ { from: 'solid', to: 'liquid', label: ' melt ' }, @@ -105,7 +125,7 @@ test('dotcfg simple state machine', t => { { from: 'liquid', to: 'gas', label: ' vaporize ' }, { from: 'gas', to: 'liquid', label: ' condense ' } ] - }) + }, pfxObj)) }) @@ -117,17 +137,14 @@ test('dotcfg for state machine - optionally include :init transition', t => { init: { name: 'boot', from: 'booting', to: 'ready', dot: { color: 'red' } } }) - t.deepEqual(dotcfg(fsm, { init: false }), { - states: [ 'ready' ] - }) + t.deepEqual(dotcfg(fsm, { init: false }), Object.assign({ + states: [ 'ready' ]}, pfxObj)); - t.deepEqual(dotcfg(fsm, { init: true }), { + t.deepEqual(dotcfg(fsm, { init: true }), Object.assign({ states: [ 'booting', 'ready' ], transitions: [ { from: 'booting', to: 'ready', label: ' boot ', color: 'red' } - ] - }) - + ]}, pfxObj)); }) //------------------------------------------------------------------------------------------------- @@ -143,15 +160,13 @@ test('dotcfg for fsm with multiple transitions with same :name', t => { ] }) - t.deepEqual(dotcfg(fsm), { + t.deepEqual(dotcfg(fsm), Object.assign({ states: [ 'A', 'B', 'C', 'D' ], transitions: [ { from: 'A', to: 'B', label: ' step ' }, { from: 'B', to: 'C', label: ' step ' }, { from: 'C', to: 'D', label: ' step ' } - ] - }) - + ]}, pfxObj)); }) //------------------------------------------------------------------------------------------------- @@ -168,7 +183,7 @@ test('dotcfg for fsm transition with multiple :from', t => { ] }) - t.deepEqual(dotcfg(fsm), { + t.deepEqual(dotcfg(fsm), Object.assign({ states: [ 'A', 'B', 'C', 'D' ], transitions: [ { from: 'A', to: 'B', label: ' step ' }, @@ -176,15 +191,12 @@ test('dotcfg for fsm transition with multiple :from', t => { { from: 'C', to: 'D', label: ' step ' }, { from: 'A', to: 'A', label: ' reset ' }, { from: 'B', to: 'A', label: ' reset ' } - ] - }) - + ]}, pfxObj)); }) //------------------------------------------------------------------------------------------------- test('dotcfg for fsm with wildcard/missing :from', t => { - var fsm = new StateMachine({ init: 'A', transitions: [ @@ -196,7 +208,7 @@ test('dotcfg for fsm with wildcard/missing :from', t => { ] }) - t.deepEqual(dotcfg(fsm), { + t.deepEqual(dotcfg(fsm), Object.assign({ states: [ 'A', 'B', 'C', 'D', 'X' ], transitions: [ { from: 'A', to: 'B', label: ' step ' }, @@ -214,9 +226,7 @@ test('dotcfg for fsm with wildcard/missing :from', t => { { from: 'C', to: 'X', label: ' finish ' }, { from: 'D', to: 'X', label: ' finish ' }, { from: 'X', to: 'X', label: ' finish ' } - ] - }) - + ]}, pfxObj)); }) //------------------------------------------------------------------------------------------------- @@ -236,7 +246,7 @@ test('dotcfg for fsm with wildcard/missing :to', t => { ] }) - t.deepEqual(dotcfg(fsm), { + t.deepEqual(dotcfg(fsm), Object.assign({ states: [ 'A', 'B', 'C', 'D' ], transitions: [ { from: 'A', to: 'B', label: ' step ' }, @@ -250,9 +260,7 @@ test('dotcfg for fsm with wildcard/missing :to', t => { { from: 'B', to: 'B', label: ' noop ' }, { from: 'C', to: 'C', label: ' noop ' }, { from: 'D', to: 'D', label: ' noop ' } - ] - }) - + ]}, pfxObj)); }) //------------------------------------------------------------------------------------------------- @@ -272,10 +280,8 @@ test('dotcfg for fsm - conditional transition is not displayed', t => { } }); - t.deepEqual(dotcfg(fsm), { - states: [ 'A' ] - }) - + t.deepEqual(dotcfg(fsm), Object.assign({ + states: [ 'A' ]}, pfxObj)); }) //------------------------------------------------------------------------------------------------- @@ -290,14 +296,12 @@ test('dotcfg with custom transition .dot edge markup', t => { ] }) - t.deepEqual(dotcfg(fsm), { + t.deepEqual(dotcfg(fsm), Object.assign({ states: [ 'A', 'B', 'C' ], transitions: [ { from: 'A', to: 'B', label: 'A2B', color: "red", headport: "nw", tailport: "ne" }, { from: 'B', to: 'C', label: 'B2C', color: "green", headport: "sw", tailport: "se" } - ] - }) - + ]}, pfxObj)); }) //------------------------------------------------------------------------------------------------- @@ -306,10 +310,8 @@ test('dotcfg with custom name', t => { var fsm = new StateMachine(); - t.deepEqual(dotcfg(fsm, { name: 'bob' }), { - name: 'bob', - }) - + t.deepEqual(dotcfg(fsm, { name: 'bob' }), Object.assign({ + name: 'bob'}, pfxObj)); }) //------------------------------------------------------------------------------------------------- @@ -318,14 +320,11 @@ test('dotcfg with custom orientation', t => { var fsm = new StateMachine(); - t.deepEqual(dotcfg(fsm, { orientation: 'horizontal' }), { - rankdir: 'LR', - }) - - t.deepEqual(dotcfg(fsm, { orientation: 'vertical' }), { - rankdir: 'TB', - }) + t.deepEqual(dotcfg(fsm, { orientation: 'horizontal' }), Object.assign({ + rankdir: 'LR'}, pfxObj)); + t.deepEqual(dotcfg(fsm, { orientation: 'vertical' }), Object.assign({ + rankdir: 'TB'}, pfxObj)); }) //------------------------------------------------------------------------------------------------- @@ -334,8 +333,7 @@ test('dotcfg for empty state machine', t => { var fsm = new StateMachine(); - t.deepEqual(dotcfg(fsm), {}) - + t.deepEqual(dotcfg(fsm), pfxObj); }) //================================================================================================= @@ -344,9 +342,9 @@ test('dotcfg for empty state machine', t => { test('dotify empty', t => { var expected = `digraph "fsm" { -}` - t.is(dotify(), expected) - t.is(dotify({}), expected) +}`; + t.is(dotify(), expected); + t.is(dotify({}), expected); }) //------------------------------------------------------------------------------------------------- From 706e418f292424088a7087ee41fa320e98881aca Mon Sep 17 00:00:00 2001 From: Rick Berger Date: Fri, 10 Nov 2017 20:25:36 -0700 Subject: [PATCH 07/12] Added singletest.js, some more commenting --- test/plugin/visualize.js | 6 ++++++ test/singletest.js | 45 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 test/singletest.js diff --git a/test/plugin/visualize.js b/test/plugin/visualize.js index 6b9fdb2..b23b75f 100644 --- a/test/plugin/visualize.js +++ b/test/plugin/visualize.js @@ -5,12 +5,18 @@ import visualize from '../../src/plugin/visualize' var dotcfg = visualize.dotcfg, // converts FSM to DOT CONFIG dotify = visualize.dotify; // converts DOT CONFIG to DOT OUTPUT +/* + | dot prefix string will be appended to all dot output + */ var pfxStr = '\ graph [ fontcolor="dimgray", fontname="Helvetica", splines="spline" ];\n\ node [ color="dimgray", fontcolor="dimgray", fontname="Helvetica", fontsize="13" ];\n\ edge [ fontcolor="dimgray", fontname="Arial", fontsize="10" ];\ '; +/* + | dot default pfx object will always be appended to dot output object + */ var pfxObj = { dotPrefix: { graph: { fontcolor: 'dimgray', fontname: 'Helvetica', diff --git a/test/singletest.js b/test/singletest.js new file mode 100644 index 0000000..213e071 --- /dev/null +++ b/test/singletest.js @@ -0,0 +1,45 @@ +// Ava doesn't appear to be able to run a single test (that I've found), +// which makes it pretty hard to debug a single test +// +// Use this to run a single test as follows: +// +// node_modules/ava/cli.js test/singletest.js +// +// Copy and paste the test code into the 'test body' section +// +// 10-Nov-2017 -- rickb +// +import test from 'ava' +import StateMachine from '../src/app' + +/****************************************************** + * uncomment this section if you're including visualize test + * / +import visualize from '../src/plugin/visualize' + +var dotcfg = visualize.dotcfg, // converts FSM to DOT CONFIG + dotify = visualize.dotify; // converts DOT CONFIG to DOT OUTPUT + +var pfxStr = '\ + graph [ fontcolor="dimgray", fontname="Helvetica", splines="spline" ];\n\ + node [ color="dimgray", fontcolor="dimgray", fontname="Helvetica", fontsize="13" ];\n\ + edge [ fontcolor="dimgray", fontname="Arial", fontsize="10" ];\ +'; + +var pfxObj = { dotPrefix: { + graph: { fontcolor: 'dimgray', + fontname: 'Helvetica', + splines: 'spline' }, + node: { color: 'dimgray', + fontsize: 13, + fontcolor: 'dimgray', + fontname: 'Helvetica' }, + edge: { fontcolor: 'dimgray', fontsize: 10, fontname: 'Arial' } + }}; +********************************************************/ + +/** test body - paste test function in here */ + +test('version', t => { + t.is(StateMachine.version, '3.0.1'); +}); From 8d26d91becd2c3d9d2c5c7739679e8349cac5af1 Mon Sep 17 00:00:00 2001 From: Rick Berger Date: Fri, 10 Nov 2017 21:00:15 -0700 Subject: [PATCH 08/12] Minor bugfix, recreating visuals --- bin/examples | 13 +- examples/atm.dot | 3 + examples/atm.png | Bin 98712 -> 95677 bytes examples/atm.svg | 245 ++++++++++++++++++++--------------- examples/horizontal_door.dot | 3 + examples/horizontal_door.png | Bin 11279 -> 10797 bytes examples/horizontal_door.svg | 42 +++--- examples/matter.dot | 3 + examples/matter.js | 2 +- examples/matter.png | Bin 14731 -> 13585 bytes examples/matter.svg | 67 +++++----- examples/vertical_door.dot | 3 + examples/vertical_door.png | Bin 8246 -> 7469 bytes examples/vertical_door.svg | 42 +++--- examples/wizard.dot | 3 + examples/wizard.png | Bin 28377 -> 21741 bytes examples/wizard.svg | 92 +++++++------ src/plugin/visualize.js | 12 +- 18 files changed, 302 insertions(+), 228 deletions(-) diff --git a/bin/examples b/bin/examples index c5b464f..cd6b339 100755 --- a/bin/examples +++ b/bin/examples @@ -19,21 +19,22 @@ var fs = require('fs'), child = require('child_process'); //------------------------------------------------------------------------------------------------- +process.chdir(path.dirname(process.argv[1])); if (process.argv.length > 2) { - var fn = process.argv[2]; - process.chdir(path.dirname(process.argv[1])); - if (!fs.existsSync('../examples/' + fn)) { - console.log('File: ' + fn + ' does not exist'); + var fn = process.argv[2], + fnfull = '../examples/' + fn; + if (!fs.existsSync(fnfull)) { + console.log('Error - file: ' + fnfull + ' does not exist'); } else { - visualize(process.argv[2]); + visualize(fn); } } else { - fs.readdirSync('examples') + fs.readdirSync('../examples') .filter(function(file) { return path.extname(file) === ".js" }) .map(visualize); } diff --git a/examples/atm.dot b/examples/atm.dot index 9f76543..98dde82 100644 --- a/examples/atm.dot +++ b/examples/atm.dot @@ -1,4 +1,7 @@ digraph "ATM" { + graph [ fontcolor="dimgray", fontname="Helvetica", splines="spline" ]; + node [ color="dimgray", fontcolor="dimgray", fontname="Helvetica", fontsize="13" ]; + edge [ fontcolor="dimgray", fontname="Arial", fontsize="10" ]; "ready"; "pin"; "action"; diff --git a/examples/atm.png b/examples/atm.png index a699d3968486c09484bdc1259cbecc291bb9755b..89d1ce92a5291730ab454d4319f255486166f54b 100644 GIT binary patch literal 95677 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 literal 98712 zcma(3cRberzXy(AMnaic$tDSfLNd!H6(TCKB3ee2N=EkRvZGS6iiXiJDtncNks=K% zAqu5X(f9tmyw5qm+wc3&_kGUioX@+suGi~19*_HaKBLWd7_qSmvQj7%HWOogOA3X) zgF<0=$IOI3@#a4A2LF%Ad7F_wQyGStV+xo zEjUxJOC&MJ1j{(ro;zpnlHw>HzdBm$dbhLkrS$ZMLZ#i~t4|nMxbW-qqy#$}ve zui(Nzl}q?MXn$39ZM8ZDe~`$$dGlstQ&Zg?JJ|2uyGKW2zI{2~gH7%|_t%b(kGI`*-PT#K>&9|zI_m=)svd;mBV=Rq^JRo|0)@oI z#mjw1xka=Cm??^zHW|ITzP&xyWJPy(_qF|%r}KB+V1NGNg_ENrH&-h6`gMu5YgtZyd%xArPH13YAR#GE*=5_0R7T+e-v z&_er1*(S--&Q*-Eo8&w6_4RX0S(h#2;^7HnSjyhlUE*SFY#baN&4Qn0u(7czuc)Yf z`*tN06O-!&aV;%jCnqQJnCtByh9x9$9yoZgzNbgWN5LHAgCdVj# z0Hdt9abta7ZD{|*1c#B4k<(k_2e!GEa`c_*1Nn9ed4C}_FG@*C$>j8O!(@Mb|EEu3 zc&!+!p=StfL}W8&XZ`)poEfa=&8b>Z^~y`jE0SHDx_LJreThg*r$Tf5h_CywwgPE~$GgTC*#_bYuWgtl(oip9qzY*PN@i7{ThzN3R1 zf2OFc%p)AV{~T>l!c0s|w&H2Ba&kgftl3fX{JEKLF6$sR*2w#cjaU+qyKd~ra(i(p zTe7{{>pU3=77NT`2*Xm{B&iH_znIm(9WE(*oZEQtrI@z12qtgou(q5CZKHELfB*Cp zuUmtsbi{nC?+8C|^yqn=g;|EB93l;W=YAM8X9e|luw!y%PabT&Y7ogTTg3?Z(Haezf7| z1y-#}8|%Jw>5^?#z~+}%wPG<8DP!H!hcXhSQOSH>KlD4Se6)w>@+MC{;k-^(R#x-s zz_SP3+*nV|7GZ$$_g6mbdHKmk^}nBAv2tbfCbt|%!cqJd{{Gn6Zoy2e5mwY4SJcDtpMr6x z%@uakS2uRL3^YVz?dj|4(rapIwHG_-;Zd@$U85}Hli#vs3nk;qmHwfja8$RUpV*EK z!E_9hLun2JIq}-(A|sa;I#d__ol9P`Q}NXI195^XtQ*~)*K|1qo&WncV5k+p5Qll! zlTPlB6b;Lu*Ax<|8b!8)~WzM^rmZ(^e8 z?jK%$emx_jrMGN~47YBjqi0}HI{w-0NN<&JPfw44PN3#>vy1c^8XA#6FM^DetXY7rWcn~Ld~S{zx7jt&521# z=djo5DNR)2*omq?>@~ffO^T|jhN$lp$JaNlnU^iA&oxO-**K!As)|||C{F&>{GQwP zzrV+dT3q&(9@)BOOK^+!u+GIxmj>{Wu0Ec!!Y^r^tm0{Fs}Z`DbztwXLD`9~JuNP2 z3JwvKm0H<3IS!{je0rLkn3fhf^ejzMQj!5fv}=7UGdnvI#dgo0O0V+~O|d@`nwpvf zHXReKPl{rfMzzib-0ku)5uV{zxtCtkg} zf4xiIjT?g>E6*t0_6XduK8=A=S64Ur@ytXmdJ6WkKE@$+SV~GtX5xo5mP!Pb${slX z)5fmCXUY2Y>swq!ZeF->Awu2nOUl#A0^h|-_daF#E+Zy)s6OH!&x#c}@0U0A_KF%9 z7@%%3QDk^nDZx@EEq<>fIYa{oZKb891vE~`2mblGNq)~=MoA;8)sWGttv)_?+iWJ= z|25|c(;he@BZE^=@aFeF+Gl_BP!iJ8Ze&=a;cvQq`?liAZ+3XZYuJJ1-h)hd1G0iB zTP!WPeSCaU4&S(U_b%nH)-EmoNyqW-5(boPy&S{yeWRn%XrMzH8518K&D7nEU%TtN zvP8DRAuv$;^Ye?L z=qQvRg%Z>_3dQQyZnmI>xitZ2&z78=*l%`m!;-aY*LL4^T{ivmCmrR-aBE~$mGi{jU(PcUL`6K0Q3ZtmmmZ;8>zJ7j6 zPIX}$DuS^6j~qFo=+(DH-mbjZtm#^Z(_%^F<>O-lMj<`7s;Vk`@Nsfmn>i^aJFjYn z*sV7@azq}V^6bFv*SBm2U+vUsytA*&(Zgepw2S%ZVjoGB(;TM+BIWG*=Eae{|H*7n4i1$T5tj>M7JpY{&AgL&5sH@MmInb}(May-n=4ZHcb0RKJu-UB>3) zif+#Z0{(n0OV>DAIAT1_`d%Uf3n?t==>gl)BP+>s1HX#P%P+@khF!gSb;NyWJ&+tw zm)ePOfeQ)_)DoBG7^;3zZ5ge>g?oQ`!ZkZLSNs0G(BU_?LoQ#wJYqZ~t)?b`GH2-I zB#siZ%8eTgy^UcfK zd#k=aw)@^e zjuYeEbh~!#YH!aE`|oRS17-w#f4Zi-I!MQC`*tPo0sT0k&D_6#|IW^-d~pB1^6kA3 zShuCEZ$$A`^!s9EmZ6q75w%-yu^~FGL%G;>-K-W1V{&?Q*KLPt5kWygW@cv6{4Q`TUbf3WvbKRlqu1>#?Zb8|zIU&F zc4`oyxpn1;Y49S}Oo@wI4g|6^F)@);0Mvwk$Ei{#YA3%5l^%I}4t-vHO?-a+r_5evp8OT?w6nSg7G%gQ2SW0&FA+wObp z>VEq+>)3~fvd?~xv`fB!d}_s}WAC@v+6tiVpb#vjc=`J3@7~RaPhN^GdZgz*%l1pk z7H_+)losJvIH#~Mo2RGe$k>>qj0`iIptAq1KPbdvK$dCi?d$Tkr2%k-ynk;;2?l*b z0daJ5BfWyqDZtM#{Gqb4vU%lczmYFr20+^YkqOf9Ier|?i3&_4siMLg9UWbMe3i${=TF39vJ-AD_3se{_=L>C>mi+qWB_X%H%xoXh}_ z1tbK@lfC!Bp|)4ALjR+qE-o(k*1FD49yd3);=6Zs2~WK5@ye#EaQ*7lOYn#0GCZK< zY;5Edi30tD_2Z)M57mLf$kMGZ~DqJGluaZTE(Y+xZ%}fsJR=CzAH6wchA3T zcKGmN2FmA`S7KXr{t02uBnI0x271?FBoh^l;zbOK_E)yuvQaqluJn#&syjtM*`4#i zhKt{4&|hU_W$W-DeV;!^ba&f^jE>mT2v;H}R)t}2)!FtU2c07yAFtfIcW<_2fgPA! z>b>@Vx#lunUwc#@|6BNDTkJ^p$)_UNce-$Ki?-OCn{#5|&IbomP_zcZ_q=Oqdis>5 ztI)pwmTcFL2d_dxLfla z=dNJNU0wV?$GVz9L~dF|GX@9E!Ky9mj5fjR{S20m$N zsrz4c)$-xlg_FKtI$1Dxbzp5v^0H4h(ki^`p_Y`jYTg5kzrKA~hJV_xn(trzv~9}ZhQ9t%bOwx4m4BzuAtUwWiUwZ zp%z|Laykm%y1k6yx*-Zxv$|gDr&k4ZCtxI6^v%qc?=3ra9{quUbWY(Lbv>15HZidY zhF!ZR<~#OgyRVS!qS#_t0bW)6;sqPldpsOs^ z`S*9@?%TE@DA+Mnz10mg@Rqyb)TvYMA0Kbl)YK#^zTLZ%8XwQ`?R`b)SXa?;X$Lkh zL!wn!x&0b{`{dcPdWGu066!H~_m(&>A*Bs4Y(#RD+ShdZY zvrhf^-2Kq+)`(ha-H(-lD^{!!Quj5+=Pmi~^WK7J0>UdDek0#*A!VcPuc*)m9A%xr8!Nf%k8XpnvS4F)H4U)eDy z0M6_jD^nt#pje+fcTV3ZE3Ge%aPrCr?853bPo6NNUGoa(b$p+i0+8N-mwLWulr>`U zgLWT#Urr{-8CWL98Vbh8UC zvOh_$eSUcp2N~ItlBvV3M^TZ9Inqk{SgI_TUG#Z_c~%+b{~{Lt&0 zsV;YI&dg3`jWC;H;naiLaG}$L>rOTO7zU08ej0d^C^?isHH|q;+qIoLu4=LO-+%RP?< zH#<8krlMl)n{x7dz#Zj-d2;NF&&g|&RP5QSJw4I;FLhYc;kVL}ZpHhay&_3cPAHIM zv&zfMCqUYBs*kAc?iOHYXJ_W%u-SiR?z?OG!-oR|)IPtsF$-EC>2zB_clqRPgHbTm zG&JfllNJ^h3D1Vq&i+=G-jTt)ZQC}q$eLHLREFxtnC{I5mpjN3%(H6MEluc_Qs6H;TAn;Hzj_Y>6-L8kecHA+Z{8$b zxbP-Odr)Viy!}HfdNBhdqiV(dgH7kRS?6M$FyN~5tLoEcWBcL;RLC*Pm|ZQ z6TQ~`abWn!Gm)r2GfEfDm_YJ#b8}_l@7PsvOB%-25MYYtA-}J5Ie>9_z}yBj1}Awy4U^+|2otyvNvA(q%qCgW^(8sy`)5jJeK?5Y&#LJhL+1PY#SmlD}gM3*Fjzc6tyn#zo z+)9A$UD`)xcPc3ymr9sQdqq8%qO?We= zU%!5lc4|l!iiV`s5BZGfMS#^=MMXuAgN_~hwrpb~iW?k|I(&N@WGfrDsxvd|p~GmA z%?*mLk6M(Nkr9`Y!gCu713X7jQE?0Wl5?Sz>%vd4CB80&fah!A_fYqjP}x_`v{|j zN@eKgCcV38KaIQq586frP#_2kjvb?-0Hz*# z;R{Jn@yxFy{-;h={?cL3AOEkNJV(t2Q=_Q|M&c9^5fKc7&D$g{S>Zw&A?A)ff8GGl zLcjUizaOwj2GPnCj=1X$MbgNisT5c{q##&P1tT)kL8N73)cXHSRPzhxnL00iMs#c} z1BGvt_4BQwDgr#c{`@-HZgEp+u~{Xev2WeC?=nZJwc^=7zryqKR$o|eFRN~vT2F(L ztG}burC+?b6-3*Y=l4>=hd{7xs{^&bY7CkSEEl(!eo|7BBVJscsj}hU!i)~|2^ttm zkzEuwOr^xdLku3C>%c@~ITjyynpD=a{>n#onhBC>3>E)NXMrSsy$+mr3f*J8x7xus zMRw73GL-_W#W3>;hwiU^^M+4bTif=rf60i9HPe3|fMv0K`Era@SGuATJ<-}BQ{z1u z|9j8dx8((}IjLKV+DlxFV8J&9tHLlrrJQKD-8hK%KR+7O*QZH8or>k{zP|=pw{f1@(%a5_@0Jz3m#Ey6;FZ zNErEBk3~6~cPC64U0q#5zR#VbKj7+0N5N>vz;_|M6pv8+;DM{ttzhlhK885R`fxF^ zB>07IbR?lOM6*LK(dUh=uGWD8$A|?!q!g}8S7FByd+IkwvBNh=@eWma2 zhsDJS&(u4&KmqXj(z&)>Np>A=PEY5dgje~VzjO7f2#V1Xsq7B-u0mlj#)Qk4Mj`qTLvvM44nel(mcnItu}hJ z0$_wfA!bLFhe0Fp&uMkoqLE-vh+yKfvaIdx?XzP=)lh*L;4)wMqW$2|Yh5h<_S<_l zs;Q}610(VB^D{sJYmwPpNk!WtVm%`xV-(f0fL6xxSyACv?r4r@-TFUSfUBC(SW5lC zupolxbhCm{kpVHB_#y`$pejlf8Wu!Z`ryFQKhw_o3tMZ#J+{cD^B$fmY;%WFp$7s6wrsTQM)j}$}n zxBmJ_VjT-@_F)9|A>8@KjWuLXLahYsw#{?VMkge)5>d52KVL~icuXfL=rth>O3?Np zoNdc<>G-z^3M(ku_{Yk9zA2`(f|egcnkyFR6soNx+<82fQFY*a+l`%>J`O&RdqOc! z#J*MY9pQu=pm^X3XPmIc?uzSaRtMp7L5CYSJZTl@`4y>#o1a8<0^^FRezU^vL19xO z4mMt?9~2liOh$s=GeEUjkjIka!#fDL@2?9l_n(pw5*7xX;NN^g6pG>70_flYu!J;zUrYZ6~j3DJN;@W`k|`!+@}>Z;pvwt zN&(6#<|(eG`7)bJb}ZE>$1; zDN!%5jfj5EynMOU*qz6I@Eky5AjQb_%KP9Y+eCt!B$T~}E866#ULU#weYd}dM@}tMA>(SJ_-3UqS$+eCnE!_CL{X<`x$AA@A za_oaTq82e!tLtvh)9FC}NvB0rr4GMuU}U+<(9lr6L$--jwcP99K32w}J!J!J+F~2! zDYUnqU%8QK<;s=Bw?h@^8yk~TPudGvRDZ_~DwYH*sd0&dve+AKS$gf)wlWa!YVTg_ zvG{2`T0iikfRZz#grp<_A>!(m;Wyyj1Bs&G@@gM3#+ODA6%ljcGWO<9s?T;`6XLId zqfO4tM54M3TKUU&+@v+jTsKVH6xbC(Q;_p6j;PgH73~*>cv*LG<3VDlwR_8I@_D?b z&4A@bVxghROd`t=MU}84K@Vu-W|vjZubyH<1)UQv5LkTvQ_~|{5RyV5eQepcZ=X9K zWDc_{>elW|l=O`U+3^;UFl}O~mRX}CBi8`ced89ltnqmQ&>;AZyelgjks(4Ws-1pw zFfb3K@Cd)LH(29Y-X4)(tnU~FK;r9sPZic6&p}(+=di_Nsn?W!J{d0;RAvS%YWZ3` zYGBusb(*HTSgt@hj-pZxQB(Ad3cS=$ep^mqW?|vV$Q>AnyZ?n&>kFcRGL4fMH*G50 zP*E*qg1@g#S-T4kRy4K*S!>ve5ZoCSW(PSa!FKDLAvFDeQxFuAAOAbx?#>L7fKpcS zyxG#`f2Ttl(_!)G#Mce`9$qt-Nx))+CPi`;5Pj;ySXL1D+R)tW0!08~9=)=PN)(#aM3zb^{Ah2$UJ z&a2?lu!*4}QYeA5{Y!}$q8G8e7P2cH1&wG4WoR=+EcvOUlT!#v00YhLLdSL*Y0H8l zX8@((qU*vMY>3<&H`1QjelbQP2iO1KiQUe_!;|uCeT1N3P#3Z3Wa0tCmr=aN-mIep zr40xD4-d}qxxD0#MGg~`{}xwy37Vy1d=$_Jp2@B!-7vW+`!k{o-9c_!e4DP0^wO|M zXIM#zQb$LJn2BXY{CvREu(ULrigGNlL3Nep|HHqE4U*>mft6aSBPY8ibOP5A&5RDw!OhYv){cvc}SJK|e zeMAEf!zf}7#FUh{4!+C)fm9{LDQF>p=0*q34e=9uqGgjC5zyYgeQSH)or`eI zm-J1ZBKR%2hQfH>c7BI|5E!PC^73Zrf1xzh@6ZA0m})+sm;wB;+RY&~$BXMl6zlJ* zpb-yCNkS)J$bgICi%Fy{xaYCyw~_XosOV@CUKo+FYNR!kf;{iMF5Rh@&iaC7=2 zk*!pZ3c^NYq>y+AP_vbK#7ziBs0nOC&iEy=hx7fqM!ct}gh=aGc%~$AV_Tn<>gl!a$CYu9F1$usUL~ZCg zvNM&Zf9jq%p<3$M%MKf%JuyFKaeQ{EtE+cEI;nsT+lChYzVeKXZ|;UPG;H|4;_B*x z#GApU(KpJL{jXV!F8X5V10-nT?_WM*>?#e12z0&yCbbu=Ic3j}cD_*>Ln+#zrVRoH^lSm*B^d~;y=qS>T@;872NwW*71@F|E=b@vc6Hxb+ zforMXeEJ~F3!T4{3_WF@@vucC;m8s7)P;+V=H1>@MvX3UtfhxF*bfnwc$XN~YlZs^ z$#=Yb`EnNKHt>s1A9{}>RwsTQmnLkCL4DLj#f zZbsxyBCVI7{wa$lAKusJsO-_9@2i}hMw^M7`mhK4hleAfJqqBZiI)ly#2ca`@?OMB z0xN4IlN%Ps*zQfDGf-MtSXdrsPZ|#Nl8u#7X=^;J?VVu5k1o0EHFBb`_*RSzCh(PJu*zg0OY$dq%(MiwF zLi;~gnzAOEO+gmnT|svDF1O`$!QZv%+q@I(z#*npl66f)EVepGbzvhdP;o=V|HITV~tQ z45p^0)chx}jmYSG(rBD^IAvNkKE&4@UG-Nk~Y(C!^&8cu7G^h8^R{5jH*w+sOT zXrLBDrpgq^fc^6`z0FChx9J;+%c{@@+~*f4IH}QO0gyI`xRl<}(z*4^kYZX%rT{8< zELGP^mNutD?jShew2%=v;{ zRiZui1|IwX>3I+#V7S&G%X6y7(weIqYBZ1D2NaS^z=f58mib3(IC|t{s^yd_{jNL&&^z1?fXtw zy*LR=kQ8rN83;-kf|brpHH!{n0RkWM;b#}S!AD(4{1B-KB^pR`2&@H7aYCqDeRm%5 zjUhYx?7l?!5a_UF4{T$k6G_zrI`+Qo$(#K20Bx%YJOF zV$?pX_PRa!r&2zwAZNfBG$VpinZ-9!~E{=sFo1Kv%M6y!^ ze<5R83}FI}M=W&-*bC$VbpCdW7Aq7|LDeHsh`u=y8(}cN5`hJJNGyi7w&~Eum}s(Q zr9NzH3>Z-dfj@}4!JDnmK!h>~Z~DzL$B|E&?F;1~3&ZPUysQLmoP%bERePcAMa9MG zL+JeIZ@+)P2pH}%vut;HpROoWoBl6zXZ~2Ldiuw z)EHW`B~+I@&#Jl4;U$8bj>+%Yv&RI8p#$TX2UcZF$wgFo$HSn1RaolMEWw`!2ENz% zQ*r_Hs=VZ($(;HN52qu18NU>w4lKdSpedtJ^DP1PQ?6WD2kmtmy%<33HmE#F2r{gu zSVDZth4f?5($bPtxW7`CE&;owcT~fgs74-jVJz7$`ISIErZkwEV@a#=NmArvlhCma zczCQ04+~5A(u2~xhhD6)sYy1TmzUQB3Pmz#TrPwSydQ$8{Dtqzy>l4102189&~)M) z&S>UwJJxXB4Js9S@PC;;8Z;z!o!{O0dHunuMwx{%HERGO?grt5E!7@dp`v1p3B~lIs zheAPLJl+2gLKXuB$`do?-<}zH(BA_G!cfaMx%t1nG&yy zk8ZOGtMkBeMi@I6TU>#F?`&B)5P58En`1vJQK8CuKL0@=oDvMqUO7DsQvA>R4BS3` zY8T)Y#nI8x{EN~pZixTo<>ijUFRze3PUFHibIB13pbB`ETWxK-HIDxHkZrJxQiJ0R zkPT9rCwi;nk*Ah9comtezjc22zl@}xRsQU@Zp3MTV%UJ(FJ7)lzE5M;6( zu^@zbAqj>eN~rPS2e_UtD0&HGApADL5`cr!RsR;w_)dHjb_keS0;`@1T!V8@CZ|52 zN01uZs{LnqP4B)02LFC*PiVT7V9Wz$3tAxM?+tTp9R(yzPmRybgWfOv5dM26V|XSg zFf(YsLfW%!Q%6(I(=jlS6H7OCT;UcDH#Rx0+UvCgU7b{WP+=;7sRUpQ4lS5JeUx=R zE{>$)fK->lpWcdE4M0GMH(DnQvsI#Jr@4?KC^__67EO2nje|@tN+&t-LUK%Cp_GOF z4rBmH>J$Pt)8t9-H}Jo(2uKcVsK*roHZlx98TOMHbM z)L&tvE{w`qG=v$n70~AC!w;F4gLcnr9chW-1i!y*|5bX&3Cx&Vu3*|Bv6)B3km65hA zWiJBzkdsq{p5x^S&mH=6$z*=+_wRw)(4}x0FrmzL1v?RfXu{G*WHz2i3dnEeeauRb z)joLeAn|HJ6l=~*RIX8HxAvwK}sCfLNw%W;0Ia<{qhwx z9<0MziZLJ_Q;Qye?3FB)V-+`7;@)T|Y#3I zf})_#$8tR@i}3Xl<79IJMy$jk%*gM5EC3JNf1+{*P&gXpEtYD)Ym5Tp{q6l`U}3;l zYaSxvTC1U6E|BCAvQAFOk%F`E3CGF`0E)n^gWIKx5u?c}`MR3}|Elf1?;e695qJ(q zw1faThD!7kVN_!B$;c4WB$aH|EU3K|G)TsU?u!S<*wO<#K`l9$DD6ZRoN@V|nTZ@o zQ?od@RO~%y$jHQ$O^%_tBnlGc0ozdA1dgE95`u>l;ZS`&2g4T`g#V(G(Nz6Ixj>D^ z+qUT;5%j-5$qB`Z%<59nfM5i>`hfu5k#ZWb&2`&bdL$aVvJd+{JI9=twy0!h5PBn! z67qn;{2WLVAvi=mffGO+AaclI^J;4*Ko>;LbcxvWKM&RNB3+3AuR;4R9NHN2M&itW z${8rR9ua-Qc&4Vf(oum=gokwroN!LWKY$1&5Y>j~Lr@t; zOW!EZG#98s261ta`*xggYxmA)?I(P^;5ndPLPEl1-Gvu$+R&>EfH-LDb-QdA_5vJw zpHoXyHE2uPl*C)XL;Oeo1h{Tk35lro|yzr>3`r*E@4Hna{V zBIIqv<$QJ+S~tR-i^mD9cBT9n@(78SlAaBbRQBGzf+Q54naM$U^73T_OiE-rQ8SiM z@~v;t{tJ*5+_&M>@R_5;SOGjj3cE=2Mt(jssUt0^a!Q0tPzdF^>8K$ksil`2bW?!0W*+uQSfx$%57XDCDoU_Q#-^=`poF>gOIlnZm)xh zhGtKW&Xtv&d>asAm8atQQHX*gG>DW8Mc~1WuR+a$>?}$Sdk{_y5}ux(UenmPgn(V* z;UULT`~3Os&Y3qI9p_+cQxHNOIX^_oeYwvNE2u2CI2CY{JUJ1OUS4zqhY<@WJa0H_PKER zax8=rf{jQ58!u0ec43t3kiJ~E_kM7M;hfI0k2oJm4o0DvESa1U9LMkzfr3PkkkEkT z+Xnf7I7M)>5nO_v!~~z4SS$VgA<%ehk?epkD?8J=#riU$=g!W~h_A?ok(tc^BO~z* z+se}_a1GiJSs}-LNSuI{a{0pnpn$Mw9atOG9V2iNb`i}eyhUwmD+gW{3dKmz139qV zb|7cgxy|`s+&gkvkfK|y&SWhfFfYtyu~H*wK@(~eW;T+%E|`k3iAgOQ=+wXNM-#;| zg{5qLGaZRk9>}FU$6t7c7;N} zMfC}R!iodM!4Y|nz8`ZWL5yE% z^^-ndfv-5cSEW0{!6VqOoKyFby8iOE^@S%gT6#uJO8gKooR`Ccv_5*RIw0WiT1wJF&s_eSMWt zs+;_TI+!hDl?!$*{ydpvKxlGc42QeQsjtKy9Qz!+7wk`U)k3+&DlYyI@cV9!EmoWfg60ZEe2m`b^QILkcOPrLfTIU<}s^ z)MGc1;~HpsB(zJRglq|hpH6xb5-N3Hp)!&nJmM$7a%3^%fJn{o5Bwr<3QjRGVI5D- z1(2VIoJi7Q*nazlo7pI+wR(`~_CNL)Px_jCJ(AVKvPeKYETQ!`5CqO4ywJb<6+KA_ zsGv!}B`+_}%)lUg55{z2=F96?WTm5780qmh*hG$$Zj{iKE^%~@aFne}FD4|IyPiTe z63y5pmS2IdF!{oTCfI)IP>P0=)sKcy7oN|3^wC}9NR-#j>MQ|O{BYbo?*GK{ms5qkjKbf46_tDw`+ zG$<6fv*e%*#7`y)5%WpT6-Z52ci?MU6jUtyX-`j}?`60y*58W2QxSlMr1#M4BJdDS z7m`{-Zq~p-iU{QFuIdC)mn`F>Pza{Q5Jr!m+p>D~Y8`e|a^O|)8GnB-Y=4qFq-@C)phx(O&Wy?l*JnR~ z3~tI72?h0h{J0<&Kky7Og`CHa?GAi!V;0v>$xo0DOAsV+lT)WQd{c2P;ItmWq zlYmhK+p2_1mt^e}AOOSFUgy?&m5qXHSeSxkllNF1+r}d*fy)`#vCsgLvtE{A)Upj} zWq?#qT%i#I@#D>0DU=QtyfsN{;oHdJJu7SL5|~xQR4nuCjlh;70ULmC3G^c@3ceFv z0vp|yqwhg;#KZ-C!{5>S@5}u+H=HS>pwJBTK_nm|HIWMyzJEUl97I$v<&n^uTlU2}DF8-QV4gD!mS=FJvAq5u8i zb?~hF(S?A3hty3&RS&)t0$FrH5X#O76-8lj;LjoaO0MI;d4fS~up#vwp*-MIP|Ka6 zU3Lm?XZC2Lt(?8T0sQ(A?nMbB@Yk-{!<<~z1C6Kl-Mf8i$5h3`lPKH*2GP#4OO zA}Btsjo#Q=?l;Cq&Iu4_7Apze0NqrDG?7os@Kl4ujaOBT0Gq}QCNKP?N=_gNiR5Pu zZVf=CW{hthROkM`Un$7X@57{^VJ*cHCHh^VWVCRT07;pGt1U-YZA9=AXT6*K&zQbSV+PE zQA9YC1nR**=^J6z9|XMpFYD(u+OZl!#sHv3Ju;Hd{FG50H`8WW($v({tFMNR%xPU6 zu}{gxBuG|=lj9EW-UWT119?Wsmz;?&hOUn>&4zM30y&#xRV%YsE*KbN*{XCC`c(W4XNSV?el@(Q$OFNie+q<{SQ zv8}Bw|Mf4~WnXY#Palr^lQY;TTIb>BIzk=;UE=$by%CvsoCZc*PXPyB6`{Qb{CKem zc1;6{ir4I<69C5+G0r|Had1_bkU(iiHl0`|MGn=Ue{+&WG$r5?H^v#pS*HT10O_n2 z7l%LqCc961=hZlrTae{zFK5y~`QSa1TnkvA-kv=x5glNJ2Z14~$CU%{C;X~ zA{JnMXXpJYj%Z~rP(c(pa;;ZfTwFO-ayRIh7tR5~89gqX*G{@pM{XYSUs6(xXrJKc zO(%QLF2yXk4>5{ak>>0g*fOypZ%B(=qte&FRsKDMkE=0|L8kD;A=vm0S?BF z^rBlw;ZzAU@2lEpV_;h%c*Kv}3;L$~(Ha=At8sKR7YCRtknT7(xLSu(_=*bKlWr z$B_(x#+-;iGX5Omw4{=fMfbTQj*h_qhUC^Va6B^1AlZjg=P}S^)3-c(rc)sj-^}2$ zoB&B^^M~hHxxRZ_83zgRcKF3#PnQT&UWsrIflv7NlySr@XpB(Cws{~2>4Z?6LR4e94B)e>4SU+xPwLt3zwYVsTrIiFNBB< z-clDBgHTZ@a3uN#)eqYmdVl||d+4wtfYc3$8Z(7#nQZ?l;DXt#0TQk{oryKfOLp}6 z{Wv%YUSEPUrl_Li0veKgm0!26g1TE0=e7J7{%%H!It&HJM|k+&=hn=4!hqG)f9I@w z1!-sU$B)n}SM0TJNQNam)XO=+sVkU=_6zMX3sMGh;f8n<;ua&2ilU;LF0mJz3}q!W zIeAy8Om;}whnA**n@@B8fv&;%nFLajifLz%nx5yEg{UMeX3yHU2=` z34KElhh=1p{j=V~Q6_n55{-msg8^VNqS{080)|oe1&_7{r#vV$#8gp1=dZEhDezQV<(ZS@GB_yZ zc1=?FR9)Jvg%S1y39Y;I=ql75MVvE64aoBBt-@xuYrb_Ha;z>g@o<-4_@xw;2F&@8 zkD$SvgBYiSvfdF90dl~kE!aHSq*9^LIjo)YYacpIiT)>Ws~az;mj%_fQQfU z7T$RP6|oqfNaCl+^YyF0v`Iz=0FvK>coS1o2_RA2vOr>_*s)00b;;-map?+*k|pds z485B?H7-$!BUiQ{CdA{2jc}XA z#J5&*u!s+whpG@|>wmK68!T!VRm;fbEg+0YRy^^0e0taJ-4Pf)Xk^y%*X4?KBCcm{ zX<0`ccvO2NeM&BQCvob2G!mU*5zjE)zCAoMQxxiK8=@;#$lY_EeLG*VsBuugmegC6(WX`8yZxP2mq=Q zkrrnWtX7^WFOXTct`Q+r5{ZPg88xPsF$!&iq)te{9;KLukN~}`V)2&7mHj{FNX#CU zorDWkt&+5)MC(twADTlSq^;hg*y+vYnAcSON#Z99$JG z9*=(F_6XPoSW$xjE_EJ{u&pYnPb!j!zP%uc*Kvg0c;KibmjY?u?#3P5ghRhHW)BIf)4W`)gb#XQBKnR4KUdMHBuwK1|jmB{g1sl|bTI^*d z+#%7QGKkvv;QC1w4m5n+6GxgjE;E`1G9#Dp$=j84BFbjIYuBLq)$VsVx(f23cklOE zT}1!9aJ3P+D+;eh=rMVoFg(tav@_7t$Ynf$8sr8%VtinApgmSl-#C(B7ot|_T4z)t zuwkU$kV#n#Xu$HL={Ck;3DQ*ZW_MCjQu?5dk(LNl-~{a-1O?(P&|~PBKidwRC4B#DvX#F(lVl_YuQzTIe2;KJjbvPh1 zoUkPf3=D;XD*lA6x3=Qs@6s*{K_TQE33S6gL+)73KG%e~pYeRpR_3`a;IWt<$0JAL zu$UMqzb1O)Vb#I%j)@sjCoP;f)0o&!!TBX9*YL1OBU~=3opGIeO_&!=6$-xj>I4qs z62+UG-rQdm@HY3xSH4t|stpehhkrK=CY4uMNK;DwE5ST^$pq>hfn0om`eI z-Af75U!XRTb8*CJ{{Qc>Z$|Ebs6qki6tp)YiYx98seyltL=U-vhiniJiTuM$#kU(H z_6-584f!-=bj0CtB3#F_^e7aB_R$jf7-1dN@ zQ+2r72F|@*Gx!}5Bs&-%YaA`RabpcR=Zk*2?8et)aAB6VlGAR`B}kV*{5vDGGt44Y7$s!$NwrnB?0gWKzy!nmAiUTR_-zD~;HA-^Nwyyp=)wAIT-HMdAhUI&;j}VMO@o}uAPYN8czF!G!JGW>*J3*^C*2_oj9w<4(MDx z@)Jmyf8hwwDD)ulfbm@ubRb?3HtT_FFgV0vBo|KMA`!G$&7cJ#a%>oPm4S^dNA^!M zV0JP#{_A0KIT#K|5PoaAZCmxBeWbg_aduooF)apjb@TLW_16>uMRbLN<&4924i7%u zy}JQf)Jy3QcQ#@^YW@hift}75^lT%Y&5#z$|LPH|@>SZP*4ltyXV$qAoMk;F})U&gbdJy+Zr?k~J!Kd^-E1LlKSK((^Y{mkN4TA%1lKH+NCc`2z!3=Z*Z~KK z0t}NUrXx?982_Eod~liG6%`&VvhMpHE1*$pt9|~0%-1#CAq=>HO^;{b zWM(8_5qGN6QE;Ppy0S;ofq_K~nW$XR1(tB#E^ zym*GKr%uh;2*2w>fjEcjsezv(pvJ1dTQ43)=`^~;S(0+;5-T#VIINcgy$Qx3IhKS& zWF*^$6D)UM&RopMSWfXrOwFhZqCXp!kM_tWw!UQk($Ozp=qa$I!wmKiiQNw(3>^hM zheC8Vf*VPk8YLZcxfmBL35v#-6aEQk=k_vV&*1R$t6HnbS$7O5xzz&|#^uwKMBIWU zcUAKgy`EmZtf6n-I5db|1nAaCN!V=VtK(?F* zKD-%*i0cghgal{I%;JiF?lCp>W%x>Ra}-?pf z)zz6TO7U`$qx*1-j>L;#EBBiRBF>Ph8F6x-PUBWXLnfdMdQZ=ZLu)GM(jiIe;t2J& z3-YMkbf|jds4-DgKyvHIT}C-yJAeJme|n~GSH_hq79b=DAyR_9#yy(Sy{d)*ElPo%bH7-`w+o!CG-Vc#tE_B0hD)uUH#A@`Kr)cW6-L-AuMblZ?NEZ4e;t?s zUT;0h$yYHyHMr|$4;I8mRaG}iH+0XppxtlJEm@Y1>}BykA6K3CSalMUNSXw|=?=pDiz_MPFI+1pcMkyqr6z%AFJ8D( z(xIJB&cP=DRCSXV7vK7+$a?!cjBGO_qeyIr&fgW!E+mdyi2P3$V4Vw4s@Cc0D5YPe zqW3E*He=^ZE**O_{S)U#oG4*Bw@#*kio71tsu6HOT%vCH@wPpCF4B=4h70nOZYa0Q zDUWcTahsXh-)xs#+b|BU_)Ou=KKi+T#NTIYLy0<@J9hOG&Q@ITvZz_n(P?04=!~0I z({bq#o;@5BHUM7G1jy^;>bkn)&F~j;42p!*A(GGnVM~{i`~kT(E|~8BA@0q?dfeN; z-!D-iN~T0qmMLUdrj@x2nKNdHB6C8LXdsl#)gqab3Y8{ADalmkAwy9KNfHgHC~3dW z_&vXSAJ0Dav!6fq-uJQYV=Y57cMr1hjjep$*pAR0bME- z@M|Jq<1YZdh^SO3c#th|+0q3zs2o3g)-3%lT^b-}kiLj5=VNJ1*aQAd2mzYBYtNrw zc>eHWRMb!qOF2Sc+g@2fdHpB#^jax9=io{wS@|1(mZ*?!So`&74PrVjkl=E8)y&bO z>m_@&Rd;r-^h#6#bCI%3!ab5Qer1z5z;mgk=+vc44yU1{7)#z545+A#=!~@nIh~K1 zmUuE{dYWXsa$>-I%p*crzwN`rtJ)#C02SVXK%#0_b`x4(N^>czEJiKuy>8d#uSZ(} z6|*TtZLHoP5DHb!W~^X1WqOd?>ho=Vt}#BgVp67hms)mX^SDV-T>K?>ERV)s$Mffv zw{PbQAPmTMlM2wiZKi3C=>CX}MLqL)!N8)DFJA=i<2N5T>>IhI!nDa`_5Z@ANOA}8 z7*<}GRRaAY=6A3uo8BXOukQlv%nt1l8QHzr49j6hMk*;Jwia)2VwtATfJrr&&nWWo=G3aQ0lI`XO6M#1P7aH%A%H z?TxfDwWJU=YEA+wB^*LHQE>G z-4U~JzpwMEqjJ9M(E3YbW;2KmiqdoH!evg-F%7x!5G78u{;OUqXj#Q^O-m=*T8c8J z44htNdNFw%+Xux^(+Q8xTBkHZk$n`I$%@=NzK@wRlB!@{YeNVqAH_b8~H|_?OdJPSYp)I2OD7YcA)03{W zgWk~^bxlp}+=FIk@>n`7i6f>LAYHO9(41(UXw#bKKbkZAXE)2l*3^eo|L?h<0q|lu z5cMf+x!X7>`@M`Xch`7)JVM9)so9?f6_OLU{&$1QQvKbab})p0M1m=b%b1b81M)N`HvlB}x&Qg)= zXM+=?V>khoQMaM#*i_KzT^CqJ2`S;Q6b`bt2FjWa-JzX1wL}H+8&cXyR+xVK_I2T0 zqN1W+8|gQ;?mjmmi3rXul)zJL)+jAzRtd5LiH?J*t?5h^@~sLeoUnY%!@)ygrF!b~ z$&jO?$CF&wl)_7DcyuQ^h&)EJYH9%ArpBg9=unnUhQ*dSCF0u!zDK%BJA5>%G!DGQ zV$@#^SukoG`kriclWo?t!$s)Dl!bW|t>~KH^V$r*2ZDRZ-Ep=*hr~{5KiR6TJzvZo z7|~9%X9uKVM1J5tH=mgZ=5-!D4xnakrNV+*gyDwwmsj%lH_{GgPkD1b3s;b+ z4B4MWd`-I{lBR-fL7T+m27ZW#!i`cT5MYQfMu9H(cb!?gUcHKGFAwl|B_2WEur>qN zB|!{t(+bS~74&#LoFFw4@gSZw!Y1R#Hza3+k0IU9(`V1(_LyoPK;{IrUYjmKfM)6{ zL4s)tq}yYa==Yd^LseXYV2bh}xAim#8XX8wZm`^SMaG40!2Wf>mXK=cfq_v`*8stP zHJpl4dDRD#O+$&R^FrdC!^O`yx2PeVX8#GMAGN(wq@5SzH*#Xx;%+o;mKrq7x#VqK zx#Gx3b;Q()Bmm9gpFiwT=$TBJvNy*)sHbr2Lv;xm*3}S!8s0!d>R5o5kS-NGKD^s)>AgQ zPcLJ_j_qwc2`iJ}TG1r;RXpFMF}WKzK=SHpQ@|qjIQ}06tfpqv?*jH;o}7;pCXbpPPiM*EMGi_ZJUXD+h zaZPyNVBb7A=7d}2roI_r>HgG{ld(r~sOvZ$J%V4!Q*=FUb3+J9ffYE9*y`kM+t!%< zNFVV^E#lVUlAeFKQ+{Xr6u84;cE3MR!8HJ2KH#_!y+a(ivCjQz$cAItZCN| znt)vAxA59EOQ@wm(DqvbXaYP61j;>^nEcO9U{mxU687WqWNl?-rQl7xc!N52e7EtH zPDRAz+(%2;DtfmZ+XO+ECyG{yEBgICD;f+PzWHHZAY4R$^!sd}h$e81VDorQn5ot1yh#pJ<1}0k}+eBX}s&lqJ(b@^~Df9}cCPM0e#*H^EMcp+iSLtfGmRodu63Oc|z$-8+DkdYWFhNPdmQ6cYFMh2Q zBiOj=_&==vU~ihUh;18$#$IQOhW^MKVVX^pFjoms1FC_=2@ihzgpwaW4a#vCORyCu zme((z=I!Y~SloeB|ER%RqHjNrf+6AZMoUDJQaq-nhJGzs0rzURE8(NFbS2;$tDQ90}lvJH?}VWA*eOGoS`I8HUVMOA{hpv@_H8)8nIXYy|GU z1?+}}6ma51?S%_-4f^%z6Jy{N5*lhuE(|?_D1bj~GqrWVOSZA9v<2MQ@t~j^H9PT= z$sTJ6@L-L}XbS28DWe2FW;{r7_MQFVV?skir|pqM$o?oOs1pbk5OddEW^6AMRt~iy3 z-cfNYKXvih^XD>+44%cK`eS~+IQ)Q6QMsJ4i~bDwN7$Zr_-y(`_=ou~&Mp*i^|Af7 z?~vIhlP7Bu%_8Cp$QJ%5##0~!l`u6O(iT09q=@Ir5TCL+}&ZtS6 z0dmRkvwWo2AiCfvlaID;)p+-pFOI8}wU5_ok;+|{oL6uPcaN`V zFx;p72t9rJI2pI{Wzx^<_C~zr<1=aR;XCHwx-`u!p`Y)Z=t&!I_`a^(c*$3!gRv zzLvC&q$CAP6&77mY|&T=mdh;?MQ!W0`$f1S?I1B4pdBH*4m*EdHW*#n)dC3$r$MiSN#k+UDrH8e|)kbHGakO<#ZIOOqVWQ1oHnaWI;If+GxdIb9i_u+2~NOWzdBJA}LRs zHjTDSN1}yLsXS&`N4K&Kik1-_?5!R{cB1P6TetXbyP3r$%{d>les!OI{Z1Ly+C7y| z4|3?9ojL7SD;=F~U8BV88fTwpaK$pe)z*(tV+{)n3u&_hleK#``yVYe0&jTg`8P4a zP^XTB2ZR}H7~Lu8+_`gh2#_oiU0TW?ARpmP7V795F=)nYbcS1tK`G5dt1#Gv%LwD$9uZqF=-AvvKZM83E`YRR4*J48E6k?hg7|9~|g z6c8sAG$(I6*yuB3=JZhXQ}T?tO~O<`OrVn0S0u4`XH0d3-9rW1`(0Z%$+md@ygB;4 zB`?mlPqQ=abK3hC&3r+d#U5)AN(gDsgf>w)0=i1>F&aN8-^Y+m+Ra0Kh@-xV*9gq8 z;gLbk@_l6I!_XisqV#H<#1<({Z4h>V_OwXcBlZMN8;${rP8Fo~^;WVbp3Wb+tlNMA zvuDg0g?)1Hl7Hqa*ck&4z5GY%p%!AXdr{fh*cPd zioIale9?`G(@Aas<&8dcDf`@q7w0;P7nUtiGMJv8ojAM$?J^JQCbEiEr5~q3M-N5O z#ZmaZFuq7+r!|1gzJ2eELT~j{Fipo68uQk%Ay}jpA@rdJwV1XUrM{n5Td0_vQ?#WP)$VnUHIY8Y>AZSdTMD6Z^<&QKElbv&Ib;zY5wmuyhe{(>)Dk=;c04!@%D}CD4;x6va>uMzKS& z=L-wWnJv#uggU5Aj3-U<$+_V$7S$+)W6ch^$*9UOHYli$u(_-v895ceFM&r#@P+}Q zVDTC?qW6!kY#ai?$xVS|-!7jU^g~V)3|NHpKXkZZ^cCTVq{(qQiAYTpV?@dbeJwV0 zG%Hp%He*NhZfwIo;eoP4?yj^qgh_%nekc3q5uW${0|t;6_i1m=y?%d*D#qa1Xg#9S zwsIa_W1a*&<4`(wI|}t9M1bSw2$&ahs|BcaGMX(pu`oqtUfI}IXm#?Zw3iQ?!$!!j zPVgjUSH&q+ALdjjL}8J!$D={G=P=GV(G-+HMnAP?6c=X>e1i!v0=-!cTte;ZGT6W1 zfTehOI49p2DeDbab8*lkRBox9@K=6*X&|>6OALrjAZAAgA1@8X%2OkMAxtSDr$=6X z&SoV2o9QklPni<8$Gjb9p76`_mMxRZl8i%|rRyw9vaU7HFMGD5V4M5X&b*;A5lXmR zNoB&|a%N6^bL1H)K2>7~S2Z$wMU;L!4Jv1mA9>I3AC+I{MB z`*&l}o{6}b^G=qQyu1J))({^WTl5}>O`AM_Mtkk<_wWM{dI>ueLkoLEAge-@ zxoOc7ZV3x>d}H-55wr@)v*huKk$rAI@@ua7)~WDhaIkcaPr^TgJvHMepyoOS?rXb%Q7k*sLXiS6X@2`iXmGn*fZYo#K=m#j-1K$nG=G z+FA*a3}4P@kzzqD$We&?TDNQ0UFW(=_}y0OqTfze>-&(BTI zJ09yFFTu>5iaj7xX>eERoEj}Au;~#N+X2{QB#78NP$0(bDIHBQL?33t=_*ic>o7aL z&v+WxNhOtnt8TvVq!$gtAH_z8{ntCSY}IOG5984$mk+$Rv9rs>UL#44|K$^)&MH0j zhAvq)bvd|15)QD!Z`!yPy8iqxDMy9&+{}kr?6vb5o@9~odRPCS$CgnWNt&+zhKhQk z#$$)M>Ja1=dPFxgA>l~QU+x+a&z2bPhdiD~rThm-sijb&GC2cq!oM zw8E5|H)TjM?@&&s#{FUku3+K(BsObZRYf1NK|N^DpJy!4Ac5ot%TCS)frzd?Nd6vI zF1+&Z@VIGVpLcwXYjFH_qbHpwTsZ|Wh7?f+HSbS&Dme@AL_BmjqfYOnv~Iw+E_y*r zE0^zF^JfZU%fA;{u}hcwgiKmj`mq`Fr$AcNA_AXwvFk6_Lm+f3773cu^_M@LW5ea1 z%Oqs&HI1tV+kIcJ`M7bKe-S&s#Gev-`xcpjMamCFjO>T57rfa{u1E+Kkmj>d$JE6< z&8tD9f_3DkOmbo8HYlJ#5>qc=J`KN2@sv=^WG!K{sB$UFOw-4NAdMp1@C{Gvnk|*> z|Kx%TJ%4P(@ZmB%Pnb#AFFpEjI#kdErW#zsd5r_OjzShTWw+d9@a>WpIWF`89L+M7 zP0n8Gl66emDK3HO5)@b*sqDOxl!AR{ZvS@~d2OmQOX?~sZ%)an=Q$su@FwM_$6YOJ z0rTN@1WX+4ug*J%R;e`$=Q=ORl@GBaM$k)Q7Z4(xS9^Hk6-mXX^@Q@CKWX^?o(jeF z$gyLF15f?83MDTBxf`1yF*1$79FUF&QpQLX_}%4K$A_NX|LObsYu*goM?Val#PSXg zP*S5l%~cYYP~-XjkMTTDFG1a@ruZ9NVMR_=rGF|4@QabN>833_3k1 z8Q)Y4~aK%X&H5RW-$c4L`pxZX20ja`3=`sPb%0-@D*)Gw6?|n3-W(M27{3 zKd?c)dh-;Z@L7pGl+J(uy%#m_SqO-oE|x^2Td{mJe{5K0&2Bkv`t<$GK>Isct4r6e z3n&fODsFw*g!sFM;uBXeZU5ne2kTY4 zL1G@Rb-D}<&~}4@yu7>y7X|NCcB4Sq!*%(zxejokn_n-OiTLdjb3 zDW}h%#5-?4%qi+_!%6L12|_at!RGB-w_G0E?VJUL_d=2ZFL}{BC+C#F@}vyEwmyCqB-}UTM=E6@Ki%#Km zoI0~;O5Sz9HW_&reneY`H#!+hvntw4jVl> z-#%>n4f;Ywg3gH7b2K%p3w$(j`O$qbMCM&!1{43X-c$&EM~Fj9)bX-!C|p(@@wHrO zzGp0AwM9}0Qvs+FbDbQb>oW4cv;ezX1%SyY`W!nN!NjPxT}5t-az$`Vr~*Msf`W#p zR~ND<6+*Yau?MXn{&k=BpbbFe+B%lw6E+_CZ)<2t-;a9{``t=$zJL36Eo(KD zwln{SmgX9)LF2Y<)j^{GN=4hvJ}Z|6PV4b7*XofA%`q-oKM1Rzn+&+g9y@lD>$|MLf?mVc0TiOXyw z=MQbIkbmw|i|k#8NIjqYojczKb$G$qJ%ddAc%sp#OrAVnF$1sw z2gQ7FFg3+tq$L^D-x8W-zv}ytvciFep{uKvzAsL9)GBjrS?9&LsTwWn^uA%U`Ou-0 zBj(=!_-b62%li*~4q3R+X-b!`PWGKI2L~G;+)-zR?(rpOx82e2v3zrn>w}X95>|5m z$3JJAtkU|PXc@V_At&v7=L75e`+q%>cjVxm-ImjLwOYPx+1ve>@dEXA`nIIQ-rF;X z*Zhi|=ZhYlY;h;_`d*WS%6GNq($rv?;c`H_r#k5@m| zF2S{PhYnjS2Q=(0DKN6jQf}{xR>@gFvG;(|X!iY#XAh&{UX+qzqCHPdGdFh(`P?fx z_Tdxl-*#k94h(+m%S_(!6jT+>S#Zuy1TFHq<^Sd z+IF{3q3coQrO8?i)YKNxfWG-vQg#X^t}m49A}gz;;rfj;64w9Cs5edL{9wNs^pG|y zRxD!U?W(W8xt@pdqJ;}@&RzGWF7QWkH;*x+M+(#3UV=Xpdy|5dg(N8FL-y-0T*V#ZiIz|%;PM{ov>Oe)PuwI}5XkIjH)*q6$TZ0jYC$u50PE!X0&Y zMNep3bf`d3{ySGxBzp`kklEN!B2Mp`qI z6?5@KX$4y6V+ zn+>9GTNmN}Em*=}ASMBwF(r-ji@5VBgLe*ov?r!EfCb^tGN++Mv9(#Y>>7PJ0eR{? zS^;dm29;@LFT`SZ>Qd{VT2_dTgbd{nJ2Dnw2-ue1y|% zd;7mh4ICtZ#>9aobr@OUH9f6;;Y8T#?`0V)1#+b0l6D_scTw@`UG8er$hVO029-uM z<6|rse*(hc;x|H7Z%%5sZbJpi1_>b&Bn%57v$9>1$|i7xTG1|AsZR*K!NU@aEb*@X z>U%|=|HfoM_maEauSnRtwf6HY&?eE4B(hzl9xrwCbMKP0}?PRPGOXw(6~p7G@Y^As*!HnK`g|uHV_E&5I1OS zA1vg(NK_EP4~<`NL0A)GW#73CQtRV!Tvrf& zQP?vYXmR-hM0s$!G4^7D`F&lTf5!yZVB;7kfkboIZLcGtlbggAFtFrC6L2pVzZYS6 zsG=BGwe9A7iM^wZNyp;_B2$mdHQs{Om@EcBwSG7B)o4$?7dLxd-ciRM9QyK52vZd_ zgJow%s2lswo9!KsxskMyovUeV8d-3zdO3WhBpri0-I(7~R-s@pz$=m;BI*zZtMf3w zuD)#9YZZE_9LXJl$zelKQiyt1<}*X}H#~UmJN+o`4#ZHZ3Wk&!aib-aN5)ru{P2SdfN=zL1v@8m0)bf3{XGOd&&%7{A={mdw!j2V!U;qq3eisD=}i; zM5!m=5>q3dKY{Dm#}D*cSbwcMc);%IDo_70)k%LSyi``IV#84#}F2E(-JMvEx z;{flXUMl%3Q@enNSvv-gGrGrGQa%0zNK$eI9|8575cK}a?fnU731GMu&$YI{{c1&yr4btsY$p0KTP zdDq$e#R`Ps;#gSwQ1lgzcw%Cr7uXZZNE#(R6BUR^br`uSvpqh49`s@B3LB7|D01#}QtW9{|5B3RT4@1XC2v}ZU^U_yE!=a?Gu&^jjxAv0B8xp-l#tUFJ#>n*%hl&H@;##uf0I*3u z1j|4~2&{w?{JwEO)UyX#u1}8ls=rLB)#V|d19h`1mB)E+*f*|&3A8@vrYDb?;(wK8 z>F19h?^Nw=OM)9_lKi%V)Oj0Zk{$lx;A34wrq)N2ATn(L&FzAt zfc+D+7i5Fv)GhSLTsHTrA%Z#K?!edB3ZS)fXmGAcmX``-CpKOkaTTsjsVv}!J`!T_H7LbsPaq^vXBNg)o7XA+Q(+QYY7vLI$#)Y zT>0Qd3l_ZQAYZb4c^w5*`|5y-H_i+nkhF^Q^aFV@x(YK(OMwso6<2Ti@uu?5oiPeG zKJ<|zN6<3e^uR#1l4;P!)bn{UX5;_kLxemn-9~zZj*6d5y>XQz=iLOj&AVtu{aUK!f=^daQ-%Y~6pA0>nKtf#Vbnh(xVWY`$iu zIq6oCWb%h0htKwYZbJAdf0>qZ6vAbZ>zJ7-qG#+vBf>t$uwGR<*GzlFl(9#TaprR< z@5_)2JW)1URnK*J@a8qMDVL~)8*6Eu?mb7}r;|tR5&aWr_Rt3UChB7KQiDO3rBN6j z9?oFbM(~#h4jnS?)O7U_^>2HZvlNMsshWNf9{^H184#TR>rFwE1|G)ShU@bWC#&6% z_}JK_7cUM*)E!_-SeQI2ynVb`;cfiJ1dA+#BQVU$@6e%_2I;ljpbm*x!K6?ZyafrU zM7z?7SsZ4iY?fZ;azMbmjp1wkLn9+ShwE>eYTz-|V8n0XPpp3tDNS6AVec**%s<5% z47`-{mY{{tu^3UWzIt^m;<>S^-oTdULvA5F0<{))X!anoHm{W?(HKaKF(Q!6Dr6WE z!+_cXTqMRRQQr)8y$OyN&_0d&9tgsP;$-s;2oJwMC&%2xByd`PvwM|2ZU)Toc>jLU zRC9Bsb*oGh*daU5%$63z^@DNIW#bPl(OTByX$?*w7XN~!jLb~f>Dw^%bSC2K&HU} zo%G-?asFY7i_ItFalo7JkDV3x8J2z>K89J*(?|L95p;dW%)TGCWMzF$G>PVLaOjg} zc=+&PJ>M~L3n>VXGv#1%NK?)2LHDb5lD5oSBElD>(N0CoKbNPobZN->ClEd+CQDWI z7ARVsA9kr7XP`yV?8P(@8K1H)1M>W(S&!f2%(`VebnKWh{Lshzw};h;*RBWNu2=uN zSFdHIF=;#8WP9hc8me`2`pOG9Z^42(IyyRruP;8^IU(o9Xv-(hp5^YbTH~v~#=yz8 z*%0$-)9i+zeH*6lGt|&8kkVsUPoRIdo?8(R-pXAaJlA5x2it-eKIg3Q=I&oTI~&Ju zp6~er{f_t+d-n$TSEeVydE5xNnZO~uRqh2dH^%y9acXD$qxE6bdF=3Ovb@z&v&d9X z#f~*N&fpfn{2Qn_s--5(6aP?}+oac{&c=&2p4e;4U;oy;PhtbDJ54WJdzBeCVVSvm zZ}QsQ+p80#2fsLNSU+{(2~s@u+%-;I>SX$L+h*bjHH^1?JfVBPU44=#_*EqN&F3Wgo!}k5##GF4r6pc1(r)YA`@0#|T&wL`UK z=I_6AyiLtFtGRl;aQXPo!w&V_O8szV?qzM#ThWus7(XGsaji&TFdQDD@ar~_mzAkp zDQBe!#EtCh>+5a$mx#_8hqMzNnjWfF6kl(hq9kcvc2ivqE1IQDn<7*pw6?-&vviAP ziX?)13Y@p^Ls+Den!yCB`TSk+&M&jE@qHeUnApbOsw>H-ct}b8Vwn@2>&_iJ=F_OEDV%B3XFz;ZLdPAX=}}68y}k>Hd5aRJ zrQ!maSQ3g>1|D;cGlej+c3*)J{kmDi zn&mqxmNV51te%%H9W);?=iLJqhKqOgT$}emM=X48e)UHHu!}^w)mJ7SHS)zx+-v*r z)Bzg@8apkaf4!HTZMjrC=ATp@)K!ZVGvJG|gT4Dcs(g}o;a9cKm94xi(qDl9epuVq z(ca!#F@u%c@AJ;?iSRlYg75{$#mE1x5Vq>@Vp@4M1@PtMS+8*BXelnhJahHCckjN3 zHyWC7)mMD(o90}0@~xa>=-0*eDUyh>_<2vAx;V3o^{)0EI`mT5ifrvtX+Qm-iw@`Y z0{V`+w0ZN(q>)7vD?6E%57vHpHSj^QX;{dhbOD0tW9o zI6tH*Y<)gh#BQXUoRCG%of!FO@;cwaa+{~e^(&BtE&)C677^i0oI5V z&^MpO;gW=HyMAA~D&^eA`l#NQV^(afv2*OFcT|D29Axc&k} zKx}WdFw8r7dqFP**Ey7lnZ40x%Tsy&e7{$(dM&2{C%{8C2$_0kJoq?&+cO|Quitpo zRV?D`&~86E5!tzI#|ho6iIg?Iec#uoVn>OVSp+6Arqw!Q(}$qxQ>RZqfqMIyb+3ct z@*SHr+55|2r-tz@-C-sJDn<_-I`q`#dz9Jh7>V4OER?a52#7C;s%>q5e?S___sS3h zZv2+Ib@Mmq<2J#qNnS|IfQfAOa15DV(;D~sPI|j4t;grV5rk9c9dmB9Y}vOWZ{F_m zNBaZY!uwu%_U4@@mqT$>W%jgnuGh9u%X;9@0q!$^P$L}uag{bC> zS!2B|+44IBwS%}GpsHei%ia5`+vYVxoIi$~dYO4#o!mL5B)tvLH&(ua_`2`JGFwnw zcJ+0qw{e54h7P;r&xC@L&x#xI$xvnNk`w$VKAvOi-?t17b424ozQ{F>s+2oi$LU^F zVC&Xwd6k*D3l_0t#-EGujd(>VIKlijb;}n&Gw=6TfByIy*N~8IBMC1-S$Ql>f5EC& zeU|N;Tx3rjbj;~v=QdsRspCGfH72E{wb1ubRU~Nz?meoS-w`h#h^ss6|F`}y#c{OM zLt1s09_zGqHP1~#fd-nJ+lMQsOF(hI%psmsquHny-3r^YK%`%Q&SK+x%(W&b zk7Ot7d_V2?cLkePtXuWv4Q}p66sFVDyqT@zi3y8NWgZO$s}xl_*;=QwpYQbEG}6$| zMBnE)r~_Pt#o^kI79Cbfy5B${sbXX?P)|u2LMv@NYSgJ`_EP+#RFRHh6Rwtiktb|5 zja6H|>|{FR9SF3^mSxPZ?db*my8BNzSa34+~DWAodi_M)^DtoJ6fmnlWRWAQ%M$I4in%OuG4yGLI?D9$Y=cW#ZZx zKrTrH+@P8ZGB;oO%=rxMowaq&^wMe5r(ZbK!N*kB?{3`O3m-o&13oe~@I66?!TER^ zhYpXk#W$KDGxyOy{!0r0?h$ZaDM>45e+cdmZU~Xo>@Llv=RS9i)WIeoHM*MHtyZjf zwR7Y8UI);z2couOjtNNgW+1q=rfnPDryQfg3_rGV$&&O%ADV6-o>@fsDB9Mcx)NWP zwzcW!vFu8meF~ob6tk{5lXkQ-^_qOXry{e_x%soWHYyHB%PCWocoH;GD;6Io0F$FN zvq)ONwGp^C=u^>gi{*e*Eb~DmTMr~Y&esN*==(Z9pz1GPY*sg)O7V|1M=%>owid^l zc{+=dXXQ$D&}8|H>>tQ!-qsF=(qw1UYg)fDrtHGp$cxL&>Kx=703`sq*q0+j5%m-s zEgwiRP_>`F&$b570jvOs+!^eMaKH4+ZzJJla*4K zhwu#<`|r?+SgYtRWc7CM`R!i zUtc))afUVE3G!GJ5?168TIjB!PeCcgi@kpCmS4di-h3%5Tj6+&gB|Rq%V!ss=xes2 z??oG{!@gZCB}<6_tdYC4YJu8GHd?Z6SQNC6_{g}=Z;a2qCHbe80x;YSrJN(w?$rAB zWXm?nFW-M?u0Zy@YxxDAZ7v%h!Xi!K& zrF_Gu7VYK;B|}pTufkBu+*2TMSjKvB7Lt%4Nex#w*ZqSr1H|8Sj5A@A8g6B!%Telk zvPJXeVz`8h8wMaO2~iLNZ8?F(#tm`}&@A!%+Rj;CvPOW4C65)o9=bYit8%ebr!DhO zPvCFL(?UN5Y-e_S@+6@73?Emqp!`8R(X{cRNI11fWn=T8CN#lt1)N8E&zoQ2+>8dh zeMy@jdX`mmVuk~e+BA_%VcwFMf$7lrJday+R5ROQQYEj{Nj6YDE{22?nY_v6%jc#= z6@Z>B-GG3A-mQcDWU>niBjLYV9Qpd?i(+8x)5H8!VSFS=YyJAGw{LH+{Z(WBiWPfE z?SL%qJf4-8f(}N|S}IP7mi|sV`Y1C~4VXUIN=Hk})chxhc;8~pAp6y;32*R#puLfj zVq)k=GGGe|3K>S(0}j5>=*HBq&_@65gj_^rONC8!k{EQ3Sp4QTwI zkZUQpfx-HAuQy8h6xg76Fi?&5XV@}W7iD@6=d$GkD?gpnqM^xd->B2Bo?!U8XxG6l znGqnT6+A*?q;(Db?bfV$7eBR^Drd)A-t^2#*YRb@t)jg{XCgKu*4lCKMaPgT1UdC2 znDGAn vWgEl^<2bPWkiihv}Hh$l*z=>PfQ+jUr{zgRt<_Pra$dBqt4!98E(2pjC zA6o{+u)!P|;3yU|@y;L*k+^+vO;NXz|C$p&d@f{7JM<_6R!_08Py<_+!Sf)r!sIt} z)KB27>CgNeA$JJ9K&3&Dv_hyyE*R}>&kx=Ajvi)f6q1w(WN_$tN{-02P>GRDT zc@POHyB$_6Uw#8gl@N%qq{{rzAdT@xFk@Q@K#+Th1|pr&v>Zc@|6ImDyvkDh?*sHn z^T?S39KVVF&5Q;PTgb4k%_VLEdC+l<@ycDfc?mzi-2INKY!XvL#B~Dc|2^%>uexkS z152My;gVN;&1m0BY~34=7ClzKGvzY$$<>lJ&^5SQeq$to6wq{2wLlSs zA0RYQ0R=8`v>#3dRJopvj&4k5kc6GfglU4D1hS$#y$Q=H$^f*`TZQaxPNB#qqC)dK z90`45#m6pEfdN>!vl+kIP-$Cu*4bU7m)6f#zr4f6-%nfjQXc~D4 z&PnFF^Ontn+n08iWE~;>VCDOUOx*#*BLlABg>Ik+CMO;?R!ykS2=}4N4NXi;WF{}` zSO(6F?S9!^o&lxTjOh7w9k-8UJ6|}cekwK20g~hh`gr~EqquICXI=80utDGT4&f+b z34j-@&Anks)uI4rjk@?f523hqDZZ*ALHDEDy1Fm+cWq8lBN7c(eUjsP_ivryauTY4 zRZ8j+^T&4KmSl+O8&2H;wBkPuy)=xS&_z^0)YH$5fXNew2fM=6`}f1UFKZVxp7n48 zdAq13bdhC<5}tD-dtpog>b`ZKqEm{Apc9^&YC8psJ|?2Os4>2E0U{6s1;}S(_cJ9!ejBETyG&%}_!3-Pf5~U%!+-pyQKo!xJB( z8`-@zdkMh>#dDIq=ac!&b7@$V@U;=A%68J*{fhooDE|18*z6@ghEdnUgOi6imd*S{ zhyZ~oPs7*tf0VJ3`#kvjYbB9sV9t}jxNYUU*|XcWoN8)8mHKa;;TAolXQ z8Gf6;fj{nMQg0)ybT^0mD)CB;2$=)YNsw_f;52IU^@+{YfpXz8-*)@`9M(SdgQR^X( zG9oF;23P;IPrUoOZg%x4SU#i}8(#pO%uoJ*&b&r z20fogb>Ui}ZL-vvgh*{2k58Nh0zcj0^od@RpPKmK+md+PwVwons=1Bxt^#s zcw!&Hs-IWZ4 zgFT*vw+o@dwWm*;!nn&3c2SM?lSOC6CCHOzi;(yeP?gnRr7{D{5-kyHgSFZaUM>)h zS;9+!Ms`u!D3Vy3o@_}}`D>Q;zenx>u;{>qAMX$IR@^`{SBxO4wgLdsjzk>^RhA5A z5=(I7)Wrv85xc4uW(Ubcrt(1I@YrDJ+6ya)uWSeuQGS0fM4JD`U;p&m-E%88=A4@? zEMoe3p7=zJ!yEQ3-Te_uk` zOB?ijTW55Yl9oPh(#)AJ<{kcU`%*2Pi{}bY^v!UTWlh7^@PK_A)s~-@I6roBe!Nh} z!TjOT0e;Nk479wIoRNyM3k?sSQaLULNh$@n*)McHjm?5a(pgD3wFlA-1QL^2>-9|!LogUZqWcSc`4 zV_3pWu6g}>?(C3XiZ`UFBy4}s+Wt++>ND+*0+ zUNnVlFGbh>{SVAuVV*YrFU=SumlFp%_}!femH#9yZLuPqgX0FioOFbAWPGmul-?%X z-V%P?niQASR}vQ?4Iwmf692XM7w>g1=2uQ?7l+6813$UK3&zfckd{G$6iPjmED+&yPfpZt%ESloB@ow-uLkn zhl1q?KZo1QK7GF|91Q*tGsVxLoX^X60?!^;wrfuLtOWltB}JTC#tz1KwDL`U6$h1BYH#`yC|?lrAVrWkB6A7mJHm1^<9X zh|5ET+(aRRLoJ95R?G?yduw)+;4XziX3HYKD1K=ZIggVaArPKXyylkni?lrxi zLiQ^@76G9XgwzBoTC!rr`(tU(zqAcEhtcQ#$)B|wDRRWR^9;sN1emEF9QQnT;kOnn zakjGZi~{g!>UH&4o8it36#w$>wy=j<)-(zuKq{$mB^pa1e#2v~Wit!^nN!uZOQ)A; zEwlkokjkhZxA|QDCXGDdX@_3TlpO#O`31AXxt?a7>hvg%)Ej%tYFI{tT!(@$Mh@SO zlkan5zTL$ZFK0K6oHJ?C_1u!xEZZQD-T(3=;hny+f7Dv1aYrE& zuwvJK)@E;B#Q^YehkDn`hDr2GQ&G^Fzxb%EK-MQSDuDo`@FZ?|tctk~Wz}jh zlvUvMm6xU@%%n%OnD{U-GBCE$d}g65ULSRQwF!Vw{OqXpYZ04Ec$A4}!K0Zg{jS+R z93bs=Q*y+_QzxA3bv@?7|lz2E5AIQc>zqU3T$G z!&}|=N_~qep#)`dz=aFVQA}k{8;_cD4{?n^Ecu0%FMZ20d?L|$GOAi8qIbin=9bg zzU1~)-T#iKi(?f+q_RnU0zkvLu;m5G8vpk;i^|z;2d?wRr_@8y6@@N(x^n>T%5Lzr z_75i=nGvLweO=3%c1cYk?t@*?hLIUm;qcM~GOtDaasi&KL(}>#6>Gn|8~r>p^Io^g zH=Dli=;^;Bcg^CXm3O!jsiTnGIyTn>rUhFdXXR!%>HQB?otksia z8d8aQczRwubTQ0-A+4FRo6TbNiD3~Dg_A26eySdFj=MI-Va@XnPG?sf?RM_Mh5ZBc zqW*rmsFG^Y@c=k^2FG@G@cHe@uN&3u!d=pQPJSLye)>u|k29vl+0UOoiS(88Jcs#k ztdT_zQ=Qajk}wY_BQ}2g4N+{hq@V;|x}?pslL!tP_!9V3ea1$L+L<;(g1=-pv|hqV zw29pf!tW|IDjT@qT++k|ln>587X*@igEo3MJ-Up92N0Ld!Ew-QimumGwDRX*SV*lr zK%k7-FOUk}fa{61d&2S)pB6D#W6{$b*Vcc;G5gSQ7{T_)D5n zSgi<4%M1p%Q9GpLV3DB?4I1p+;99i@M2iXT^|&dDHs2P3AXuaC9pm}H#>QqqRaXen z*CJ5nNU#0+YHmj=l4#(H6|;D6k8P+}3MY0UV*}fB2~$g6)5R*>XtG4ehOc;NimgoL zd-UWaY$NYqXm}P42MDSjx(asoH<#2t533EMj}vP(rhE(ba7GhV!HS}-7%wU zGI*w(6Afd(>Z@KJqQiEkM%htJ!+w5%I{VeAq!}qGq88(M?Cd<{EH=fE@q8xNxmqp1F2 z7&4v>SjM-mSW)N}Zr4e`o0SPA%9vMSo^LpI-ZJu3NII%LX{~@*qG%WNN^ScLcK}Hg z?}Q9!L^QqfvIf*mTAwznwo!;gECGtwFQv}NE5fgC%plwkOLyJ6w>D{zYv^(=j$Qk#<2gU z9a3$1nnqTnqA6Y%6+Ltu&AJ&!MWVyB1R4E-aZ7%d(Fv1VCTs#K zkn=)!S68H6VMxv0-Rp7uPkR(z>mg9NDdA6udG=tdm)21G(I8tgMx>K2uiK5R5{WUqiV$| zB;!+@i!P@eHAUYUdLm7MF2H`Zop_1Z(-u%W3!XyIp@H zqc1f+3RAD{S7nb7nSpeADs5fdc<*zvtAF*|ZPLM2coum>WtCuWmLt{8Fgz}h6iWvs7SX4h*S^okYEYc#eJn^=s^NJoGeP{xR}o|_Ok z3dTW9fFLv|?IrS3QX=sD%^#}nrytaX7q^&2WQ`SG;H6Xk8+L#e{$z8vh(x)drhIwz zq$SW@VqOvCr`5`YP3-ZnpjJ5~hY0pck6nytOJuavCo)iqH|2-nUT;He@Z?*n$jm^F66@Rlwui{Q zI&nx9x$*jvR72P7;>Ys19BO`L&Q02Awki`?7#TSZ^Cy6ygk%H00U=}_?mkMnah$~- zTD5_+A&^Nj?ufQlOc8jSazHpdkd9?9EUSmXm~u)sH6|~~ELRFlxk_tRnS`Wp?*+KO z^iidy8OKWW!n@6(6|Ua7Q(uAykjIJ>g-0tf-1gv&kMerJ@>>QxZqb0yK>4{uSnD<4 zX~*QEn!#BZ%jsN8E?%i>NY_ndQQ*cXlNqkAgOIRo1IQCq-u!4SUO+Ox2hr}UvD+t( z{p3iUB9k-a%%E?OGl$6}yw^z`{axUIl*Ci^hZ~@~4LfUMvF#(3=2cEci9;4S7UeD6 z@J)HEIXdTq!$Cp6j~@qb*6-*B%p8}X%sA7x!hl%BuWiWtE*mrW_$KylR&>afF?s{z z$cGjk4@?P>U1B*P?*af;mh~HoEXVCi(}BW-79lQO8h*Tt2z;+mIcl_Sy$iR91mr$S zOUn}`p?AN2f)+>=8Qc$hH#7O_`~gJ;z{f|z%0X@Wz%j0BN8)Cu8j${5vp1I`Ew_BT zPE#9q>;jLPJsrJvO9Cjw`@k;U$8FeamL54cqxi<+m|9`dT3dUExK5BQo0bi%p0=we zY}Trc84!vR!6feoBrOgL$5t3)==#4K9#peJ=O&|&K}a1L;G)giN3!51VXwd4BQolX z0y?|>*B$?%s(ZEh+jah`%or_o67wENj=Xi04Y5Nd`I$oj>SyVwg$sjIxAq4dX9>z( ziO^}qa4MWH+It?U$i(^opzBCsW6>d+Af!YIQ-C-Xpk63^R>94}I>s+geTXpN&(uXi z?e)01)M}(gHpIWeIUIJr-TVCff8IGA8DR1sl!yN=pF%@ASP2e+$x&8tLv^7AAR|c^ zO$JWdgVNx1$m|hLBmPSZ5Hb(3q{V401rm$w8r)T#$Kiv`gOcp^Z$9!Wg`YwJrz`Yd zSY+Z3&@1w-O-!tZx;$0x0~95`GjQsdShDg)#M`ZRLkRFN~Uv6cn2l-48=Tw5U(WcBiDOx@e!M6=e>K zm|^&2z*U*>nZRQT;fZB##=*tMHgWFCTrHSc``kL~R`t<<-H_7P{4g`K&wB#> zbRLg#!>qpb4u2FTJ`A;)qdphUFWx2*8qfwvU_Igqv49vE(L>k94zcCEQ+8E2`V(qh z2|>aE!W}`xqKX3q{}*U0Hz5ErNWtU~-N^QfC+9aMgti{& z+zQiek~AoO7okhxcE`LiW1S<7mO<29gyTva84$e!Skg+ylLlK7eJD%c$5c{cks{b% zq$W1(F~p_1xZejR-pCVyWR~oB8DPBywhmVmn06IC+alPMgAu3AbEQow0@GOfqP5scrSy&g~Uik-0zoX@} zX&w|*glHd$2P0hlgaRmbAv!Qgm!vV^Xp^IyZMYU^Gk0_KfbMHrPBK<~<2gnpzpPW= z=a8)7ZFnE#i9)BM@!VGkK`t?bf0B2-j(LUz1YGr4#?H#<7@5$>?#^!GNvzMW8s#!IMlZ4 znj{(`kGjU`NT7k}n3&3N(QbNX#)}sX^Ixq`?a5y#JZ!= zn^fLO;LXl;i#!Llj&k63_YI8ghckp08!=PB$&<-hN*sRE4_hZ>EZfPhoY^DTv-8V? z(y}0XEDQ?`P0}*K0p+IB@nzqB{p^R$EcqVD!OsWWx3=N zIQnz8rDfz(>n^OuY14vxhm(j%eT&%c?aRGyZ~d#EZcw}1@q{K7Q5Rn7E5O#zUvjz~ zX#3@{B68gx)4$$c6JJ4E*a~LMKYbDrdn&9^W8+(|d%fGd#<5fFrIyFE~lm+fnOSQJ(#f>zQ%6ak)Jn4ze$d6W@oP`}x}Ke;Zr=xBly$FYoRb zo!WYHG<^s0ZnkKj8Z-&N7?{A);&Z6$q$*cZX@t3KgvzLq+ZF|$9W^T~#NIPO`{l(T zy?v&8M{*)CT|DyYL$rSk7T?WT)5-TvqdmJc?vGsPb$&Q6)n&W!M+dxnc0MK1_Jh{H z4@P(vDYjL-ys~lQUjKrEg6q6_@cueY8|%$c@*R|V1cpd5eK^Anat;r0G%biJO|<>Q z7kX%l`z5G}REV&*0cM@PH}W{Isbg|~*!TfYRjt*8KcqR4$u*q82~}kolCaAAyrHVp zyi?QqqJ02BfRB+ZaM-sun7%p0*urJ(<(q3BGzBBE_Tx8>I~2wTPeO-A)+$uN`{$Rb zqmd<&KDoioI3P)~EJji`s8y){`Zujs)$@tR#=12Sr1N<~uXi zR5wnYMIICrtIQU*_8s)4mv%)pMAYPveZY(7;D7)2Fou0yjzXMVGO`ExLYprGnPj<$ zQsv&GN8Yupgf&2Hw}1kf#2tQoKg%rppy^rmqe7-$ST_^-TNBp<+Ina(%kOe zs+^d`UJ8jW<8v{Hv!!DC)TuYdpF=(lFr1qk(sd;bznWs__U({7LX%^&xk?Wfx0Ka% z58(dxWpe{x0}mI98^%)+Yr7@7S8_T8WJ@702E`sGHo$=Xuko=S>t;S7b$*u{3>(Bp_^sTjlNhnVClp zzppXZK$iICKKnJ?g#q&lH?vMRaBkUsO7A()>6;y8HP?g>*WZyq{$ zFr?Qj+`S6McHh}83y$MX1b#A^SZl}zm%RlK@87Shps4F(G@dF672(I2tU5#cP4%9z z^G=(kAryUz>Wz;}Px$>a@#*%H{+8h{65qdHT43a*xzkOT2>P7bnQ=Gq!m_r)@RyAes-HyZOOnT9- z8&JK90))V0OxtV@V)B!3j6K@18&Y=5_7)RtZEYxG6hlL%BE(f%x1n9ce_YDxXVX)> zi%$o>^wyX*KIToR?P1=qSUXtb1r%Q641A#xkPfo!DMtH^CyVrJNy$8#A_LoEg7>Z~ zH`Kmye>T#YqdYY652fuSPHk5$D+)VSu>>#ib{?c;tTFwZIkSKzY+aL9MQre5N}}JU zAIVvg=qjXo57W0bZuj)d)~2a_`aB!y&7Ity{EN!%+qRZkT1;&uOLaNww&ghSmb2@P z3otwXePGC-lw~Uo7w+mw6{+lY_$1b%dr3)dbOLry5^9z%{Cfui0C`cQU6$;>9`MtO zDEdM1xP?53Jeg?O%HT@3ZbME#IT;tX{?LFHS~lOcF7#X0E~`vl*Rh)U8-IQE2MSnx z=J;_p2@oRc=7Kvc%v_pE2Wf zuL=4-QJ@#A3&c3sWarIKcrTU{FMAKat0WI%ON<7-DtkPtZ4EgTXYqjbH3Q70$@bx7 zN*$7*B_jRKk1yBJi#*YOdvA`!eJ6iy%qD{n;~dJtznSHk@_*3w=3zOuZU65@ZZd@o zB|B++h|o0QfApS|#$8zP@>Z+fJqdthZ`K2U8Njd~8jm#Ok537pc!pVT8s+YZ z!Iw1#552QDf8UZ>xu)@*%k^FQB)B#*pvG7_KKbb{XNOUPt)1lerl7b)r4}PI*=&%Rq<;tjH*7W zVc&la+1#99bATw_eT>ZmjOT4{ny~|$j4gW_b4T+@sOd;Wj>U!OOZs(d2q zsRmkIlcvs1Dxm5o5Nqo?GFU{>In=n5X%V9Pj<7bY{+vOmjgL*L&yMTxFW`WnsBFqZ zQ$fQsMosLPJDhq<%pAuio$PDVCt&3|64WpxUOsA~ZEELh+EJwTsQL32Ogd@xG7*Qb znKubZrX~{}Zd2)NpAqUd>a*XT(VZdH5>>WrZhD8oT%NSh!>P<~7L(_O3?^gvM9T9A zE%unZ><|$t_7ID4MFj<(?AQFvjx&Xcm3bS-c3J!xa(1TFbknETSfOsDA9mcPawI(5 z58^_9dOyfTJs#!W3Px;BRU`j#r}?8duW9(vm^suN$vk*d%LyHG*9V?zjVM7ojA^AIFK

f&XbJ+<^_yz+dVxRMT3 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 - - - + + ATM - + -ready - -ready + +ready + +ready -pin - -pin + +pin + +pin -ready->pin - - - insert-card + +ready->pin + + + insert-card -action - -action + +action + +action -pin->action - - - confirm + +pin->action + + + confirm -return-card - -return-card + +return-card + +return-card -pin->return-card - - - reject + +pin->return-card + + + reject -deposit-account - -deposit-account + +deposit-account + +deposit-account -action->deposit-account - - - deposit + +action->deposit-account + + + deposit -withdrawal-account - -withdrawal-account + +withdrawal-account + +withdrawal-account -action->withdrawal-account - - - withdraw + +action->withdrawal-account + + + withdraw -return-card->ready - - - withdraw + +return-card->ready + + + withdraw -deposit-amount - -deposit-amount + +deposit-amount + +deposit-amount -deposit-account->deposit-amount - - - provide + +deposit-account->deposit-amount + + + provide -confirm-deposit - -confirm-deposit + +confirm-deposit + +confirm-deposit -deposit-amount->confirm-deposit - - - provide + +deposit-amount->confirm-deposit + + + provide -collect-envelope - -collect-envelope + +collect-envelope + +collect-envelope -confirm-deposit->collect-envelope - - - confirm + +confirm-deposit->collect-envelope + + + confirm -continue - -continue + +continue + +continue -collect-envelope->continue - - - provide + +collect-envelope->continue + + + provide -continue->action - - - continue + +continue->action + + + continue -continue->return-card - - - finish + +continue->return-card + + + finish -withdrawal-amount - -withdrawal-amount + +withdrawal-amount + +withdrawal-amount -withdrawal-account->withdrawal-amount - - - provide + +withdrawal-account->withdrawal-amount + + + provide -confirm-withdrawal - -confirm-withdrawal + +confirm-withdrawal + +confirm-withdrawal -withdrawal-amount->confirm-withdrawal - - - provide + +withdrawal-amount->confirm-withdrawal + + + provide -dispense-cash - -dispense-cash + +dispense-cash + +dispense-cash -confirm-withdrawal->dispense-cash - - - confirm + +confirm-withdrawal->dispense-cash + + + confirm -dispense-cash->continue - - - withdraw + +dispense-cash->continue + + + withdraw diff --git a/examples/horizontal_door.dot b/examples/horizontal_door.dot index 008113f..ef63350 100644 --- a/examples/horizontal_door.dot +++ b/examples/horizontal_door.dot @@ -1,5 +1,8 @@ digraph "door" { rankdir=LR; + graph [ fontcolor="dimgray", fontname="Helvetica", splines="spline" ]; + node [ color="dimgray", fontcolor="dimgray", fontname="Helvetica", fontsize="13" ]; + edge [ fontcolor="dimgray", fontname="Arial", fontsize="10" ]; "closed"; "open"; "closed" -> "open" [ color="blue" ; headport="n" ; label=" open " ; tailport="n" ]; diff --git a/examples/horizontal_door.png b/examples/horizontal_door.png index 65d8ddbe9d405b72e89d190d62c42da38ca16cbe..be2235d65758ea905d08f4c815c1f295f60ef0a9 100644 GIT binary patch literal 10797 zcmV+|D$>=7P)PyJ=Sf6CRCodHod=i|)%Cy+f}mh;h!_QHu!};luZkM1h#g5RL{LMF<*%`T?X$!W z4aAt3gcwn5sIkVVi6SbZf+aT8XcU#Tf)%kv_kVtOyt}irukOyg_h#NX-#7bar`|dD z-g8esotm1O9v1_{fMKBCG4OsTB?e9Pjs^RE!+>Ex8W%Gp7zPXjh5;~O#K6XZVZbop zFkr;M27+P0Fkr;M#(-hKFwlYl;|yAGVS9#wy2gMJgSzg1`*_1Z3kHlBwBW+_31O<8HB zmE@p<4wCiOTTedz_+$CaZ+;^K1`H6cS!}VzWZP}Gl|A;@!?o$lFTa$jQ>V%^&phM) z@7J%N3?DvRdi3Za4?XmdG&VNMXPNci(-t+Z;8Xe(9x` zZa&_vTQ|4=?YG}HAG4iwV8Dn$I{K-@tz2%o<(#fy>#etLe%9Q%a~%i30Ve!A@4O?c zufDoF|Hd0{NY9=<#ZPqf3+M^}xP=7^7C5~F|99%ti64WMW5C3Oly_jM&EI_U&7A^p z-n@BE=ASuprYu^tNY+_ro#scN41~ph_uY5px#ymf%{JRiSm`(1a6`HO{`;Mh5HaEQ z+i#aCQ>HZEXFJ)zfN=)d=*Oa8vHkYj%LgBPAQxS9ku167lCs1SOUThjA1y1dys}dc z@_^4j|6EQ#{d7kx8X6j$l9A&hMvRcFuDZ%85W9Ep?l=aH8AkwivICaSAUl0o(w891 z!x4D)pPR50oN>k(GGW35;XH%_9YPdP7{VEF-XL=rXf)0sbA4L)gF1Ka+=>u{uSVzB zrAv3!9|T9E^uQ|z!}r*Jb}(SXAccLYV!gcozQ~6kvZ}ZIhWFJ6NZI~iQ%0cG{uf`M z1Z>&5bm^+5!vV7FvYp-WFiIc@NoM%y>-LY8BmsAUSx$8g5PD95n-}& zoGrZ1gjPqvRvQzPV@!HD1HZv7u+J|Wge2ca+trz|dEMiZI_1ACN=bS<87%*ZGJ4!C^Jd`FaAx8i)d$x;d!RlgP_2i~Q$5 zBCowBYW57Up$?C->87nWh(=V$QBSyw;aiOu#DGNi2v}(*zQzH$4Yz()epqDK^o=$W zbp;MKe0SKG_%?t`>jCfx=LBH@&%{iz@jv&kZc~)HSGa44`X3e7o0x&hbgWPpjV8uYJJLHgH!)jB9V8p<8 zIq za^y&nQ%(si6h&`N=LPjg4Djhc>nxEgt_bYVr=BWu*kPiPcp!s3khBMif zSBfTqZFve~?H9iYM2jb%Y&o8Sz3g)aa05U3QJ@zfKH%JQjS!?@VAgCC;S|n3JMel$ zsfgS2g%<`Q1d3+}1Ky~NHM}6x1exUw2zvSHPXm$Qyz@j(KG|G?(=;&C&{iCmF1|Qe zV8Zz!eA|gl`QZ=!e>MM`%}hs{6k46p|Zx&Wdh4>&-y3RP}#fMhWcgET>xG&QzZTk%2P zXP>~mlt@AXQw$6Pabkc_b#w$oM*`7|Q^8RYtvV-KkSbM>DbC>k{x1k+#oycrL8``K zY8p%a3Eb9y`OD%>Heyg5M~PhV;DaK+`<=*Tmx*k=aU!pAcm~=?8NxlIC!$74lpv9$JKpWPCs1lJjpui^5H3g6jKLZE= z&K@{}7#IdBi2-y}=%+~1N_Ocmq)mya3{U!jID;K`6fGi}{%^4_NFN3U4isl$AjNx_ zAfRj{9a~x;^~3=7jBwNa_fHGTt({rKK;OP1vuBIer))`khuFZev_R^K0jab}NI?oK z1H(WyF+lx_2ObC(Ca+W^-8&0b8X%R#;5+5NzE(pn1w>zXVUfdguU-q~%P+rF#HR%F zX&4>W#Yg zp78VM_ts(?1Jxt!)>a)y*>NfjFSXQCZd*=^|E;8vC6pjvMN=BHzql3sYlSoWr!)*O z{@#7}UCnRsj@#bXBpIJ-p8QX=mK+-k6)3z z1Hp7qc>7!mF3H@_@Ij8C?iGnZB+Vpq+g^}bew`oY}l6UfgSB%)8L*O=`?4AJ8xeyG93?1=9jV{?h%O63l4eApEjE8@#Dc~6mFkq}A zny#j4vYDi8KhO#-OjH(?Vn7w_V)-*55N~Us!)sbc?!Ovg$07+4VhnDowd6L_f*j0| z1R;5100EezRYsrG=#J;KE*2jMQlWZGx^*=}#1b`-Y6!7}PKQuIuow(b{Qmv>yREm? z>Pm1N*2bgZ7+=)5<43ge%ClM|1Fn-rfyua$*2n8!Y(~fU8MFmXgmyrXSiqP!+iJC* zfoifype@M}16JOL)Enb*tyuAurk!1Dt+m{w+Fa|6!AjLSK$)LX=kll3o9RO>4@^gF zud&c{L@f}nTE}0S+Q+K@m_{DmtHl&p6xP!!u3KweHpVKfek}l^G(_qNt?7q|vW=S0 zcGaBjaL_S9{KVjSP4RM{mabuSg^hxe{YX;{A@`>hAPl}EU<)A#yJ&qb99EENT5a_sO`I@Db6)-U$3Hfrkit%$J9n;3ojTR&tyr*j(|UO^ zuCj?^#B(!uX^1Z4a!)Pzv4htAD@BKqr*R!8291r44yh4?S#yI7HWR(bop;{pED;B2>KnAa2DOO+Ov_hjAPaf{hya{j zR)BB2Qd2dft79CZ^C%PAM+`6tf>dmy`|i81I{au3s5%BL54UNV=9!unmrj5%){5e( zj=QDRr=!FAvzA9<)nxU=eS9n`VN4I(k?KeyS<6F&SnVFyr&R8*aFv zBYY)(Z+XPvmRoLdvKGn;6lY~noh;+N)wki{_!q6>idWe&TEGzp6@%(w0MjsBEP5Td z*m?n+mwvBh!|>-}VJcy+mPQPaji*eR;%uBy)-AW(vR-i7uJ6Rr3i<7Y7haH`{p@GX zVWnLUvYR@D0UXHw@P|LhcH3>|940^CB=fc@krKPmPFrDZz0Q8Pfo zdK`P~u|^1rp;XVqmO%st3>YAjCQWiKrX}2Fm&AwxVp0C86;lxnP^i@-z?F^~HOg7O z5bujYQO9abFb_ZcupDv35t;KFD2AMloQEwNK76=yXZ@qr_C|wkP#Fxs$wCMSYCH7M zLo4&r8hs1y)I)|0ae6-70181tVgQ?Q>#essS<6gjh0vJ$90UQ)HDRi72#5~`$zx!~ zj2SM_XXMC{V!j{Zd|-&qz3#f}3L-x*F<{`LCm@gr<%>c4Fo1~>uIfE4@pR8U_q6XJ zc2~(5z#9+q8s2!slNgZ7y_55+AijavhJ28h7~pb?W*miK(f|vM^OBG0PWpYNJ|CA= zY_=T*q95@e$DbTGW`pD~@SqmZz{?O%Sc4V};1x{l1@6oFASW>(<{$UQoiyS5@+5Xk z7|1Jtk`kp)Ede24`U;5|b3jgF zKSAm-}JxP~Ah z+DoSZ#0DIE@WHKIPSHnT74e8B&jLz4sH6uFggFX=g~A0JZTP&ut|Pw?SAw}1TxOl= z2qtsi%XlDdT^zt7V;XUN|CkDcfFI@zi(*s-(1sYWGD4v+MZ^U+-E@jQ$(L~LwbwcXF_9r!1fH-8j2kyj zV8d}eMaE|$``{^%N~iKa8fNYzsA$533G%C7{mN;aiTJuqE4D(IFh?P8KA;Kk@v(>- zz-uvkZ`|*!m*)|&hd+KCz?dO-1qyT~D3gbn9LC(~r=Q-6`(T{l+;rM$r@0j$YX)XK zVpEuWEJBxDa)}$G5EJrz!0qx5Qm8YYJ&;6)ad_g1C%Q$C@r*Jbt}>3OV4uDZ-9eNX zv=I|L8y!~`ABYPw3RIG`VKe}DW>PjG-*G+)WS#+mAPI!_=+VO|g$55E?1%~<0>Oag z;^WZP!yb~QhDa?RG3djrAr81>f=njk(MKQch=Qm3DD|Mucvxae<(VT!jL6HiMB7`= z|KQc*xSad!+Ts|1rN_~zqd<-d6p<_-ggLV~FeXNi9_=1|cci*6Nl_SIT*LTcL1D~# zOO#KB10i4@Fjo1+WRHFhZqx%Q^;iJmoLT6wLIH6tAbbl8XD*St4QJrxow%GeuoS@V zFv-Hu(9j@k0J2dSNHfL+kETlNOARXpSTYi+fK=Qp83b?~1Z9Mko?M5_MJC&*oP?-= zdEyV2}v-K72^c(>Tw+BbL;(Cu=Ok;UWDujJ{XUTS;j;d$exYw0(z`4Fme3? z#BnAxV-8LQKzmQS5I@7?kco*I6kQfNIsnm>_jq8811x@V0d0XJi9#D<;6Dn)`u*rl z<^1nIqMUGEC^K1!qu|4(p=u!Zq?1l^tUMyftXZ?%>JD2*J^`qz=Q?1$a%oT@2mmW} zlvr_`&Wal#1aaUs?sld9dBlUTA>wuv7=J)6Q5i0P1uhJJ9EFd;0s8BB9$YGJ=}}%L^aU7EYb_rl&!bW)j0kHeIhy*LNr>g#Xem!z= z?*$+Z!-frW8*CIQrD6F|JdPbZwwYy&Ds$Y;p+CGY7Y6``5;s72JdWdjcD+B3v6hSd zEf+7ILu7pVmDxXoG3dviKbGsAu>L;%7@`Z~{lW_`^ta^wWsyq~Xb0Sg|HkmU+UN|R zaYT6v7=qSy4WQ0j`I4qg4e^*g#C8CdFu*!_R2%KHp_-vhBrQ;rp0;Q5L@N9l6i? zMGLD>7+B#kaU&LlfklJy=7DjGh08B=JdgXLa|(|2+;h)ur8Dr)Nb1+)Cl@!8Nv9RfA`&k)r8AW-A+@Fj4Aj%4vjjTa%C{Q!*M;t)$0#!qQ0PBTi0Lsku zb5#exJ5U%xVbM8YLEu}^4AV&v24dWql)N9{eRL+V7+4l~9-8C0WqWUjj>@7*b$q=& zmwsmwb`)4_uu3pl;WiluEHGpbVlhII9R?;jmH`yvKF=bnFA0DEGA|UfKA2{kL$HRNthzT6TOhUt%JW&~j^W_5R(I!ux>>~I4y%30e;iV{1 zuq5D{0K4x2YXo8ez+}f4f@@AWxP1fHN1w7R97N{1|}95)6h&nrpC^^TxvtJIsyQKmF-X&9@=m9e@1s zZBqSVb%0Z4kpq}Bj6p9Za37YctFF4Ld3>SK=e{`od72wqU3G0i>`=mKv&|X z6HYjxNfF!TTt^P*irb_tRguyT$qO>Nhtz5wo_${Dz^$T-Rcj624ta;iS z$r-@XV4@?+jxtWUlnn)lPu^1~c)UU}??s^#uw-xvg#a-F_OKYB#3@$P1r2LbEIceH zY$Pj$K{6PCTV%B*84voSILzZH3!@6de65EYDa4V$6(TlQ3vi_4Tl)3um$M0NbO!z^ zoPt1Rv4jZzdi%|f0rVueLpL-uRIrf0jtGVm!Vi%zWr4R#32v$3s zB+?)!75lCv&f}XwMI}nDQOPD(j71XfwP&`)fOqJ@X9f|i*vi=U3F$pTkRE9O@OC9i z7jCHtd{z=M;33Ewc<>aaf{>^|MYmAC%h!eD*0H2DKrpP`!K9;jRiRidXxqo1GuT<1&bdE-i2}b&XnJhWbZ&(2;qYxWgM2k5%>m`R%_8;9sb3C-)Ar) zmjIE0g&Z!z_hxCI08KCfQ13#jXnXwofRNT5|?|dekcn| z(Gf(xz5T?%KL{>i>eQ*uyAJO!8d0jpmVZVXfAR4qBhy?Bjv_ZBF%wx`ZPM63`PvN8 zzTt)&T>c9pT!{@xb4WRUEF}0L3K(vbn4UgGyms^8rsKqb2h$)-XatGiZO7!m*6Tw- z^SnHDhxtyNu*jK!nU!EG++IzYn!2uZ(W`K_tf-{RBk5?agdes1Wklejzr)R)6l(Yc zm8c)c^;z){1OH@C6!88+n@N~4k%q`GX;w7i$wq7edGSy}p-6=TG9uu6KApd~Ei+cp z^`JV#U7SU%mN`7yiT;CymmD07MYx+>`3cJGm3WCk_~qn%gMDEoMTvouk;2E5m(c`vC?J9SA>$FtE=Aqo0cfwp9{;BvxTDA~XPQhPebM z5F_`U95L{SVkKolF|p7uKp3$1f@n-{) z17yHroD$GOI)8{hq99{{{x3r_9}AN3pd`5p8@eg{d(g{4sN%|A9%^Xv#31xCmq7@{ z8+K4%B?&nVS6x_cHj>1bhQ^D#8B`~+=t0V1TlgeAi&KNBzz^~XCgeCc1*kG|5QG7W2vS(7*$^|xgbTswrifdD)Mr`{1)8& zTfp>Jqu#0MBL;0ccDwCFH9nf!RVTiR9Lo2%xx@|_2C9Mq#8J3abqJC@_NYn|%6MsG z`qkrVsc43?&T8JZ9m7D?F`$+-2NChL>g~$YfOHcBHMgi2Q1EH0G}QcJqISVNpK6B< z0~N-A>b@MPeku)+ZekGT3c$81X0%>*8t`sytOpFJmB4{22h#xQCkCpJX$H6hjUZG5 zaq}VDF$`1<16o~K?ck!3dsS;fIWJB(G0<{rsEw>~ZE~z)f{@nBu1H=F(Jb<q4Dh9MBgXUrvtzc5>9W`@ZI*CC(^l7zY!3Ffr zJM&#(#|;C?VnEZcYZ@b}6({?i1fJfm@@fgRBfdwXFCg0tUWf*Ufl6aQljmx#GSPBl zm40(a-#c)q$yyB6 zz%WoT43KpTSNQ4EEB4A5U(}dR(_%3UoO6!IuDgmn{IF;x)M8iLdBZ@*F@RqI>G$wF zOetiOGoUlH+Kd)Q5W!P1?2MGsjhY#`O=btZf+G(lQ^!m@S-x|RHmZ~$( z2t)*;V>1BR788625mLJM-ho31&PW6}85joIivg{%D0mtU7$9={?O72&Gf-Zw)DFd8 z9A_jV9-r00R{5*<|Knh3xAL!kyi>Z;&JvFR|gnEz~)T8{0380W1fHA1*@t z!5w#qth;XE>r;5PzK8)Ggq%lJT--;AIj7EofnlH!2GBW;92rC+Qn4#V8IKEnR`gu` z5d$!={q_NMzwI`W{r4C7>Z>ST?0>^RfB_bZ!wwU<_F9pfZw}ntGm4w~uqNc|Jj4a^ zAD|hA;-gnEFbsGMeDOt~UqUp15DXdO&t&npj;sm!x{qQkWU)mVg!q77!N4#;Lerr` zgY4QAPN2RluOWF@S3^x}^mRL}t#c2SVWbyFPUW z(V>nL621r6k9XNcI94!_>RU2iM(|eT_iGY zT%b#URWzs%3@ltIGGc_tQAdd!cbo_nkycotKED0?udHtcV!p11H6*+3r=N;UniR;6 z`L4C&>Bqo>4~iUdM9|+?UoEox?&<%g^1r}z203wt+cM>}Q7rDeZ%~hctVtP!X_`EC z9_i)l5#R<$pu6LaA{%Wa^8EAlN(fxTu0$}0osq(>hW>DMpd5`2BfeD|g7 z_+uJ^`_4P>q^#93G#67ceF`Ulo&c}HRacGS!RdX35rblVhi#ekX*ix7du&iy7iD8g z;ky!vSyP@;_8kAVK=tcF=V}6F^d)_|-+lo{@X||xh)@%at8OE@RQL5Mc{|EQ^4n3d z3AU1q%fp6=oOfQZx}@MUW+(x>@4oxwGc8)XmL~4pPbb5wk(F?vvdvucq$ZJNzn`w0 z2W!c?WtLe+AObhuc%wY3T+(8iV0M*NR#AQ12#p3;ON_!p4?QGzYijyMix$bsE3Yhv z9CC=Pz4qF*gBg^;XPp&r0UK`|n2;M9YNvfQ&=TVe%IO5EJyYBjmXcEM3@Q{)B*Uy> zcwS}U+tl^?K#jN?KYqNMz&B72FapJ9zEDC(7`68L@g9i_GEBlIC(tcO1J@JyV(Vu88h$WX?(oOD1)P;Ng{P`LMet?V~ zJ=%TBOtrpjsDzSx;5;_nbW?Xd&#M{`W(*fc`f`f#UT}fPtFH!;hn6}&XSbM`kP|H> z9ArRYek2r{RrbOQMK;+)WT%}(jyXnTpM6BS)CPLrRTh~E>S1y9wp??~HT}QtcLCmZ z3WyLM`l@R-BEiQWf2>~Gef3j^%Y$l$yIr&UAY$yP)|SoHgOhtdRWs~mmtE#>Rfo>S zHD$!t&Hq+)t03kEuM3j7jO0VmHr7vx+->BtI<<{CXil|rRA)5!t5-`Lpb zK6U!^=`v@|9O>G%YxAcsrApFuHDL$mko8dnvfrmqA5Aj7guMRx>rUT*ViCdt!RV}n z5YC~$CIo#-{rMptz$>r3qFng}j%YN$AnqNk9mJ8Kvq2F$W{jvD6ePVR_zZ8t8sW_1 z{`91tXC8=2VV39Wgp#RK1Kk4VNPHJa%u3p|-F6e{)-B1mw|e%ix8AD7si$e`$E6&L zk2L{H0F!nXjmH?EfjJ+3_@OSSlbsTgiOy<2Qj>ac4{(#R-b{MVAp#&aKxlwFl-Oa3 z;M#8bUAyV`4H`7aor~=c1OT58!im}7b_hSm?5oxbS!t!%UR8$=vJmEqbvmmu0~lEr zcV|x+Fj1mss6Z|Sd;m}s_UO^0;AbNeu;MeRa{>ARM1v^c!vN=y>s<8OlK=ncBa!>> z7oi9aVi-9rQP?7iA)3Jr7{q}ABL;C`vFvBy{_6X#fop%m4+@aH5ou_P+ zG~YlGQwozX`PrU$B8VV`1He5Tkqg&hgSatZ#2{{rmi;`m_{hHK8dw1_e?bV;Rxc>{ zm;@B*P$ga_ft8<7VF&<(kxk8$(yLeCAxKC$9)nr^{@UqOBL=n87vHx8B^*Qn;y_w9 z)$Tj!-MfV_Kp>FS(^L!w7iOHZ)OkrA8iGJD6n(0gbbz-a*@WPVAcDjV7*rAiMhq&6 z?RLEjH(FLs?B_&MGLd|gA&NcBfXL8P0LF5`rWOEa+U(xFU9W7{O(^%&oakhF6njka zxpRYGyfxu?@H@cjLi@-tg)v~npuz}G{&ngq>?-~cmdpfY!#^L{+;5bc z!|cgM24G6p6U`WoMuaF}r)Ps$FoEGj_{EX{aZ&eU_lrpnCoAN9ei3PG!YAL?@xH-` zLA?0Pz|(w)v*!>p@JaRwC1IdZ$-aSMAcO%U0wHA7*Y5WMVtswIeXU`@FwhnQMhx2G r#EuvS>JkG+4C=Dm?V}9?Z87lwxsMjGg(-3@00000NkvXXu0mjfsNW=j literal 11279 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 diff --git a/examples/horizontal_door.svg b/examples/horizontal_door.svg index 217e038..25b8254 100644 --- a/examples/horizontal_door.svg +++ b/examples/horizontal_door.svg @@ -1,35 +1,39 @@ - - - + + door - + -closed - -closed + +closed + +closed -open - -open + +open + +open -closed:n->open:n - - - open + +closed:n->open:n + + + open -open:s->closed:s - - - close + +open:s->closed:s + + + close diff --git a/examples/matter.dot b/examples/matter.dot index 9a5b12e..adb077c 100644 --- a/examples/matter.dot +++ b/examples/matter.dot @@ -1,5 +1,8 @@ digraph "matter" { rankdir=LR; + graph [ fontcolor="dimgray", fontname="Helvetica", splines="spline" ]; + node [ color="dimgray", fontcolor="dimgray", fontname="Helvetica", fontsize="13" ]; + edge [ fontcolor="dimgray", fontname="Arial", fontsize="10" ]; "solid"; "liquid"; "gas"; diff --git a/examples/matter.js b/examples/matter.js index cb0cde1..b1a8892 100644 --- a/examples/matter.js +++ b/examples/matter.js @@ -5,7 +5,7 @@ var Matter = StateMachine.factory({ statedefs: [ {name: 'solid' }, {name: 'liquid'}, - {name: 'gas'} + {name: 'gas' } ], init: 'solid', transitions: [ diff --git a/examples/matter.png b/examples/matter.png index cde3b89e88eff344c373cbdf183ce39c9c49c594..b492e6ea38b37e103c4a3ae56303cc6d34607f8a 100644 GIT binary patch literal 13585 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 Z14sJvwchIW@~P%8$gahKbh(u z!&&^IMn*tmQDD#}TFlpK4OrpC`&rRxDxGD%TDNU^KUBVJRT(OkKi3C2d@sNmOs>Z8 ztKSRSaiWz7{bY>Rv1{()8jW*T#H+ zk@s@n=IygO7YO<3pAs{LnzX`aqg7-eHVT_w`TkRxUS{Q+2QP`Rq5h94seJcs6+goN zh6P|ma@FuSezU6Zuey9J_dZmtgt4qn>HUpAk03dPA(A6p=~QnL)gv)ziyeg93W9+S z2dvO2-zI%aap)|M1D?9+2R!U02RSt@=&bEfdIdDVM34|+{VE~5K?V#1D98k@ z<(*<&>JJA9N7Mj`zy^a^kq=YA) z4VJsF*>nCtyRu^38srB*=Uw!6hNKqWvE`BzYkcS(OgO$xccIG&^p4jrIED*mG35Ld5F z`>ll$%j|M|hkW6Ez=p;?M7s)^eSH2dESD(+fp^;M)fv4uDJhZbg;<}BjME@dl>#g;zR!p z*gzlD`Zw95b@nOd{r{gC^4W$?gXAs}iT@i@`G>t%-|BsX|108*r=0yH51ny>k(XBa KR4ru^^8Wy@9tn#8 literal 14731 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 Ykyx-k{`k^voUSB}Y3QrxAF&GgU(=( - - - + + matter - + -solid - -solid + +solid + +solid -liquid - -liquid + +liquid + +liquid -solid->liquid:nw - - - melt + +solid->liquid:nw + + + melt -liquid->solid:se - - - freeze + +liquid->solid:se + + + freeze -gas - -gas + +gas + +gas -liquid->gas:nw - - - vaporize + +liquid->gas:nw + + + vaporize -gas->liquid:se - - - condense + +gas->liquid:se + + + condense diff --git a/examples/vertical_door.dot b/examples/vertical_door.dot index 822dad8..15fb9c5 100644 --- a/examples/vertical_door.dot +++ b/examples/vertical_door.dot @@ -1,4 +1,7 @@ digraph "fsm" { + graph [ fontcolor="dimgray", fontname="Helvetica", splines="spline" ]; + node [ color="dimgray", fontcolor="dimgray", fontname="Helvetica", fontsize="13" ]; + edge [ fontcolor="dimgray", fontname="Arial", fontsize="10" ]; "closed"; "open"; "closed" -> "open" [ label=" open " ]; diff --git a/examples/vertical_door.png b/examples/vertical_door.png index c29023dc98f77f72923c970ffc21dd834b78711d..278dd312e42ca3d6049b8b4aeb020637fb8f10be 100644 GIT binary patch literal 7469 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 diff --git a/examples/vertical_door.svg b/examples/vertical_door.svg index 12dc09b..91ebf30 100644 --- a/examples/vertical_door.svg +++ b/examples/vertical_door.svg @@ -1,35 +1,39 @@ - - - + + fsm - + -closed - -closed + +closed + +closed -open - -open + +open + +open -closed->open - - - open + +closed->open + + + open -open->closed - - - close + +open->closed + + + close diff --git a/examples/wizard.dot b/examples/wizard.dot index c7e6f25..d80e63a 100644 --- a/examples/wizard.dot +++ b/examples/wizard.dot @@ -1,5 +1,8 @@ digraph "wizard" { rankdir=LR; + graph [ fontcolor="dimgray", fontname="Helvetica", splines="spline" ]; + node [ color="dimgray", fontcolor="dimgray", fontname="Helvetica", fontsize="13" ]; + edge [ fontcolor="dimgray", fontname="Arial", fontsize="10" ]; "A"; "B"; "C"; diff --git a/examples/wizard.png b/examples/wizard.png index 74945ca3515d6b7a6326b55991834dd53ad20700..6eb51db7ded6366988e73f0793647845ac0e5aca 100644 GIT binary patch literal 21741 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

mnkt9mO17Aq$-ezP+r7#S6dk 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 literal 28377 zcmY(r2RxT;|2O{CloU#mqRdE&qHHok*`utCG|-SFI~w+;VehR_NVX!Q?2%HWlvzdy zWjybr>-T&9&;P#f>(!kL-}5}qvQ^Qsw-`xVWFW=D4SH26|^aoRZlpK+*U30=WJPAOdnBektDIMWD^r>v7x2E)h!D_ z4Az~+Mma+Rwrugi&BYUA_D8#%;>SwH$G$Q!+%{+SGG|VU4F4idsTQQI77P&1OY$aP zj9|LGO$uM2tuCN`JpA9cDVizL{rfI~Rs7E62feHq^xOV@Mb*E`kBxlA+;GjQ8DX8w z%uHh?GxB?mdv23z(mZj3rZ#YAojooTKc&0Ic)i)^X+uL6ug$D9p~^M(_j#VAq^t?v zEpy!2S^UtULm{D|w@>GqB$k!!dhp-@FF*g?$B*~lfAD~vo;o2dZ5=Bs>+s0PF%1nm z9v&XcjZ!`Yl_wBxGgL zn3|gY_*A@=qG@6h6z{&gBbZI<)zaU&#I!W8_*;KAoH}*NCm=vUQerW z*w#k}O}*mc*iJn$^km>Xe$BOTQ#P(GG&Gc&j;=0N!hwGG?%@0P8OuIAR992mk(P*6 z?#?w;$~7r}QPR0CG$tmXzuzoI+@1!vl981q_xJbDwsIGT8zb#&nV6XJ^71@x-=<<@ zWVCiON!0YgLy&Zxr=Oad^6~et?k#n&of|(x?I{-#9c@t`!hX%cK?#ewhqL;4#11d> z6t4&#m6Ip^DIt}WGQJ8Neu06huU^S_^lZMQa0>yG>xUIeX#kyakUHm=Iuk8HL)3b%5efo5|@7BHTFYm4&dF{V_Q_oE; zErwVrmxoLOh6;m&gKIo`3asR(hg#B8Qc~7kiN;=Y3Uq6{oOJWYd#dy2&$~`H9nC8$ zQc_XbU|4kZ%)lj^-jcN&H*TbFlL$_f_g>|ZQg=*6Mdf--bo5S2|I|R;CRdS7WB7CO z_iwL?3TdW;CIMG_OTN7F+=vJGYI*6e(5*#BW@ct#%XL_4S{7mITeog0tEwu<$*sE3 z7;zhGdt?05j-@}d)gvA0-162qQL0N8iW*x*u76YhRO&#tdL3=m&yPi4hKGG*mgkde zy9d92XXoZ#o0^(BAvu@0p#@us(%QfFn7q^cBs-64ghz9%#K51~vG;lAtJ^y|o?dKW zd-39h?5R@^^Dko`*8ckbcIsQh));9w78)9wYj$>b%gd$Y>1jOmpI?sr=9H+(yRd>~&TG@oK5-@7#&es`%Y8?F{rW|r z;Ed!B&1}kk{Fs*ibk4oPLXoSVUfecyU)pACYa1bE$D^yKR~$6Qv}4B(+8u}1Tx^bc zi63dJaC4#EExpU_?{7u?zV0bhg{W;uLW_O1b#)bR+&jCvw9cH_Bp@JwZN#~69}TO- zO@#{=c(!caYHn%iej!0{d)e3_in)}J;IX>lyXonBcd@eCeyeAoczAoS$Hoan zg`uK+`~KZ_q@9~~=MmbMFJJ2CnNdB<&u5^gpKO-gVMZE%o7LSiS@0u{n$%UTUR zy=_bfjD6VUy{cZmq@vp`T@$e5aFp@O)f6e`8Cg|T+9Ov#`KU!7dD+mgp(S2sNSq0K zCA`krnVAwYGb8+ZxA&({#xIJC*^eAy`dDOBm!cB>B1qTf>%f4}g+}I-^z?xm->t(P z>2%$pWQF&?>!=pC;^X5R?#kZ&?AfzxWAC0^(3_-qq^5EwB`1IR`t{DSyX(HZe`;Z@ zbQU%F87eu&<6Co1SlE`J@Xo&ci!J@b!_+u6s3powCYP_G3eYn%Q=@v~!q?rtefz&3 z4AXDxc=h1^eY1uzZsn6FS5q1z53fIJ)AvoZtM2=^Z)W{fw_D%6t4%%mC~E2VX4Lk{ zxw*Q=0&M7I+o^8RMKf261)w1Gtw`J%g4--ExZ^D(2&%?aq z;!I+n%Ud=pa4`J&{nI}nfY!M3R{4kRk}C=d5t2@a)MG?%V_B*@JMWJv(##l^)%-_Y>Yr%$`k!LUAFX=xXp zIA6IZm-y}7RAZwmd7dad%F4>J+S*&`(kqL05s{H1 z4Ic|-2K&lg<`<`1raClaNb@tU`_ed27u@#5=;(g^JPMBMH}TE?b5R=fxFSxap#J%( zf%?Wqg}NYC?1oj_w{M>r?b;|VF21SfmVp6jFO&T*SJ%|k?BU^AH#goZfBrl-S}({HWcRs&jlr!*7#nO^@9WArRrS2S@z}sV@G1(az9>v9C>*&}5 zP(-e=4&Bw())ut=s$g7tGjNO-V8-n6aAqnR_2m!G*1F7%d&=&qdSN@z|MO=c3cD@q z&*VPU`9L3^Dm-D^m1Q>{1&)Y_h%&u3kil@=1P~1sdW8BRS5@Gib(?ol zhbrGgr_LEbSq@{EJ_hiUmRq?THSa3DW9QC}cTbEm0UXBk<5My+e468BG(NkpNa3;o zGwxGUtgNluTNCB2dQ0pX+1S+4E@t~~qOXk%4~LYNN}MTk46Qk9`y}Y?n>QT58{&?W zX5|{{CBC7(J?ze%JECPLP@E2(nkiGVw%+ID;u0>qXOEqo9St>g z0v>ygg@_OS@WaQWhW?tI+~elvwn`TD>zs{^M*fASBy{CxN9zXsO-m`KLM~-UG;luew6()Lmin!iRw4}_7 zfA->O0$&XXuVx6%%;d|=&OS-=K`Z&V)~QoW3|fJoD>HS{wa=bS`u6$2fdeVY$?^*e z3yfQ~$l*7v@wm_wrTFE`7e;z|**9WVqz>&A{d#OmFFftr{h-| z#?Jxgtm%K^jTOQpWDz>M#?#B|-TS|X(Z#M`yOz;%@^N@nUxBYrL1Ceaj!yVpg_VnM z9}1+Trs|EEiu*Jd# ze*E}hxxBd0UiPi1Q+H;Ul=FQ`YtiRhZ?&?zfhdkqc=232cA+kX&(ysC@SzR8n!9D` z@86;;ACElC%bV|CXl!g8{>(Y45iiY6>3m{T^k-9xpsN2K%Zy?y4}dw*lLPNh3f_j3ybFK0lUPuJb(T?0>|or@e7KQlG2a9 z@||&UaT8@nP&m-7c?ASK!@}B)TCla#U4GMI)5)WXvPrwn zw@q(hz<$90f_91B!A?AO{P?<>sX(uuo*w-|>uuP0AyH9&0IsBs6O@9UCT2vdZDh2Q zGWoOU^Q%{{R#6f%GN^&qhKGk`m6X>1`SWM^{Zmd9c$WQjbD!OVyRuIYpa4+Q($=83 z=3V}9NTrRFk%l{0JYBt776xIG;jA@fMX2zVhVEt54 zZ>etIZWZm-#iHV`@pMCY9 zxVV@+OFut9uH3Hn_B;4{O85A5i%f3OZ0fDWDW%5fqjaOAqs(I0xm?}cxXU%Mq0v2S z{I?%814{i;?VSvSOD++pye-#M255tHuw%!L*~FgaWt7|FxRkzc|9)Cj>}u4{QSQUl zf&wS~Kb@Dt7tteMm%Gee1E9RzR~ETVQXAlS<|SL`Q5T;=pxmohug(ty%Y;Nn^Y3_P zdHHxC%Ua6(SZ<~0+sO+ZJvbkn!orM+iHTt*g;*9{UEO|c(D}a;l~YS|pR2(z(MUat zijImqjMGXH7)MRdD zwPE8%|KM?}S={GYU>asAXJO#7wuIiL#?lifPV^bpPpDCGZSgg;wx&TTpPBf)+wIRx zsB6i3k0V!l_6P{5jXKE;et-LjQZ=$GZ)WBO#Um%@YG6x|br%hK;KYx5lQU-mB^<{0 z;0bI$XmT$&m=3)nCN@^cdBzfF^_jZSBiD?hSHa)(D{n0snI1lJq!vv<+PTkjnm!V^Z!1K*G+?zmbxVnYrQc;ll-2J~E-|w03oQmXwIk zyH=#UchXtB|L76XB}PU@$Tq^mp9FSGOiEe>h&=qM_%J#`YpH|H%t*)3lcTFRUVVM- z|MbR)_G5$m5 za=S%ckY{f0K>*Jl*%3nO(~lJ;()%jBxcQUi&fU8VyLJV1cIswiX1;7|W58W_J$WMV z`0?YuzZ(h<{FHS2!}#>+Q*gLfIPbQ9e_!!=efGvgAFHX`?6%_p%v75;ZOX{b#^$}R zcJEvL1OC(37UykWl$0c)vWGl+l-p(Ny_xk@XQobQeEh+##Cl*_PC-HXy5QaGDepgi zls|KZ6{wS!mshqs=L}gMeFFm(fsV@J(o*^TOatE8Be+)?OS zzwCa)0&1MrCq+l3Ypbd#R#sNL2M%0iivE6xwu4%@#%&U`t>8iv%OPQ5F3LG8E0wp8 z4yFSLYM8VYJ@@nXAHfv~JN-J>-r32;7OVszWG{u0fr0%2t?E)kQ&TE9g6*?SiWUza zJyHT%D7e@Xx9-wFPvIru8^fBbWU-%;OC2VT=o=~Ix;s?<9hYeMqlR`xkdv@wG+-+2 ztl+#>Gsd;jdukB=NB*+xc3+riZ{Uc87Hvs7h$ zQCg}KFYWdss4e4iZ^;9|kknuKu0MN3o)s1C#Z5&WI!|-{+&N)Ke2Cy|riowNP)mFV zh=6a)P&knD&(D?d`}XY{9q61L2URMtY~#>Ab&BW86`(|`twv78zAqf7IH(dPC$Hrs z3)5g%oij6&J$#`t#4!5o(+Jdr`qtJEe5_Sdlt|!jhgfsw!Ozl}!vKvOz>4Te96CBW z0DB=llU?a=8X6KOD*gtcsAqyAF)}gL+H<8b0n^L={{1^<;&2!9W7Enw0AA4%TRwjN z>Wtz%i zqL2HwtSor@cX66@^g(6xxq|E8PpFgr7=VKzk5w)>``VAGSnMFkW1V}6%O$kU2nmM+ zmoHzwHr&ci2%yQ{({^7#v!Mqak3Mo`awy*Yy7SS^)8^Tyb8AcN$LP0hTf1}T&YS_| zGxqi(yLRo`v&Hw?K<%dbh6dXxrTt76(}PWr8pHsAuJu<@VMkqyBJ`KX-Z0bv`!(98 z;w5^6pu@Paak+D$0i$Hq*vDHFy`}4MP-cF7*t-3IaX)T|?c}2ailAg)#>ay|7V&x8 z7+$`8yV2LzmlW@zwRDvF`uhHlHkGd-E}@3kilQE1;I7g4cAQ zB=5Zb;)xc$|Ld8`m8D?N3s#w1F=L{QF643GoG1Y$H7)r>uBK*{{VoW~99iFE;)?Bt&Y}j0y8M2ud-~k>o*y6bi8dA^;jmdjogP<&GH>esYQF_!K8#qGLmZLdF?C#z5bZ5WShZ-woJ-{(E!~fOP(|Zls z?t|oRFLTkkwl7brs$?&Je7*@K$yy6bj1#sE2{;eRZQOwl#-Y(7gvnmyZ|qO$vwV$_$Qv@{;_+jbnjVD{!dAG5^G%i#yL zJ>}RJmzKC)+3w!vupKEpSEKi z3CADdKo$7Oo(eaKZd=?$VxQ5BafNFnr4=nQB{IE@lpOGgqWM*M1l^`?<3II}oT2^} zpi%N@iGHedkB3CJfTYu}HTb29pyg0mJPh(Ln7_KWK~qO(Ks@T6GS@5A zw5hiTEBnEGu_|?M9`Fl+8RsO6M1V8?TTPi;k~b&%dVf5uu;k?krA8lu(tMEk5x_8D zFv)p&^a}SNeo#>Wc&i4ch@${4>3{qP93VjBU|M-A zMqnHojW={pY%MxCEZ1({tSxhz7Ccu^ul`HPm&BhhTN5Zot+qk(Tp3ZVXhj8g~>D7WQf({SMmK*X-PiR{#=1g!$y7fNjIc z1Gzf?QCIjF+B7vabrp0fhOJvyi-?F2;S{`jxVQ9ZKtKRX!A~C_YI3Q2HR5WLm4b1K zf^7$CA>O992?+CU!ain}b`?dD^{QO{vk^_oSm~=S^nbFjTlcCH3?G#9nRG8s zI6*{M430yGwxH4o9y)Xf0({AhkyYe+^!2NNHvnD>rESn5Kn#7o>2{y!BlPAjm<(}< zu;|z9?LDF5RLp<%XIk0t7yO!8(ov9h)21oVD|sWM=rLt&ZYF=*@lRrlzdzcDI*jka zUIAk4A04H^lY0ODz3}_>8c>*U&0j{lvQhA8UsYE_L=(h*pP!#MtMZ_VSuQ^x;Weq= zrek2RK~GO_5x&6upRwHHH)|;`+*hQ3Pkg51((GwT z_vKxH`!CUsg)YC(6QBFq`3UC;M+u7aY68VU-igFN|L2dKfk9-rDy`1vK0fEKU%$4d zp4^T-@DdO>+nC}3U(6hcf;e`GiR_oJTwwqZu}VXi;so8nyK<&n9y#prAnb z+=UAqQd0kbCm&xZqr~;=*EO}Z

nVX&N3Kl`}Qn4Zw5^3WmXLo%NBCk#LCUP0F27 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%0Die@2c1_T?1)MZu;NfS&!KyK9Rw=TJ+5`C> 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 JBbr&?{|^Ly&lLaw diff --git a/examples/wizard.svg b/examples/wizard.svg index 46edc96..865d6ae 100644 --- a/examples/wizard.svg +++ b/examples/wizard.svg @@ -1,69 +1,79 @@ - - - + + wizard - + -A - -A + +A + +A -B - -B + +B + +B -A:ne->B:w - - - step + +A:ne->B:w + + + step -B:s->A:se - - - reset + +B:s->A:se + + + reset -C - -C + +C + +C -B:e->C:w - - - step + +B:e->C:w + + + step -C:s->A:se - - - reset + +C:s->A:se + + + reset -D - -D + +D + +D -C:e->D:w - - - step + +C:e->D:w + + + step -D:s->A:se - - - reset + +D:s->A:se + + + reset diff --git a/src/plugin/visualize.js b/src/plugin/visualize.js index 1ec20b6..d6974cf 100644 --- a/src/plugin/visualize.js +++ b/src/plugin/visualize.js @@ -162,7 +162,11 @@ dotify.gen = function(state) { } dotify.statedef = function(statedef) { - return " " + quote(statedef.name) + dotify.gen.attr(statedef.dot) + ";" + var retstr = " " + quote(statedef.name); + if (statedef.dot) { + retstr += dotify.gen.attr(statedef.dot); + } + return retstr + ";"; } dotify.edge = function(edge) { @@ -191,11 +195,11 @@ dotify.edge.attr = function(edge) { return output.length > 0 ? " [ " + output.join(" ; ") + " ]" : "" } -dotify.gen.attr = function(statedef_dot) { - var n, max, key, keys = Object.keys(statedef_dot).sort(), output = []; +dotify.gen.attr = function(attrs) { + var n, max, key, keys = Object.keys(attrs).sort(), output = []; for(n = 0, max = keys.length ; n < max ; n++) { key = keys[n]; - output.push(key + "=" + quote(statedef_dot[key])) + output.push(key + "=" + quote(attrs[key])) } return output.length > 0 ? " [ " + output.join(", ") + " ]" : "" } From f6a06692098fad49e470942e5b13670d09714258 Mon Sep 17 00:00:00 2001 From: Rick Berger Date: Sat, 11 Nov 2017 10:48:53 -0700 Subject: [PATCH 09/12] Added tests for statedefs, fixed minor bug in config, updated README --- README.md | 2 ++ src/config.js | 2 +- test/imports/dotprefix.js | 24 +++++++++++++ test/plugin/visualize.js | 56 ++++++++++------------------- test/singletest.js | 33 ++--------------- test/statedefs.js | 76 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 124 insertions(+), 69 deletions(-) create mode 100644 test/imports/dotprefix.js create mode 100644 test/statedefs.js diff --git a/README.md b/README.md index bd46ea3..9c8c804 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,8 @@ Using npm: ```shell npm install --save-dev javascript-state-machine +or + yarn add javascript-state-machine ``` In Node.js: diff --git a/src/config.js b/src/config.js index 7288a83..833d132 100644 --- a/src/config.js +++ b/src/config.js @@ -155,7 +155,7 @@ mixin(Config.prototype, { } } if (undefinedStates.length > 0) { - throw 'Undefined states in transitions: "' + undefinedStates.join(', ') + '"'; + throw new Error('Undefined states in transitions: "' + undefinedStates.join(', ') + '"'); } }, diff --git a/test/imports/dotprefix.js b/test/imports/dotprefix.js new file mode 100644 index 0000000..e1d7b53 --- /dev/null +++ b/test/imports/dotprefix.js @@ -0,0 +1,24 @@ +/* + | dot prefix string will be appended to all dot output + */ +const PFXSTR = '\ + graph [ fontcolor="dimgray", fontname="Helvetica", splines="spline" ];\n\ + node [ color="dimgray", fontcolor="dimgray", fontname="Helvetica", fontsize="13" ];\n\ + edge [ fontcolor="dimgray", fontname="Arial", fontsize="10" ];\ +'; + +/* +| dot default pfx object will always be appended to dot output object +*/ +const PFXOBJ = { dotPrefix: { +graph: { fontcolor: 'dimgray', + fontname: 'Helvetica', + splines: 'spline' }, +node: { color: 'dimgray', + fontsize: 13, + fontcolor: 'dimgray', + fontname: 'Helvetica' }, +edge: { fontcolor: 'dimgray', fontsize: 10, fontname: 'Arial' } +}}; + +module.exports = { PFXSTR, PFXOBJ } \ No newline at end of file diff --git a/test/plugin/visualize.js b/test/plugin/visualize.js index b23b75f..13d670f 100644 --- a/test/plugin/visualize.js +++ b/test/plugin/visualize.js @@ -1,32 +1,12 @@ import test from 'ava' import StateMachine from '../../src/app' import visualize from '../../src/plugin/visualize' +import {PFXSTR,PFXOBJ} from '../imports/dotprefix' var dotcfg = visualize.dotcfg, // converts FSM to DOT CONFIG dotify = visualize.dotify; // converts DOT CONFIG to DOT OUTPUT -/* - | dot prefix string will be appended to all dot output - */ -var pfxStr = '\ - graph [ fontcolor="dimgray", fontname="Helvetica", splines="spline" ];\n\ - node [ color="dimgray", fontcolor="dimgray", fontname="Helvetica", fontsize="13" ];\n\ - edge [ fontcolor="dimgray", fontname="Arial", fontsize="10" ];\ -'; - -/* - | dot default pfx object will always be appended to dot output object - */ -var pfxObj = { dotPrefix: { - graph: { fontcolor: 'dimgray', - fontname: 'Helvetica', - splines: 'spline' }, - node: { color: 'dimgray', - fontsize: 13, - fontcolor: 'dimgray', - fontname: 'Helvetica' }, - edge: { fontcolor: 'dimgray', fontsize: 10, fontname: 'Arial' } - }}; + //------------------------------------------------------------------------------------------------- @@ -43,7 +23,7 @@ test('visualize state machine', t => { }) t.is(visualize(fsm), `digraph "fsm" { -${pfxStr} +${PFXSTR} "solid"; "liquid"; "gas"; @@ -69,7 +49,7 @@ test('visualize state machine factory', t => { }) t.is(visualize(FSM), `digraph "fsm" { -${pfxStr} +${PFXSTR} "solid"; "liquid"; "gas"; @@ -96,7 +76,7 @@ test('visualize with custom .dot markup', t => { t.is(visualize(fsm, { name: 'matter', orientation: 'horizontal' }), `digraph "matter" { rankdir=LR; -${pfxStr} +${PFXSTR} "solid"; "liquid"; "gas"; @@ -131,7 +111,7 @@ test('dotcfg simple state machine', t => { { from: 'liquid', to: 'gas', label: ' vaporize ' }, { from: 'gas', to: 'liquid', label: ' condense ' } ] - }, pfxObj)) + }, PFXOBJ)) }) @@ -144,13 +124,13 @@ test('dotcfg for state machine - optionally include :init transition', t => { }) t.deepEqual(dotcfg(fsm, { init: false }), Object.assign({ - states: [ 'ready' ]}, pfxObj)); + states: [ 'ready' ]}, PFXOBJ)); t.deepEqual(dotcfg(fsm, { init: true }), Object.assign({ states: [ 'booting', 'ready' ], transitions: [ { from: 'booting', to: 'ready', label: ' boot ', color: 'red' } - ]}, pfxObj)); + ]}, PFXOBJ)); }) //------------------------------------------------------------------------------------------------- @@ -172,7 +152,7 @@ test('dotcfg for fsm with multiple transitions with same :name', t => { { from: 'A', to: 'B', label: ' step ' }, { from: 'B', to: 'C', label: ' step ' }, { from: 'C', to: 'D', label: ' step ' } - ]}, pfxObj)); + ]}, PFXOBJ)); }) //------------------------------------------------------------------------------------------------- @@ -197,7 +177,7 @@ test('dotcfg for fsm transition with multiple :from', t => { { from: 'C', to: 'D', label: ' step ' }, { from: 'A', to: 'A', label: ' reset ' }, { from: 'B', to: 'A', label: ' reset ' } - ]}, pfxObj)); + ]}, PFXOBJ)); }) //------------------------------------------------------------------------------------------------- @@ -232,7 +212,7 @@ test('dotcfg for fsm with wildcard/missing :from', t => { { from: 'C', to: 'X', label: ' finish ' }, { from: 'D', to: 'X', label: ' finish ' }, { from: 'X', to: 'X', label: ' finish ' } - ]}, pfxObj)); + ]}, PFXOBJ)); }) //------------------------------------------------------------------------------------------------- @@ -266,7 +246,7 @@ test('dotcfg for fsm with wildcard/missing :to', t => { { from: 'B', to: 'B', label: ' noop ' }, { from: 'C', to: 'C', label: ' noop ' }, { from: 'D', to: 'D', label: ' noop ' } - ]}, pfxObj)); + ]}, PFXOBJ)); }) //------------------------------------------------------------------------------------------------- @@ -287,7 +267,7 @@ test('dotcfg for fsm - conditional transition is not displayed', t => { }); t.deepEqual(dotcfg(fsm), Object.assign({ - states: [ 'A' ]}, pfxObj)); + states: [ 'A' ]}, PFXOBJ)); }) //------------------------------------------------------------------------------------------------- @@ -307,7 +287,7 @@ test('dotcfg with custom transition .dot edge markup', t => { transitions: [ { from: 'A', to: 'B', label: 'A2B', color: "red", headport: "nw", tailport: "ne" }, { from: 'B', to: 'C', label: 'B2C', color: "green", headport: "sw", tailport: "se" } - ]}, pfxObj)); + ]}, PFXOBJ)); }) //------------------------------------------------------------------------------------------------- @@ -317,7 +297,7 @@ test('dotcfg with custom name', t => { var fsm = new StateMachine(); t.deepEqual(dotcfg(fsm, { name: 'bob' }), Object.assign({ - name: 'bob'}, pfxObj)); + name: 'bob'}, PFXOBJ)); }) //------------------------------------------------------------------------------------------------- @@ -327,10 +307,10 @@ test('dotcfg with custom orientation', t => { var fsm = new StateMachine(); t.deepEqual(dotcfg(fsm, { orientation: 'horizontal' }), Object.assign({ - rankdir: 'LR'}, pfxObj)); + rankdir: 'LR'}, PFXOBJ)); t.deepEqual(dotcfg(fsm, { orientation: 'vertical' }), Object.assign({ - rankdir: 'TB'}, pfxObj)); + rankdir: 'TB'}, PFXOBJ)); }) //------------------------------------------------------------------------------------------------- @@ -339,7 +319,7 @@ test('dotcfg for empty state machine', t => { var fsm = new StateMachine(); - t.deepEqual(dotcfg(fsm), pfxObj); + t.deepEqual(dotcfg(fsm), PFXOBJ); }) //================================================================================================= diff --git a/test/singletest.js b/test/singletest.js index 213e071..eeb3768 100644 --- a/test/singletest.js +++ b/test/singletest.js @@ -5,41 +5,14 @@ // // node_modules/ava/cli.js test/singletest.js // -// Copy and paste the test code into the 'test body' section +// Copy and paste the test code after the 'test body' section // // 10-Nov-2017 -- rickb // import test from 'ava' import StateMachine from '../src/app' - -/****************************************************** - * uncomment this section if you're including visualize test - * / import visualize from '../src/plugin/visualize' +import {PFXSTR,PFXOBJ} from './imports/dotprefix' -var dotcfg = visualize.dotcfg, // converts FSM to DOT CONFIG - dotify = visualize.dotify; // converts DOT CONFIG to DOT OUTPUT - -var pfxStr = '\ - graph [ fontcolor="dimgray", fontname="Helvetica", splines="spline" ];\n\ - node [ color="dimgray", fontcolor="dimgray", fontname="Helvetica", fontsize="13" ];\n\ - edge [ fontcolor="dimgray", fontname="Arial", fontsize="10" ];\ -'; - -var pfxObj = { dotPrefix: { - graph: { fontcolor: 'dimgray', - fontname: 'Helvetica', - splines: 'spline' }, - node: { color: 'dimgray', - fontsize: 13, - fontcolor: 'dimgray', - fontname: 'Helvetica' }, - edge: { fontcolor: 'dimgray', fontsize: 10, fontname: 'Arial' } - }}; -********************************************************/ - -/** test body - paste test function in here */ -test('version', t => { - t.is(StateMachine.version, '3.0.1'); -}); +/** test body - paste test function in here */ \ No newline at end of file diff --git a/test/statedefs.js b/test/statedefs.js new file mode 100644 index 0000000..10d8306 --- /dev/null +++ b/test/statedefs.js @@ -0,0 +1,76 @@ +import test from 'ava'; +import StateMachine from '../src/app'; +import visualize from '../src/plugin/visualize'; +import {PFXSTR,PFXOBJ} from './imports/dotprefix'; + +test('states defined', t => { + var fsm = new StateMachine({ + init: 'green', + statedefs: [ + { name: 'green' }, + { name: 'red' }, + { name: 'yellow' }, + { name: 'green' } + ], + transitions: [ + { name: 'warn', from: 'green', to: 'yellow' }, + { name: 'panic', from: 'yellow', to: 'red' }, + { name: 'calm', from: 'red', to: 'yellow' }, + { name: 'clear', from: 'yellow', to: 'green' } + ] + }); + + t.is(fsm.state, 'green'); + + fsm.warn(); t.is(fsm.state, 'yellow'); + fsm.panic(); t.is(fsm.state, 'red'); + fsm.calm(); t.is(fsm.state, 'yellow'); + fsm.clear(); t.is(fsm.state, 'green'); + // all works as expected + +}); + +test('states defined with dot', t => { + var fsm = new StateMachine({ + init: 'green', + statedefs: [ + { name: 'green', dot: { fillcolor: "green" } }, + { name: 'red' , dot: { fillcolor: "red" } }, + { name: 'yellow', dot: { fillcolor: "yellow"} }, + { name: 'green', dot: { fillcolor: "green", shape: "rect" } } + ], + transitions: [ + { name: 'warn', from: 'green', to: 'yellow' }, + { name: 'panic', from: 'yellow', to: 'red' }, + { name: 'calm', from: 'red', to: 'yellow' }, + { name: 'clear', from: 'yellow', to: 'green' } + ] + }); + + t.is(visualize(fsm),`digraph "fsm" { +${PFXSTR} + "green" [ fillcolor="green" ]; + "red" [ fillcolor="red" ]; + "yellow" [ fillcolor="yellow" ]; + "green" [ fillcolor="green", shape="rect" ]; + "green" -> "yellow" [ label=" warn " ]; + "yellow" -> "red" [ label=" panic " ]; + "red" -> "yellow" [ label=" calm " ]; + "yellow" -> "green" [ label=" clear " ]; +}`); +}); + +test('transition uses undefined state', t => { + var error = t.throws(function() { new StateMachine({ + statedefs: [ + {name: "roger"}, + {name: "wilco"} + ], + transitions: [ + { name: 'response', from: 'roger', to: 'negative' }, + { name: 'ack', from: 'positive', to: 'wilco' } + ] + })}); + console.log('Error message in error: ' + error.message); + t.is(error.message, 'Undefined states in transitions: "negative, positive"'); +}); From 7e09d5d66d437a72e6c948aa9ae75ec8bad1fe8f Mon Sep 17 00:00:00 2001 From: Rick Berger Date: Sat, 11 Nov 2017 11:06:15 -0700 Subject: [PATCH 10/12] More changes so all tests pass. --- test/{imports => helpers}/dotprefix.js | 1 + test/plugin/visualize.js | 2 +- test/singletest.js | 5 +++-- test/statedefs.js | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) rename test/{imports => helpers}/dotprefix.js (99%) diff --git a/test/imports/dotprefix.js b/test/helpers/dotprefix.js similarity index 99% rename from test/imports/dotprefix.js rename to test/helpers/dotprefix.js index e1d7b53..22cd6a6 100644 --- a/test/imports/dotprefix.js +++ b/test/helpers/dotprefix.js @@ -1,3 +1,4 @@ + /* | dot prefix string will be appended to all dot output */ diff --git a/test/plugin/visualize.js b/test/plugin/visualize.js index 13d670f..3ba3906 100644 --- a/test/plugin/visualize.js +++ b/test/plugin/visualize.js @@ -1,7 +1,7 @@ import test from 'ava' import StateMachine from '../../src/app' import visualize from '../../src/plugin/visualize' -import {PFXSTR,PFXOBJ} from '../imports/dotprefix' +import {PFXSTR,PFXOBJ} from '../helpers/dotprefix' var dotcfg = visualize.dotcfg, // converts FSM to DOT CONFIG dotify = visualize.dotify; // converts DOT CONFIG to DOT OUTPUT diff --git a/test/singletest.js b/test/singletest.js index eeb3768..917acea 100644 --- a/test/singletest.js +++ b/test/singletest.js @@ -12,7 +12,8 @@ import test from 'ava' import StateMachine from '../src/app' import visualize from '../src/plugin/visualize' -import {PFXSTR,PFXOBJ} from './imports/dotprefix' +import {PFXSTR,PFXOBJ} from './helpers/dotprefix' +/** test body - paste test function in here */ -/** test body - paste test function in here */ \ No newline at end of file +test('dummy', t => {}); \ No newline at end of file diff --git a/test/statedefs.js b/test/statedefs.js index 10d8306..73fa87d 100644 --- a/test/statedefs.js +++ b/test/statedefs.js @@ -1,7 +1,7 @@ import test from 'ava'; import StateMachine from '../src/app'; import visualize from '../src/plugin/visualize'; -import {PFXSTR,PFXOBJ} from './imports/dotprefix'; +import {PFXSTR,PFXOBJ} from './helpers/dotprefix'; test('states defined', t => { var fsm = new StateMachine({ From 104de53ece1d54051be342b4c4d1ca2599116318 Mon Sep 17 00:00:00 2001 From: Rick Berger Date: Sat, 11 Nov 2017 11:36:13 -0700 Subject: [PATCH 11/12] rebuilt --- dist/state-machine-visualize.js | 12 ++++++++---- dist/state-machine-visualize.min.js | 2 +- dist/state-machine.js | 2 +- dist/state-machine.min.js | 2 +- lib/state-machine.js | 2 +- lib/visualize.js | 12 ++++++++---- 6 files changed, 20 insertions(+), 12 deletions(-) diff --git a/dist/state-machine-visualize.js b/dist/state-machine-visualize.js index 0f84199..1458878 100644 --- a/dist/state-machine-visualize.js +++ b/dist/state-machine-visualize.js @@ -265,7 +265,11 @@ dotify.gen = function(state) { } dotify.statedef = function(statedef) { - return " " + quote(statedef.name) + dotify.gen.attr(statedef.dot) + ";" + var retstr = " " + quote(statedef.name); + if (statedef.dot) { + retstr += dotify.gen.attr(statedef.dot); + } + return retstr + ";"; } dotify.edge = function(edge) { @@ -294,11 +298,11 @@ dotify.edge.attr = function(edge) { return output.length > 0 ? " [ " + output.join(" ; ") + " ]" : "" } -dotify.gen.attr = function(statedef_dot) { - var n, max, key, keys = Object.keys(statedef_dot).sort(), output = []; +dotify.gen.attr = function(attrs) { + var n, max, key, keys = Object.keys(attrs).sort(), output = []; for(n = 0, max = keys.length ; n < max ; n++) { key = keys[n]; - output.push(key + "=" + quote(statedef_dot[key])) + output.push(key + "=" + quote(attrs[key])) } return output.length > 0 ? " [ " + output.join(", ") + " ]" : "" } diff --git a/dist/state-machine-visualize.min.js b/dist/state-machine-visualize.min.js index 0356c7f..0489b0b 100644 --- a/dist/state-machine-visualize.min.js +++ b/dist/state-machine-visualize.min.js @@ -1 +1 @@ -!function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define("StateMachineVisualize",[],n):"object"==typeof exports?exports.StateMachineVisualize=n():t.StateMachineVisualize=n()}(this,function(){return function(t){function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var e={};return n.m=t,n.c=e,n.i=function(t){return t},n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:r})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},n.p="",n(n.s=1)}([function(t,n,e){"use strict";t.exports=function(t,n){var e,r,o;for(e=1;e0&&(c.states=s),f&&f.length>0&&(c.statedefs=f),a&&a.length>0&&(c.transitions=a),u&&(c.dotPrefix=u),c}function i(t){return" "+t+" "}function s(t){return'"'+t+'"'}function f(t){t=t||{};var n,e,r=t.name||"fsm",o=t.states||[],i=t.transitions||[],a=t.statedefs,u=t.dotPrefix,c=t.rankdir,d=[];if(d.push("digraph "+s(r)+" {"),c&&d.push(" rankdir="+c+";"),u&&d.push(f.dotPrefix(u)),a)for(n=0,e=a.length;n "+s(t.to)+f.edge.attr(t)+";"},f.dotPrefix=function(t){var n,e,r=[],o=Object.keys(t);for(n=0;n0?" [ "+i.join(" ; ")+" ]":""},f.gen.attr=function(t){var n,e,r,o=Object.keys(t).sort(),i=[];for(n=0,e=o.length;n0?" [ "+i.join(", ")+" ]":""},r.dotcfg=o,r.dotify=f,t.exports=r}])}); \ No newline at end of file +!function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define("StateMachineVisualize",[],n):"object"==typeof exports?exports.StateMachineVisualize=n():t.StateMachineVisualize=n()}(this,function(){return function(t){function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}var e={};return n.m=t,n.c=e,n.i=function(t){return t},n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:r})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},n.p="",n(n.s=1)}([function(t,n,e){"use strict";t.exports=function(t,n){var e,r,o;for(e=1;e0&&(c.states=s),f&&f.length>0&&(c.statedefs=f),a&&a.length>0&&(c.transitions=a),u&&(c.dotPrefix=u),c}function i(t){return" "+t+" "}function s(t){return'"'+t+'"'}function f(t){t=t||{};var n,e,r=t.name||"fsm",o=t.states||[],i=t.transitions||[],a=t.statedefs,u=t.dotPrefix,c=t.rankdir,d=[];if(d.push("digraph "+s(r)+" {"),c&&d.push(" rankdir="+c+";"),u&&d.push(f.dotPrefix(u)),a)for(n=0,e=a.length;n "+s(t.to)+f.edge.attr(t)+";"},f.dotPrefix=function(t){var n,e,r=[],o=Object.keys(t);for(n=0;n0?" [ "+i.join(" ; ")+" ]":""},f.gen.attr=function(t){var n,e,r,o=Object.keys(t).sort(),i=[];for(n=0,e=o.length;n0?" [ "+i.join(", ")+" ]":""},r.dotcfg=o,r.dotify=f,t.exports=r}])}); \ No newline at end of file diff --git a/dist/state-machine.js b/dist/state-machine.js index bd7a185..ca03f59 100644 --- a/dist/state-machine.js +++ b/dist/state-machine.js @@ -345,7 +345,7 @@ mixin(Config.prototype, { } } if (undefinedStates.length > 0) { - throw 'Undefined states in transitions: "' + undefinedStates.join(', ') + '"'; + throw new Error('Undefined states in transitions: "' + undefinedStates.join(', ') + '"'); } }, diff --git a/dist/state-machine.min.js b/dist/state-machine.min.js index 574637f..616c530 100644 --- a/dist/state-machine.min.js +++ b/dist/state-machine.min.js @@ -1 +1 @@ -!function(t,n){"object"==typeof exports&&"object"==typeof module?module.exports=n():"function"==typeof define&&define.amd?define("StateMachine",[],n):"object"==typeof exports?exports.StateMachine=n():t.StateMachine=n()}(this,function(){return function(t){function n(e){if(i[e])return i[e].exports;var s=i[e]={i:e,l:!1,exports:{}};return t[e].call(s.exports,s,s.exports,n),s.l=!0,s.exports}var i={};return n.m=t,n.c=i,n.i=function(t){return t},n.d=function(t,i,e){n.o(t,i)||Object.defineProperty(t,i,{configurable:!1,enumerable:!0,get:e})},n.n=function(t){var i=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(i,"a",i),i},n.o=function(t,n){return Object.prototype.hasOwnProperty.call(t,n)},n.p="",n(n.s=5)}([function(t,n,i){"use strict";t.exports=function(t,n){var i,e,s;for(i=1;i0)throw'Undefined states in transitions: "'+f.join(", ")+'"'},transitionFor:function(t,n){var i=this.defaults.wildcard;return this.map[t][n]||this.map[i][n]},transitionsFor:function(t){var n=this.defaults.wildcard;return Object.keys(this.map[t]).concat(Object.keys(this.map[n]))},allStates:function(){return this.states},allTransitions:function(){return this.transitions}}),t.exports=e},function(t,n,i){function e(t,n){this.context=t,this.config=n,this.state=n.init.from,this.observers=[t]}var s=i(0),r=i(6),o=i(1),a=[null,[]];s(e.prototype,{init:function(t){if(s(this.context,this.config.data.apply(this.context,t)),o.hook(this,"init"),this.config.init.active)return this.fire(this.config.init.name,[])},is:function(t){return Array.isArray(t)?t.indexOf(this.state)>=0:this.state===t},isPending:function(){return this.pending},can:function(t){return!this.isPending()&&!!this.seek(t)},cannot:function(t){return!this.can(t)},allStates:function(){return this.config.allStates()},allTransitions:function(){return this.config.allTransitions()},transitions:function(){return this.config.transitionsFor(this.state)},seek:function(t,n){var i=this.config.defaults.wildcard,e=this.config.transitionFor(this.state,t),s=e&&e.to;return"function"==typeof s?s.apply(this.context,n):s===i?this.state:s},fire:function(t,n){return this.transit(t,this.state,this.seek(t,n),n)},transit:function(t,n,i,e){var s=this.config.lifecycle,r=this.config.options.observeUnchangedState||n!==i;return i?this.isPending()?this.context.onPendingTransition(t,n,i):(this.config.addState(i),this.beginTransit(),e.unshift({transition:t,from:n,to:i,fsm:this.context}),this.observeEvents([this.observersForEvent(s.onBefore.transition),this.observersForEvent(s.onBefore[t]),r?this.observersForEvent(s.onLeave.state):a,r?this.observersForEvent(s.onLeave[n]):a,this.observersForEvent(s.on.transition),r?["doTransit",[this]]:a,r?this.observersForEvent(s.onEnter.state):a,r?this.observersForEvent(s.onEnter[i]):a,r?this.observersForEvent(s.on[i]):a,this.observersForEvent(s.onAfter.transition),this.observersForEvent(s.onAfter[t]),this.observersForEvent(s.on[t])],e)):this.context.onInvalidTransition(t,n,i)},beginTransit:function(){this.pending=!0},endTransit:function(t){return this.pending=!1,t},failTransit:function(t){throw this.pending=!1,t},doTransit:function(t){this.state=t.to},observe:function(t){if(2===t.length){var n={};n[t[0]]=t[1],this.observers.push(n)}else this.observers.push(t[0])},observersForEvent:function(t){for(var n,i=0,e=this.observers.length,s=[];i0)throw new Error('Undefined states in transitions: "'+f.join(", ")+'"')},transitionFor:function(t,n){var i=this.defaults.wildcard;return this.map[t][n]||this.map[i][n]},transitionsFor:function(t){var n=this.defaults.wildcard;return Object.keys(this.map[t]).concat(Object.keys(this.map[n]))},allStates:function(){return this.states},allTransitions:function(){return this.transitions}}),t.exports=e},function(t,n,i){function e(t,n){this.context=t,this.config=n,this.state=n.init.from,this.observers=[t]}var s=i(0),r=i(6),o=i(1),a=[null,[]];s(e.prototype,{init:function(t){if(s(this.context,this.config.data.apply(this.context,t)),o.hook(this,"init"),this.config.init.active)return this.fire(this.config.init.name,[])},is:function(t){return Array.isArray(t)?t.indexOf(this.state)>=0:this.state===t},isPending:function(){return this.pending},can:function(t){return!this.isPending()&&!!this.seek(t)},cannot:function(t){return!this.can(t)},allStates:function(){return this.config.allStates()},allTransitions:function(){return this.config.allTransitions()},transitions:function(){return this.config.transitionsFor(this.state)},seek:function(t,n){var i=this.config.defaults.wildcard,e=this.config.transitionFor(this.state,t),s=e&&e.to;return"function"==typeof s?s.apply(this.context,n):s===i?this.state:s},fire:function(t,n){return this.transit(t,this.state,this.seek(t,n),n)},transit:function(t,n,i,e){var s=this.config.lifecycle,r=this.config.options.observeUnchangedState||n!==i;return i?this.isPending()?this.context.onPendingTransition(t,n,i):(this.config.addState(i),this.beginTransit(),e.unshift({transition:t,from:n,to:i,fsm:this.context}),this.observeEvents([this.observersForEvent(s.onBefore.transition),this.observersForEvent(s.onBefore[t]),r?this.observersForEvent(s.onLeave.state):a,r?this.observersForEvent(s.onLeave[n]):a,this.observersForEvent(s.on.transition),r?["doTransit",[this]]:a,r?this.observersForEvent(s.onEnter.state):a,r?this.observersForEvent(s.onEnter[i]):a,r?this.observersForEvent(s.on[i]):a,this.observersForEvent(s.onAfter.transition),this.observersForEvent(s.onAfter[t]),this.observersForEvent(s.on[t])],e)):this.context.onInvalidTransition(t,n,i)},beginTransit:function(){this.pending=!0},endTransit:function(t){return this.pending=!1,t},failTransit:function(t){throw this.pending=!1,t},doTransit:function(t){this.state=t.to},observe:function(t){if(2===t.length){var n={};n[t[0]]=t[1],this.observers.push(n)}else this.observers.push(t[0])},observersForEvent:function(t){for(var n,i=0,e=this.observers.length,s=[];i 0) { - throw 'Undefined states in transitions: "' + undefinedStates.join(', ') + '"'; + throw new Error('Undefined states in transitions: "' + undefinedStates.join(', ') + '"'); } }, diff --git a/lib/visualize.js b/lib/visualize.js index 0f84199..1458878 100644 --- a/lib/visualize.js +++ b/lib/visualize.js @@ -265,7 +265,11 @@ dotify.gen = function(state) { } dotify.statedef = function(statedef) { - return " " + quote(statedef.name) + dotify.gen.attr(statedef.dot) + ";" + var retstr = " " + quote(statedef.name); + if (statedef.dot) { + retstr += dotify.gen.attr(statedef.dot); + } + return retstr + ";"; } dotify.edge = function(edge) { @@ -294,11 +298,11 @@ dotify.edge.attr = function(edge) { return output.length > 0 ? " [ " + output.join(" ; ") + " ]" : "" } -dotify.gen.attr = function(statedef_dot) { - var n, max, key, keys = Object.keys(statedef_dot).sort(), output = []; +dotify.gen.attr = function(attrs) { + var n, max, key, keys = Object.keys(attrs).sort(), output = []; for(n = 0, max = keys.length ; n < max ; n++) { key = keys[n]; - output.push(key + "=" + quote(statedef_dot[key])) + output.push(key + "=" + quote(attrs[key])) } return output.length > 0 ? " [ " + output.join(", ") + " ]" : "" } From 2e0d491eeb8b3845823d9f695978dec279dc17e1 Mon Sep 17 00:00:00 2001 From: rickb Date: Fri, 17 Nov 2017 11:10:11 -0500 Subject: [PATCH 12/12] Added check for transition same name as state. Added tests. --- lib/state-machine.js | 278 +++++++------------------------------------ src/config.js | 37 +++++- test/statedefs.js | 84 ++++++++++++- 3 files changed, 159 insertions(+), 240 deletions(-) diff --git a/lib/state-machine.js b/lib/state-machine.js index ca03f59..d6843f8 100644 --- a/lib/state-machine.js +++ b/lib/state-machine.js @@ -145,242 +145,14 @@ module.exports = { /***/ }), /* 2 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -//------------------------------------------------------------------------------------------------- - -function camelize(label) { - - if (label.length === 0) - return label; - - var n, result, word, words = label.split(/[_-]/); - - // single word with first character already lowercase, return untouched - if ((words.length === 1) && (words[0][0].toLowerCase() === words[0][0])) - return label; - - result = words[0].toLowerCase(); - for(n = 1 ; n < words.length ; n++) { - result = result + words[n].charAt(0).toUpperCase() + words[n].substring(1).toLowerCase(); - } - - return result; -} - -//------------------------------------------------------------------------------------------------- - -camelize.prepended = function(prepend, label) { - label = camelize(label); - return prepend + label[0].toUpperCase() + label.substring(1); -} - -//------------------------------------------------------------------------------------------------- - -module.exports = camelize; +/***/ (function(module, exports) { +throw new Error("Module parse failed: /Users/Shared/dev/web/javascript-state-machine/src/config.js Unexpected token (171:72)\nYou may need an appropriate loader to handle this file type.\n| if (errStr.length > 0)\n| errStr += '\\n';\n| errStr += 'Transition name same as state: \"' + sameAsTrans.join(, ) + '\"';\n| }\n| throw new Error(errStr);"); /***/ }), /* 3 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; - - -//------------------------------------------------------------------------------------------------- - -var mixin = __webpack_require__(0), - camelize = __webpack_require__(2); - -//------------------------------------------------------------------------------------------------- - -function Config(options, StateMachine) { - - options = options || {}; - - this.options = options; // preserving original options can be useful (e.g visualize plugin) - this.defaults = StateMachine.defaults; - this.states = []; - this.transitions = []; - this.map = {}; - this.lifecycle = this.configureLifecycle(); - this.init = this.configureInitTransition(options.init); - this.data = this.configureData(options.data); - this.methods = this.configureMethods(options.methods); - this.dotPrefix = options['dotPrefix'] || this.defaults.dotPrefix; - this.hasStateDefs = false; - - this.map[this.defaults.wildcard] = {}; - - if (options['statedefs']) { - this.hasStateDefs = true; - this.configureStateDefs(options['statedefs']); - } - - this.configureTransitions(options.transitions || []); - - this.plugins = this.configurePlugins(options.plugins, StateMachine.plugin); - -} - -//------------------------------------------------------------------------------------------------- - -mixin(Config.prototype, { - - addState: function(name) { - if (!this.map[name]) { - this.states.push(name); - this.addStateLifecycleNames(name); - this.map[name] = {}; - } - }, - - addStateLifecycleNames: function(name) { - this.lifecycle.onEnter[name] = camelize.prepended('onEnter', name); - this.lifecycle.onLeave[name] = camelize.prepended('onLeave', name); - this.lifecycle.on[name] = camelize.prepended('on', name); - }, - - addTransition: function(name) { - if (this.transitions.indexOf(name) < 0) { - this.transitions.push(name); - this.addTransitionLifecycleNames(name); - } - }, - - addTransitionLifecycleNames: function(name) { - this.lifecycle.onBefore[name] = camelize.prepended('onBefore', name); - this.lifecycle.onAfter[name] = camelize.prepended('onAfter', name); - this.lifecycle.on[name] = camelize.prepended('on', name); - }, - - mapTransition: function(transition) { - var name = transition.name, - from = transition.from, - to = transition.to; - this.addState(from); - if (typeof to !== 'function') - this.addState(to); - this.addTransition(name); - this.map[from][name] = transition; - return transition; - }, - - configureLifecycle: function() { - return { - onBefore: { transition: 'onBeforeTransition' }, - onAfter: { transition: 'onAfterTransition' }, - onEnter: { state: 'onEnterState' }, - onLeave: { state: 'onLeaveState' }, - on: { transition: 'onTransition' } - }; - }, - - configureInitTransition: function(init) { - if (typeof init === 'string') { - return this.mapTransition(mixin({}, this.defaults.init, { to: init, active: true })); - } - else if (typeof init === 'object') { - return this.mapTransition(mixin({}, this.defaults.init, init, { active: true })); - } - else { - this.addState(this.defaults.init.from); - return this.defaults.init; - } - }, - - configureData: function(data) { - if (typeof data === 'function') - return data; - else if (typeof data === 'object') - return function() { return data; } - else - return function() { return {}; } - }, - - configureMethods: function(methods) { - return methods || {}; - }, - - configurePlugins: function(plugins, builtin) { - plugins = plugins || []; - var n, max, plugin; - for(n = 0, max = plugins.length ; n < max ; n++) { - plugin = plugins[n]; - if (typeof plugin === 'function') - plugins[n] = plugin = plugin() - if (plugin.configure) - plugin.configure(this); - } - return plugins - }, - - configureStateDefs: function(statedefs) { - var n; - for (n = 0; n < statedefs.length; n++) { - this.addState(statedefs[n].name); - } - }, - - configureTransitions: function(transitions) { - var i, n, transition, fromStates, from, to, wildcard = this.defaults.wildcard; - var undefinedStates = []; - for(n = 0 ; n < transitions.length ; n++) { - transition = transitions[n]; - fromStates = Array.isArray(transition.from) ? transition.from : [transition.from || wildcard] - to = transition.to || wildcard; - if (this.hasStateDefs && to !== wildcard && this.states.indexOf(to) === -1) { - undefinedStates.push(to); - } - for(i = 0 ; i < fromStates.length ; i++) { - from = fromStates[i]; - if (this.hasStateDefs && from !== wildcard && from !== 'none' && - this.states.indexOf(from) === -1) { - undefinedStates.push(from); - } - this.mapTransition({ name: transition.name, from: from, to: to }); - } - } - if (undefinedStates.length > 0) { - throw new Error('Undefined states in transitions: "' + undefinedStates.join(', ') + '"'); - } - }, - - transitionFor: function(state, transition) { - var wildcard = this.defaults.wildcard; - return this.map[state][transition] || - this.map[wildcard][transition]; - }, - - transitionsFor: function(state) { - var wildcard = this.defaults.wildcard; - return Object.keys(this.map[state]).concat(Object.keys(this.map[wildcard])); - }, - - allStates: function() { - return this.states; - }, - - allTransitions: function() { - return this.transitions; - } - -}); - -//------------------------------------------------------------------------------------------------- - -module.exports = Config; - -//------------------------------------------------------------------------------------------------- - - -/***/ }), -/* 4 */ -/***/ (function(module, exports, __webpack_require__) { - var mixin = __webpack_require__(0), Exception = __webpack_require__(6), @@ -565,6 +337,46 @@ module.exports = JSM; //------------------------------------------------------------------------------------------------- +/***/ }), +/* 4 */ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +//------------------------------------------------------------------------------------------------- + +function camelize(label) { + + if (label.length === 0) + return label; + + var n, result, word, words = label.split(/[_-]/); + + // single word with first character already lowercase, return untouched + if ((words.length === 1) && (words[0][0].toLowerCase() === words[0][0])) + return label; + + result = words[0].toLowerCase(); + for(n = 1 ; n < words.length ; n++) { + result = result + words[n].charAt(0).toUpperCase() + words[n].substring(1).toLowerCase(); + } + + return result; +} + +//------------------------------------------------------------------------------------------------- + +camelize.prepended = function(prepend, label) { + label = camelize(label); + return prepend + label[0].toUpperCase() + label.substring(1); +} + +//------------------------------------------------------------------------------------------------- + +module.exports = camelize; + + /***/ }), /* 5 */ /***/ (function(module, exports, __webpack_require__) { @@ -575,10 +387,10 @@ module.exports = JSM; //----------------------------------------------------------------------------------------------- var mixin = __webpack_require__(0), - camelize = __webpack_require__(2), + camelize = __webpack_require__(4), plugin = __webpack_require__(1), - Config = __webpack_require__(3), - JSM = __webpack_require__(4); + Config = __webpack_require__(2), + JSM = __webpack_require__(3); //----------------------------------------------------------------------------------------------- diff --git a/src/config.js b/src/config.js index 833d132..dd23e67 100644 --- a/src/config.js +++ b/src/config.js @@ -20,8 +20,18 @@ function Config(options, StateMachine) { this.init = this.configureInitTransition(options.init); this.data = this.configureData(options.data); this.methods = this.configureMethods(options.methods); - this.dotPrefix = options['dotPrefix'] || this.defaults.dotPrefix; this.hasStateDefs = false; + if (Object.keys(options).indexOf('dotPrefix') >=0 ) { + this.dotPrefix = options['dotPrefix']; + if (this.dotPrefix !== null && + typeof this.dotPrefix === 'object' && + Object.keys(this.dotPrefix).length === 0) { + this.dotPrefix = null; + } + } + else { + this.dotPrefix = this.defaults.dotPrefix; + } this.map[this.defaults.wildcard] = {}; @@ -137,14 +147,20 @@ mixin(Config.prototype, { configureTransitions: function(transitions) { var i, n, transition, fromStates, from, to, wildcard = this.defaults.wildcard; - var undefinedStates = []; + var undefinedStates = [], sameAsTrans = []; for(n = 0 ; n < transitions.length ; n++) { transition = transitions[n]; fromStates = Array.isArray(transition.from) ? transition.from : [transition.from || wildcard] to = transition.to || wildcard; - if (this.hasStateDefs && to !== wildcard && this.states.indexOf(to) === -1) { - undefinedStates.push(to); + if (this.hasStateDefs) { + if (this.states.indexOf(transition.name) >= 0) { + sameAsTrans.push(transition.name); + } + if (to !== wildcard && this.states.indexOf(to) === -1) { + undefinedStates.push(to); + } } + for(i = 0 ; i < fromStates.length ; i++) { from = fromStates[i]; if (this.hasStateDefs && from !== wildcard && from !== 'none' && @@ -154,8 +170,17 @@ mixin(Config.prototype, { this.mapTransition({ name: transition.name, from: from, to: to }); } } - if (undefinedStates.length > 0) { - throw new Error('Undefined states in transitions: "' + undefinedStates.join(', ') + '"'); + if (undefinedStates.length > 0 || sameAsTrans.length > 0) { + var errStr = ''; + if (undefinedStates.length > 0) { + errStr += 'Undefined states in transitions: "' + undefinedStates.join(', ') + '"'; + } + if (sameAsTrans.length > 0) { + if (errStr.length > 0) + errStr += '\n'; + errStr += 'Transition name same as state: "' + sameAsTrans.join(', ') + '"'; + } + throw new Error(errStr); } }, diff --git a/test/statedefs.js b/test/statedefs.js index 73fa87d..5ed1325 100644 --- a/test/statedefs.js +++ b/test/statedefs.js @@ -60,6 +60,64 @@ ${PFXSTR} }`); }); +test('clear dotPrefix (empty)', t => { + var fsm = new StateMachine({ + dotPrefix: {}, + statedefs: [ + {name: "roger"}, + {name: "wilco"} + ], + transitions: [ + { name: 'affirm', from: 'roger', to: 'wilco' }, + ] + }); + t.is(visualize(fsm),`digraph "fsm" { + "roger"; + "wilco"; + "roger" -> "wilco" [ label=" affirm " ]; +}`); +}); + +test('clear dotPrefix (null)', t => { + var fsm = new StateMachine({ + dotPrefix: null, + statedefs: [ + {name: "roger"}, + {name: "wilco"} + ], + transitions: [ + { name: 'affirm', from: 'roger', to: 'wilco' }, + ] + }); + t.is(visualize(fsm),`digraph "fsm" { + "roger"; + "wilco"; + "roger" -> "wilco" [ label=" affirm " ]; +}`); +}); + + +test('redefine dotPrefix', t => { + var fsm = new StateMachine({ + dotPrefix: { + node: { fillColor: 'red' } + }, + statedefs: [ + {name: "roger"}, + {name: "wilco"} + ], + transitions: [ + { name: 'affirm', from: 'roger', to: 'wilco' }, + ] + }); + t.is(visualize(fsm),`digraph "fsm" { + node [ fillColor="red" ]; + "roger"; + "wilco"; + "roger" -> "wilco" [ label=" affirm " ]; +}`); +}); + test('transition uses undefined state', t => { var error = t.throws(function() { new StateMachine({ statedefs: [ @@ -71,6 +129,30 @@ test('transition uses undefined state', t => { { name: 'ack', from: 'positive', to: 'wilco' } ] })}); - console.log('Error message in error: ' + error.message); t.is(error.message, 'Undefined states in transitions: "negative, positive"'); }); + +test('transition name contained in states', t => { + var error = t.throws(function() { new StateMachine({ + statedefs: [ + {name: "roger"}, + {name: "wilco"} + ], + transitions: [ + { name: 'roger', from: 'roger', to: 'wilco' }, + ] + })}); + t.is(error.message, 'Transition name same as state: "roger"'); +}); + +test('transition name in states AND undefined state in transition', t => { + var error = t.throws(function() { new StateMachine({ + statedefs: [ + {name: "roger"}, + ], + transitions: [ + { name: 'roger', from: 'roger', to: 'negative' }, + ] + })}); + t.is(error.message, 'Undefined states in transitions: "negative"\nTransition name same as state: "roger"'); +}); \ No newline at end of file