Transparent Synchronous Dataflow
Steven W.T. Cheunga, Dan R. Ghicaa, and Koko Muroyaa,b a University of Birmingham b RIMS, Kyoto University
Abstract Dataflow programming is a popular and convenient programming paradigm in systems modelling, optimisation, and machine learning. It has a number of advantages, for instance the lacks of control flow allows computation to be carried out in parallel as well as in distributed machines. More recently the idea of dataflow graphs has also been brought into the design of various deep learning frameworks. They facilitate an easy and efficient implementation of automatic differentiation, which is the heart of modern deep learning paradigm. Many dataflow languages are ‘modal’ in the sense that the dataflow graph is ‘constructed’ in an ambient environment then ‘executed’ using special commands. Simulink, earlier Tensorflow, Lucid Synchrone (LS) or Self-adjusting computation (SAC) are examples of such languages. We are interested in modal dataflow languages in which the ambient environment is a fully fledged functional and imperative language. Such ambient languages make creating complex and large models easier, but they raise questions of language design, safety and efficiency. LS provides a way to define dataflow graphs through co-recursive equations of streams. In these cases the interesting issue is efficiency, particularly of memory utilisation. A semantically interesting question occurs in the case of languages which allow the explicit manipulation of the dataflow graph using imperative constructs. This is the case of early Tensorflow and imperative SAC. However the meta-programming styleof TensorFlow in which special commands are used to construct imperatively a dataflow graph was considered awkward and error prone, and TensorFlow moved away from it. Constructing a dataflow graph imperatively can be convenient, but both Tensorflow and SAC are unsafe, in the sense that ‘illegal’ dataflow graphscan be constructed during the execution, which leads to unsafe behaviour. These problems can be avoided by a judicious language design. We present an idealised calculus for dataflow with both imperative and functional features using an abstract machine model based on Geometry of Interaction enhanced with rewriting features (‘Dynamic GoI’). Although the language is modal, with distinct executions for the PCF-like fragment and the DFG fragment, the syntax of the language is uniform. So the language lacks the “metaprogramming” feel of TensorFlow and other embedded DSL-like solutions. Concretely, any operator is used in the same way whether as a part of the host language or the DFG. This is akin to operator overloading, except that it is realised an a purely semantic way. Establishing a “semantic context”, defined by its history of execution, is as far as we know a novel approach which, as we shall see, will require a novel approach to semantics. We have also proved safety of the language and its in-principle efficiency. A prototype implementation of the calculus is also described, as a PPX extension of the OCaml programming language.
ACM CCS 2012 Theory of computation → Operational semantics; Keywords Semantics of programming languages, Dataflow computation, Geometry of Interaction, Synchronous computation
The Art, Science, and Engineering of Programming
Submitted June 21, 2020
Published February 28, 2021 doi 10.22152/programming-journal.org/2021/5/12
© Steven W.T. Cheung, Dan R. Ghica, and Koko Muroya This work is licensed under a “CC BY 4.0” license. In The Art, Science, and Engineering of Programming, vol. 5, no. 3, 2021, article 12; 55 pages. Transparent Synchronous Dataflow
1 Introduction
1.1 Background
Dataflow programming is a broad programming paradigm loosely based onthe principle that computation is organised as a graph in which data-changes to the inputs are propagated to the outputs in a more-or-less automatic manner. Notable examples include spreadsheets [51], system analysis and simulation [16], machine learning [1], embedded reactive systems [28], functional reactive programming (FRP) [18] and more. One of the attractive features of dataflow systems is that their native mode of operation lacks control flow, so it is inherently parallel. This makes issues suchas synchrony and (non)determinism pertinent. The parallelism of dataflow system is transparent, with much of the event-level manipulation hidden from the programmer, so ‘lower level’ issues such as deadlock are usually not a concern. Pure dataflow programming is convenient, but only suitable for particular applications. So it is more common to have dataflow-style idioms and libraries within general purpose programming. This is the case with FRP. The language design challenge is non- trivial. When the host language is used natively to construct the dataflow graph gross inefficiency can be a serious problem, particularly when streams of data must be merged, which leads to explosive memory requirements. This is unavoidable in monadic FRP, where the monad multiplication requires the merging of a stream of streams into a single stream. Different languages deal with this problems in different ways, for example by replacing monads with ‘arrows’ in FRP [37], by using temporal type systems [33], or by clocking each data stream in such a way that streams can be merged using fixed-size buffers [12]. Whereas dataflow functionality can be seamlessly integrated into a larger lan- guage (FRP for Haskell) ‘modal’ behaviour, consisting of a model-building mode and a model-execution mode remains popular for nich languages. Simulink [16], earlier Tensorflow [1], or Lucid Synchrone [40] are examples of such languages. These lan- guages have two distinct modes of execution, one that constructs the dataflow model using a more expressive host language, and one that executes the dataflow model. An extremal example are spreadsheet programs in which the model-building mode is usually the manual manipulation of the spreadsheet itself in the application, and the model execution mode is the fully transparent propagation of changes whenever the value of a spreadsheet cell is changed. More recently, these dataflow oriented programming languages have become at- tractive because they facilitate an easy and efficient implementation of automatic differentiation (AD) [27] . Most conventional AD techniques apply to so-called “straight line code” which corresponds to ground-type recursion-free pure functional code. Be- n n cause models in general have type R R the restriction to straight-line code is not crippling. However, in practice constructing→ large models of a complex graph topology, for instance a neural network with tens of thousands of parameters, requires that the model is created using a more expressive programming language. Only the runtime version of the model is then straight-line code. There are some notable exceptions to
12:2 Steven W.T. Cheung, Dan R. Ghica, and Koko Muroya the rule, for example LSTM neural networks which have a stateful model [22], but this is a very popular programming paradigm. The straight-line-code model can be constructed in meta-programming style in platforms such as early TensorFlow, but this programming model is considered awkward, although very suitable for AD. Models specified seamlessly in an expressive programming languages are a more convenient way to program, but interaction with AD becomes much more difficult. Applying AD to higher order languages with or without effects remains an active area of research without definitive solutions [6].
1.2 Problem statement and contribution
Dataflow languages are extremely popular— the number of spreadsheet users alone greatly exceeds the number of programmers of any mainstream programming lan- guage — so studying them is arguably worthwhile. Semantically, so long as such languages are hosted inside safe languages, safety is not an issue. Safety is also not an issue in the case of ‘pure’ dataflow languages, in which the semantic model canbe expressed denotationally via systems of recursive and co-recursive equations, such as in the case of Lucid Synchrone [9]. In these cases the interesting issue is efficiency, particularly of memory utilisation. A semantically interesting question occurs in the case of languages which allow the explicit manipulation of the dataflow graph using imperative constructs. This is the case of Tensorflow [1] and of (imperative) self-adjusting computation (SAC) systems such as the Incremental library for OCaml [43]. The latter, although primarily intended for usage in high-performance computation [2], proved to be a convenient dataflow idiom for user interfaces and web programming. Constructing a dataflow graph imperatively can be convenient, but both Tensor- Flow and Incremental are unsafe, in the sense that ‘illegal’ dataflow graphs can be constructed during the execution, which leads to unsafe behaviour. In the case of TensorFlow it is possible for the dataflow evaluation to diverge because of cyclic dependencies, whereas in the case of Incremental illegal dataflow graphs with cycles cause crashes. These problems can be avoided by a judicious language design. In this paper we propose a programming language which is: imperative: the dataflow (computation) graph is explicitly manipulated using com- mands; functional: the language includes (call-by-value) PCF [48] as a subset; simply-typed: the type system is essentially that of PCF; modal: the execution of the dataflow (computation) graph is also controlled by explicit commands; parallel: the dataflow graph is executed in parallel. For such a programming language, establishing safety and memory efficiency are both challenging and non-trivial problems. Our theoretical contributions are: specification: we give a precise mathematical definition of the language using an abstract machine, harmonising the semantics of the PCF-like language with that of dataflow;
12:3 Transparent Synchronous Dataflow safety: we show that for any well-typed program the abstract machine executes without reaching illegal states; deterministic: we show that the parallel evaluation of the dataflow graph produces deterministic results; termination: moreover, we show that the execution of any recursion-free program with dataflow terminates by reaching the final state of the abstract machine; efficiency: we prove that no operation is ‘expensive’ in terms of time and memory utilisation.
Remark. These technical results add up to the most important contribution of the paper, which is one of programming language design. We demonstrated that functional and dataflow programming, resulting in the runtime creation of straight-line-code models, can be integrated seamlessly (syntactically and semantically), safely, and efficiently.
2 Synchronous Dataflow
Before technical details are provided let us try to understand the intended semantics of the language via some simple examples. This examples, although simple, should illustrate the versatility of the imperative style of constructing dataflow graphs. The starting language is call-by-value PCF, a typical language combining the simply-typed lambda calculus with arithmetic-logical operations and recursion. To it we add a new type of Cells along with facilities for manipulating them. The distinction between the type of cells and type of integers is more subtle than in languages with assignable state: the nodes in the dataflow graph have type Cell whereas their inputs and outputs are edges and have type Int. Note that in our graphs, the edges represent the dependency relations between nodes, therefore the input of a node would be represented by its outgoing edge (on top) while the output its incoming edge (at the bottom).
2.1 Dataflow graphs
The default mode of a program is to construct a dataflow graph, which we will describe now. The nodes of a dataflow graph are: Constants have a single output edge and produce the value stored in the node. Arithmetic-logic operators have two input edges and one output edge and compute the operation accordingly. Contraction nodes have multiple outputs and a single input, copying their input value to the outputs. They are labelled by a c. If-then-else have a control input and two input branches, but behave like selectors rather than control-flow operators. Cells have a single input, which can modify the stored value, which is the output. They are labelled with their current value in curly brackets.
12:4 Steven W.T. Cheung, Dan R. Ghica, and Koko Muroya
For example, the very simple dataflow graph (DFG) in 2 3 figure 1 computes the expression if y x then x else y, with {0} {1} variables (cells) initially x 0, y ≤1. The inputs of the = = c c cells are connected to the constants 2 and 3, respectively. On the first execution the DFG will produce 1 and update the <= cells. On any subsequent execution the DFG will produce 3.
Note that we are drawing the DFG rather unusually, with the if arrows indicating data dependencies rather than the dynamics of the data flow. Figure 1 If The only non-obvious behaviour here is that of the if state- ment. In a conventional language it is a control-flow operator, which will evaluate first the test then only one of the branches, depending onthe value of the test. In a dataflow setting both branches of the if statement compute, with the test selecting which value is propagated further down. Crucially,what we mean by “an execution” is a propagation of values in the DFG until they either reach the output or they 1 reach and subsequently updated every cell at most once. This - is the sense in which the DFG is “synchronous”, much like a {1} digital circuit. Along computation data travels independently and possibly asynchronously, but all memory cells serve as c synchronisation points. In figure 2 we can see a DFG which produces 1s and 0s, alternately, with each execution. On each Figure 2 Alternating execution the memory cell is updated x0 = 1 x. − Remark. The drawing of the DFG is unusual in that we point the arrows in the direction that indicates data dependencies rather than information flow. The reason is that the actual execution of the DFG, discussed in section 3, is demand-driven, which each DFG node first requesting data from their dependents, which request data from their dependents, and so on. This more elaborate execution mode requires some auxiliary nodes which we have omitted in this initial, informal, presentation.
2.2 Graph construction and manipulation
The host language is call-by-value PCF, extended with several key new operations used to create and manipulate DFGs: ref : Int Cell: create and return a new cell node in the dataflow graph initialised with→ an integer value; deref : Cell Int: take a cell node in the dataflow graph as argument and produce an incoming→ edge as result; root : Cell Int: take a cell node in the dataflow graph and return its outgoing edge; → link : Cell Int Unit: take a cell node and change its outgoing edge to the edge given as→ an argument.→ To construct programs it is convenient to also have more conventional assignment and dereferencing operations for instantly changing and reading the values of cells
12:5 Transparent Synchronous Dataflow
1 -
{1} x C 1 x f - + +
{i} {1} {0} {0}
C C C C
s s s s (a) (b) (c) (d)
Figure 3 Informal examples rather than just manipulating dependencies. In these operations the type Integer is interpreted in the conventional way, as a value. This dual treatment of the type of integers may seem ambiguous, but it is not, because each integer value can be also seen as an immutable node in the dataflow graph. Taking the value itself or the edge of the node means the same thing. assign : Cell Int Unit: change the constant of a cell instantly; → → peek : Int Int: extract the value of a cell instantly. Finally→ the command step : Int activates the computation in the dataflow graph by updating the contents of each cell in parallel, and at most once, if its dependencies have changed. This allows computing in dataflow graphs with cycles, provided that each cycle contains at least one cell. In effect, the model of propagation is synchronous, with the cells serving as synchronisation points. The command will return the number of updated cells in an update cycle. Knowing the number of updated cells is a useful convenience, as it will allow repeating the propagation step until the graph ‘stabilises’, i.e. no more updates happen. This is normally possible if and only if the dataflow graph lacks cycles. For the purpose of examples we consider a standard ‘let’ construct as syntactic sugar. Let us now consider a ‘hello world’ style example for dataflow computation: state machines. A generic state machine is created in our language by a function (sm) taking as arguments an initial value i, a transition function f , and a input x:
let sm = λi.λf .λx.let s = ref i in link s (f s x); deref s
Because of the way i is used as an argument to reference creation we can think of it as a plain integer value, whereas f and x should be thought of as edges in the dataflow graph. The resulting graph will have outgoing edges x, and incoming edge deref s. Besides the i-initialised cell-node it will also include a special ‘contraction’ node C so that the incoming edge can be used both as output and as cyclic dependency. The function f will be used, during execution, to create a desired dataflow graph. The resulting dataflow will have the general shape given in figure 3a.
12:6 Steven W.T. Cheung, Dan R. Ghica, and Koko Muroya
Let us call the function above sm and consider some simple instantiations, the examples are also available in the online visualiser1: oscillator is a state machine which alternates between 0 and 1, defined as let al t = sm 1 (λs.λi.1 deref s) 0. Note that the outgoing edge is not used, and 0 is a dummy value. The created− dataflow graph is represented informally in figure 3b, where the sub-graph produced when the particular transition function was supplied now has nodes for addition and the constant 1. The cell is initialised to 1. sum is a state machine which accumulates the value of its inputs into the state, defined as let sum = λx.sm 0 (λs.λi.i + deref s) x. The dataflow graph is sketched out in figure 3c. composite is a state machine which connects the incoming edge of the oscillator to the outgoing edge of the accumulator, defined as let a = sum(deref al t). It can be seen in figure 3d. The code above only constructs the dataflow graph. To execute it we need to execute the step command along with peek a to read the output. After one step, for example, the first cell will change its stored value from 1 to 0, and the second one from0to1. After another step the cells will further change to 1 and 1, respectively, and so on. Similar programs written in Lucid Synchrone and ReactiveML are shown in ap- pendix A.
Remark. Although the language is modal, with distinct executions for the PCF-like fragment and the DFG fragment, the syntax of the language is uniform. So the language lacks the “metaprogramming” feel of TensorFlow and other embedded DSL-like solutions. Concretely, any operator is used in the same way whether as a part of the host language or the DFG. For example, when we write u + v the semantic interpretation is able to tease out whether this is PCF addition or DFG addition. This requires no static analysis or other syntactic solutions such as types, type classes, operator overloading and so on. This is akin to operator overloading, except that it is realised an a purely semantic way. Establishing a “semantic context”, defined by its history of execution, is as far as we know a novel approach which, as we shall see, will require a novel approach to semantics.
2.3 Formal syntax
The calculus is an extension of the simply-typed lambda calculus with base types integers, integer cells, and unit. Let γ ::= Int Cell Unit. These are the base types. | | The language has simple types as defined by the grammar τ ::= γ τ τ. Terms are defined by the grammar below with $ being arithmetic operations.| →
t ::= x λx.t t t n op if t then t else t rec x.t | | | | | | where op ranges over arithmetic operators +, , , : Int Int Int and the impera- tive operations on dataflow graphs mentioned− × earlier.÷ → The →typing rules of the calculus are the standard ones for the simply-typed call-by-value PCF (figure 4).
1 https://cwtsteven.github.io/TSD-visual?ex=alt/
12:7 Transparent Synchronous Dataflow
Γ t0 : τ τ0 Γ t : τ ` → ` Γ , x : τ x : τ Γ n : Int Γ op : τ Γ t0 t : τ0 ` ` ` ` , f : t : Γ , x : τ t : τ0 Γ t : Int Γ t1 : γ Γ t1 : γ Γ τ τ0 τ τ0 ` ` ` ` → ` → Γ λx.t : τ τ0 Γ if t then t1 else t2 : γ Γ rec f .t : τ τ0 ` → ` ` →
Figure 4 Typing rules
3 Abstract machine semantics
3.1 The Dynamic Geometry of Interaction
We will formulate the semantics of the language using a graph-rewriting abstract machine called the Dynamic Geometry of Interaction Machine (DGoIM). An abstract machine semantics has the desirable feature that it can allow reasoning about the cost of computation. In fact the DGoIM machine has been shown to be optimal, in a technical sense [4], for a variety of reduction strategies for the lambda calculus [46]. Abstract machines have been generally considered unsuitable for reasoning about programming languages. However, the DGoIM has been used to define and reason about the safety of ‘graph abstraction’, an exotic operation inspired by TensorFlow which converts local state variables into function parameters [44]. A generalisation of the DGoIM machine has also been used to reason about observational equivalence in languages with effects [24]. The origins of the DGoIM are in token abstract machines [17] giving semantics to linear logic proofs via the ‘Geometry of Interaction’ [25]. Using translations of lambda calculus into its linear version these abstract machines have been also used to model PCF and related languages [39]. These models proved to be interesting as they lead to space-efficient compilation schemes which have been used, among other things, to compile functional languages into circuits [23]. The motivation for a ‘dynamic’ version of the machine was that the original version only gives an efficient model for call-by-name. To represent call-by-value notonly soundly but also efficiently the ‘token’ that traverses the machine during execution also modifies it, thus preventing full re-evaluations of components which have been already evaluated. Although the graph-rewriting-based approach of the DGoIM is new, and hence it may appear unintuitive at a first sight, it is in fact closely related to rewrites onthe abstract syntax tree of the term, with a few tweaks: contraction: Unlike a standard AST in which variables sit in the ‘nodes’ of the tree, in the DGoIM representation variables with the same name and the same scope are ‘joined’ using ‘contraction’ nodes. Moreover, when the binder of a variable occurs the edges that correspond to the variable connect back to the binder. In figure 5 you can compare the conventional AST representation of λx.x x to its DGoIM representation. The graph contains some other GoI-inspired artefacts which we discuss below.
12:8 Steven W.T. Cheung, Dan R. Ghica, and Koko Muroya boxes: In the same figure we can see, that the lambda term is ‘boxed’. This canbe understood as the sub-graph corresponding to the lambda term is a single entity— for purposes of copying or deleting. This is part of the machinery that allows a precise cost of computation to be associated with graph rewrite. linear logic: Besides the contraction node (C) we can also see a !-labelled node (in grey) which is also inherited from linear logic. This node, along with ? nodes which will be seen later, serve as interface nodes to boxes, for arguments and non-local variables. Graph rewriting in general can be expensive, in particu- lar the identification of redexes as sub-graphs. In DGoIM this is dealt with by making the rewriting ‘focussed’, i.e. C relative to a special node in the graph which we call ‘the x x token’. The token will traverse the graph and trigger re- x @ @ ductions as needed. In terms of conventional abstract ma- λ λ chines, the movement of the token along an edge, seeking ! a redex, is akin to the ‘narrowing’ of the context in a term abstract machine, whereas the movement against the edge, Figure 5 AST vs DGoIM after a reduction, corresponds to a ‘broadening’ of a term- reducing abstract machine. A visualiser is also available for demonstrating the step-by-step execution of the machine.2 The version of DGoIM machine presented here is essentially the original one, with the following extensions: Graph-construction: Semantics for imperative operations for constructing the dataflow graph. These do not represent significant changes to the machine but are rather straightforward extensions. Graph-execution: When the ‘step’ command is executed the program changes modes of operations, from the functional-imperative mode of execution of graph construction to the synchronous dataflow mode of execution defined by the graph. This requires a non-trivial enhancement of the DGoIM, primarily by enabling parallel execution.
3.2 Graph and translation
In this section we present the technical details of the DGOI machine.
A graph G is a set of nodes which are partitioned into proper nodes NodeG (or just ‘nodes’) and port nodes PortG (or just ‘ports’), and a set of directed edges connecting ports and nodes. Every node is associated and connected with several ports and each edge has at least one connecting port and there are no open edges. Every port is the source of at most one edge and the target of another. We also call the source and the target of a node the incoming port (or in-port) and the outgoing port (or out-port) respectively. For example the +-node is connected to two out-ports and one in-port. If a graph contains edges between two ports they are identified by an edge homeomorphism; our graphs are quotiented by the congruence induced by edge homeomorphisms in an appropriate category of graphs [32]. We often denote a graph
2 https://cwtsteven.github.io/TSD-visual/
12:9 Transparent Synchronous Dataflow
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 Cell AAAB73icbVDLSgNBEOz1GeMr6tHLYBA8hd0o6DHgxWME84BkCb2TSTJkdnacmRXCkp/w4kERr/6ON//GSbIHTSxoKKq66e6KlODG+v63t7a+sbm1Xdgp7u7tHxyWjo6bJkk1ZQ2aiES3IzRMcMkallvB2kozjCPBWtH4dua3npg2PJEPdqJYGONQ8gGnaJ3U7o5RKewFvVLZr/hzkFUS5KQMOeq90le3n9A0ZtJSgcZ0Al/ZMENtORVsWuymhimkYxyyjqMSY2bCbH7vlJw7pU8GiXYlLZmrvycyjI2ZxJHrjNGOzLI3E//zOqkd3IQZlyq1TNLFokEqiE3I7HnS55pRKyaOINXc3UroCDVS6yIquhCC5ZdXSbNaCS4r1furco3kcRTgFM7gAgK4hhrcQR0aQEHAM7zCm/fovXjv3seidc3LZ07gD7zPH7aej6U= AAAB73icbVDLSgNBEOz1GeMr6tHLYBA8hd0o6DHgxWME84BkCb2TSTJkdnacmRXCkp/w4kERr/6ON//GSbIHTSxoKKq66e6KlODG+v63t7a+sbm1Xdgp7u7tHxyWjo6bJkk1ZQ2aiES3IzRMcMkallvB2kozjCPBWtH4dua3npg2PJEPdqJYGONQ8gGnaJ3U7o5RKexVe6WyX/HnIKskyEkZctR7pa9uP6FpzKSlAo3pBL6yYYbacirYtNhNDVNIxzhkHUclxsyE2fzeKTl3Sp8MEu1KWjJXf09kGBsziSPXGaMdmWVvJv7ndVI7uAkzLlVqmaSLRYNUEJuQ2fOkzzWjVkwcQaq5u5XQEWqk1kVUdCEEyy+vkma1ElxWqvdX5RrJ4yjAKZzBBQRwDTW4gzo0gIKAZ3iFN+/Re/HevY9F65qXz5zAH3ifP7gij6Y= 1 2 !(1 2) 1 ⌘AAAB63icbVBNS8NAEN3Ur1q/qh69LBbBU0mqoMeCF48V7Ae0oWy2k3bp7ibsToQS+he8eFDEq3/Im//GpM1BWx8MPN6bYWZeEEth0XW/ndLG5tb2Tnm3srd/cHhUPT7p2CgxHNo8kpHpBcyCFBraKFBCLzbAVCChG0zvcr/7BMaKSD/iLAZfsbEWoeAMc2kAyIbVmlt3F6DrxCtIjRRoDatfg1HEEwUauWTW9j03Rj9lBgWXMK8MEgsx41M2hn5GNVNg/XRx65xeZMqIhpHJSiNdqL8nUqasnakg61QMJ3bVy8X/vH6C4a2fCh0nCJovF4WJpBjR/HE6EgY4yllGGDciu5XyCTOMYxZPJQvBW315nXQade+q3ni4rjVpEUeZnJFzckk8ckOa5J60SJtwMiHP5JW8Ocp5cd6dj2VrySlmTskfOJ8//+eOGg== Cell !Int !Int !Int AAACD3icbVDLTgIxFO34RHyNunRTJBrckBk00SWJG5eYyCMBQu6UAg3tTNN2TMiEP3Djr7hxoTFu3brzbyzDLBQ8TZPTc+7N7T2B5Ewbz/t2VlbX1jc2c1v57Z3dvX334LCho1gRWicRj1QrAE05C2ndMMNpSyoKIuC0GYxvZn7zgSrNovDeTCTtChiGbMAIGCv13LOkMC11xiAl9PxOwR4Rc8MEyPQxNyrnPbfolb0UeJn4GSmiDLWe+9XpRyQWNDSEg9Zt35Omm4AyjHA6zXdiTSWQMQxp29IQBNXdJN1nik+t0seDSNkbGpyqvzsSEFpPRGArBZiRXvRm4n9eOzaD627CQhkbGpL5oEHMsYnwLBzcZ4oSwyeWAFHM/hWTESggxkaYtyH4iysvk0al7F+UK3eXxSrO4sihY3SCSshHV6iKblEN1RFBj+gZvaI358l5cd6dj3npipP1HKE/cD5/AMflmx8= (
AAAB6HicbVBNS8NAEJ3Ur1q/qh69LBbBU0mqoMeCF48t2A9oQ9lsJ+3a3STsboQS+gu8eFDEqz/Jm//GbZuDtj4YeLw3w8y8IBFcG9f9dgobm1vbO8Xd0t7+weFR+fikreNUMWyxWMSqG1CNgkfYMtwI7CYKqQwEdoLJ3dzvPKHSPI4ezDRBX9JRxEPOqLFSUw7KFbfqLkDWiZeTCuRoDMpf/WHMUomRYYJq3fPcxPgZVYYzgbNSP9WYUDahI+xZGlGJ2s8Wh87IhVWGJIyVrciQhfp7IqNS66kMbKekZqxXvbn4n9dLTXjrZzxKUoMRWy4KU0FMTOZfkyFXyIyYWkKZ4vZWwsZUUWZsNiUbgrf68jpp16reVbXWvK7USR5HEc7gHC7Bgxuowz00oAUMEJ7hFd6cR+fFeXc+lq0FJ585hT9wPn8AzKGM0w==
AAAB6HicbVBNS8NAEJ3Ur1q/qh69LBbBU0mqoMeCF48t2A9oQ9lsJ+3azSbsboQS+gu8eFDEqz/Jm//GbZuDtj4YeLw3w8y8IBFcG9f9dgobm1vbO8Xd0t7+weFR+fikreNUMWyxWMSqG1CNgktsGW4EdhOFNAoEdoLJ3dzvPKHSPJYPZpqgH9GR5CFn1FipqQblilt1FyDrxMtJBXI0BuWv/jBmaYTSMEG17nluYvyMKsOZwFmpn2pMKJvQEfYslTRC7WeLQ2fkwipDEsbKljRkof6eyGik9TQKbGdEzVivenPxP6+XmvDWz7hMUoOSLReFqSAmJvOvyZArZEZMLaFMcXsrYWOqKDM2m5INwVt9eZ20a1XvqlprXlfqJI+jCGdwDpfgwQ3U4R4a0AIGCM/wCm/Oo/PivDsfy9aCk8+cwh84nz/UNYzY
AAAB6HicbVBNS8NAEJ3Ur1q/qh69LBbBU0mqoMeCF48t2A9oQ9lsJ+3azSbsboQS+gu8eFDEqz/Jm//GbZuDtj4YeLw3w8y8IBFcG9f9dgobm1vbO8Xd0t7+weFR+fikreNUMWyxWMSqG1CNgktsGW4EdhOFNAoEdoLJ3dzvPKHSPJYPZpqgH9GR5CFn1FipqQflilt1FyDrxMtJBXI0BuWv/jBmaYTSMEG17nluYvyMKsOZwFmpn2pMKJvQEfYslTRC7WeLQ2fkwipDEsbKljRkof6eyGik9TQKbGdEzVivenPxP6+XmvDWz7hMUoOSLReFqSAmJvOvyZArZEZMLaFMcXsrYWOqKDM2m5INwVt9eZ20a1XvqlprXlfqJI+jCGdwDpfgwQ3U4R4a0AIGCM/wCm/Oo/PivDsfy9aCk8+cwh84nz/VuYzZ
() AAAB6HicbVBNS8NAEJ3Ur1q/qh69LBbBU0mqoMeCF48t2A9oQ9lsJu3azSbsboRS+gu8eFDEqz/Jm//GbZuDtj4YeLw3w8y8IBVcG9f9dgobm1vbO8Xd0t7+weFR+fikrZNMMWyxRCSqG1CNgktsGW4EdlOFNA4EdoLx3dzvPKHSPJEPZpKiH9Oh5BFn1FipGQ7KFbfqLkDWiZeTCuRoDMpf/TBhWYzSMEG17nluavwpVYYzgbNSP9OYUjamQ+xZKmmM2p8uDp2RC6uEJEqULWnIQv09MaWx1pM4sJ0xNSO96s3F/7xeZqJbf8plmhmUbLkoygQxCZl/TUKukBkxsYQyxe2thI2ooszYbEo2BG/15XXSrlW9q2qteV2pkzyOIpzBOVyCBzdQh3toQAsYIDzDK7w5j86L8+58LFsLTj5zCn/gfP4Avv2Myg==
AAAB7nicbVDLSsNAFL2pr1pfVZduBovgqiRV0GXBjcsK9gFtKJPJTTt0MgkzE6GEfoQbF4q49Xvc+TdO2yy09cDA4ZxzmXtPkAqujet+O6WNza3tnfJuZW//4PCoenzS0UmmGLZZIhLVC6hGwSW2DTcCe6lCGgcCu8Hkbu53n1BpnshHM03Rj+lI8ogzaqzUHQgbDemwWnPr7gJknXgFqUGB1rD6NQgTlsUoDRNU677npsbPqTKcCZxVBpnGlLIJHWHfUklj1H6+WHdGLqwSkihR9klDFurviZzGWk/jwCZjasZ61ZuL/3n9zES3fs5lmhmUbPlRlAliEjK/nYRcITNiagllittdCRtTRZmxDVVsCd7qyeuk06h7V/XGw3WtSYo6ynAG53AJHtxAE+6hBW1gMIFneIU3J3VenHfnYxktOcXMKfyB8/kDM9mPXw==
AAAB6HicbVBNS8NAEJ3Ur1q/qh69LBbBU0mqoMeCF48t2A9oQ9lsJ+3azSbsboQS+gu8eFDEqz/Jm//GbZuDtj4YeLw3w8y8IBFcG9f9dgobm1vbO8Xd0t7+weFR+fikreNUMWyxWMSqG1CNgktsGW4EdhOFNAoEdoLJ3dzvPKHSPJYPZpqgH9GR5CFn1FipmQzKFbfqLkDWiZeTCuRoDMpf/WHM0gilYYJq3fPcxPgZVYYzgbNSP9WYUDahI+xZKmmE2s8Wh87IhVWGJIyVLWnIQv09kdFI62kU2M6ImrFe9ebif14vNeGtn3GZpAYlWy4KU0FMTOZfkyFXyIyYWkKZ4vZWwsZUUWZsNiUbgrf68jpp16reVbXWvK7USR5HEc7gHC7Bgxuowz00oAUMEJ7hFd6cR+fFeXc+lq0FJ585hT9wPn8A0S2M1g== p
AAAB6HicbVBNS8NAEJ3Ur1q/qh69LBbBU0mqoMeCF48t2A9oQ9lsJ+3azSbsboQS+gu8eFDEqz/Jm//GbZuDtj4YeLw3w8y8IBFcG9f9dgobm1vbO8Xd0t7+weFR+fikreNUMWyxWMSqG1CNgktsGW4EdhOFNAoEdoLJ3dzvPKHSPJYPZpqgH9GR5CFn1FipWR+UK27VXYCsEy8nFcjRGJS/+sOYpRFKwwTVuue5ifEzqgxnAmelfqoxoWxCR9izVNIItZ8tDp2RC6sMSRgrW9KQhfp7IqOR1tMosJ0RNWO96s3F/7xeasJbP+MySQ1KtlwUpoKYmMy/JkOukBkxtYQyxe2thI2poszYbEo2BG/15XXSrlW9q2qteV2pkzyOIpzBOVyCBzdQh3toQAsYIDzDK7w5j86L8+58LFsLTj5zCn/gfP4AiG2Mpg==
AAAB6XicbVBNS8NAEJ3Ur1q/qh69LFbBU0mqoMeCF49V7Ae0oWy2k3bpZhN2N0IJ/QdePCji1X/kzX/jts1BWx8MPN6bYWZekAiujet+O4W19Y3NreJ2aWd3b/+gfHjU0nGqGDZZLGLVCahGwSU2DTcCO4lCGgUC28H4dua3n1BpHstHM0nQj+hQ8pAzaqz00Dvrlytu1Z2DrBIvJxXI0eiXv3qDmKURSsME1brruYnxM6oMZwKnpV6qMaFsTIfYtVTSCLWfzS+dknOrDEgYK1vSkLn6eyKjkdaTKLCdETUjvezNxP+8bmrCGz/jMkkNSrZYFKaCmJjM3iYDrpAZMbGEMsXtrYSNqKLM2HBKNgRv+eVV0qpVvctq7f6qUid5HEU4gVO4AA+uoQ530IAmMAjhGV7hzRk7L86787FoLTj5zDH8gfP5Aw68jPA= AAAB83icbVDLSsNAFJ3UV62vqks3g0VwVZIq6LLgxmUF+4AmlMnkph06mYR5CCX0N9y4UMStP+POv3HSZqGtBwYO59zDvXPCjDOlXffbqWxsbm3vVHdre/sHh0f145OeSo2k0KUpT+UgJAo4E9DVTHMYZBJIEnLoh9O7wu8/gVQsFY96lkGQkLFgMaNEW8n3jYhAFmEsRvWG23QXwOvEK0kDleiM6l9+lFKTgNCUE6WGnpvpICdSM8phXvONgozQKRnD0FJBElBBvrh5ji+sEuE4lfYJjRfq70ROEqVmSWgnE6InatUrxP+8odHxbZAzkRkNgi4XxYZjneKiABwxCVTzmSWESmZvxXRCJKHa1lSzJXirX14nvVbTu2q2Hq4bbVzWUUVn6BxdIg/doDa6Rx3URRRl6Bm9ojfHOC/Ou/OxHK04ZeYU/YHz+QPzxpGE n s r m @ AAAB9XicbVDLSgMxFL1TX7W+qi7dBItQN2WmCrosuHFZwT6gHUsmvW1DM5khyShl6H+4caGIW//FnX9j2s5CWw8EDufcw705QSy4Nq777eTW1jc2t/LbhZ3dvf2D4uFRU0eJYthgkYhUO6AaBZfYMNwIbMcKaRgIbAXjm5nfekSleSTvzSRGP6RDyQecUWOlh24i+6hm4bR8Pu0VS27FnYOsEi8jJchQ7xW/uv2IJSFKwwTVuuO5sfFTqgxnAqeFbqIxpmxMh9ixVNIQtZ/Or56SM6v0ySBS9klD5urvREpDrSdhYCdDakZ62ZuJ/3mdxAyu/ZTLODEo2WLRIBHERGRWAelzhcyIiSWUKW5vJWxEFWXGFlWwJXjLX14lzWrFu6hU7y5LNZLVkYcTOIUyeHAFNbiFOjSAgYJneIU358l5cd6dj8Vozskyx/AHzucPY1SSUw== d $
AAAB9HicbVDLSgMxFL1TX7W+qm4EN8EiuCozVdBloRuXFewD2qFk0kwbmmTGJFMoQ7/DjQtF3Pox7vwbM+0stPVA4HDOvdyTE8ScaeO6305hY3Nre6e4W9rbPzg8Kh+ftHWUKEJbJOKR6gZYU84kbRlmOO3GimIRcNoJJo3M70yp0iySj2YWU1/gkWQhI9hYye8LbMZKpA3K+XxQrrhVdwG0TrycVCBHc1D+6g8jkggqDeFY657nxsZPsTKMcDov9RNNY0wmeER7lkosqPbTReg5urTKEIWRsk8atFB/b6RYaD0TgZ3MQupVLxP/83qJCe/8lMk4MVSS5aEw4chEKGsADZmixPCZJZgoZrMiMsYKE2N7KtkSvNUvr5N2repdV2sPN5X6WV5HEc7hAq7Ag1uowz00oQUEnuAZXuHNmTovzrvzsRwtOPnOKfyB8/kDIXKSMw==
AAAB+HicbVBNS8NAFHypX7V+NOpF8LJaBE8lqYIeC170VsHaQhvKZrtpl242YXcj1JBf4sWDIl79Kd78N27aHLR1YGGYeY83O37MmdKO822VVlbX1jfKm5Wt7Z3dqr23/6CiRBLaJhGPZNfHinImaFszzWk3lhSHPqcdf3Kd+51HKhWLxL2extQL8UiwgBGsjTSwq/0Q67EM0/Q4uxU6G9g1p+7MgJaJW5AaFGgN7K/+MCJJSIUmHCvVc51YeymWmhFOs0o/UTTGZIJHtGeowCFVXjoLnqFTowxREEnzhEYz9fdGikOlpqFvJvOYatHLxf+8XqKDKy9lIk40FWR+KEg40hHKW0BDJinRfGoIJpKZrIiMscREm64qpgR38cvL5KFRd8/rjbuLWvOwqKMMR3ACZ+DCJTThBlrQBgIJPMMrvFlP1ov1bn3MR0tWsXMAf2B9/gAXNpM8
AAAB9HicbVBNSwMxFHzrZ61fVS+Cl2ARPJXdKuix4MVjBbcttEvJptk2NMmuSbZQlv4OLx4U8eqP8ea/MdvuQVsHAsPMe7zJhAln2rjut7O2vrG5tV3aKe/u7R8cVo6OWzpOFaE+iXmsOiHWlDNJfcMMp51EUSxCTtvh+C732xOqNIvlo5kmNBB4KFnECDZWCnoCm5ESmS+ZmfUrVbfmzoFWiVeQKhRo9itfvUFMUkGlIRxr3fXcxAQZVoYRTmflXqppgskYD2nXUokF1UE2Dz1DF1YZoChW9kmD5urvjQwLracitJN5SL3s5eJ/Xjc10W2QMZmkhkqyOBSlHJkY5Q2gAVOUGD61BBPFbFZERlhhYmxPZVuCt/zlVdKq17yrWv3huto4LeoowRmcwyV4cAMNuIcm+EDgCZ7hFd6cifPivDsfi9E1p9g5gT9wPn8AUleSUw==
AAAB+HicbVBNS8NAFHypX7V+NOpF8LJaBE8lqYIeC170VsHaQhvKZrtpl242YXcj1JBf4sWDIl79Kd78N27aHLR1YGGYeY83O37MmdKO822VVlbX1jfKm5Wt7Z3dqr23/6CiRBLaJhGPZNfHinImaFszzWk3lhSHPqcdf3Kd+51HKhWLxL2extQL8UiwgBGsjTSwq/0Q67EM0/Q4uxU6G9g1p+7MgJaJW5AaFGgN7K/+MCJJSIUmHCvVc51YeymWmhFOs0o/UTTGZIJHtGeowCFVXjoLnqFTowxREEnzhEYz9fdGikOlpqFvJvOYatHLxf+8XqKDKy9lIk40FWR+KEg40hHKW0BDJinRfGoIJpKZrIiMscREm64qpgR38cvL5KFRd8/rjbuLWvOwqKMMR3ACZ+DCJTThBlrQBgIJPMMrvFlP1ov1bn3MR0tWsXMAf2B9/gAXNpM8
AAAB+HicbVBNS8NAFHypX7V+NOpF8LJaBE8lqYIeC170VsHaQhvKZrtpl242YXcj1JBf4sWDIl79Kd78N27aHLR1YGGYeY83O37MmdKO822VVlbX1jfKm5Wt7Z3dqr23/6CiRBLaJhGPZNfHinImaFszzWk3lhSHPqcdf3Kd+51HKhWLxL2extQL8UiwgBGsjTSwq/0Q67EM0/Q4uxU6G9g1p+7MgJaJW5AaFGgN7K/+MCJJSIUmHCvVc51YeymWmhFOs0o/UTTGZIJHtGeowCFVXjoLnqFTowxREEnzhEYz9fdGikOlpqFvJvOYatHLxf+8XqKDKy9lIk40FWR+KEg40hHKW0BDJinRfGoIJpKZrIiMscREm64qpgR38cvL5KFRd8/rjbuLWvOwqKMMR3ACZ+DCJTThBlrQBgIJPMMrvFlP1ov1bn3MR0tWsXMAf2B9/gAXNpM8
AAAB+HicbVBNS8NAFHypX7V+NOpF8LJaBE8lqYIeC170VsHaQhvKZrtpl242YXcj1JBf4sWDIl79Kd78N27aHLR1YGGYeY83O37MmdKO822VVlbX1jfKm5Wt7Z3dqr23/6CiRBLaJhGPZNfHinImaFszzWk3lhSHPqcdf3Kd+51HKhWLxL2extQL8UiwgBGsjTSwq/0Q67EM0/Q4uxU6G9g1p+7MgJaJW5AaFGgN7K/+MCJJSIUmHCvVc51YeymWmhFOs0o/UTTGZIJHtGeowCFVXjoLnqFTowxREEnzhEYz9fdGikOlpqFvJvOYatHLxf+8XqKDKy9lIk40FWR+KEg40hHKW0BDJinRfGoIJpKZrIiMscREm64qpgR38cvL5KFRd8/rjbuLWvOwqKMMR3ACZ+DCJTThBlrQBgIJPMMrvFlP1ov1bn3MR0tWsXMAf2B9/gAXNpM8 AAAB83icbVDLSgMxFL1TX7W+qm4EN8EiuCozVdBlwY3uKtgHdIaSSTNtaJIZkoxQhv6GGxeKuPVn3Pk3ZtpZaOuBwOGce7knJ0w408Z1v53S2vrG5lZ5u7Kzu7d/UD086ug4VYS2Scxj1QuxppxJ2jbMcNpLFMUi5LQbTm5zv/tElWaxfDTThAYCjySLGMHGSr4vsBkrkd1LMxtUa27dnQOtEq8gNSjQGlS//GFMUkGlIRxr3ffcxAQZVoYRTmcVP9U0wWSCR7RvqcSC6iCbZ56hc6sMURQr+6RBc/X3RoaF1lMR2sk8o172cvE/r5+a6CbImExSQyVZHIpSjkyM8gLQkClKDJ9agoliNisiY6wwMbamii3BW/7yKuk06t5lvfFwVWueFHWU4RTO4AI8uIYm3EEL2kAggWd4hTcndV6cd+djMVpyip1j+APn8wd24ZHU Cell
AAAB73icbVDLSgNBEOz1GeMr6tHLYBA8hd0o6DHgxWME84BkCb2TSTJkdnacmRXCkp/w4kERr/6ON//GSbIHTSxoKKq66e6KlODG+v63t7a+sbm1Xdgp7u7tHxyWjo6bJkk1ZQ2aiES3IzRMcMkallvB2kozjCPBWtH4dua3npg2PJEPdqJYGONQ8gGnaJ3U7o5RKexVe6WyX/HnIKskyEkZctR7pa9uP6FpzKSlAo3pBL6yYYbacirYtNhNDVNIxzhkHUclxsyE2fzeKTl3Sp8MEu1KWjJXf09kGBsziSPXGaMdmWVvJv7ndVI7uAkzLlVqmaSLRYNUEJuQ2fOkzzWjVkwcQaq5u5XQEWqk1kVUdCEEyy+vkma1ElxWqvdX5RrJ4yjAKZzBBQRwDTW4gzo0gIKAZ3iFN+/Re/HevY9F65qXz5zAH3ifP7gij6Y= AAAB63icbVBNS8NAEN3Ur1q/qh69LBbBU0mqoMeCF48V7Ae0oWy2k3bp7ibsToQS+he8eFDEq3/Im//GpM1BWx8MPN6bYWZeEEth0XW/ndLG5tb2Tnm3srd/cHhUPT7p2CgxHNo8kpHpBcyCFBraKFBCLzbAVCChG0zvcr/7BMaKSD/iLAZfsbEWoeAMc2kAyIbVmlt3F6DrxCtIjRRoDatfg1HEEwUauWTW9j03Rj9lBgWXMK8MEgsx41M2hn5GNVNg/XRx65xeZMqIhpHJSiNdqL8nUqasnakg61QMJ3bVy8X/vH6C4a2fCh0nCJovF4WJpBjR/HE6EgY4yllGGDciu5XyCTOMYxZPJQvBW315nXQade+q3ni4rjVpEUeZnJFzckk8ckOa5J60SJtwMiHP5JW8Ocp5cd6dj2VrySlmTskfOJ8//+eOGg== AAACDHicbVC7TgMxEPSFVwivACWNIUGiiu6OAspINJRBIg8pF0V7ji+xYvss24cURfkAGn6FhgKEaPkAOv4G51FAwlqWxjOzWu/EijNjff/by62tb2xu5bcLO7t7+wfFw6OGSTNNaJ2kPNWtGAzlTNK6ZZbTltIURMxpMx7eTPXmA9WGpfLejhTtCOhLljAC1lHdYqkcDUEp6AbRqTsi45YJULPHXAjLzuVX/FnhVRAsQAktqtYtfkW9lGSCSks4GNMOfGU7Y9CWEU4nhSgzVAEZQp+2HZQgqOmMZ8tM8LljejhJtbvS4hn7u2MMwpiRiJ1TgB2YZW1K/qe1M5tcd8ZMqsxSSeaDkoxjm+JpMrjHNCWWjxwAopn7KyYD0ECsy6/gQgiWV14FjbASXFbCu7BUxYs48ugEnaELFKArVEW3qIbqiKBH9Ixe0Zv35L14797H3JrzFj3H6E95nz93upnd 1(2 2 Int Unit !Int ⌘ !Int !Int !Int
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 Cell !Int Cell !Int AAAB/3icbVDNS8MwHE3n15xfVUEEL9EheBrtFPQ4EMTjBPcBWxlplm5hSVqSVBi1B/8VLx4U8eq/4c3/xrTrQTcfhDze+/3Iy/MjRpV2nG+rtLS8srpWXq9sbG5t79i7e20VxhKTFg5ZKLs+UoRRQVqaaka6kSSI+4x0/Ml15nceiFQ0FPd6GhGPo5GgAcVIG2lgHyTHaZ8jPZY8yW/fT27SdGBXnZqTAy4StyBVUKA5sL/6wxDHnAiNGVKq5zqR9hIkNcWMpJV+rEiE8ASNSM9QgThRXpLnT+GpUYYwCKU5QsNc/b2RIK7UlPtmMouo5r1M/M/rxTq48hIqolgTgWcPBTGDOoRZGXBIJcGaTQ1BWFKTFeIxkghrU1nFlODOf3mRtOs197xWv7uoNg6LOsrgCJyAM+CCS9AAt6AJWgCDR/AMXsGb9WS9WO/Wx2y0ZBU7++APrM8fpEGWXw== ! ! ⌘AAAB63icbVBNS8NAEN3Ur1q/qh69LBbBU0mqoMeCF48V7Ae0oWy2k3bp7ibsToQS+he8eFDEq3/Im//GpM1BWx8MPN6bYWZeEEth0XW/ndLG5tb2Tnm3srd/cHhUPT7p2CgxHNo8kpHpBcyCFBraKFBCLzbAVCChG0zvcr/7BMaKSD/iLAZfsbEWoeAMc2kAyIbVmlt3F6DrxCtIjRRoDatfg1HEEwUauWTW9j03Rj9lBgWXMK8MEgsx41M2hn5GNVNg/XRx65xeZMqIhpHJSiNdqL8nUqasnakg61QMJ3bVy8X/vH6C4a2fCh0nCJovF4WJpBjR/HE6EgY4yllGGDciu5XyCTOMYxZPJQvBW315nXQade+q3ni4rjVpEUeZnJFzckk8ckOa5J60SJtwMiHP5JW8Ocp5cd6dj2VrySlmTskfOJ8//+eOGg== ⌘AAAB63icbVBNS8NAEN3Ur1q/qh69LBbBU0mqoMeCF48V7Ae0oWy2k3bp7ibsToQS+he8eFDEq3/Im//GpM1BWx8MPN6bYWZeEEth0XW/ndLG5tb2Tnm3srd/cHhUPT7p2CgxHNo8kpHpBcyCFBraKFBCLzbAVCChG0zvcr/7BMaKSD/iLAZfsbEWoeAMc2kAyIbVmlt3F6DrxCtIjRRoDatfg1HEEwUauWTW9j03Rj9lBgWXMK8MEgsx41M2hn5GNVNg/XRx65xeZMqIhpHJSiNdqL8nUqasnakg61QMJ3bVy8X/vH6C4a2fCh0nCJovF4WJpBjR/HE6EgY4yllGGDciu5XyCTOMYxZPJQvBW315nXQade+q3ni4rjVpEUeZnJFzckk8ckOa5J60SJtwMiHP5JW8Ocp5cd6dj2VrySlmTskfOJ8//+eOGg== !(1 2) !( ) ⌫ F F AAACD3icbVDLTgIxFO34RHyNunRTJBrckBk00SWJG5eYyCMBQu6UAg3tTNN2TMiEP3Djr7hxoTFu3brzbyzDLBQ8TZPTc+7N7T2B5Ewbz/t2VlbX1jc2c1v57Z3dvX334LCho1gRWicRj1QrAE05C2ndMMNpSyoKIuC0GYxvZn7zgSrNovDeTCTtChiGbMAIGCv13LOkMC11xiAl9PxOwR4Rc8MEyPQxNyrnPbfolb0UeJn4GSmiDLWe+9XpRyQWNDSEg9Zt35Omm4AyjHA6zXdiTSWQMQxp29IQBNXdJN1nik+t0seDSNkbGpyqvzsSEFpPRGArBZiRXvRm4n9eOzaD627CQhkbGpL5oEHMsYnwLBzcZ4oSwyeWAFHM/hWTESggxkaYtyH4iysvk0al7F+UK3eXxSrO4sihY3SCSshHV6iKblEN1RFBj+gZvaI358l5cd6dj3npipP1HKE/cD5/AMflmx8= 1 2 ( AAACD3icbVDLTgIxFO34RHyNunRTJBrckBk00SWJG5eYyCMBQu6UAg3tTNN2TMiEP3Djr7hxoTFu3brzbyzDLBQ8TZPTc+7N7T2B5Ewbz/t2VlbX1jc2c1v57Z3dvX334LCho1gRWicRj1QrAE05C2ndMMNpSyoKIuC0GYxvZn7zgSrNovDeTCTtChiGbMAIGCv13LOkMC11xiAl9PxOwR4Rc8MEyPQxNyrnPbfolb0UeJn4GSmiDLWe+9XpRyQWNDSEg9Zt35Omm4AyjHA6zXdiTSWQMQxp29IQBNXdJN1nik+t0seDSNkbGpyqvzsSEFpPRGArBZiRXvRm4n9eOzaD627CQhkbGpL5oEHMsYnwLBzcZ4oSwyeWAFHM/hWTESggxkaYtyH4iysvk0al7F+UK3eXxSrO4sihY3SCSshHV6iKblEN1RFBj+gZvaI358l5cd6dj3npipP1HKE/cD5/AMflmx8= (
AAAB6HicbVBNS8NAEJ3Ur1q/qh69LBbBU0mqoMeCF48t2A9oQ9lsJ+3azSbsboQS+gu8eFDEqz/Jm//GbZuDtj4YeLw3w8y8IBFcG9f9dgobm1vbO8Xd0t7+weFR+fikreNUMWyxWMSqG1CNgktsGW4EdhOFNAoEdoLJ3dzvPKHSPJYPZpqgH9GR5CFn1FipSQflilt1FyDrxMtJBXI0BuWv/jBmaYTSMEG17nluYvyMKsOZwFmpn2pMKJvQEfYslTRC7WeLQ2fkwipDEsbKljRkof6eyGik9TQKbGdEzVivenPxP6+XmvDWz7hMUoOSLReFqSAmJvOvyZArZEZMLaFMcXsrYWOqKDM2m5INwVt9eZ20a1XvqlprXlfqJI+jCGdwDpfgwQ3U4R4a0AIGCM/wCm/Oo/PivDsfy9aCk8+cwh84nz+6cYzH
AAAB6HicbVBNS8NAEJ34WetX1aOXxSJ4KkkV9FjoxWML9gPaUDbbSbt2swm7G6GE/gIvHhTx6k/y5r9x2+agrQ8GHu/NMDMvSATXxnW/nY3Nre2d3cJecf/g8Oi4dHLa1nGqGLZYLGLVDahGwSW2DDcCu4lCGgUCO8GkPvc7T6g0j+WDmSboR3QkecgZNVZq1gelsltxFyDrxMtJGXI0BqWv/jBmaYTSMEG17nluYvyMKsOZwFmxn2pMKJvQEfYslTRC7WeLQ2fk0ipDEsbKljRkof6eyGik9TQKbGdEzVivenPxP6+XmvDOz7hMUoOSLReFqSAmJvOvyZArZEZMLaFMcXsrYWOqKDM2m6INwVt9eZ20qxXvulJt3pRrJI+jAOdwAVfgwS3U4B4a0AIGCM/wCm/Oo/PivDsfy9YNJ585gz9wPn8AjPmMqQ== n
AAAB6nicbVDLSgNBEOz1GeMr6tHLYBA8hd0o6DHgxWNE84BkCbOT2WTIzOwy0yuEkE/w4kERr36RN//GSbIHTSxoKKq66e6KUiks+v63t7a+sbm1Xdgp7u7tHxyWjo6bNskM4w2WyMS0I2q5FJo3UKDk7dRwqiLJW9Hodua3nrixItGPOE55qOhAi1gwik566KqsVyr7FX8OskqCnJQhR71X+ur2E5YprpFJam0n8FMMJ9SgYJJPi93M8pSyER3wjqOaKm7DyfzUKTl3Sp/EiXGlkczV3xMTqqwdq8h1KopDu+zNxP+8TobxTTgROs2Qa7ZYFGeSYEJmf5O+MJyhHDtCmRHuVsKG1FCGLp2iCyFYfnmVNKuV4LJSvb8q10geRwFO4QwuIIBrqMEd1KEBDAbwDK/w5knvxXv3Phata14+cwJ/4H3+AFRyjbg= µ
AAAB6HicbVBNS8NAEJ3Ur1q/qh69LBbBU0mqoDcLXjy2YGuhDWWznbRrN5uwuxFK6C/w4kERr/4kb/4bt20O2vpg4PHeDDPzgkRwbVz32ymsrW9sbhW3Szu7e/sH5cOjto5TxbDFYhGrTkA1Ci6xZbgR2EkU0igQ+BCMb2f+wxMqzWN5byYJ+hEdSh5yRo2Vmjf9csWtunOQVeLlpAI5Gv3yV28QszRCaZigWnc9NzF+RpXhTOC01Es1JpSN6RC7lkoaofaz+aFTcmaVAQljZUsaMld/T2Q00noSBbYzomakl72Z+J/XTU147WdcJqlByRaLwlQQE5PZ12TAFTIjJpZQpri9lbARVZQZm03JhuAtv7xK2rWqd1GtNS8rdZLHUYQTOIVz8OAK6nAHDWgBA4RneIU359F5cd6dj0VrwclnjuEPnM8fhumMpQ==
AAAB6HicbVBNS8NAEJ3Ur1q/qh69LBbBU0mqoMeCF48t2A9oQ9lsJ+3azSbsboQS+gu8eFDEqz/Jm//GbZuDtj4YeLw3w8y8IBFcG9f9dgobm1vbO8Xd0t7+weFR+fikreNUMWyxWMSqG1CNgktsGW4EdhOFNAoEdoLJ3dzvPKHSPJYPZpqgH9GR5CFn1FipKQblilt1FyDrxMtJBXI0BuWv/jBmaYTSMEG17nluYvyMKsOZwFmpn2pMKJvQEfYslTRC7WeLQ2fkwipDEsbKljRkof6eyGik9TQKbGdEzVivenPxP6+XmvDWz7hMUoOSLReFqSAmJvOvyZArZEZMLaFMcXsrYWOqKDM2m5INwVt9eZ20a1XvqlprXlfqJI+jCGdwDpfgwQ3U4R4a0AIGCM/wCm/Oo/PivDsfy9aCk8+cwh84nz/LHYzS
a AAAB6HicbVBNS8NAEJ3Ur1q/qh69rBbBU0mqoMeCF48t2FpoQ9lsJ+3azSbsboQS+gu8eFDEqz/Jm//GbZuDtj4YeLw3w8y8IBFcG9f9dgpr6xubW8Xt0s7u3v5B+fCoreNUMWyxWMSqE1CNgktsGW4EdhKFNAoEPgTj25n/8IRK81jem0mCfkSHkoecUWOl5mm/XHGr7hxklXg5qUCORr/81RvELI1QGiao1l3PTYyfUWU4Ezgt9VKNCWVjOsSupZJGqP1sfuiUnFtlQMJY2ZKGzNXfExmNtJ5Ege2MqBnpZW8m/ud1UxPe+BmXSWpQssWiMBXExGT2NRlwhcyIiSWUKW5vJWxEFWXGZlOyIXjLL6+Sdq3qXVZrzatKneRxFOEEzuACPLiGOtxBA1rAAOEZXuHNeXRenHfnY9FacPKZY/gD5/MHWXGMhw==
AAAB+XicbVDLSsNAFL2pr1pfUTeCm8EiuCpJFXRZcOOygn1AE8pkMmmHTiZhZlIooX/ixoUibv0Td/6NkzYLbT1w4XDOvTP3niDlTGnH+bYqG5tb2zvV3dre/sHhkX180lVJJgntkIQnsh9gRTkTtKOZ5rSfSorjgNNeMLkv/N6USsUS8aRnKfVjPBIsYgRrIw1t28u9TIRUFg8g4c2Hdt1pOAugdeKWpA4l2kP7ywsTksVUaMKxUgPXSbWfY6kZ4XRe8zJFU0wmeEQHhgocU+Xni83n6NIoIYoSaUpotFB/T+Q4VmoWB6YzxnqsVr1C/M8bZDq683Mm0kxTQZYfRRlHOkFFDChkkhLNZ4ZgIpnZFZExlphoE1bNhOCunrxOus2Ge91oPt7UW2dlHFU4hwu4AhduoQUP0IYOEJjCM7zCm5VbL9a79bFsrVjlzCn8gfX5A6H8k4U= l ifAAAB8nicbVDLSsNAFL2pr1pfVZduBovgqiRV0GXBjcsK9gFtKJPppB06mYSZG6GEfoYbF4q49Wvc+TdO2iy09cDA4Zx7mXNPkEhh0HW/ndLG5tb2Tnm3srd/cHhUPT7pmDjVjLdZLGPdC6jhUijeRoGS9xLNaRRI3g2md7nffeLaiFg94izhfkTHSoSCUbRSfxBRnAjMRDgfVmtu3V2ArBOvIDUo0BpWvwajmKURV8gkNabvuQn6GdUomOTzyiA1PKFsSse8b6miETd+tog8JxdWGZEw1vYpJAv190ZGI2NmUWAn84hm1cvF/7x+iuGtnwmVpMgVW34UppJgTPL7yUhozlDOLKFMC5uVsAnVlKFtqWJL8FZPXiedRt27qjcermtNUtRRhjM4h0vw4AaacA8taAODGJ7hFd4cdF6cd+djOVpyip1T+APn8wfBZpF0 ! ? C { } -
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 !Unit !Unit ⌘AAAB63icbVBNS8NAEN3Ur1q/qh69LBbBU0mqoMeCF48V7Ae0oWy2k3bp7ibsToQS+he8eFDEq3/Im//GpM1BWx8MPN6bYWZeEEth0XW/ndLG5tb2Tnm3srd/cHhUPT7p2CgxHNo8kpHpBcyCFBraKFBCLzbAVCChG0zvcr/7BMaKSD/iLAZfsbEWoeAMc2kAyIbVmlt3F6DrxCtIjRRoDatfg1HEEwUauWTW9j03Rj9lBgWXMK8MEgsx41M2hn5GNVNg/XRx65xeZMqIhpHJSiNdqL8nUqasnakg61QMJ3bVy8X/vH6C4a2fCh0nCJovF4WJpBjR/HE6EgY4yllGGDciu5XyCTOMYxZPJQvBW315nXQade+q3ni4rjVpEUeZnJFzckk8ckOa5J60SJtwMiHP5JW8Ocp5cd6dj2VrySlmTskfOJ8//+eOGg== 1( 2 !⌫ Cell
Figure 6 Connection of edges by G : Λ Γ where Λ and Γ are the set of open incoming ports and outgoing ports respectively.→ They are also called the incoming and outgoing interfaces. Ports are typed (θ ::= ν κ), with either linear types ν ::= Int Unit κ ¨ | | | κ or qualified types κ ::= !ν Cell. We also denote qualified base types as η ::= !Int !Unit !Cell. Adjacent ports| have the same types, to be coherent with the wire homeomorphism.| | We often refer to a node using their labels, for example, we say a λ-node for a node labelled by λ. Some labels are used to indicate nodes that interpret calculus constructs: λ-node (abstraction), @-node (application), n-node (constants), s-node (step), p-node (peek), d-node (dereference), r-node (root dependency), m-node (memory cell creation), $-node (arithmetic operations), if-node (conditionals), µ-node (recursion), a-node (assignment) and l-node (link). Some nodes do not correspond to a syntactic construct but are created at runtime to represent dataflow graphs: n -node (memory cell). Finally the !-node, ?-node and C-node (contraction) are markers{ } used to guide sub-graph copying. These infrastructure nodes are conceptually derived from linear logic and the Geometry of Interaction (GoI) interpretation of proofs in linear logic, particularly as used in abstract token machines for GoI. The connection of edges via nodes must satisfies the typings in figure 6. When drawing graphs, certain dia- grammatic conventions are employed. … Ports are not represented explicitly and = = … = … their labels are only shown when they … … … are not obvious. An edge with a bar at its tail represents zero or more ports, while Figure 7 Drawing conventions a double-stroke edge represents a bunch of the same nodes and ports in parallel (figure 7). We first define the translation from type judgement of a term to graphs infigure8 with op any unary and op0 any binary operator. The rules essentially construct the abstract syntax graph in the way discussed earlier: joining free-variable ports via contractions, looping free-variable back to the binders, inserting boxes around value- sub-graphs, adding linear logic token management nodes (!, ?). Note that all operations are eta-expanded, so, for example, instead of having just a + node in the graph we have a sub-graph corresponding to λx.λy.x + y. Finally, the C node with no in-ports is
12:10 Steven W.T. Cheung, Dan R. Ghica, and Koko Muroya
AAAB6HicbVBNS8NAEJ3Ur1q/qh69LBbBU0mqoDcLXjy2YGuhDWWznbRrN5uwuxFK6C/w4kERr/4kb/4bt20O2vpg4PHeDDPzgkRwbVz32ymsrW9sbhW3Szu7e/sH5cOjto5TxbDFYhGrTkA1Ci6xZbgR2EkU0igQ+BCMb2f+wxMqzWN5byYJ+hEdSh5yRo2Vmjf9csWtunOQVeLlpAI5Gv3yV28QszRCaZigWnc9NzF+RpXhTOC01Es1JpSN6RC7lkoaofaz+aFTcmaVAQljZUsaMld/T2Q00noSBbYzomakl72Z+J/XTU147WdcJqlByRaLwlQQE5PZ12TAFTIjJpZQpri9lbARVZQZm03JhuAtv7xK2rWqd1GtNS8rdZLHUYQTOIVz8OAK6nAHDWgBA4RneIU359F5cd6dj0VrwclnjuEPnM8fhumMpQ== ?
AAAB6HicbVBNS8NAEJ34WetX1aOXxSJ4KkkV9FjoxWML9gPaUDbbSbt2swm7G6GE/gIvHhTx6k/y5r9x2+agrQ8GHu/NMDMvSATXxnW/nY3Nre2d3cJecf/g8Oi4dHLa1nGqGLZYLGLVDahGwSW2DDcCu4lCGgUCO8GkPvc7T6g0j+WDmSboR3QkecgZNVZq1gelsltxFyDrxMtJGXI0BqWv/jBmaYTSMEG17nluYvyMKsOZwFmxn2pMKJvQEfYslTRC7WeLQ2fk0ipDEsbKljRkof6eyGik9TQKbGdEzVivenPxP6+XmvDOz7hMUoOSLReFqSAmJvOvyZArZEZMLaFMcXsrYWOqKDM2m6INwVt9eZ20qxXvulJt3pRrJI+jAOdwAVfgwS3U4B4a0AIGCM/wCm/Oo/PivDsfy9YNJ585gz9wPn8AjPmMqQ== C
[[ ,x: ⌧ u : ⌧ 0]] AAACD3icbVDLSsNAFJ3UV42vqhvBzdTiYyElqYLiquBClwq2FpJQbibTduhMEmYmYin+gRt/xY0LRdy6deffOK1ZqPXAhTPn3Mvce8KUM6Ud59MqTE3PzM4V5+2FxaXlldLqWlMlmSS0QRKeyFYIinIW04ZmmtNWKimIkNPrsH868q9vqFQsia/0IKWBgG7MOoyANlK7tOP5ZQ/b/hkIAfu3J76GzL+JQPVwNn7s2oFfDtqlilN1xsCTxM1JBeW4aJc+/CghmaCxJhyU8lwn1cEQpGaE0zvbzxRNgfShSz1DYxBUBcPxPXd42ygR7iTSVKzxWP05MQSh1ECEplOA7qm/3kj8z/My3TkOhixOM01j8v1RJ+NYJ3gUDo6YpETzgSFAJDO7YtIDCUSbCG0Tgvv35EnSrFXdg2rt8rBS38jjKKJNtIX2kIuOUB2dowvUQATdo0f0jF6sB+vJerXevlsLVj6zjn7Bev8Ct02acA== ` [[ t0 : ⌧ ⌧ 0]] [[ t : ⌧]]
AAACGHicbVDLSgNBEJz1GddX1IvgZTSInuJuFBRPggc9RjAq7C6hdzJJhszsLjO9kRDyGV78FS8eFPHqzb9x8jj4KmioqepmuivOpDDoeZ/O1PTM7Nx8YcFdXFpeWS2urd+YNNeM11gqU30Xg+FSJLyGAiW/yzQHFUt+G3fOh/5tl2sj0uQaexmPFLQS0RQM0Er14kEQbgfUDS9AKQi7DTBtinunIUIeatFqI2id3g+fe24Ubkf1YskreyPQv8SfkBKZoFovfoSNlOWKJ8gkGBP4XoZRHzQKJvnADXPDM2AdaPHA0gQUN1F/dNiA7lqlQZuptpUgHanfJ/qgjOmp2HYqwLb57Q3F/7wgx+ZJ1BdJliNP2PijZi4ppnSYEm0IzRnKniXAtLC7UtYGDQxtlq4Nwf998l9yUyn7h+XK1VHpbHMSR4FskR2yT3xyTM7IJamSGmHkgTyRF/LqPDrPzpvzPm6dciYzG+QHnI8vhrOetw== ` ! AAACB3icbVBNS8NAEN34WeNX1IsgyNYieCpJFRRPBQ96VLBaSEKZbLft4m4SdidCKd68+Fe8eFDEq3/Bm//Gbe1Bqw8GHu/NMDMvyaUw6PufztT0zOzcfGnBXVxaXln11tavTFZoxhssk5luJmC4FClvoEDJm7nmoBLJr5Obk6F/fcu1EVl6if2cxwq6qegIBmillrcdRuWQutEpKAXRbRtMj+JxhFC4cVSOW17Fr/oj0L8kGJMKGeO85X1E7YwViqfIJBgTBn6O8QA0Cib5nRsVhufAbqDLQ0tTUNzEg9Efd3TXKm3aybStFOlI/TkxAGVMXyW2UwH2zKQ3FP/zwgI7R/FApHmBPGXfizqFpJjRYSi0LTRnKPuWANPC3kpZDzQwtNG5NoRg8uW/5KpWDfartYuDSn1zHEeJbJEdskcCckjq5IyckwZh5J48kmfy4jw4T86r8/bdOuWMZzbILzjvXyctl3Q= ` Γ λx.u : τ τ0 = Γ t0 t : τ0 = J ` → K J ` K AAAB7nicbVDLSsNAFL2pr1pfVZduBovgqiRV0GXBjcsK9gFtKJPJTTt0MgkzE6GEfoQbF4q49Xvc+TdO2yy09cDA4ZxzmXtPkAqujet+O6WNza3tnfJuZW//4PCoenzS0UmmGLZZIhLVC6hGwSW2DTcCe6lCGgcCu8Hkbu53n1BpnshHM03Rj+lI8ogzaqzUHQgbDemwWnPr7gJknXgFqUGB1rD6NQgTlsUoDRNU677npsbPqTKcCZxVBpnGlLIJHWHfUklj1H6+WHdGLqwSkihR9klDFurviZzGWk/jwCZjasZ61ZuL/3n9zES3fs5lmhmUbPlRlAliEjK/nYRcITNiagllittdCRtTRZmxDVVsCd7qyeuk06h7V/XGw3WtSYo6ynAG53AJHtxAE+6hBW1gMIFneIU3J3VenHfnYxktOcXMKfyB8/kDM9mPXw==
@AAAB6HicbVBNS8NAEJ3Ur1q/qh69LBbBU0mqoMeCF48t2A9oQ9lsJ+3azSbsboQS+gu8eFDEqz/Jm//GbZuDtj4YeLw3w8y8IBFcG9f9dgobm1vbO8Xd0t7+weFR+fikreNUMWyxWMSqG1CNgktsGW4EdhOFNAoEdoLJ3dzvPKHSPJYPZpqgH9GR5CFn1FipWR+UK27VXYCsEy8nFcjRGJS/+sOYpRFKwwTVuue5ifEzqgxnAmelfqoxoWxCR9izVNIItZ8tDp2RC6sMSRgrW9KQhfp7IqOR1tMosJ0RNWO96s3F/7xeasJbP+MySQ1KtlwUpoKYmMy/JkOukBkxtYQyxe2thI2poszYbEo2BG/15XXSrlW9q2qteV2pkzyOIpzBOVyCBzdQh3toQAsYIDzDK7w5j86L8+58LFsLTj5zCn/gfP4AiG2Mpg==
AAAB6HicbVBNS8NAEJ3Ur1q/qh69rBbBU0mqoMeCF48t2FpoQ9lsJ+3azSbsboQS+gu8eFDEqz/Jm//GbZuDtj4YeLw3w8y8IBFcG9f9dgpr6xubW8Xt0s7u3v5B+fCoreNUMWyxWMSqE1CNgktsGW4EdhKFNAoEPgTj25n/8IRK81jem0mCfkSHkoecUWOl5mm/XHGr7hxklXg5qUCORr/81RvELI1QGiao1l3PTYyfUWU4Ezgt9VKNCWVjOsSupZJGqP1sfuiUnFtlQMJY2ZKGzNXfExmNtJ5Ege2MqBnpZW8m/ud1UxPe+BmXSWpQssWiMBXExGT2NRlwhcyIiSWUKW5vJWxEFWXGZlOyIXjLL6+Sdq3qXVZrzatKneRxFOEEzuACPLiGOtxBA1rAAOEZXuHNeXRenHfnY9FacPKZY/gD5/MHWXGMhw== !
AAAB6HicbVBNS8NAEJ3Ur1q/qh69LBbBU0mqoDcLXjy2YGuhDWWznbRrN5uwuxFK6C/w4kERr/4kb/4bt20O2vpg4PHeDDPzgkRwbVz32ymsrW9sbhW3Szu7e/sH5cOjto5TxbDFYhGrTkA1Ci6xZbgR2EkU0igQ+BCMb2f+wxMqzWN5byYJ+hEdSh5yRo2Vmjf9csWtunOQVeLlpAI5Gv3yV28QszRCaZigWnc9NzF+RpXhTOC01Es1JpSN6RC7lkoaofaz+aFTcmaVAQljZUsaMld/T2Q00noSBbYzomakl72Z+J/XTU147WdcJqlByRaLwlQQE5PZ12TAFTIjJpZQpri9lbARVZQZm03JhuAtv7xK2rWqd1GtNS8rdZLHUYQTOIVz8OAK6nAHDWgBA4RneIU359F5cd6dj0VrwclnjuEPnM8fhumMpQ== ?
[[ ,f : ⌧ ⌧ 0 t : ⌧ ⌧ 0]] AAACIHicbVBNS8NAEN34WeNX1YvgZWsRPUhJVKh4EjzoUcGqkIQy2W7s4m4SdieFUvpTvPhXvHhQRG/6a9zWHurHg2Ee782wOy/OpTDoeR/OxOTU9Mxsac6dX1hcWi6vrF6ZrNCMN1gmM30Tg+FSpLyBAiW/yTUHFUt+Hd+dDPzrDtdGZOkldnMeKbhNRSIYoJWa5XoQVgLqhqegFOwmRyFCEWI2aNthpwWmTZEe0XHZjcJK1CxXvZo3BP1L/BGpkhHOm+X3sJWxQvEUmQRjAt/LMeqBRsEk77thYXgO7A5ueWBpCoqbqDc8sE+3rNKiSaZtpUiH6vhGD5QxXRXbSQXYNr+9gfifFxSYHEY9keYF8pR9P5QUkmJGB2nRltCcoexaAkwL+1fK2qCBoc3UtSH4v0/+S672av5+be/ioHq8PoqjRDbIJtkhPqmTY3JGzkmDMHJPHskzeXEenCfn1Xn7Hp1wRjtr5Aeczy+FlaE4 ! ` !
Γ , f : τ τ rec f .t : τ τ Γ , x : τ x : τ AAAB6HicbVBNS8NAEJ34WetX1aOXxSJ4KkkV9FjoxWML9gPaUDbbSbt2swm7G6GE/gIvHhTx6k/y5r9x2+agrQ8GHu/NMDMvSATXxnW/nY3Nre2d3cJecf/g8Oi4dHLa1nGqGLZYLGLVDahGwSW2DDcCu4lCGgUCO8GkPvc7T6g0j+WDmSboR3QkecgZNVZq1gelsltxFyDrxMtJGXI0BqWv/jBmaYTSMEG17nluYvyMKsOZwFmxn2pMKJvQEfYslTRC7WeLQ2fk0ipDEsbKljRkof6eyGik9TQKbGdEzVivenPxP6+XmvDOz7hMUoOSLReFqSAmJvOvyZArZEZMLaFMcXsrYWOqKDM2m6INwVt9eZ20qxXvulJt3pRrJI+jAOdwAVfgwS3U4B4a0AIGCM/wCm/Oo/PivDsfy9YNJ585gz9wPn8AjPmMqQ== C
0 0 = AAAB6nicbVDLSgNBEOz1GeMr6tHLYBA8hd0o6DHgxWNE84BkCbOT2WTIzOwy0yuEkE/w4kERr36RN//GSbIHTSxoKKq66e6KUiks+v63t7a+sbm1Xdgp7u7tHxyWjo6bNskM4w2WyMS0I2q5FJo3UKDk7dRwqiLJW9Hodua3nrixItGPOE55qOhAi1gwik566KqsVyr7FX8OskqCnJQhR71X+ur2E5YprpFJam0n8FMMJ9SgYJJPi93M8pSyER3wjqOaKm7DyfzUKTl3Sp/EiXGlkczV3xMTqqwdq8h1KopDu+zNxP+8TobxTTgROs2Qa7ZYFGeSYEJmf5O+MJyhHDtCmRHuVsKG1FCGLp2iCyFYfnmVNKuV4LJSvb8q10geRwFO4QwuIIBrqMEd1KEBDAbwDK/w5knvxXv3Phata14+cwJ/4H3+AFRyjbg= µ = J → ` → K J ` K
AAAB6HicbVBNS8NAEJ3Ur1q/qh69rBbBU0mqoMeCF48t2FpoQ9lsJ+3azSbsboQS+gu8eFDEqz/Jm//GbZuDtj4YeLw3w8y8IBFcG9f9dgpr6xubW8Xt0s7u3v5B+fCoreNUMWyxWMSqE1CNgktsGW4EdhKFNAoEPgTj25n/8IRK81jem0mCfkSHkoecUWOl5mm/XHGr7hxklXg5qUCORr/81RvELI1QGiao1l3PTYyfUWU4Ezgt9VKNCWVjOsSupZJGqP1sfuiUnFtlQMJY2ZKGzNXfExmNtJ5Ege2MqBnpZW8m/ud1UxPe+BmXSWpQssWiMBXExGT2NRlwhcyIiSWUKW5vJWxEFWXGZlOyIXjLL6+Sdq3qXVZrzatKneRxFOEEzuACPLiGOtxBA1rAAOEZXuHNeXRenHfnY9FacPKZY/gD5/MHWXGMhw== !
AAAB6HicbVBNS8NAEJ34WetX1aOXxSJ4KkkV9FjoxWML9gPaUDbbSbt2swm7G6GE/gIvHhTx6k/y5r9x2+agrQ8GHu/NMDMvSATXxnW/nY3Nre2d3cJecf/g8Oi4dHLa1nGqGLZYLGLVDahGwSW2DDcCu4lCGgUCO8GkPvc7T6g0j+WDmSboR3QkecgZNVZq1gelsltxFyDrxMtJGXI0BqWv/jBmaYTSMEG17nluYvyMKsOZwFmxn2pMKJvQEfYslTRC7WeLQ2fk0ipDEsbKljRkof6eyGik9TQKbGdEzVivenPxP6+XmvDOz7hMUoOSLReFqSAmJvOvyZArZEZMLaFMcXsrYWOqKDM2m6INwVt9eZ20qxXvulJt3pRrJI+jAOdwAVfgwS3U4B4a0AIGCM/wCm/Oo/PivDsfy9YNJ585gz9wPn8AjPmMqQ== C
[[ u :Int]] [[ t1 : ]] [[ t2 : ]] AAAB83icbVDLSsNAFJ3UV62vqks3g0VwVZIq6LLgxmUF+4AmlMnkph06mYR5CCX0N9y4UMStP+POv3HSZqGtBwYO59zDvXPCjDOlXffbqWxsbm3vVHdre/sHh0f145OeSo2k0KUpT+UgJAo4E9DVTHMYZBJIEnLoh9O7wu8/gVQsFY96lkGQkLFgMaNEW8n3jYhAFmEsRvWG23QXwOvEK0kDleiM6l9+lFKTgNCUE6WGnpvpICdSM8phXvONgozQKRnD0FJBElBBvrh5ji+sEuE4lfYJjRfq70ROEqVmSWgnE6InatUrxP+8odHxbZAzkRkNgi4XxYZjneKiABwxCVTzmSWESmZvxXRCJKHa1lSzJXirX14nvVbTu2q2Hq4bbVzWUUVn6BxdIg/doDa6Rx3URRRl6Bm9ojfHOC/Ou/OxHK04ZeYU/YHz+QPzxpGE n AAACEXicbVC7SgNBFJ2Nr7i+ojaCzWgQrMKuCopVwELtIpgH7C7h7mSSDJmZXWZmhbDkF2z8FRsLRWzt7PwbJ4/C14ELh3Pu5d574pQzbTzv0ynMzS8sLhWX3ZXVtfWN0uZWQyeZIrROEp6oVgyaciZp3TDDaStVFETMaTMeXIz95h1VmiXy1gxTGgnoSdZlBIyV2qXDINwLsBteghAQ3nVA93GGz3EowPSVyK+lGblRuBe1S2Wv4k2A/xJ/Rspohlq79BF2EpIJKg3hoHXge6mJclCGEU5HbphpmgIZQI8GlkoQVEf55KMRPrBKB3cTZUsaPFG/T+QgtB6K2HaOD9W/vbH4nxdkpnsW5UymmaGSTBd1M45Ngsfx4A5TlBg+tASIYvZWTPqggBgbomtD8H+//Jc0jir+ceXo5qRc3ZnFUUS7aB8dIh+doiq6QjVURwTdo0f0jF6cB+fJeXXepq0FZzazjX7Aef8Ckdibew== ` AAACDXicbVDLSsNAFJ3UV42vqBvBzdQquCpJFRRXBRe6rGAfkIRyM522Q2eSMDMplNIfcOOvuHGhiFv37vwbp4+FVg9cOJxzL/feE6WcKe26X1ZuaXlldS2/bm9sbm3vOLt7dZVkktAaSXgimxEoyllMa5ppTpuppCAiThtR/3riNwZUKpbE93qY0lBAN2YdRkAbqeUc+0HBx3ZwA0JAMGiD6mHd8vAVDroTyQ6DQthyim7JnQL/Jd6cFNEc1ZbzGbQTkgkaa8JBKd9zUx2OQGpGOB3bQaZoCqQPXeobGoOgKhxNvxnjE6O0cSeRpmKNp+rPiREIpYYiMp0CdE8tehPxP8/PdOcyHLE4zTSNyWxRJ+NYJ3gSDW4zSYnmQ0OASGZuxaQHEog2AdomBG/x5b+kXi55Z6Xy3XmxcjCPI48O0RE6RR66QBV0i6qohgh6QE/oBb1aj9az9Wa9z1pz1nxmH/2C9fENlVWZOQ== ` AAACDXicbVDLSsNAFJ3UV42vqBvBzdQquCpJFRRXBRe6rGAfkIRyM522Q2eSMDMplNIfcOOvuHGhiFv37vwbp4+FVg9cOJxzL/feE6WcKe26X1ZuaXlldS2/bm9sbm3vOLt7dZVkktAaSXgimxEoyllMa5ppTpuppCAiThtR/3riNwZUKpbE93qY0lBAN2YdRkAbqeUc+0HBx3ZwA0JAMGiD6mHdKuMrHHQnkh0GhbDlFN2SOwX+S7w5KaI5qi3nM2gnJBM01oSDUr7npjocgdSMcDq2g0zRFEgfutQ3NAZBVTiafjPGJ0Zp404iTcUaT9WfEyMQSg1FZDoF6J5a9Cbif56f6c5lOGJxmmkak9miTsaxTvAkGtxmkhLNh4YAkczcikkPJBBtArRNCN7iy39JvVzyzkrlu/Ni5WAeRx4doiN0ijx0gSroFlVRDRH0gJ7QC3q1Hq1n6816n7XmrPnMPvoF6+MblueZOg== ` Γ if u then t1 else t2 : γ = Γ n : Int =
AAAB6HicbVBNS8NAEJ34WetX1aOXxSJ4KkkV9FjoxWML9gPaUDbbSbt2swm7G6GE/gIvHhTx6k/y5r9x2+agrQ8GHu/NMDMvSATXxnW/nY3Nre2d3cJecf/g8Oi4dHLa1nGqGLZYLGLVDahGwSW2DDcCu4lCGgUCO8GkPvc7T6g0j+WDmSboR3QkecgZNVZq1gelsltxFyDrxMtJGXI0BqWv/jBmaYTSMEG17nluYvyMKsOZwFmxn2pMKJvQEfYslTRC7WeLQ2fk0ipDEsbKljRkof6eyGik9TQKbGdEzVivenPxP6+XmvDOz7hMUoOSLReFqSAmJvOvyZArZEZMLaFMcXsrYWOqKDM2m6INwVt9eZ20qxXvulJt3pRrJI+jAOdwAVfgwS3U4B4a0AIGCM/wCm/Oo/PivDsfy9YNJ585gz9wPn8AjPmMqQ== C J ` K J ` K AAAB6HicbVBNS8NAEJ3Ur1q/qh69rBbBU0mqoMeCF48t2FpoQ9lsJ+3azSbsboQS+gu8eFDEqz/Jm//GbZuDtj4YeLw3w8y8IBFcG9f9dgpr6xubW8Xt0s7u3v5B+fCoreNUMWyxWMSqE1CNgktsGW4EdhKFNAoEPgTj25n/8IRK81jem0mCfkSHkoecUWOl5mm/XHGr7hxklXg5qUCORr/81RvELI1QGiao1l3PTYyfUWU4Ezgt9VKNCWVjOsSupZJGqP1sfuiUnFtlQMJY2ZKGzNXfExmNtJ5Ege2MqBnpZW8m/ud1UxPe+BmXSWpQssWiMBXExGT2NRlwhcyIiSWUKW5vJWxEFWXGZlOyIXjLL6+Sdq3qXVZrzatKneRxFOEEzuACPLiGOtxBA1rAAOEZXuHNeXRenHfnY9FacPKZY/gD5/MHWXGMhw== ! if
AAAB6HicbVBNS8NAEJ3Ur1q/qh69LBbBU0mqoDcLXjy2YGuhDWWznbRrN5uwuxFK6C/w4kERr/4kb/4bt20O2vpg4PHeDDPzgkRwbVz32ymsrW9sbhW3Szu7e/sH5cOjto5TxbDFYhGrTkA1Ci6xZbgR2EkU0igQ+BCMb2f+wxMqzWN5byYJ+hEdSh5yRo2Vmjf9csWtunOQVeLlpAI5Gv3yV28QszRCaZigWnc9NzF+RpXhTOC01Es1JpSN6RC7lkoaofaz+aFTcmaVAQljZUsaMld/T2Q00noSBbYzomakl72Z+J/XTU147WdcJqlByRaLwlQQE5PZ12TAFTIjJpZQpri9lbARVZQZm03JhuAtv7xK2rWqd1GtNS8rdZLHUYQTOIVz8OAK6nAHDWgBA4RneIU359F5cd6dj0VrwclnjuEPnM8fhumMpQ== ?
AAAB/nicbVC7SgNBFJ2NrxhfUUubwSBYSNiNhXYGbCyjmAckS5idnU2GzGOZmRWWJWBnY6ufYCe2/oq9YOMP2Dl5FCbxwIXDOfdy7z1BzKg2rvvh5JaWV1bX8uuFjc2t7Z3i7l5Dy0RhUseSSdUKkCaMClI31DDSihVBPGCkGQwuR37zjihNpbg1aUx8jnqCRhQjY6UbGXeLJbfsjgEXiTclpYufB/p98klq3eJXJ5Q44UQYzJDWbc+NjZ8hZShmZFjoJJrECA9Qj7QtFYgT7WfjS4fwyCohjKSyJQwcq38nMsS1TnlgOzkyfT3vjcT/vHZionM/oyJODBF4sihKGDQSjt6GIVUEG5ZagrCi9laI+0ghbGw4M1u04UilKhzaZLz5HBZJo1L2TsuVa7dUhWCCPDgAh+AYeOAMVMEVqIE6wCACj+AJPDv3zovz6rxNWnPOdGYfzMB5/wU2rJs1 op