From 507546f701b686528d71a360b8268b9a89bb1f9a Mon Sep 17 00:00:00 2001 From: edgar-costa Date: Wed, 23 Jan 2019 16:50:42 +0100 Subject: [PATCH] updated some scripts, gitignore, cleaned a bit --- .gitignore | 32 +- examples/bin/install-emacs-mode.sh | 7 - examples/bin/install.sh | 93 --- examples/bin/update-bmv2.sh | 53 -- examples/bin/update-p4c-bm.sh | 11 - examples/bin/update-p4c.sh | 35 - examples/docs/JSON_format.md | 703 ------------------ examples/docs/advanced_primitives.md | 16 - examples/docs/cli_commands.md | 85 --- examples/docs/includes/core.p4 | 82 -- examples/docs/includes/debug.p4 | 86 --- examples/docs/includes/p4d2model.p4 | 224 ------ examples/docs/includes/psa.p4 | 579 --------------- examples/docs/includes/v1model.p4 | 254 ------- examples/docs/migration-guide.pptx | Bin 401624 -> 0 bytes examples/docs/p4-mode.el | 28 - examples/docs/p4_14-mode.el | 264 ------- examples/docs/p4_16-mode.el | 238 ------ examples/docs/p4dbg_user_guide.md | 282 ------- examples/docs/resources.md | 7 - examples/docs/simple_switch.md | 99 --- exercises/07-Count-Min-Sketch/README.md | 2 +- .../solution/cm-sketch-controller.py | 2 +- vm/Vagrantfile | 2 +- vm/bin/install-p4-tools.sh | 25 +- vm/bin/misc-install.sh | 10 + vm/bin/root-bootstrap.sh | 1 + vm/bin/update-bmv2.sh | 17 +- vm/bin/update-p4c.sh | 22 +- 29 files changed, 95 insertions(+), 3164 deletions(-) delete mode 100644 examples/bin/install-emacs-mode.sh delete mode 100644 examples/bin/install.sh delete mode 100644 examples/bin/update-bmv2.sh delete mode 100644 examples/bin/update-p4c-bm.sh delete mode 100644 examples/bin/update-p4c.sh delete mode 100644 examples/docs/JSON_format.md delete mode 100644 examples/docs/advanced_primitives.md delete mode 100644 examples/docs/cli_commands.md delete mode 100644 examples/docs/includes/core.p4 delete mode 100644 examples/docs/includes/debug.p4 delete mode 100644 examples/docs/includes/p4d2model.p4 delete mode 100644 examples/docs/includes/psa.p4 delete mode 100644 examples/docs/includes/v1model.p4 delete mode 100644 examples/docs/migration-guide.pptx delete mode 100644 examples/docs/p4-mode.el delete mode 100644 examples/docs/p4_14-mode.el delete mode 100644 examples/docs/p4_16-mode.el delete mode 100644 examples/docs/p4dbg_user_guide.md delete mode 100644 examples/docs/resources.md delete mode 100644 examples/docs/simple_switch.md diff --git a/.gitignore b/.gitignore index b5b5524..4f8defe 100644 --- a/.gitignore +++ b/.gitignore @@ -454,4 +454,34 @@ $RECYCLE.BIN/ *.lnk -# End of https://www.gitignore.io/api/latex,linux,macos,python,windows,phpstorm \ No newline at end of file +# End of https://www.gitignore.io/api/latex,linux,macos,python,windows,phpstorm + +#own ignores +# Python byte code +*.pyc + +# Emacs +*~ + +# Compiled JSON +*.json +!*p4app*.json + +*.pcap + +# Build folders +build*/ +log*/ +pcap*/ +*.pickle + +*.db + +*.p4i +*.p4rt + +#latex +*.aux +*.bbl +*.log +*.out \ No newline at end of file diff --git a/examples/bin/install-emacs-mode.sh b/examples/bin/install-emacs-mode.sh deleted file mode 100644 index 77e139d..0000000 --- a/examples/bin/install-emacs-mode.sh +++ /dev/null @@ -1,7 +0,0 @@ -sudo cp p4_16-mode.el /usr/share/emacs/site-lisp/ -sudo mkdir -p /home/edgar/.emacs.d/ -echo "(autoload 'p4_16-mode' \"p4_16-mode.el\" \"P4 Syntax.\" t)" > init.el -echo "(add-to-list 'auto-mode-alist '(\"\\.p4\\'\" . p4_16-mode))" | tee -a init.el -sudo mv init.el /home/edgar/.emacs.d/ -sudo ln -s /usr/share/emacs/site-lisp/p4_16-mode.el /home/edgar/.emacs.d/p4_16-mode.el -sudo chown -R edgar:edgar /home/edgar/.emacs.d/ diff --git a/examples/bin/install.sh b/examples/bin/install.sh deleted file mode 100644 index 4d34004..0000000 --- a/examples/bin/install.sh +++ /dev/null @@ -1,93 +0,0 @@ -#!/bin/bash - - -#Install Dependencies (ubuntu 16.04 is recommended. In ubuntu 14.04 some dependencies have to be installed manually) - -apt-get install -y \ - git \ - mininet \ - autoconf \ - automake \ - libtool \ - curl \ - make \ - g++ \ - unzip \ - libgc-dev \ - bison \ - flex \ - libfl-dev \ - libgmp-dev \ - libboost-dev \ - libboost-iostreams-dev \ - pkg-config \ - python \ - python-scapy \ - python-ipaddr \ - tcpdump \ - cmake - -#create directory p4 (if it does not exist) in home. And cd - -mkdir -p $HOME/p4 -cd $HOME/p4 - -# Bmv2 -git clone https://github.com/p4lang/behavioral-model bmv2 -cd bmv2 -./install_deps.sh -./autogen.sh -./configure -make -sudo make install -sudo ldconfig -cd .. - -#P4C-bmv2 (old compiler, deprecated soon?) -git clone https://github.com/p4lang/p4c-bm.git -cd p4c-bm -sudo pip install -r requirements.txt -sudo python setup.py install -cd .. - -# Protobuf -git clone https://github.com/google/protobuf.git -cd protobuf -git checkout v3.2.0 -./autogen.sh -./configure -make -sudo make install -sudo ldconfig -cd .. - -# libboost 1.57 is required - -wget boost_1_58_0.tar.gz http://sourceforge.net/projects/boost/files/boost/1.58.0/boost_1_58_0.tar.gz/download -tar xzvf boost_1_57_0.tar.gz -cd boost_1_58_0/ - -./bootstrap.sh --prefix=/usr/local -user_configFile=`find $PWD -name user-config.jam` -echo "using mpi ;" >> $user_configFile - -sudo ./b2 --with=all -j 4 install - -sudo sh -c 'echo "/usr/local/lib" >> /etc/ld.so.conf.d/local.conf' -sudo ldconfig - -# P4C -git clone --recursive https://github.com/p4lang/p4c -cd p4c -mkdir build -cd build -#only if cmake < 3.0.2 -#sudo apt-get install software-properties-common -#sudo add-apt-repository ppa:george-edison55/cmake-3.x -#sudo apt-get update -#sudo apt-get install --only-upgrade cmake -cmake .. -make -j4 -sudo make install -cd .. -cd .. diff --git a/examples/bin/update-bmv2.sh b/examples/bin/update-bmv2.sh deleted file mode 100644 index 0e209f1..0000000 --- a/examples/bin/update-bmv2.sh +++ /dev/null @@ -1,53 +0,0 @@ -#! /bin/bash - -#save current path to return later -CURRENT_PATH="$(pwd)" - -#enable multi-queueing -if [[ $* == *--hard-clean* ]] -then - sudo rm -rf $HOME/p4/bmv2 - cd $HOME/p4 - git clone https://github.com/p4lang/behavioral-model bmv2 - cd bmv2 -else - #change directory to the directory where p4-bmv2 is - #assumes that bmv2 is installed here: - cd $HOME/p4/bmv2 - # Clean repo - make clean - - # Pull new changes - git pull - - -#enable multi-queueing -if [[ $* == *--enable-multi-queue* ]] -then - sed -i 's/^\/\/ \#define SSWITCH_PRIORITY_QUEUEING_ON/\#define SSWITCH_PRIORITY_QUEUEING_ON/g' targets/simple_switch/simple_switch.h -elif [[ $* == *--disable-multi-queue* ]] -then - sed -i 's/^\#define SSWITCH_PRIORITY_QUEUEING_ON/\/\/ \#define SSWITCH_PRIORITY_QUEUEING_ON/g' targets/simple_switch/simple_switch.h -fi - -#install dependencies again -#./install_deps.sh - -# Compile and install -./autogen.sh - -if [[ $* == *--no-debug* ]]; then - ./configure --disable-elogger --disable-logging-macros 'CFLAGS=-g -O2' 'CXXFLAGS=-g -O2' -else - - # With debug enabled in binaries: - ./configure 'CXXFLAGS=-O0 -g' - # Without debug enabled: - #./configure -fi - -make -j 20 -#install -sudo make install -sudo ldconfig - diff --git a/examples/bin/update-p4c-bm.sh b/examples/bin/update-p4c-bm.sh deleted file mode 100644 index 1bd71f9..0000000 --- a/examples/bin/update-p4c-bm.sh +++ /dev/null @@ -1,11 +0,0 @@ -#! /bin/bash - -#change directory to the directory where p4-bmv2 is - -#assumes that bmv2 is installed here: -cd $HOME/p4/p4c-bm - -git pull -sudo pip install -r requirements.txt -sudo python setup.py install -cd .. diff --git a/examples/bin/update-p4c.sh b/examples/bin/update-p4c.sh deleted file mode 100644 index 5740f98..0000000 --- a/examples/bin/update-p4c.sh +++ /dev/null @@ -1,35 +0,0 @@ -#! /bin/bash - -#save current path to return later -CURRENT_PATH="$(pwd)" - -cd $HOME/p4/p4c - -# Recommended in p4c's README.md -git submodule update --init --recursive - -# Get updates from master repo -git pull - -if [ -d build ] -then - echo "Deleting build directory" - /bin/rm -fr build -fi - -echo "Building p4c from scratch" -mkdir build -cd build - -# Configure for a debug build -cmake .. -DCMAKE_BUILD_TYPE=DEBUG -make -j 4 -sudo make install - -#if needed -#copy custom v1model.p4 -if [[ $* == *--update-v1model* ]] -then - cd "$CURRENT_PATH" - cp ../docs/includes/v1model.p4 /usr/local/share/p4c/p4include/ -fi \ No newline at end of file diff --git a/examples/docs/JSON_format.md b/examples/docs/JSON_format.md deleted file mode 100644 index 9d86469..0000000 --- a/examples/docs/JSON_format.md +++ /dev/null @@ -1,703 +0,0 @@ -# BMv2 JSON input format - -All bmv2 target switches take as input a JSON file, whose format is essentially -target independent. The format is very simple and several examples can be found -in this repository, including -[here](../targets/simple_router/simple_router.json). - -This documents attempt to describe the expected JSON schema and the constraints -on each attribute. - -## Current bmv2 JSON format version - -The version described in this document is *2.14*. - -The major version number will be increased by the compiler only when -backward-compatibility of the JSON format is broken. After a major version -number increase, consummers of the JSON file may need to be updated or they may -not be able to consume newer JSON files. - -Starting with version 2.0, the version number is included in the JSON file -itself, under the key `__meta__` -> `version`. - -Note that the bmv2 code will perform a version check against the provided input -JSON. - -## General information - -Tentative support for signed fields (with a 2 complement representation) has -been added to bmv2, although they are not supported in P4 1.0 or by the [p4c-bm -compiler](https://github.com/p4lang/p4c-bm). However, signed constants (in -expressions, or as primitive arguments) are always supported. -Arithmetic is done with infinite precision, but when a value is copied into a -field, it is truncated based on the field's bitwidth. - -## Format - -### The type value object - -You will see many places where a JSON object with 2 attributes, `type` and -`value`, is expected (for example, action primitive arguments). This is the -convention we follow: -- if `type` is `field`, `value` is a JSON 2-tuple, where the first item is the -header instance name and the second is the field member name. -- if `type` is `hexstr`, `value` is a bitstring written in hexadecimal (big -endian order); it can be prefixed with a negative sign, for negative values. -- if `type` is `bool`, `value` is either `true` or `false`. -- if `type` is a named P4 type (`header`, `header_stack`, `calculation`, -`register_array`, `meter_array`, `counter_array`, `header_union`, -`header_union_stack`), `value` is a string corresponding to the name of the -designated object. -- if `type` is `string`, `value` is a sequence of characters. -- if `type` is `lookahead` (parser only), `value` is a JSON 2-tuple, where the -first item is the bit offset for the lookahead and the second item is the -bitwidth. -- if `type` is `register`, `value` is a JSON 2-tuple, where the first item is -the register array name and the second is an `expression` used to evaluate the -index. -- if `type` is `stack_field`, `value` is a JSON 2-tuple, where the first item is -the header stack name and the second is the field member name. This is used to -access a field in the last valid header instance in the stack. -- if `type` is `union_stack_field`, `value` is a JSON 3-tuple, where the first item is -the header union stack name, the second is the union member name and the third -is the field member name. This can be used exclusively in the `transition_key` -of a parser to access a field in the last valid union instance in the stack. -- if `type` is `expression`, `value` is a JSON object with 3 attributes: - - `op`: the operation performed (`+`, `-`, `*`, `<<`, `>>`, `==`, `!=`, `>`, - `>=`, `<`, `<=`, `and`, `or`, `not`, `&`, `|`, `^`, `~`, `valid`, - `valid_union`) - - `left`: the left side of the operation, or `null` if unary operation - - `right`: the right side of the operation -- if `type` is `local`, `value` is an integer representing an index inside an -array of local integral values. This `type` can only be used inside of an -expression, i.e. if this JSON object has a parent whose `type` attribute is -`expression`. The meaning of these "local integral values" depend on the context -in which the parent expression is evaluated. In the case of an expression being -evaluated inside of an action function belonging to a match-action table, the -local integral values correspond to the runtime data available for a given table -entry (see the [actions](#actions) section for more details on runtime data). - -For an expression, `left` and `right` will themselves be JSON objects, where the -`value` attribute can be one of `field`, `hexstr`, `header`, `expression`, -`bool`, `register`, `header_stack`, `stack_field`. - -bmv2 also supports these recently-added operations: - - data-to-bool conversion (`op` is `d2b`): unary operation which can be used -to explicitly convert a data value (i.e. a value that can be read from / -written to a field, or a value obtained from runtime action data, or a value -obtained from a JSON `hexstr`) to a boolean value. Note that implicit -conversions are not supported. - - bool-to-data conversion (`op` is `b2d`): unary operation which can be used -to explicitly convert a boolean value to a data value. Note that implicit -conversions are not supported. - - 2-complement modulo (`op` is `two_comp_mod`): given a source data value and -a width data value, produces a third data value which is the signed value of the -source given a 2-complement representation with that width. For example, -`two_comp_mod(257, 8) == 1` and `two_comp_mod(-129, 8) == 127`. - - ternary operator (`op` is `?`): in addition to `left` and `right`, the JSON -object has a fourth attribute, `cond` (condition), which is itself an -expression. For example, in `(hA.f1 == 9) ? 3 : 4`, `cond` would be the JSON -representation of `(hA.f1 == 9)`, `left` would be the JSON representation of `3` -and `right` would be the JSON representation of `4`. - - stack header access (`op` is `dereference_header_stack`): `left` is a -`header_stack` and `right` needs to evaluate to a valid index inside the stack; -the expression produces a `header`. - - last valid index in a stack (`op` is `last_stack_index`): unary operation -which takes a `header_stack` and produces the index of the last valid `header` -in the stack as a data value. - - size of a stack (`op` is `size_stack`): unary operation which takes a -`header_stack` and produces the size of the stack (i.e. number of valid headers -in the stack) as a data value. - - access to the header field at a given offset (`op` is `access_field`): -`left` needs to evaluate to a `header` and `right` is a JSON integer -representing a valid field offset for that header; the expression returns the -header field at the given offset. The interest of this operation is that the -`header` needs not be known at compile time, it can be a stack member resolved -at runtime. - - stack union access (`op` is `dereference_union_stack`): `left` is a -`header_union_stack` and `right` needs to evaluate to a valid index inside the -stack; the expression produces a `header`. - - access to the header union member at a given offset (`op` is -`access_union_header`): `left` needs to evaluate to a `header_union` and `right` -is a JSON integer representing a valid member offset for that union; the -expression returns the header at the given offset. The interest of this -operation is that the `header_union` needs not be known at compile time, it can -be a union stack entry resolved at runtime. - -For field references, some special values are allowed. They are called "hidden -fields". For now, we only support one kind of hidden fields: `
.$valid$`. This field is a 1-bit field which encodes the validity of the -corresponding header. It is a read-only field. It can be used just like any -other field; in particular as part of a match-table key or in a control-flow -condition. In the long run, this field will completely replace the valid match -type and the `valid()` built-in (in expressions), but we are not there yet. - - -The attributes of the root JSON dictionary are: - -### `__meta__` - -It is a JSON object which includes some meta information about the JSON file. It -has the following attributes: -- `version`: a JSON array with exactly 2 integer entries, a major version number -and a minor version number. -- `compiler`: an optional string to help identify the P4 compiler which produced -the JSON. - -### `header_types` - -It is a JSON array of all the header types defined in the P4 program. Each array -item has the following attributes: -- `name`: fully qualified P4 name of the header type -- `id`: a unique integer (unique with respect to other header types) -- `fields`: a JSON array of JSON 2-tuples (field member name, field width in -bits). Note that the JSON 2-tuples can optionally be JSON 3-tuples if you want -to experiment with signed fields support. In this case, the third element of the -tuples is a boolean value, which is `true` iff the field is signed. A signed -field needs to have a bitwidth of at least 2! For variable length fields, the -field width is `"*"`. There can be at most one variable-length field in a header -type. When a variable-length field is present, the header type is required to -have the `length_exp` attribute. -- `length_exp`: this attribute is only present when the header type includes a -variable-length field, in which case this attribute must be an expression -resolving to an integral value, corresponding to the variable-length field's -bitwidth. -- `max_length`: this attribute needs only be present when the header type -includes a variable-length field, in which case this attribute is the maximum -width in bytes for the header. - -### `headers` - -It is a JSON array of all the header instances (including metadata) declared in -the P4 program. Each array item has the following attributes: -- `name` -- `id`: a unique integer (unique with respect to other header instances) -- `header_type`: the `name` of the header type for this header instance -- `metadata`: a boolean value, `true` iff the instance is a metadata instance - -### `header_stacks` - -It is a JSON array of all the header stacks declared in the P4 program. Each -array item has the following attributes: -- `name` -- `id`: a unique integer (unique with respect to other header stacks) -- `header_type`: the `name` of the header type for this stack -- `header_ids`: a JSON array of integers; each integer being the unique `id` of -a header instance included in the stack. These ids have to be in the correct -order: stack[0], stack[1], ... - -### `header_union_types` - -It is a JSON array of all the header union types declared in the P4 -program. Each array item has the following attributes: -- `name` -- `id`: a unique integer (unique with respect to other header union types) -- `headers`: a JSON array of 2-tuples, where the first element is the P4 name of -the corresponding union member, and the second element is the name of the header -type for this element. - -### `header_unions` - -It is a JSON array of all the header unions declared in the P4 program. Each -array item has the following attributes: -- `name` -- `id`: a unique integer (unique with respect to other header unions) -- `union_type`: the name of the corresponding header union type for this union -instance -- `header_ids`: a JSON array of integers, each integer being the unique `id` of -a header instance included in the union. We recommend using the same order as in -the corresponding P4 declaration. - -### `header_union_stacks` - -It is a JSON array of all the header union stacks declared in the P4 -program. Each array item has the following attributes: -- `name` -- `id`: a unique integer (unique with respect to other header union stacks) -- `union_type`: the name of the corresponding header union type for the elements -of this stack. -- `header_union_ids`: a JSON array of integers, each integer being the unique -`id` of a header union instance included in the stack. These ids have to be in -the correct order: union_stack[0], union_stack[1], ... - -### `errors` - -It is a JSON array of all the errors declared in the P4 program (error -declarations were introduced in P4_16 and can be raised in parsers). Each array -item is itself an array with exactly 2 elements: the name of the error as it -appears in the P4 program and an integer value in the range `[0, 2**31 - 1)`. It -is up to the compiler to assign a *unique* integer value to each declared error; -if the error constant is used in the parser (e.g. in a `verify` statement) or in -a control, it is up to the compiler to consistently replace each error with its -assigned value when producing the bmv2 JSON. bmv2 supports the core library -errors, but it is up to the compiler to include them in this JSON array and -assign a value to them (however this is not strictly necessary if these core -error constants are not used anywhere in the program). - -We recommend using 0 for the core library error `NoError`, but this is not -strictly necessary. Note that the value `2**31 - 1` is reserved and cannot be -assigned by the compiler. - -### `enums` - -Its is a JSON array of all the enums declared in the P4 program (enum -declarations were introduced in P4_16). Each array item has the following -attributes: -- `name`: name of the enum, as it appears in the p4 program -- `entries`: a JSON array of all the constants declared inside the enum. Each -array item is itself an array with exactly 2 elements: the name of the enum -constant as it appears in the P4 program and an integer value in the range `[0, -2**31 - 1)`. It is up to the compiler to assign a *unique* integer value (unique -with respect to the other constants in the enum) to each enum constant; if the -enum constant is used in an expression in the P4 program, it is up to the -compiler to consistently replace each reference with its assigned value when -producing the bmv2 JSON. This is very similar to how we handle -[errors](#errors). - -### `parsers` - -It is a JSON array of all the parsers declared in the P4 program. Each array -item has the following attributes: -- `name` -- `id`: a unique integer (unique with respect to other parsers) -- `init_state`: the name of the start state for the parser -- `parse_states`: a JSON array of JSON objects. Each of these objects stores the -information for a given parse state in the program, which is used by the current -parser. The attributes for these objects are: - - `name` - - `id`: a unique integer; note that it has to be unique with respect to *all* - parse states in the JSON file, not just the parse states included in this - parser object - - `parser_ops`: a JSON array of the operations performed in this parse state, - in the correct order. Each parser operation is represented by a JSON object, - whose attributes are: - - `op`: the type of operation, either `extract`, `extract_VL`, `set`, - `verify`, `shift` or `primitive`. - - `parameters`: a JSON array of objects encoding the parameters to the - parser operation. Depending on the type of operation, the constraints are - different. A description of these constraints is included [later in this - section](#parser-operations). - - `transition_key`: a JSON array (in the correct order) of objects which - describe the different fields of the parse state transition key. Each object - has 2 attributes, `type` and `value`, where `type` can be either - `field`, `stack_field` (for a field of the last extracted instance in a - stack), `union_stack_field` (for a field of the last extracted instance in a - union stack) or `lookahead` (see [here](#the-type-value-object)). - - `transitions`: a JSON array of objects encoding each parse state - transition. The different attributes for these objects are: - - `type`: either `default` (for the default transition), `hexstr` (for a - regular hexstring value-based transition) or `parse_vset` (for a parse - value-set). - - `value`: only relevant if the `type` attribute is `hexstr`, in which case - it is the hexstring value for the transition, or `parse_vset`, in which case - it is the name of the corresponding parse value-set. Set to `null` if `type` - is `hexstr`. - - `mask`: only relevant if the `type` attribute is `hexstr` or `parse_vset` - (`null` if `type` is `default`). It can either be a hexstring (to be used as - a mask and ANDed with the key and the value) or `null`. For a parse - value-set, the mask will be ANDed with each value in the set when checking - for a match. - - `next_state`: the name of the next parse state, or `null` if this is the - last state in the parser. - -For values and masks, make sure that you use the correct format. They need to be -the concatenation (in the right order) of all byte padded fields (padded with -`0` bits). For example, if the transition key consists of a 12-bit field and a -2-bit field, each value will need to have 3 bytes (2 for the first field, 1 for -the second one). If the transition value is `0xaba`, `0x3`, the `value` -attribute will be set to `0x0aba03`. - -#### parser operations - -In the `parser_ops` array, the format of the `parameters` array depends on the -`op` value: - - `extract`: only takes one parameter, of type `regular` (extraction to a - regular header instance), `stack` (extraction to the end of a header stack) or - `union_stack` (extraction to the end of a header union stack). If `type` is - `regular`, `value` is the name of the header instance to extract. If `type` is - `stack`, `value` is the name of the header stack. Finally if `type` is - `union_stack`, then `value` is a 2-tuple with the name of the header union - stack as the first element and the name of the appropriate union member as the - second element. - - `extract_VL`: introduced for P4_16, where the expression to dynamically - compute the length of a variable-length field is an argument to the extract - built-in rather than a property of the header. For this operation, we require - 2 parameters, the first one of type `regular` and the second one of type - `expression` (to compute the length in bits of the variable-length field in - the header). - - `set`: takes exactly 2 parameters; the first one needs to be of type `field` - with the appropriate value. The second one can be of type `field`, `hexstr`, - `lookahead` or `expression`, with the appropriate value (see - [here](#the-type-value-object)). - - `verify`: we expect an array with exactly 2 elements; the first should be a - boolean expression while the second should be an expression resolving to a - valid integral value for an error constant (see [here](#errors)). - - `shift`: we expect a single parameter, the number of bytes to shift (shifted - packet data will be discarded). - - `primitive`: introduced for P4_16, where extern methods can be called from - parser states. It only takes one parameter, which is itself a JSON object with - the following attributes: - - `op`: the primitive name. This primitive has to be supported by the - target. - - `parameters`: a JSON array of the arguments passed to the primitive (has - to match the target primitive definition). Each argument is represented by a - [type-value](#the-type-value-object) JSON object. This is consistent with how - control-flow actions are described in the JSON, so you can refer to the - [actions](#actions) section for more details. - -We provide an example of parser operations for a parser state: -```json -"parser_ops": [ - { - "op": "extract", - "parameters": [ - {"type": "regular", "value": "ethernet"} - ] - }, - { - "op": "primitive", - "parameters": [ - { - "op": "assign_header", - "parameters": [ - {"type": "header", "value": "ethernet_copy"}, - {"type": "header", "value": "ethernet"}, - ] - } - ] - } -] -``` - -### `parse_vsets` - -It is a JSON array of all the parse value-sets declared in the P4 program. Each -array item has the following attributes: -- `name` -- `id`: a unique integer (unique with respect to other parse value-sets) -- `compressed_bitwidth`: the bitwidth of the values which can be added to the -set. Note that this bitwidth does not include any padding. - -### `deparsers` - -It is a JSON array of all the deparsers declared in the P4 program (or inferred -from P4 parsers). Each array item has the following attributes: -- `name` -- `id`: a unique integer (unique with respect to other deparsers) -- `order`: a JSON array of sorted header instance names. When the target switch -invokes a deparser, the headers will be serialized in this order, and non-valid -headers will be skipped. - -For stacks and unions, all the header instances need to be listed in the -appropriate order. - -### `meter_arrays` - -It is a JSON array of all the meter arrays declared in the P4 program. Each -array item has the following attributes: -- `name` -- `id`: a unique integer (unique with respect to other meter arrays) -- `type`: either `bytes` or `packets` -- `rate_count`: the number of rates for the meters. By default P4 uses 2-rate -3-color meters -- `size`: the number of meter instances in the array -- `is_direct`: a boolean indicating whether this is a direct meter array -- `binding`: if the meter array is direct, the name of the table it is attached -to -- `result_target`: a 2-tuple representing the field where the meter result -(color) will be stored; only taken into account if `is_direct` is `true`. - -### `counter_arrays` - -It is a JSON array of all the counter arrays declared in the P4 program. Each -array item has the following attributes: -- `name` -- `id`: a unique integer (unique with respect to other counter arrays) -- `size`: the number of counter instances in the array -- `is_direct`: a boolean indicating whether this is a direct counter array -- `binding`: if the counter array is direct, the name of the table it is -attached to - -Unlike for meter arrays, there is no `type` attribute because bmv2 counters -always count both bytes and packets. - -### `register_arrays` - -It is a JSON array of all the register arrays declared in the P4 program. Each -array item has the following attributes: -- `name` -- `id`: a unique integer (unique with respect to other register arrays) -- `size`: the number of register instances in the array -- `bitwidth`: the width in bits of each register cell - -### `actions` - -It is a JSON array of all the actions declared in the P4 program. Each array -item has the following attributes: -- `name` -- `id`: a unique integer (unique with respect to other actions) -- `runtime_data`: a JSON array of objects, each one representing a named -parameter of the action. Each object has exactly 2 attributes: - - `name`: the P4 name of the parameter - - `bitwidth`: the integral width, in bits, of the parameter -- `primitives`: a JSON array of objects, each one representing a primitive -call, with the following attributes: - - `op`: the primitive name. This primitive has to be supported by the target. - - `parameters`: a JSON array of the arguments passed to the primitive (has to - match the target primitive definition). Each argument is represented by a JSON - object with the following attributes: - - `type`: one of `hexstr`, `runtime_data`, `header`, `field`, `calculation`, - `meter_array`, `counter_array`, `register_array`, `header_stack`, - `expression`, `extern`, `string`, 'stack_field' - - `value`: the appropriate parameter value. If `type` is `runtime_data`, - this is an integer representing an index into the `runtime_data` (attribute - of action) array. If `type` is `extern`, this is the name of the extern - instance. See [here](#the-type-value-object) for other types. - -*Important note about extern instance methods*: even though in P4 these are -invoked using object-oriented style, bmv2 treats them as regular primitives for -which the first parameter is the extern instance. For example, if the P4 call is -`extern1.methodA(x, y)`, where `extern1` is an extern instance of type -`my_extern_type`, the bmv2 compiler needs to translate this into a call to -primitive `_my_extern_type_methodA`, with the first parameter being `{"type": -"extern", "value": "extern1"}` and the second parameter being the appropriate -representation for `x` and `y`. - -bmv2 supports the following core primitives: -- `assign`, `assign_VL` (for variable-length fields), `assign_header` and -`assign_union`. -- `push` and `pop` for stack (header stack or header union stack) manipulation. -- `_jump`: takes one parameter which must resolve to an integral value -`offset`. When it is executed, we jump to the primitive call at index `offset` -in the enclosing action. -- `_jump_if_zero`: implements a conditional jump and takes two parameters which -must both resolve to integral values, which we call respectively `cond` and -`offset`. If `cond` is 0, the primitive behaves exactly like `_jump` and we jump -to the primitive call at index `offset`; otherwise the primitive is a no-op. - -Support for additional primitives depends on the architecture being used. - -### `pipelines` - -It is a JSON array of all the top control flows (ingress, egress) in the P4 -program. Each array item has the following attributes: -- `name` -- `id`: a unique integer (unique with respect to other pipelines) -- `init_table`: the name of the first table of the pipeline -- `action_profiles`: a JSON array of JSON objects. Each of these objects stores -the information for a given P4 action profile, which is used by the current -pipeline. The attributes for these objects are: - - `name` - - `id`: a unique integer; note that it has to be unique with respect to *all* - action profiles in the JSON file, not just the action profiles included in - this pipeline object - - `max_size`: an integer representing the size (number of entries) of the - action profile - - `selector`: only present if the action profile supports dynamic group member - selection. It needs to be a JSON object with these attributes: - - `algo`: the hash algorithm used for group member selection (has to be - supported by target switch) - - `input`: a JSON array of objects with the following attributes: - - `type`: has to be `field` - - `value`: the field reference -- `tables`: a JSON array of JSON objects. Each of these objects stores the -information for a given P4 table, which is used by the current pipeline. The -attributes for these objects are: - - `name` - - `id`: a unique integer; note that it has to be unique with respect to *all* - tables in the JSON file, not just the tables included in this pipeline object - - `match_type`: one of `exact`, `lpm`, `ternary` or `range` - - `type`: the implementation for the table, one of `simple`, `indirect` - (action profiles), `indirect_ws` (action profiles with dynamic selector) - - `action_profile`: if the table is indirect, name of the action profile to - use with this table. If the table type is `indirect_ws`, then the referenced - action profile needs to have a selector attribute. - - `max_size`: an integer representing the size (number of entries) of the - table - - `with_counters`: a boolean, `true` iff the match table has direct counters - - `support_timeout`: a boolean, `true` iff the match table supports ageing - - `key`: the lookup key format, represented by a JSON array. Each member of - the array is a JSON object with the following attributes: - - `match_type`: one of `valid`, `exact`, `lpm`, `ternary`, `range` - - `target`: the field reference as a 2-tuple (or header as a string if - `match_type` if `valid`) - - `mask`: the static mask to be applied to the field, or null. Just like for - the parser transition key, make sure that this mask is byte-padded and has - the same width (in bytes) as the corresponding field (1 byte if `match_type` - is `valid`). - - `actions`: the list of actions (order does not matter) supported by this - table - - `next_tables`: maps each action to a next table name. Alternatively, maps - special string `__HIT__` and `__MISS__` to a next table name. - - `direct_meters`: the name of the associated direct meter array, or null if - the match table has no associated meter array - - `default_entry`: an optional JSON item which can force the default entry for - the table to be set when loading the JSON, without intervention from the - control plane. It has the following attributes: - - `action_id`: the id of the default action - - `action_const`: an optional boolean value which is `true` iff the control - plane is not allowed to change the default action function. Default value is - `false`. - - `action_data`: an optional JSON array where each entry is the hexstring - value for an action argument. The size of the array needs to match the - number of parameters expected by the action function with id `action_id`. - - `action_entry_const`: an optional boolean value which is `true` iff the - control plane is not allowed to modify the action entry (action function + - action data). Default value is `false`. This attribute is ignored if the - `action_data` attribute it missing. - - `entries`: enables you to optionally specify match-action entries for this - table. Specifying entries in the JSON makes the table immutable, which means - the added entries cannot be modified / deleted and that new entries cannot be - added. This doesn't impact the default entry though (see the `default_entry` - attribute). `entries` is a JSON array where each element follows the - [match-action entry format](#match-action-entry-format) described below. -- `conditionals`: a JSON array of JSON objects. Each of these objects stores the -information for a given P4 condition, which is used by the current pipeline. The -attributes for these objects are: - - `name` - - `id`: a unique integer; note that it has to be unique with respect to *all* - conditions in the JSON file, not just the conditions included in this pipeline - object - - `expression`: the expression for the condition. See - [here](#the-type-value-object) for more information on expressions format. - - `true_next`: the name of the next control flow to execute if the condition - evaluates to true (can be a table, another conditional or an action call), or - null if this is the end of the pipeline - - `false_next`: the name of the next control flow to execute if the condition - evaluates to false, or null if this is the end of the pipeline -- `action_calls`: a JSON array of JSON objects. It is used for direct action -calls from a control flow which are not wrapped into a table. The attributes for -these objects are: - - `name` - - `id`: a unique integer; note that it has to be unique with respect to *all* - action calls in the JSON file, not just the ones included in this pipeline - object - - `action_id`: the id of the action to call; note that the corresponding - action must not expect any parameter - - `next_node`: the name of the next control flow node to execute (can be a - table, a conditional or another action call like this one), or null if this is - the last node in the pipeline - -The `match_type` for the table needs to follow the following rules: -- If one match field is `range`, the table `match_type` has to be `range` -- If one match field is `ternary`, the table `match_type` has to be `ternary` -- If one match field is `lpm`, the table `match_type` is either `ternary` or -`lpm` -Note that it is not correct to have more than one `lpm` match field in the same -table. - -#### match-action entry format - -We describe the format of the match-action entries contained in the `entries` -JSON array (see table JSON format above). Each entry is a JSON object with the -following attributes: -- `match_key`: a JSON array of objects with the following attributes: - - `match_type`: one of `valid`, `exact`, `lpm`, `ternary`, `range` - - the other attributes depend on the `match_type`: - - for `valid`: we need a `key` attribute which has to be a boolean - - for `exact`: we need a `key` attribute which has to be a hexstring - - for `lpm`: we need a `key` attribute which has to be a hexstring and a - `prefix_length` attribute which has to be an integer - - for `ternary`: we need a `key` and a `mask` attributes which both have to - be hexstrings - - for `range`: we need a `start` and a `end` attribute which both have to be - hexstrings -- `action_entry`: a JSON object with the following attributes: - - `action_id`: the id of the default action - - `action_data`: a JSON array where each entry is the hexstring value for an - action argument. The size of the array needs to match the number of parameters - expected by the action function with id `action_id`. -- `priority`: an integer which indicates the priority for the entry; it is -ignored if the match type of the table is not `ternary` or `range`. In bmv2 -having a high priority translates into a low numerical value. - -Note that the `match_key` and the `action_entry` need to be formatted -correctly. In particular: -- the number of match fields in the match key needs to match the table -description -- the match types of the match fields in the match key need to match the table -description -- the hexstrings need to have the correct byte-width -- duplicate entries (as determined by the match keys) will trigger an error - -### `calculations` - -It is a JSON array of all the named calculations in the P4 program. In -particular, they are used for checksums. Each array item has the following -attributes: -- `name` -- `id`: a unique integer (unique with respect to other calculations) -- `algo`: the hash algorithm used (has to be supported by target switch) -- `input`: a JSON array of objects with the following attributes: - - `type`: one of `field`, `hexstr`, `header`, `payload` - - `value`: the appropriate value or reference (see - [here](#the-type-value-object)). For `hexstr`, we require an extra attribute - (in addition to `type` and `value`), `bitwidth`, whose value must be a - positive integer equal to the desired bitwidth for the constant. Note that - we require this attribute because the bitwidth cannot be inferred from the - hexadecimal string directly, as the desired bitwidth may not be a multiple - of a byte. - -If `type` is `payload`, all the headers present after the last included header -(or after the enclosing header of the last included field) will be included in -the input, as well as the packet payload. This is necessary for TCP checksum -computation. - -If a header is not valid when the calculation is evaluated, it will be skipped. - -### `checksums` - -It is a JSON array of all the checksums in the P4 program. Each array item has -the following attributes: -- `name` -- `id`: a unique integer (unique with respect to other checksums) -- `target`: the field where the checksum result is written -- `type`: always set to `generic` -- `calculation`: the name of the calculation to use to compute the checksum -- `update`: an optional boolean value, which defaults to `true`; indicates -whether the checksum needs to be updated in deparsers. -- `verify`: an optional boolean value, which defaults to `true`; indicates -whether the checksum needs to be verified in parsers. -- `if_cond`: null if the checksum needs to be verified and / or updated -unconditionally, otherwise a boolean expression, which will determine whether or -not the checksum gets verified and / or updated. See -[here](#the-type-value-object) for more information on expressions format. - -### `learn_lists` - -Not documented yet, use empty JSON array. - -### `extern_instances` - -It is a JSON array of all the extern instances in the P4 program. Each array -item has the following attributes: -- `name` -- `id`: a unique integer (unique with respect to other extern instances) -- `type`: the name of the extern type, the target switch needs to support this -type -- `attribute_values`: a JSON array with the initial values for the attributes of -this extern instance. Each array item has the following attributes: - - `name`: the name of the attribute - - `type`: the type of the attribute, only `hexstr` (integral values), `string` - (for character sequences) and `expression` are supported for now - - `value`: the initial value for the attribute - -### `field_aliases` - -bmv2 target architectures usually require a set of metadata fields to be defined -in the JSON input. For example, simple_switch requires the following fields: -`standard_metadata.ingress_port`, `standard_metadata.packet_length`, -`standard_metadata.instance_type`, `standard_metadata.egress_spec`, -`standard_metadata.egress_port` and `standard_metadata.clone_spec`. These fields -happen to be the standard metadata fields described in the P4_14 -specification. In some cases you may want to use different names for these -fields in a P4 program, which you can accomplish by using field aliases. A field -alias maps the name expected by bmv2 to the name used in the P4 / JSON. - -The `field_aliases` attribute is a JSON array of 2-tuples, with the following -elements: -- a string corresponding to the name expected by the bmv2 target -(e.g. `"standard_metadata.egress_port"`) -- a 2-tuple where the first item is the actual header instance name and the -second is the actual field member name, as they appear in the P4 / JSON input -(e.g. `["my_metadata", "my_egress_port"]`) diff --git a/examples/docs/advanced_primitives.md b/examples/docs/advanced_primitives.md deleted file mode 100644 index f8aa9e5..0000000 --- a/examples/docs/advanced_primitives.md +++ /dev/null @@ -1,16 +0,0 @@ - -* **Generate Digest:** Generate a packet digest and send it to the receiver. - -* **Resubmit:** Resubmit the original packet to the parser with metadata. It can be applied only at the ingress. - -* **Recirculate:** Resubmit the packet after all egress modifications. It can be applied at egress only. - -* **Clone:** Generate a packet digest and send it to the receiver. - - + ingress_to_ingress: Send a copy of the original packet to the parser. Alias: clone_i2i - + egress_to_ingress: Send a copy of the egress packet to the parser. Alias: clone_e2i - + ingress_to_egress: Send a copy of the original packet to the Buffer Mechanism. Alias: clone_i2e - + egress_to_egress: Send a copy of the egress packet to the Buffer Mechanism. Alias: clone_e2e. - - - diff --git a/examples/docs/cli_commands.md b/examples/docs/cli_commands.md deleted file mode 100644 index 581b612..0000000 --- a/examples/docs/cli_commands.md +++ /dev/null @@ -1,85 +0,0 @@ - -# CLI commands -`~/p4/bmv2/targets/simple_switch/sswitch_CLI` - -Through this CLI, methods provided by the `SimpleSwitchAPI` and the `RuntimeAPI` can be accessed. - -## SimpleSwitchAPI -`~/p4/bmv2/targets/simple_switch/sswitch_CLI.py` -- Set depth of one / all egress queue(s): `set_queue_depth []` -- Set rate of one / all egress queue(s): `set_queue_rate []` -- Add mirroring mapping: `mirroring_add ` -- Delete mirroring mapping: `mirroring_delete ` -- Get time elapsed (in microseconds) since the switch started: `get_time_elapsed` -- Get time elapsed (in microseconds) since the switch clock's epoch: `get_time_since_epoch` - - -## RuntimeAPI -`~/p4/bmv2/tools/runtime_CLI.py` - -- Run a shell command: `shell` -- List tables defined in the P4 program: `show_tables` -- List actions defined in the P4 program: `show_actions` -- List one table's actions as per the P4 program: `table_show_actions ` -- Show info about a table: `table_info ` -- Set default action for a match table: `table_set_default ` -- Return the number of entries in a match table (direct or indirect): `table_num_entries
` -- Add entry to a match table: `table_add
=> [priority]` -- Set a timeout in ms for a given entry; the table has to support timeouts: `table_set_timeout ` -- Add entry to a match table: `table_modify
[action parameters]` -- Delete entry from a match table: `table_delete
` -- Add a member to an action profile: `act_prof_create_member [action parameters]` -- Add a member to an indirect match table: `table_indirect_create_member
[action parameters]` -- Delete a member in an action profile: `act_prof_delete_member ` -- Delete a member in an indirect match table: `table_indirect_delete_member
` -- Modify member in an action profile: `act_prof_modify_member [action parameters]` -- Modify member in an indirect match table: `table_indirect_modify_member
[action parameters]` -- Add entry to an indirect match table: `table_indirect_add
=> [priority]` -- Add entry to an indirect match table: `table_indirect_add
=> [priority]` -- Delete entry from an indirect match table: `table_indirect_delete
` -- Set default member for indirect match table: `table_indirect_set_default
` -- Set default group for indirect match table: `table_indirect_set_default
` -- Add a group to an action pofile: `act_prof_create_group ` -- Add a group to an indirect match table: `table_indirect_create_group
` -- Delete a group from an action profile: `act_prof_delete_group ` -- Delete a group: `table_indirect_delete_group
` -- Add member to group in an action profile: `act_prof_add_member_to_group ` -- Add member to group: `table_indirect_add_member_to_group
` -- Remove member from group in action profile: `act_prof_remove_member_from_group ` -- Remove member from group: `table_indirect_remove_member_from_group
` -- Create multicast group: `mc_mgrp_create ` -- Destroy multicast group: `mc_mgrp_destroy ` -- Create multicast node: `mc_node_create [ | ]` -- Update multicast node: `mc_node_update [ | ]` -- Associate node to multicast group: `mc_node_associate ` -- Dissociate node from multicast group: `mc_node_associate ` -- Destroy multicast node: `mc_node_destroy ` -- Set lag membership of port list: `mc_set_lag_membership ` -- Dump entries in multicast engine: `mc_dump` -- Load new json config: `load_new_config_file ` -- Swap the 2 existing configs, need to have called load_new_config_file before: `swap_configs` -- Configure rates for an entire meter array: `meter_array_set_rates : : ...` -- Configure rates for a meter: `meter_set_rates : : ...` -- Retrieve rates for a meter: `meter_get_rates ` -- Read counter value: `counter_read ` -- Reset counter: `counter_reset ` -- Read register value: `register_read ` -- Write register value: `register_write ` -- Reset all the cells in the register array to 0: `register_reset ` -- Display some information about a table entry: `table_dump_entry
` -- Display some information about a member: `act_prof_dump_member ` -- Display some information about a member: `table_dump_member
` -- Display some information about a group: `table_dump_group ` -- Display some information about a group: `table_dump_group
` -- Display entries in an action profile: `act_prof_dump ` -- Display entries in a match-table: `table_dump
` -- Display some information about a table entry: `table_dump_entry_from_key
[priority]` -- Add a port to the switch (behavior depends on device manager used): `port_add [pcap_path]` -- Removes a port from the switch (behavior depends on device manager used): `port_remove ` -- Shows the ports connected to the switch: `show_ports` -- Show some basic info about the switch: `switch_info` -- Reset all state in the switch (table entries, registers, ...), but P4 config is preserved: `reset_state` -- Retrieves the JSON config currently used by the switch and dumps it to user-specified file: `write_config_to_file ` -- Serialize the switch state and dumps it to user-specified file: `serialize_state ` -- Change the parameters for a custom crc16 hash: `set_crc16_parameters ` -- Change the parameters for a custom crc32 hash: `set_crc32_parameters ` \ No newline at end of file diff --git a/examples/docs/includes/core.p4 b/examples/docs/includes/core.p4 deleted file mode 100644 index b52f961..0000000 --- a/examples/docs/includes/core.p4 +++ /dev/null @@ -1,82 +0,0 @@ -/* -Copyright 2013-present Barefoot Networks, Inc. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -/* This is the P4-16 core library, which declares some built-in P4 constructs using P4 */ - -#ifndef _CORE_P4_ -#define _CORE_P4_ - -/// Standard error codes. New error codes can be declared by users. -error { - NoError, /// No error. - PacketTooShort, /// Not enough bits in packet for 'extract'. - NoMatch, /// 'select' expression has no matches. - StackOutOfBounds, /// Reference to invalid element of a header stack. - HeaderTooShort, /// Extracting too many bits into a varbit field. - ParserTimeout /// Parser execution time limit exceeded. -} - -extern packet_in { - /// Read a header from the packet into a fixed-sized header @hdr and advance the cursor. - /// May trigger error PacketTooShort or StackOutOfBounds. - /// @T must be a fixed-size header type - void extract(out T hdr); - /// Read bits from the packet into a variable-sized header @variableSizeHeader - /// and advance the cursor. - /// @T must be a header containing exactly 1 varbit field. - /// May trigger errors PacketTooShort, StackOutOfBounds, or HeaderTooShort. - void extract(out T variableSizeHeader, - in bit<32> variableFieldSizeInBits); - /// Read bits from the packet without advancing the cursor. - /// @returns: the bits read from the packet. - /// T may be an arbitrary fixed-size type. - T lookahead(); - /// Advance the packet cursor by the specified number of bits. - void advance(in bit<32> sizeInBits); - /// @return packet length in bytes. This method may be unavailable on - /// some target architectures. - bit<32> length(); -} - -extern packet_out { - /// Write @hdr into the output packet, advancing cursor. - /// @T can be a header type, a header stack, a header_union, or a struct - /// containing fields with such types. - void emit(in T hdr); -} - -// TODO: remove from this file, convert to built-in -/// Check a predicate @check in the parser; if the predicate is true do nothing, -/// otherwise set the parser error to @toSignal, and transition to the `reject` state. -extern void verify(in bool check, in error toSignal); - -/// Built-in action that does nothing. -@name("NoAction") -action NoAction() {} - -/// Standard match kinds for table key fields. -/// Some architectures may not support all these match kinds. -/// Architectures can declare additional match kinds. -match_kind { - /// Match bits exactly. - exact, - /// Ternary match, using a mask. - ternary, - /// Longest-prefix match. - lpm -} - -#endif /* _CORE_P4_ */ diff --git a/examples/docs/includes/debug.p4 b/examples/docs/includes/debug.p4 deleted file mode 100644 index 5fccdb9..0000000 --- a/examples/docs/includes/debug.p4 +++ /dev/null @@ -1,86 +0,0 @@ -// Credits to Andy Fingerhut -// https://github.com/jafingerhut/p4-guide/blob/master/checksum/debug-utils.p4 - - -// Because open source P4 tools do not support using a value of type -// `error` as a field in a table's search key as of 2018-Sep-21, work -// around that limitation by converting parser_error to an unsigned -// integer. We will use _that_ converted value for debug table -// purposes. - -// It is easy to add more possible `error` type values to this -// conversion if you wish, but there is no way in P4_16 to -// automatically iterate over all additional possible values that a -// user program might have defined for type `error`. - -control convert_error_to_bitvector(out bit<8> error_as_int, - in error e) -{ - apply { - if (e == error.NoError) { - error_as_int = 0; - } else if (e == error.PacketTooShort) { - error_as_int = 1; - } else if (e == error.NoMatch) { - error_as_int = 2; - } else if (e == error.StackOutOfBounds) { - error_as_int = 3; - } else if (e == error.HeaderTooShort) { - error_as_int = 4; - } else if (e == error.ParserTimeout) { - error_as_int = 5; - } else { - // Unknown value - error_as_int = 0xff; - } - } -} - -control debug_std_meta(in standard_metadata_t standard_metadata) -{ - bit<8> parser_error_as_int; - convert_error_to_bitvector() convert_err; - table dbg_table { - key = { - // This is a complete list of fields inside of the struct - // standard_metadata_t as of the 2018-Sep-01 version of - // p4c in the file p4c/p4include/v1model.p4. - - // parser_error is commented out because the p4c back end - // for bmv2 as of that date gives an error if you include - // a field of type 'error' in a table key. - - // drop and recirculate_port are commented out because - // they are not used by BMv2 simple_switch, and we may - // want to delete them from v1model.p4 in the future. - standard_metadata.ingress_port : exact; - standard_metadata.egress_spec : exact; - standard_metadata.egress_port : exact; - standard_metadata.clone_spec : exact; - standard_metadata.instance_type : exact; - //standard_metadata.drop : exact; - //standard_metadata.recirculate_port : exact; - standard_metadata.packet_length : exact; - standard_metadata.enq_timestamp : exact; - standard_metadata.enq_qdepth : exact; - standard_metadata.deq_timedelta : exact; - standard_metadata.deq_qdepth : exact; - standard_metadata.ingress_global_timestamp : exact; - standard_metadata.egress_global_timestamp : exact; - standard_metadata.lf_field_list : exact; - standard_metadata.mcast_grp : exact; - standard_metadata.resubmit_flag : exact; - standard_metadata.egress_rid : exact; - standard_metadata.checksum_error : exact; - standard_metadata.recirculate_flag : exact; - //standard_metadata.parser_error : exact; - parser_error_as_int : exact; - } - actions = { NoAction; } - const default_action = NoAction(); - } - apply { - convert_err.apply(parser_error_as_int, standard_metadata.parser_error); - dbg_table.apply(); - } -} \ No newline at end of file diff --git a/examples/docs/includes/p4d2model.p4 b/examples/docs/includes/p4d2model.p4 deleted file mode 100644 index d306514..0000000 --- a/examples/docs/includes/p4d2model.p4 +++ /dev/null @@ -1,224 +0,0 @@ -/* -*- P4_16 -*- */ - -/* -Copyright 2013-present Barefoot Networks, Inc. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -/* P4-16 declaration of the P4-D2 (P4 Developer's Day) switch model */ - -#include - -/*************************************************************************** - *************** C O M M O N P O R T A B L E T Y P E S ***************** - *************** A N D C O N S T A N T S ***************** - ***************************************************************************/ -typedef bit<9> portid_t; /* Port ID -- ingress or egress port */ -typedef bit<16> mgid_t; /* Multicast Group ID */ -typedef bit<16> cloneid_t; /* Clone ID */ -typedef bit<16> rid_t; /* Replication ID */ -typedef bit<5> qid_t; /* Queue ID */ -typedef bit<48> timestamp_t; -typedef bit<16> queue_depth_t; -typedef bit<16> packet_length_t; -typedef bit<16> queue_id_t; - -/* Additional, architecture-specific match kinds */ -match_kind { - range -} - -/**************************************************************************** - ********** S T A N D A R D I N T R I N S I C M E T A D A T A ************ - ****************************************************************************/ -struct standard_metadata_t { - portid_t ingress_port; /* The packet the port ingressed in */ - portid_t egress_port; /* Used of mcast_group != 0 */ - mgid_t mcast_group; /* Non-zero value specifies multicast group */ - bit<1> resubmit_flag; /* The resubmit() indicator */ - bit<1> drop_flag; /* Packet (but not clone) is dropped */ - cloneid_t clone_id; /* Non-zero value identifies clone_i2e dest */ - qid_t egress_queue; /* Requested Queue to hold the packet in */ -} - -/**************************************************************************** - ** C H E C K S U M V E R I F I E R I N T R I N S I C M E T A D A T A ** - ****************************************************************************/ - -/**************************************************************************** - ********** I N G R E S S I N T R I N S I C M E T A D A T A ************* - ****************************************************************************/ -struct ingress_input_t { - timestamp_t ingress_timestamp; /* Ingress timestamp */ -} - -/**************************************************************************** - ********** E G R E S S I N T R I N S I C M E T A D A T A ************* - ****************************************************************************/ -struct egress_input_t { - rid_t egress_rid; /* Multicast RID (0 for unicast) */ - packet_length_t packet_length; /* Packet length in bytes */ - - timestamp_t enq_timestamp; /* The time the packet was enqueued */ - timestamp_t deq_timedelta; /* The time spent in the queue */ - queue_depth_t enq_qdepth; /* Q depth when packet was enqueued */ - queue_depth_t deq_qdepth; /* Q depth when packet was dequeued */ -} - -/**************************************************************************** - ** C H E C K S U M U P D A T E R I N T R I N S I C M E T A D A T A ** - ****************************************************************************/ - -/*************************************************************************** - ********* D E P A R S E R I N T R I N S I C M E T A D A T A ************ - ***************************************************************************/ - -/*************************************************************************** - ********** S T A T E F U L E X T E R N O B J E C T S ***************** - ***************************************************************************/ - -/************************ Header Checksum Units ****************************/ -extern Checksum16 { - Checksum16(); - bit<16> get(in D data); -} - -/******************************* Counters **********************************/ -enum counter_type_t { - packets, - bytes, - packets_and_bytes -} - -extern counter { - counter(T instance_count, counter_type_t type); - void count(in T index); -} - -/* Must be referecened in the table declaration via counters= attribute */ -extern direct_counter { - direct_counter(counter_type_t type); - void count(); -} - -/******************************** Meters ***********************************/ -enum meter_type_t { - packets, - bytes -} - -typedef bit<2> meter_color_t; -const meter_color_t METER_COLOR_GREEN = 0; -const meter_color_t METER_COLOR_YELLOW = 1; -const meter_color_t METER_COLOR_RED = 2; - -extern meter { - meter(T instance_count, meter_type_t type); - meter_color_t execute_meter(in T index); -} - -/* Must be referecened in the table declaration via meters= attribute */ -extern direct_meter { - direct_meter(meter_type_t type); - meter_color_t execute_meter(); -} - -/****************************** Registers **********************************/ -extern register { - register(I instance_count); - T read(in I index); - void write(in I index, in T value); -} - -/********************** Random Number Generators ***************************/ -extern random { - random(T lo, T hi); - T get(); -} - -/******************** Hash (CRC) Calculation Units *************************/ -enum hash_algorithm_t { - identity, - crc16, - crc32, - random, - custom -} - -extern hash { - hash(hash_algorithm_t algo); - T compute(in D data, in T base, in T max); -} - -/************************* Digest Generation ******************************/ -typedef bit<32> digest_receiver_t; -extern digest { - digest(digest_receiver_t receiver); - void generate(in T data); -} - -/*************************************************************************** - ************** C O N V E N I E N C E F U N C T I O N S ******************** - ***************************************************************************/ - -/* - * Note: These actions assume that the parameters in the user-instantiated - * controls are named the same way as in the architecture definition - */ -#define mark_for_drop() { standard_metadata.drop_bit = 1; } - -#define drop() { mark_for_drop(standard_metadata); exit; } - -#define resubmit() { standard_metadata.resubmit_flag = 1; } - -#define clone_to_egress(clone_id) { standard_metadata.clone_id = clone_id; } - -/*************************************************************************** - ***************** P A C K A G E C O M P O N E N T S ******************** - ***************************************************************************/ - -parser Parser(packet_in b, - out H parsedHdr, - inout M meta, - inout standard_metadata_t standard_meta); - -control VerifyChecksum(in H hdr, - inout M meta); - -@pipeline -control Ingress(inout H hdr, - inout M meta, - in error parser_error, - in ingress_input_t input_meta, - inout standard_metadata_t output_meta); - -@pipeline -control Egress(inout H hdr, - inout M meta, - in egress_input_t input_meta, - inout standard_metadata_t output_meta); - -control ComputeChecksum(inout H hdr, - inout M meta); - -@deparser -control Deparser(packet_out b, in H hdr); - -package P4D2Switch(Parser user_parser, - VerifyChecksum user_checksum_verification, - Ingress user_ingress, - Egress user_egress, - ComputeChecksum user_checksum_compute, - Deparser user_deparser - ); diff --git a/examples/docs/includes/psa.p4 b/examples/docs/includes/psa.p4 deleted file mode 100644 index c668515..0000000 --- a/examples/docs/includes/psa.p4 +++ /dev/null @@ -1,579 +0,0 @@ -/* -Copyright 2013-present Barefoot Networks, Inc. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -#ifndef _PORTABLE_SWITCH_ARCHITECTURE_P4_ -#define _PORTABLE_SWITCH_ARCHITECTURE_P4_ - -/** - * P4-16 declaration of the Portable Switch Architecture - */ - -/** - * These types need to be defined before including the architecture file - * and the macro protecting them should be defined. - */ -#ifndef PSA_CORE_TYPES -typedef bit PortId_t; -typedef bit MulticastGroup_t; -typedef bit PacketLength_t; -typedef bit EgressInstance_t; -typedef bit InstanceType_t; -typedef bit ParserStatus_t; -typedef bit ParserErrorLocation_t; -typedef bit entry_key; /// for DirectMeters -const InstanceType_t INSTANCE_NORMAL = unspecified; -const PortId_t PORT_CPU = unspecified; -#endif - -#include "core.p4" - -/* --------------------------------------------------------------------- * -/** - * PSA supported metadata types - */ -struct psa_parser_input_metadata_t { - PortId_t ingress_port; - InstanceType_t instance_type; -} - -struct psa_ingress_input_metadata_t { - PortId_t ingress_port; - InstanceType_t instance_type; /// Clone or Normal - /// set by the runtime in the parser, these are not under programmer control - ParserStatus_t parser_status; - ParserErrorLocation_t parser_error_location; -} - -struct psa_ingress_output_metadata_t { - PortId_t egress_port; -} - -struct psa_egress_input_metadata_t { - PortId_t egress_port; - InstanceType_t instance_type; /// Clone or Normal - EgressInstance_t instance; /// instance coming from PRE -} - -/* --------------------------------------------------------------------- */ -/** - * Additional supported match_kind types - */ -match_kind { - range, /// Used to represent min..max intervals - selector /// Used for implementing dynamic_action_selection -} - -/* --------------------------------------------------------------------- */ -/** - * Cloning methods - */ -enum CloneMethod_t { - /// Clone method Packet source Insertion point - Ingress2Ingress, /// original ingress, Ingress parser - Ingres2Egress, /// post parse original ingres, Buffering queue - Egress2Ingress, /// post deparse in egress, Ingress parser - Egress2Egress /// inout to deparser in egress, Buffering queue -} - -/* --------------------------------------------------------------------- */ -/* - * PSA Externs - */ - -/** - * The PacketReplicationEngine extern represents the non-programmable - * part of the PSA pipeline. - * - * Even though the PRE can not be programmed using P4, it can be - * configured both directly using control plane APIs and by setting - * intrinsic metadata. In this specification we opt to define the - * operations available in the PRE as method invocations. A target - * backend is responsible for mapping the PRE extern APIs to the - * appropriate mechanisms for performing these operations in the - * hardware. - * - * The PRE is instantiated by the architecture and a P4 program can - * use it directly. It is an error to instantiate the PRE multiple - * times. The PRE is made available to the Ingress and Egress - * programmable blocks using the same mechanism as packet_in. - * - * Note: some of these operations may not be implemented as primitive - * operations on a certain target. However, All of the operations can - * be implemented as a combination of other operations. Applications - * that rely on non-primitive operations may incur significant - * performance penalties, however, they should be functionally - * correct. - * - * Alternatively, we can consider a design in which we split the PRE - * (and the associated functionality) between an ingress PRE extern - * and a egress BQE (Buffering and Queueing Engine) extern. That - * decision will be finalized based on application needs. - * - * Semantics of behavior for multiple calls to PRE APIs - * - * - multiple calls to send_to_port -- the last call in the ingress - * pipeline sets the output port. - * - * - multiple calls to multicast -- the last in the ingress pipeline - * sets the multicast group - * - * - interleaving send_to_port and multicast -- the semantics of multicast - * is defined as below (https://github.com/p4lang/tutorials/issues/22): - * if (multicast_group != 0) - * multicast_to_group(multicast_group); - * else - * send_to_port(multicast_port); - * From this, it follows that if there is a call that sets the - * multicast_group, the packet will be multicast to the group that - * last set the multicast group. Otherwise, the packet will be sent to - * the port set by either send_to_port or multicast invocation. - * - * - any call to drop in the pipeline will cause the packet to drop - * - * - how do we drop clone packets? - * ... - * - * \TODO: finalize the semantics of calling multiple of the PRE APIs - * - */ -extern PacketReplicationEngine { - - // PacketReplicationEngine(); /// No constructor. PRE is instantiated - /// by the architecture. - - /// Unicast operation: sends packet to port - /// - /// Targets may implement this operation by setting the appropriate - /// intrinsic metadata or through some other mechanism of - /// configuring the PRE. - /// - /// @param port The output port. If the port is PORT_CPU the packet - /// will be sent to CPU - void send_to_port (in PortId_t port); - - /// Multicast operation: sends packet to a multicast group or a port - /// - /// Targets may implement this operation by setting the appropriate - /// intrinsic metadata or through some other mechanism of - /// configuring the PRE. - /// - /// @param multicast_group Multicast group id. The control plane - /// must program the multicast groups through a separate - /// mechanism. - /// @param port The output port. - void multicast (in MulticastGroup_t multicast_group, - in PortId_t multicast_port); - - /// Drop operation: do not forward the packet - /// - /// The PSA implements drop as an operation in the PRE. While the - /// drop operation can be invoked anywhere in the ingress pipeline, - /// the semantics supported by the PSA is that the drop will be at - /// the end of the pipeline (ingress or egress). - void drop (); - - /// Clone operation: create a copy of the packet and send it to the - /// specified port. - /// - /// The PSA specifies four types of cloning, with the packet sourced - /// from different points in the pipeline and sent back to ingress - /// or to the buffering queue in the egress (@see CloneMethod_t). - /// - /// @param clone_method The type of cloning. - /// @param port The port to send the cloned packet to. - /// - /// Note: based on discussions with Antonin, we can ignore session now - void clone (in CloneMethod_t clone_method, in PortId_t port); - - /// Clone operation: create a copy of the packet with additional - /// data and send it to the specified port. - /// - /// The PSA specifies four types of cloning, with the packet sourced - /// from different points in the pipeline and sent back to ingress - /// or to the buffering queue in the egress (@see CloneMethod_t). - /// - /// @param clone_method The type of cloning. - /// @param port The port to send the cloned packet to. - /// @param data additional header data attached to the packet - void clone (in CloneMethod_t clone_method, in PortId_t port, in T data); - - - /// Resubmit operation: send a packet to the ingress port with - /// additional data appended - /// - /// This operation is intended for recursive packet processing. - /// - /// @param data A header definition that can be added to the set of - /// packet headers. - /// @param port The input port at which the packet will be resubmitted. - void resubmit(in T data, in PortId_t port); - - /// Recirculate operation: send a post deparse packet to the ingress - /// port with additional data appended - /// - /// This operation is intended for recursive packet processing. - /// - /// @param data A header definition that can be added to the set of - /// packet headers. - /// @param port The input port at which the packet will be resubmitted. - void recirculate(in T data, in PortId_t port); - - /// Truncate operation - /// - /// Truncate the outgoing packet to the specified length - /// - /// @param length packet length - void truncate(in bit<32> length); - - /* - @ControlPlaneAPI - { - // TBD - } - */ -} - -/* --------------------------------------------------------------------- */ -/* - * Hashes - */ - -/// Supported hash algorithms -enum HashAlgorithm { - crc32, - crc32_custom, - crc16, - crc16_custom, - random, - identity -} - -/// Hash function -/// -/// @param Algo The algorithm to use for computation (@see HashAlgorithm). -/// @param O The type of the return value of the hash. -/// -/// Example usage: -/// parser P() { -/// Hash> h(); -/// bit<56> hash_value = h.getHash(16, buffer, 100); -/// ... -/// } -extern Hash { - /// Constructor - Hash(); - - /// compute the hash for data - O getHash(in T base, in D data, in M max); - - /* - @ControlPlaneAPI - { } - */ -} - -/* --------------------------------------------------------------------- */ -/// Checksum computation -/// -/// @param W The width of the checksum -extern Checksum { - Checksum(HashAlgorithm hash); /// constructor - void clear(); /// prepare unit for computation - void update(in T data); /// add data to checksum - void remove(in T data); /// remove data from existing checksum - W get(); /// get the checksum for data added since last clear - - /* - @ControlPlaneAPI - { } - */ -} - -/* --------------------------------------------------------------------- */ -/** - * Counters - * - * Counters are a simple mechanism for keeping statistics about the - * packets that trigger a table in a Match Action unit. - * - * Direct counters fire when the count method is ivoked in an action, and - * have an instance for each entry in the table. - */ - -/// Counter types -enum CounterType_t { - packets, - bytes, - packets_and_bytes -} - -/// Counter: RFC-XXXX -extern Counter { - Counter(S n_counters, W size_in_bits, CounterType_t counter_type); - void count(in S index, in W increment); - - /* - @ControlPlaneAPI - { - W read (in S index); - W sync_read (in S index); - void set (in S index, in W seed); - void reset (in S index); - void start (in S index); - void stop (in S index); - } - */ -} - -/// DirectCounter: RFC-XXXX -extern DirectCounter { - DirectCounter(entry_key key, CounterType_t counter_type); - void count(); - - /* - @ControlPlaneAPI - { - W read (in entry_key key); - W sync_read (in entry_key key); - void set (in W seed); - void reset (in entry_key key); - void start (in entry_key key); - void stop (in entry_key key); - } - */ -} - -/* --------------------------------------------------------------------- */ -/** - * Meters: RFC 2698 - * - * Meters are a more complex mechanism for keeping statistics about - * the packets that trigger a table. The meters specified in the PSA - * are 3-color meters. - */ - -/// Meter types -enum MeterType_t { - packets, - bytes -} -/// Meter colors -enum MeterColor_t { RED, GREEN, YELLOW }; - -/// Meter -extern Meter { - Meter(S n_meters, MeterType_t type); - MeterColor_t execute(in S index, in MeterColor_t color); - - /* - @ControlPlaneAPI - { - reset(in MeterColor_t color); - setParams(in S committedRate, out S committedBurstSize - in S peakRate, in S peakBurstSize); - getParams(out S committedRate, out S committedBurstSize - out S peakRate, out S peakBurstSize); - } - */ -} - -/// DirectMeter -extern DirectMeter { - DirectMeter(MeterType_t type); - MeterColor_t execute(in MeterColor_t color); - - /* - @ControlPlaneAPI - { - reset(in MeterColor_t color); - void setParams(in S committedRate, out S committedBurstSize - in S peakRate, in S peakBurstSize); - void getParams(out S committedRate, out S committedBurstSize - out S peakRate, out S peakBurstSize); - } - */ -} - -/* --------------------------------------------------------------------- */ -/** - * Registers - * - * Registers are stateful memories whose values can be read and - * written in actions. Registers are similar to counters, but can be - * used in a more general way to keep state. - * - * Although registers cannot be used directly in matching, they may be - * used as the RHS of an assignment operation, allowing the current - * value of the register to be copied into metadata and be available - * for matching in subsquent tables. - */ -extern Register { - Register(S size); - T read (in S index); - void write (in S index, in T value); - - /* - @ControlPlaneAPI - { - T read (in S index); - void set (in S index, in T seed); - void reset (in S index); - } - */ -} - -/* --------------------------------------------------------------------- */ -/** - * Random - * - * The random extern provides a reliable, target specific number generator - * in the min .. max range. - */ - -/// The set of distributions supported by the Random extern. -enum RandomDistribution { - PRNG, - Binomial, - Poisson -} - -extern Random { - Random(RandomDistribution dist, T min, T max); - T read(); - - /* - @ControlPlaneAPI - { - void reset(); - void setSeed(in T seed); - } - */ -} - -/* --------------------------------------------------------------------- */ -/** - * Action profiles are used as table implementation attributes - * - * Action profiles implement a mechanism to populate table entries - * with actions and action data. The only data plane operation - * required is to instantiate this extern. When the control plane adds - * entries (members) into the extern, they are essentially populating - * the corresponding table entries. - */ -extern ActionProfile { - /// Construct an action profile of 'size' entries - ActionProfile(bit<32> size); - - /* - @ControlPlaneAPI - { - entry_handle add_member (action_ref, action_data); - void delete_member (entry_handle); - entry_handle modify_member (entry_handle, action_ref, action_data); - } - */ -} - -/** - * Action selectors are used as table implementation attributes - * - * Action selectors implement another mechanism to populate table - * entries with actions and action data. They are similar to action - * profiles, with additional support to define groups of - * entries. Action selectors require a hash algorithm to select - * members in a group. The only data plane operation required is to - * instantiate this extern. When the control plane adds entries - * (members) into the extern, they are essentially populating the - * corresponding table entries. - */ -extern ActionSelector { - /// Construct an action selector of 'size' entries - /// @param algo hash algorithm to select a member in a group - /// @param size number of entries in the action selector - /// @param outputWidth size of the key - ActionSelector(HashAlgorithm algo, bit<32> size, bit<32> outputWidth); - - /* - @ControlPlaneAPI - { - entry_handle add_member (action_ref, action_data); - void delete_member (entry_handle); - entry_handle modify_member (entry_handle, action_ref, action_data); - group_handle create_group (); - void delete_group (group_handle); - void add_to_group (group_handle, entry_handle); - void delete_from_group (group_handle, entry_handle); - } - */ -} - - -/* --------------------------------------------------------------------- */ -/// \TODO: is generating a new packet and sending it to the stream or is -/// it adding a header to the current packet and sending it to the -/// stream (copying or redirecting). -extern Digest { - Digest(PortId_t receiver); /// define a digest stream to receiver - void emit(in T data); /// emit data into the stream - - /* - @ControlPlaneAPI - { - // TBD - // If the type T is a named struct, the name should be used - // to generate the control-plane API. - } - */ -} - -/* --------------------------------------------------------------------- */ -/** - * Programmable blocks - * - * The following declarations provide a template for the programmable - * blocks in the PSA. The P4 programmer is responsible for - * implementing controls that match these interfaces and instantiate - * them in a package definition. - */ - -parser Parser(packet_in buffer, out H parsed_hdr, inout M user_meta, - in psa_parser_input_metadata_t istd); - -control VerifyChecksum(in H hdr, inout M user_meta); - -control Ingress(inout H hdr, inout M user_meta, - PacketReplicationEngine pre, - in psa_ingress_input_metadata_t istd, - out psa_ingress_output_metadata_t ostd); - -control Egress(inout H hdr, inout M user_meta, - PacketReplicationEngine pre, - in psa_egress_input_metadata_t istd); - -control ComputeChecksum(inout H hdr, inout M user_meta); - -@deparser -control Deparser(packet_out buffer, in H hdr); - - -package PSA_Switch(Parser p, - VerifyChecksum vr, - Ingress ig, - Egress eg, - ComputeChecksum ck, - Deparser dep); - -#endif /* _PORTABLE_SWITCH_ARCHITECTURE_P4_ */ diff --git a/examples/docs/includes/v1model.p4 b/examples/docs/includes/v1model.p4 deleted file mode 100644 index bce7e96..0000000 --- a/examples/docs/includes/v1model.p4 +++ /dev/null @@ -1,254 +0,0 @@ -/* -Copyright 2013-present Barefoot Networks, Inc. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -/* P4-16 declaration of the P4 v1.0 switch model */ - -#ifndef _V1_MODEL_P4_ -#define _V1_MODEL_P4_ - -#include "core.p4" - -match_kind { - range, - // Used for implementing dynamic_action_selection - selector -} - -// Are these correct? -@metadata @name("standard_metadata") -struct standard_metadata_t { - bit<9> ingress_port; - bit<9> egress_spec; - bit<9> egress_port; - bit<32> clone_spec; - bit<32> instance_type; - bit<1> drop; - bit<16> recirculate_port; - bit<32> packet_length; - // - // @alias is used to generate the field_alias section of the BMV2 JSON. - // Field alias creates a mapping from the metadata name in P4 program to - // the behavioral model's internal metadata name. Here we use it to - // expose all metadata supported by simple switch to the user through - // standard_metadata_t. - // - // flattening fields that exist in bmv2-ss - // queueing metadata - @alias("queueing_metadata.enq_timestamp") bit<32> enq_timestamp; - @alias("queueing_metadata.enq_qdepth") bit<19> enq_qdepth; - @alias("queueing_metadata.deq_timedelta") bit<32> deq_timedelta; - @alias("queueing_metadata.deq_qdepth") bit<19> deq_qdepth; - // intrinsic metadata - @alias("intrinsic_metadata.ingress_global_timestamp") bit<48> ingress_global_timestamp; - @alias("intrinsic_metadata.egress_global_timestamp") bit<48> egress_global_timestamp; - @alias("intrinsic_metadata.lf_field_list") bit<32> lf_field_list; - @alias("intrinsic_metadata.mcast_grp") bit<16> mcast_grp; - @alias("intrinsic_metadata.resubmit_flag") bit<32> resubmit_flag; - @alias("intrinsic_metadata.recirculate_flag") bit<32> recirculate_flag; - @alias("intrinsic_metadata.egress_rid") bit<16> egress_rid; - /// Indicates that a verify_checksum() method has failed. - bit<1> checksum_error; - - //Priority queueing - @alias("queueing_metadata.qid") bit<5> qid; - @alias("intrinsic_metadata.priority") bit<3> priority; - -} - -enum CounterType { - packets, - bytes, - packets_and_bytes -} - -enum MeterType { - packets, - bytes -} - -extern counter { - counter(bit<32> size, CounterType type); - void count(in bit<32> index); -} - -extern direct_counter { - direct_counter(CounterType type); - void count(); -} - -extern meter { - meter(bit<32> size, MeterType type); - void execute_meter(in bit<32> index, out T result); -} - -extern direct_meter { - direct_meter(MeterType type); - void read(out T result); -} - -extern register { - register(bit<32> size); - void read(out T result, in bit<32> index); - void write(in bit<32> index, in T value); -} - -// used as table implementation attribute -extern action_profile { - action_profile(bit<32> size); -} - -// Get a random number in the range lo..hi -extern void random(out T result, in T lo, in T hi); -// If the type T is a named struct, the name is used -// to generate the control-plane API. -extern void digest(in bit<32> receiver, in T data); - -enum HashAlgorithm { - crc32, - crc32_custom, - crc16, - crc16_custom, - random, - identity, - csum16, - xor16 -} - -extern void mark_to_drop(); -extern void hash(out O result, in HashAlgorithm algo, in T base, in D data, in M max); - -extern action_selector { - action_selector(HashAlgorithm algorithm, bit<32> size, bit<32> outputWidth); -} - -enum CloneType { - I2E, - E2E -} - -@deprecated("Please use verify_checksum/update_checksum instead.") -extern Checksum16 { - Checksum16(); - bit<16> get(in D data); -} - -/** -Verifies the checksum of the supplied data. -If this method detects that a checksum of the data is not correct it -sets the standard_metadata checksum_error bit. -@param T Must be a tuple type where all the fields are bit-fields or varbits. - The total dynamic length of the fields is a multiple of the output size. -@param O Checksum type; must be bit type. -@param condition If 'false' the verification always succeeds. -@param data Data whose checksum is verified. -@param checksum Expected checksum of the data; note that is must be a left-value. -@param algo Algorithm to use for checksum (not all algorithms may be supported). - Must be a compile-time constant. -*/ -extern void verify_checksum(in bool condition, in T data, inout O checksum, HashAlgorithm algo); -/** -Computes the checksum of the supplied data. -@param T Must be a tuple type where all the fields are bit-fields or varbits. - The total dynamic length of the fields is a multiple of the output size. -@param O Output type; must be bit type. -@param condition If 'false' the checksum is not changed -@param data Data whose checksum is computed. -@param checksum Checksum of the data. -@param algo Algorithm to use for checksum (not all algorithms may be supported). - Must be a compile-time constant. -*/ -extern void update_checksum(in bool condition, in T data, inout O checksum, HashAlgorithm algo); - -/** -Verifies the checksum of the supplied data including the payload. -The payload is defined as "all bytes of the packet which were not parsed by the parser". -If this method detects that a checksum of the data is not correct it -sets the standard_metadata checksum_error bit. -@param T Must be a tuple type where all the fields are bit-fields or varbits. - The total dynamic length of the fields is a multiple of the output size. -@param O Checksum type; must be bit type. -@param condition If 'false' the verification always succeeds. -@param data Data whose checksum is verified. -@param checksum Expected checksum of the data; note that is must be a left-value. -@param algo Algorithm to use for checksum (not all algorithms may be supported). - Must be a compile-time constant. -*/ -extern void verify_checksum_with_payload(in bool condition, in T data, inout O checksum, HashAlgorithm algo); -/** -Computes the checksum of the supplied data including the payload. -The payload is defined as "all bytes of the packet which were not parsed by the parser". -@param T Must be a tuple type where all the fields are bit-fields or varbits. - The total dynamic length of the fields is a multiple of the output size. -@param O Output type; must be bit type. -@param condition If 'false' the checksum is not changed -@param data Data whose checksum is computed. -@param checksum Checksum of the data. -@param algo Algorithm to use for checksum (not all algorithms may be supported). - Must be a compile-time constant. -*/ -extern void update_checksum_with_payload(in bool condition, in T data, inout O checksum, HashAlgorithm algo); - -extern void resubmit(in T data); -extern void recirculate(in T data); -extern void clone(in CloneType type, in bit<32> session); -extern void clone3(in CloneType type, in bit<32> session, in T data); - -extern void truncate(in bit<32> length); - -// The name 'standard_metadata' is reserved - -// Architecture. -// M should be a struct of structs -// H should be a struct of headers or stacks - -parser Parser(packet_in b, - out H parsedHdr, - inout M meta, - inout standard_metadata_t standard_metadata); - -/* The only legal statements in the implementation of the -VerifyChecksum control are: block statements, calls to the -verify_checksum and verify_checksum_with_payload methods, -and return statements. */ -control VerifyChecksum(inout H hdr, - inout M meta); -@pipeline -control Ingress(inout H hdr, - inout M meta, - inout standard_metadata_t standard_metadata); -@pipeline -control Egress(inout H hdr, - inout M meta, - inout standard_metadata_t standard_metadata); - -/* The only legal statements in the implementation of the -ComputeChecksum control are: block statements, calls to the -update_checksum and update_checksum_with_payload methods, -and return statements. */ -control ComputeChecksum(inout H hdr, - inout M meta); -@deparser -control Deparser(packet_out b, in H hdr); - -package V1Switch(Parser p, - VerifyChecksum vr, - Ingress ig, - Egress eg, - ComputeChecksum ck, - Deparser dep - ); - -#endif /* _V1_MODEL_P4_ */ \ No newline at end of file diff --git a/examples/docs/migration-guide.pptx b/examples/docs/migration-guide.pptx deleted file mode 100644 index a1ce788cc0f4547acaf0a9f8e1a6f0b004c07421..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 401624 zcmeFZb97}}+dUZDwr$&XDyi7ElZq;;*tTukHY&DNvF*;i_Z$87?eD(b@96&P_tx)> zJ)VQHPe$h1YtHpNb3JQ+kp>1q0RRJl0000W1ki+;NpS)K00<)k06+$S0MZn;wQ(}G zanedF~WlgN{u!&O!PO#&{g?$n8#JNglRE#he9Noe_?B zK9sgpL-GKBC4bb<-C?dADFsW>I#*e?&g3pH)(#!)+L$O6XEgc@=8M@mG-(Te*?Pi# zQ>t~g-Y5Mwi3kd>Fwg=I9zJR43LHvy2kl5#zBh>kwRyT{rxSQv2@h8s&!zOmgw%oF zWDT_5r=$8b*@wY5rg~QdinK~Q{u=(mf)zXp=e$vHYAkEjxX0mloVNJEPPg>YkXd*^kRYR#C>Hk+v~%Z4o0rr4(+&4khkG~zTn)5#IY5RY$6_7joCdL zzH%PF{PU38B4^!*#QYz}=lOpfPmr&>!A*vde>-+TY=B9X&!+mgpru(5XnwX+^E zdLr`q1tHFn@rmuEEzEAXJn(PLBUMoNEn6KXCuSVr+&BpUrng~+S5VP=eX{ZKMflLhJWA*IoRKcUy( zwJDr3=5H}>H)0Mr>A4u(gnzXo4Z8j`bCb+7-w`JhOJr1_8~FO1K6PAcJJ`3;;a0yp zKJW2Rs-6EXEg|P+as&BKl))|n(CYsDdDuT`L-_e@XXixkXk~6>>`4C?d;WaG$nnQS z|0j{cCp#?q7!bfOJEmL^npA6rDGStoDnbRykb3$EbFC89k~ld8Z+2o?A5L9$dU;oJ z^P|z9$1e|L=On;FK#^&nlfm*YRwcP0XfdeWGDZhRVElZ$`T8J>C(XOFOp2xqS*}k< z>PazRQV6O(D3T*Ln2b)-FdipmX2TJ~#X6BT`W^V$j}okm5WW%AejVv;D024@##5}0 z4rLS{F|?!3sfV_*pf;JD3M+r@0baVQR?O#^`H8M-rQ&U&96T5?>+dLesA~;zcqZu-~8(TrzXA9cf6+^|5fo3{L6~( zZ^94N`$xg2eTmz9Mm8@flG++fz!AdN9iz3Xm*%g9@^WudzqRG6+r_Vnzp+c86Tbvn zrB6$ZuqRvn(*^6iY1RVVm)Si`_%dIgC{VagYfcr5A&K~0+eiUr66-mASBH{~H)5Dc z@HoFn)KDiDNRd0+V1@t0_WyOv|1Hh^Pr2~_9^L<@^S>ALzu8*< zDbNuGIlz`asnGTR>}dXXSzjJKVFAnt<9`v*={MbRZv#ad@9IeTLqML?6F`5gt?&e& zhTLhhldi*vFbL0KPU6`ldHtPxd`Bq2GZf2x`A4={?4AAGr5hKIwV>UAnY~;L3r&AD zJ|4a^K8vBXJkQg3t^$!|vc*J|R80y6!B{+HV}vxRp0y#Sve-=kaf$3=N3p|%kNyCP zcv%jPHT+J!(K9?Z=K*X7sUsZ92`uzLUDIu(G}mI_0F&Z8!G1$0mwVy_(A=3(+IO;> zoQB#_lwtSR+3)Hdj$NE{rT5$5|D*#}(HPd81-UTV)uh%ijZd=~yo zK@BaHv=FoGNmrFbXpOMrk6&XU2#s!7(HPrbOFb}nfT7dBmwjp4Jh`kOF>DTPisb}tw~@a9;h9sKe7)9{^X zI?MOFIpMSW&C)@&&kE-rRAc*8xSu;9CkDp%a_H6`znC7!4()Dzn7VeYvn6z0lx2Z$ z4tRTrVXYM2&vrYkJ*hPxjCGZz&=lI!c@hWK7*K@A)EQue*BA^8>xWyagrkPnm<%)r zGTNvyE>MVdk_=R1V-OP$3@0%JRvQ>GfJsl|P^C_m9x^;%x}6r~?V{}0gM1wiJ^Z@s z-63VK;Y(@4$|CoW`9?CCL?7m=J5FUr)7A8D$wrJo%q}RdRW&YxTeY0ENf^04Sel{K2~aJKs)|S8Y}~ z5CSitPq`slwKp0Jw8=u-UL2Y)hXA&AZQHN493b*Q=JM!zJz2Nr zzet$MWnEL7?QS){OQ-KOHGFnMIXYHn(b{zCFso=hQR<8ERFa=oxx!!YBqqihQlGnQ zg%$sPM}EI^<9C-nw8WO%C(8 z;e_8hh_QrpN8lga`bgTkNa}q{+j<+? zdY81@C%*iUw>u(c_yAet+fkO&dWG1FlR4#=&!X_g%L;i0@0vupA&!>+Mp z$9=?&Bz1+b_5zzP3BfDJ4b@j3OEO}C`4G^Jjt0gQjdLR0nDdr<}6}=YJ70xy}0xzgv7X0s6z>3ka!@00PD9(pGYM! zfn`jDhKgA`C@nxvD&lM$fKg=UifQuCmpd@S(=BL6$O(vFAOVccy=Z61se}(gHOIYd zh79Q~#d~z-!!EnLRb0xxk1o;tT(U@&v=L65I`VYPRj6iCoVG z12vffKgPunNSi|TJrP7BOH zMKi^)j9934o*Wa?4pHF)V5z-@)ia1kt-D_twtZc7{6OHo=K)U%9s(l z%AtmKGyF;LK>RzTtCtPYtAPLzi7nUg)=1D`-`31SKM(_fH( z2J~gaC|U-v*+v>of@{xEn2XMpTQRbz_sk11>L^be5MIQ~rIE`$ZO-cVE6#$OZI$m= z$9Vwj%d-ItrLe9np@_)aYM!@HZsi2=->tKE**>=;C!6kZ12+On@Q#8 z`ZnQSWFHgs5+i=)v*6yOcTWiPiy!0}l(Cy}t_*SD!|QlD5nfTG5o1UzL$l#Fte8za zDK(QpDu)x1;_$$RO3{O@a@ZS0(gmFNZ}Do-a6y)7iJMG18AtCUj2I3HCWGAOA|`_D z!y-{NOfB`*XoYJ~LIO29Jtd8a6sRknG`LYZ3LxpPf4q&8c{ysS&+3wyB+X@98WY4J z*Fzhc;NR;zrOsLj{BHSNY__vtMS*++vOZOQ=5tjw(PjBOER#oZ5{}j}{df{uGyUi^ zVAiC!wV`KGKkDCB7O7k8D9B1YoMx#!TsFgus7=)mdT2N|IhPhS?8G+d6n^^+D!-mE zA!>|oWl$)2P0f7)@v1?e$;Wgsvd z#*Pmm~9WUguRXgs4F;YfRveMk|_^OE7lS&pdD}HGB3_KV<;>+uS2L2cdp+tH`j>- zT|FX6-<|1Wtdp2Zw`(g^0X6+vj@;3H4bW0u(J9 zT=MqR6IHPIg6*-V(YFWcmc48{1VZ+uqJz2pg78a42bm~%1q6Z?+r={;?;M`a9wSLL zSa5dl*f=uRZ^G^?pJuATgFG7o#yrdh8Dnl6jUUp}o2^G7*VWSur5&jd+KXBFTvI?|yRoZ?D!t=jw2Sg$5SVI}Dy zj1o(Zv#z^Se248Z!{qBc{Ypk*%B|f(4%Q5RO}8_CgDsDu29B#RiYnK#RMuxVI7o7KyIe|Q0&9~>jki>_H*`jg0jsu|6dcAp2WjBZtG=>w9Z}jz!_2n{D?6G zvu50}A}ha?d3e8a;?M^gsjX`Xo9?U!9Ze_n+tDa|$W@cT#io7(rM_;Ef}Ojl0KQYL zO5mJ)%u#Un3yl*ZfOGIDo>cG&t)asFhi6J2_J=ZZ?chS-NC zf1!XXtgf!6bAy&8vF7gL$}m~KVB<=NM8Bunmb~%YZ&s~Rc5fhnY0DV2XXkjchN{+C z@D4ge<`i zh6Y1fw9<^DfF*5bDpx2XbQ_Y4aX9DfbS(>!F=kGQ>1UcROKoau1qbx;kHU(uZ;(Ry zDXi(3|3X;*%trRq*KKwh&$Lv@7)dpU?pFeP zRTA#a?|beg@0aYezdQq+wrI`U=lCyJrC)>P5mD=%4bO0C z$1i%5niZBZOf(q9JaT2uZI}Pv^?t2Tk1C5;Zc-Y-y&+*aeeanNE)h9Thwk6gM3}_6 za7i)wrnDoymHM>{3#2A%H{8vp!(-f?561+Ob8CcyTn1f+BuC9}&mtaD*#S9fn~X%E zd$3Xm$sC?VTF%Tuj8u-4&}5J-tAGP>XvXWEi!+fz8jv2IF&&sD^Ma3q>1CMAd8dko zpT4M>7k6|mJR3XJnFqkz#LM$0QifG3G-+hVn(4VQkPQ>JGUt8__7yt~s{(4B^$ z3{A8dNNBr|LS4Lv^&lN;_>Lh#j>2ii0Z2^yRHTqnd1k;n@<*aVVR+|My5NgyKUO?M zw&Ms3D_LGEwjD7&b((Zys5FI!1*&kq()m7(iWZ}10)`^>l}U;Q_-l`;JS16$GuJn- zkIU-*Gq4oU3Ixk}s)=wxjAeXFzVUkI;HRS1dnk`Dk^3jo8)hQYV&P1_5GkX{? zbE7CiBv4W*zfkHXa$2!?fG@-5_g@pAE?BD+unZ#)~`uA(n3Vx90CQD$t>YCju0k-MzE zEa&=YT0&rH=Xk$AzkGXJT*pH_e%;h^b1B1~TD{3ZKPH(!I1`pA)#ekORzwYhDXWF9 zU&Hk*#;TattZ23=o92MZ%eJ9j!JaqE!vfczRnD`=0KRfSmyjsnN6sW>K5`v=EMMFm zdF}iXi?Uy04vM<7t~{749g>5j>K$G~f)|^5&q13Pf>hXg#$VW~?VVfbUnM4Z+5C&l zq{MvoghsuYS_0H^TaIMnYzHVeL&zieamz(5$9YjnrzvU`&KMbI3aok!Cc=2(ss9>&p{1+9nyA z{Su7c@v>vU}x<3f9p^*^D zBZz!R2pO*Y!6xUToZQ$5flf6Wb5jN&F33CjKb3l1mQ+)VAOHa3pN7sqm3n_IoQ|uV z*sQXlyz}c_2$%`P0NInM$I^0t3tI~D12V@ZIe!PM7g=4Qh$TIeRsmU>J?*(C;m#*1 zay}!`X)k}*zjAPO{kiSJr?b(nxrZ|Gr@9XDU*r6#t`Xcn4+Oi=xFyWT6=gVyaSswH z4%Sz*yxoacLJJ|pnCAy^O>-N}+A5{UNQRDsp?kA!`;8-6mG+lpNi+Qx(p$exS~he3 zO#T{~B#${Mo<~Di#FO&N|41l=1jVviOO`2z%6f-##h(OfZfTmDtOIm1)-pA<3JF*; zn6hTM1!ZwZapgR!PCBF(WoMrt&=DeRHxaiWxuQ0Ow%M|8NExvSoj4_p{xJ{@7u?s| z@?CpY3=NA^)X-rwRff+xT9(WdJAd5*=pjuqLN&mCv+Zlu8m3Vy(jI+B>8bLLFL@Vr zKgXlt8vUB46bfHjRWgAmwLk(}sZ>kuEZTVlrC$NMcIHN^WZ-2(M6+x{=R#BbQYeG> z0u1E6q7{Oa+SyHm-;9jK39Dkuxq|O96U*}%XiqHQwG2;vM5r>;nnFSwPHh_`xTPb1 zp|6B_PlMomG6PW!8M`?fnbbwGt6%S;B^87;eNDfrW&%nLf-_;6vLm&cHMr`RA7w)+ zfpfx1DC9=H=29f3{O}gX@WXC0;&9{j&FCAxO|U8G;EZ2|rdy{9{JWf3KiL6@%=HMrZ;EH%5^q-jK;QKhS(=fOSkgNjdp$2~!y}R0)SHs7L zVb+8^E^HKcl8znEv^^)p%0{tl54=b!*dj6l-ypOC-!a?6PyOI(UCmO6GC2YB{oVtR z?#Mwv+)OZ0BNLMujU)Cf`CGbnha8_!9AUbuW`!?Vp32gtUxT!9-82kO zmGYDkj%$UA;~58a{>*{@!7vIJ+?If5`}T6cOhH#cu(`=vx;gYs;}vzPG>oSIGt)pU zhlIt-ZhdbJ68TqHDXH~=VC{1s6Wfv?6I)liWqDQm3Mf71ND5QK?kC%?hZzEBE>Ig@8jmo#~LXtbOakQg#kBm3V)(0r+rH@AcfdPK(^DeF6f%QAwLo z)kWSktXi`kcQk9BJnMI%Wj3ZZ#CZ{y-sKU%d|!XeM^9f*0Y~7sB9C2aig}pFhG+45 zsEjoY*$a)jRp`CB{xOK^A(s!p$7svasmgb|6!zuxDZ&IrWWE!=P+8ZqoRd9Xo*ps* zzxt7-PCuYU&-Qeg3{XTFkMUfT08JeZx3OPp2$XKdy1TR~)d@<*=n$C+-vO5Z;!8Ku z)&zteU~Np1(H9=gJ=OG+8M(3%koGUuQu|J1zw|Eo|Iyo~$Pi;k|CGW!q<@yeznUmc z)z<%z!cP2Z7XqhwAV;II&<~Y@;PqyV=mx=E9r#Zn?5Bw3&c|&N{lPndS1vyzELCf` zIFi0#HkHecBpQQ1>Ei0;`gr=pgl^Q+ZATiHZLbIq5mz$WoKDuWI$ga08C;`eqC_zg zt2ZEX`Fgsjn|YLph}p9|b8Ch)UOwN!z;YD6KbKB1LGqqPF1Z=h zBESRZ&3D6Hq-VL~E_^9LjN&AF)P6vIa|z-r)fn9im1c|R;NyKpJ$ZOXBX!SfkTX0z zSa!QF7qoHh{XG`}Cisaua@^_n)$%Zd5TYrDf5O&Nf?X*nPgU zPjSJ&x^ojGwr>hivONWB*=R=VUO@=OMSZ+K1WyM>_etPXM+{w=%n)B)Y~~1cN&<-O zv*iAaD$L9?22zs0O&)!^j9^mm&?U3LV?};ycTTTcen^zf(eP{_xk}VU1Xs?OYqV@xk6V#LU9@p&JyYphG_5eno36M}aqn>SS+jW$v<%ut=N04S=?@{tbwPU4W4-+4~oY znm~8x52OS^Y)`%>2t@;QW;{iomTaT}iQ9K=ZuA`n^rfvc?x6A6a$-vb_=x zP6nY1#K%mvGu?S@02|_Sp=Bb+Ey>Hy&5Ood!6Mxg_8om%uW9SWpFtI~E0^_{Lw;Td z9#id)Tjyw4_Vl2?s&LZrrgi?YL0m*SN6_t(XX=V5^>n!Dc3=Ek^Dbdg2w zY*1V@C**qi##A~w>gn*~7qLow_)EMxE}?n{X#9R$%xKAt&DCJ~j&3FQ6m^nH|4K#M zV2PdQm0%lsz3AQZm$u0WU^Jx6zLRRy^Z8lG#70#Ka?LKatSA??$D$+9rqYuBl?&?i zAMY<&QxLh6{b``9eBPblpRy{ZKUd}ZRafP984x^m%|CiZk$K`-I=)f_qqS;;fQpQP zH%AK7;;h!L&(Q5`x}1_|NjIH>9SWZ2$wb96}QGk;g2SgUfHwEJ@ouIGOy_n2n zl%aUJRF_!as74|Lg@kzMUTNCFLugFcODSumK?}>76UL0wysjZkNRcz#!6W;F)NEPv zG;TP_6&f&EHRZZNSC=b9t?92=cE)RuS44FOrHgofFy4?6AV-?0kd5bxKyec#123#o zy*hA5^{y?&XgeGuQal_au|^Npw2>((Rf++IrZi@{8!2*cp@aq9)PNiE0E#i%KLv6y zFFaLm#5J+G70CuMe0Aebtbhqz_WJQ7^byF?EI^wgv8Gs!re9g!;=voOO~N_beN#NxHzIwas$iQ z5$0zuK>@4+wXA1kJ)*$u^|_OYpV`sBWK4op@VEPul8V;a`rK34v5zXHfRduHmo+Rw z)tw$D)s=|UPXvjSuq>A+D1S6_`#($>!N>4AeT=UiINYo~49)utwqkvuZvcA?y>^DZ ztn56;tKtIDTrggvqMl5l0F+bLBeSY2ZNiIa(YJUJZFp{OyQhQW3mUw(P`yx|{urM` z-}7?2TDvZ4eP}S_EAy(NS++$rP;3ONkb1 zw{S(Z-wm8hh=O@{^R{bb|sMo%$+69dg*FVs=#_P z$t)b1VvJ`%rVHC4MxelUU^oi2eOd|mSk*84oIIL=9-qDub23QS_mVr34AO*(n1~@j z%8_n}BmuO+3EQHiTQROCFG-DSo?2Lyg-ta@2Rd9fOm;KumZ}5g{%+`~0DxrS`WnD5 z1TE~~fd1O%K2g@XPZyJqDz%yyJG5WxZl$|?*L-_&qRTdOI|Yd1d$3Jb?o|=1=k%k8 ztZi3v_lLP+U1@kr+gJ(OSPNOG!58)N(k<0ObeuP8z+HD^1fqIhlA z=#XOtm}McB<6B@AH4J?UY9wj>YGPb(Mx%$PsBnVFA8gH#%0qeqaX}CUgyk6(gfhuj zGX7meeEJsRt(J!^d$5xXsT8lQ>cp?&)%WfJASPF&D3>>4L@7TNEv*C0p90Qo?|n43 z0eOGMN5XH#3i%JE532bb&%O$J&HjL#$tf~TU3cEtLb2=>?mz<-{PmDv!dj}Dw=aPR zI??USfJjg-n(%2#p@6gWrN=hQQ#7y}upBA?7DhX_dv$qx=?tG0*{GOdYL?MiXvhrB z)rIT`=Q^;fx3`|Or@~2OH&<(r(JTP5$x7Q_D;y+gSuQ``nJ`tOxm49~)N%%G5NJOE zK6VZXfZf`bky_;tBO~Jm=beS;^l0fnIYr8OA-@?dAMdl&Ct#bC`x^ICx@<{y<>%^D zV@!pXf%Nbd+!~sn)1>iJ#qg-nly5)RIP$J+6EJ<*tFA>;sk~l@=__T=HcCco+~A zN7doenzko#tW>_Zo1``yHea1Kn(8@bD_1Ms=~uvBdRYID{>~2I+dhAB0H?LVgzJme z9!E0{2X-|K+RlE<;`x1M1Uf-MJqgrJgd}(@o=4c4<>21H04IeyWq4reU9_2b>WXSi z6=sRWa?lDD!+mT6s(kk-Hz1k3UC8iwSs*)iLPrc$rxAwCr|9IGCP-*sY(UoZgb&&5 zZajq0Pd_R)Oa@lu)D{?V@nm#s%fd|WxGy1K4ip~DPIw)dVc^%Tq?;q)EeV>t`wnBe zfg_PA9D=-JsHwmX2$N{ER;IHflrHls?<(@WB97CvNp?eWQ@2QTj#Rd-)$fFfjyEhNRmgflbX!6 zAFtP_ZM6hvjp=tPK`((}ue3;C_dGmN1>Vh`sd7}+vGQfWk*HGwD!%U9*||~i$pYn- zx+uk7u_u!eYjj%Z*hBQjf$M-G2FF25mGr9+axS%$P*VvEg+YNDr7vc?rfQZ_FH})A zlz7~kQhbh;4t%tv#Fydq=KHglDVBl%yaLcq9887xS(#D)E0gNa2Io_?OP5?_ zu9PQ}g-mwaBu;VYzw#>ai9hnH!Txe|4?KA6Kl7@&N zb5KW1Wp)_Ylv$iK;*w$?m#-y`R@(}by)wI11gr=8YgUbYILwGjCwGPmV@L6b&vLOu zMZJkaEc;794$P*bb2D>>`ING-!B=IrpREZK!>p59mUC)fkKGNfic}UY^50IP!eYc| zfWL!EY~hR}`Ok-0qp(-m>K&>jXRb^wHTIeg?`=Shc2a7x&Sjl9k# zwitQU7(1)kBD`0Z%$9<)n2ysFQD|5y@3I~%#?pg9LOyfcN#89nOJ!)6{Ti-B z39gk>Vy*Hx;%3*QGF&#+HKA@A0ny+OZd+TjY}=XR|ICr}&AP{G3@K0}CKmxmlN)s` zjU4{Sks8cTmm%WlQObcqz}`8_)NHZoEo$?+?K+HH2*A5r3}TtT2eXjM!~rcy!}Bsd zFXC6RXDh@+R1c~?oGbJyY~(gP^{#Y1eCI6b;EC=Pg2_f4^8ZOXSuA!n>tXXAxYg%@ z)h#!cHuAvXB@K~p&K;sSc~*?vv|@ka%#uIB!WBuCSR_d;75kI65?F6Uoy{oy1)Mhx zrdbSn{CkfbM|*Se*?k|2Z9UQg8LYOvzy=3>c{)>AbF<1`s0pZj3a|j%wkon=#}1vX zAkSz`=k1yv5pY{uvr>)lZ$%}VcO24w=DNXec$ zx9PUs>oOAlxWQndnKJtfPt3A#9N|e<$EUIXyU_37p)`~(uun$<| zu;HTt4{)jNhkm4ZvD5*LNf13SxF;gVA#@FR1Uu!uZSP}bFG4T2zU;4YMFVKr7=?J8 zbs*(mTOEphyYjI7^fz;oCgvq*W`ydEno1WbI_EEZch>0 zUk1Q#m0Hs*Y~cx_EA@$rn(%eH|Cp%CuSb=mA5m{dIdh+P{&@)S_}Pu|4;@bFc&ij? zpUK=H!M{l6{@gQgs=jHv%7);DU;Xi8N;n2c(rCH%mH1oeN=O)>IyTFZqkwe1Y&a2T ztn(@8)22&43Aug3f}Bzt@GtPN+~M8ztF~S7>-87W(W!I_SD3EMeVhl!olInixXEV#qy{C5}eM60I8ZE zs;pPY0k(n`qp$82Xit=dYhy2Evd>{x$%A_`{dMtnagYlB`oO6tlnJfTWb83ysM7?4 zcV4+Olxk?YHT`@I?JE9DNLk)W*HSuE4^OkNiiD{?T|E8vP&QYuufiMS9oH??kCyA? zqKGc&h6yX=OMz&-@abLkADtD%(0)7ROkTwiMOo4-gR?iW3to&qA7)=Hl?&IJe$7EU zR+i|4fKr!1c{a2oTI>(!DTG$@lsU1!u^LU5KW$gm*LtgVE!`D)`Gu09jN&MGS%ku(@Q5&1>*qM(io}c`lL#d` zH)-wAf-L*z5w%ud@QT!;d`w{iR^HiC5R%fVQ`clk1R+mX)2o|_8Y|o8gh5|@w)OtD zWrNbg3(zinESv;0WJIMVgi_i?H+RP$?Z}Azogo%>vSPPm-E8s36@KN;LC`&fa$a=Txz@3fHwrX#%t6Ba|jujIS-Z97*loyRkUI$8&iT~(%cp;&dR zZ3rowWC{TushU>1IC(c9uO?CUsZ-?g;wK}Mx3Otv2aYu+cedXB);**U<)Hh4!dBkE z7iknqg)O*kWEL*LE6COl^>;V2A0GlU@H3BL2w$w<%aOooyc+mYCY?KtHab9BH4mSq z?hsx}ff_ZJsk zP?p;~rz(mc90tQ4MKZJMXoKl$YI722PB^1m*ZEeqZj4fYEZ>x5c_2BFjawcWS9?~l z>eIQ$afH4?^~;AqdA}-vur%~_UuC6(xv#XHDHru}k9|BHWI8S6$61Ml{s>v)uW=Qe z^c)cE_Czt~_H&|5@GnGS;!tJ#?-DbaYIVXi<*oCyv;Esbm5OcVEB6-3nn-}ccr-w@IEv?r;bW`Zidkb%<$bu?L_PKAjVi(})dCM05 zXDUPXktW+ zapC?;hG#Mz2g6XU${3G{@81JaucDc(2-FbIG&JCt^IJ~O=(}kY%7PNbtzA(I5sQDI z#3a&?9irV|2h)(`F(Ocwlbx5U;`4W{DV2hoG`W^c%lJ{TB#7t>ANbRb4St{*pDV1P z_mTAB?31#5tv^`5d&wx~Gkb`77UbZ8n&hg;gYPSLW3giEwVSf_#$fq*arWkj;A|+m z)^mnGfXc1pzrDWFH#1!OWyeOt&fRw zHS4sP@j()W!@`+;7an`t`}-$PG_W=aba6b~u-niGU{ql@3bC?seO0=2;6yN^RHI@F zsiwy)TE$ErZ^s8&I%wp^Tu?Gc>^7AxQx_bem<4yLJrV7Sh$0K(6 zdECU`65$X5tT@7AY0Ae=v_}ti?UBmZ-8`7Ts_zGwC5R=MyK%~f*2buu5>-r?L8L>reEHhc|uhg{XMl7Txgaj^k$=Uf!snS!EI-g=mgW|r`zDSwXE#=Jg!FS6`XWDcu*|eYtg$s6CYnhj2 zB^wazn^@Ev8v>JMATETkARvE+zV49|J7SD&AA~4y8p{2(eKQ69`YGc(x&6BC z&h)?)7TWrw>9d#GQq+pNr9GN1nVC5k8ML(&chLR01d1CL%;l={pl{sYVve`iq+o%5 z;gM6f1geNxw`j<(PV3y8va*TQNx5&AUFUMJWkSCdnX@SJr2yS5D$T_gQ!@cspVySM zCTK%1(XED++;Epg4h?cy>tDY0T0^QjW_}AWl}tRb2AZif$=bvo#x|K11=21+cRRMj zH@;$F=fP54>C>D27M|fpkzpjAaxVCiiD63Xi2;*&aN|=+z*C)@zKtLCjgF8A?j#yn zz*F2sO&mx9B6^4m5TI8XXbt~Z8epB_BO?+9(!@jyCaJaeW^Y;6SY$5N^L+?GKaBMJ;nVZ<#Q`y&MqP&SFUpq@iQjrL5doPkXB?)9N4i|>(a)H>!#%+1@AA&=|~8MAL9Dsk%M+C zvj~bn6wbLrAtkDT#rQ`~N{UBrlcUWyZ5Hr4Oz3i*(2fRdf25`@_Zj+?d6r#(TpTr9 z6Krx;W(na9I5L`I01jn$9NcHVu<$Nch3!2rKU%eEH0;%tNvlNNsnc+X%v6!-@cJ}!TOvY{kRkty4fIeDe?i3GVPN0nlTorw!ILXv2g zqQcPkIc}hqY2Mn@Y^$|)lwGCVI+omO5&wv`!aTwWz6T>65OEkkZjL4L*G_kzlmHJA z0byY~4Qj>Phle2%$K{iOaYL@SnAZN-3O%cx6%IQbQo2mj;7OaVS?$xp!-ZcR%meaGlDBMG~1_dFDXzSw5^9GL9PiZa1>n)R(hr z%hT({@e7Fg+{G3m0Ah=E#y{SG!eYV5U*DsAWYxPKe?zoL>g0vZ_2-)N-F)VW+6j_s z?;&p_Zc67Du9u`p^d8!_{mbez2QrM>pwL!YA@LGv0>fYj>@>CLl#zCjVZe5HM0ct6 zZx!Zg?D+ZM|%bccY#XsoU)&I_0D{#6)c3_qr=zl>*SCInaS9<2WnEet{6 zij0u9mF#*+i;H0x&Q^r^`3LVon9=_Qx;k)~ew?2^7WcM{TknUrw%yTcg00B)S zOUu(l`5Lz|t{{ya7aqR%6Ojt`ip4xcxCfg1YZJV8A&kjMW0tz#7Cr%MpWsa>vl*%y zCOy+OPmh>CE9w%h&UNE>YYl+rUFV=d^u>f1cC+x}V3X z#=67GXWQduiYIskJ=f|oiJsNCycG8j|MQ-; z;fGToF(kr4q(D6|@K2E_so|N!5EqJJtV>dJ zFCn@4PBNw1L&qWHjv}k$xL|m&_WI`R@DmU&zLN%_=S#@|6{$B#R7%!#Ka3RhY|s$` zTM;ncaak;^jAo+ZyNq|zEiX$#ca-h(qRZQKTe#`lwEEy|fzywf-dv5+ zY7&Sg#}Y*^(C@-;Q9vR}BY6W+18Mw-W93y=Aba7Iii&YknPDF+ewHRotoo|h`%?44 zhpx(+ut`n^tFVh@-1BN`t0hWhnRQeSGO4Wl^|F2`nH#E$t}PNRy(4NffQfnn#LG8? z3gc{}$8l3FUda&4am>Cj&@$dBt6Js}0=VQ9T(47g0zNG)t>8rQxW0NU?9m=>TwhBE z_v0GauJ#wPPpO{xaxP;dm{bWRG=Im?*{F~SNWC!8=2 zOEMPc^(qpwaF9=l6H5X03mUVF%xFatV5(V=Mi8y`#G2}jRH~M4P|>wO1!}SXAYH8Z zo{-uEA|0wPWj8h8pN#LZbb$az7F}O%)AZdr@z{F1<}ABhrOd)Hx_IdIfdT{j;R`|* z^7foBf&XiSJq!-$D3ZHbB3_qriGaa|t5;*xT}0b2hb=%cl4cUMVXcieDNa9wPL5T7 z(b%vZ_rgv9SAgd&ix4FovKN)tf@^GVoP)3Mmj3C-575)z3c1_C5jUKcggCs(VR(LJ z;(M8^dk80Yu%M3)U7U;0ck@MNMk}vpU6})97=nyk8+nO%8Nf`H8&x2v*=swwxV1!E zrd>5(P_TwfkRGz5xy`K17s3;|Jl|YEU9-wrLEg1QidlYW(_J73h6WvHG$y;4Lx+AK znwZ)V=zqir)}Nx+n!AQRNrBNu>V1I_K{v}mkaR`KhP)3GEYEccD1;({8u>rydZ#E$ zw=G&TB7+&WZD!cYux;D6ZQHhO+qP}ns@Uh$ZLO-^eV*6rnthJ{o4xmO)Ln1Td=fxa zJc>g_=xzbmrTRFfsocqc{MJ|IT!hjh`#5E}lIYg2MYi2Ke%P+IYHOCLCf8+O*0jF> z$*Sn0R@ee3=I!t*ORWH|P^|8310qH|$c@)Bjjz2`yye_P3#J(Q64bh6CCW?xK9JJU ztcaZ7f;|*JLU<(`_$t+ErN6^MCPZo=!j_b8!-3d$S!A3=c)6OCnqAp2H++X4J1lj$ zDuV;m>BtE%{_I4Li7n2Yyzs0==VmnP|i1h;`?McPF|XB8Qi<#G*>e6a`tUd z1m32l3Ctj}m*qW5XzEB|D_Gf1wR7Pnp?$J~=lfNI24G#n0In?>NJEH$2Cf2@&zsgf zzs}S0n11cgTeNTO-(Mc@Z_Z)y+g)Ek6I(bX&1|%uxaET@V8*Br0IxHQ4-j~zY|dSd z$q$Tnmy>6Pi>|}eX=BWpzvN@nlzV(g5}nGZS&+76&&v|Zty;Ah8vjh!UJ79~KvFjt zu9q@hh{;{tSxl>2D(Y*DEQbXBg;hgQwlbIjl-ddbUYZl$J4+7oOX*%OGuS~4t}qPk z9*QA^v=L=bn2-%V-BU#+ZD6tPSw!v&b2paXx2$Z*LAK^azoR1(tvUH)bVGSF%ts-a z(is_AcmCWbTUA!tT5x$V1}+vj3Le2`rK-Jl8Kiu=upVr=eu>jo9J#hDx?GOqR33Hi zwDuSuW$#qDK5yB4YHyJA#dX=E%wp}(NeRz}?0^^TfkAS4Pb|cPKSjoj{ourA+Rrj` zr8v$s{FJc*4P}11NLvnBFRI@m{em0QnU2O#(nz$2Z6CgClCoe^jVs&Mll#^mktbjS zx-ZibGAH$>Q=y~YJp{(uC+7}^fM9p%3ZI5oMGy#jLSRJ!yDd+F$PG^xTWP9I5Z(`96CwB?x7U9h5Ep9N_G_$g-rcG1Fc>@zRj>mo-uN7UL###G#IDeld2+gplM^1K4Kxsrk{i z$3okCzb-KKB@PR_A~qZGC$3TI@YhQLjAgHH&pgGZ^44BQpmyHA+^5yvzF172&>F*S z>6^*A?&9>79@zZD*94tQ>|7f;QE!zaTL3swx`Lfq`t+NW*@TS#_$JgA)Y*O&nNtOf zCKwuN#!gVj18Q(_z<_dOqR|x$^{Z~^t!bpP5yEse@KmV-A_P@lBWS(ZA?E~8>_7NA zn7Kvhcoj3=KQT5P3CjV32{jz*VBrdz-$;Zhaet586TeypKFbq@$W6U3#q_}};G&lp z&uQ{sKSKQOi-)YZIm{R6peSH)uv(;bZXeF9PUFy)wgHky)TG6Vuhsc2TXILQys(W& zqQea3GjBon0`Ki`0Fp17O@H)NGMh7u^b=(I{r35_sv32-MGH2I=-QV&3kRn)m;$(B z)Tsg5$>2r2FCHh6ajQd;WcfTV1q&q`w%E#mbNKsYk{SDalr&@|mG0yIypqQzs{wVJ z52US=>Tkw6F~(Lnb%6C1oTYRwH~>PxG44_BY|%?1MV|);gbT z>&8~T6h!@SJg?`Zo-)-GbcNB)PLE#{dQG>28g)O1cqb^TBxDiV#FP>)B zc6;)XHoCoYORx#{3W;9!c`t8OY~uGgMyuhT{JZR)JT>F3t?9xz!Yz=r))Ff~Dtg`v z?>&Pg=70eORhfQOYGdd0=?e2mz5^~R&YCI$k<`xpmX-= z6i;&F!nIjoP4`t8dKtAL#Yo(kIQ4kp%%a@57<_}*T**>eRoiNb&}^tQG0Ni%Sy}c1 z=Hmz|yLn{EYzd7b2Vlh95fD6iU8Gcwh($)w?SqE#xdQiqF-w!*{-AqBfWH+|kcId+ zQ*Ris2>KEtRdYrXGuxT9c4335TA`7B>G1+3OF9VT+QVrMy8hIl(fTa3p%9SY16o27 zUIqj=-)R6k#5{VdWsFrm59u1-MYB)J>s2DUcY_fhmxHqNDCN`6ADxSeKoW?aZKrn9 zNU`cwYR7!FZUuL5I}P?rma{^yPPOvKw#j*|$BT9@K)6MR+q|Sz{44rlsgmW|dy7T>~*B z3DejZbM0nnnn2prjHo!p7E()fbdGX+xEJexeY8MuxhxC$`657|`X8G5pQ@W5O_j!E zgY)J&?ee$ArHB!W`%DMMpa3smFI~>#dk>qaidT88@@zuPL7wwWd)IjuwYu1ZCIU{g zkmD;q(p_#hk2W4+*w1FTKYLUhn@JH7bX~IDQ0wO<3U}qJ=N*1^Sz0$`6EV#oPPvV6 z$S}{#Sbp#ReiFN&NWw$QEY;kw4N?o=bkiKvwTr#&*e<4H+q)$rPMr!B>8k;qT8x2EltT=cL5w5A(-)SmZGep%ET*D! zCY~a~FG`Hu7O|y}D){`c@*seh{HqN!W&>endo~!Hm+m<+)FhjY&P|r?@?1tEZx6OQ zqc{wBsGV-U*+Hm`G59+E@?^>B!BcF_$(c3Zt|cYY%}^RkVSLraszpA9z8Hb$OrSVg zjbQEip_&`v&nfhw(IFbGVPucWUr-GaGZ&;VOY?1l**r0^D1g?a7O5ey9L-0Qu@t%v zzDY}u9Z^$t9jJRS9hMP~(*AZ9L%MAA0Crr7J80q6r5&f0hnJ~`W|paqq(h&LL{J8? z0D(1=yn^EM z;U4VdjT2$$FWLS?OK)vUn>jXdYIWzw@G`I?7_a3c-*W2ZY58Te>t|^*>Mj%pa7F0D zBtw9DYCX&={f&NC1emT(1sPPmzYs04-Ct?;#p9snJJ)C;CB;ZH zZ6nZBNN?WPDPoxi9RT4p=Cq^cJ5rh5-qd3hj>nd=zIs+qD83%l?wBLnChs^3KF#Qb zWir*VCETSnAFw0qpPt=nMflt6UnCxoubwFDdz%Nc;RDYQH@DjWitRGLbM;@uMwEZHArC;JeL2H- zmO<~R3^X7PKq`Cu?Slnfz4AA2{7qw)A3B66EspSL?ACL)r`XhXW^U_$HT5y_3JMr4 z*2p@G==oP{oD2twE;9S+J%B7GGCupAaC7_(_>I98p zbgyt#n`qIgNkRT#ma?L*^dJ7}cu_CCB{?RaUCH<}l^qn$_GHYu(gjAt{BkX0NX91J#BEP?0dCTQOW^l3(fYx<3-TZBAP)TxaWVb$Uc1wSEIpAnxPO8OX)dM9V7XZw_qHJp@6h1g53MDqTZ%W z)}XH_NF20wolhO;X|R|vb~q_0YzSB(t;S_=fUxjUd+J;)YG>SC@ zUK(pRTrwaJr zBq(ZsEIfMH|KslZPfOkZFT^`&BIF0!CryscPSG$?wUAi~VILWx-=j7hWx=moF80p& zuJcahenE8kR~N;^$i&&6H)DXC=O@FP?Z54vB8)XzGA9w1q|8m>8UjJUPclS(E#9qe z;Ua=b#WzuyLv795_`G{@oV_(HImr*4A856g#6m}6_0~m#h@tCAq))N4E>Z@L>7t;| zqws=KAhZE1R@jECOVZ)cv1ZhP6^WLM8Ye+WAweJ@8wIUWMM|}l+Tem|TAPP4&@wAd zlId$)FwF11Y^yD6rmpuSJJ|W6);gVSvkHj^oo^)7|AMd<+_UKMrAMrc>Ev(ucaSo&0Hq_H!4#)704^-#wddleF~c#ss>Ke zUgAXHE`|b$6V~w)YzFr}7A);3I+NvZcWl6+kW4vPqanr8I4SRGORP+VT4^F>;t;}Y zkJ6~>ieW}O7!!_D3m?OTx>oagXU7EIds%uvWvxjfP!qAvY?gE+7M;HkfO51B%t$71 zBZA79APor%V+KNdjBhV-iyU?|ebyW}QXY6YYbTZ(;hK5q*xRScFzn|53*)hz$?2SA8;(WuvBpGpka zf%C~V&-WPY%O(G{bH=hGl%p>RSjW+cmEf3-Fdg&2WhIWKa1M4#*ZWgj@TN6vcxwBd zx+@iX9U2#IQlB^^7>L1frw>L9T?Yr(P60Jo!FBSSVt3-4qMhWahF^=k*mF#?rPzfT zsSQZ)(ZE%ATtQ(4KzAtu$DcF@3*1$v_n`E7FF?%>^z`|~oQA_a@x#wwb5pM>6yT|| zS}2#TFZI~a4%dZF<2m(Spes@CCP!vG&{SYDp1yn*H@+QFHy*@MM_Hc-;*=Cc!8-TR z+LGqXnLx%)?}JQvBE%!Q$KHiq$>-nl+sG)n8@8n#0>`P)ZWB~6sTKs=!6)H01c*jt zbn=3-BEN$p?nPH$+RB%kuVF&&%}X-8EdWE*{!n_hH+*8Z);OIwwmJ}xu45a>_WvSy zrm6bt(fX~zRczzfd_e|jmQ86nhmuCIba%CO8Sge@+7Nze*Qj2hm4Ssi-TtUnt6r{9 zp6RsTA>Z23EUbTM7EgBOw_3e=ire8~w}(QPSCB+#FJO>>v-w)vQAm+Ak-3#9ehQz% zfkoz@x6|UbF+!nRL*33{ZfTp5H3nbh)qi`O>JO5@OTKJdtw%Csiv76)(xU_KVM873 zhO=MbaUFhvMw8J;&=^mv_lvJN7-y{JY5gcjwfFs;o5u3!GQ=!ne+)JSDOdD$1{i5ptU!o1!x+ z$knSs2WW+hKTl4HPG$}2%PN(s$5sfInJAw?8A;SfDSM`lLNBOgYINk^A2N+^Pf zEn;NC8+zXIaezpR#h2ckFNrN$NF3PfRN{9m{XC8i7mrkd@c3~lLYe&T+vA^|=ne~{ z2~giGHiUOhLd{c$O70*q+4e$On<777wo6FD~;Jedls({pUkvQvS9UqhcYjP-IU z6f2c6=q1S`RX0-HVmRWDHuCcMaZ7z_bUKD>7(Xj87$`#ssFIeMBzr#ua?paPI<3Z^ zjzQB06;}^nTV2dlu|Cp_eY&Dy+}K@kCWMV0>-xwQRW4(sPCT&<>Pbd&VeitB*-I*q zkcpwW#5T9(54**6Oxz+82cQ3u7JdjXVrA;K!p|Y-9Kg`#qM*Q4bOjY}>zm7pR&Uf& zYorMT$ret=LS&EUEW}vsnjSi$NwG+g{)J}hy8Hsqe{J*Xc3H3))k!m4sg|#5ZsF#g zzZ#`3%kg|xuoZItxD;glk2#TDC*vKJ3;VhC$DG*St3%7mL*v@MJQ1JNzvjfDj8G$$ zFI6HA#k6?#wLgWX&G5YiYCoCOJ#2Xzj4jU-W^^IQ3W zf10OnPc4Pzx_iBR$ZK@7jS;rIHMli3#`<} zC-URr8}NlSCBFY7KuyCip73UlH_6QR@$4Bl8ZT=20nPq&(8l3CV&6LIlRDkJ&f2~b z*U|n_{Sh(0zdFDZv2B?-;p!uP8$pwVs2d#B4 z8((HS-zHz^v_4S~Tk;~Cv{c>9En3O>GvA|ax;-4>n`ruN7$*RXaD+7TCFrgvw@ahS z?K4F;Tlx~B>owBEdfs|jbjCB$x$DNMx5s<+9Sr{pc z#F2^?ZScg7Ts6_7YP7wQmg1Y!0V9S|mNn4?QarAPyVKq_e+^svzb#)ri^YM*U_*X_ z`Pb!0i1T|B&db0pI_MrZ#Ij^nHr$v(c^zgV$2CK(;3j>*1Cl%V3n~@8@4%We(D8yr z4hhDa^_1k6zVqUC0mpforD#*OFh1Wuz~TRHh|{3-`zriVI+y?9$fp0#IJcpqZjHh5 znhPR5{t?AwrjbdxrE$kASG-&b)N6$B)W=VPC!lolWJN^H9YSgOln^n z3fKSYwW{K1IggBt#ok_iO-WF}g%D+(hzy{p^_6x!M}^o1T#S3Y#1r{MkiS}dUnF@S zG!d}3Be@e5Z7B^Q>#G5rdQ1`9l!;H5i4QZu+jpX=b@&x`s9aG~nZz#`a(R0yOk90X zXg8l-oD4Dh>*fw_nD}RmdlcxL@VqNMe~E6|X4c$DjZ`pIkAa?S!|~y1{_esiWbnT; zqxD9c9M)EfQ)RC=ET{E`kCaQs*x8H@)!Mc$8BWO``&m-v2L zYihfe8RY3pl?W0j0=Vo0YoCpG0zWo}@FiJE7u zfFg^EqYbMgX808Zl0WD}f5g3TDVa^qI9PEG4eEb?589la#5P0G#JoUTAw;Z%DwUal z3Xp%<<{3W?7htxjK;NYU+xQzP`k~t&*%uzWLz6%reMCyb+RD58SAyam^f0g~c+$p< z1|c0E2zW%v7EDVTnj6=K4e_MxAFPJ9$w-! zlXI*kdG1L*{W#R_rfx_?rJ2oIX#$scQFFt+Uo0*gk?l~~ilxkEap}wHLrqJ933d~e zc!I663Fc|u1fV~WRW2LnZgg)<04M%$s)in+uF4h(XPqv9>6_%5WTdp~eb<&FN zp9{i#J!{P=|0|@R3dwJd-Y}OR+=^N;8=6#%2qa*(wisoJlf}Gg-tKUzTB&KC$2dkO zykOMOG(_CoPZY z*GuY{5_cqKLPsAQv$_m|tsTbkVc=bJ%8hC+a@<&B?5J8i zknrrg8(#nf4o1&=vl96g=Q#9L1Kg8CEYX5fO`P0fmxym2#xV%2m*%(+f4HD>kH4k^ zQZ!om)Dthj8>E<-|3MK@`s$ECwTEoFULIYa1JwWhuho}^7hP4bKQ&ZR6#rv{`>!!v z?Y~aKEuT*?K3Ku zPJspioUHNT>k}D|M>iZ{6CqWcB2nqy;4(jxy+W^)2=}q$d);AKnJLk|crr;7>DIi~ zySJBSZEZtg*8@Vd%md+qVhPsisJ6|G^qG`{U{fJP7nA}j5-hJe+hyYegn}ViWqHMN z%y?Sav0IDuTT{3I9M5>S`4o~4xIPmBR+B90KC0>h!*!8yv`O9wtj@eSI+deH0&R`^ ziws!`wb2XeaiLZ8_-LMqDKrSrn`A!(1b_7etJj&Rv5)I8cZaE1<&6gv=g!gLq^_-lhC=7&w48Rv(wZ`vt2Q<@!ztGh!Y~_4#X{?> zPU+5W`-B3WXxeVt>MPk5s;X7s+j1xYTl}&MWzK}iK>Ero8wW7Hxg(g0w3UVd23^u6 z1r-9?og>Hm?njMOK-l)8c=odwS!)S?*cnn$_J^|nh)45kpxfopfKgYtZ z6JYSfqLolQ+_%7X0|gpV)PgeuJcJP*YLuli4DswrZK94W!-Ca&^dg8bC4$EAw||n)QVO6AP~i} zC$RlwaXc$8dT?}%gtF4;Fu}#eiQ7qSmLat!#5Hr$MV!!lT2PvtZ8)AW{(5~|<1)da zurMf+Yk%#4R>pF{N6zACzg?5)zxI-~oe<~zR{Fr% zuJndy`@G$!+&&s}Upglx(c|e%X7Pg@P&7P$^I^O;KkeV%UmMDfZ-D1wL$B;4WxQ+a zjfG0HvK8oyguJ5qHm$dx?2xyXV397bj+3@ebum?Laib=FUs1ZEr^h9G6_1vWP_`4% z%sWwuNQD zXtzxdeGtcqzX6t>v>$dkVR#^v{(3Y>(c;c2@2Z^W>9x$&K&oSW+a68(wYo$o)V5` zBiz#D+i*3k9`)Q~dT>Th!X*H@qI164;Q4z1pxI&Kw$lZHP``B;ko@7rE<7X#?-x*F zMrz@R_#E_8>PS7j5MD{UNv9}oZV_mjc8Wpqr@2o7c`R~BN@d9IE2)SMAu_A4WVo<; z^ukjM1x_(JuMKWpH_+|849;N`97*o?fEaItus>rNLCQ}nAG(!%T7$6Cf_55((|2Eb ztAzktTMHjff-hC13~1a*623Oav=F$3DP)4i`=k7^B?E?aDZko@& ze9*yA9hMv0QTH;eosmQjepIN@&ce-(zoE?8-vm=`R~J(Ju(A& zXiaN8&{WV=px9RXG-WwtkeseK3$RD!v$rY6L>cMtWP_?P&eKBYe`wti#z{dgKFpK< zP4)qrV}&GK+tvN3(eOW)4m2Mv3K{3Bn?x|HDPvc09Mf17qDN`6$bFEGay7uRC!8}Y zQ;lu_d2Jw=wD5rH5Y&pV>{esQ(Da#hgj$ZN)`7fPO)JN61LPiWcsv5@&t7r2c$F-F ztrW9a^P94IRkJi{qLiU_-jR&G!MNs6s?^*3%I;F?7B?y-ov!`M6zT^yX{YvCYfSxY z5-!bMxk2dTpnOmdOrWmJRL@zYvj#vQepdUC7QmDWOdP_<|L{4=7M*Tyb z*hGK<4-KYyY^;lr(p_LhC2L_E9&jX_y6VWkU$ezbu^O6+m}aq+3mlcT-6EG9sP293 zx;=^6<}H((IS6|{(%e}pC}|ZvtxXr|ZEEx{&nL+gpx*w7zJlC&`&kL$Mu$@eEeu!E zk!cTX?grU3xl{c^Tpbnkp{!s<(lIvi!>;2RfX(S(EmNtQW8xUZLoz8`XUL~$T{Ocf zZc4a3b4+s`Eqd}t%gL`UaNXWWLrQY!;1dziV~}o$s_eQff~Pw_+TX1`@RMx1KC=N+ zWd4GQZwdnFN~Ry=lCGu22}D?0At;r0?7Q|dFaM5unWq6t*M3YP8_55Dh0^`!+u%aw zKP~Z|+Bx5UPf7uoln&I9@}=P0ZEOFofkwV-%pe)Ui^l?saya<|yfb~)c!>rl91um# zvxm0dqNE4M>>0Wo*%+~ADOVq}2{ZgRvHAG@UzP zs8^9WI8~0tXp+GhW|r7#(w%ZF>xk7|bkM{Hau`5W;tpt9U9@W2obe>Q|2MB$FGFFL zJq46NYuULpa^TcMjv{V$0k0HBGXqkOP9Ud3?Mi)k*Eg%rC8~Aw;v3h0m=sLtmP+?d zI+jZ3PDxfGGF3B#dyTA|QNbCGY^dv4{Jd>Z-?j=!3*Zzz#Y(~$&zXzCl;t#i1j&kZ zWC}n!S&h1FziK|gZ8fyxy_J>UGJD0i*36ZIJt#X&ZIiUgY0qd`b6KRz4?DrFTvXi@Y(oZF=^l3D6t0Kiy!ji6(NTsH6XLDR8vSkZfuQH^z|IG-N$d!Kp0gEpNgp>#wX8t_;l)gk9#+TtcH^+*5H*O z#@L)D_A+qb>$+dXy+yU@S82&YyV#8U=lSf$?&^~xs|Ii}0rM>!>-~51T2)sns26(d zg){Ti-SnSl{qAGwNNRVJ zGF6(Ei)UDlNZyU=$NZ(5B{zE)84et$wMO0cRWsWi_VIyW#EZGFV=V=Zx7vrhi_+POW04@OfNf9gawg zSMXwRYB2~*y#nkk)6WK^i`PLGW3TOM4;wrR&!3p!uWLms}XGTi6H9F&o4hP=wGXF=>9WM zFDO}BuhGJNasN|=Q!Ggl&`dujR?audSZXet%hSUOTEW(2hzXJYwC(JaG1quHpvG>g ztvAe_eeHTRdKe|Wj4n+19}QS6Zv_9*fU$uN)J=&vF;c$&7l#UBn&r*MH(N(3F5e*a zn(DT-pi);TZn82P@G@AG$;kq`Gn6t|>?%(0E9|S^q}{g2mN)K0F~A4jyCvV-G3y6p ziPue()U+Z>vNgfAs?r)lSev0*i^&67eVl6Zu>%?yOvtlfFwG{krK)(&nNch} zhEl6SiC66J`Mqov!YJZw=(9%tnhN+)fKM1j_-a|yI1eTfk)HjXO7JN;p&{!(w*tKI$?IGSOpTm=QIA$YOWCLAXE zRBW5DL2RZcV9G(3D5!JtTbvRRVU_)JQtZPAa$HMzH4U3*M*m5_USA}Xhd?1L#I~3p z+{vUhRQw9sH{^lRD|uddi&)_H99Pe%`wz;@hG`L^oN$+oBkI@ny~|1sPT^Rk!`F$V zub|<4mnZ;Oll*KwBwmQs6LPr8qPgKeXAD6L(%ckG@Ew8U>GdbWhnj8Q{vIEYOZSh> z@?mT+E*KnEP~f%ZH1pYyZ`P#{lzaG5TtO~Q`bZ}@S==z+N zhoEi=5|!I)C}?$ogdYT0|57A#n%n zMRLb$2b^mK1Q-h~i_UnLfb})w1nXw2@&PM2xZX;2l+uam+&I}30)#cm!K_k05#MY{ z1HG%nXwBj7W{(tSTYY+&P)lFTG)6AkuLW*T4j~fIz*8L;28>CyACy+&>K0zKR(fg*>mklB5dnQLn9KzCG<*)B*{{3Q_v|B zDn@e%vkO*p!AsD4pz}rMMG-BirnoRczdE4S!HGL;wjN~!5^XDDr6khfC#og&pSs|% z;0^OxI|P0oDMZbc)PmAaNl2M{^KO1U#tqV0j>JZ>#3I=tDw)=YvcA0ca|r|p7pv^n z3o90r71Wzr{pESS+4rhC^0I=o+M)bg3>8d-GO<=#m$CdP{qjMJ=~6R)AoK#i%<6@sb`()Q9oy=L!~$N zt=hhSqaZ+oUuqgEESS89$u$zh?^-0iB3LMlxl_AxY09Zk(;8XrP)();`^tj~3wT{U zP^Vn2yixtp->LC_eaT|1QK%&3z4ALPxlreZmz*p&7eNh5f(}VkN&c>|g+L7AY)tG> zPAT24JBMTOOsY_;`bhOx&S52xdA)=ZHAL!L(BbGxD)q^>#Lb6cpZR#Yg}hRLN*Nznrq@lQ>RvGYRvwAYo3L?d+i#j ze(WBM^Nb7+40$L7TqexXbAEQI3Hy_pL*<;uP+FACG=JN`_5R8PC#|C|H}TCo^Ui}( z^##msr#kpetcVzNHMm&-cu4-)LgSi4CF$^LZlMh@E>Y$qqLxV_qSj8>?90~(5No6J zP*XH@PEGGi9*LxK{~gwS_g!l3Ur0#BT<1uc-r1c?lb*Rb!%;~h(w(|cA2y^}Y%ep5 zZcpmdP^F^yq~=+*LMmRs$DQR>;Jip^_f(h#-#iC?$f>YO(*>2-NLQ$0wW_>2CQaW< zFGXtGD|IY&xDl%%%A%)$cVLU?P2B5fth+f<2@K5J@C`W$+WPyf6Ww5cp9~+JdGN25^9nQF%R8^NeExmHFq^$FHo3BYbFgFmTu&r>ry%MBAx*a&32CP_F znTk~1rzm7XF_V$_;BH(iwJbrEY_O0$hCv0MOcCkb{q^Mv^lA-+u?@o69WOA%Rgd~| zWqVa!tfee|-o8Z9I3Mm0O z{5)EphqUsoK8`nBa}ygq2zH`Ct#!8UInBOLIN2*6IU$PIlaeR3y^1c>ZM+weG93d$ z8SW)XTZ7p+YSXU^y4aAPx`}KG4WZSIqa~dBsaqhxSpD z5?UwspS){vg)P8@&8Kfi8gdvoTkAJi{(^FQBS zT=yMZ9xCWOoK~!0-!kWWcUMufi_II`C;p1ebyUj5uDDQtD%%((D7LN}myz9vlqzNS znhf$&)Gkup$L{7YOwYS+oeE&|Hk3gPy`_t!;v4jRh(5jx%77g64T9#1+Otv9P@n%P z0in4OEE$b!DY~sGSGhefi*9Lw6WD zRjCAFZ*WrkrOMw{8ov;2n9AvS+xdDt#Q?B?-%`O#X+=w4ThTloVxZ)Z0Lu3ce}k4Z zN)2?@OL>avM4JWq*t#GCBSQOxT}{E_H1ZcxR;h z0z}3__zq4v#pd|bm z8Um8iwGGzYqrNiUk0clA^Qd{LI*jTdkEt}9U{(a7uzOc}TXG30Lws1wbYngq8xz}q zzS@pjw9Dvh%a>J-^>8s2%cn3zBIVC?HJ0_HlaTgxi}^w}2&ZSKI&%=#t2U2fEwJ;- ziiM9I8`4M~!$@3FHL@f1s!^uurkC!w=z>8K_lfY5wWPfSWYnV_zSF@e3UiG@OV9{8G`t}R$NW&msAHFW=Ic#?V5FikY@B9&-fW5# zJi|)~0A&kcGEzXQxH%C7Ty3O?T3wVBnk++gEqJBdL$Z(aOOyp>!O6oHeC>ri*ior+ z5ZbE4OCOvitO5d2%+xj|y+~@rU zagq0$#u53$Lcm%O+sqYcq;6@)n_1Mgr^-@yk3IQJKm`-gUQH~~Y5JGtG0TX9A#`XH z%zgOFhccU1USQ*8lC-`Mb<2&bG4^*wul__OzR`PEf-Rt!_Eaz@ zd$Sx@(Uk*EnO$^f?;BO^TdlR_y_G~yH7?PqmxESpi-VHaPM1=vp1V~CIaCr_$RknB zcE90#0s`ew?v+C;&U1V#NT$yxPPa0htIV{{E?-8 zyp#s^BC)MA_o~TiZ*^r+RIt*ACIy1heF_Q<^H@c9=rV&Vx=#{;8&H};d!eKx*a2-a zdYus(4ArI zueEUp40#Y8)k3=$n};HjMnORL!Kx`2%2Wn^!q|QjLK7gvCPgUf&WTv*-pYRI0Q|x7 zuhPdhbh*3zGYKvJ4<{Aff1?hn|7D0YH9rh7*Tk1K%#z75I3Z}6!a(Tbp-xq%wW5ucsOMCW0HbjVs zoTs%iIqm!@!;e8c{7SB=kByGUunnW-GN@iLRWciy!8VUM=c+{V5x+wj5=v47Gj*Pj z_lX|j3bb3?u}>GKhQ(yv<6MCTZf#JqT#Syz5gRl*zri#N*4Ox*0rr-BAWm`|{WfB` zmaV!@&}sVWKAb&Z8$ZD7+ysQA6t0HcMIK+o%Fbm)@KM8$LzQiWhF=%2puq5>AWJXv znRsmcW7$@&3A(4|&h8q`4=u4sI@g44I;g>(Zj~Zg^4^=_asMn=`a^=eL@-YY$FMLyL{)R>s6MvaKmpK z*}suP3;P|p_CEY0yFi9tzs~qG-L6}_y-nw$a{(Qzn33D2&!c3x*qLF=e^J09!ur4k z*mT=>*b^6hp13r#d#vZaq}ScMe2VuLe`WiB|7l9x%_}WG>fh}T4_KA-?k<+!jm#9w zqUGwa-&H)W)4W6aq;frDPUC!4uo#E>au)Hy@fQ#@_(F!JAkyZFKr$D@Y?+cq$8ye^ z+CkgJK1S`vrj9K(Y!g?*7TX}=iav=Gg78yMzn*gFWbMPX-yVQy*w@m_l%*hr*sM>#7dr%h{$ zi=>G9O*83)nbIjZGUVTCJz1zwFEYcUup1%-|ko?`?x=b0{=sRv{U9jtgDA5#P!B5#{^b-gwWXv7SI=nx$;GvI83K4ell zygUiN{CUn#17y$3X0!x5s8PW<;WEbJd_r4RipN}8Is2NlwiG)?E%*aOOb^`%Lcpm& z+XPQo=yibjdax?$axoBgJ4#EgDIvhE@fDAQzJnRODCnqOLPV8P1#$lUj~-n3-1O!~ z{o@;FFN~0i{-KGsQxx^fC6JG! zCDA80@I6gF@v7|g+nt6=y=AVZ({p>ZqBH~KV%twa$@JFTmPQ7e2FX$EO)qT4A1I2(9wzei(Xyvb6p~q8$u2e#37j{!-Vh`XKOBz!1jxYn5kNg3o z(*B_E5S9lgX9!vjwR+F=dxe`b_IAKGtY6;WM;!VaX6gN^D-zdX3ajn9d1HVFG+lmt zA4qH0F47+Vmh`At(I#k5UpIjYDNPDv4(f=nc1G9Z$H%{HBUiK zhSW7*I58e*xNhIGz!(-cB~B@6T^$n!KME@;REka#DEOIfIFpOO%O#rO2N9`T;I+rO{frZx8=8N;xJBuqX{CR@S>*r65)C@Ge^#<@{C}5dGy>WisPcUA zW)e8<>-}8%ohbn9{Hb`2g<~C!+NN;&RC~e7rQ}M%CxE2R)~Wt zoRt`U7_G%$`%L*#bJIIGQ#p8Oy^Ra(#Hrr8hakhJ%0mTsJ#~*qrBO`R%8hI1a`T^c z+Agjk`@eKY)-}+T!9OvNTIubl*hXH{)l@6@`47+j z6~=B0w99447g&@=rNps+zFN{53WMO0Hq;f*%MTMpcuWUCR`e%nCfjjk*DSW_g^dXR zNqLmn9!f8-P{{ilE)m9BUJx+2v`ca7tZk$~6JGJJ1pZ?48p<7*Hr+SK4etT;U zcIB+E(r!!D0vMNX9wh(cS%D8^_nt0&V+r{)afDORum!WVzX}@l+=m04PG~)IJ|IfE zRp^c+bV+ua%ox?j3f{j3lgg{xYr>ox(F)s`5}C?JIT5sFK;PO?Ve3vi;j2{Uh&Qdn zNKw;f_ot8(2+eYSQoYN+vgS_GRG)#=$jaX(37wb@=XMVSs@}bU{^xYRzT=+UM|H&U z($JsV_5|UUCTx5q&p0ut&Nn@n{nTrmaWQ}O&i;LHaQwY3%=@>m8#bZJM4HIv>01U$uADZ$pJb&Qthh1$Ud`+5^rQ zqGv{VfLn*+>{!iw1me*{9fgN6Uk%8<8MD1LGPx-D-;?M(c@87mUG%m zE9eiJDK0{@^N#Pd=B~gli`p}{+YE4A+7~gYBm+qtpl$>%p)#91q=W;kjZP>Nu!e;@ z+U81#3|R+UoeW@R6gzz)er{61wq}DQ{wjjShEcuO8vkAV<7e`L;|C)Iu@;guk(M34 zqp%?5k+~?r$VL3Ne4a_@&IQ6}lz>xJ&rMKxn@+QZ7&|8lw~6SI83YK~teVj>6!|4Ve0 zvvd5`1;UlP!HB}5BKW(NQ%XcZNA*Q<1Bn#O&_A{32}$&2f%e>>HF;nk_O!Z~@cP^mO1j%x#!?iZ7q(ob zSyfQA2q~DDXk%{%Aqb_50aqA5=tb658?y!hFhGE(`2YGLvp^q6&;ayA zI3V!sU&A;4KU%cSKWx`8UVQ-DHOvsqRI2G!KnJg zZ#zCAVWrXN)dT~40-r{bD0X`Dm)pW-`}25GKG;8=$i3xa&wtUbYxj7f{gUedPb5d5 zjN{aUx}ftp6>x?j>&hyHSaH<$+iPnAWA)JocUnBsMFmiPHiiG7V7I6!@hQCgEGn6( zh7g#SV?5OD(oNQ&2b`iMA`s=224_l#6TxEhSD7iF31-j`%TN^vL}_(`pCYmRzSc0T z){H?RbR9s)Pwq%{8|&=S*`O3g{*Nir3ou2xM@n0@y6i#xj9wcs_O2WY6urPUXX=gv zZq=T)o2N(S@;JOO`1qpDa+@cj&6c%H-vK0y-!he|m@W8=f6>pP{uqER<}^^Ez_81AbkQ+0JGf|egu`P`vKOvp5Z(2H{Qm0vL8F{=YX*(uYBZW!(`iv@X@ zV3=W+m!5?hb`|wi3RcS*u7M^>C~TGnE4uqAKxk29LSt#|3iG%Alnp%<$8cf&=jVO4 z^d+2yCN*rEHext?_m;K;!5P-4_vQT&H6cLFUyB*%%%ynr*SbXmGf4y)lKHH-LK7GP z6uF2lOVM~VRJ~0rQ{H?#eyvLH0mArp9&Z>LfBJqn`E@NZP zy{dHtrB4+qADGw~56t?pw59ykT`22-lKky}UYYCqt$n!depc9{=A=iX(4g8%Kwb7{ zZFyZ7LYZJPZwne&O|OGuoqJMrVU#+~6~mdUGP+EM%7zyyo{0OzBXVFU`_$c`@IFaX zdQ=igtIh1jHJR>2!QfBV!!oDpfY4Y?fc{`}U`kT~CZ68hdR^s}Cn~v%#~92u+BzeT zymd$e31fD}9W$!Mor|oybXi!+JLxknRBxO@(n;wMaG-U1)pc{`h*pzF$lR5pGf#j5 zf4Fz>QRGvH-KTG<27bePvM()`Y5_vF>Y?R|wQ^`QLnQd;(;`8~mo4|7#y^=Zkf7hn zED^iA2+^xaLxA;X#zplakFe#`y?6j-!s>1*utVtrOUj@Vmt~Dmn14vzUsW4dUF-e0 zb3N_vcI`)p{Zl|^o+oaLSi+sf7MXhva8n*-hdpr)HN3E6f@p{N6PeRa_9t47ylnI# z*DN@7II%36u)xai;HbJTvwu*k`_2g!z09+&Np@y7|I=lM9F5GiCZK_f`yWJSrvG|S z8oPD??A*8S+$Vx6uXLqy2G9>+>}+uA(nL?K#yYvud1EAyB|v@=Tu>$ewqKvvKplcR zqis+sLgk9{{`%~D{rcMK`{)_Z#6td`>yAgB8^qmOaf)2$&e(nd(z`geH1aek*|x0& z^XtdK>h6vN+({(R!q%&uDt1;;S8u&xr36DCI+EQR8ye+ExQ?=jT#65{f9faLf9of& zt_`zp)G!N~od}N<6ni?N2nL(Kw%p%^5SG?xmcQZPjJ6LT;^=uA-u*~gmYmALD_FVT zB?r+Rs#o{zuZ@B%Kf3-QV>h__ei2?D>Ar5Ld?fEC7DRIYu9dWbYReZ{2DwXpT5h&6 zHjvL^9eS?3efZ4ix_xl`Z_tUUVz~^qd}Y7?mQOrM_rv|@ zFr>1md92fg2h84&7%V4;=-&3%fjI*lO4%WEF^R9uxXqtg1I)!e>r-(=rX??!k|P+? zX`DJgMBIVRZ^NSJm*d^`EkuV`}=zUco*wga=4~ zyzb~-vg+tkwP^^N$Szl?oULHRqw}xXG;b_qaJs13`m=OC3-S!!10YuO|A$z8#ta}< zyL9&I+k0r-Jjt+&X@XlxO$TjJ44#c)rr&{@H>j}NKEVeX*=9-)Kk70$67IKm5%p?C zXx{$*2T9)UC*Tn-YZGuU&ohEs63J*F8WvuZw^RQ91d(6qW zan(7>cRh8_2amUl87YfTruAN=u=_ms$Mdg6lGK>1WFc0g=}K86+p)qV1*B!=+Y!$h zg=0Y<=C~sf$6kEy>VhAJo)mLZpSF@0o|p#7TJn9T(5$N|H@(18ceV@(g}Z4_@)s)|%XcF@Jo&#<>UH=lxCBO>uT6+MC<~j9%0VA}BO(5l<*PAg zla^`OdN@r5&gPet)ZP6N>2Dz8&rV`6fDo#)b~1@q627=iw;xOZaDaC7aYp~sH3^)D z!)f9~PnIiVG-YY1yZBF=n!x12(JTrMvdCcA`uEs}AVjiZ0N8nmdA2D<&P)QL=lfsB zNw8F{t9yXxV~+4Y^m6~Pz!ud0e>(7Au(K1oaoc~U$pZc+IJQ#=z%&W-pJ}pP!f>Z8V07 z$pOIJupfW(c+tK^9znV?FAjs4RW+WpSB)JN4V*>6^zE!CjU!pPCo{9BzQ8x6EWq*5 zJ4k6Wly1?-u1=TE6A{~aG*Lj!CnHHvEct6s!sKJw>|xjlB7s?6T>TP1*4JS6c&O1azyMWZ5ebp2MkO;CQ{rE*EYGVN*j7ICKjTADH0r> z!_OwCN`sg>y3Ueuy~^}HmbPy7qfTVa2HxHco>f(42QLGe;Xr?Iy3~Qd6^KrG3a&%Y!pp6LAvG3^!D070JwW%tDR?#)q!=2nG!| z{}+V3vZ)Uua3kT$B292}mFH=mKsL~w@4m2R{c&D5c~$}A-5~AikQL~tVPqJr_(^1n zjF{@DyT?w{@c#JtkR7+-k_Bo7u@ZcdLd0P*oMo@0ePQ~V&u@gDNEd4=?Dcv>!&XD~ z46=`elMv%)#odU8vgU$9*G=vxdzY-xe3@yd4#?AXT=x_e?Ki&YZo;t+VlPsy{YQzs-Cb)d5SRtV9X}Sevs6%c01uBDxSIpr;bR2#{?%e zcJ+-@tIS&w8>V2gy9GjT5z_IyA%SEw-ZTakl@QBjLQ*)?&g2y=X^-YQ+OX1K2!|Ho zO~(GDmx_WGs@#E`VuE$H=1wgfbMTV<{H zO9(~-HmkbdfF4Tpw1)Yi(1F}@{oIvqNMZwX*Z?Iu^mLG-b!Jf1+Dw z{uA9=Z!(^6-U3MThz|QF&Ex8^M|>DfAreJ=tx*l-e}`BXameDx*}}3@B)}x@O#?El zeM#h|&e_MK62T}Yi!j_TO~;7|4AU7HvE6gY_C=?O*W}~n>A+w+P|dF=PwVw`k9{VQ z1M5Ss<^xi(5}$qahAEAe*-hYq-%Aut7IsQAULy+hW-Nz3^A^wEFirZXkIT9451q#h z-O2Yo!23`{QS2=dTV*w>sI5G3ty+PjO*by!#7j>!yho9>&b$kNtYv6?m0nGJ^R=Jf z2SbQx1iE;L%tHZf%c=sr6TmZ~`l>vwFOz&9|2t+K(G`E#BXp zsBmO4src)tJ$p)J#XzcI%9%7eM&}q(Y*pk_HCe3TV2|JW>A(O8)Lx)M5#FCK7DFnD zy3aV7h~kiUkcsB(%==@@SnrG>7FqAmSW5csId$6w8{6*x62syrQ>AzL^@(+&jD;a#a1$H{BWom1D#stcV-Pvxw>w+peYPt({Ag8HNF7MlpF1$&w#zU=u0ZQ)b{|m%`+|rG!Gdj`VpVVwL&Ebl7;lgqNRYRWl zW@!I*Rby~H+90L@SXCx|&pbiF<;pcB0@MP~v)Fy%UC%n&LE|?|?T>BJaf2lk)(HI4 zHaC_-&PxJu!!P3NEy@E;1L1%7EHY|$arh`d6pZc^457lp_mB6XPr=P}X|eIVJtJQw z12e4}sEtvE;~zZqqgmYmZxG@cJa^_`WXr}P$6&_ckKy}RBRJUZ{$A~o?-+#eCip_{ zZ~hFYF-3z}-n$53vFUryktf|iEpvv)Dr@O6tClB?474|^n2XjFXrWg1XmEh|;xpf& zG5@sti**Z)G!yoauOcv@00lxb)exTy)~POm(fY z7;s+fJtsED##5{iROF$gP$u5rgqnI&@ zBUhy|k_2ViLkvyqQzlObjF!i6mH@TF%zY#Mq#&uZ=bS>bA7Y_JomyW+yz}p^L@-8e zsxLqmLjE6!q)ZI|sS%o&fWZdie-Ae0&WHp*fN`^-soNzwD>YY-6D6{S%8ayP@@vYz z-&bV?VGcYKQt5dZ;>!`;W59v2As=!`#{NRTE@dMuZ)(fAk4ew3(zoDUmo-_yj2 zi-U+`h=5o{Af4}z=K6W>ds20xF8ioH&jz$+5s%IGBeH-}Di25TP0V$lPJdy}`Pf|McTYevyG%^YkAPWgQ z9O)(S>ml?0ggiyd_Cxzf(1W~xJO2;_!lCfc@b6QP7_6&D*I;*&IxaD=gY6#6tm%dn zsi=-*ufb54e3AOJJ2x{Y49MkuxXyi>ZKn14Jh7It|Q2XP_fhP_lRdR9=46qLhBND+6 z&FOi|JEc~1lKf&*%?-D${54w9E6$udHlt3N>cy*uwezQ|CN7#R=n8hDaY1dC#JzEeQPW%n*~%%SyLo1wG+yno{uY_sJMti z4z>-^7I~l*nW1|Z<&g>LOLMpDlO~pi!$QBT`ggFO6wEK!f`W(y3J_~Mje#JVyO(UB zZ-9YDHjZCmJLx5Wp$vd*2}6v7K}ARfOoC!#1SDE{nSnQxqj{`^C&C$oyLjZ7AX>@e z!v2tZ3|B|`Uv)tOir^0!9$M5N>$c0MS1BgVkdJV)z&TFysZ zl~RA%(o-p`AemOV{H>%NzsgN(^NhNtQ4n?Ehs0m*%-6TV8kKaff?27nBI(xCv}!i|@T{@efVj zv8L({hQIc$HcP~)6bQnZhkL28q17L_T8%;ENMlrjj1bK#T(6B4YE4JgGpmK3wP&Wa zAqXopyj|vs+XCm^-*MLprtaY^>WL`rDF&$TcnF1qJtnbz=TSRvl*sM4Yvpy?TYjNYctu;EVJ8aI* zaN}~Cxp^{opFa5nOz?iEeslzSzMMqyNBQ(3p^ddo?_JacOs>KqWf?ea<*kmu)23yM zE?cp0*tQ!;J~suV=)tLX`o!T9-$cAX+}Sx1ipFF5ST@xd1wDRY819KzX&WRVX4xZ zi`EJ3e>f!k?TW0P29TmUF#f%(WBhN$PP2&xFrAdQ%T862S)4si4P-_4ju|(|0ak0Ya1laX$=jc?jmLLrtSNq0_?0}jeP&F=v-~oAS z0&Z~2r7!U?vqVZPtg)&lWM#wvhyTv*hI_#5LSI6cZz5Li{<0Lp`u_3|WXZsZe}xOB zuq?YBe<}~kj4CALB960^b6rxGLFTQQaZk_?0okJmcIQ=8XY^xjq1W^GJSS25c+>jTLzBe56pa=4YEcYdhahUT8A0A1_}+A_zujQLeu$>ZlRK`<9~tJ~ zVY%^6+hms;p!4#o*aSgov6n0@l+4cFnb)jM=B+!>kf?59=isT7~s>P4LbaMx68fz)8e2&B*I$4cQ44qwqw-@y}aM z$EZDlq%M>=x*2i=q*IT$PqdMW)K)lQv8I|99_2;y@fIL!la zNN%NGtM8@%^Er2*a3uZF^wd32!~@TW0gUk)e#h6Uhay3|?xx)+@R$v4B=~s(yTH%Iu)4%+Z{nS+Y@|nS!t8fECq-1+|~QylD-8)B8;OIMV}z3IyxEK zaX;$f&-J8&wMDeegxq+Y3Dk|#zEPKNlZ4$m$w^V;oH!rnB~rg*r`jfIb}6rKj0q$9 z;lJ;EePq~M-vLvMJir;a$@xzeE)b{R5Ui4^HB32yxY$A&3S-1WX$B=ZsgX^H-u zf00vCwAHiHI!RL!KSINr)DWqhoBFF!#qUA4}+&wb(Xtj$Y`)B%NDAp@Sr z)4tLoyI!3~_j;=JE4xh2D^-aDhKbiD7Nw)#CmUCW0Nn%(xr*F-CvvH=6D68o_u_%0 z2S3S$QgVF9EC^Fdfd9Sl|7Je0!+?*tG34fSsm>WJVI z8Z4muq$T+GTE_C<2~|VOZjS@SSI^=*C^<}lI+-lM{&GgaV9dPuN_vq=u6%KX1iZrK zVuTUJbm6;eSXNOJ%UpeKJSqiZkL2n2THD94`@04bGXohDfJ{p9x=;_d*8@$GYg=00 z&6}%}uV6r6K+bZmB#o#9dCvxD_!%;WaW@)EBt>x7V?HUN9K30W0IsC^2qJY$ zGBS7E3%IcuJeIW%Rc*m8Fv7yl7-uk4O_?eW9CD74eYRkN)K&!4hsn9KF6NWC8DNz_9!f(?&DFoR4Ynf2h-knYI{KZUI zf)0P){-NWGx_F9^v8W=#V`-&h!j74X(M-}{)^Ue{R3sG@rW4)%)ZD*C!HJ)9H-V=) zavhlLb17+mHw@A3RsMQt}qgt)%X4SY9lm-TfkkseLWM+3{I%AFi2=bKxLEbm#^ir3-upxMfZdbX| ziYQ7?>!%PnK?uEOZ3d0Us}iP0xF z?amy^K;I6-aN-wKq#}RA1PU4f+H9o6XocJ6x0mnv#DuDvm=c zfm|qyvTT?x+BDB|6=>QicZRtLcdojg#dxWS@hi-#SARAygIb8(Fu`=HiZ9L|iu%e2 zstcpRl%OtfL5`KZxJhTjZp$o4)WYTjr5&e%88rZ{A@3^0$?c+A)(T00H|e;17*;h-3XibV6(8i5UvJ!xiKX&`NK|S+U>g6McY_LfjZIDi;qZ$nm8Lj z;HXhUMQ&Xm9WSQDhgQ;mOdf7t!g zr2ChD!KuDl!g?$U-ZjldQ0mG~>Gz8V6LhQ#r*;|cgh#})Ipw=Zl!Ehk$<5x4JNdA7 zosveKJbJC9mN}Wl^4sirBle92@FdZ$9#G}x5nE)Nt1UJ3RTRULjzmSFUfL8VdRtP3+Z4_6}G ziJo$oGaM!O!?NP;0s#42j58hCf{+fFNgCd)pPEp4Y@Wa(ntY}$S++D8KKL6@CI4TA z@56o5-W(VR=o0YhzbSky|FI=2l>hIM>)mrgml73pL5OVP${*F2A49DP<}o&_%X8*? z-PZtWu;?l1T-QOCmtRi(^@pPtMbnRCr$X`$r@1581{RB|T(XZ{-z_YMBZU)Xib8`v zshf|xz57xp?k6e}l*&(aY4=d`VTnBx@Q@qwp+K_ru@*ss&$dz$m%a2lG^*34_5LEn z)+3h=FS!nlN=K+=(JGi3by9~sP{m{3@k+b8)o0^+c%I^jS-(bSfsq5nVgXODYoI;} zyDpCQ1{n0oZFZR9yQG&r>ED6oyAn2kHutKx288aYKK^n>-nt$}5AME$hB*jOfBztSGzSI0L zFiQp3JKx2s1dPw^SHwnM05lwy>GZfQ&k8x~%R8uV*6bX(_WIcd*2{u^{d1I7=b=p09C4+EbL!e7%q&)q4gGA_ zPH=X?pTGKN^Vl!oWyM(K7PN?sngdQfnI#UppuCzRl=2NBZP8RxRIPs{bxQTfI&}Xl zGwd6|HM1S?y~Jb!0s>ra0@>R;(>qyP7@Ii#_s@T$ZnV}N0sBTi*V5lV`rSf6p|*Gw zm}(81vn8-%v%P@?1(CE6cl>K;n&X^#_I{Lxi}tTq zfA3PkFs72VXxe=h)R<$fjchL3{5(@wL6HJg;G?;-8b!!UVrDn1kz54Ws4zOml5% z;!FiIbc2{uVI&!>bcpqI2x}C2zz=oE5?Mz)B>y}`v*0lSLrGQF^elTFs&3Il-9{I? z?vH)Ki$n`mOB4i}7iXPaa=7>>cIk;C?u7|N@i0HoMH%cswCe{DItNkw;RouUfr?jH z5fpF{Ou8fQbIP+jN|8^|Xv4AFO0K&y(;0;2EYhCQ*^|Ax#QsZ#@)|SK(a>oZ;h7u5?-4SNGBhs;t}1 zpjkw;b&tR`fA&q#c9#uWZnNd9|LQuDM~0FmdC@+Sr;1P;b$b2yLxQ6i0rk0GU)%G{6Aqi4*AuZZf;cEl zikvL1>tf^$jQBT;)eno=8{YDbV{IH7NBSS&yh`? zm8;b29!IzJkKd`}@#trMb)7X2h8V1VUdS}$>hK1q(S38jXayb%7+~`Qih*?w2FP}^ z^*MX*nlylym4pwtGO&+7E9;qYaLMM?48vIo^9_0*Qn19@F^_RzP8{##?!q{%4_fTzK9~V z`#sRNbb$gp8F4EJuhW(v>tAoU7mt%vm79U{+es59vbTWvS9nwLRR!{{Pf6Qu#ot$( zT)N%x4?3iOn`)Nc3Fxcq4jAmuX*BktbZZ)3d*qExJM+;T_%pot5u?SnfBbl`6Vpp| zj26xX*8%wu3vbnGKSjQ`7-vWH$Wikt<*#Jbv}SY59HP?Fv782-_LmznVGTldJQFC;0pRWU{aQMGBwP z|Agk}Ko-+WF(++4Gz2-y9nH^<1F2V{T@RmyUb+|DpJ3Ay77!;3Vq{Us1{mCQk%*RL z=wnSsnx7%Ar5H$5Tl;(cL!iNmWD)9V1w=;Wo|bbevp#BQEBCuxK?BaGbA5m)d{g$!qaIY>1moi7MI0u;w2v z8?)WbJqJRq7`QbDf5I@9H6O&$L=%*?Rx(F$Yn?AGi%U1jBn#ImvY43w05;u)S@5(Oai%e2Q176-wrcUnP zOlEv%Q7zG;6vz2g?RN~)O~zEU8=ggT(Fl$~Mk_@i2AdN$pur(ex%~YEdIFztV5==T zA|!`HAr%pmo9aNxZgVaBM58Lu1%KOhf1*1>F%ZmCvOb*Gn-_<2$ydD&Hu_JGulzN^ zp+3Dyi2s`h%S5WkQ1r>B;L)~~@qz#A7!%P_eF&GKnMpY=k6r<0@5X$M6m03IpGr+&Vo8g&V@NXyAS{a3Zu?cy4*e8rjx`%8_uPKfF!^c_^)>*tP~ zf`j)hq%$v^tCuQpyK(}9KkqP-eik~c#MJ#^v(K|9HOqLoMxgLjrKAncV)Rlnwx>Mkzpwr4P{;0 z^55)QpRx%!4W92RodULx7%Oj7Dvgq46J}-AkpwW{{h2KAT3BAbDl<)FylxNg|Eg%P zo9>oa0X+9W*nj^W{D<;3q4s}S6?XV<09HjDiaEOqfsBh{W?nF_+7LJBwujAlPH~dE0x1xj(acT(B05gFbpHVM>?VATMOJxN9mwF0o#f-T<$4 zs+9?=&KQi>!|UT1-|nKPJZskC5`stSDBLx!M0X;8$9GzNrh%QgYDZkjE&C|OkFY#M z@_GHTuwh4${L!O%(t|lu;zy}y5}0`fz?#N^YR#28$F_3Cwpt1xXTE))6(2@PZ&CEX z=*;HuCpaDSGONB=8N9q7TwzQ{)`ObwAka)`*!r`$r%YcEx5eqZ8SY(^)k+kFf~{o= z72gfL%~H{el>P^8&{JiCp6w*^wH_i4ze5iTC^~dGs<e z+5iaw3rS3rScj2KRl8^74-U?{A6_w&UX_Y(=p=zf+ZQ=$M*09%!{d^yJ1k0e6#YPGx1!Xisol^AZ0p7hm6i5&lA9s2T1#^+;#jfoYEI{9%achF-X z`jgAY1^o8l;na@L=NpW#>UcIpGe}frxPw}Q0;=%J+{QPi<4b}AVGmK^+!)RW2(VE0 z;4vSHJzbUc4G)B@#EFymL^p0HYSTg?H5hMV(At5kn>mcNfAM@buF*-$6I0Q8Zt*#t zLi4MyqP2Hf-qf3tz9RD!=pvsPN+uPRy4DEpkeFZw9i}IS&;jphEuA| z>SG6U&tH}uyzUjGs$A)$-*91{g`Wy`D_E{=W|dbK-zw(^7bi6?uI@9JF`=D_v%T$h z`ED1^5PbqPfqv|ljI>);5-^lmx2B<9eJCz=nVR=tS*%P=&DpM-#Pls=3H`R++t-h4 zVlKDj=93t`p(*)Snjwz(t)1$^hNI|#*n^}}mu{On6)NE{8Z)9v&bS=KJLVPznQZLz zl;z^t{nC~Zafr)|u_h7VZ}0rSVn+=WUAza28P)frQh;}pPYD*UfR906xc_x=j-CG< zSp(pmFaoY6|7|Au4|Q!qZPRw04W$de2Cxvr=xlDS@m0RRIBHl*3GOU~*sj*kFtbn# zSSo=^aJ7L2d4l)q|1}CvNvVrNZ;yq#5-omvoOS(i-|=hvAh4oWz3PBMGNUrw-|{5;9{ylB{qsZG^1CeRib{zCwls2RYLDJY4}2RyJy zkZt+=okJ69|B8Q_KTZI>q-%GxdzRTruY6hf7(vP@=>3dm5o;87XjQ<2>2|~=yWM&; zVJ+^T>^txkUL7$-$-isUX+aqn&fw+=LTBQd zokh#fUb<67^H+~=**+F9Wu7N&M#;9HkDM{RSk4p`nQfK+H-(?%1Pp&b1v=M*ti7{D z0nanAuYn_5BL6WjhN}xA8IK#D>1D910O*m2P%O{)+yUq!uAYh=umQQu5~Xz0f+C?| zQuaWmktFfnxTkU0L8aSbXNZ=b!jDR;~f zx1P0*mc6(dc`HhyV3ztbRvz~-oQoG|bEx;O{Kq!0hk+k4qO?O@pfb@SBHeE`Cb;>E zt+3x1hD?%it^7KE?>#@Ek-K|3D-NYjk##DKXFa@`+(^L4W@PZaZhqn%5nf-u_%j+D z0`cVnE2`sQ62AvOLv|^@T>lmB_sN-%L-IvHf;A)D)wp}k^$Wq&Q0hO`-a$%{D@a~B z8ashSIND)KUV_={tBK;)w>9xshl?_5h3!jF^Lpc(s(^4uQLsm8BtOlHYeP&XeDMn` zqHHgea_21aWFCX-12%)QZm5exIxB^bA_<%Za5jK}z5D(y)7HW&)WU?&r&;k=-L+X` z5aU12%$|c~{uu20JeM@|=6wcJaMR6_*C30cT?zryfueE9|Fd)kwTxA>Ltzv)9I~e1 zndM{#X11c%!LtSV`8rwiJ|0nhp2jJFwwjo*Ts_KDfhNcMaD2ZD)jPBo<1OU$xp{@m z)F}{iBaJBqIeGNeNxusx2I~K#g7`h>m6L1mI26XBc*xBWqihN`aRuUh3{wM>H_{hB zR_^_BRDT15e6w8i`R+kxf3IxYN_!W(fg2Nnjx5{F??smW6h1vb{}{i_6b&7pHSYgB z>g$lB8{a@hsqr#qi&R`2tf=HWH(lLkdXEkoyj6&sEMd(*wK}Ys(i!*^eLCSS1x(Wt z$qgh5)l#RQHh(IEPdgA#7*ldC9r9a{l~=Lo7>w9Q>`st&K@$aDRuv9K6G5$98ZqZ9 zrlG=V`j#hAJAg~-?t@wIQLlOw6Yu!_Yb_euYYGR%jso>i{tw#Sf0lR;G&k+mxKRAM z=RWZ(c%&~ug1sC0#YzRoor`VD!M$>%4GA)g#9|EWOTVs{U6CkQPLUvKFNl(Z2Y7jp z-MYMGKfn5kdh}z|50vI+qdbK`!dn*ZM~e!5u%E1C;Dm9I5DX>d#k2~<-|au2^{)F} zgMSg2CjNorUQ4>KsXUM87Wol%#v&}-fvtqbPv=_~amDzeBo9|(%Z7#S3FK2idan`x z>df<`<1DqQ0f-rnU`41{h;NK)T3p=70hM{6*#y(MK5`6DJmjFf?kay@0o9S}% z!60luW_0*mO7)nA+UDD%Wp+7bi2)L20^96zwR{F(b-7A=f$fK)MFRKOqlO4TGS3 z8I#Z=#V^#gXQ)oIN*!#r~-hHGP ziTabORf+IX8RoUEMp5U1Vz*DR7bKJ}L-B$TeBzS@`IA~3bg!07RkH%(_z!u%e5R_B zdsH2Np#>LuNxenA>wJqd4Rw>qx+CnkrLB6AewyL-`8!5AzBSXC0r(N3TZ3=6pIhqQ zlW`g_t*OJ$`S>hDCdkd|k<8Y){gA)x1LPV;GW)Ha z5nuv9tDSXFx$c6If<$>x-OU-$6mWjfgPF_*ke-}aQp6HI1sD5^TcYN~i4o9E+B#;*+LpVX=9|_!dl|2@75JN8PirlzK$Ag%n-gFHHh} z49WvEE5-I!*P#zuh-hryT9egR)-vHRuVuL`0V zPiHbBC~UM#^bY-;5HENz2R{0iMGjM;5qJovGq3jo+UI36=b>K2q(8}WsBdC<=R_PJ z7qJ+|Rqd%$Rjs@Td<9LzeFPzRoeG#YE{?5HH~P=a)sQ1BMvNtV&hnG%(u9=Ck8 zHSnK|>vekHn3s>X7_w08Hu1PJK9=sJ8s;N2zC33Au)2;)T&C@_8VdPK*Zg6X)95!& zI3pbC32#AY%SF#21-SH8skX1D)I`&#+yqWzYZ-otvPa5+UY^S=dMXZmy-$n3OmmN( zCE(2p!T93e9>7neZO{6;v{%B^FJCORg>F`_Hdl_X$$a+aA~1}aOc?vTJ5q#(fHoQj=Pr9?={PCyAODhO&dR+7tMVk7}|3(KYO$A`G` zc7tYF2>du-d5CC(y{Cw{{*`gWo@+iFjFLi#zz2!XJe)(5mep0|eyFR*!9evV`xEbq zhAy>56+JKSD3+haw>Ud}wGtF!GN6aNGVRh>>z9Z5&CxVV_u((M_q zaB~i?a!F&W!@P!KzXb5vFiH9jp6;||Na0Q^Sh=agZ-k(&;#Cgz%+iS?@|d(GF`5*a_?@+*C>b0Chrml8NhHL+Toe26^O*NsT81*j#2 zyyU^;@xne`TL+|TP)`-GQX z-F^LQhaeO^S{x7P5aen8{cHW72H_$@@1Kk9o^6N=ZbVOAB837Hsy|8tw#=~R%LEp= z5UK?>a0|JL4g1zBZrkxm*24;#?5>g4Grvh^JN9qgyXPZz%9qOp^GH)=bd!l8ay{Yq zOf*eAII%f%d3AH-Ay^}mF_Be9#inrWvX+klC);JbR>GnDZPrsOBk9yCxvjQ|Qy#q; z^JPb*AMBOJy(m0m>6sF)Fq$yCZ#n3#VB=Dy$*J!nYV#I3ckC){6z+d3kVe6j^gWoT z&r9Z2uL~KWLYvpV*?y1gwg+ISbsTVl`4SaE&N%(G{AU!GpN zg0yG_ooQ(7dzK)(+_xT4(!5FA2lqd2c#=2Gu5lN~86t@VFtUYray)&!&)?VL5BzL2 z-4B zVF^(g7S*PSd{!}CH~8#aN}Z|DvCgnqzOc2ZlUol8N7@X8#~R9?{Xl`)vyaW!{*~g; z;li%Hn7y+UYQ-C(vOw1;%EN2RY=+r9>ACP_5G}ar1uazV(hU9PqQz?CS3fdONwcK6 z^4@f#*%zgqjJ-=lPrX{oZ!OyNSs7GebjI9>rM8-#@(!yO?)-P42nifjwd5YUPOi+j z{Uy3>Ht;B)jgO#rpkm`}VEiId!WHftvgDqGUXFK@Kj#C+TdpUYV!W6M#g`gup{)M% zi^?vvX4j@y?|m##6cZvID*u*=t}d7 zU|gS5chFNdAlJblE6vs)FUPp~>fM$)NkJO%351!j8aEMYEQ(n46Tdk5;Ms9hY36E` zo5TKGAI2sZd?mJ^IuBPY;F=s{?VlG=o#B&AKS4O1fPXVh8;Wpt&RRG!kj zBQMCn^oqi_ApDG7gL``S`MBg=-`%v_FnIQooEl!TidA$(uzd?y4@$>}+ZckQ&yyVx zSfRanHmcd8GHiQO?o#*E>RyY_1OfJE8|*|ZJjbC?aAm?8H%pwF`FD+48j%L2&Npbl))RA;RUunU zIC>~s_B-!_aM$06rpOYC2=j~P%+MdvIo;+&VgOr5@IU})LsB(1>u5Ys;>!AevGd4s2Ss!*^Zf+F=l4Qn3A+1njba$BS;@HTtv?32esKGM=Gc#PAE*U3;x zwU_yuDfR5B2XX*(uje5|3JJLc)%l?jpVccwtgQ(=5Yp>|=JeC+j%IXfA#dE(xgRP+ z;=>4d(!!v6g$in-kc$CE(t4EHAsCGjkHaT=NPJKB=*ci*WFOiszMl*|S>Dwi6Cyxr z@J=78{arMhZ(xr)aUDnIy^_liHWL18Bbpm!c~M%~Ts`F~a;>%2hP}FK3kPv{$3sD- zy8fAgUv5_9#AdXG<>{}+l64$!=|In^6L`s8P7EnK4hCr_?a7Ke74+|bxNU&3#(!35 z%=}Jp1_SWH-~P?L$X|h5z4C}Pz=ga6{fHNV^G-=v+mOw97c5p09lRE!<`$S)7=Rh$ z@I|9G@;)~SNCqZm3HcTA#u1a*Y_h(wh?1?<;$vG^$k`(~!gB&|$CWA#-xD{hPxkit zs^u^i2F7_Joi)S#>te(}vj9w1lB*~lA98w^yq5ZqqybXGA=Dz3kp$e6`IMaH?yLM5 z;fWJxUrB)g#Dv>z+%4r8*se*KGD)(WKZdp(-vKN7YNP23iRr3sIQ_>RsKk&OrY1@$ zcBMAfq!uxoPNeox%k@}tdJ6%ea0dvXS!gYoeBHF=ZM6Na|Iy5~6ZY&iD^nqM4Qp*C z82QKKyQp=P&ChE0xN{SA@B4A>Bp)|pmwD0H_AX9#ai>s2)2t=%i zm>Poy!D+rnM{(ENK~E33&Cf%+{`GbaVvMSUi8*w&=l?2yAI>SD{+Xy{KI9vKy6-9 zF_?0%N9Iq(k=R>ZR4s?R$l1|Zzkp~cht$c^+$FlXPObisNK0|=W8lN3_~MCSC(?Gv=B`C3 zF_K?hM%PzOrn5UudF!+F-bk}FO$ik+8KAw1M@*N~zme+AMw;k(vc8~XO$PbfvK|dx zGjnifK6Je~X5U+L8wb6XzgM3BV1F*qOz^`rQigz(N|as;t#92Gq1xt>ZJMjEf}@#+ zx~}Fua@>`#vIDcX5S?0lE;}Z#phs8Iv1<2B`O=*FLJ?V6Q}f#!HjF^x$5pH)(4cV!Kp$1Ae}+DP{j$#fBX155V039Z6)LoW3vjAwqJXHkm@eS;O*GZS5Qah7 zWyc1@V~9!IcsZwGsIzsXAbGjETEBgz$YQfWClPd@JQcXg^`H6_Wt69 z+DWbwY6==T<7=j<2A2(;&&RQ}lYAXckEym!OfHjRS*z^^XZlRs{9#@m&PO_wIudx5 z{mDTbH_%dCOXuN$wK&WL^X@*w?tr0!;a%qNh2&_W5g`Q;3~`l-uyWISnL)F1++z1& zgf=q3t7gnv{nuJ+Yka~98P6wv`PzvH0Q979i7D;r(m~oO_^IPGJ?9fJRe4%}TaVnH zdx-r(OL zL6uwt@uJ>*zp^}<@U;V=3gyx8D%Td(b6T`w5j?2@QIV)KKRU}k(4&wtpl-kjeUq2H zfzy~1r&X)8ULeXpD4gXL`2u~zm`9XwQ&-i5kXwkwB;jg;;N<311?Ji|91|C?#41xS zp1=^XE$HSgNc>#eGnw{_F|JX+rE=pzlg_g8G0?bLzeu-7cfwDTzs5WOcN?L=4&w!M z_Xz(co;YezkmyQ*E(++3JspUMlVVA`?*cvyhh|8*N16Ah1$_Z(3#$N@M zt-q2bXCbSJSmy{#s(l*Kov+$m#NNCuzXJp#D9s&2z_A@0qRmZ{6|UpD#}K6P48kKA z(uHVz+>Z`2864dn9kelHWmXeZz0a}=lNc2n)>zK>%90dFjfn(%%d(QBnu*YIR5j#* zx{9~^=C>^5exMSB_F~d{?y!8gN+c>}2b9%v`B*x_1i@oYVJSlsDxA4AQ^ONU7azq!r{_a=(f$vjhQAu(ZIoEBuXu<5gdb+vJ2qfb5v4M7R zBHjraB?J6^yI(aQ_$$%m#~!)c;bi@qys=1T_}MPv@i%GsT_eCCygf2LU3T7}>AgTT zIx}63o6>jguv8SJNGPH~r-`t?ITep2B(8nq4soA>O9kMu<>0ojqIYd^m3GEmkhW`sX}*z5wg1lkiu}FtZh1DFB4LNZqIfe2XI1+k^I zZt(OmRyHuj6+uKB>wHV&l|9T4?9t=Y+opq#Hd(d3-0m5-sa*^PDrcClk;N$;YWHXM zOXqtT1STTm#vt(YEg`S>3jTLexQ4lkUw1r>pMo{G=Mh%^v1B1uc#R(Xtu-U325r&j z@%_#&HlC2VtVpl{OI6{q#>P^gd*KG`p#iy@EGdMz++xVL;I^3a{wTWKwfwmK{`l-D z^N^F&KaQZZ=n_}#yZwn5rnmhRO$IO<10+>Nw9w&9BtOSB%5`9}YF;z4>f2#l*wizT zm*}dsheJD)3w}1$u$^VPwj)c=p~?6G_W(^GwzdoR4My#5Q9E7&)%}N%uhD`W{4zo z5qIz%?w{}ts<SF;N7+N5p29=r_K)_Y6`S(ADRVr z^{lW8jMZi}=Zt9I^7&r0p~ZoU{C)f9KPS zZSwk*NTiHFMsb*8De7GuP4nK(&S|p4oKqa~kIEm(4{?c)Md?LRmH5RMV%T!*jnk~f z-+0d%_mgP;FpT-S(8MRccebLGNIwL zhL&gZxAGZVQo5ODrmFkumfpKq6d7CYUQOLEBlXBv1(2uZQ;TcBDb4K^Ylsqg)p)9> z*SD!JbJq_?TDk)Q8Q?z6j{GCZD$Wesv>RL3n35}hJ&wzq0v+@6gO($$TW}7sWTsvr zi9Pg}4W5oi8pB7CM|y(1$8F9<#5tHwggsUAtMW9L9VGhCEdMO+ze)dju!dk5Wp!4d zb^JDOL(&hA{6Y97+?5253`J?zI}L%hBDx}U>|G8-S$6g*9D2`Px)9d=sYJpNBrLkL zFrLjT5he|)StNP!rh`Vm9L=sIafnD{Fpg2pY@{b{cS@Y{$(U`Q$Q(j)`}z`Hn=XJ% zK^iU{h)%5;=%_BVE9}~OfPe2&Qal2+O!Q*~4rBuX8<=BT*;V3G1aa;a9E63N>Or~FIA4+CAIbRo#qGe>U^5a$7 zzT-H)^ex_J%h}aAC##1HJc+)SbOUx4xzWeXi_t$qj@#W43q*MRSTy=Y`4=m+(NeCj z$sKErlQJDOlt+b3ov?d?gfti2NzZ9mTuw`127A+)BeWn~ibhA;C`!PMnHwUK%0jR; zlKfK3@F3f}Z^==D1Lb-J1+EshOYb{`fO!Cy1Eyc=YGn?PE4>1l++qBZfB7p1!ln`Z z?)pa#DD`DOy$e8XA_3-ye^Pj}{2d_rl{aJn+-7HXy-T&H&MfQC#4tZoQ&M8qGSqL~ zP8ox}H8g89=hK^BLo&0oz{prR8+%WOZ(ds*lN=nHsvwmqH9tlWFK`_h^yA7h#s;9a zHVrd@MHUfLk#mW$x8drZ&hBoDk-ygyit5sw$3)m3XM7WhEhH%q`7W0x-b|HH8scB6 zF4RKs_`3l~zH9A!7-cVs_1T2QnXb6Tv1>csNukPmvDdP&9~ z=tVb3)w%ajpwHN!k#CrqTtcUUtz3os_e`zz8Ql4}4ZwM#{NKwsTZ(O8Xfm)bzyv#J z%2;*Et57=X#3;LWx0kLOu~>}hoI=+{{HYGLSlsW8)Xw6}hV4&lM%j3VaSYjs1^>#b zV6o463E)7VVRpC@Mkdd{6=zU7?mKgH+#AFCZH5PlY;;j75>{2@+DLdlNoCTa`oB?+d*3h!1W!Sea}?O?GMr>9)> z3J)kQd7<+)+QM(oMjD~Z0y!Y*#m0t;1Ze`3Pz>392&XKCYT-lC!vaxJd7>piVADa> znkqCYj>|AvgKBrPri{Pd$Lk4PM}4VcdiDy@8zVY8`sG-69rH1+BK`-C&vAx{XmI8k zy-b`VH@oca2pzAm`$!BHTI)+KZi4NTA-i%0mXY%I*OIa{3Uo84sR$MBFRj{5sY%=0 zq}O({;k*2bF2fax1gZe1lc&61PofuhRI#6OQK`&0W+{Er;pa-+_SLWdc%)#a*cnCv zjug1B|NO`^|0}smRnlgS9ibE8a{qJM?D6+-t&u3}PJPW9HQF$%$c}zAY!H^F5Jeom z*^u?jpRt)FeI7ca-wUWCgouY{(sR$&I7+)xl3zuaTGbwf1oHfkMB~t&A#8I>MpIp= zBA>BXKpaCDyLzU4cgu%sR*=fxue=am z5nj}5n;132=uBb1 zrSY8!NIR~)E248=5jkk9vMA^Z=Q%8-fMgbF;GXY0&D*Fl!j8undZbwJX$yr{cw_86 zxxft@K%v2-#?@OURWl^g&@~;e| zL{IKtvO;$s%viwlUqRaFhzzW>DYqL{97KDC=F0g4pG4Ppym)>(95R;@#A&)op4NKV zBc;!}Z(B$_m@PsI+(?c*)}J6VnZcZQXQ4>{+qTT<+K5LEYH@sAT3t6mG6&_wK(+Pr z*Y91%`3f(X!B>E2iZy~?ev;o|3i`}00v^b}&bZK*<$naO;LCym8~C|vc3gxyX@ZFHa-0$S^FzUjFCO1>b+q*qEZLa&S7?HV z)~`vnZk&0SlvMlV74HVSmwoJVu@5q#ygKL@PzC*^8s~^##g4Sn&^@Sii={x_ESn@Zc6!psl=h#HXl!5HFSOA93nY=WmAN zP=dwO$HVtwMZVYm?EInC?a|QV?hDIL{JTZ@+9bP0*)**l8~0$mRfABnPjsgE+I9L; zs@BdTqoBC*ZsK>fll|&tgN(-pb7n+cy!hj}N%kPwaSSF@)5T?xLeFGXnSUHpennav zXwhivct}GlL_R8fqR8y8u|!nVd~!*6$c{d0>C;0@WsB9E3ZKnW5I^W!_=UsrZkUVx zZYhD}L5Y$muqMSASnVCY7(=V(B4wbok)oa9WLKsR%_%@c520Vvpu9g1Eie^Fge+yS zdZK4CxPNV zFE&~7G(-Y}N%tg08?}(?7*U3{BXyn0poYf4f?n$01g6=#Um^9IxNlE=YxPuS0lKX5 zTI+SB5`|i8N!tO$YKv|X812{&vAWgC#7QGCA$)z|2jcwZA znDs5&+SlvVYfE`Ir5S42mVi}(+Fc8~XEW5L`rD^F739)a zhWzVDz#P=o?u7~54V|rIN)(NnStm~W05L0jaN`mLol(W6S=&Un)vp)mEf<`jTgKPN z4$}HHDs3Q)1Lmk8hQfpBW(>FzJ|-!TMO$`mPRcuHgA{p*yaVP)wi+xyj8h`M99@9HW~hXnMRO3(+%s{)1dOWh zwF+d7>M0%3b<3YkO{JTxmse3)m_!}&r_fz4eVZxBny>4k$1pl^w+Hevh!R0^%0dVv zs<`?DddC9DSpkNJH)();A92TMc>7)F>zH6rh%%#@LQ90^1iHq|Z;_#9; z`4&?LGq23}Oygf1=4X*p=iJNfzWf+6`y(GQYP!tBo1o{SDTDW72TVeJt>9bneY?t! zpMLJ&_qrCRT^DuBYD>0zd_l>Igh--T;CsIvJhCA~=*-SM-N2v=bN*0jM)izurOQLSO0m)Ga}<$qy4UX*u+AIP+TeQm9Gir`fdnESDg&X2!w=&)Bs%pev| zX}(dur1wZnq+PxXIZ?5U+bpvN%~?Jo);8m)nVGkY%g(P`n~2?Tp(J+y^9t-(WD1E` zY0zPJrDpsw4+5A?as^K0h@v3a+h21{CAM$V9c2eVv=66U5<5 zYp>41SJ->+Ryms(q?8f0NBn_U{4W2LBXr_W1zQYL&~1?W8@U`}%A|<1@Mv9JJmYxE zZqcD*X1^knt8I62gGuq+xO4$=nZ8(hiQ=tzzT~Q0 z-KIBP43eIDgnWP4?&f+avpK-+!iLeOJ@=vE;qjf+ME?-SfuVg?TM*3J)A_ng(M3$S zU-RtRZMLU_pK@B&ZN|LX+8vuL?c1My4kOv{JH)4kJCk4eQ?G!pizU6|C>hrSFXONA^+!!+4~RAdX#$>^P-Qi;Q1X}~OLCqrQZ>Ly7c@y+-~tUsHvAAH!Le`-MUVc3XO zl|%SN0EEIy4E6mcxzTP!Dwn$BD15J1iqWs!E2NEjj_kz`(Sv9r+ei?&>kD=OlJ=|X zPEG)&RiTJ_8DxZRr&6T%Go%ViG)Ae>9h3NU!f&uE>-zl4DC&_JTMnlNe{CF(XIGjExA^E}=C( zTe!xMD9or4C3>}Q^PU(FwNt;r=&`xz=XPpu;egh4!(#D%%2u-;2v4XiTUKfqO+&3l zR%dEz{%+#lidM1wit#Ty@ecX;8D9$Kp^C#V!F_#w3O1^(>V^B3mFfOwc2_!8CK?f? zA_mhd;t`l7Rdbe@GMK!v*N}1J`nz-8DcDz3xvd3u8+p0{3HnZk+k9>yRC;O7Co5dG zF9SCRyKK8=hITEe3J$kiOq1K&a>9ytM!`W5znc;fPG45|ETo_%7dvLXTvrXe#dwRZAD`$2UDysA-XuY0?W(CyqFQ7JN;Z{&xir(Hk4c#8LQI+U#@!eTIrmRe{ zLo8BSo++@D$4m$ocv!V=QGvi(hj+h85Yb~#ZBT$%xarNSL-+VCAW+}sbvsuRU^sqV zWfg0CS-EBJEyeCD8A9M!M&*kv@owhKqW41JPCfEx3|OhL*ihU*Tlw}xp7Ew)p{e1c z+*~pmt^^r!yn>_JGvhN;zLAF}C*j1318_smd;5&Ow%oy=gK>U(uk|fJdh46~6<9H= zs%n%*1bnm>x|N{(EL~A6@m3@xTds*0x+^P`Ew2r3Fcq6}+#%=`I9f)i_@SnMC}p4} z%*nbIer6DeU)ncR)T?ZXpuGBA|23-vO69V+#L!#5CZr7KIRF*UrpxvV{`admMtyA9xgOuE6TQy#;D!Fy0 zA3E@B-8!cqx#MRwCvF=$$jw>CxUJ^-TDYOeQ zB61KwkR~A_wGmFE#;+gYy#Z5`jBJIkgJY&UDJ;{}Ns`1`?IWuccv?~`sR>-h>6>4@ zuc^fH4uNlqsx)Cd{dMftgZJ#oJ1h4CF=yurT9KpRs41VDw$Z_Xqf~k&51f^K93jhK zR7!dx$+rf@=4VJpLW4@RP|kK+=EdKLtHRboIPvkD=yfmXDz#(YwXLIyGkc*DMtc7BO`9SOEx z8?Iwslu1XHg*sJLlDflJ1*OOVsrRV;*OmpS@xoB7Wq`4{xSgT>3b-S`qN|=}JHn5h zbr~5qb>pOQT{gC@UW3t6)++*pdMY4NNXXpo2q6KP+puzgmvHOvIR!?TDe-g_hRhib z`nP}1rU{@V5p@8J+gyN)xPN4r{>qHTRWxnZ@KL-0>N(%H`tJoYmT{c&bCn~jX0x<2 zvmZcVb`e3qz~b@Jua{i9ZR&KXt&{NadA{4Wv|BFh8S!ju5;<^8NmLw>5Tfr;4C2a@ z`{r0$TH1HDQ0k(FG68XxSm!B`n;D&+c6nqfdr&fxTm*9^jxw@4%d>IH{og1ih|f?* zmHK;%)dyM#*m4?>>}D^ccfxEjSq>)@C(HAGCv+$}YB3y}lLSHUbUSF;TWMOoP^{ML zq0I-(x%}V^96nOm^R9oHr9UvSzui14)J~~>cdMfhIRqpk5tjlbkpmRXHCGgDdPrMb zo#w@cwKP)uq9Jfr#fZLLx1TjS2AaX99b%8=^=~&J)HG9gu~C|!*ES+vN(~P1ed4RO zv@OVA;H>k_-y2@?^R}qtV0Nyzm$o+~<{4h)lZVflOYF6kiBxTZMmAF+sGBlNJr5&) z^kJZl2&pwWa`p5EKlt>(fqua3FeQv^E-(sku+a)dTJ9hCA-cgva%Bp7Uu9q><%5f$ zbY`e49_HJINK!6xSe~cc`nCXRR`(iq;s<$tH?0U#3l7nE+(p~!BQK^I{hi{EBLvG& zPL&9RCx2s;vUVBsCWL~hwt5i=5A-PpV{8WDLa?`pFBz0?=*otzm;uKy=#;eW$SyW_ z=KX7-3{T<21nJ`U%4(?}mlEHbqy!irgG|t7S&XD~S1ryF^gYy%<0ke?C+_huP^Itj z_-|x>vog>yj-ROft|3G0;$NAVM_<^#Pkt~3W!c%_wgeIOlelC+ec*1EaG}>5KRlm& zA5a0U*(md(O8L=pgSz%YHpp9Eg%~Sm-mB>UyNTdn)nF`jxUFHrs3)Szfn%;;ZFq6b ze5o{3p9b`O!yVp@G-e^Z6+)Zez&{P#8WDK9%z_rX z6GjQKMQ}9nw-}9)j?0PUNC+LZ#R^BBK&8qz@wP>cRNAd3`uYh(rL5>h7N&YuPptQp ziNSostO@rz;Lf9Mm)+gXl>yV`HjE;SDU+2I?(d(+>6O4)a(y7nc&pw>Xn1$FsKp}c z%FRSM#byu&mDVYMy+Uu>X`8fBIK)oYqTOqt$7oUMQ1Go)2G>(b$GJm!Js!k&BV=7* zgBXX~>H^@7qO?n4&okQ#fR5xJgd{Ea;kZ!%sK!V9&#x)-zx)(5{^j|t^C!QhFAqF! zx%FkXRTzNOKsvyrU)pm>R!Nfx!Q-6I(cT|%APjM&3|J)4jha6sOsV>B6Fh362_CZYMQC>N^ zS1gV6E#eO?7aW1@38`>~1ykx~9$5xZBQEJDs{J1-#uC}5Bt$BKy>H7yNEL(CJc8ZzgZp13s5jxLN|-m% ztBi;yCvP>^iNo**q6X{Prc9s(ypc*r8qGnRuSHJQuO;qy=6$1d1SBdZ=NV=Vshd0)Gn9msn{ ztGb;?N5k;N`^j#ur-{P8d&6EZFHzR;(>!(oUe-)kojdB*sH~MspoSSH$%ltLlh7@g z#b@>U$tnG=bFzh|@DlLPYpX6ToB#`DJEbKd1q1GHDKH3LZ7cVk$adi~f^>np8AG*L zQ{Y|_#MwwATMUk;c9S>Iqu3DFr{m?>-ESd1Z?=}ZJWzx8^8&o#`G+AD>5u$D&3HdU zs6eh$3$VbL{4C=-3Bgq#Y;43{@{QL|>NQx8Wd*h_o2~lC3c5DFq|49J#((t7BDGoE z&SgmvBzlVqMM>ozicgQHflqCfGtN|%{g6bQRt^2RZ(ChxRRtr67St9Kcuva}K_2o& zZ>0bT?@Sdsu*g*=hS;67WuscLrG|mVWG=4X-C$~|b|wg{?~NOLZFj~9LX`!p`mpgb7@S$Ik~UZ} zCXFi@&TZ^y;u8>l%F``%(Z>^1!02t#yE5~O@bK((7+{b9kaZPe#W<{!yCKmIar~f= zIS+*XGjI$kP2BXYW9yQ*Cuf8A;&tYV-F?jrw+oZ>`kEdPzBO&rg&9!HJ3a!>dr}m) zEJ)y^8m#$yI}wzGL%L8-zd}|aHknKjEAUCekf7vy#tz#UGOe>}!(6DQ9ZEgUR8yI< zYI(&omV6e6cU5 z6P8>>8Rp15LT1zi^Z>6WXnG{f7TZIXn<;@K1zD;QjP+2~!dfl^2f2S^+<7`jEB+^{ zlk?x)Yq0z^?wnWEv{|M93$%3ibItMa0|RIa3zhYZ(&if$OtZ;$F{%QOa!ovOqEVTKEbwV>3a zj+a1BPVx9~Dogh%g3b0a+fiYtm#68O4u=>oD;4H}Y{C^xRtJiH|DqU)$7eCv_p-e$ zpQ16Oonny8&#?3}lBvmS1nI~;#&KH^Ny*rC3B;wBPlrQg+ zroe_AZ=-QPU-?i~Mb?B>gK`BE(~a4U6fh93pYDT#%nNGB5n%; z8v45V>h>zjWsjjvJ~AegLe40&Okd|?R#rQMqPupkQOaae3{RvhBz=83E7R@-FX8pp z+Vm>fU`URV^05P`P)ZYzB~RnEK4sjQeP9QZ(1W$dQ_2U^JW_Db-LsvOa#pkAda6*v zfjZHp=*dwOa{Q82UHy11po z=JurhtEm2j? zkIF+~QXj1{z>2sgK+W<`;}G+|GPc#^|Ey(t1J*L(RlXIS{|t&j_-lwhSFi~%M88cG z|Dxt#sk0`xT>t4EommipMvkI#ERhVk!~SsX!sA26!DF*UV;^)NWJc+_1Uq^1jgT7^ zb3gvqqZ4}x$+uaE+b>K#;!B!H=N)ZNx6w_t`RYNstV_7-_eF!lQJ1HV6805S0mL|2 zk%6N%KQ&pdnF24n%_rYPI=;Pf6s-gD61)z=uTzTlI>bykwu|WVp!y(UPAL*wYe^q# zNKt2W2Pd@s9f7k7o2ctlX@bKL)^={;B{oN~_rLk1ZIKHx{T>shq!ZQut#?snXKnXJa~Z@B3Ex{%D1#j*)AgwMnyGDtajpvc)J1LHLD~J? zxmdo1so+mcr-$Im|A_9%sS-1^9sW&cF9 z@*Yjsjht#?DZUdKPX6*0iPf*u5|;Aih{DdksPZVR{`69d1z^75`76GR2iEh3^CmD8 z45#k?J-<)NcFvRkWFjnPwSCE#k6LJ0Qy68+nPJ^%UmDiD;IBg#3)q`)*FW%lGS{Ef z;f39UsJlZs!OfEEnv=qfKAL#`#CqwdN`3D%fA!_eO^`j>3iq>??%pO8(a*S&4SJqAm%Z~~Ih-Vj?$Hg=xf{pw94Is42!+;mO9+7xG&#T`(pZY8vL`h~*uyk!f5OMX;$bW=F64^PU>L8IvIKH+rcw zGMISh>0d(=(}Chd6_BA^c)#)rW_;;GHH8xb?6|&!GxbXfK?f&Kj~E2-yu0n{clnY_ zS#ekBmg7cV;V1@)T5jnF)-?+fUMQf}=!W}l*8&J1($Ay&RlEG`JM#{FtogjhbCq*@ z1U3tQV+`SUZTl7YD(}@iH3TOG;U67m2Fj2AlcEic8AX5~J64m@;jz3-x&d5y1v%9w z*b}4cDO9*L{uJU^Wu=+{pvqRx>W2c2q+NxgkKUWxbp{X%e#3jMb@1linL&{0YAYDIhW=C~|G zLL~AW@wa++5B9T1!o!@@4&#XheWub@cXv;R*;z+F_c{DlX1`w1Q~tGVD#!s@BPuKn zuwgO+bG|Y^u(Q5G6+`8gNt=+NrjM6r+2S_rOq;;SokCTIqST`3my5#1ZvvldOe(@7 zl*TsamrCgXKE|LXLg#*zEvJJk>?BF1i|Cv-A@%g`;ARTh|6K(oPTfr-|HG>!C{VTK zOQfsCOS|<>kGXMxkDrw(OGNjx#V6h?Ppf@MLgrpkGK!6J1j)ci)Qnvv{)bd)QyG}c zT1EluVH}5y{OM{LR@Fjr*qdIgl5R9x7xSgNkXfD22}nx=g#2W9*if+^^V=5i&l2#nas>`%P?C^e)zcZ)YmL!qnlPO)IV)OV((n?~e2;yW za9e&zTp(buz%0S|-P^Nx=9pb8-+<;U2|&Ai0J3<`EpOW+JnUv%zxg{C2^{xNTq;Dc zE~G(V1L>Srdt?3##>?u|Pslv)s%USaB$yMJL_B)yPk%M9r{u6D=MJ_kP$xe6jQH9} z-0Q`e%PhaTOh-*z9XXIP=eD)u2f^=digwPe8!}AdqhWR617>M=O_VZL6(0PFe4Pvt zU-)2OziDS_sA6iswbU&OsY3L9rPZtZa$D)$Xlvd}iMgLMgfsqToo(2e)yd>)KrR1s zJAhUB7vBP-=A|&&wj5O8q%7Vir7Dfb-SO_$Yk5PJp97Mkx)4y3mejd`9C3ovQR|mq z(Q%?%P(9_{S4cexgq2SkFGcgc$pE>< zk@8gO%(aK_*1IbObJkL;W=WBv9VWYXd;VSAW=5d;rp>Bu>Ra&qhm~BIJt6Wc6YGfb zd9CZA4Xt@1RA?728WSgR#-RKBP9Pl*im|uk@V;m_?J+eH3%ZsZhbE!?DM26`Omx0!ZwG=?h{YHDU`t{)emRzdrgailqJXX~a|qOfNkG3mlOef0Jq4Hf+1bluELmi1pl3us^_cW6Vu#rx7R9?tD&ewg!EO3wpwy$#mB`oFk&u7rs?0@ zN%U?I{L3NeYY#W+&9i90&Wt)Ik%>g$z`Wuj{=SP(qtX}>aGBNo*~SB4Nc_*6WdHxG z@Rt$%FI)wh|GQ`5?^yl+%JBc*i9gNaFTVLN{4o6A^~b-mj{o*m_^U$vZ(oJKYU=;? zRrqTW^WVM-f3N!g+gIT)!}njT3d>R#Uy%X!NJjKPKmb+t|H9DHdJc|8_WyyN|MkaT zq;RHjX}`mc^y#hq`jz%_hzi1TY*0?H5d^wTF)>qGnh_q~61Wp;g$$N8wY)OTq@`)u zE5j|$qJfxRe3&>{3Uy^07OgT{v+~2K>7#os`xpAUCWAV9A;wcrdekLDY@!>1G3e*+ zeskiBc4f&h1syo{6I;cD59iA^o=v&;#I255Wy&32aLKFV@2SMHmviULi50&^o6#`n zqx2+uepJuII%nGB%N&oMHNE2adh~jPPA?svgLivQ8b)UY<1ujLQS#UbMev8E+q|;O z#uJ8B$`Nxpe;b=rN3h#5TGwCM@u|;m-9_55I{wL=nLr5j(P=9ok~YH6-Pz+HU0!#M zRy~b{I={*#M^daq7p7`kOD0L8uDqRS`N>M|zVoC1)~N*IqW;nqhRV9yq@CSDdafh8 zFTmUL{hJyT_2$u3V^WR9zL7|ZRl&+zlSlQ++ub+EHMnW(FJ&f15p7(V)6$2vav5%i z8OD~{H#qv>S^;V%9$J}+E6V4gNC!n)dPS`wDbJ@SERXZj;O2=c7IsC**w}p+_Yzoz z-SjeS5GAoA){g* zVLqkCnTGoU@oJaZYp8{f$Fznood|5$2HpO;gA60V=r5ggCDp*A!{0?W@5e+vZI%-y z(l%7hqWqqOK3W$V&CTZpl<1Bh*q19odgDNO9ITmE89vQ6Np@5eyi1`m6i-@?DYGpZ z5bqpgJuSrH+K2^wWzHwkZo<&MWJF0CTUNQ|7zE#7 z3W19nIIu1hShzsAw~C36gnRz5^_~(D(@KAjr3_$`R^uSvKl#rgnm}JODGkc5u*#2_Opp)K-8dT5hLL&nVsl zKNg~(HEToi2Ll%WoDAJ&)qG9HqQj044IhE64s^Rr4j-u;7ShkgPPI(}TX+N~gZP*W zb4GIf_GPlmYhiO~`iH8O?h!L4NpU4J4{4>TP-~?&8BSx|+$4Qe+fZ>p|7n@l=`b<^ zZZyrJ4$tTFZt|2*2VcWrFjuSK6VPkpK8+DDGUitgadwH|NhlAhwq*^*2KtBavqP=Z`HyJ(Jh4gSD2`ic|YmclTs0r@L3JPGl^XyI1!;$XLyF zt@t-WN#HDRP%YQHoxA*`vDCP8czn-Ut2?T6=Sb003gCU4LL8`uw00I)RFbgPUXb(; zKNkFV9L34dvn_wJ2%}O_=9}n~S6w|wZ{fqdqP8B$;lVI)>4Zrgd(TtTmW@}~thgCV z8dlXcL|ZGBn^E+sl{aH)6F1#$?mg*7nTgo%3*ye{`zDYMD5lT_p?s#OAFjnO~N z?TnHI+{^vtJ%H7=PKM3PUpEQ6&fj5@JGhjnOSnP91nZ2b!IT_q&Bvf0f+>`-O{di! zunZ$5)iBsLIg-Hl2QA|FO=Sv`dxp9{Z=SnER(~`1Ph2(qRyy1H^TRz(!P*CBBaW4S zUFF;KG+_2>T>9i!Z}yAYY9@%4-B)X6rT$ zVeZ5F&!&$3KmYHP#Z_`{ubOVfWRqF_fLAnK&~<@sA!Fn|7H5;4?QC^rqXTM#uW{;f zE8uwPVD~k8*j3%(^DMW|&!e;Zyjpt9D^M4Nt#wHip0- z(=U7YxgPd)FLK3r>w#r<0KaW6nbXrH-|pAnDNVfVnLhWqU+@6u<$va5<`ZpG=m1o@ z3g9~b|2R?qCoA|6#a ziPqP1_(w&u8X5vb8U#HQ_;VVxhqbXS9}h)%Fp6I@NtK0#7)oEJr?th^;eV*^QT-sW z>oJ#FXanCxjXR;!X$2R}MrkAbb?FwXnH#ry?&&@5*{GJl@vY8NOOFy8Y6wi+s7o!e z;mGu!p+3zZm)`gxSKMBc%EpKSx{-z{!bSZ zeXwIAWYFZjLe*;CVFa!cceR}@ax=@sA6Nj-U3-@ls1r}9M^9G)C>?lJk5_DG*ki}J z?-%5aUVm6+)^}CeecHU|uu|eoHYvhADQjrfb2#9JZvsj4%QmN*AatAMGS_aVqV5aE zxz3hzn+EeQL#_i0#C~@W{qxWCirCe00P^&rKRy|g;x;4t1MZtgztCpPvkH6=+&a;T z>5ky@=p%>>o*7~Fkc*BVl`sZ78y_2v z{2k}o(QxmMNYSc9{0;Fc-Dt2LOcDC|E-O^)UeA|7G@YA=WZs0*ZLu^#HJ#_{ym%R~ z@0lAR8qZv#ar=Io6mT0_=#I&_H$r?SBtcrjS*{#^bf7AxF?0gtk);XsIt0>s|M{7&epFatFob+b=6L9&{ zY@N93c*D_@$sjNJ-yA~fB`9oVZvf|-%4z6Z|NLW?-V8RvnG3^3or1-Q)->KQN!O(K zG!&S3OVhO5yLJw2U>hW(nSSwJsv|JWh|Kw0Q5oiIk&`c7X?z$L_9~`RrL`B!O79Q% zTfCiK@0VX%%)f0scD)=lqt#leTWC{?isUoj)EVwY0A+C6W(-a)FvDb;Veq9y#+6g2 zc+NaR0YP#M9cbUE&TNn5=r;6Tjh>*|3p{QYuXt;I+R2+RcCNHaC~) z=obJV022U)|NrVXf9ID96jy%Tq~v|Vk;oDW~ubznby@&stMdA_eTL^cfkm`{+h{Oqrzk%G}!G-Ro<`E@us z+!!EKAOuI^s()EiJynFqn^9Y1Itp7~jBUpMm2l8hzpBvCUz3YMt@G9u#FgpO-$fjUyDhvw&u~$00&kq zKmU_P`~owl!wR9Lj^=!@N%!iU;(t*07GP0sUD&^R><(Iw$Ip;Rc~7Rk52v>5FW% z7AhA^XSnjtVisF_K_2gcNPE7VrB<8dU%l6je{-c#S^HhXxPg+V(|P&J^(DI z$ZGOJZH`Ct)zeOl+vhby^OV(5@p;p;85XR}H9J2=EI^^+vKZU-$S14U%57af`=;7p z;H6ssgBNdnI+iNJmKJrSZxNp&bM3igukwReqIdPbIC<(;4gY~TjfRIv1wV{SSA-7J^(dxH#*^|5Cuhx`rf7-z(J?mWE z$#B=(9m)L?3Bmco@t*|`a_^jbzEV`OsqgAC&+&E3c7JC|iDB8}&0{(@>+H0H*8D?em?y{bJd>ez>go3CyysK6j8tLl)p?*`e!0MspE{~lz z+q4RA7mZubVSgz3oR9sN>hftaDcOggB-!n~H(A`-%d=O(w$iV;=@%y5Sf9#Mu$>_dknGWl|7Ae!xbYDN-IHrY$ zSC)TY_{uLpY5t*^%$cDUv9}5blI^YHly)XJi;eo${379dB_kG5!g0}zzk9I^l|udb zDwOi@VmV*4(qF~Ri`A{~yvB77p_`#O7D{uj&eyV0QIL4&HHo7ptV;FM`V~jJk0jda z+C3_Mm30^wFk0DI*Z$5RBm3@Fk!inAs|gV`-ps@-(EW~8MK5IPo$4JGSrg0(#oTI`3R`{M_i`!7r*bS{<~ldCF6f|R{_ifwHn{NcoLSO1sKwT> zdVGM-Oi%XA+2hro%T2LTRhivnwQ$?KP5ZZ(U)ffd-gejNpe6Uw+IItNfpuYOvsY;q zP3QHRm3?F~*Sj2-aQ^q|_Dv7Jx;?qyZ5SYTbi(56C#IbYHZwS@c*H8457%MS zmoHL?NZI|+X?w^M%bu%qKF{fP^p=PNhdpne zn13x(oo}I-?L2cQ$5Z^w%dz2LveNjQp>0c&>}Ig)=x{K6?%S>w@1eo^b>_N@)jurS z^w!FJxTKN6a_XR|qwT5ON#0)LlPjwQ=f0j@bu#<75<}A-inF>`ujs!o>ztvNw{N9z`fkou@_a&dD}s-P@vJiZ zuG`zyt2HI8Wpbrxm5`AS$I&xFyyI<~H5@j4R$0a=5jnM6Vc%4yMFPuq=Kh}eSwq`y zpmE?eM}oHS=9VLscX9{Pm;A`v-|Bnmv{l&QZOj#~D_Ja+d04r^XRjD2eH^}SX2dDi znZ`%Tmxt~-rDUj4B3RA8=!EqJk$K_e;cI;=k`8FG&o`V`y6mvamA3B>YR6cOHBnkw z+y>vfcj@21xP~h1Z4Zb3o{Dkjl(v-<+Xd}5a~YkpU+dH^e$r)P$k%b!%t?Y9xIC{X zeZ1rz6n32RiDaE!UG$-VYs;eqlr9LaJ@I(e<9LZL6n(YwP&GU*G6@j8*gT!`D(e(ww=cl^c3@_LgY4Bx=Oe=y1;9I&&z) z+_r~5B-CF}u;dn>njq`U^p6W!{n>m1w6EFM*I85?|MpaVmornH#4|D0!CF

yuLI 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 H3Jm%`-*B~N diff --git a/examples/docs/p4-mode.el b/examples/docs/p4-mode.el deleted file mode 100644 index 77ebe56..0000000 --- a/examples/docs/p4-mode.el +++ /dev/null @@ -1,28 +0,0 @@ -;;; p4-mode.el --- Support for the P4 programming language - -;; Copyright (C) 2016- Barefoot Networks -;; Author: Vladimir Gurevich -;; Maintainer: Vladimir Gurevich -;; Created: 21 Jan 2016 -;; Version: 1.0 -;; Keywords: languages p4 -;; Homepage: http://p4.org - -;; This file is not part of GNU Emacs. - -;; This file is free software… - -;; Given two different versions of P4 language, P4_14 and P4_16 I decided to -;; split P4 mode into two separate ones: P4_14 and P4_16 -;; -;; This file therefore will load both modes and then the user can choose them -;; by using Emacs mode line. Unfortunately, at least for now, P4 programs have -;; the same extension (.p4) regardless of the version of the language. I would -;; recommend associating this extension with the mode you use most, while -;; getting into the habit of starting .p4 files with the mode line, e.g. -;; -;; /* -*- mode: P4_16 -*- */ - -(load "p4_14-mode") -(load "p4_16-mode") - diff --git a/examples/docs/p4_14-mode.el b/examples/docs/p4_14-mode.el deleted file mode 100644 index 282bb42..0000000 --- a/examples/docs/p4_14-mode.el +++ /dev/null @@ -1,264 +0,0 @@ -;;; p4_14-mode.el --- Support for the P4_14 programming language - -;; Copyright (C) 2016- Barefoot Networks -;; Author: Vladimir Gurevich -;; Maintainer: Vladimir Gurevich -;; Created: 21 Jan 2016 -;; Version: 1.0 -;; Keywords: languages p4_14 -;; Homepage: http://p4_14.org - -;; This file is not part of GNU Emacs. - -;; This file is free software… - -;; Placeholder for user customization code -(defvar p4_14-mode-hook nil) - -(defun p4_14-electric-brace (arg) - "Insert a brace." - (interactive "*P") - (self-insert-command (prefix-numeric-value arg)) - (save-excursion - (move-beginning-of-line nil) - (indent-for-tab-command))) - -;; Define the keymap (for now it is pretty much default) -(defvar p4_14-mode-map - (let ((map (make-keymap))) - (define-key map "\C-j" 'newline-and-indent) - (define-key map "{" 'p4_14-electric-brace) - (define-key map "}" 'p4_14-electric-brace) - (define-key map "\C-c\C-c" 'comment-region) - map) - "Keymap for P4_14 major mode") - -;; Syntactic HighLighting - -;; Main keywors (declarations and operators) -(setq p4_14-keywords - '("action" "action_profile" "apply" "attribute" - "blackbox" "blackbox_type" - "calculated_field" "counter" "control" "default" - "else" "extern" "extern_type" "extract" - "field_list" "field_list_calculation" "header" "header_type" - "if" "hit" "metadata" "meter" "method" "miss" - "parser" "parser_drop" "parser_exception" "parser_value_set" - "register" - "return" "select" "table" - )) - -(setq p4_14-pragma - '("@pragma") - ) - -(setq p4_14-attributes - '("actions" "action_selector" "algorithm" "attributes" - "direct" "dynamic_action_selection" - "fields" - "default_action" "support_timeout" - "size" "max_size" "min_size" - "in" "inout" "out" "input" "instance_count" - "layout" "output_width" "reads" - "update" "verify" - "witdh" "min_width" - "optional" - "type" - "reg" - "writes" - "expression_local_variables" - ;;; stateful_apu_blackbox-specific attributes - "update_lo_1_value" "update_lo_2_value" - "update_hi_1_value" "update_hi_2_value" - "update_lo_1_predicate" "update_lo_2_predicate" - "update_hi_1_predicate" "update_hi_2_predicate" - "output_value" "output_predicate" "output_dst" - "initial_register_lo_value" "initial_register_hi_value" - "selector_binding" - "math_unit_input" "math_unit_output_scale" - "math_unit_exponent_shift" "math_unit_exponent_invert" - "math_unit_lookup_table" - "reduction_or_group" - "stateful_logging_mode" - ;;; lpf-specific attributes - "filter_input" - ;;; wred-specific attributes - "wred_input" - )) - -(setq p4_14-variables - '( - ;;; stateful_apu_blackbox-specific variables - "alu_lo" "alu_hi" - "register_lo" "register_hi" - "math_unit" - "condition_lo" "condition_hi" "predicate" "combined_predicate" - "output_value" "output_predicate" "output_dst" - ;;; lpf-specific variables - "filter_input" - ;;; wred-specific attributes - "wred_input")) - -(setq p4_14-operations - '("and" "or" "not")) - -(setq p4_14-constants - '("false" "true" "static" "dynamic" - "exact" "ternary" "valid" "range" - "bytes" "packets")) - -(setq p4_14-types - '("bit" "int" "saturated" "signed" "string" "expression")) - -(setq p4_14-primitives - '("add_header" "remove_header" "copy_header" "push" "pop" - "no_op" "drop" - "add" "add_to_field" "subtract" - "bit_and" "bit_andca" "bit_andcb" - "bit_or" "bit_orca" "bit_orcb" - "bit_xor" "bit_xnor" "bit_nand" "bit_nor" - "bit_not" - "bypass_egress" - "exit" - "funnel_shift_right" - "invalidate" - "mark_for_drop" - "max" "min" - "execute_stateful_alu" "execute_stateful_alu_from_hash" - "execute_stateful_log" - "modify_field_with_hash_based_offset" - "modify_field_with_rng_uniform" - "resubmit" - "clone_ingress_pkt_to_egress" "clone_i2e" - "clone_egress_pkt_to_egress" "clone_e2e" - "recirculate" - "generate_digest" - "set_metadata" "modify_field" - "count" "execute_meter" - "read_bit" "read_bitc" "set_bit" "set_bitc" "clr_bit" "clr_bitc")) - -(setq p4_14-cpp - '("#include" - "#define" "#undef" - "#if" "#ifdef" "#ifndef" - "#elif" "#else" - "#endif" - "defined" - "#line" "#file")) - -(setq p4_14-cppwarn - '("#error" "#warning")) - -;; Optimize the strings -(setq p4_14-keywords-regexp (regexp-opt p4_14-keywords 'words)) -(setq p4_14-pragma-regexp (regexp-opt p4_14-pragma 1)) -(setq p4_14-attributes-regexp (regexp-opt p4_14-attributes 'words)) -(setq p4_14-variables-regexp (regexp-opt p4_14-variables 'words)) -(setq p4_14-operations-regexp (regexp-opt p4_14-operations 'words)) -(setq p4_14-constants-regexp (regexp-opt p4_14-constants 'words)) -(setq p4_14-types-regexp (regexp-opt p4_14-types 'words)) -(setq p4_14-primitives-regexp (regexp-opt p4_14-primitives 'words)) -(setq p4_14-cpp-regexp (regexp-opt p4_14-cpp 1)) -(setq p4_14-cppwarn-regexp (regexp-opt p4_14-cppwarn 1)) - - -;; create the list for font-lock. -;; each category of keyword is given a particular face -(defconst p4_14-font-lock-keywords - (list - (cons p4_14-cpp-regexp font-lock-preprocessor-face) - (cons p4_14-cppwarn-regexp font-lock-warning-face) - (cons p4_14-types-regexp font-lock-type-face) - (cons p4_14-constants-regexp font-lock-constant-face) - (cons p4_14-attributes-regexp font-lock-builtin-face) - (cons p4_14-variables-regexp font-lock-variable-name-face) - (cons p4_14-primitives-regexp font-lock-function-name-face) - (cons p4_14-operations-regexp font-lock-builtin-face) - (cons p4_14-keywords-regexp font-lock-keyword-face) - (cons p4_14-pragma-regexp font-lock-keyword-face) - (cons "\\(\\w*_t +\\)" font-lock-type-face) - (cons "\\(<[^>]+>\\)" font-lock-string-face) - (cons "\\([^_A-Za-z]0x[0-9A-Fa-f]+\\)" font-lock-constant-face) - (cons "\\([^_A-Za-z]0b[01]+\\)" font-lock-constant-face) - (cons "\\([^_A-Za-z][+-]?[0-9]+\\)" font-lock-constant-face) -;; (cons "\\(\\w*\\)" font-lock-variable-name-face) - ) - "Default Highlighting Expressions for P4_14") - -(defvar p4_14-mode-syntax-table - (let ((st (make-syntax-table))) - (modify-syntax-entry ?_ "w" st) - (modify-syntax-entry ?/ ". 124b" st) - (modify-syntax-entry ?* ". 23" st) - (modify-syntax-entry ?\n "> b" st) - st) - "Syntax table for p4_14-mode") - -;;; Indentation -(defvar p4_14-indent-offset 4 - "Indentation offset for `p4_14-mode'.") - -(defun p4_14-indent-line () - "Indent current line for any balanced-paren-mode'." - (interactive) - (let ((indent-col 0) - (indentation-increasers "[{(]") - (indentation-decreasers "[})]") - ) - (save-excursion - (beginning-of-line) - (condition-case nil - (while t - (backward-up-list 1) - (when (looking-at indentation-increasers) - (setq indent-col (+ indent-col p4_14-indent-offset)))) - (error nil))) - (save-excursion - (back-to-indentation) - (when (and (looking-at indentation-decreasers) - (>= indent-col p4_14-indent-offset)) - (setq indent-col (- indent-col p4_14-indent-offset)))) - (indent-line-to indent-col))) - -;;; Imenu support -(require 'imenu) -(setq p4_14-imenu-generic-expression - '( - ("Controls" "^control *\\([A-Za-z0-9_]*\\)" 1) - ("Externs" "^blackbox *\\([A-Za-z0-9_]*\\) *\\([A-Za-z0-9_]*\\)" 2) - ("Registers" "^register *\\([A-Za-z0-9_]*\\)" 1) - ("Meters" "^meter *\\([A-Za-z0-9_]*\\)" 1) - ("Counters" "^counter *\\([A-Za-z0-9_]*\\)" 1) - ("Tables" "^table *\\([A-Za-z0-9_]*\\)" 1) - ("Actions" "^action *\\([A-Za-z0-9_]*\\)" 1) - ("Parser States" "^parser *\\([A-Za-z0-9_]*\\)" 1) - ("Header Types" "^header_type *\\([A-Za-z0-9_]*\\)" 1) - )) - -;;; Cscope Support -(require 'xcscope) - -;; Put everything together -(defun p4_14-mode () - "Major mode for editing P4_14 programs" - (interactive) - (kill-all-local-variables) - (set-syntax-table p4_14-mode-syntax-table) - (use-local-map p4_14-mode-map) - (set (make-local-variable 'font-lock-defaults) '(p4_14-font-lock-keywords)) - (set (make-local-variable 'indent-line-function) 'p4_14-indent-line) - (setq major-mode 'p4_14-mode) - (setq mode-name "P4_14") - (setq imenu-generic-expression p4_14-imenu-generic-expression) - ;; Setting this to nil causes indentation to use only space - ;; characters, never tabs. - (setq indent-tabs-mode nil) - (setq comment-start "// ") - (setq comment-end "") - (imenu-add-to-menubar "P4_14") - (cscope-minor-mode) - (run-hooks 'p4_14-mode-hook) -) - -;; The most important line -(provide 'p4_14-mode) diff --git a/examples/docs/p4_16-mode.el b/examples/docs/p4_16-mode.el deleted file mode 100644 index 5e30440..0000000 --- a/examples/docs/p4_16-mode.el +++ /dev/null @@ -1,238 +0,0 @@ -;;; p4_16-mode.el --- Support for the P4_16 programming language - -;; Copyright (C) 2016- Barefoot Networks -;; Author: Vladimir Gurevich -;; Maintainer: Vladimir Gurevich -;; Created: 15 April 2017 -;; Version: 0.2 -;; Keywords: languages p4_16 -;; Homepage: http://p4.org - -;; This file is not part of GNU Emacs. - -;; This file is free software… - -;; This mode has preliminary support for P4_16. It covers the core language, -;; but it is not clear yet, how we can highlight the indentifiers, defined -;; for a particular architecture. Core library definitions are included - -;; Placeholder for user customization code -(defvar p4_16-mode-hook nil) - -(defun p4_16-electric-brace (arg) - "Insert a brace." - (interactive "*P") - (self-insert-command (prefix-numeric-value arg)) - (save-excursion - (move-beginning-of-line nil) - (indent-for-tab-command))) - -;; Define the keymap (for now it is pretty much default) -(defvar p4_16-mode-map - (let ((map (make-keymap))) - (define-key map "\C-j" 'newline-and-indent) - (define-key map "{" 'p4_16-electric-brace) - (define-key map "}" 'p4_16-electric-brace) - (define-key map "\C-c\C-c" 'comment-region) - map) - "Keymap for P4_16 major mode") - -;; Syntactic HighLighting - -;; Main keywors (declarations and operators) -(setq p4_16-keywords - '("action" "apply" - "control" - "default" - "else" "enum" "extern" "exit" - "header" "header_union" - "if" - "match_kind" - "package" "parser" - "return" - "select" "state" "struct" "switch" - "table" "transition" "tuple" "typedef" - "verify" - )) - -(setq p4_16-annotations - '("@name" "@metadata" "@alias" - )) - -(setq p4_16-attributes - '("const" "in" "inout" "out" - ;; Tables - "key" "actions" "default_action" "entries" "implementation" - "counters" "meters" - )) - -(setq p4_16-variables - '("packet_in" "packet_out" - )) - -(setq p4_16-operations - '("&&&" ".." "++" "?" ":")) - -(setq p4_16-constants - '( - ;;; Don't care - "_" - ;;; bool - "false" "true" - ;;; error - "NoError" "PacketTooShort" "NoMatch" "StackOutOfBounds" - "OverwritingHeader" "HeaderTooShort" "ParserTiimeout" - ;;; match_kind - "exact" "ternary" "lpm" "range" - ;;; We can add constants for supported architectures here - )) - -(setq p4_16-types - '("bit" "bool" "int" "varbit" "void" "error" - )) - -(setq p4_16-primitives - '( - ;;; Header methods - "isValid" "setValid" "setInvalid" - ;;; Table Methods - "hit" "action_run" - ;;; packet_in methods - "extract" "lookahead" "advance" "length" - ;;; packet_out methods - "emit" - ;;; Known parser states - "accept" "reject" - ;;; misc - "NoAction" - )) - -(setq p4_16-cpp - '("#include" - "#define" "#undef" - "#if" "#ifdef" "#ifndef" - "#elif" "#else" - "#endif" - "defined" - "#line" "#file")) - -(setq p4_16-cppwarn - '("#error" "#warning")) - -;; Optimize the strings -(setq p4_16-keywords-regexp (regexp-opt p4_16-keywords 'words)) -(setq p4_16-annotations-regexp (regexp-opt p4_16-annotations 1)) -(setq p4_16-attributes-regexp (regexp-opt p4_16-attributes 'words)) -(setq p4_16-variables-regexp (regexp-opt p4_16-variables 'words)) -(setq p4_16-operations-regexp (regexp-opt p4_16-operations 'words)) -(setq p4_16-constants-regexp (regexp-opt p4_16-constants 'words)) -(setq p4_16-types-regexp (regexp-opt p4_16-types 'words)) -(setq p4_16-primitives-regexp (regexp-opt p4_16-primitives 'words)) -(setq p4_16-cpp-regexp (regexp-opt p4_16-cpp 1)) -(setq p4_16-cppwarn-regexp (regexp-opt p4_16-cppwarn 1)) - - -;; create the list for font-lock. -;; each category of keyword is given a particular face -(defconst p4_16-font-lock-keywords - (list - (cons p4_16-cpp-regexp font-lock-preprocessor-face) - (cons p4_16-cppwarn-regexp font-lock-warning-face) - (cons p4_16-types-regexp font-lock-type-face) - (cons p4_16-constants-regexp font-lock-constant-face) - (cons p4_16-attributes-regexp font-lock-builtin-face) - (cons p4_16-variables-regexp font-lock-variable-name-face) - ;;; This is a special case to distinguish the method from the keyword - (cons "\\.apply" font-lock-function-name-face) - (cons p4_16-primitives-regexp font-lock-function-name-face) - (cons p4_16-operations-regexp font-lock-builtin-face) - (cons p4_16-keywords-regexp font-lock-keyword-face) - (cons p4_16-annotations-regexp font-lock-keyword-face) - (cons "\\(\\w*_t +\\)" font-lock-type-face) - (cons "[^A-Z_][A-Z] " font-lock-type-face) ;; Total hack for templates - (cons "<[A-Z, ]*>" font-lock-type-face) - (cons "\\(<[^>]+>\\)" font-lock-string-face) - (cons "\\([^_A-Za-z]\\([0-9]+w\\)?0x[0-9A-Fa-f]+\\)" font-lock-constant-face) - (cons "\\([^_A-Za-z]\\([0-9]+w\\)?0b[01]+\\)" font-lock-constant-face) - (cons "\\([^_A-Za-z][+-]?\\([0-9]+w\\)?[0-9]+\\)" font-lock-constant-face) - ;;(cons "\\(\\w*\\)" font-lock-variable-name-face) - ) - "Default Highlighting Expressions for P4_16") - -(defvar p4_16-mode-syntax-table - (let ((st (make-syntax-table))) - (modify-syntax-entry ?_ "w" st) - (modify-syntax-entry ?/ ". 124b" st) - (modify-syntax-entry ?* ". 23" st) - (modify-syntax-entry ?\n "> b" st) - st) - "Syntax table for p4_16-mode") - -;;; Indentation -(defvar p4_16-indent-offset 4 - "Indentation offset for `p4_16-mode'.") - -(defun p4_16-indent-line () - "Indent current line for any balanced-paren-mode'." - (interactive) - (let ((indent-col 0) - (indentation-increasers "[{(]") - (indentation-decreasers "[})]") - ) - (save-excursion - (beginning-of-line) - (condition-case nil - (while t - (backward-up-list 1) - (when (looking-at indentation-increasers) - (setq indent-col (+ indent-col p4_16-indent-offset)))) - (error nil))) - (save-excursion - (back-to-indentation) - (when (and (looking-at indentation-decreasers) - (>= indent-col p4_16-indent-offset)) - (setq indent-col (- indent-col p4_16-indent-offset)))) - (indent-line-to indent-col))) - -;;; Imenu support -(require 'imenu) -(setq p4_16-imenu-generic-expression - '( - ("Controls" "^ *control +\\([A-Za-z0-9_]*\\)" 1) - ("Externs" "^ *extern +\\([A-Za-z0-9_]*\\) *\\([A-Za-z0-9_]*\\)" 2) - ("Tables" "^ *table +\\([A-Za-z0-9_]*\\)" 1) - ("Actions" "^ *action +\\([A-Za-z0-9_]*\\)" 1) - ("Parsers" "^ *parser +\\([A-Za-z0-9_]*\\)" 1) - ("Parser States" "^ *state +\\([A-Za-z0-9_]*\\)" 1) - ("Headers" "^ *header +\\([A-Za-z0-9_]*\\)" 1) - ("Header Unions" "^ *header_union +\\([A-Za-z0-9_]*\\)" 1) - ("Structs" "^ *struct +\\([A-Za-z0-9_]*\\)" 1) - )) - -;;; Cscope Support -(require 'xcscope) - -;; Put everything together -(defun p4_16-mode () - "Major mode for editing P4_16 programs" - (interactive) - (kill-all-local-variables) - (set-syntax-table p4_16-mode-syntax-table) - (use-local-map p4_16-mode-map) - (set (make-local-variable 'font-lock-defaults) '(p4_16-font-lock-keywords)) - (set (make-local-variable 'indent-line-function) 'p4_16-indent-line) - (setq major-mode 'p4_16-mode) - (setq mode-name "P4_16") - (setq imenu-generic-expression p4_16-imenu-generic-expression) - ;; Setting this to nil causes indentation to use only space - ;; characters, never tabs. - (setq indent-tabs-mode nil) - (setq comment-start "// ") - (setq comment-end "") - (imenu-add-to-menubar "P4_16") - (cscope-minor-mode) - (run-hooks 'p4_16-mode-hook) -) - -;; The most important line -(provide 'p4_16-mode) diff --git a/examples/docs/p4dbg_user_guide.md b/examples/docs/p4dbg_user_guide.md deleted file mode 100644 index 4d3bb97..0000000 --- a/examples/docs/p4dbg_user_guide.md +++ /dev/null @@ -1,282 +0,0 @@ - - -**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)* - -- [P4 Debugger (p4dbg) user guide](#p4-debugger-p4dbg-user-guide) - - [List of commands](#list-of-commands) - - [General information about the debugger](#general-information-about-the-debugger) - - [The packet id](#the-packet-id) - - [Special field names](#special-field-names) - - [A more detailed list of commands](#a-more-detailed-list-of-commands) - - [`set_wp (w)`](#set_wp-w) - - [`unset_wp`](#unset_wp) - - [`show_wps`](#show_wps) - - [`break (b)`](#break-b) - - [`delete (d)`](#delete-d) - - [`show_bps`](#show_bps) - - [`continue (c)`](#continue-c) - - [`next (n)`](#next-n) - - [`print (p)`](#print-p) - - [`backtrace (bt)`](#backtrace-bt) - - [`break_packet_in`](#break_packet_in) - - [`remove_packet_in`](#remove_packet_in) - - [`stop_packet_in`](#stop_packet_in) - - [`resume_packet_in`](#resume_packet_in) - - [`filter_notifications`](#filter_notifications) - - [`reset`](#reset) - - [`skip` -- experimental](#skip----experimental) - - [`skip_all` -- experimental](#skip_all----experimental) - - [`CLI` -- experimental](#cli----experimental) - - [Future extensions](#future-extensions) - - - -# P4 Debugger (p4dbg) user guide - -## List of commands - -Here is a full list of commands with a short description. More details will be -found for each command later in this document. The last 3 commands (`skip`, -`skip_all` and `CLI`) are still experimental. - -| Command name | Short | Description | -| ---------------------- | ----- | ----------- | -| `set_wp` | `w` | Sets a watchpoint on a field | -| `unset_wp` | `N/A` | Unsets watchpoint | -| `show_wps` | `N/A` | Lists active watchpoints | -| `break` | `b` | Breaks at a specific "P4 object" | -| `delete` | `d` | Deletes breakpoint | -| `show_bps` | `N/A` | Lists active breakpoints | -| `continue` | `c` | Starts / resumes packet processing at the switch | -| `next` | `n` | Go to next update (field or “P4 context”) | -| `print` | `p` | Prints the value of a field | -| `backtrace` | `bt` | Prints a backtrace of “P4 contexts” entered by the packet | -| `break_packet_in` | `N/A` | Breaks every time a packet enters the switch | -| `remove_packet_in` | `N/A` | Undoes the break_packet_in command | -| `stop_packet_in` | `N/A` | Prevents the switch from accepting any more packets | -| `resume_packet_in` | `N/A` | Undoes the stop_packet_in command | -| `filter_notifications` | `N/A` | Restricts the received notifications to a subset of packets | -| `reset` | `N/A` | Resets all the debugger’s state | -| `skip` (exp) | `N/A` | Skips all future notifications for the current packet | -| `skip_all` (exp) | `N/A` | Skips all future notifications for the current packet and its descendants | -| `CLI` (exp) | `N/A` | Connects to the switch using the Runtime CLI and issues a command | - -## General information about the debugger - -### The packet id - -Each packet going through the switch can be identified using its "full packet -id", which is of the form `.`. Note that every time you receive an -event notification in the debugger, the packet id will be included in the -displayed message. The `` is incremented by one every time a new packet is -received by the switch. The `` is incremented by one every time a new -packet is generated by the switch in response to the same incoming packet. The -first packet received by the switch on any ingress port will have id `0.0`. The -second packet will have id `1.0`, and so on… So when is the `` ever used? -Let’s assume your target switch supports multicast and that packet `3.0` is -replicated 3 times (i.e. out of 3 different ports). Each one of these 3 copies -will receive a different ``, but the `` will remain the same. In our -case, the three full packet ids will be `3.1`, `3.2` and `3.3`. The same goes -for mirroring. - -The debugger keeps track of the "current packet id", which is the id of the last -packet for which an event notification was received by the debugger. For several -commands (e.g. `print`), the packet id can be omitted from the parameters which -will cause the debugger to use the stored "current packet id". - -### Special field names - -The debugger lets you access some special fields which are not part of the -headers or metadata. All these special names start with character `$`. We only -support one for now, `$cond`, which holds the result of the last P4 condition -evaluated by the switch. In the future, we plan on adding other such special -fields (e.g. `$action`, for the last action selected by a table lookup). Note -that all these special fields have a 32-bit width. - -## A more detailed list of commands - -### `set_wp (w)` -Usage: `set_wp ` -For example, -``` -set_wp ipv4.srcAddr -w ipv4.srcAddr -``` - -Sets a watchpoint on the provided field. For every packet, the switch will stop -running every time the field is written to, and the debugger will be -notified. Of course this does not apply to packets for which notifications are -being filtered out (see the `filter_notifications` command) or are being skipped -(see `skip` and `skip_all`). Note that a notification is generated every time a -write is done on the field, even if the field actually keeps the same value. -The field name can take the special value `$cond`, which holds the result of the -last condition evaluated. - -### `unset_wp` -Usage: `unset_wp ` -For example, -``` -unset_wp ipv4.srcAddr -``` - -Unsets a watchpoint which was previously set with the `set_wp` command. The -debugger will stop notifying the user when a write operation is performed on the -field. - -### `show_wps` -Usage: `show_wps` - -Prints a list of all the currently active watchpoints. - -### `break (b)` -Usage: `break ` -For example, -``` -break parser start -break pipeline ingress -b table ipv4_lpm -``` - -Sets a breakpoint on a given P4 object. Every time a packet is about to "enter" -this object, the switch will pause and the debugger will be notified. The valid -"p4 object types" are: parser, parse_state, pipeline, table, condition, action, -deparser. - -### `delete (d)` -Usage: `delete ` -For example, -``` -delete parser start -d pipeline ingress -``` - -Removes a breakpoint which was previously set with the break command. See -`break` command description for more details and the list of valid "p4 object -types". - -### `show_bps` -Usage: `show_bps` - -Prints a list of all the currently active breakpoints. - -### `continue (c)` -Usage: `continue` - -Starts or resumes packet processing. The switch will continue processing packet -until the next watchpoint or breakpoint event, at which point it will once again -stop all packet processing. If you forgot to set a watchpoint or breakpoint -before issuing the `continue` command you can still pause the switch by sending -an Interrupt (`Ctrl-C`) to the debugger process; you will then be able to set a -watchpoint. - -### `next (n)` -Usage: `next` - -Resumes packet processing until the next event. An event is either a field -modification or a packet entering a P4 object (e.g. a table). Unlike the -`continue` command, which will only stop the switch for watchpoints and -breakpoints set by the user, `next` will stop for all events, unless the packet -triggering this event has been explicitly excluded using the -`filter_notifications` or `skip(_all)` commands. - -### `print (p)` -Usage: `print ` - -Prints the value of a field for a given packet. The packet id needs to follow -the format `.`. If the packet id is omitted, the debugger will use the -"current packet id", which is the id of the last packet for which a notification -was received. - -### `backtrace (bt)` -Usage: `backtrace ` - -Returns the list of P4 objects that the packet is currently traversing, in -descending order. The packet id can be omitted and the "current packet id" will -be used. - -Here are examples of possible outputs: - - `parser 'parser' -> parse state 'parse_ethernet'` - - `pipeline 'ingress' -> table 'ipv4_lpm' -> action 'set_nhop'` - -### `break_packet_in` -Usage: `break_packet_in` - -When using this command, the switch will break every time a new packet is -created, unless the corresponding packet id was excluded (see -`filter_notifications`). This new packet can either be a new incoming packet -(i.e. with a new ``) or a new "copy" of the same incoming packet (i.e. same -`` but new ``). - -### `remove_packet_in` -Usage: `remove_packet_in` - -Cancels `break_packet_in`. No effect if `break_packet_in` was not previously -called. - -### `stop_packet_in` -Usage: `stop_packet_in` - -Prevents the switch from accepting any more incoming packets. Note that this -does not apply to new "copies" of a packet already being processed by the -switch. - -### `resume_packet_in` -Usage: `resume_packet_in` - -Cancels `stop_packet_in`. No effect if `stop_packet_in` was not previously -called. - -### `filter_notifications` -Usage: `filter_notifications *` -For example, -``` -filter_notifications 7.0 -filter_notifications 8.1 8.2 10.0 -filter_notifications 8 -filter_notifications 8 11.0 13 -filter_notifications -``` - -Limit the event notifications displayed by the debugger to those concerning one -of these packet ids. A packet id in the list can either be a regular full packet -id of the form `.` or simply a ``, in which case all -notifications for packets with this `` will be taken into account -(independently of the value of the ``). When `filter_notifications` is -used without any arguments (i.e. no packet ids specified), the notifications -filter will be reset and all notifications will once again be displayed by the -debugger. - -### `reset` -Usage: `reset` - -Resets all the debugger's state (e.g. watchpoints, breakpoints, notification -filters...). - -### `skip` -- experimental -Usage: `skip` - -Skips all future notifications for the "current packet id". Cannot be undone. - -### `skip_all` -- experimental -Usage: `skip_all` - -Skips all future notifications for the "current packet id" and all the packets -sharing the same ``. Cannot be undone. - -### `CLI` -- experimental -Usage: `CLI ` -For example, -``` -CLI table_dump ipv4_lpm -``` - -Opens a Thrift connection to the switch and issues a standard runtime CLI -command. Only "standard" commands are supported (no multicast PRE support). - -## Future extensions - -We are planning on supporting the following features in the future: - - support for stateful objects (meters, counters, registers) - - better P4 code integration: display current P4 code, line breakpoints - - conditional watchpoints / breakpoints (e.g. iff packet has IPv4 address - 10.0.0.1) diff --git a/examples/docs/resources.md b/examples/docs/resources.md deleted file mode 100644 index 65da417..0000000 --- a/examples/docs/resources.md +++ /dev/null @@ -1,7 +0,0 @@ -# Resources - -* [Repository](https://github.com/p4lang) -* [Official Tutorials](https://github.com/p4lang/tutorials) -* [P4-Guide](https://github.com/jafingerhut/p4-guide) -* [Presentation](https://github.com/p4lang/tutorials/blob/master/P4D2_2017_Fall/P4_tutorial_labs.pdf) -* [BMV2 Backend](https://github.com/p4lang/p4c/tree/master/backends/bmv2) \ No newline at end of file diff --git a/examples/docs/simple_switch.md b/examples/docs/simple_switch.md deleted file mode 100644 index 633983a..0000000 --- a/examples/docs/simple_switch.md +++ /dev/null @@ -1,99 +0,0 @@ -# The BMv2 Simple Switch target - -The bmv2 framework lets developpers implement their own P4-programmable -architecture as a software switch. The simple_switch architecture is the -de-facto architecture for most users, as it is roughly equivalent to the -"abstract switch model" described in the P4_14 spec. - -This document aims at providing P4 programmers with important information -regarding the simple_switch architecture. - -## Intrinsic metadata - -Each architecture usually defines its own intrinsic metadata fields, which are -used in addition to the standard metadata fields to offer more advanced -features. In the case of simple_switch, we have two separate intrinsic metadata -headers. These headers are not strictly required by the architecture as it is -possible to write a P4 program and run it through simple_switch without them -being defined. However, their presence is required to enable some features of -simple_switch. For most of these fields, there is no strict requirement as to -the bitwidth, but we recommend that you follow our suggestions below. Some of -these intrinsic metadata fields can be accessed (read and / or write) directly, -others should only be accessed through primitive actions. - -### `intrinsic_metadata` header - -We recommend that you define and instantiate this metadata header for every P4 -program that you write for the simple_switch architecture, with the following -P4-14 code: -``` -header_type intrinsic_metadata_t { - fields { - ingress_global_timestamp : 48; - lf_field_list : 8; - mcast_grp : 16; - egress_rid : 16; - resubmit_flag : 8; - recirculate_flag : 8; - } -} -metadata intrinsic_metadata_t intrinsic_metadata; -``` -- `ingress_global_timestamp`: a timestamp, in microseconds, set when the packet -shows up on ingress. The clock is set to 0 every time the switch starts. This -field can be read directly from either pipeline (ingress and egress) but should -not be written to. -- `lf_field_list`: used to store the learn id when calling `generate_digest`; do -not access directly. -- `mcast_grp`: needed for the multicast feature. This field needs to be written -in the ingress pipeline when you wish the packet to be multicast. A value of 0 -means no multicast. This value must be one of a valid multicast group configured -through bmv2 runtime interfaces. -- `egress_rid`: needed for the multicast feature. This field is only valid in -the egress pipeline and can only be read from. It is used to uniquely identify -multicast copies of the same ingress packet. -- `resubmit_flag`: should not be accessed directly. It is set by the `resubmit` -action primitive and is required for the resubmit feature. As a remainder, -`resubmit` needs to be called in the ingress pipeline. -- `recirculate_flag`: should not be accessed directly. It is set by the -`recirculate` action primitive and is required for the recirculate feature. As a -remainder, `recirculate` needs to be called from the egress pipeline. - -### `queueing_metadata` header - -You only need to define this P4 header if you want to access queueing -information - as a remainder, the packet is queued between the ingress and -egress pipelines. Note that this header is "all or nothing". Either you do not -define it or you define it with all its fields (there are 4 of them). We -recommend that you use the following P4_14 code: -``` -header_type queueing_metadata_t { - fields { - enq_timestamp : 48; - enq_qdepth : 16; - deq_timedelta : 32; - deq_qdepth : 16; - qid : 8; - } -} -metadata queueing_metadata_t queueing_metadata; -``` -Of course, all of these fields can only be accessed from the egress pipeline and -they are read-only. -- `enq_timestamp`: a timestamp, in microseconds, set when the packet is first -enqueued. -- `enq_qdepth`: the depth of the queue when the packet was first enqueued. -- `deq_timedelta`: the time, in microseconds, that the packet spent in the -queue. -- `deq_qdepth`: the depth of queue when the packet was dequeued. -- `qid`: when there are multiple queues servicing each egress port (e.g. when -priority queueing is enabled), each queue is assigned a fixed unique id, which -is written to this field. Otherwise, this field is set to 0. - -## Supported primitive actions - -We mostly support the standard P4_14 primitive actions. One difference is that -optional parameters are not supported in bmv2, so all parameters are always -required (see `resubmit` for example). -The full list of primitives can be seen in this [C++ source -file](../targets/simple_switch/primitives.cpp). diff --git a/exercises/07-Count-Min-Sketch/README.md b/exercises/07-Count-Min-Sketch/README.md index e1c3d3e..e196271 100644 --- a/exercises/07-Count-Min-Sketch/README.md +++ b/exercises/07-Count-Min-Sketch/README.md @@ -43,7 +43,7 @@ packets fast to the switch we can clone the repository again with a different na cd ~/p4-tools/ git clone https://github.com/p4lang/behavioral-model.git bmv2-opt cd bmv2-opt -git checkout 7e71a9bdd161afd63a162aaa96703bfa7ab1b3e1 +git checkout 7e71a9bdd161afd63a162aaa96703bfa7ab1b3e1 <= substitute this with the commit used in p4-learning/vm/bin/install-p4-tools.sh ./autogen.sh ./configure --disable-elogger --disable-logging-macros 'CFLAGS=-g -O2' 'CXXFLAGS=-g -O2' make -j 2 diff --git a/exercises/07-Count-Min-Sketch/solution/cm-sketch-controller.py b/exercises/07-Count-Min-Sketch/solution/cm-sketch-controller.py index 788d64d..392da55 100644 --- a/exercises/07-Count-Min-Sketch/solution/cm-sketch-controller.py +++ b/exercises/07-Count-Min-Sketch/solution/cm-sketch-controller.py @@ -90,4 +90,4 @@ def decode_registers(self, eps, n, mod, ground_truth_file="sent_flows.pickle"): controller = CMSController(args.sw) - #controller.decode_registers(args.eps, args.n, args.mod, args.flow_file) + controller.decode_registers(args.eps, args.n, args.mod, args.flow_file) diff --git a/vm/Vagrantfile b/vm/Vagrantfile index 1e0f2bf..eb17f6b 100644 --- a/vm/Vagrantfile +++ b/vm/Vagrantfile @@ -8,7 +8,7 @@ Vagrant.configure(2) do |config| # VirtualBox specific configuration config.vm.provider "virtualbox" do |vb| - vb.name = "Adv-comm-net-VM" + vb.name = "P4-learning" vb.gui = true vb.memory = 4096 vb.cpus = 3 diff --git a/vm/bin/install-p4-tools.sh b/vm/bin/install-p4-tools.sh index a403957..778bd9f 100644 --- a/vm/bin/install-p4-tools.sh +++ b/vm/bin/install-p4-tools.sh @@ -95,7 +95,7 @@ mkdir -p ${BUILD_DIR} # If false, build tools without debug features to improve throughput of BMv2 and # reduce CPU/memory footprint. DEBUG_FLAGS=true -ENABLE_P4_RUNTIME=false +ENABLE_P4_RUNTIME=true #Install Protobuf function do_protobuf { @@ -172,8 +172,12 @@ function do_sysrepo { # Dependencies in : https://github.com/p4lang/PI/blob/master/proto/README.md sudo apt-get --yes install build-essential cmake libpcre3-dev libavl-dev libev-dev libprotobuf-c-dev protobuf-c-compiler + cd ${BUILD_DIR} + # Install libyang - git clone https://github.com/CESNET/libyang.git + if [ ! -d libyang ]; then + git clone https://github.com/CESNET/libyang.git + fi cd libyang git checkout v0.16-r1 mkdir build @@ -183,8 +187,12 @@ function do_sysrepo { sudo make install sudo ldconfig + cd ../.. + # Install sysrepo - git clone https://github.com/sysrepo/sysrepo.git + if [ ! -d sysrepo ]; then + git clone https://github.com/sysrepo/sysrepo.git + fi cd sysrepo git checkout v0.7.5 mkdir build @@ -193,6 +201,7 @@ function do_sysrepo { make sudo make install sudo ldconfig + cd .. } #only if we want P4Runtime @@ -343,6 +352,14 @@ function do_install_scripts { chmod a+x /home/p4/bin/update-p4c } +function do_p4-learning { + cd ${BUILD_DIR} + if [ ! -d p4-learning ]; then + git clone https://github.com/nsg-ethz/p4-learning.git + fi + cd .. +} + do_protobuf if [ "$ENABLE_P4_RUNTIME" = true ] ; then do_grpc @@ -357,5 +374,7 @@ do_p4c do_scapy do_ptf do_p4-utils +do_install_scripts +do_p4-learning echo "Done with p4-tools install!" \ No newline at end of file diff --git a/vm/bin/misc-install.sh b/vm/bin/misc-install.sh index 7de32d4..bd9fe10 100644 --- a/vm/bin/misc-install.sh +++ b/vm/bin/misc-install.sh @@ -27,3 +27,13 @@ sudo chown p4:p4 /home/p4/.tmux.conf cd .. +# Install iperf3 (last version) + +cd /tmp +sudo apt-get remove iperf3 libiperf0 +wget https://iperf.fr/download/ubuntu/libiperf0_3.1.3-1_amd64.deb +wget https://iperf.fr/download/ubuntu/iperf3_3.1.3-1_amd64.deb +sudo dpkg -i libiperf0_3.1.3-1_amd64.deb iperf3_3.1.3-1_amd64.deb +rm libiperf0_3.1.3-1_amd64.deb iperf3_3.1.3-1_amd64.deb + +cd $HOME diff --git a/vm/bin/root-bootstrap.sh b/vm/bin/root-bootstrap.sh index 666cead..94ff1d5 100644 --- a/vm/bin/root-bootstrap.sh +++ b/vm/bin/root-bootstrap.sh @@ -67,6 +67,7 @@ sudo apt-get install -y --no-install-recommends \ libprotobuf-c-dev \ g++ \ bash-completion \ + traceroute #Install pip from source diff --git a/vm/bin/update-bmv2.sh b/vm/bin/update-bmv2.sh index 87587b3..f1e573b 100644 --- a/vm/bin/update-bmv2.sh +++ b/vm/bin/update-bmv2.sh @@ -254,8 +254,17 @@ while true ; do done # main -if [ "$ENABLE_P4_RUNTIME" == 1 ]; then - # Updates PI: https://github.com/p4lang/PI - do_update_PI + +# checks if the current path includes the word p4c somewhere +# its probably not the best way to check if we are in the right +# path, but its something +if [[ "$ROOT_PATH" == *"bmv2"* ]];then + + if [ "$ENABLE_P4_RUNTIME" == 1 ]; then + # Updates PI: https://github.com/p4lang/PI + do_update_PI + fi + do_update_bmv2 +else + die 'ERROR: you are not in a bmv2 directory' fi -do_update_bmv2 \ No newline at end of file diff --git a/vm/bin/update-p4c.sh b/vm/bin/update-p4c.sh index 9bbd3a0..89c5617 100644 --- a/vm/bin/update-p4c.sh +++ b/vm/bin/update-p4c.sh @@ -96,7 +96,7 @@ function do_update_p4c { fi make -j${NUM_CORES} - #sudo make install + sudo make install sudo ldconfig cd ../.. } @@ -155,10 +155,18 @@ while true ; do done # main -if [ "$P4INCLUDE_ONLY" == 0 ]; then - do_update_p4c -fi -if [ "$P4INCLUDE_PATH" ]; then - do_copy_p4include -fi +# checks if the current path includes the word p4c somewhere +# its probably not the best way to check if we are in the right +# path, but its something +if [[ "$ROOT_PATH" == *"p4c"* ]];then + if [ "$P4INCLUDE_ONLY" == 0 ]; then + do_update_p4c + fi + + if [ "$P4INCLUDE_PATH" ]; then + do_copy_p4include + fi +else + die 'ERROR: you are not in a p4c directory' +fi \ No newline at end of file