Add initial support for provisioning and removing services, getting service data
Change-Id: Ie49206d788a202e70a8d64f083c3f85b92ced8fb
diff --git a/.dockerignore b/.dockerignore
index 03e2704..0c08019 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -2,4 +2,5 @@
!build/yang-files*
!build/config*
tests/*
-docs/*
\ No newline at end of file
+docs/*
+examples/*
\ No newline at end of file
diff --git a/Makefile b/Makefile
index 4dc3e14..307bf3a 100644
--- a/Makefile
+++ b/Makefile
@@ -50,10 +50,10 @@
VOLTHA_TOOLS_VERSION ?= 2.5.3
# Dependencies versions
-LIBYANG_VERSION ?= 9ad76850c140466488422c99f4ca01bf635b828a
-SYSREPO_VERSION ?= 9ef472743e57e346a820cede2e5d747713eb4197
+LIBYANG_VERSION ?= af90d335489d12c4779b62e97f75d9efb14ff60e
+SYSREPO_VERSION ?= f6cac7068cd5b7f20512ac1e3ed81e16ac1900e1
LIBNETCONF2_VERSION ?= 4d9d7993d710f1a9d17657e19a2d1eec803f3d6b
-NETOPEER2_VERSION ?= ebb5b0bfd89a77311724f35339d466abab96b743
+NETOPEER2_VERSION ?= 92f47fd547d0ab7b2afc59175c8f56ff360591b6
# Default user and password for the netconf user in docker-build
NETCONF_USER ?= voltha
@@ -61,7 +61,7 @@
# This container is built to include the necessary sysrepo libraries
# to succesfully build and test the code in this repository
-BUILDER_IMAGE_AND_TAG ?= voltha/bbf-adapter-builder:local
+BUILDER_IMAGE_AND_TAG ?= voltha/bbf-adapter-builder:local
build-tools: build/tools/Dockerfile.builder
docker build \
-t ${BUILDER_IMAGE_AND_TAG} \
diff --git a/build/config/nacm.xml b/build/config/nacm.xml
index f9dad2e..cc9bcbd 100644
--- a/build/config/nacm.xml
+++ b/build/config/nacm.xml
@@ -23,4 +23,20 @@
<action>permit</action>
</rule>
</rule-list>
+ <rule-list>
+ <name>services</name>
+ <group>voltha</group>
+ <rule>
+ <name>allow-vlans</name>
+ <module-name>bbf-l2-access-attributes</module-name>
+ <access-operations>*</access-operations>
+ <action>permit</action>
+ </rule>
+ <rule>
+ <name>allow-services</name>
+ <module-name>bbf-nt-service-profile</module-name>
+ <access-operations>*</access-operations>
+ <action>permit</action>
+ </rule>
+ </rule-list>
</nacm>
\ No newline at end of file
diff --git a/build/package/Dockerfile.bbf-adapter b/build/package/Dockerfile.bbf-adapter
index 2517145..cd55303 100644
--- a/build/package/Dockerfile.bbf-adapter
+++ b/build/package/Dockerfile.bbf-adapter
@@ -104,7 +104,6 @@
# Copy yang files and install them to sysrepo
COPY ./build/yang-files /yang
-RUN for f in /yang/*.yang; do sysrepoctl -i "$f" -s /yang -o $NETCONF_USER -g netconf -p 664 -v3; done
RUN for f in /yang/*/*.yang; do sysrepoctl -i "$f" -s /yang -o $NETCONF_USER -g netconf -p 664 -v3; done
COPY ./build/config /config
diff --git a/build/yang-files/bbf-device-aggregation.yang b/build/yang-files/devices/bbf-device-aggregation.yang
similarity index 100%
rename from build/yang-files/bbf-device-aggregation.yang
rename to build/yang-files/devices/bbf-device-aggregation.yang
diff --git a/build/yang-files/bbf-device-types.yang b/build/yang-files/devices/bbf-device-types.yang
similarity index 100%
rename from build/yang-files/bbf-device-types.yang
rename to build/yang-files/devices/bbf-device-types.yang
diff --git a/build/yang-files/bbf-yang-types.yang b/build/yang-files/devices/bbf-yang-types.yang
similarity index 100%
rename from build/yang-files/bbf-yang-types.yang
rename to build/yang-files/devices/bbf-yang-types.yang
diff --git a/build/yang-files/iana-hardware@2018-03-13.yang b/build/yang-files/devices/iana-hardware@2018-03-13.yang
similarity index 100%
rename from build/yang-files/iana-hardware@2018-03-13.yang
rename to build/yang-files/devices/iana-hardware@2018-03-13.yang
diff --git a/build/yang-files/ietf-hardware@2018-03-13.yang b/build/yang-files/devices/ietf-hardware@2018-03-13.yang
similarity index 100%
rename from build/yang-files/ietf-hardware@2018-03-13.yang
rename to build/yang-files/devices/ietf-hardware@2018-03-13.yang
diff --git a/build/yang-files/iana-if-type@2021-06-21.yang b/build/yang-files/notification/iana-if-type@2021-06-21.yang
similarity index 100%
rename from build/yang-files/iana-if-type@2021-06-21.yang
rename to build/yang-files/notification/iana-if-type@2021-06-21.yang
diff --git a/build/yang-files/services/bbf-dot1q-types.yang b/build/yang-files/services/bbf-dot1q-types.yang
new file mode 100644
index 0000000..e934c43
--- /dev/null
+++ b/build/yang-files/services/bbf-dot1q-types.yang
@@ -0,0 +1,290 @@
+module bbf-dot1q-types {
+ yang-version 1.1;
+ namespace "urn:bbf:yang:bbf-dot1q-types";
+ prefix bbf-dot1qt;
+
+ organization
+ "Broadband Forum <https://www.broadband-forum.org>
+ Common YANG Work Area";
+ contact
+ "Comments or questions about this Broadband Forum YANG module
+ should be directed to <mailto:help@broadband-forum.org>.
+
+ Editor: Nick Hancock, ADTRAN
+
+ Editor: Ludwig Pauwels, Nokia
+
+ PS Leader: Joey Boyd, ADTRAN
+
+ PS Leader: Sowrirajan Padmanabhan, Nokia
+
+ WA Director: Joey Boyd, ADTRAN
+
+ WA Director: Sven Ooghe, Nokia";
+ description
+ "This module contains a collection of YANG definitions for
+ supporting the Broadband Forum requirements on reusable data
+ types as applicable to access network equipment. As such, this
+ module is specific to access network equipment (e.g.,
+ BBF-specified Access Nodes and FTTdp DPUs).
+
+ Specifically, this module defines common types for support of
+ IEEE 802.1Q.
+
+ Copyright (c) 2017-2021, Broadband Forum
+
+ Redistribution and use in source and binary forms, with or
+ without modification, are permitted provided that the following
+ conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials
+ provided with the distribution.
+
+ 3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products
+ derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ The above license is used as a license under copyright only.
+ Please reference the Forum IPR Policy for patent licensing terms
+ <https://www.broadband-forum.org/ipr-policy>.
+
+ Any moral rights which are necessary to exercise under the above
+ license grant are also deemed granted under this license.
+
+ This version of this YANG module is part of TR-383a4; see
+ the TR itself for full legal notices.";
+
+ revision 2021-06-02 {
+ description
+ "Amendment 4.
+ * Approval Date: 2021-06-02.
+ * Publication Date: 2021-06-02.";
+ reference
+ "TR-383a4: Common YANG Modules
+ <https://www.broadband-forum.org/technical/download/
+ TR-383_Amendment-4.pdf>";
+ }
+ revision 2020-10-13 {
+ description
+ "Amendment 3.
+ * Approval Date: 2020-10-13.
+ * Publication Date: 2020-10-13.";
+ reference
+ "TR-383a3: Common YANG Modules
+ <https://www.broadband-forum.org/technical/download/
+ TR-383_Amendment-3.pdf>";
+ }
+ revision 2018-07-13 {
+ description
+ "Amendment 1.
+ * Approval Date: 2018-06-04.
+ * Publication Date: see revision date above.";
+ reference
+ "TR-383: Common YANG Modules
+ <https://www.broadband-forum.org/technical/download/
+ TR-383_Amendment-1.pdf>";
+ }
+ revision 2017-05-08 {
+ description
+ "Initial revision.
+ * Approval Date: see revision date above.
+ * Publication Date: 2017-06-02.";
+ reference
+ "TR-383: Common YANG Modules
+ <https://www.broadband-forum.org/technical/download/
+ TR-383.pdf>";
+ }
+
+ identity dot1q-tag-vlan-type {
+ description
+ "Base identity from which all IEEE 802.1Q VLAN tag types are
+ derived.";
+ }
+
+ identity c-vlan {
+ base dot1q-tag-vlan-type;
+ description
+ "An IEEE 802.1Q Customer VLAN tag, using the 0x8100
+ Ethertype.";
+ }
+
+ identity s-vlan {
+ base dot1q-tag-vlan-type;
+ description
+ "An IEEE 802.1Q Service VLAN tag, using a the 0x88a8 Ethertype,
+ originally introduced in IEEE 802.1ad, and incorporated into
+ IEEE 802.1Q-2014.";
+ }
+
+ typedef dot1q-tag-type {
+ type identityref {
+ base dot1q-tag-vlan-type;
+ }
+ description
+ "Identifies a specific IEEE 802.1Q tag type.";
+ reference
+ "IEEE 802.1Q-2014: Virtual Bridged Local Area Networks";
+ }
+
+ typedef vlan-id {
+ type uint16 {
+ range "1..4094";
+ }
+ description
+ "The type uniquely identifies a VLAN. This is the
+ 12-bit VLAN ID used in the VLAN tag header.
+ The range 1..4094 is defined by the referenced
+ specification.";
+ reference
+ "IEEE 802.1Q-2014: Virtual Bridged Local Area Networks";
+ }
+
+ typedef vlan-id-or-0 {
+ type uint16 {
+ range "0..4094";
+ }
+ description
+ "The type uniquely identifies a VLAN. This is the
+ 12-bit VLAN ID used in the VLAN tag header.
+ The range 1..4094 is defined by the referenced specification.
+ The value 0 allows support of priority-tagged frames.";
+ reference
+ "IEEE 802.1Q-2014: Virtual Bridged Local Area Networks";
+ }
+
+ typedef vlan-id-range {
+ type string {
+ pattern '(([1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-3][0-9][0-9]['
+ + '0-9]|40[0-8][0-9]|409[0-4])([,-]([1-9]|[1-9][0-9]|['
+ + '1-9][0-9][0-9]|[1-3][0-9][0-9][0-9]|40[0-8][0-9]|'
+ + '409[0-4]))*)?';
+ }
+ description
+ "A list of VLAN IDs, or non overlapping VLAN ranges, in
+ ascending order, between 1 and 4094.
+
+ The format of this string can be any of the following:
+
+ single value
+ Example: '23'
+ comma separated list of values
+ Example: '1,2,100'
+ range of values
+ Example: '1-1000'
+ comma separated list of ranges
+ Example: '1-1000,2001-2999'
+ comma separated list of values and ranges
+ Example: '1-1000,1500,2001-2999'";
+ }
+
+ typedef pbit {
+ type uint8 {
+ range "0..7";
+ }
+ description
+ "Priority Code Point. PCP is a 3-bit field that refers to the
+ class of service applied to a VLAN tagged frame. The
+ field specifies a priority value between 0 and 7, these values
+ can be used by quality of service (QoS) to prioritize
+ different classes of traffic.";
+ reference
+ "IEEE 802.1Q-2014: Virtual Bridged Local Area Networks";
+ }
+
+ typedef pbit-list {
+ type string {
+ pattern '([0-7](-[0-7])?(,[0-7](-[0-7])?)*)';
+ }
+ description
+ "A list of p-bits values, or non overlapping p-bits value
+ ranges, in ascending order. Each p-bits value shall be between
+ 0 and 7.
+
+ Example: 0,2-4,7
+ ";
+ }
+
+ typedef dei {
+ type uint8 {
+ range "0..1";
+ }
+ description
+ "Drop Eligible Indicator. DEI is a 1-bit field in the VLAN tag.
+ May be used separately or in conjunction with PCP to indicate
+ frames eligible to be dropped in the presence of congestion.";
+ reference
+ "IEEE 802.1Q-2014: Virtual Bridged Local Area Networks";
+ }
+
+ typedef ether-type {
+ type uint16;
+ description
+ "The Ethernet Type (or Length) value.";
+ reference
+ "IEEE 802.3-2012: IEEE Standard for Ethernet, clause 3.2.6";
+ }
+
+ typedef ether-type-hex {
+ type string {
+ pattern '0x[A-Fa-f0-9]{4}';
+ }
+ description
+ "The Ethernet Type (or Length) value expressed as a 4 hex digits
+ in the form 0xABCD.";
+ reference
+ "IEEE 802.3-2012: IEEE Standard for Ethernet, clause 3.2.6";
+ }
+
+ typedef ether-type-or-acronym {
+ type union {
+ type ether-type;
+ type enumeration {
+ enum any {
+ description
+ "Matches any Ethertype value.";
+ }
+ enum ipv4 {
+ description
+ "Matches the Ethertype value 0x0800 or 0x0806 or
+ 0x8035.";
+ }
+ enum pppoe {
+ description
+ "Matches the Ethertype value 0x8863 or 0x8864.";
+ }
+ enum ipv6 {
+ description
+ "Matches the Ethertype value 0x86DD.";
+ }
+ }
+ type ether-type-hex;
+ }
+ description
+ "This type allows to specify
+ - a specific integer value identifying a particular Ethertype
+ value of frames,
+ - a 'pre-defined' enumeration value identifying one or more
+ specific Ethertype values,
+ - the enumeration value 'any' that identifies all frames.";
+ }
+}
diff --git a/build/yang-files/services/bbf-l2-access-attributes.yang b/build/yang-files/services/bbf-l2-access-attributes.yang
new file mode 100644
index 0000000..85bf697
--- /dev/null
+++ b/build/yang-files/services/bbf-l2-access-attributes.yang
@@ -0,0 +1,342 @@
+module bbf-l2-access-attributes {
+ yang-version 1.1;
+ namespace "urn:bbf:yang:bbf-l2-access-attributes";
+ prefix bbf-l2access-attr;
+
+ import bbf-dot1q-types {
+ prefix bbf-dot1qt;
+ }
+ import ietf-network {
+ prefix nw;
+ }
+ import ietf-network-topology {
+ prefix nt;
+ }
+
+ organization
+ "Broadband Forum <https://www.broadband-forum.org>
+ Common YANG Work Area";
+ contact
+ "Comments or questions about this Broadband Forum YANG module
+ should be directed to <mailto:help@broadband-forum.org>.
+
+ Editor: TBD
+
+ PS Leader: TBD
+
+ WA Director: TBD";
+ description
+ "This module contains a collection of YANG definitions for
+ simplifying the Access Device Model as exposed over NBI of BAA.
+
+ Copyright (c) 2022, Broadband Forum
+
+ Redistribution and use in source and binary forms, with or
+ without modification, are permitted provided that the following
+ conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials
+ provided with the distribution.
+
+ 3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products
+ derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ The above license is used as a license under copyright only.
+ Please reference the Forum IPR Policy for patent licensing terms
+ <https://www.broadband-forum.org/ipr-policy>.
+
+ Any moral rights which are necessary to exercise under the above
+ license grant are also deemed granted under this license.
+
+ This version of this YANG module is part of TR-383a4; see
+ the TR itself for full legal notices.";
+
+ revision 2021-09-30 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 8944: A YANG Data Model for Layer 2 Network Topologies";
+ }
+
+ grouping access-tag {
+ leaf tag-type {
+ type union {
+ type bbf-dot1qt:dot1q-tag-type;
+ type uint16;
+ type enumeration {
+ enum any {
+ description
+ "Matches any tag type.";
+ }
+ }
+ }
+ default "any";
+ description
+ "VLAN tag type.";
+ }
+ leaf vlan-id {
+ type union {
+ type bbf-dot1qt:vlan-id-range;
+ type enumeration {
+ enum any {
+ description
+ "Matches any VLAN-ID in the range 1 to 4094, or
+ matches priority tagged frames.";
+ }
+ enum priority-tagged {
+ description
+ "Priority-tagged frames are frames with a VLAN tag
+ present and that match VLAN-ID 0.";
+ }
+ enum vlan-id-is-a-parameter {
+ description
+ "The VLAN ID is not
+ specified inside this profile but has to be
+ specified at the place where this profile
+ is referenced.";
+ }
+ }
+ }
+ mandatory true;
+ description
+ "Allowed VLAN-IDs.";
+ }
+ leaf pbit {
+ type union {
+ type bbf-dot1qt:pbit-list;
+ type enumeration {
+ enum any {
+ description
+ "Matches any pbit value in the range of 0 to 7.";
+ }
+ }
+ }
+ description
+ "Allowed PBIT values.";
+ }
+ }
+
+ grouping access-vlan-tag-match {
+ description
+ "Flexible match on the VLAN tags of Ethernet frames.";
+ choice vlan-tag-match-type {
+ description
+ "Provides a choice of how the frames may be matched.";
+ case untagged {
+ leaf untagged {
+ type empty;
+ description
+ "Untagged match. Matches all untagged traffic.";
+ }
+ }
+ case vlan-tagged {
+ container outer-tag {
+ description
+ "Classifies traffic using the outermost VLAN tag on the
+ frame.";
+ uses access-tag;
+ }
+ container second-tag {
+ description
+ "Classifies traffic using the second outermost VLAN tag
+ on the frame.";
+ uses access-tag;
+ }
+ }
+ }
+ }
+
+ grouping access-vlan-tag-rewrite {
+ description
+ "Flexible match on the VLAN tags of Ethernet frames.";
+ leaf pop-tags {
+ type uint8 {
+ range "0..2";
+ }
+ description
+ "The number of tags to pop.";
+ }
+ container push-outer-tag {
+ description
+ "The outermost VLAN tag to push onto the frame.";
+ uses access-tag;
+ }
+ container push-second-tag {
+ description
+ "The second outermost VLAN tag to push onto the frame.";
+ uses access-tag;
+ }
+ }
+
+ grouping vlan-match-and-rewrite {
+ description
+ "Configuration of frame vlan tag processing, include frame classification and vlan tag rewrite";
+ container match-criteria {
+ description
+ "This container collects match criteria for various frame fields.";
+ uses access-vlan-tag-match;
+ }
+ container ingress-rewrite {
+ description
+ "Ingress rewrite refers to the supported tag manipulations
+ before the frame is offered to a higher layer interface or
+ to a forwarder or to a destination termination-point.";
+ uses access-vlan-tag-rewrite;
+ }
+ }
+
+ grouping l2-access-attributes {
+ description
+ "Flexible match on the VLAN tags of Ethernet frames.";
+ container vlan-translation {
+ leaf translation-profile {
+ type leafref {
+ path
+ "/bbf-l2access-attr:vlan-translation-profiles/bbf-l2access-attr:"
+ + "vlan-translation-profile/bbf-l2access-attr:name";
+ }
+ description
+ "A reference to a vlan translation profile that contains
+ frame vlan classification and vlan tag rewrite.";
+ }
+ leaf outer-vlan-id {
+ when
+ '/bbf-l2access-attr:vlan-translation-profiles/'
+ + 'bbf-l2access-attr:vlan-translation-profile[bbf-l2access-attr:'
+ + 'name = current()/../../vlan-translation-profile]/'
+ + 'match-criteria/outer-tag/vlan-id = '
+ + '"vlan-id-is-a-parameter" ' {
+ description
+ "Match criteria for the outer VLAN tag of a frame that
+ overrules the match criteria provided through the
+ referenced vlan translaton profile.";
+ }
+ type bbf-dot1qt:vlan-id;
+ }
+ leaf second-vlan-id {
+ when
+ '/bbf-l2access-attr:vlan-translation-profiles/'
+ + 'bbf-l2access-attr:vlan-translation-profile[bbf-l2access-attr:'
+ + 'name = current()/../../vlan-translation-profile]/'
+ + 'match-criteria/second-tag/vlan-id = '
+ + '"vlan-id-is-a-parameter" ' {
+ description
+ "Match criteria for the second VLAN tag of a frame that
+ overrules the match criteria provided through the
+ referenced vlan translaton profile.";
+ }
+ type bbf-dot1qt:vlan-id;
+ }
+ leaf push-outer-vlan-id {
+ when
+ '/bbf-l2access-attr:vlan-translation-profiles/'
+ + 'bbf-l2access-attr:vlan-translation-profile[bbf-l2access-attr:'
+ + 'name = current()/../../vlan-translation-profile]/'
+ + 'ingress-rewrite/push-outer-tag/vlan-id = '
+ + '"vlan-id-is-a-parameter" ' {
+ description
+ "Indicates the VLAN ID of the pushed outer VLAN tag,
+ which overwrites the outer VLAN tag rewritten
+ by the referenced VLAN translation profile.";
+ }
+ type bbf-dot1qt:vlan-id;
+ }
+ leaf push-second-vlan-id {
+ when
+ '/bbf-l2access-attr:vlan-translation-profiles/'
+ + 'bbf-l2access-attr:vlan-translation-profile[bbf-l2access-attr:'
+ + 'name = current()/../../vlan-translation-profile]/'
+ + 'ingress-rewrite/push-second-tag/vlan-id = '
+ + '"vlan-id-is-a-parameter" ' {
+ description
+ "Indicates the VLAN ID of the pushed seconed VLAN tag,
+ which overwrites the seconed VLAN tag rewritten
+ by the referenced VLAN translation profile.";
+ }
+ type bbf-dot1qt:vlan-id;
+ }
+ }
+ }
+
+ container vlan-translation-profiles {
+ description
+ "Configuration of VLAN translation profiles.";
+ list vlan-translation-profile {
+ key "name";
+ description
+ "A translation profile defines the vlan match criteria and
+ vlan tag rewrite.";
+ leaf name {
+ type string;
+ description
+ "vlan translaton profile name.";
+ }
+ uses vlan-match-and-rewrite;
+ }
+ }
+ container vlan-forwarding-profiles {
+ description
+ "Configuration of VLAN forwarding profiles.";
+ list vlan-forwarding-profile {
+ key "name";
+ description
+ "A forwarding profile defines the network-side
+ forwarding of traffic in a forwarding VLAN.";
+ leaf name {
+ type string;
+ description
+ "vlan forwrding profile name.";
+ }
+ container forwarding-ports {
+ description
+ "Network-side forwarding ports in the forwarding profile.";
+ list port {
+ key "name";
+ leaf name {
+ type string;
+ description
+ "forwarding port name.";
+ }
+ leaf node-ref {
+ type leafref {
+ path "/nw:networks/nw:network/nw:node/nw:node-id";
+ require-instance false;
+ }
+ description
+ "This leaf references a network side node.";
+ }
+ leaf tp-ref {
+ type leafref {
+ path "/nw:networks/nw:network/"
+ + "nw:node/nt:termination-point/nt:tp-id";
+ require-instance false;
+ }
+ description
+ "This leaf references a network side termination point types.";
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/build/yang-files/services/bbf-nt-line-profile.yang b/build/yang-files/services/bbf-nt-line-profile.yang
new file mode 100644
index 0000000..f17e781
--- /dev/null
+++ b/build/yang-files/services/bbf-nt-line-profile.yang
@@ -0,0 +1,197 @@
+module bbf-nt-line-profile {
+ yang-version 1.1;
+ namespace "urn:bbf:yang:bbf-nt-line-profile";
+ prefix bbf-nt-line-prof;
+
+ organization
+ "Broadband Forum <https://www.broadband-forum.org>
+ Common YANG Work Area";
+ contact
+ "Comments or questions about this Broadband Forum YANG module
+ should be directed to <mailto:help@broadband-forum.org>.
+
+ Editor: TBD
+
+ PS Leader: TBD
+
+ WA Director: TBD";
+ description
+ "This module contains a collection of YANG definitions for
+ simplifying the Access Device Model as exposed over NBI of BAA.
+
+ Copyright (c) 2022, Broadband Forum
+
+ Redistribution and use in source and binary forms, with or
+ without modification, are permitted provided that the following
+ conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials
+ provided with the distribution.
+
+ 3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products
+ derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ The above license is used as a license under copyright only.
+ Please reference the Forum IPR Policy for patent licensing terms
+ <https://www.broadband-forum.org/ipr-policy>.
+
+ Any moral rights which are necessary to exercise under the above
+ license grant are also deemed granted under this license.
+
+ This version of this YANG module is part of TR-383a4; see
+ the TR itself for full legal notices.";
+
+ revision 2021-09-14 {
+ description
+ "Initial revision.";
+ reference
+ "";
+ }
+
+ typedef line-profile-ref {
+ type leafref {
+ path
+ "/bbf-nt-line-prof:line-profiles/bbf-nt-line-prof:line-profile/bbf-nt-line-prof:name";
+ }
+ description
+ "A reference to a network termination line profile.";
+ }
+
+ typedef line-bandwidth-ref {
+ type leafref {
+ path
+ "/bbf-nt-line-prof:line-bandwidth-profiles/bbf-nt-line-prof:line-bandwidth-profile/bbf-nt-line-prof:name";
+ }
+ description
+ "A reference to a network termination bandwidth profile.";
+ }
+
+ container line-bandwidth-profiles {
+ list line-bandwidth-profile {
+ key "name";
+ description
+ "List of line profiles.";
+ leaf name {
+ type string {
+ length "1..32";
+ }
+ description
+ "The line bandwidth profile name.";
+ }
+ leaf fixed-bandwidth {
+ type uint64;
+ units "bits/second";
+ default "0";
+ description
+ "Represents the reserved portion of the bandwidth capacity that
+ is allocated to the given traffic flow, regardless of its
+ traffic demand and the overall traffic load conditions.";
+ }
+ leaf assured-bandwidth {
+ type uint64;
+ units "bits/second";
+ default "0";
+ description
+ "Represents a portion of the bandwidth capacity that is allocated
+ to the given traffic flow as long as the flow has
+ unsatisfied traffic demand, regardless of the overall
+ traffic conditions.";
+ }
+ leaf maximum-bandwidth {
+ type uint64;
+ units "bits/second";
+ description
+ "Represents the upper limit on the total bandwidth that can
+ be allocated to the traffic flow under any traffic
+ conditions. The maximum bandwidth must be greater than or equal
+ to the sum of any configured fixed and assured
+ bandwidth";
+ }
+ }
+ }
+ container line-profiles {
+ description
+ "All config data for line profile.";
+ list line-profile {
+ key "name";
+ description
+ "List of line profiles.";
+ leaf name {
+ type string {
+ length "1..32";
+ }
+ description
+ "The line profile name.";
+ }
+ container virtual-ports {
+ description
+ "All config data for virtual ports of the network termination.";
+ list virtual-port {
+ key "name";
+ description
+ "List of virtual ports.";
+ leaf name {
+ type string;
+ description
+ "Name of virtual port.";
+ }
+ leaf line-bandwidth-ref {
+ type line-bandwidth-ref;
+ description
+ "A reference to a network termination line bandwidth profile.";
+ }
+ list match-criteria {
+ key "name";
+ description
+ "List of match criterias.";
+ leaf name {
+ type string;
+ description
+ "Name of match criteria.";
+ }
+ leaf uni-port {
+ type uint8;
+ description
+ "Indicates the user-side port of the network termination.";
+ }
+ leaf vlan {
+ type uint32 {
+ range "0.. 4095 | 65533";
+ }
+ description
+ "Indicates the VLAN ID of the service. The value 65533 indicates untag traffic stream.";
+ }
+ leaf priority {
+ type uint32 {
+ range "0..7";
+ }
+ description
+ "Indicates the priority of the service.";
+ }
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/build/yang-files/services/bbf-nt-service-profile-voltha.yang b/build/yang-files/services/bbf-nt-service-profile-voltha.yang
new file mode 100644
index 0000000..e63c56f
--- /dev/null
+++ b/build/yang-files/services/bbf-nt-service-profile-voltha.yang
@@ -0,0 +1,165 @@
+module bbf-nt-service-profile-voltha {
+ yang-version 1.1;
+
+ namespace "urn:bbf:yang:bbf-nt-service-profile-voltha";
+ prefix bbf-voltha-srv-prof;
+
+ import bbf-nt-service-profile {
+ prefix bbf-nt-srv-prof;
+ }
+ import bbf-nt-line-profile {
+ prefix bbf-nt-line-prof;
+ }
+ import ietf-yang-types {
+ prefix yang;
+ }
+
+ organization
+ "Broadband Forum <https://www.broadband-forum.org>
+ SDN/NFV Work Area";
+ contact
+ "Comments or questions about this Broadband Forum YANG module
+ should be directed to <mailto:help@broadband-forum.org>.
+
+ Editor: TBD
+
+ WA Director: Mengmeng Li, China Mobile
+
+ WA Director: Bruno Cornaglia, Vodafone";
+ description
+ "TBD.
+
+ Copyright (c) 2019-2022, Broadband Forum
+
+ Redistribution and use in source and binary forms, with or
+ without modification, are permitted provided that the following
+ conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials
+ provided with the distribution.
+
+ 3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products
+ derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ The above license is used as a license under copyright only.
+ Please reference the Forum IPR Policy for patent licensing terms
+ <https://www.broadband-forum.org/ipr-policy>.
+
+ Any moral rights which are necessary to exercise under the above
+ license grant are also deemed granted under this license.
+
+ This version of this YANG module is part of TR-451; see
+ the TR itself for full legal notices.";
+
+ revision 2022-03-22 {
+ description
+ "Initial revision.";
+ reference
+ "TBD";
+ }
+
+ augment "/bbf-nt-srv-prof:service-profiles"
+ + "/bbf-nt-srv-prof:service-profile/bbf-nt-srv-prof:ports"
+ + "/bbf-nt-srv-prof:port" {
+ description
+ "Augmentation of the service profile to add bandwidth profiles
+ and VOLTHA specific values";
+
+ leaf technology-profile-id {
+ type uint32;
+ description
+ "ID of the technology profile, that has to be already
+ configured in VOLTHA.
+ The technology profile protobuf definitation can be found
+ here https://github.com/opencord/voltha-protos/blob/" +
+ "master/protos/voltha_protos/tech_profile.proto";
+ }
+ leaf upstream-subscriber-bp-name {
+ type leafref {
+ path
+ "/bbf-nt-line-prof:line-bandwidth-profiles"
+ + "/bbf-nt-line-prof:line-bandwidth-profile"
+ + "/bbf-nt-line-prof:name";
+ }
+ description
+ "Name of the UNI upstream bandwidth profile";
+ }
+ leaf downstream-subscriber-bp-name {
+ type leafref {
+ path
+ "/bbf-nt-line-prof:line-bandwidth-profiles"
+ + "/bbf-nt-line-prof:line-bandwidth-profile"
+ + "/bbf-nt-line-prof:name";
+ }
+ description
+ "Name of the UNI downstream bandwidth profile";
+ }
+ leaf upstream-olt-bp-name {
+ type leafref {
+ path
+ "/bbf-nt-line-prof:line-bandwidth-profiles"
+ + "/bbf-nt-line-prof:line-bandwidth-profile"
+ + "/bbf-nt-line-prof:name";
+ }
+ description
+ "Name of the OLT upstream bandwidth profile";
+ }
+ leaf downstream-olt-bp-name {
+ type leafref {
+ path
+ "/bbf-nt-line-prof:line-bandwidth-profiles"
+ + "/bbf-nt-line-prof:line-bandwidth-profile"
+ + "/bbf-nt-line-prof:name";
+ }
+ description
+ "Name of the OLT downstream bandwidth profile";
+ }
+ leaf mac-learning-enabled {
+ type boolean;
+ description
+ "Whether or not MAC learning has to be enabled for
+ this service";
+ }
+ leaf dhcp-required {
+ type boolean;
+ description
+ "Whether or not DHCP is required for this service";
+ }
+ leaf igmp-required {
+ type boolean;
+ description
+ "Whether or not IGMP is required for this service";
+ }
+ leaf pppoe-required {
+ type boolean;
+ description
+ "Whether or not PPPoE is required for this service";
+ }
+ leaf configured-mac-address {
+ type yang:mac-address;
+ description
+ "MAC address for the service";
+ }
+ }
+}
diff --git a/build/yang-files/services/bbf-nt-service-profile.yang b/build/yang-files/services/bbf-nt-service-profile.yang
new file mode 100644
index 0000000..799bc93
--- /dev/null
+++ b/build/yang-files/services/bbf-nt-service-profile.yang
@@ -0,0 +1,134 @@
+module bbf-nt-service-profile {
+ yang-version 1.1;
+ namespace "urn:bbf:yang:bbf-nt-service-profile";
+ prefix bbf-nt-srv-prof;
+
+ import bbf-l2-access-attributes {
+ prefix bbf-l2access-attr;
+ }
+
+ organization
+ "Broadband Forum <https://www.broadband-forum.org>
+ Common YANG Work Area";
+ contact
+ "Comments or questions about this Broadband Forum YANG module
+ should be directed to <mailto:help@broadband-forum.org>.
+
+ Editor: TBD
+
+ PS Leader: TBD
+
+ WA Director: TBD";
+ description
+ "This module contains a collection of YANG definitions for
+ simplifying the Access Device Model as exposed over NBI of BAA.
+
+ Copyright (c) 2022, Broadband Forum
+
+ Redistribution and use in source and binary forms, with or
+ without modification, are permitted provided that the following
+ conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials
+ provided with the distribution.
+
+ 3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products
+ derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ The above license is used as a license under copyright only.
+ Please reference the Forum IPR Policy for patent licensing terms
+ <https://www.broadband-forum.org/ipr-policy>.
+
+ Any moral rights which are necessary to exercise under the above
+ license grant are also deemed granted under this license.
+
+ This version of this YANG module is part of TR-383a4; see
+ the TR itself for full legal notices.";
+
+ revision 2021-09-14 {
+ description
+ "Initial revision.";
+ reference
+ "";
+ }
+
+ typedef srv-profile-ref {
+ type leafref {
+ path
+ "/bbf-nt-srv-prof:service-profiles/bbf-nt-srv-prof:service-profile/bbf-nt-srv-prof:name";
+ }
+ description
+ "A reference to a service profile.";
+ }
+
+ container service-profiles {
+ description
+ "All config data for service profile.";
+ list service-profile {
+ key "name";
+ description
+ "List of service profiles.";
+ leaf name {
+ type string {
+ length "1..32";
+ }
+ description
+ "The service profile name.";
+ }
+ container ports {
+ description
+ "All config data for ports.";
+ list port {
+ key "name";
+ description
+ "List of the port attribute.";
+ leaf name {
+ type string {
+ length "1..64";
+ }
+ description
+ "This object indicates the name of the port.";
+ }
+ container port-vlans {
+ description
+ "All config data for port vlan.";
+ list port-vlan {
+ key "name";
+ description
+ "This is used to add a user-side port on the network termination to a VLAN";
+ leaf name {
+ type leafref {
+ path
+ "/bbf-l2access-attr:vlan-translation-profiles/bbf-l2access-attr:vlan-translation-profile/bbf-l2access-attr:name";
+ }
+ description
+ "Name of the port VLAN.";
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/build/yang-files/services/bbf-voltha-vlan-translation.yang b/build/yang-files/services/bbf-voltha-vlan-translation.yang
new file mode 100644
index 0000000..4b82d2f
--- /dev/null
+++ b/build/yang-files/services/bbf-voltha-vlan-translation.yang
@@ -0,0 +1,124 @@
+module bbf-voltha-vlan-translation {
+ yang-version 1.1;
+
+ namespace "urn:bbf:yang:bbf-voltha-vlan-translation";
+ prefix bbf-voltha-vlan-tr;
+
+ import bbf-l2-access-attributes {
+ prefix bbf-l2access-attr;
+ }
+ import bbf-dot1q-types {
+ prefix bbf-dot1qt;
+ }
+
+ organization
+ "Broadband Forum <https://www.broadband-forum.org>
+ SDN/NFV Work Area";
+ contact
+ "Comments or questions about this Broadband Forum YANG module
+ should be directed to <mailto:help@broadband-forum.org>.
+
+ Editor: TBD
+
+ WA Director: Mengmeng Li, China Mobile
+
+ WA Director: Bruno Cornaglia, Vodafone";
+ description
+ "TBD.
+
+ Copyright (c) 2019-2022, Broadband Forum
+
+ Redistribution and use in source and binary forms, with or
+ without modification, are permitted provided that the following
+ conditions are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials
+ provided with the distribution.
+
+ 3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products
+ derived from this software without specific prior written
+ permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ The above license is used as a license under copyright only.
+ Please reference the Forum IPR Policy for patent licensing terms
+ <https://www.broadband-forum.org/ipr-policy>.
+
+ Any moral rights which are necessary to exercise under the above
+ license grant are also deemed granted under this license.
+
+ This version of this YANG module is part of TR-451; see
+ the TR itself for full legal notices.";
+
+ revision 2022-03-22 {
+ description
+ "Initial revision.";
+ reference
+ "TBD";
+ }
+
+ augment "/bbf-l2access-attr:vlan-translation-profiles"
+ + "/bbf-l2access-attr:vlan-translation-profile"
+ + "/bbf-l2access-attr:ingress-rewrite"
+ + "/bbf-l2access-attr:push-outer-tag" {
+ description
+ "Augmentation of the vlan translation profile outer tag with
+ downstream pbit";
+
+ leaf d-pbit {
+ type union {
+ type bbf-dot1qt:pbit-list;
+ type enumeration {
+ enum any {
+ description
+ "Matches any pbit value in the range of 0 to 7.";
+ }
+ }
+ }
+ description
+ "Allowed downstream PBIT values.";
+ }
+ }
+
+ augment "/bbf-l2access-attr:vlan-translation-profiles"
+ + "/bbf-l2access-attr:vlan-translation-profile"
+ + "/bbf-l2access-attr:ingress-rewrite"
+ + "/bbf-l2access-attr:push-second-tag" {
+ description
+ "Augmentation of the vlan translation profile second tag with
+ downstream pbit";
+
+ leaf d-pbit {
+ type union {
+ type bbf-dot1qt:pbit-list;
+ type enumeration {
+ enum any {
+ description
+ "Matches any pbit value in the range of 0 to 7.";
+ }
+ }
+ }
+ description
+ "Allowed downstream PBIT values.";
+ }
+ }
+}
diff --git a/build/yang-files/services/ietf-network-topology@2018-02-26.yang b/build/yang-files/services/ietf-network-topology@2018-02-26.yang
new file mode 100644
index 0000000..1ec944d
--- /dev/null
+++ b/build/yang-files/services/ietf-network-topology@2018-02-26.yang
@@ -0,0 +1,294 @@
+module ietf-network-topology {
+ yang-version 1.1;
+ namespace "urn:ietf:params:xml:ns:yang:ietf-network-topology";
+ prefix nt;
+
+ import ietf-inet-types {
+ prefix inet;
+ reference
+ "RFC 6991: Common YANG Data Types";
+ }
+ import ietf-network {
+ prefix nw;
+ reference
+ "RFC 8345: A YANG Data Model for Network Topologies";
+ }
+
+ organization
+ "IETF I2RS (Interface to the Routing System) Working Group";
+
+ contact
+ "WG Web: <https://datatracker.ietf.org/wg/i2rs/>
+ WG List: <mailto:i2rs@ietf.org>
+
+ Editor: Alexander Clemm
+ <mailto:ludwig@clemm.org>
+
+ Editor: Jan Medved
+ <mailto:jmedved@cisco.com>
+
+ Editor: Robert Varga
+ <mailto:robert.varga@pantheon.tech>
+
+ Editor: Nitin Bahadur
+ <mailto:nitin_bahadur@yahoo.com>
+
+ Editor: Hariharan Ananthakrishnan
+ <mailto:hari@packetdesign.com>
+
+ Editor: Xufeng Liu
+ <mailto:xufeng.liu.ietf@gmail.com>";
+
+ description
+ "This module defines a common base model for a network topology,
+ augmenting the base network data model with links to connect
+ nodes, as well as termination points to terminate links
+ on nodes.
+
+ Copyright (c) 2018 IETF Trust and the persons identified as
+ authors of the code. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or
+ without modification, is permitted pursuant to, and subject
+ to the license terms contained in, the Simplified BSD License
+ set forth in Section 4.c of the IETF Trust's Legal Provisions
+ Relating to IETF Documents
+ (https://trustee.ietf.org/license-info).
+
+ This version of this YANG module is part of RFC 8345;
+ see the RFC itself for full legal notices.";
+
+ revision 2018-02-26 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 8345: A YANG Data Model for Network Topologies";
+ }
+
+ typedef link-id {
+ type inet:uri;
+ description
+ "An identifier for a link in a topology. The precise
+ structure of the link-id will be up to the implementation.
+ The identifier SHOULD be chosen such that the same link in a
+ real network topology will always be identified through the
+ same identifier, even if the data model is instantiated in
+ separate datastores. An implementation MAY choose to capture
+ semantics in the identifier -- for example, to indicate the
+ type of link and/or the type of topology of which the link is
+ a part.";
+ }
+
+ typedef tp-id {
+ type inet:uri;
+ description
+ "An identifier for termination points on a node. The precise
+ structure of the tp-id will be up to the implementation.
+ The identifier SHOULD be chosen such that the same termination
+ point in a real network topology will always be identified
+ through the same identifier, even if the data model is
+ instantiated in separate datastores. An implementation MAY
+ choose to capture semantics in the identifier -- for example,
+ to indicate the type of termination point and/or the type of
+ node that contains the termination point.";
+ }
+
+ grouping link-ref {
+ description
+ "This grouping can be used to reference a link in a specific
+ network. Although it is not used in this module, it is
+ defined here for the convenience of augmenting modules.";
+ leaf link-ref {
+ type leafref {
+ path "/nw:networks/nw:network[nw:network-id=current()/../"+
+ "network-ref]/nt:link/nt:link-id";
+ require-instance false;
+ }
+ description
+ "A type for an absolute reference to a link instance.
+ (This type should not be used for relative references.
+ In such a case, a relative path should be used instead.)";
+ }
+ uses nw:network-ref;
+ }
+
+ grouping tp-ref {
+ description
+ "This grouping can be used to reference a termination point
+ in a specific node. Although it is not used in this module,
+ it is defined here for the convenience of augmenting
+ modules.";
+ leaf tp-ref {
+ type leafref {
+ path "/nw:networks/nw:network[nw:network-id=current()/../"+
+ "network-ref]/nw:node[nw:node-id=current()/../"+
+ "node-ref]/nt:termination-point/nt:tp-id";
+ require-instance false;
+ }
+ description
+ "A type for an absolute reference to a termination point.
+ (This type should not be used for relative references.
+ In such a case, a relative path should be used instead.)";
+ }
+ uses nw:node-ref;
+ }
+
+ augment "/nw:networks/nw:network" {
+ description
+ "Add links to the network data model.";
+ list link {
+ key "link-id";
+ description
+ "A network link connects a local (source) node and
+ a remote (destination) node via a set of the respective
+ node's termination points. It is possible to have several
+ links between the same source and destination nodes.
+ Likewise, a link could potentially be re-homed between
+ termination points. Therefore, in order to ensure that we
+ would always know to distinguish between links, every link
+ is identified by a dedicated link identifier. Note that a
+ link models a point-to-point link, not a multipoint link.";
+ leaf link-id {
+ type link-id;
+ description
+ "The identifier of a link in the topology.
+ A link is specific to a topology to which it belongs.";
+ }
+ container source {
+ description
+ "This container holds the logical source of a particular
+ link.";
+ leaf source-node {
+ type leafref {
+ path "../../../nw:node/nw:node-id";
+ require-instance false;
+ }
+ description
+ "Source node identifier. Must be in the same topology.";
+ }
+ leaf source-tp {
+ type leafref {
+ path "../../../nw:node[nw:node-id=current()/../"+
+ "source-node]/termination-point/tp-id";
+ require-instance false;
+ }
+ description
+ "This termination point is located within the source node
+ and terminates the link.";
+ }
+ }
+
+ container destination {
+ description
+ "This container holds the logical destination of a
+ particular link.";
+ leaf dest-node {
+ type leafref {
+ path "../../../nw:node/nw:node-id";
+ require-instance false;
+ }
+ description
+ "Destination node identifier. Must be in the same
+ network.";
+ }
+ leaf dest-tp {
+ type leafref {
+ path "../../../nw:node[nw:node-id=current()/../"+
+ "dest-node]/termination-point/tp-id";
+ require-instance false;
+ }
+ description
+ "This termination point is located within the
+ destination node and terminates the link.";
+ }
+ }
+ list supporting-link {
+ key "network-ref link-ref";
+ description
+ "Identifies the link or links on which this link depends.";
+ leaf network-ref {
+ type leafref {
+ path "../../../nw:supporting-network/nw:network-ref";
+ require-instance false;
+ }
+ description
+ "This leaf identifies in which underlay topology
+ the supporting link is present.";
+ }
+
+ leaf link-ref {
+ type leafref {
+ path "/nw:networks/nw:network[nw:network-id=current()/"+
+ "../network-ref]/link/link-id";
+ require-instance false;
+ }
+ description
+ "This leaf identifies a link that is a part
+ of this link's underlay. Reference loops in which
+ a link identifies itself as its underlay, either
+ directly or transitively, are not allowed.";
+ }
+ }
+ }
+ }
+ augment "/nw:networks/nw:network/nw:node" {
+ description
+ "Augments termination points that terminate links.
+ Termination points can ultimately be mapped to interfaces.";
+ list termination-point {
+ key "tp-id";
+ description
+ "A termination point can terminate a link.
+ Depending on the type of topology, a termination point
+ could, for example, refer to a port or an interface.";
+ leaf tp-id {
+ type tp-id;
+ description
+ "Termination point identifier.";
+ }
+ list supporting-termination-point {
+ key "network-ref node-ref tp-ref";
+ description
+ "This list identifies any termination points on which a
+ given termination point depends or onto which it maps.
+ Those termination points will themselves be contained
+ in a supporting node. This dependency information can be
+ inferred from the dependencies between links. Therefore,
+ this item is not separately configurable. Hence, no
+ corresponding constraint needs to be articulated.
+ The corresponding information is simply provided by the
+ implementing system.";
+
+ leaf network-ref {
+ type leafref {
+ path "../../../nw:supporting-node/nw:network-ref";
+ require-instance false;
+ }
+ description
+ "This leaf identifies in which topology the
+ supporting termination point is present.";
+ }
+ leaf node-ref {
+ type leafref {
+ path "../../../nw:supporting-node/nw:node-ref";
+ require-instance false;
+ }
+ description
+ "This leaf identifies in which node the supporting
+ termination point is present.";
+ }
+ leaf tp-ref {
+ type leafref {
+ path "/nw:networks/nw:network[nw:network-id=current()/"+
+ "../network-ref]/nw:node[nw:node-id=current()/../"+
+ "node-ref]/termination-point/tp-id";
+ require-instance false;
+ }
+ description
+ "Reference to the underlay node (the underlay node must
+ be in a different topology).";
+ }
+ }
+ }
+ }
+}
diff --git a/build/yang-files/services/ietf-network@2018-02-26.yang b/build/yang-files/services/ietf-network@2018-02-26.yang
new file mode 100644
index 0000000..6a03d7e
--- /dev/null
+++ b/build/yang-files/services/ietf-network@2018-02-26.yang
@@ -0,0 +1,192 @@
+module ietf-network {
+ yang-version 1.1;
+ namespace "urn:ietf:params:xml:ns:yang:ietf-network";
+ prefix nw;
+
+ import ietf-inet-types {
+ prefix inet;
+ reference
+ "RFC 6991: Common YANG Data Types";
+ }
+
+ organization
+ "IETF I2RS (Interface to the Routing System) Working Group";
+
+ contact
+ "WG Web: <https://datatracker.ietf.org/wg/i2rs/>
+ WG List: <mailto:i2rs@ietf.org>
+
+ Editor: Alexander Clemm
+ <mailto:ludwig@clemm.org>
+
+ Editor: Jan Medved
+ <mailto:jmedved@cisco.com>
+
+ Editor: Robert Varga
+ <mailto:robert.varga@pantheon.tech>
+
+ Editor: Nitin Bahadur
+ <mailto:nitin_bahadur@yahoo.com>
+
+ Editor: Hariharan Ananthakrishnan
+ <mailto:hari@packetdesign.com>
+
+ Editor: Xufeng Liu
+ <mailto:xufeng.liu.ietf@gmail.com>";
+ description
+ "This module defines a common base data model for a collection
+ of nodes in a network. Node definitions are further used
+ in network topologies and inventories.
+
+ Copyright (c) 2018 IETF Trust and the persons identified as
+ authors of the code. All rights reserved.
+
+ Redistribution and use in source and binary forms, with or
+ without modification, is permitted pursuant to, and subject
+ to the license terms contained in, the Simplified BSD License
+ set forth in Section 4.c of the IETF Trust's Legal Provisions
+ Relating to IETF Documents
+ (https://trustee.ietf.org/license-info).
+
+ This version of this YANG module is part of RFC 8345;
+ see the RFC itself for full legal notices.";
+
+ revision 2018-02-26 {
+ description
+ "Initial revision.";
+ reference
+ "RFC 8345: A YANG Data Model for Network Topologies";
+ }
+
+ typedef node-id {
+ type inet:uri;
+ description
+ "Identifier for a node. The precise structure of the node-id
+ will be up to the implementation. For example, some
+ implementations MAY pick a URI that includes the network-id
+ as part of the path. The identifier SHOULD be chosen
+ such that the same node in a real network topology will
+ always be identified through the same identifier, even if
+ the data model is instantiated in separate datastores. An
+ implementation MAY choose to capture semantics in the
+ identifier -- for example, to indicate the type of node.";
+ }
+
+ typedef network-id {
+ type inet:uri;
+ description
+ "Identifier for a network. The precise structure of the
+ network-id will be up to the implementation. The identifier
+ SHOULD be chosen such that the same network will always be
+ identified through the same identifier, even if the data model
+ is instantiated in separate datastores. An implementation MAY
+ choose to capture semantics in the identifier -- for example,
+ to indicate the type of network.";
+ }
+
+ grouping network-ref {
+ description
+ "Contains the information necessary to reference a network --
+ for example, an underlay network.";
+ leaf network-ref {
+ type leafref {
+ path "/nw:networks/nw:network/nw:network-id";
+ require-instance false;
+ }
+ description
+ "Used to reference a network -- for example, an underlay
+ network.";
+ }
+ }
+
+ grouping node-ref {
+ description
+ "Contains the information necessary to reference a node.";
+ leaf node-ref {
+ type leafref {
+ path "/nw:networks/nw:network[nw:network-id=current()/../"+
+ "network-ref]/nw:node/nw:node-id";
+ require-instance false;
+ }
+ description
+ "Used to reference a node.
+ Nodes are identified relative to the network that
+ contains them.";
+ }
+ uses network-ref;
+ }
+
+ container networks {
+ description
+ "Serves as a top-level container for a list of networks.";
+ list network {
+ key "network-id";
+ description
+ "Describes a network.
+ A network typically contains an inventory of nodes,
+ topological information (augmented through the
+ network-topology data model), and layering information.";
+ leaf network-id {
+ type network-id;
+ description
+ "Identifies a network.";
+ }
+ container network-types {
+ description
+ "Serves as an augmentation target.
+ The network type is indicated through corresponding
+ presence containers augmented into this container.";
+ }
+ list supporting-network {
+ key "network-ref";
+ description
+ "An underlay network, used to represent layered network
+ topologies.";
+ leaf network-ref {
+ type leafref {
+ path "/nw:networks/nw:network/nw:network-id";
+ require-instance false;
+ }
+ description
+ "References the underlay network.";
+ }
+ }
+
+ list node {
+ key "node-id";
+ description
+ "The inventory of nodes of this network.";
+ leaf node-id {
+ type node-id;
+ description
+ "Uniquely identifies a node within the containing
+ network.";
+ }
+ list supporting-node {
+ key "network-ref node-ref";
+ description
+ "Represents another node that is in an underlay network
+ and that supports this node. Used to represent layering
+ structure.";
+ leaf network-ref {
+ type leafref {
+ path "../../../nw:supporting-network/nw:network-ref";
+ require-instance false;
+ }
+ description
+ "References the underlay network of which the
+ underlay node is a part.";
+ }
+ leaf node-ref {
+ type leafref {
+ path "/nw:networks/nw:network/nw:node/nw:node-id";
+ require-instance false;
+ }
+ description
+ "References the underlay node itself.";
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/cmd/bbf-adapter/main.go b/cmd/bbf-adapter/main.go
index d3fce99..2902091 100644
--- a/cmd/bbf-adapter/main.go
+++ b/cmd/bbf-adapter/main.go
@@ -42,7 +42,7 @@
type bbfAdapter struct {
conf *config.BBFAdapterConfig
volthaNbiClient *clients.VolthaNbiClient
- oltAppClient *clients.OltAppClient
+ onosClient *clients.OnosClient
sysrepoPlugin *sysrepo.SysrepoPlugin
kafkaConsumer *clients.KafkaConsumer
}
@@ -65,15 +65,15 @@
}
//Check if the REST APIs of the olt app are reachable
- a.oltAppClient = clients.NewOltAppClient(a.conf.OnosRestEndpoint, a.conf.OnosUser, a.conf.OnosPassword)
- if err := a.oltAppClient.CheckConnection(ctx); err != nil {
+ a.onosClient = clients.NewOnosClient(a.conf.OnosRestEndpoint, a.conf.OnosUser, a.conf.OnosPassword)
+ if err := a.onosClient.CheckConnection(ctx); err != nil {
logger.Fatalw(ctx, "failed-to-connect-to-onos-olt-app-api", log.Fields{"err": err})
} else {
probe.UpdateStatusFromContext(ctx, a.conf.OnosRestEndpoint, probe.ServiceStatusRunning)
}
//Create the global adapter that will be used by callbacks
- core.AdapterInstance = core.NewVolthaYangAdapter(a.volthaNbiClient, a.oltAppClient)
+ core.AdapterInstance = core.NewVolthaYangAdapter(a.volthaNbiClient, a.onosClient)
//Load sysrepo plugin
a.sysrepoPlugin, err = sysrepo.StartNewPlugin(ctx, a.conf.SchemaMountFilePath)
diff --git a/docs/README.md b/docs/README.md
index 5a835da..afb0a86 100644
--- a/docs/README.md
+++ b/docs/README.md
@@ -9,6 +9,7 @@
# Additional documentation
- [Deployment](deploy.md)
+- [Supported operations](supported_operations.md)
- [Code structure](code_structure.md)
- [Expanding functionality](expanding.md)
- [Output examples](output_examples.md)
\ No newline at end of file
diff --git a/docs/deploy.md b/docs/deploy.md
index c2f33fd..ff34166 100644
--- a/docs/deploy.md
+++ b/docs/deploy.md
@@ -42,9 +42,11 @@
kubectl -n voltha exec -it $(kubectl -n voltha get pods -l app=bbf-adapter -o name) -- netopeer2-cli
```
-Running the following instruction will connect to the adapter's netopeer2 instance as the default `voltha` user.
+Running the following instructions will connect to the adapter's netopeer2 instance as the default `voltha` user.
```
+searchpath /etc/sysrepo/yang
+ext-data /schema-mount.xml
connect --login voltha
```
@@ -54,6 +56,7 @@
### Getting device data
+Run the following commands inside the netopeer2-cli console.
```
get-data --datastore operational --filter-xpath /bbf-device-aggregation:*
```
@@ -62,11 +65,29 @@
Run the following commands inside the netopeer2-cli console.
```
-ext-data /schema-mount.xml
subscribe --stream bbf-xpon-onu-states
```
A notification will be shown when a new ONU is activated.
+### Provision and remove a service
+
+Run the following command in a separate terminal, from the root of this repository, to copy the example XMLs into the adapter's container.
+```
+kubectl cp examples/ voltha/$(kubectl -n voltha get pods -l app=bbf-adapter -o name | awk -F "/" '{print $2}'):/
+```
+To provision the service with one of the example XMLs, run the following command inside the netopeer2-cli console.
+```
+edit-config --target running --config=/examples/provision_service.xml
+```
+The details of the provisioned services can be retrived with the following command.
+```
+get-data --datastore operational --filter-xpath /bbf-nt-service-profile:*|/bbf-l2-access-attributes:*|/bbf-nt-line-profile:*
+```
+Finally, the service can be removed.
+```
+edit-config --target running --config=/examples/remove_service.xml
+```
+
## Stop the BBF adapter
```
helm delete -n voltha bbf
diff --git a/docs/images/bbf-adapter-architecture.svg b/docs/images/bbf-adapter-architecture.svg
index 25754ed..4a6771b 100644
--- a/docs/images/bbf-adapter-architecture.svg
+++ b/docs/images/bbf-adapter-architecture.svg
@@ -1,4 +1 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Do not edit this file with editors other than diagrams.net -->
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="281px" height="475px" viewBox="-0.5 -0.5 281 475" content="<mxfile host="app.diagrams.net" modified="2022-03-14T15:39:08.751Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36" etag="ge9tlxE5m3qdNw-N6kSt" version="17.1.2" type="device"><diagram id="kWiRV7-ioKWRuaYgKj7s" name="Page-1">3Vnfc9o4EP5reKRjW2DgMaHkeje5JA2Z9voobGGrFZZHFgH615+EJduyzM8EnOkLY61Xa+nb/Va7ogPGi/VfDKbxvzREpOM54boDPnc8b+gC8SsFm1zQA14uiBgOc5FbCqb4N1JCR0mXOESZocgpJRynpjCgSYICbsggY3Rlqs0pMb+awghZgmkAiS39jkMeq215g1L+BeEo1l92/VH+ZgG1stpJFsOQrioiMOmAMaOU50+L9RgRiZ3GJZ93t+NtsTCGEn7MhGcvvJtm/3TB168xjn59g88/QbenFvcKyVLtWK2WbzQEEaPLVKkhxtG6CXg40+qOvTC32K4IE0QXiLONUFGGPND/1M8nqSBx9bJWJeTeQEVSXIHbGyhFqNwcFdZLJMSDAuMEYNzeYWAELkmIpBW3A25XMeZomsJAvl0JMghZzBdEvZ5jQsaUULadC0KIhvNAyEOYxYWNjDP6C1XU/GCIZnPxZif+VZz3uNhGvz1sNZQVbF8FpWPYTSjj8UzC2p3N5l0YwpQj1vF8IhZ1O5NPEd+iUZeIMOQQJ1K55iUBGDddYaKc0ATV/KNEkOAoEUOWg3Ir0cciNdwo+QKHofxKo+vL4HAu4j5NHp0oNXX6FnN8x3bu6GK86befUIDrmZgMhhYorteAijvyLwQLsFDJNhlDKd2TVJzDSeX8sMr9ZEOoIBt4xyHWv1gcuRYyKBQnsxrKPEEjmkAyKaU1zpU695SmCrGfiPONKjPgklMTT7TG/D85XRxI+eiHMiafP6+rg40eJGK/lUly+EPbk4Ny2nak52UcMn4jSxQhCAjMMhxo8R0mpovl3s9xsACQLlmA9iWYXE98NkL7DILmgGGIQI5fzdW9ezjYp7FxPnxIDrk9v2US+RZqCeI0RYjtK2Zawaw1jEaHz6srJJ6PkgzAkcnAbzMZuEPLZw+Tl/Hjw11DXUiwhMZyKSGig9xVu50a6Qf6m1HPKEea0kLft0Pev1TI6xa83abPrNF6g4aWb3jNRADsVvjb4/3Ll5vtfhlqK2PmQH2gjAlcC6jHh8fpR8NHm/HtwLoyXnbxb+ejJLSzfwUeE8uyTPWqdaquYE+rU8vK9NJ1qi7p360i3dEaH30KqalPFMsjomgfR2ZLDeqRkW9AzfIqN241Q71DhvIdWoa2UVbs5w2BZ1fN0fOTsOXcPP3dWOXcwxkiMtxQhn+r7O6YkagvRQLhVlF677kVabhR2X96nMX+VtsScMRtx7nUHoz8ag/6aSTKiBb5Lb/1hBgWwEm3V261rsv5HWXFGznfc2pUHZ7J+YLjRV1Tu1K6NOftnu95Mn35szi/o4e8Euft7uOtnD/zBumc26rrn+b+kczOu7p3Z7ZXY3ZR+53M7EOGLs1s+6ai6Hr/DFq/cwAoPxWXH3oKnc8zdKKLxLD8pzZXL//uBpP/AQ==</diagram></mxfile>"><defs/><g><rect x="3.5" y="94" width="273" height="270" rx="40.5" ry="40.5" fill="#dae8fc" stroke="#6c8ebf" stroke-dasharray="3 3" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe flex-end; width: 58px; height: 1px; padding-top: 154px; margin-left: 214px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">voltha-northbound-bbf-adapter<br /><br />container</div></div></div></foreignObject><text x="272" y="158" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="end">voltha-nor...</text></switch></g><rect x="80" y="204" width="120" height="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 229px; margin-left: 81px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">sysrepo</div></div></div></foreignObject><text x="140" y="233" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">sysrepo</text></switch></g><path d="M 140 271.63 L 140 260.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 140 276.88 L 136.5 269.88 L 140 271.63 L 143.5 269.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 140 255.12 L 143.5 262.12 L 140 260.37 L 136.5 262.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><rect x="80" y="278" width="120" height="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 303px; margin-left: 81px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">bbf-adapter</div></div></div></foreignObject><text x="140" y="307" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">bbf-adapter</text></switch></g><rect x="80" y="132" width="120" height="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 157px; margin-left: 81px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">netopeer2</div></div></div></foreignObject><text x="140" y="161" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">netopeer2</text></switch></g><path d="M 140.03 197.63 L 140.03 184 L 140.03 202 L 140.03 188.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 140.03 202.88 L 136.53 195.88 L 140.03 197.63 L 143.53 195.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 140.03 183.12 L 143.53 190.12 L 140.03 188.37 L 136.53 190.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><ellipse cx="140" cy="30" rx="78" ry="30" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 154px; height: 1px; padding-top: 30px; margin-left: 63px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">NETCONF<br />client</div></div></div></foreignObject><text x="140" y="34" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">NETCONF...</text></switch></g><rect x="0" y="424" width="120" height="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 449px; margin-left: 1px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">VOLTHA core</div></div></div></foreignObject><text x="60" y="453" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">VOLTHA core</text></switch></g><rect x="160" y="424" width="120" height="50" fill="rgb(255, 255, 255)" stroke="rgb(0, 0, 0)" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 449px; margin-left: 161px;"><div data-drawio-colors="color: rgb(0, 0, 0); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; white-space: normal; overflow-wrap: normal;">ONOS</div></div></div></foreignObject><text x="220" y="453" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="12px" text-anchor="middle">ONOS</text></switch></g><path d="M 107.06 333.65 L 62.94 418.35" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 109.48 328.99 L 109.35 336.82 L 107.06 333.65 L 103.15 333.58 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 60.52 423.01 L 60.65 415.18 L 62.94 418.35 L 66.85 418.42 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 376px; margin-left: 85px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; background-color: rgb(255, 255, 255); white-space: nowrap;">gRPC API</div></div></div></foreignObject><text x="85" y="380" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">gRPC API</text></switch></g><path d="M 178.19 333.48 L 217.33 418.22" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 175.99 328.71 L 182.1 333.6 L 178.19 333.48 L 175.75 336.54 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 219.53 422.99 L 213.42 418.1 L 217.33 418.22 L 219.77 415.16 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 376px; margin-left: 198px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; background-color: rgb(255, 255, 255); white-space: nowrap;">REST API</div></div></div></foreignObject><text x="198" y="380" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">REST API</text></switch></g><path d="M 140 125.63 L 140 66.37" fill="none" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 140 130.88 L 136.5 123.88 L 140 125.63 L 143.5 123.88 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><path d="M 140 61.12 L 143.5 68.12 L 140 66.37 L 136.5 68.12 Z" fill="rgb(0, 0, 0)" stroke="rgb(0, 0, 0)" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 1px; height: 1px; padding-top: 81px; margin-left: 140px;"><div data-drawio-colors="color: rgb(0, 0, 0); background-color: rgb(255, 255, 255); " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 11px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; pointer-events: none; background-color: rgb(255, 255, 255); white-space: nowrap;">NETCONF</div></div></div></foreignObject><text x="140" y="85" fill="rgb(0, 0, 0)" font-family="Helvetica" font-size="11px" text-anchor="middle">NETCONF</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
\ No newline at end of file
+<svg version="1.1" width="960" height="540" viewBox="0.0 0.0 960.0 540.0" fill="none" stroke="none" stroke-linecap="square" stroke-miterlimit="10" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><clipPath id="g13ae80c9d72_0_3.0"><path d="m0 0l960.0 0l0 540.0l-960.0 0l0 -540.0z" clip-rule="nonzero"/></clipPath><g clip-path="url(#g13ae80c9d72_0_3.0)"><path fill="#000000" fill-opacity="0.0" d="m0 0l960.0 0l0 540.0l-960.0 0z" fill-rule="evenodd"/><path fill="#ffffff" d="m532.85626 413.11975l250.45673 0l0 85.79529l-250.45673 0z" fill-rule="evenodd"/><path stroke="#595959" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m532.85626 413.11975l250.45673 0l0 85.79529l-250.45673 0z" fill-rule="evenodd"/><path fill="#ffffff" d="m195.91664 410.14532l250.45671 0l0 85.79529l-250.45671 0z" fill-rule="evenodd"/><path stroke="#595959" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m195.91664 410.14532l250.45671 0l0 85.79529l-250.45671 0z" fill-rule="evenodd"/><path fill="#eeeeee" d="m356.65247 41.08497l246.01575 0l0 58.551186l-246.01575 0z" fill-rule="evenodd"/><path stroke="#595959" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m356.65247 41.08497l246.01575 0l0 58.551186l-246.01575 0z" fill-rule="evenodd"/><path fill="#000000" d="m404.89493 66.280556l0 -13.359371l1.8125 0l7.015625 10.484375l0 -10.484375l1.6875 0l0 13.359371l-1.8125 0l-7.015625 -10.499996l0 10.499996l-1.6875 0zm13.519836 0l0 -13.359371l9.65625 0l0 1.578125l-7.875 0l0 4.09375l7.375 0l0 1.5625l-7.375 0l0 4.546871l8.1875 0l0 1.578125l-9.96875 0zm15.818573 0l0 -11.781246l-4.40625 0l0 -1.578125l10.578125 0l0 1.578125l-4.40625 0l0 11.781246l-1.765625 0zm17.520966 -4.687496l1.765625 0.453125q-0.5625 2.1718712 -2.0 3.3281212q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.5468712q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.9062462q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.8593712 1.390625 -2.5468712zm3.4104614 -1.8125q0 -3.328125 1.78125 -5.203125q1.78125 -1.890625 4.609375 -1.890625q1.84375 0 3.328125 0.890625q1.484375 0.875 2.265625 2.46875q0.78125 1.578125 0.78125 3.578125q0 2.03125 -0.828125 3.640625q-0.8125 1.5937462 -2.3125 2.4218712q-1.5 0.828125 -3.25 0.828125q-1.875 0 -3.359375 -0.90625q-1.484375 -0.921875 -2.25 -2.4999962q-0.765625 -1.578125 -0.765625 -3.328125zm1.8125 0.015625q0 2.421875 1.296875 3.8125q1.296875 1.3906212 3.265625 1.3906212q2.0 0 3.28125 -1.4062462q1.28125 -1.40625 1.28125 -3.984375q0 -1.625 -0.546875 -2.84375q-0.546875 -1.21875 -1.609375 -1.875q-1.0625 -0.671875 -2.375 -0.671875q-1.890625 0 -3.25 1.296875q-1.34375 1.28125 -1.34375 4.28125zm13.214539 6.484371l0 -13.359371l1.8125 0l7.015625 10.484375l0 -10.484375l1.6875 0l0 13.359371l-1.8125 0l-7.015625 -10.499996l0 10.499996l-1.6875 0zm13.582336 0l0 -13.359371l9.015625 0l0 1.578125l-7.25 0l0 4.140625l6.265625 0l0 1.578125l-6.265625 0l0 6.062496l-1.765625 0zm26.016785 -4.687496l1.765625 0.453125q-0.5625 2.1718712 -2.0 3.3281212q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.5468712q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.9062462q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.8593712 1.390625 -2.5468712zm3.691681 4.687496l0 -13.359371l1.640625 0l0 13.359371l-1.640625 0zm4.1917114 -11.468746l0 -1.890625l1.640625 0l0 1.890625l-1.640625 0zm0 11.468746l0 -9.671871l1.640625 0l0 9.671871l-1.640625 0zm10.769775 -3.1093712l1.6875 0.203125q-0.40625 1.4843712 -1.484375 2.3124962q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3124962 -1.234375 -3.6718712q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.4531212q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.5156212zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.141357 5.765621l0 -9.671871l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953121l-1.640625 0l0 -5.890621q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.281246l-1.640625 0zm13.953857 -1.46875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9374962l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6874962 0.078125 0.8906212q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm0.9489136 -1.4218712l1.625 -0.25q0.125 0.9687462 0.75 1.4999962q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.0937462q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.8281212 -0.484375 1.5468712q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.3281212z" fill-rule="nonzero"/><path fill="#000000" d="m372.05063 92.20243q-1.359375 -1.703125 -2.296875 -4.0q-0.9375 -2.296875 -0.9375 -4.765625q0 -2.15625 0.703125 -4.140625q0.828125 -2.3125 2.53125 -4.59375l1.171875 0q-1.09375 1.890625 -1.453125 2.703125q-0.546875 1.25 -0.875 2.625q-0.390625 1.703125 -0.390625 3.421875q0 4.375 2.71875 8.75l-1.171875 0zm9.712677 -7.03125l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.594452 5.765625l0 -1.875l1.875 0l0 1.875l-1.875 0zm4.417694 0.796875l1.59375 0.234375q0.109375 0.75 0.5625 1.078125q0.609375 0.453125 1.671875 0.453125q1.140625 0 1.75 -0.453125q0.625 -0.453125 0.84375 -1.265625q0.125 -0.5 0.109375 -2.109375q-1.0625 1.265625 -2.671875 1.265625q-2.0 0 -3.09375 -1.4375q-1.09375 -1.4375 -1.09375 -3.453125q0 -1.390625 0.5 -2.5625q0.515625 -1.171875 1.453125 -1.796875q0.953125 -0.640625 2.25 -0.640625q1.703125 0 2.8125 1.375l0 -1.15625l1.515625 0l0 8.359375q0 2.265625 -0.46875 3.203125q-0.453125 0.9375 -1.453125 1.484375q-0.984375 0.546875 -2.453125 0.546875q-1.71875 0 -2.796875 -0.78125q-1.0625 -0.765625 -1.03125 -2.34375zm1.359375 -5.8125q0 1.90625 0.75 2.78125q0.765625 0.875 1.90625 0.875q1.125 0 1.890625 -0.859375q0.765625 -0.875 0.765625 -2.734375q0 -1.78125 -0.796875 -2.671875q-0.78125 -0.90625 -1.890625 -0.90625q-1.09375 0 -1.859375 0.890625q-0.765625 0.875 -0.765625 2.625zm9.781952 5.015625l0 -1.875l1.875 0l0 1.875l-1.875 0zm19.647858 -4.6875l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm3.6917114 4.6875l0 -13.359375l1.640625 0l0 13.359375l-1.640625 0zm3.582306 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm15.625732 4.84375l0 -1.421875q-1.125 1.640625 -3.0625 1.640625q-0.859375 0 -1.609375 -0.328125q-0.734375 -0.328125 -1.09375 -0.828125q-0.359375 -0.5 -0.5 -1.21875q-0.109375 -0.46875 -0.109375 -1.53125l0 -5.984375l1.640625 0l0 5.359375q0 1.28125 0.109375 1.734375q0.15625 0.640625 0.65625 1.015625q0.5 0.375 1.234375 0.375q0.734375 0 1.375 -0.375q0.65625 -0.390625 0.921875 -1.03125q0.265625 -0.65625 0.265625 -1.890625l0 -5.1875l1.640625 0l0 9.671875l-1.46875 0zm10.313202 0l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm19.016357 0.140625l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm3.410431 -1.8125q0 -3.328125 1.78125 -5.203125q1.78125 -1.890625 4.609375 -1.890625q1.84375 0 3.328125 0.890625q1.484375 0.875 2.265625 2.46875q0.78125 1.578125 0.78125 3.578125q0 2.03125 -0.828125 3.640625q-0.8125 1.59375 -2.3125 2.421875q-1.5 0.828125 -3.25 0.828125q-1.875 0 -3.359375 -0.90625q-1.484375 -0.921875 -2.25 -2.5q-0.765625 -1.578125 -0.765625 -3.328125zm1.8125 0.015625q0 2.421875 1.296875 3.8125q1.296875 1.390625 3.265625 1.390625q2.0 0 3.28125 -1.40625q1.28125 -1.40625 1.28125 -3.984375q0 -1.625 -0.546875 -2.84375q-0.546875 -1.21875 -1.609375 -1.875q-1.0625 -0.671875 -2.375 -0.671875q-1.890625 0 -3.25 1.296875q-1.34375 1.28125 -1.34375 4.28125zm15.914795 6.484375l5.125 -13.359375l1.90625 0l5.46875 13.359375l-2.015625 0l-1.546875 -4.046875l-5.59375 0l-1.46875 4.046875l-1.875 0zm3.859375 -5.484375l4.53125 0l-1.40625 -3.703125q-0.625 -1.6875 -0.9375 -2.765625q-0.265625 1.28125 -0.71875 2.546875l-1.46875 3.921875zm16.162323 1.9375l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm9.328125 0l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm9.640625 0.4375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm8.485046 2.875l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm9.328125 0l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm15.323975 2.890625l0 -13.359375l2.65625 0l3.15625 9.453125q0.4375 1.328125 0.640625 1.984375q0.234375 -0.734375 0.703125 -2.140625l3.203125 -9.296875l2.375 0l0 13.359375l-1.703125 0l0 -11.171875l-3.875 11.171875l-1.59375 0l-3.859375 -11.375l0 11.375l-1.703125 0zm25.118896 -4.6875l1.765625 0.453125q-0.5625 2.171875 -2.0 3.328125q-1.4375 1.140625 -3.53125 1.140625q-2.15625 0 -3.515625 -0.875q-1.34375 -0.890625 -2.0625 -2.546875q-0.703125 -1.671875 -0.703125 -3.59375q0 -2.078125 0.796875 -3.625q0.796875 -1.5625 2.265625 -2.359375q1.484375 -0.8125 3.25 -0.8125q2.0 0 3.359375 1.015625q1.375 1.015625 1.90625 2.875l-1.734375 0.40625q-0.46875 -1.453125 -1.359375 -2.109375q-0.875 -0.671875 -2.203125 -0.671875q-1.546875 0 -2.578125 0.734375q-1.03125 0.734375 -1.453125 1.984375q-0.421875 1.234375 -0.421875 2.5625q0 1.703125 0.5 2.96875q0.5 1.265625 1.546875 1.90625q1.046875 0.625 2.265625 0.625q1.484375 0 2.515625 -0.859375q1.03125 -0.859375 1.390625 -2.546875zm4.8167114 8.609375l-1.1875 0q2.734375 -4.375 2.734375 -8.75q0 -1.71875 -0.390625 -3.390625q-0.3125 -1.375 -0.875 -2.625q-0.359375 -0.828125 -1.46875 -2.734375l1.1875 0q1.703125 2.28125 2.53125 4.59375q0.6875 1.984375 0.6875 4.140625q0 2.46875 -0.9375 4.765625q-0.9375 2.296875 -2.28125 4.0z" fill-rule="nonzero"/><path fill="#c9daf8" d="m150.74474 117.69498l657.8268 0l0 274.3937l-657.8268 0z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m608.5939 110.74638l200.66138 0l0 51.716537l-200.66138 0z" fill-rule="evenodd"/><path fill="#000000" d="m622.99866 132.54639l-2.625 -6.90625l1.234375 0l1.484375 4.140625q0.234375 0.65625 0.4375 1.390625q0.15625 -0.546875 0.4375 -1.3125l1.53125 -4.21875l1.21875 0l-2.625 6.90625l-1.09375 0zm4.3046875 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6312256 3.453125l0 -9.546875l1.171875 0l0 9.546875l-1.171875 0zm5.5391846 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm1.1405029 1.046875l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm11.928101 -0.859375q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm2.5374756 0.609375l0 -1.1875l3.59375 0l0 1.1875l-3.59375 0zm4.8914795 2.859375l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm6.9749756 -3.453125q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6312256 3.453125l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0zm7.0164795 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm1.1405029 1.046875l0 -9.546875l1.171875 0l0 3.421875q0.828125 -0.9375 2.078125 -0.9375q0.765625 0 1.328125 0.296875q0.5625 0.296875 0.8125 0.84375q0.25 0.53125 0.25 1.546875l0 4.375l-1.171875 0l0 -4.375q0 -0.890625 -0.390625 -1.28125q-0.375 -0.40625 -1.078125 -0.40625q-0.515625 0 -0.984375 0.28125q-0.453125 0.265625 -0.65625 0.734375q-0.1875 0.453125 -0.1875 1.265625l0 3.78125l-1.171875 0zm8.490601 0l-1.078125 0l0 -9.546875l1.171875 0l0 3.40625q0.734375 -0.921875 1.890625 -0.921875q0.640625 0 1.203125 0.265625q0.578125 0.25 0.9375 0.71875q0.375 0.453125 0.578125 1.109375q0.203125 0.65625 0.203125 1.40625q0 1.78125 -0.875 2.75q-0.875 0.96875 -2.109375 0.96875q-1.21875 0 -1.921875 -1.015625l0 0.859375zm0 -3.5q0 1.234375 0.328125 1.78125q0.5625 0.90625 1.5 0.90625q0.765625 0 1.328125 -0.65625q0.5625 -0.671875 0.5625 -2.0q0 -1.34375 -0.546875 -1.984375q-0.53125 -0.65625 -1.296875 -0.65625q-0.765625 0 -1.328125 0.671875q-0.546875 0.671875 -0.546875 1.9375zm5.8968506 0.046875q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm11.178101 3.453125l0 -1.015625q-0.8125 1.171875 -2.1875 1.171875q-0.609375 0 -1.140625 -0.234375q-0.53125 -0.234375 -0.796875 -0.578125q-0.25 -0.359375 -0.359375 -0.875q-0.0625 -0.34375 -0.0625 -1.09375l0 -4.28125l1.171875 0l0 3.828125q0 0.921875 0.0625 1.234375q0.109375 0.46875 0.46875 0.734375q0.359375 0.25 0.890625 0.25q0.515625 0 0.984375 -0.265625q0.46875 -0.265625 0.65625 -0.734375q0.1875 -0.46875 0.1875 -1.34375l0 -3.703125l1.171875 0l0 6.90625l-1.046875 0zm2.8812256 0l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm11.896851 0l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm6.1781006 0.59375l0 -1.1875l3.59375 0l0 1.1875l-3.59375 0zm5.9696045 2.859375l-1.078125 0l0 -9.546875l1.171875 0l0 3.40625q0.734375 -0.921875 1.890625 -0.921875q0.640625 0 1.203125 0.265625q0.578125 0.25 0.9375 0.71875q0.375 0.453125 0.578125 1.109375q0.203125 0.65625 0.203125 1.40625q0 1.78125 -0.875 2.75q-0.875 0.96875 -2.109375 0.96875q-1.21875 0 -1.921875 -1.015625l0 0.859375zm0 -3.5q0 1.234375 0.328125 1.78125q0.5625 0.90625 1.5 0.90625q0.765625 0 1.328125 -0.65625q0.5625 -0.671875 0.5625 -2.0q0 -1.34375 -0.546875 -1.984375q-0.53125 -0.65625 -1.296875 -0.65625q-0.765625 0 -1.328125 0.671875q-0.546875 0.671875 -0.546875 1.9375zm7.4124756 3.5l-1.078125 0l0 -9.546875l1.171875 0l0 3.40625q0.734375 -0.921875 1.890625 -0.921875q0.640625 0 1.203125 0.265625q0.578125 0.25 0.9375 0.71875q0.375 0.453125 0.578125 1.109375q0.203125 0.65625 0.203125 1.40625q0 1.78125 -0.875 2.75q-0.875 0.96875 -2.109375 0.96875q-1.21875 0 -1.921875 -1.015625l0 0.859375zm0 -3.5q0 1.234375 0.328125 1.78125q0.5625 0.90625 1.5 0.90625q0.765625 0 1.328125 -0.65625q0.5625 -0.671875 0.5625 -2.0q0 -1.34375 -0.546875 -1.984375q-0.53125 -0.65625 -1.296875 -0.65625q-0.765625 0 -1.328125 0.671875q-0.546875 0.671875 -0.546875 1.9375zm6.6156006 3.5l0 -6.0l-1.03125 0l0 -0.90625l1.03125 0l0 -0.734375q0 -0.703125 0.125 -1.046875q0.171875 -0.453125 0.59375 -0.734375q0.421875 -0.28125 1.203125 -0.28125q0.484375 0 1.09375 0.109375l-0.1875 1.03125q-0.359375 -0.0625 -0.6875 -0.0625q-0.53125 0 -0.75 0.234375q-0.21875 0.21875 -0.21875 0.84375l0 0.640625l1.34375 0l0 0.90625l-1.34375 0l0 6.0l-1.171875 0zm2.968628 -2.859375l0 -1.1875l3.59375 0l0 1.1875l-3.59375 0zm9.4071045 2.0q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm7.4749756 3.46875l0 -0.875q-0.65625 1.03125 -1.9375 1.03125q-0.8125 0 -1.515625 -0.453125q-0.6875 -0.453125 -1.078125 -1.265625q-0.375 -0.828125 -0.375 -1.890625q0 -1.03125 0.34375 -1.875q0.34375 -0.84375 1.03125 -1.28125q0.703125 -0.453125 1.546875 -0.453125q0.625 0 1.109375 0.265625q0.5 0.25 0.796875 0.671875l0 -3.421875l1.171875 0l0 9.546875l-1.09375 0zm-3.703125 -3.453125q0 1.328125 0.5625 1.984375q0.5625 0.65625 1.328125 0.65625q0.765625 0 1.296875 -0.625q0.53125 -0.625 0.53125 -1.90625q0 -1.421875 -0.546875 -2.078125q-0.546875 -0.671875 -1.34375 -0.671875q-0.78125 0 -1.3125 0.640625q-0.515625 0.625 -0.515625 2.0zm11.146851 2.59375q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm2.9906006 6.125l0 -9.5625l1.078125 0l0 0.890625q0.375 -0.53125 0.84375 -0.78125q0.484375 -0.265625 1.15625 -0.265625q0.875 0 1.546875 0.453125q0.6875 0.453125 1.03125 1.28125q0.34375 0.828125 0.34375 1.828125q0 1.046875 -0.375 1.90625q-0.375 0.84375 -1.109375 1.296875q-0.71875 0.453125 -1.53125 0.453125q-0.578125 0 -1.046875 -0.25q-0.46875 -0.25 -0.765625 -0.625l0 3.375l-1.171875 0zm1.0625 -6.078125q0 1.34375 0.53125 1.984375q0.546875 0.625 1.3125 0.625q0.78125 0 1.34375 -0.65625q0.5625 -0.65625 0.5625 -2.046875q0 -1.3125 -0.546875 -1.96875q-0.546875 -0.671875 -1.296875 -0.671875q-0.75 0 -1.328125 0.703125q-0.578125 0.703125 -0.578125 2.03125zm8.912476 2.375l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm5.874878 -1.171875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.5062256 4.125l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0z" fill-rule="nonzero"/><path fill="#000000" d="m750.817 146.01514l1.15625 0.15625q-0.1875 1.1875 -0.96875 1.859375q-0.78125 0.671875 -1.921875 0.671875q-1.40625 0 -2.28125 -0.921875q-0.859375 -0.9375 -0.859375 -2.65625q0 -1.125 0.375 -1.96875q0.375 -0.84375 1.125 -1.25q0.765625 -0.421875 1.65625 -0.421875q1.125 0 1.84375 0.578125q0.71875 0.5625 0.921875 1.609375l-1.140625 0.171875q-0.171875 -0.703125 -0.59375 -1.046875q-0.40625 -0.359375 -0.984375 -0.359375q-0.890625 0 -1.453125 0.640625q-0.546875 0.640625 -0.546875 2.0q0 1.40625 0.53125 2.03125q0.546875 0.625 1.40625 0.625q0.6875 0 1.140625 -0.421875q0.46875 -0.421875 0.59375 -1.296875zm1.7109375 -0.921875q0 -1.921875 1.078125 -2.84375q0.890625 -0.765625 2.171875 -0.765625q1.421875 0 2.328125 0.9375q0.90625 0.921875 0.90625 2.578125q0 1.328125 -0.40625 2.09375q-0.390625 0.765625 -1.15625 1.1875q-0.765625 0.421875 -1.671875 0.421875q-1.453125 0 -2.359375 -0.921875q-0.890625 -0.9375 -0.890625 -2.6875zm1.203125 0q0 1.328125 0.578125 1.984375q0.59375 0.65625 1.46875 0.65625q0.875 0 1.453125 -0.65625q0.578125 -0.671875 0.578125 -2.03125q0 -1.28125 -0.59375 -1.9375q-0.578125 -0.65625 -1.4375 -0.65625q-0.875 0 -1.46875 0.65625q-0.578125 0.65625 -0.578125 1.984375zm6.6468506 3.453125l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm9.974976 -1.046875l0.171875 1.03125q-0.5 0.109375 -0.890625 0.109375q-0.640625 0 -1.0 -0.203125q-0.34375 -0.203125 -0.484375 -0.53125q-0.140625 -0.328125 -0.140625 -1.390625l0 -3.96875l-0.859375 0l0 -0.90625l0.859375 0l0 -1.71875l1.171875 -0.703125l0 2.421875l1.171875 0l0 0.90625l-1.171875 0l0 4.046875q0 0.5 0.046875 0.640625q0.0625 0.140625 0.203125 0.234375q0.140625 0.078125 0.40625 0.078125q0.203125 0 0.515625 -0.046875zm5.656128 0.1875q-0.65625 0.5625 -1.265625 0.796875q-0.59375 0.21875 -1.28125 0.21875q-1.140625 0 -1.75 -0.546875q-0.609375 -0.5625 -0.609375 -1.4375q0 -0.5 0.21875 -0.921875q0.234375 -0.421875 0.609375 -0.671875q0.375 -0.25 0.84375 -0.390625q0.34375 -0.078125 1.046875 -0.171875q1.421875 -0.171875 2.09375 -0.40625q0 -0.234375 0 -0.296875q0 -0.71875 -0.328125 -1.015625q-0.453125 -0.390625 -1.34375 -0.390625q-0.8125 0 -1.21875 0.296875q-0.390625 0.28125 -0.578125 1.015625l-1.140625 -0.15625q0.15625 -0.734375 0.515625 -1.1875q0.359375 -0.453125 1.03125 -0.6875q0.671875 -0.25 1.5625 -0.25q0.890625 0 1.4375 0.203125q0.5625 0.203125 0.8125 0.53125q0.265625 0.3125 0.375 0.796875q0.046875 0.296875 0.046875 1.078125l0 1.5625q0 1.625 0.078125 2.0625q0.078125 0.4375 0.296875 0.828125l-1.21875 0q-0.1875 -0.359375 -0.234375 -0.859375zm-0.09375 -2.609375q-0.640625 0.265625 -1.921875 0.4375q-0.71875 0.109375 -1.015625 0.25q-0.296875 0.125 -0.46875 0.375q-0.15625 0.25 -0.15625 0.546875q0 0.46875 0.34375 0.78125q0.359375 0.3125 1.046875 0.3125q0.671875 0 1.203125 -0.296875q0.53125 -0.296875 0.78125 -0.8125q0.1875 -0.390625 0.1875 -1.171875l0 -0.421875zm3.0062256 -4.71875l0 -1.359375l1.171875 0l0 1.359375l-1.171875 0zm0 8.1875l0 -6.90625l1.171875 0l0 6.90625l-1.171875 0zm2.9454346 0l0 -6.90625l1.0625 0l0 0.984375q0.75 -1.140625 2.1875 -1.140625q0.625 0 1.15625 0.21875q0.53125 0.21875 0.78125 0.59375q0.265625 0.359375 0.375 0.859375q0.0625 0.328125 0.0625 1.140625l0 4.25l-1.171875 0l0 -4.203125q0 -0.71875 -0.140625 -1.0625q-0.140625 -0.359375 -0.484375 -0.5625q-0.34375 -0.21875 -0.8125 -0.21875q-0.75 0 -1.296875 0.46875q-0.546875 0.46875 -0.546875 1.796875l0 3.78125l-1.171875 0zm12.146851 -2.21875l1.203125 0.140625q-0.28125 1.0625 -1.0625 1.65625q-0.765625 0.578125 -1.96875 0.578125q-1.515625 0 -2.40625 -0.9375q-0.890625 -0.9375 -0.890625 -2.609375q0 -1.75 0.890625 -2.703125q0.90625 -0.96875 2.34375 -0.96875q1.390625 0 2.265625 0.9375q0.875 0.9375 0.875 2.65625q0 0.109375 0 0.3125l-5.15625 0q0.0625 1.140625 0.640625 1.75q0.578125 0.59375 1.4375 0.59375q0.65625 0 1.109375 -0.328125q0.453125 -0.34375 0.71875 -1.078125zm-3.84375 -1.90625l3.859375 0q-0.078125 -0.859375 -0.4375 -1.296875q-0.5625 -0.6875 -1.453125 -0.6875q-0.8125 0 -1.359375 0.546875q-0.546875 0.53125 -0.609375 1.4375zm6.5062256 4.125l0 -6.90625l1.0625 0l0 1.046875q0.40625 -0.734375 0.734375 -0.96875q0.34375 -0.234375 0.765625 -0.234375q0.59375 0 1.203125 0.375l-0.40625 1.078125q-0.4375 -0.25 -0.859375 -0.25q-0.390625 0 -0.703125 0.234375q-0.296875 0.234375 -0.421875 0.640625q-0.203125 0.625 -0.203125 1.359375l0 3.625l-1.171875 0z" fill-rule="nonzero"/><path fill="#ffffff" d="m356.65158 154.82513l246.01572 0l0 54.519684l-246.01572 0z" fill-rule="evenodd"/><path stroke="#595959" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m356.65158 154.82513l246.01572 0l0 54.519684l-246.01572 0z" fill-rule="evenodd"/><path fill="#000000" d="m438.88083 182.00497l0 -9.671875l1.46875 0l0 1.375q1.0625 -1.59375 3.078125 -1.59375q0.875 0 1.609375 0.3125q0.734375 0.3125 1.09375 0.828125q0.375 0.5 0.515625 1.203125q0.09375 0.453125 0.09375 1.59375l0 5.953125l-1.640625 0l0 -5.890625q0 -1.0 -0.203125 -1.484375q-0.1875 -0.5 -0.671875 -0.796875q-0.484375 -0.296875 -1.140625 -0.296875q-1.046875 0 -1.8125 0.671875q-0.75 0.65625 -0.75 2.515625l0 5.28125l-1.640625 0zm17.000702 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm12.719482 4.296875l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm0.9957886 -3.375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm9.297607 8.546875l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm15.516327 1.671875l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm15.766357 2.65625l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125702 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm14.3845825 -1.578125l0 1.578125l-8.8281555 0q-0.015625 -0.59375 0.18753052 -1.140625q0.34375 -0.90625 1.078125 -1.78125q0.75 -0.875 2.15625 -2.015625q2.171875 -1.78125 2.9375 -2.828125q0.765625 -1.046875 0.765625 -1.96875q0 -0.984375 -0.703125 -1.640625q-0.6875 -0.671875 -1.8125 -0.671875q-1.1875 0 -1.90625 0.71875q-0.703125 0.703125 -0.703125 1.953125l-1.6875 -0.171875q0.171875 -1.890625 1.296875 -2.875q1.140625 -0.984375 3.03125 -0.984375q1.921875 0 3.046875 1.0625q1.125 1.0625 1.125 2.640625q0 0.796875 -0.328125 1.578125q-0.328125 0.78125 -1.09375 1.640625q-0.75 0.84375 -2.53125 2.34375q-1.46875 1.234375 -1.890625 1.6875q-0.421875 0.4375 -0.6875 0.875l6.546875 0z" fill-rule="nonzero"/><path fill="#000000" d="m433.24637 197.60497l0 -8.59375l1.15625 0l4.515625 6.75l0 -6.75l1.09375 0l0 8.59375l-1.171875 0l-4.515625 -6.75l0 6.75l-1.078125 0zm8.697266 0l0 -8.59375l6.203125 0l0 1.015625l-5.0625 0l0 2.625l4.75 0l0 1.015625l-4.75 0l0 2.921875l5.265625 0l0 1.015625l-6.40625 0zm10.160156 0l0 -7.578125l-2.828125 0l0 -1.015625l6.8125 0l0 1.015625l-2.84375 0l0 7.578125l-1.140625 0zm11.283203 -3.015625l1.125 0.296875q-0.359375 1.390625 -1.28125 2.125q-0.921875 0.734375 -2.265625 0.734375q-1.390625 0 -2.265625 -0.5625q-0.875 -0.5625 -1.328125 -1.625q-0.453125 -1.078125 -0.453125 -2.3125q0 -1.34375 0.515625 -2.34375q0.515625 -1.0 1.453125 -1.515625q0.953125 -0.515625 2.09375 -0.515625q1.28125 0 2.15625 0.65625q0.890625 0.65625 1.234375 1.84375l-1.125 0.265625q-0.296875 -0.9375 -0.875 -1.359375q-0.5625 -0.4375 -1.421875 -0.4375q-0.984375 0 -1.65625 0.484375q-0.65625 0.46875 -0.9375 1.265625q-0.265625 0.796875 -0.265625 1.65625q0 1.09375 0.3125 1.90625q0.328125 0.8125 1.0 1.21875q0.671875 0.40625 1.46875 0.40625q0.953125 0 1.609375 -0.546875q0.671875 -0.546875 0.90625 -1.640625zm2.1816406 -1.171875q0 -2.140625 1.140625 -3.34375q1.15625 -1.21875 2.96875 -1.21875q1.203125 0 2.15625 0.578125q0.953125 0.5625 1.453125 1.578125q0.5 1.015625 0.5 2.3125q0 1.296875 -0.53125 2.328125q-0.53125 1.03125 -1.5 1.5625q-0.953125 0.53125 -2.078125 0.53125q-1.21875 0 -2.171875 -0.578125q-0.953125 -0.59375 -1.453125 -1.59375q-0.484375 -1.015625 -0.484375 -2.15625zm1.171875 0.015625q0 1.5625 0.828125 2.453125q0.84375 0.890625 2.109375 0.890625q1.28125 0 2.109375 -0.890625q0.828125 -0.90625 0.828125 -2.578125q0 -1.046875 -0.359375 -1.828125q-0.34375 -0.78125 -1.03125 -1.203125q-0.6875 -0.4375 -1.53125 -0.4375q-1.203125 0 -2.078125 0.828125q-0.875 0.828125 -0.875 2.765625zm8.505859 4.171875l0 -8.59375l1.15625 0l4.515625 6.75l0 -6.75l1.09375 0l0 8.59375l-1.171875 0l-4.515625 -6.75l0 6.75l-1.078125 0zm8.728516 0l0 -8.59375l5.796875 0l0 1.015625l-4.65625 0l0 2.65625l4.03125 0l0 1.015625l-4.03125 0l0 3.90625l-1.140625 0zm10.0546875 -1.859375l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71875q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.5q-0.625 -0.515625 -0.796875 -1.5zm10.671875 -0.140625l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.861328 3.703125l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0zm5.730438 0l-2.3593445 -6.21875l1.109375 0l1.3437195 3.71875q0.203125 0.609375 0.390625 1.25q0.140625 -0.484375 0.390625 -1.171875l1.390625 -3.796875l1.078125 0l-2.359375 6.21875l-0.984375 0zm8.53125 -2.0l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53125 -1.78125 0.53125q-1.359375 0 -2.171875 -0.84375q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125zm5.861328 3.703125l0 -6.21875l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.265625l-1.046875 0z" fill-rule="nonzero"/><path fill="#ffffff" d="m356.65158 213.34627l246.01572 0l0 54.51967l-246.01572 0z" fill-rule="evenodd"/><path stroke="#595959" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m356.65158 213.34627l246.01572 0l0 54.51967l-246.01572 0z" fill-rule="evenodd"/><path fill="#000000" d="m447.57547 237.63548l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm9.90625 6.609375l-0.1875 -1.53125q0.546875 0.140625 0.9375 0.140625q0.546875 0 0.875 -0.1875q0.328125 -0.171875 0.546875 -0.5q0.15625 -0.25 0.5 -1.21875q0.046875 -0.140625 0.140625 -0.40625l-3.671875 -9.6875l1.765625 0l2.015625 5.59375q0.390625 1.078125 0.703125 2.25q0.28125 -1.125 0.671875 -2.203125l2.078125 -5.640625l1.640625 0l-3.6875 9.828125q-0.59375 1.609375 -0.921875 2.203125q-0.4375 0.8125 -1.0 1.1875q-0.5625 0.375 -1.34375 0.375q-0.484375 0 -1.0625 -0.203125zm8.75 -6.609375l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm9.96875 2.890625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm12.853302 -3.109375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.141357 9.46875l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm8.281952 -0.0625q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625z" fill-rule="nonzero"/><path fill="#000000" d="m439.76102 256.1261l0 -3.6406097l-3.3125 -4.953125l1.390625 0l1.6875 2.59375q0.46875 0.71875 0.875 1.453125q0.390625 -0.671875 0.9375 -1.515625l1.671875 -2.53125l1.3125 0l-3.421875 4.953125l0 3.6406097l-1.140625 0zm3.7539062 0l3.296875 -8.593735l1.21875 0l3.515625 8.593735l-1.28125 0l-1.015625 -2.6093597l-3.578125 0l-0.953125 2.6093597l-1.203125 0zm2.484375 -3.5312347l2.90625 0l-0.890625 -2.375q-0.421875 -1.078125 -0.609375 -1.78125q-0.171875 0.828125 -0.46875 1.640625l-0.9375 2.515625zm6.4570312 3.5312347l0 -8.593735l1.15625 0l4.515625 6.75l0 -6.75l1.09375 0l0 8.593735l-1.171875 0l-4.515625 -6.7499847l0 6.7499847l-1.078125 0zm12.697266 -3.3749847l0 -1.0l3.625 -0.015625l0 3.1875q-0.828125 0.671875 -1.71875 1.015625q-0.890625 0.32810974 -1.828125 0.32810974q-1.265625 0 -2.3125 -0.53123474q-1.03125 -0.546875 -1.5625 -1.5625q-0.515625 -1.03125 -0.515625 -2.296875q0 -1.265625 0.515625 -2.34375q0.53125 -1.09375 1.515625 -1.609375q0.984375 -0.53125 2.265625 -0.53125q0.9375 0 1.6875 0.296875q0.75 0.296875 1.171875 0.84375q0.4375 0.53125 0.65625 1.40625l-1.015625 0.28125q-0.203125 -0.65625 -0.5 -1.03125q-0.28125 -0.375 -0.8125 -0.59375q-0.53125 -0.234375 -1.171875 -0.234375q-0.78125 0 -1.359375 0.234375q-0.5625 0.234375 -0.921875 0.625q-0.34375 0.390625 -0.53125 0.859375q-0.328125 0.796875 -0.328125 1.71875q0 1.15625 0.390625 1.9375q0.40625 0.765625 1.15625 1.140625q0.75 0.375 1.609375 0.375q0.734375 0 1.4375 -0.28125q0.703125 -0.296875 1.0625 -0.609375l0 -1.609375l-2.515625 0zm12.542969 3.3749847l0 -0.78123474q-0.59375 0.92185974 -1.734375 0.92185974q-0.75 0 -1.375 -0.40623474q-0.625 -0.421875 -0.96875 -1.15625q-0.34375 -0.734375 -0.34375 -1.6875q0 -0.921875 0.3125 -1.6875q0.3125 -0.765625 0.9375 -1.15625q0.625 -0.40625 1.390625 -0.40625q0.5625 0 1.0 0.234375q0.4375 0.234375 0.71875 0.609375l0 -3.078125l1.046875 0l0 8.593735l-0.984375 0zm-3.328125 -3.1093597q0 1.203125 0.5 1.796875q0.5 0.578125 1.1875 0.578125q0.6875 0 1.171875 -0.5625q0.484375 -0.5625 0.484375 -1.71875q0 -1.28125 -0.5 -1.875q-0.484375 -0.59375 -1.203125 -0.59375q-0.703125 0 -1.171875 0.578125q-0.46875 0.5625 -0.46875 1.796875zm10.033203 2.34375q-0.59375 0.5 -1.140625 0.70310974q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.49998474q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.74998474l-1.109375 0q-0.15625 -0.32810974 -0.203125 -0.76560974zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm5.001953 2.1875l0.15625 0.92185974q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.18748474 -0.453125 -0.48435974q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm5.0996094 0.171875q-0.59375 0.5 -1.140625 0.70310974q-0.53125 0.203125 -1.15625 0.203125q-1.03125 0 -1.578125 -0.49998474q-0.546875 -0.5 -0.546875 -1.28125q0 -0.453125 0.203125 -0.828125q0.203125 -0.390625 0.546875 -0.609375q0.34375 -0.234375 0.765625 -0.34375q0.296875 -0.09375 0.9375 -0.171875q1.265625 -0.140625 1.875 -0.359375q0 -0.21875 0 -0.265625q0 -0.65625 -0.296875 -0.921875q-0.40625 -0.34375 -1.203125 -0.34375q-0.734375 0 -1.09375 0.265625q-0.359375 0.25 -0.53125 0.90625l-1.03125 -0.140625q0.140625 -0.65625 0.46875 -1.0625q0.328125 -0.40625 0.9375 -0.625q0.609375 -0.21875 1.40625 -0.21875q0.796875 0 1.296875 0.1875q0.5 0.1875 0.734375 0.46875q0.234375 0.28125 0.328125 0.71875q0.046875 0.265625 0.046875 0.96875l0 1.40625q0 1.46875 0.0625 1.859375q0.078125 0.390625 0.28125 0.74998474l-1.109375 0q-0.15625 -0.32810974 -0.203125 -0.76560974zm-0.09375 -2.359375q-0.578125 0.234375 -1.71875 0.40625q-0.65625 0.09375 -0.921875 0.21875q-0.265625 0.109375 -0.421875 0.328125q-0.140625 0.21875 -0.140625 0.5q0 0.421875 0.3125 0.703125q0.328125 0.28125 0.9375 0.28125q0.609375 0 1.078125 -0.265625q0.484375 -0.265625 0.703125 -0.734375q0.171875 -0.359375 0.171875 -1.046875l0 -0.390625zm2.2832031 1.265625l1.03125 -0.15625q0.09375 0.625 0.484375 0.953125q0.40625 0.328125 1.140625 0.328125q0.71875 0 1.0625 -0.28125q0.359375 -0.296875 0.359375 -0.703125q0 -0.359375 -0.3125 -0.5625q-0.21875 -0.140625 -1.078125 -0.359375q-1.15625 -0.296875 -1.609375 -0.5q-0.4375 -0.21875 -0.671875 -0.59375q-0.234375 -0.375 -0.234375 -0.84375q0 -0.40625 0.1875 -0.765625q0.1875 -0.359375 0.515625 -0.59375q0.25 -0.171875 0.671875 -0.296875q0.421875 -0.125 0.921875 -0.125q0.71875 0 1.265625 0.21875q0.5625 0.203125 0.828125 0.5625q0.265625 0.359375 0.359375 0.953125l-1.03125 0.140625q-0.0625 -0.46875 -0.40625 -0.734375q-0.328125 -0.28125 -0.953125 -0.28125q-0.71875 0 -1.03125 0.25q-0.3125 0.234375 -0.3125 0.5625q0 0.203125 0.125 0.359375q0.140625 0.171875 0.40625 0.28125q0.15625 0.0625 0.9375 0.265625q1.125 0.3125 1.5625 0.5q0.4375 0.1875 0.6875 0.546875q0.25 0.359375 0.25 0.90625q0 0.53125 -0.3125 1.0q-0.296875 0.453125 -0.875 0.71873474q-0.578125 0.25 -1.3125 0.25q-1.21875 0 -1.859375 -0.49998474q-0.625 -0.515625 -0.796875 -1.5zm8.71875 0.921875l0.15625 0.92185974q-0.453125 0.09375 -0.796875 0.09375q-0.578125 0 -0.890625 -0.171875q-0.3125 -0.18748474 -0.453125 -0.48435974q-0.125 -0.296875 -0.125 -1.25l0 -3.578125l-0.765625 0l0 -0.8125l0.765625 0l0 -1.546875l1.046875 -0.625l0 2.171875l1.0625 0l0 0.8125l-1.0625 0l0 3.640625q0 0.453125 0.046875 0.578125q0.0625 0.125 0.1875 0.203125q0.125 0.078125 0.359375 0.078125q0.1875 0 0.46875 -0.03125zm0.6464844 -2.171875q0 -1.734375 0.953125 -2.5625q0.796875 -0.6875 1.953125 -0.6875q1.28125 0 2.09375 0.84375q0.828125 0.828125 0.828125 2.3125q0 1.203125 -0.359375 1.890625q-0.359375 0.6875 -1.0625 1.078125q-0.6875 0.37498474 -1.5 0.37498474q-1.296875 0 -2.109375 -0.82810974q-0.796875 -0.84375 -0.796875 -2.421875zm1.078125 0q0 1.1875 0.515625 1.78125q0.53125 0.59375 1.3125 0.59375q0.796875 0 1.3125 -0.59375q0.515625 -0.59375 0.515625 -1.8125q0 -1.15625 -0.53125 -1.75q-0.515625 -0.59375 -1.296875 -0.59375q-0.78125 0 -1.3125 0.59375q-0.515625 0.578125 -0.515625 1.78125zm5.9706726 3.1093597l0 -6.2187347l0.953125 0l0 0.9375q0.359375 -0.65625 0.65625 -0.859375q0.3125 -0.21875 0.6875 -0.21875q0.53125 0 1.078125 0.328125l-0.359375 0.984375q-0.390625 -0.234375 -0.765625 -0.234375q-0.359375 0 -0.640625 0.21875q-0.265625 0.203125 -0.375 0.578125q-0.1875 0.5625 -0.1875 1.21875l0 3.2656097l-1.046875 0zm8.261719 -1.9999847l1.09375 0.125q-0.25 0.953125 -0.953125 1.484375q-0.703125 0.53123474 -1.78125 0.53123474q-1.359375 0 -2.171875 -0.84373474q-0.796875 -0.84375 -0.796875 -2.359375q0 -1.5625 0.8125 -2.421875q0.8125 -0.875 2.09375 -0.875q1.25 0 2.03125 0.84375q0.796875 0.84375 0.796875 2.390625q0 0.09375 0 0.28125l-4.640625 0q0.0625 1.03125 0.578125 1.578125q0.515625 0.53125 1.296875 0.53125q0.578125 0 0.984375 -0.296875q0.421875 -0.3125 0.65625 -0.96875zm-3.453125 -1.703125l3.46875 0q-0.0625 -0.796875 -0.390625 -1.1875q-0.515625 -0.609375 -1.3125 -0.609375q-0.734375 0 -1.234375 0.484375q-0.484375 0.484375 -0.53125 1.3125z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m720.1682 157.9399l88.78375 0l0 58.557205l-88.78375 0z" fill-rule="evenodd"/><g transform="matrix(0.10588156484819146 0.0 0.0 0.1058833358255897 709.0879924849382 133.42784798169072)"><clipPath id="g13ae80c9d72_0_3.1"><path d="m104.64723 231.50053l838.51953 0l0 553.03516l-838.51953 0z" clip-rule="evenodd"/></clipPath><image clip-path="url(#g13ae80c9d72_0_3.1)" fill="#000" width="1024.0" height="1024.0" x="0.0" y="0.0" preserveAspectRatio="none" xlink:href="data:image/png;base64,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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAATKb/B8i+2XzfD1WPAAAAAElFTkSuQmCC"/></g><path fill="#000000" fill-opacity="0.0" d="m479.6658 99.642204l0 54.77166" fill-rule="evenodd"/><path stroke="#595959" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m479.6658 105.642204l0 42.77166" fill-rule="evenodd"/><path fill="#595959" stroke="#595959" stroke-width="1.0" stroke-linecap="butt" d="m481.31754 105.642204l-1.6517334 -4.538101l-1.6517334 4.538101z" fill-rule="evenodd"/><path fill="#595959" stroke="#595959" stroke-width="1.0" stroke-linecap="butt" d="m478.01407 148.41386l1.6517334 4.538086l1.6517334 -4.538086z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m479.6658 109.4565l174.36221 0l0 38.771652l-174.36221 0z" fill-rule="evenodd"/><path fill="#000000" d="m489.88455 133.8165l0 -11.453125l1.5625 0l6.015625 8.984375l0 -8.984375l1.453125 0l0 11.453125l-1.5625 0l-6.015625 -9.0l0 9.0l-1.453125 0zm11.6015625 0l0 -11.453125l8.28125 0l0 1.34375l-6.765625 0l0 3.515625l6.34375 0l0 1.34375l-6.34375 0l0 3.890625l7.03125 0l0 1.359375l-8.546875 0zm13.5624695 0l0 -10.109375l-3.7812195 0l0 -1.34375l9.0780945 0l0 1.34375l-3.78125 0l0 10.109375l-1.515625 0zm15.0234375 -4.015625l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875zm2.9296875 -1.5625q0 -2.859375 1.53125 -4.46875q1.53125 -1.609375 3.953125 -1.609375q1.578125 0 2.84375 0.765625q1.28125 0.75 1.953125 2.109375q0.671875 1.34375 0.671875 3.0625q0 1.75 -0.703125 3.125q-0.703125 1.375 -2.0 2.09375q-1.28125 0.703125 -2.78125 0.703125q-1.609375 0 -2.890625 -0.78125q-1.265625 -0.796875 -1.921875 -2.140625q-0.65625 -1.359375 -0.65625 -2.859375zm1.5625 0.015625q0 2.078125 1.109375 3.265625q1.109375 1.1875 2.796875 1.1875q1.703125 0 2.8125 -1.203125q1.109375 -1.203125 1.109375 -3.40625q0 -1.40625 -0.484375 -2.4375q-0.46875 -1.046875 -1.375 -1.625q-0.90625 -0.578125 -2.046875 -0.578125q-1.609375 0 -2.765625 1.109375q-1.15625 1.109375 -1.15625 3.6875zm11.3203125 5.5625l0 -11.453125l1.5625 0l6.015625 8.984375l0 -8.984375l1.453125 0l0 11.453125l-1.5625 0l-6.015625 -9.0l0 9.0l-1.453125 0zm11.6484375 0l0 -11.453125l7.734375 0l0 1.34375l-6.21875 0l0 3.546875l5.375 0l0 1.359375l-5.375 0l0 5.203125l-1.515625 0z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m479.65945 213.34627l0 0" fill-rule="evenodd"/><path stroke="#595959" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m479.65945 213.34627l0 0" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m479.65945 213.34627l0 -4.0" fill-rule="evenodd"/><path stroke="#595959" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m479.65945 213.34627l0 -4.0" fill-rule="evenodd"/><path fill="#ffffff" d="m356.65158 302.70972l246.01572 0l0 54.519684l-246.01572 0z" fill-rule="evenodd"/><path stroke="#595959" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m356.65158 302.70972l246.01572 0l0 54.519684l-246.01572 0z" fill-rule="evenodd"/><path fill="#000000" d="m434.68283 325.88956l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125zm10.391327 4.90625l-1.515625 0l0 -13.359375l1.640625 0l0 4.765625q1.046875 -1.296875 2.65625 -1.296875q0.890625 0 1.6875 0.359375q0.796875 0.359375 1.3125 1.015625q0.515625 0.640625 0.796875 1.5625q0.296875 0.921875 0.296875 1.96875q0 2.484375 -1.234375 3.84375q-1.21875 1.359375 -2.953125 1.359375q-1.703125 0 -2.6875 -1.4375l0 1.21875zm-0.015625 -4.90625q0 1.734375 0.484375 2.515625q0.765625 1.265625 2.09375 1.265625q1.078125 0 1.859375 -0.9375q0.78125 -0.9375 0.78125 -2.78125q0 -1.890625 -0.75 -2.796875q-0.75 -0.90625 -1.828125 -0.90625q-1.0625 0 -1.859375 0.9375q-0.78125 0.9375 -0.78125 2.703125zm9.281982 4.90625l0 -8.40625l-1.453125 0l0 -1.265625l1.453125 0l0 -1.03125q0 -0.96875 0.171875 -1.453125q0.234375 -0.640625 0.828125 -1.03125q0.59375 -0.390625 1.671875 -0.390625q0.6875 0 1.53125 0.15625l-0.25 1.4375q-0.5 -0.09375 -0.953125 -0.09375q-0.75 0 -1.0625 0.328125q-0.3125 0.3125 -0.3125 1.1875l0 0.890625l1.890625 0l0 1.265625l-1.890625 0l0 8.40625l-1.625 0zm4.1520386 -4.015625l0 -1.640625l5.03125 0l0 1.640625l-5.03125 0zm13.165802 2.828125q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm10.469482 4.859375l0 -1.21875q-0.90625 1.4375 -2.703125 1.4375q-1.15625 0 -2.125 -0.640625q-0.96875 -0.640625 -1.5 -1.78125q-0.53125 -1.140625 -0.53125 -2.625q0 -1.453125 0.484375 -2.625q0.484375 -1.1875 1.4375 -1.8125q0.96875 -0.625 2.171875 -0.625q0.875 0 1.546875 0.375q0.6875 0.359375 1.109375 0.953125l0 -4.796875l1.640625 0l0 13.359375l-1.53125 0zm-5.171875 -4.828125q0 1.859375 0.78125 2.78125q0.78125 0.921875 1.84375 0.921875q1.078125 0 1.828125 -0.875q0.75 -0.890625 0.75 -2.6875q0 -1.984375 -0.765625 -2.90625q-0.765625 -0.9375 -1.890625 -0.9375q-1.078125 0 -1.8125 0.890625q-0.734375 0.890625 -0.734375 2.8125zm15.594482 3.640625q-0.921875 0.765625 -1.765625 1.09375q-0.828125 0.3125 -1.796875 0.3125q-1.59375 0 -2.453125 -0.78125q-0.859375 -0.78125 -0.859375 -1.984375q0 -0.71875 0.328125 -1.296875q0.328125 -0.59375 0.84375 -0.9375q0.53125 -0.359375 1.1875 -0.546875q0.46875 -0.125 1.453125 -0.25q1.984375 -0.234375 2.921875 -0.5625q0.015625 -0.34375 0.015625 -0.421875q0 -1.0 -0.46875 -1.421875q-0.625 -0.546875 -1.875 -0.546875q-1.15625 0 -1.703125 0.40625q-0.546875 0.40625 -0.8125 1.421875l-1.609375 -0.21875q0.21875 -1.015625 0.71875 -1.640625q0.5 -0.640625 1.453125 -0.984375q0.953125 -0.34375 2.1875 -0.34375q1.25 0 2.015625 0.296875q0.78125 0.28125 1.140625 0.734375q0.375 0.4375 0.515625 1.109375q0.078125 0.421875 0.078125 1.515625l0 2.1875q0 2.28125 0.109375 2.890625q0.109375 0.59375 0.40625 1.15625l-1.703125 0q-0.265625 -0.515625 -0.328125 -1.1875zm-0.140625 -3.671875q-0.890625 0.375 -2.671875 0.625q-1.015625 0.140625 -1.4375 0.328125q-0.421875 0.1875 -0.65625 0.53125q-0.21875 0.34375 -0.21875 0.78125q0 0.65625 0.5 1.09375q0.5 0.4375 1.453125 0.4375q0.9375 0 1.671875 -0.40625q0.75 -0.421875 1.09375 -1.140625q0.265625 -0.5625 0.265625 -1.640625l0 -0.609375zm4.203827 8.5625l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm12.469482 3.3125l0.234375 1.453125q-0.6875 0.140625 -1.234375 0.140625q-0.890625 0 -1.390625 -0.28125q-0.484375 -0.28125 -0.6875 -0.734375q-0.203125 -0.46875 -0.203125 -1.9375l0 -5.578125l-1.203125 0l0 -1.265625l1.203125 0l0 -2.390625l1.625 -0.984375l0 3.375l1.65625 0l0 1.265625l-1.65625 0l0 5.671875q0 0.6875 0.078125 0.890625q0.09375 0.203125 0.28125 0.328125q0.203125 0.109375 0.578125 0.109375q0.265625 0 0.71875 -0.0625zm8.230164 -1.640625l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm9.125732 5.765625l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0z" fill-rule="nonzero"/><path fill="#000000" d="m448.23172 351.59268l0 -13.375l1.484375 0l0 1.25q0.53125 -0.734375 1.1875 -1.09375q0.671875 -0.375 1.625 -0.375q1.234375 0 2.171875 0.640625q0.953125 0.625 1.4375 1.796875q0.484375 1.15625 0.484375 2.546875q0 1.484375 -0.53125 2.671875q-0.53125 1.1875 -1.546875 1.828125q-1.015625 0.625 -2.140625 0.625q-0.8125 0 -1.46875 -0.34375q-0.65625 -0.34375 -1.0625 -0.875l0 4.703125l-1.640625 0zm1.484375 -8.484375q0 1.859375 0.75 2.765625q0.765625 0.890625 1.828125 0.890625q1.09375 0 1.875 -0.921875q0.78125 -0.9375 0.78125 -2.875q0 -1.84375 -0.765625 -2.765625q-0.75 -0.921875 -1.8125 -0.921875q-1.046875 0 -1.859375 0.984375q-0.796875 0.96875 -0.796875 2.84375zm8.875702 4.78125l0 -9.671875l1.46875 0l0 1.46875q0.5625 -1.03125 1.03125 -1.359375q0.484375 -0.328125 1.0625 -0.328125q0.828125 0 1.6875 0.53125l-0.5625 1.515625q-0.609375 -0.359375 -1.203125 -0.359375q-0.546875 0 -0.96875 0.328125q-0.421875 0.328125 -0.609375 0.890625q-0.28125 0.875 -0.28125 1.921875l0 5.0625l-1.625 0zm5.618927 -4.84375q0 -2.6875 1.484375 -3.96875q1.25 -1.078125 3.046875 -1.078125q2.0 0 3.265625 1.3125q1.265625 1.296875 1.265625 3.609375q0 1.859375 -0.5625 2.9375q-0.5625 1.0625 -1.640625 1.65625q-1.0625 0.59375 -2.328125 0.59375q-2.03125 0 -3.28125 -1.296875q-1.25 -1.3125 -1.25 -3.765625zm1.6875 0q0 1.859375 0.796875 2.796875q0.8125 0.921875 2.046875 0.921875q1.21875 0 2.03125 -0.921875q0.8125 -0.9375 0.8125 -2.84375q0 -1.796875 -0.8125 -2.71875q-0.8125 -0.921875 -2.03125 -0.921875q-1.234375 0 -2.046875 0.921875q-0.796875 0.90625 -0.796875 2.765625zm15.610107 1.296875l1.609375 0.21875q-0.265625 1.65625 -1.359375 2.609375q-1.078125 0.9375 -2.671875 0.9375q-1.984375 0 -3.1875 -1.296875q-1.203125 -1.296875 -1.203125 -3.71875q0 -1.578125 0.515625 -2.75q0.515625 -1.171875 1.578125 -1.75q1.0625 -0.59375 2.3125 -0.59375q1.578125 0 2.578125 0.796875q1.0 0.796875 1.28125 2.265625l-1.59375 0.234375q-0.234375 -0.96875 -0.8125 -1.453125q-0.578125 -0.5 -1.390625 -0.5q-1.234375 0 -2.015625 0.890625q-0.78125 0.890625 -0.78125 2.8125q0 1.953125 0.75 2.84375q0.75 0.875 1.953125 0.875q0.96875 0 1.609375 -0.59375q0.65625 -0.59375 0.828125 -1.828125zm9.640625 0.4375l1.6875 0.203125q-0.40625 1.484375 -1.484375 2.3125q-1.078125 0.8125 -2.765625 0.8125q-2.125 0 -3.375 -1.296875q-1.234375 -1.3125 -1.234375 -3.671875q0 -2.453125 1.25 -3.796875q1.265625 -1.34375 3.265625 -1.34375q1.9375 0 3.15625 1.328125q1.234375 1.3125 1.234375 3.703125q0 0.15625 0 0.4375l-7.21875 0q0.09375 1.59375 0.90625 2.453125q0.8125 0.84375 2.015625 0.84375q0.90625 0 1.546875 -0.46875q0.640625 -0.484375 1.015625 -1.515625zm-5.390625 -2.65625l5.40625 0q-0.109375 -1.21875 -0.625 -1.828125q-0.78125 -0.953125 -2.03125 -0.953125q-1.125 0 -1.90625 0.765625q-0.765625 0.75 -0.84375 2.015625zm8.485107 2.875l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125zm9.328125 0l1.625 -0.25q0.125 0.96875 0.75 1.5q0.625 0.515625 1.75 0.515625q1.125 0 1.671875 -0.453125q0.546875 -0.46875 0.546875 -1.09375q0 -0.546875 -0.484375 -0.875q-0.328125 -0.21875 -1.671875 -0.546875q-1.8125 -0.46875 -2.515625 -0.796875q-0.6875 -0.328125 -1.046875 -0.90625q-0.359375 -0.59375 -0.359375 -1.3125q0 -0.640625 0.296875 -1.1875q0.296875 -0.5625 0.8125 -0.921875q0.375 -0.28125 1.03125 -0.46875q0.671875 -0.203125 1.421875 -0.203125q1.140625 0 2.0 0.328125q0.859375 0.328125 1.265625 0.890625q0.421875 0.5625 0.578125 1.5l-1.609375 0.21875q-0.109375 -0.75 -0.640625 -1.171875q-0.515625 -0.421875 -1.46875 -0.421875q-1.140625 0 -1.625 0.375q-0.46875 0.375 -0.46875 0.875q0 0.3125 0.1875 0.578125q0.203125 0.265625 0.640625 0.4375q0.234375 0.09375 1.4375 0.421875q1.75 0.453125 2.4375 0.75q0.6875 0.296875 1.078125 0.859375q0.390625 0.5625 0.390625 1.40625q0 0.828125 -0.484375 1.546875q-0.46875 0.71875 -1.375 1.125q-0.90625 0.390625 -2.046875 0.390625q-1.875 0 -2.875 -0.78125q-0.984375 -0.78125 -1.25 -2.328125z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m479.65945 302.70972l0 -34.834656" fill-rule="evenodd"/><path stroke="#595959" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m479.65945 296.70972l0 -22.834625" fill-rule="evenodd"/><path fill="#595959" stroke="#595959" stroke-width="1.0" stroke-linecap="butt" d="m478.00772 296.70972l1.6517334 4.5381165l1.6517334 -4.5381165z" fill-rule="evenodd"/><path fill="#595959" stroke="#595959" stroke-width="1.0" stroke-linecap="butt" d="m481.3112 273.8751l-1.6517334 -4.5381165l-1.6517334 4.5381165z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m479.66452 267.32907l196.85037 0l0 38.771637l-196.85037 0z" fill-rule="evenodd"/><path fill="#000000" d="m489.69577 291.68906l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm3.5859375 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm4.8515625 0l-1.3125 0l0 -11.453125l1.40625 0l0 4.078125q0.890625 -1.109375 2.28125 -1.109375q0.765625 0 1.4375 0.3125q0.6875 0.296875 1.125 0.859375q0.453125 0.5625 0.703125 1.359375q0.25 0.78125 0.25 1.671875q0 2.140625 -1.0625 3.3125q-1.046875 1.15625 -2.53125 1.15625q-1.46875 0 -2.296875 -1.234375l0 1.046875zm-0.015625 -4.21875q0 1.5 0.40625 2.15625q0.65625 1.09375 1.796875 1.09375q0.921875 0 1.59375 -0.796875q0.671875 -0.8125 0.671875 -2.390625q0 -1.625 -0.65625 -2.390625q-0.640625 -0.78125 -1.546875 -0.78125q-0.921875 0 -1.59375 0.796875q-0.671875 0.796875 -0.671875 2.3125zm7.0546875 1.734375l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34378052 0.484375 0.34378052 1.203125q0 0.703125 -0.42190552 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm8.5000305 5.6875l-0.15625 -1.328125q0.453125 0.125 0.796875 0.125q0.46875 0 0.75 -0.15625q0.28125 -0.15625 0.46875 -0.4375q0.125 -0.203125 0.421875 -1.046875q0.046875 -0.109375 0.125 -0.34375l-3.140625 -8.3125l1.515625 0l1.71875 4.796875q0.34375 0.921875 0.609375 1.921875q0.234375 -0.96875 0.578125 -1.890625l1.765625 -4.828125l1.40625 0l-3.15625 8.4375q-0.5 1.375 -0.78125 1.890625q-0.375 0.6875 -0.859375 1.015625q-0.484375 0.328125 -1.15625 0.328125q-0.40625 0 -0.90625 -0.171875zm7.5 -5.6875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0zm8.546875 2.484375l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm11.015625 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8359375 8.140625l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm7.1015625 -0.046875q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm15.109375 7.53125q-1.171875 -1.46875 -1.984375 -3.4375q-0.796875 -1.984375 -0.796875 -4.09375q0 -1.859375 0.609375 -3.5625q0.703125 -1.96875 2.171875 -3.9375l1.0 0q-0.9375 1.625 -1.25 2.328125q-0.46875 1.078125 -0.75 2.25q-0.328125 1.453125 -0.328125 2.9375q0 3.75 2.328125 7.515625l-1.0 0zm4.171875 -3.375l-2.546875 -8.296875l1.453125 0l1.328125 4.78125l0.484375 1.78125q0.03125 -0.125 0.4375 -1.703125l1.3125 -4.859375l1.453125 0l1.234375 4.8125l0.421875 1.578125l0.46875 -1.59375l1.421875 -4.796875l1.375 0l-2.59375 8.296875l-1.46875 0l-1.3125 -4.96875l-0.328125 -1.421875l-1.671875 6.390625l-1.46875 0zm10.0234375 -9.84375l0 -1.609375l1.40625 0l0 1.609375l-1.40625 0zm0 9.84375l0 -8.296875l1.40625 0l0 8.296875l-1.40625 0zm6.6171875 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 1.265625l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm21.6875 -4.015625l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875zm8.7421875 -0.484375l0 -1.34375l4.859375 0l0 4.25q-1.125 0.890625 -2.3125 1.34375q-1.1875 0.453125 -2.4375 0.453125q-1.6875 0 -3.0625 -0.71875q-1.375 -0.734375 -2.078125 -2.09375q-0.703125 -1.375 -0.703125 -3.0625q0 -1.671875 0.6875 -3.125q0.703125 -1.453125 2.015625 -2.15625q1.3125 -0.703125 3.03125 -0.703125q1.234375 0 2.234375 0.40625q1.015625 0.40625 1.578125 1.125q0.578125 0.71875 0.875 1.875l-1.375 0.375q-0.25 -0.875 -0.640625 -1.375q-0.375 -0.5 -1.09375 -0.796875q-0.703125 -0.3125 -1.578125 -0.3125q-1.03125 0 -1.796875 0.328125q-0.75 0.3125 -1.21875 0.828125q-0.46875 0.515625 -0.71875 1.125q-0.4375 1.0625 -0.4375 2.3125q0 1.53125 0.515625 2.5625q0.53125 1.03125 1.53125 1.53125q1.015625 0.5 2.15625 0.5q0.984375 0 1.921875 -0.375q0.9375 -0.390625 1.421875 -0.8125l0 -2.140625l-3.375 0zm6.6328125 -1.078125q0 -2.859375 1.53125 -4.46875q1.53125 -1.609375 3.953125 -1.609375q1.578125 0 2.84375 0.765625q1.28125 0.75 1.953125 2.109375q0.671875 1.34375 0.671875 3.0625q0 1.75 -0.703125 3.125q-0.703125 1.375 -2.0 2.09375q-1.28125 0.703125 -2.78125 0.703125q-1.609375 0 -2.890625 -0.78125q-1.265625 -0.796875 -1.921875 -2.140625q-0.65625 -1.359375 -0.65625 -2.859375zm1.5625 0.015625q0 2.078125 1.109375 3.265625q1.109375 1.1875 2.796875 1.1875q1.703125 0 2.8125 -1.203125q1.109375 -1.203125 1.109375 -3.40625q0 -1.40625 -0.484375 -2.4375q-0.46875 -1.046875 -1.375 -1.625q-0.90625 -0.578125 -2.046875 -0.578125q-1.609375 0 -2.765625 1.109375q-1.15625 1.109375 -1.15625 3.6875zm12.0859375 8.9375l-1.015625 0q2.34375 -3.765625 2.34375 -7.515625q0 -1.46875 -0.34375 -2.921875q-0.265625 -1.171875 -0.734375 -2.25q-0.3125 -0.703125 -1.265625 -2.34375l1.015625 0q1.46875 1.96875 2.171875 3.9375q0.59375 1.703125 0.59375 3.5625q0 2.109375 -0.8125 4.09375q-0.796875 1.96875 -1.953125 3.4375z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m596.0006 415.415l124.16803 0l0 81.20474l-124.16803 0z" fill-rule="evenodd"/><g transform="matrix(0.24833595800524935 0.0 0.0 0.24833254593175852 596.000637007874 415.4150217847769)"><clipPath id="g13ae80c9d72_0_3.2"><path d="m0 0l500.0 0l0 327.0l-500.0 0z" clip-rule="evenodd"/></clipPath><image clip-path="url(#g13ae80c9d72_0_3.2)" fill="#000" width="500.0" height="327.0" x="0.0" y="0.0" preserveAspectRatio="none" xlink:href="data:image/png;base64,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"/></g><path fill="#000000" fill-opacity="0.0" d="m222.71211 422.97998l196.86577 0l0 60.125977l-196.86577 0z" fill-rule="evenodd"/><g transform="matrix(0.4848910761154856 0.0 0.0 0.4848868766404199 222.71210551181102 422.97998818897634)"><clipPath id="g13ae80c9d72_0_3.3"><path d="m0 -1.1368684E-13l406.0 0l0 124.0l-406.0 0z" clip-rule="evenodd"/></clipPath><image clip-path="url(#g13ae80c9d72_0_3.3)" fill="#000" width="406.0" height="124.0" x="0.0" y="0.0" preserveAspectRatio="none" xlink:href="data:image/png;base64,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"/></g><path fill="#000000" fill-opacity="0.0" d="m437.019 357.6414l-115.87402 52.503937" fill-rule="evenodd"/><path stroke="#595959" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m431.5539 360.11774l-104.943756 47.55127" fill-rule="evenodd"/><path fill="#595959" stroke="#595959" stroke-width="1.0" stroke-linecap="butt" d="m432.2356 361.62222l3.4518433 -3.377472l-4.8152466 0.36846924z" fill-rule="evenodd"/><path fill="#595959" stroke="#595959" stroke-width="1.0" stroke-linecap="butt" d="m325.92844 406.16452l-3.4518738 3.377472l4.815277 -0.36846924z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m530.4232 358.7254l115.87402 52.503937" fill-rule="evenodd"/><path stroke="#595959" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m535.88837 361.20172l104.943726 47.55127" fill-rule="evenodd"/><path fill="#595959" stroke="#595959" stroke-width="1.0" stroke-linecap="butt" d="m536.57007 359.69724l-4.8152466 -0.36846924l3.4518433 3.3774414z" fill-rule="evenodd"/><path fill="#595959" stroke="#595959" stroke-width="1.0" stroke-linecap="butt" d="m640.1504 410.2575l4.8152466 0.36846924l-3.4518433 -3.377472z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m217.35085 356.83694l174.3622 0l0 38.771667l-174.3622 0z" fill-rule="evenodd"/><path fill="#000000" d="m242.52412 381.19696l-3.15625 -8.296875l1.484375 0l1.78125 4.96875q0.296875 0.796875 0.53125 1.671875q0.1875 -0.65625 0.53125 -1.578125l1.84375 -5.0625l1.4375 0l-3.140625 8.296875l-1.3125 0zm5.171875 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm7.9453278 4.15625l0 -11.453125l1.40625 0l0 11.453125l-1.40625 0zm6.6484375 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm1.3828125 1.265625l0 -11.453125l1.40625 0l0 4.109375q0.984375 -1.140625 2.484375 -1.140625q0.921875 0 1.59375 0.359375q0.6875 0.359375 0.96875 1.0q0.296875 0.640625 0.296875 1.859375l0 5.265625l-1.40625 0l0 -5.265625q0 -1.046875 -0.453125 -1.53125q-0.453125 -0.484375 -1.296875 -0.484375q-0.625 0 -1.171875 0.328125q-0.546875 0.328125 -0.78125 0.890625q-0.234375 0.546875 -0.234375 1.515625l0 4.546875l-1.40625 0zm14.3046875 -1.03125q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.9921875 4.171875l0 -1.609375l1.609375 0l0 1.609375l-1.609375 0zm4.0546875 3.1875l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm7.6171875 4.109375l0 -8.296875l1.265625 0l0 1.25q0.484375 -0.875 0.890625 -1.15625q0.40625 -0.28125 0.90625 -0.28125q0.703125 0 1.4375 0.453125l-0.484375 1.296875q-0.515625 -0.296875 -1.03125 -0.296875q-0.453125 0 -0.828125 0.28125q-0.359375 0.265625 -0.515625 0.765625q-0.234375 0.75 -0.234375 1.640625l0 4.34375l-1.40625 0zm4.8125 -4.15625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm11.0390625 2.890625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm0.8515625 -2.890625q0 -2.296875 1.28125 -3.40625q1.078125 -0.921875 2.609375 -0.921875q1.71875 0 2.796875 1.125q1.09375 1.109375 1.09375 3.09375q0 1.59375 -0.484375 2.515625q-0.484375 0.921875 -1.40625 1.4375q-0.90625 0.5 -2.0 0.5q-1.734375 0 -2.8125 -1.109375q-1.078125 -1.125 -1.078125 -3.234375zm1.453125 0q0 1.59375 0.6875 2.390625q0.703125 0.796875 1.75 0.796875q1.046875 0 1.734375 -0.796875q0.703125 -0.796875 0.703125 -2.4375q0 -1.53125 -0.703125 -2.328125q-0.6875 -0.796875 -1.734375 -0.796875q-1.046875 0 -1.75 0.796875q-0.6875 0.78125 -0.6875 2.375zm12.15625 4.84375l1.375 0.203125q0.078125 0.640625 0.46875 0.921875q0.53125 0.390625 1.4375 0.390625q0.96875 0 1.5 -0.390625q0.53125 -0.390625 0.71875 -1.09375q0.109375 -0.421875 0.109375 -1.8125q-0.921875 1.09375 -2.296875 1.09375q-1.71875 0 -2.65625 -1.234375q-0.9375 -1.234375 -0.9375 -2.96875q0 -1.1875 0.421875 -2.1875q0.4375 -1.0 1.25 -1.546875q0.828125 -0.546875 1.921875 -0.546875q1.46875 0 2.421875 1.1875l0 -1.0l1.296875 0l0 7.171875q0 1.9375 -0.390625 2.75q-0.390625 0.8125 -1.25 1.28125q-0.859375 0.46875 -2.109375 0.46875q-1.484375 0 -2.40625 -0.671875q-0.90625 -0.671875 -0.875 -2.015625zm1.171875 -4.984375q0 1.625 0.640625 2.375q0.65625 0.75 1.625 0.75q0.96875 0 1.625 -0.734375q0.65625 -0.75 0.65625 -2.34375q0 -1.53125 -0.671875 -2.296875q-0.671875 -0.78125 -1.625 -0.78125q-0.9375 0 -1.59375 0.765625q-0.65625 0.765625 -0.65625 2.265625zm8.1953125 4.296875l0 -11.453125l5.078125 0q1.53125 0 2.328125 0.3125q0.7968445 0.296875 1.2655945 1.078125q0.484375 0.78125 0.484375 1.734375q0 1.21875 -0.796875 2.0625q-0.7812195 0.828125 -2.4374695 1.046875q0.609375 0.296875 0.921875 0.578125q0.65625 0.609375 1.2499695 1.515625l2.0 3.125l-1.90625 0l-1.5155945 -2.390625q-0.671875 -1.03125 -1.109375 -1.578125q-0.421875 -0.546875 -0.765625 -0.765625q-0.328125 -0.21875 -0.6875 -0.296875q-0.25 -0.0625 -0.84375 -0.0625l-1.75 0l0 5.09375l-1.515625 0zm1.515625 -6.40625l3.25 0q1.046875 0 1.625 -0.203125q0.59375 -0.21875 0.890625 -0.6875q0.3125 -0.484375 0.3125 -1.03125q0 -0.8125 -0.59375 -1.328125q-0.59375 -0.53125 -1.859375 -0.53125l-3.625 0l0 3.78125zm10.007782 6.40625l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm17.328125 2.0l1.515625 0.375q-0.46875 1.875 -1.71875 2.859375q-1.234375 0.984375 -3.015625 0.984375q-1.859375 0 -3.015625 -0.75q-1.15625 -0.765625 -1.765625 -2.1875q-0.609375 -1.4375 -0.609375 -3.078125q0 -1.796875 0.6875 -3.125q0.6875 -1.328125 1.9375 -2.015625q1.265625 -0.703125 2.78125 -0.703125q1.71875 0 2.890625 0.875q1.171875 0.875 1.640625 2.46875l-1.5 0.34375q-0.390625 -1.25 -1.15625 -1.8125q-0.75 -0.578125 -1.90625 -0.578125q-1.3125 0 -2.203125 0.640625q-0.890625 0.625 -1.25 1.703125q-0.359375 1.0625 -0.359375 2.1875q0 1.46875 0.421875 2.5625q0.4375 1.078125 1.328125 1.625q0.90625 0.53125 1.953125 0.53125q1.265625 0 2.140625 -0.734375q0.890625 -0.734375 1.203125 -2.171875z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m576.80756 347.13617l174.36218 0l0 58.173218l-174.36218 0z" fill-rule="evenodd"/><path fill="#000000" d="m617.9613 371.49615l-4.4375 -11.453125l1.640625 0l2.96875 8.3125q0.359375 1.0 0.609375 1.875q0.265625 -0.9375 0.609375 -1.875l3.09375 -8.3125l1.546875 0l-4.484375 11.453125l-1.546875 0zm6.9375 -5.578125q0 -2.859375 1.53125 -4.46875q1.53125 -1.609375 3.953125 -1.609375q1.578125 0 2.84375 0.765625q1.28125 0.75 1.953125 2.109375q0.671875 1.34375 0.671875 3.0625q0 1.75 -0.703125 3.125q-0.703125 1.375 -2.0 2.09375q-1.28125 0.703125 -2.78125 0.703125q-1.609375 0 -2.890625 -0.78125q-1.265625 -0.796875 -1.921875 -2.140625q-0.65625 -1.359375 -0.65625 -2.859375zm1.5625 0.015625q0 2.078125 1.109375 3.265625q1.109375 1.1875 2.796875 1.1875q1.703125 0 2.8125 -1.203125q1.109375 -1.203125 1.109375 -3.40625q0 -1.40625 -0.484375 -2.4375q-0.46875 -1.046875 -1.375 -1.625q-0.90625 -0.578125 -2.046875 -0.578125q-1.609375 0 -2.765625 1.109375q-1.15625 1.109375 -1.15625 3.6875zm11.2734375 5.5625l0 -11.453125l1.515625 0l0 10.09375l5.640625 0l0 1.359375l-7.15625 0zm10.6953125 0l0 -10.109375l-3.78125 0l0 -1.34375l9.078125 0l0 1.34375l-3.78125 0l0 10.109375l-1.515625 0zm6.8984375 0l0 -11.453125l1.515625 0l0 4.703125l5.953125 0l0 -4.703125l1.515625 0l0 11.453125l-1.515625 0l0 -5.40625l-5.953125 0l0 5.40625l-1.515625 0zm10.2421875 0l4.40625 -11.453125l1.640625 0l4.6875 11.453125l-1.734375 0l-1.328125 -3.46875l-4.796875 0l-1.25 3.46875l-1.625 0zm3.3125 -4.703125l3.890625 0l-1.203125 -3.171875q-0.546875 -1.453125 -0.8125 -2.375q-0.21875 1.09375 -0.609375 2.1875l-1.265625 3.359375zm17.421875 3.671875q-0.78125 0.671875 -1.5 0.953125q-0.71875 0.265625 -1.546875 0.265625q-1.375 0 -2.109375 -0.671875q-0.734375 -0.671875 -0.734375 -1.703125q0 -0.609375 0.28125 -1.109375q0.28125 -0.515625 0.71875 -0.8125q0.453125 -0.3125 1.015625 -0.46875q0.421875 -0.109375 1.25 -0.203125q1.703125 -0.203125 2.515625 -0.484375q0 -0.296875 0 -0.375q0 -0.859375 -0.390625 -1.203125q-0.546875 -0.484375 -1.609375 -0.484375q-0.984375 0 -1.46875 0.359375q-0.46875 0.34375 -0.6875 1.21875l-1.375 -0.1875q0.1875 -0.875 0.609375 -1.421875q0.4375 -0.546875 1.25 -0.828125q0.8125 -0.296875 1.875 -0.296875q1.0625 0 1.71875 0.25q0.671875 0.25 0.984375 0.625q0.3125 0.375 0.4375 0.953125q0.078125 0.359375 0.078125 1.296875l0 1.875q0 1.96875 0.078125 2.484375q0.09375 0.515625 0.359375 1.0l-1.46875 0q-0.21875 -0.4375 -0.28125 -1.03125zm-0.109375 -3.140625q-0.765625 0.3125 -2.296875 0.53125q-0.875 0.125 -1.234375 0.28125q-0.359375 0.15625 -0.5625 0.46875q-0.1875 0.296875 -0.1875 0.65625q0 0.5625 0.421875 0.9375q0.4375 0.375 1.25 0.375q0.8125 0 1.4375 -0.34375q0.640625 -0.359375 0.9375 -0.984375q0.234375 -0.46875 0.234375 -1.40625l0 -0.515625zm3.6015625 7.359375l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm7.6328125 7.296875l0 -11.484375l1.28125 0l0 1.078125q0.453125 -0.640625 1.015625 -0.953125q0.578125 -0.3125 1.390625 -0.3125q1.0625 0 1.875 0.546875q0.8125 0.546875 1.21875 1.546875q0.421875 0.984375 0.421875 2.171875q0 1.28125 -0.46875 2.296875q-0.453125 1.015625 -1.328125 1.5625q-0.859375 0.546875 -1.828125 0.546875q-0.703125 0 -1.265625 -0.296875q-0.546875 -0.296875 -0.90625 -0.75l0 4.046875l-1.40625 0zm1.265625 -7.296875q0 1.609375 0.640625 2.375q0.65625 0.765625 1.578125 0.765625q0.9375 0 1.609375 -0.796875q0.671875 -0.796875 0.671875 -2.453125q0 -1.59375 -0.65625 -2.375q-0.65625 -0.796875 -1.5625 -0.796875q-0.890625 0 -1.59375 0.84375q-0.6875 0.84375 -0.6875 2.4375zm7.0703125 1.625l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0z" fill-rule="nonzero"/><path fill="#000000" d="m625.3871 390.69617l0 -11.453125l5.078125 0q1.53125 0 2.328125 0.3125q0.796875 0.296875 1.265625 1.078125q0.484375 0.78125 0.484375 1.734375q0 1.21875 -0.796875 2.0625q-0.78125 0.828125 -2.4375 1.046875q0.609375 0.296875 0.921875 0.578125q0.65625 0.609375 1.25 1.515625l2.0 3.125l-1.90625 0l-1.515625 -2.390625q-0.671875 -1.03125 -1.109375 -1.578125q-0.421875 -0.546875 -0.765625 -0.765625q-0.328125 -0.21875 -0.6875 -0.296875q-0.25 -0.0625 -0.84375 -0.0625l-1.75 0l0 5.09375l-1.515625 0zm1.515625 -6.40625l3.25 0q1.046875 0 1.625 -0.203125q0.59375 -0.21875 0.890625 -0.6875q0.3125 -0.484375 0.3125 -1.03125q0 -0.8125 -0.59375 -1.328125q-0.59375 -0.53125 -1.859375 -0.53125l-3.625 0l0 3.78125zm10.0390625 6.40625l0 -11.453125l8.28125 0l0 1.34375l-6.765625 0l0 3.515625l6.34375 0l0 1.34375l-6.34375 0l0 3.890625l7.03125 0l0 1.359375l-8.546875 0zm10.125 -3.6875l1.4375 -0.125q0.09375 0.859375 0.46875 1.421875q0.375 0.546875 1.15625 0.890625q0.78125 0.328125 1.75 0.328125q0.875 0 1.53125 -0.25q0.671875 -0.265625 0.984375 -0.703125q0.328125 -0.453125 0.328125 -0.984375q0 -0.546875 -0.3125 -0.9375q-0.3125 -0.40625 -1.03125 -0.6875q-0.453125 -0.171875 -2.03125 -0.546875q-1.578125 -0.390625 -2.21875 -0.71875q-0.8125 -0.4375 -1.21875 -1.0625q-0.40625 -0.640625 -0.40625 -1.4375q0 -0.859375 0.484375 -1.609375q0.5 -0.765625 1.4375 -1.15625q0.953125 -0.390625 2.109375 -0.390625q1.28125 0 2.25 0.421875q0.96875 0.40625 1.484375 1.203125q0.53125 0.796875 0.578125 1.796875l-1.453125 0.109375q-0.125 -1.078125 -0.796875 -1.625q-0.671875 -0.5625 -2.0 -0.5625q-1.375 0 -2.0 0.5q-0.625 0.5 -0.625 1.21875q0 0.609375 0.4375 1.015625q0.4375 0.390625 2.28125 0.8125q1.859375 0.421875 2.546875 0.734375q1.0 0.453125 1.46875 1.171875q0.484375 0.703125 0.484375 1.625q0 0.90625 -0.53125 1.71875q-0.515625 0.8125 -1.5 1.265625q-0.984375 0.453125 -2.203125 0.453125q-1.5625 0 -2.609375 -0.453125q-1.046875 -0.46875 -1.65625 -1.375q-0.59375 -0.90625 -0.625 -2.0625zm14.109375 3.6875l0 -10.109375l-3.78125 0l0 -1.34375l9.078125 0l0 1.34375l-3.78125 0l0 10.109375l-1.515625 0zm8.859375 0l4.40625 -11.453125l1.640625 0l4.6875 11.453125l-1.734375 0l-1.328125 -3.46875l-4.796875 0l-1.25 3.46875l-1.625 0zm3.3125 -4.703125l3.890625 0l-1.203125 -3.171875q-0.546875 -1.453125 -0.8125 -2.375q-0.21875 1.09375 -0.609375 2.1875l-1.265625 3.359375zm8.625 4.703125l0 -11.453125l4.328125 0q1.140625 0 1.734375 0.109375q0.84375 0.140625 1.40625 0.53125q0.578125 0.390625 0.921875 1.109375q0.359375 0.703125 0.359375 1.5625q0 1.453125 -0.9375 2.46875q-0.921875 1.015625 -3.359375 1.015625l-2.9375 0l0 4.65625l-1.515625 0zm1.515625 -6.015625l2.96875 0q1.46875 0 2.078125 -0.546875q0.625 -0.546875 0.625 -1.53125q0 -0.71875 -0.375 -1.234375q-0.359375 -0.515625 -0.953125 -0.671875q-0.375 -0.109375 -1.40625 -0.109375l-2.9375 0l0 4.09375zm9.421875 6.015625l0 -11.453125l1.515625 0l0 11.453125l-1.515625 0zm3.4453125 -2.484375l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46875 -0.40625 0.46875 -0.9375q0 -0.46875 -0.40625 -0.75q-0.296875 -0.1875 -1.4375 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.71875 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.546875 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.484375 0.390625 2.078125 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.765625 0.34375 -1.734375 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0z" fill-rule="nonzero"/><path fill="#ffffff" d="m84.18635 118.314964l45.511818 0l0 380.59842l-45.511818 0z" fill-rule="evenodd"/><path stroke="#595959" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m84.18635 118.314964l45.511818 0l0 380.59842l-45.511818 0z" fill-rule="evenodd"/><path fill="#000000" d="m99.65124 250.49417l0 -20.046875l2.65625 0l0 9.9375l9.953125 -9.9375l3.59375 0l-8.40625 8.125l8.78125 11.921875l-3.5 0l-7.140625 -10.140625l-3.28125 3.1875l0 6.953125l-2.65625 0z" fill-rule="nonzero"/><path fill="#000000" d="m97.55749 284.49417l7.703125 -20.046875l2.859375 0l8.203125 20.046875l-3.015625 0l-2.34375 -6.078125l-8.375 0l-2.203125 6.078125l-2.828125 0zm5.796875 -8.234375l6.78125 0l-2.078125 -5.546875q-0.96875 -2.53125 -1.421875 -4.15625q-0.390625 1.921875 -1.09375 3.828125l-2.1875 5.875z" fill-rule="nonzero"/><path fill="#000000" d="m100.68737 318.49417l0 -20.046875l13.515625 0l0 2.375l-10.859375 0l0 6.203125l9.40625 0l0 2.359375l-9.40625 0l0 9.109375l-2.65625 0z" fill-rule="nonzero"/><path fill="#000000" d="m99.65124 352.49417l0 -20.046875l2.65625 0l0 9.9375l9.953125 -9.9375l3.59375 0l-8.40625 8.125l8.78125 11.921875l-3.5 0l-7.140625 -10.140625l-3.28125 3.1875l0 6.953125l-2.65625 0z" fill-rule="nonzero"/><path fill="#000000" d="m97.55749 386.49417l7.703125 -20.046875l2.859375 0l8.203125 20.046875l-3.015625 0l-2.34375 -6.078125l-8.375 0l-2.203125 6.078125l-2.828125 0zm5.796875 -8.234375l6.78125 0l-2.078125 -5.546875q-0.96875 -2.53125 -1.421875 -4.15625q-0.390625 1.921875 -1.09375 3.828125l-2.1875 5.875z" fill-rule="nonzero"/><path fill="#000000" fill-opacity="0.0" d="m195.91664 453.04297l-65.480316 0" fill-rule="evenodd"/><path stroke="#595959" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m195.91664 453.04297l-59.480316 0" fill-rule="evenodd"/><path fill="#595959" stroke="#595959" stroke-width="1.0" stroke-linecap="butt" d="m136.43633 451.39124l-4.538086 1.6517334l4.538086 1.6517334z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m356.65158 329.96957l-226.20473 0" fill-rule="evenodd"/><path stroke="#595959" stroke-width="1.0" stroke-linejoin="round" stroke-linecap="butt" d="m350.65158 329.96957l-220.20473 0" fill-rule="evenodd"/><path fill="#595959" stroke="#595959" stroke-width="1.0" stroke-linecap="butt" d="m350.65158 331.6213l4.538086 -1.6517334l-4.538086 -1.6517334z" fill-rule="evenodd"/><path fill="#000000" fill-opacity="0.0" d="m146.89153 298.7792l174.3622 0l0 38.771667l-174.3622 0z" fill-rule="evenodd"/><path fill="#000000" d="m210.88121 323.1392l0 -11.453125l8.28125 0l0 1.34375l-6.765625 0l0 3.515625l6.34375 0l0 1.34375l-6.34375 0l0 3.890625l7.03125 0l0 1.359375l-8.546875 0zm12.765625 0l-3.15625 -8.296875l1.484375 0l1.78125 4.96875q0.296875 0.796875 0.53125 1.671875q0.1875 -0.65625 0.53125 -1.578125l1.84375 -5.0625l1.4375 0l-3.140625 8.296875l-1.3125 0zm11.375 -2.671875l1.453125 0.171875q-0.34375 1.28125 -1.28125 1.984375q-0.921875 0.703125 -2.359375 0.703125q-1.828125 0 -2.890625 -1.125q-1.0625 -1.125 -1.0625 -3.140625q0 -2.09375 1.078125 -3.25q1.078125 -1.15625 2.796875 -1.15625q1.65625 0 2.703125 1.140625q1.0625 1.125 1.0625 3.171875q0 0.125 0 0.375l-6.1875 0q0.078125 1.375 0.765625 2.109375q0.703125 0.71875 1.734375 0.71875q0.78125 0 1.328125 -0.40625q0.546875 -0.40625 0.859375 -1.296875zm-4.609375 -2.28125l4.625 0q-0.09375 -1.046875 -0.53125 -1.5625q-0.671875 -0.8125 -1.734375 -0.8125q-0.96875 0 -1.640625 0.65625q-0.65625 0.640625 -0.71875 1.71875zm7.8359375 4.953125l0 -8.296875l1.265625 0l0 1.171875q0.90625 -1.359375 2.640625 -1.359375q0.75 0 1.375 0.265625q0.625 0.265625 0.9375 0.703125q0.3125 0.4375 0.4375 1.046875q0.078125 0.390625 0.078125 1.359375l0 5.109375l-1.40625 0l0 -5.046875q0 -0.859375 -0.171875 -1.28125q-0.15625 -0.4375 -0.578125 -0.6875q-0.40625 -0.25 -0.96875 -0.25q-0.90625 0 -1.5625 0.578125q-0.640625 0.5625 -0.640625 2.15625l0 4.53125l-1.40625 0zm11.9609375 -1.265625l0.203125 1.25q-0.59375 0.125 -1.0625 0.125q-0.765625 0 -1.1875 -0.234375q-0.421875 -0.25 -0.59375 -0.640625q-0.171875 -0.40625 -0.171875 -1.671875l0 -4.765625l-1.03125 0l0 -1.09375l1.03125 0l0 -2.0625l1.40625 -0.84375l0 2.90625l1.40625 0l0 1.09375l-1.40625 0l0 4.84375q0 0.609375 0.0625 0.78125q0.078125 0.171875 0.25 0.28125q0.171875 0.09375 0.484375 0.09375q0.234375 0 0.609375 -0.0625zm0.8203125 -1.21875l1.390625 -0.21875q0.109375 0.84375 0.640625 1.296875q0.546875 0.4375 1.5 0.4375q0.96875 0 1.4375 -0.390625q0.46876526 -0.40625 0.46876526 -0.9375q0 -0.46875 -0.40625 -0.75q-0.29689026 -0.1875 -1.4375153 -0.46875q-1.546875 -0.390625 -2.15625 -0.671875q-0.59375 -0.296875 -0.90625 -0.796875q-0.296875 -0.5 -0.296875 -1.109375q0 -0.5625 0.25 -1.03125q0.25 -0.46875 0.6875 -0.78125q0.328125 -0.25 0.890625 -0.40625q0.578125 -0.171875 1.21875 -0.171875q0.984375 0 1.7187653 0.28125q0.734375 0.28125 1.078125 0.765625q0.359375 0.46875 0.5 1.28125l-1.375 0.1875q-0.09375 -0.640625 -0.54689026 -1.0q-0.453125 -0.359375 -1.265625 -0.359375q-0.96875 0 -1.390625 0.328125q-0.40625 0.3125 -0.40625 0.734375q0 0.28125 0.171875 0.5q0.171875 0.21875 0.53125 0.375q0.21875 0.078125 1.25 0.359375q1.4843903 0.390625 2.0781403 0.65625q0.59375 0.25 0.921875 0.734375q0.34375 0.484375 0.34375 1.203125q0 0.703125 -0.421875 1.328125q-0.40625 0.609375 -1.1875 0.953125q-0.76564026 0.34375 -1.7343903 0.34375q-1.625 0 -2.46875 -0.671875q-0.84375 -0.671875 -1.078125 -2.0z" fill-rule="nonzero"/></g></svg>
\ No newline at end of file
diff --git a/docs/output_examples.md b/docs/output_examples.md
index d0094aa..bfaaa4c 100644
--- a/docs/output_examples.md
+++ b/docs/output_examples.md
@@ -31,6 +31,8 @@
<hardware xmlns="urn:ietf:params:xml:ns:yang:ietf-hardware">
<component>
<name>d0eee966-31dd-4d7b-af83-50681761f766</name>
+ <parent>3ee22e94-da3b-4048-9137-fdd12fde138a</parent>
+ <parent-rel-pos>536870912</parent-rel-pos>
<hardware-rev/>
<firmware-rev/>
<serial-num>BBSM000a0001</serial-num>
@@ -69,6 +71,59 @@
</devices>
```
+## Get provisioned services
+```
+<vlan-translation-profiles xmlns="urn:bbf:yang:bbf-l2-access-attributes">
+ <vlan-translation-profile>
+ <name>BBSM000a0001-1-hsia</name>
+ <ingress-rewrite>
+ <push-outer-tag>
+ <vlan-id>900</vlan-id>
+ </push-outer-tag>
+ <push-second-tag>
+ <vlan-id>900</vlan-id>
+ </push-second-tag>
+ </ingress-rewrite>
+ </vlan-translation-profile>
+</vlan-translation-profiles>
+<line-bandwidth-profiles xmlns="urn:bbf:yang:bbf-nt-line-profile">
+ <line-bandwidth-profile>
+ <name>User_Bandwidth2</name>
+ <fixed-bandwidth>100000</fixed-bandwidth>
+ <assured-bandwidth>100000</assured-bandwidth>
+ <maximum-bandwidth>100000</maximum-bandwidth>
+ </line-bandwidth-profile>
+ <line-bandwidth-profile>
+ <name>User_Bandwidth1</name>
+ <fixed-bandwidth>30000</fixed-bandwidth>
+ <assured-bandwidth>100000</assured-bandwidth>
+ <maximum-bandwidth>100000</maximum-bandwidth>
+ </line-bandwidth-profile>
+</line-bandwidth-profiles>
+<service-profiles xmlns="urn:bbf:yang:bbf-nt-service-profile">
+ <service-profile>
+ <name>BBSM000a0001-1-hsia</name>
+ <ports>
+ <port>
+ <name>BBSM000a0001-1</name>
+ <port-vlans>
+ <port-vlan>
+ <name>BBSM000a0001-1-hsia</name>
+ </port-vlan>
+ </port-vlans>
+ <technology-profile-id xmlns="urn:bbf:yang:bbf-nt-service-profile-voltha">64</technology-profile-id>
+ <upstream-subscriber-bp-name xmlns="urn:bbf:yang:bbf-nt-service-profile-voltha">User_Bandwidth1</upstream-subscriber-bp-name>
+ <downstream-subscriber-bp-name xmlns="urn:bbf:yang:bbf-nt-service-profile-voltha">User_Bandwidth2</downstream-subscriber-bp-name>
+ <mac-learning-enabled xmlns="urn:bbf:yang:bbf-nt-service-profile-voltha">false</mac-learning-enabled>
+ <dhcp-required xmlns="urn:bbf:yang:bbf-nt-service-profile-voltha">true</dhcp-required>
+ <igmp-required xmlns="urn:bbf:yang:bbf-nt-service-profile-voltha">false</igmp-required>
+ <pppoe-required xmlns="urn:bbf:yang:bbf-nt-service-profile-voltha">false</pppoe-required>
+ </port>
+ </ports>
+ </service-profile>
+</service-profiles>
+```
+
## ONU Activated notification
```
<onu-state-change xmlns="urn:bbf:yang:bbf-xpon-onu-states">
diff --git a/docs/supported_operations.md b/docs/supported_operations.md
new file mode 100644
index 0000000..a0f6a34
--- /dev/null
+++ b/docs/supported_operations.md
@@ -0,0 +1,50 @@
+# Supported operations
+This page provides a list of operations that are currently supported by the BBF Adapter, with references on how to perform them and documentations on their behavior.
+
+## "Get" operations
+
+### Get devices data
+Information on the devices managed by VOLTHA can be retrieved with a `get-data` NETCONF operation on the `operational` datastore.\
+The following XPath can be used to filter this information: `/bbf-device-aggregation:*`
+
+An example of the exposed information can be found in [output_examples.md](output_examples.md)
+
+>The following information is not currently available but planned for future updates:
+>- ONU software images
+>- OLT endpoint information
+
+### Get services data
+Information on the provisioned services can be retrieved with a `get-data` NETCONF operation on the `operational` datastore.\
+The following XPath can be used to filter this information: `/bbf-nt-service-profile:*|/bbf-l2-access-attributes:*|/bbf-nt-line-profile:*`
+
+An example of the exposed information can be found in [output_examples.md](output_examples.md)
+
+>The translation of bandwidth profiles to YANG data is currently under discussion and will be provided in a future update
+
+## "Set" operations
+
+### Activate a service
+A service can be activated on a specific UNI with the creation of nodes through an `edit-config` operation on the `running` datastore.\
+The necessary information for the activation of a service are the UNI port name, C-Tag, S-Tag and Technology Profile ID.\
+Configuration for both `vlan-translation-profiles` and `service-profiles` has to be created with a single request, since the operation will be translated to a single API call to ONOS. Failing to provide both will result in an error.
+
+>The complete configuration for the service, matching the provided C-Tag, S-Tag and Technology Profile must be available to ONOS through SAIDS.
+
+An example of the configuration to activate a service can be found in [provision_service.xml](../examples/provision_service.xml)
+
+### Deactivate a service
+A service can be deactivated on a specific UNI with the deletion of nodes through an `edit-config` operation on the `running` datastore.\
+The necessary information for the deactivation of a service is the name used for its creation.\
+
+An example of the configuration to deactivate a service can be found in [remove_service.xml](../examples/remove_service.xml)
+
+## Notifications
+
+### ONU Activated notification
+
+A notification for the `ONU_ACTIVATED` event can be received by subscribing to the `bbf-xpon-onu-states` stream.
+After this notification is received, services can be provisioned on the ONU it refers to.
+
+An example of this notification can be found in [output_examples.md](output_examples.md)
+
+>The use of the bbf-xpon-onu-states yang module is temporary, and will be substituted after the definition of a VOLTHA specific yang notification
\ No newline at end of file
diff --git a/examples/provision_service.xml b/examples/provision_service.xml
new file mode 100644
index 0000000..4b19ae3
--- /dev/null
+++ b/examples/provision_service.xml
@@ -0,0 +1,47 @@
+<!--
+~ Copyright 2022-present Open Networking Foundation
+~
+~ 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.
+-->
+
+<!-- Provisions the ATT HSIA service defined in the default deployment of BBSIM -->
+
+<vlan-translation-profiles xmlns="urn:bbf:yang:bbf-l2-access-attributes">
+ <vlan-translation-profile>
+ <name>BBSM000a0001-1-hsia</name>
+ <ingress-rewrite>
+ <push-outer-tag>
+ <vlan-id>900</vlan-id>
+ </push-outer-tag>
+ <push-second-tag>
+ <vlan-id>900</vlan-id>
+ </push-second-tag>
+ </ingress-rewrite>
+ </vlan-translation-profile>
+</vlan-translation-profiles>
+<service-profiles xmlns="urn:bbf:yang:bbf-nt-service-profile">
+ <service-profile>
+ <name>BBSM000a0001-1-hsia</name>
+ <ports>
+ <port>
+ <name>BBSM000a0001-1</name>
+ <port-vlans>
+ <port-vlan>
+ <name>BBSM000a0001-1-hsia</name>
+ </port-vlan>
+ </port-vlans>
+ <technology-profile-id xmlns="urn:bbf:yang:bbf-nt-service-profile-voltha">64</technology-profile-id>
+ </port>
+ </ports>
+ </service-profile>
+</service-profiles>
\ No newline at end of file
diff --git a/examples/remove_service.xml b/examples/remove_service.xml
new file mode 100644
index 0000000..67ad6ab
--- /dev/null
+++ b/examples/remove_service.xml
@@ -0,0 +1,28 @@
+<!--
+~ Copyright 2022-present Open Networking Foundation
+~
+~ 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.
+-->
+
+<!-- Removes the ATT HSIA service defined in the default deployment of BBSIM -->
+
+<vlan-translation-profiles xmlns="urn:bbf:yang:bbf-l2-access-attributes">
+ <vlan-translation-profile xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0" xc:operation="delete">
+ <name>BBSM000a0001-1-hsia</name>
+ </vlan-translation-profile>
+</vlan-translation-profiles>
+<service-profiles xmlns="urn:bbf:yang:bbf-nt-service-profile">
+ <service-profile xmlns:xc="urn:ietf:params:xml:ns:netconf:base:1.0" xc:operation="delete">
+ <name>BBSM000a0001-1-hsia</name>
+ </service-profile>
+</service-profiles>
\ No newline at end of file
diff --git a/internal/clients/olt_app.go b/internal/clients/olt_app.go
deleted file mode 100644
index 6e171b9..0000000
--- a/internal/clients/olt_app.go
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
-* Copyright 2022-present Open Networking Foundation
-
-* 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.
- */
-
-package clients
-
-import (
- "context"
- "fmt"
- "io"
- "net/http"
- "time"
-
- "github.com/opencord/voltha-lib-go/v7/pkg/log"
-)
-
-const (
- oltAppHttpRequestTimeout = time.Second * 10
- oltAppBackoffInterval = time.Second * 10
-)
-
-type OltAppClient struct {
- httpClient *http.Client
- endpoint string
- username string
- password string
-}
-
-type RestResponse struct {
- Body string
- Code int
-}
-
-// Creates a new olt app client
-func NewOltAppClient(endpoint string, user string, pass string) *OltAppClient {
- return &OltAppClient{
- httpClient: &http.Client{
- Timeout: oltAppHttpRequestTimeout,
- },
- endpoint: endpoint,
- username: user,
- password: pass,
- }
-}
-
-func (c *OltAppClient) CheckConnection(ctx context.Context) error {
- logger.Debugw(ctx, "checking-connection-to-onos-olt-app-api", log.Fields{"endpoint": c.endpoint})
-
- for {
- if resp, err := c.GetStatus(); err == nil {
- logger.Debug(ctx, "onos-olt-app-api-reachable")
- break
- } else {
- logger.Warnw(ctx, "onos-olt-app-api-not-ready", log.Fields{
- "err": err,
- "response": resp,
- })
- }
-
- //Wait a bit before trying again
- select {
- case <-ctx.Done():
- return fmt.Errorf("onos-olt-app-connection-stopped-due-to-context-done")
- case <-time.After(oltAppBackoffInterval):
- continue
- }
- }
-
- return nil
-}
-
-func (c *OltAppClient) makeRequest(method string, url string) (RestResponse, error) {
- result := RestResponse{Code: 0}
-
- req, err := http.NewRequest(method, url, nil)
- if err != nil {
- return result, fmt.Errorf("cannot-create-request: %s", err)
- }
-
- req.SetBasicAuth(c.username, c.password)
-
- resp, err := c.httpClient.Do(req)
- if err != nil {
- return result, fmt.Errorf("cannot-get-response: %s", err)
- }
- defer resp.Body.Close()
-
- buffer, err := io.ReadAll(resp.Body)
- if err != nil {
- return result, fmt.Errorf("error-while-reading-response-body: %s", err)
- }
-
- result.Body = string(buffer)
- result.Code = resp.StatusCode
-
- if result.Code != http.StatusOK {
- return result, fmt.Errorf("status-code-not-ok: %s %s %d", method, url, result.Code)
- }
-
- return result, nil
-}
-
-func (c *OltAppClient) GetStatus() (RestResponse, error) {
- method := http.MethodGet
- url := fmt.Sprintf("http://%s/onos/olt/oltapp/status", c.endpoint)
-
- return c.makeRequest(method, url)
-}
-
-//NOTE: if methods are used to retrieve more complex information
-//it may be better to return an already deserialized structure
-//instead of the current RestResponse
-func (c *OltAppClient) ProvisionSubscriber(device string, port uint32) (RestResponse, error) {
- method := http.MethodPost
- url := fmt.Sprintf("http://%s/onos/olt/oltapp/%s/%d", c.endpoint, device, port)
-
- return c.makeRequest(method, url)
-}
-
-func (c *OltAppClient) RemoveSubscriber(device string, port uint32) (RestResponse, error) {
- method := http.MethodDelete
- url := fmt.Sprintf("http://%s/onos/olt/oltapp/%s/%d", c.endpoint, device, port)
-
- return c.makeRequest(method, url)
-}
diff --git a/internal/clients/onos.go b/internal/clients/onos.go
new file mode 100644
index 0000000..2de584c
--- /dev/null
+++ b/internal/clients/onos.go
@@ -0,0 +1,254 @@
+/*
+* Copyright 2022-present Open Networking Foundation
+
+* 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.
+ */
+
+package clients
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+ "io"
+ "net/http"
+ "time"
+
+ "github.com/opencord/voltha-lib-go/v7/pkg/log"
+)
+
+const (
+ onosHttpRequestTimeout = time.Second * 10
+ onosBackoffInterval = time.Second * 10
+)
+
+type OnosClient struct {
+ httpClient *http.Client
+ endpoint string
+ username string
+ password string
+}
+
+type RestResponse struct {
+ Body string
+ Code int
+}
+
+// Creates a new olt app client
+func NewOnosClient(endpoint string, user string, pass string) *OnosClient {
+ return &OnosClient{
+ httpClient: &http.Client{
+ Timeout: onosHttpRequestTimeout,
+ },
+ endpoint: endpoint,
+ username: user,
+ password: pass,
+ }
+}
+
+func (c *OnosClient) CheckConnection(ctx context.Context) error {
+ logger.Debugw(ctx, "checking-connection-to-onos-olt-app-api", log.Fields{"endpoint": c.endpoint})
+
+ for {
+ if resp, err := c.GetStatus(); err == nil {
+ logger.Debug(ctx, "onos-olt-app-api-reachable")
+ break
+ } else {
+ logger.Warnw(ctx, "onos-olt-app-api-not-ready", log.Fields{
+ "err": err,
+ "response": resp,
+ })
+ }
+
+ //Wait a bit before trying again
+ select {
+ case <-ctx.Done():
+ return fmt.Errorf("onos-olt-app-connection-stopped-due-to-context-done")
+ case <-time.After(onosBackoffInterval):
+ continue
+ }
+ }
+
+ return nil
+}
+
+func (c *OnosClient) makeRequest(method string, url string) (RestResponse, error) {
+ result := RestResponse{Code: 0}
+
+ req, err := http.NewRequest(method, url, nil)
+ if err != nil {
+ return result, fmt.Errorf("cannot-create-request: %s", err)
+ }
+
+ req.SetBasicAuth(c.username, c.password)
+
+ resp, err := c.httpClient.Do(req)
+ if err != nil {
+ return result, fmt.Errorf("cannot-get-response: %s", err)
+ }
+ defer resp.Body.Close()
+
+ buffer, err := io.ReadAll(resp.Body)
+ if err != nil {
+ return result, fmt.Errorf("error-while-reading-response-body: %s", err)
+ }
+
+ result.Body = string(buffer)
+ result.Code = resp.StatusCode
+
+ if result.Code != http.StatusOK {
+ return result, fmt.Errorf("status-code-not-ok: %s %s %d", method, url, result.Code)
+ }
+
+ return result, nil
+}
+
+///////////////////////////////////////////////////////////////////////// ONOS OLT app APIs
+
+func (c *OnosClient) GetStatus() (RestResponse, error) {
+ method := http.MethodGet
+ url := fmt.Sprintf("http://%s/onos/olt/oltapp/status", c.endpoint)
+
+ return c.makeRequest(method, url)
+}
+
+func (c *OnosClient) ProvisionService(portName string, sTag string, cTag string, technologyProfileId string) (RestResponse, error) {
+ method := http.MethodPost
+ url := fmt.Sprintf("http://%s/onos/olt/oltapp/services/%s/%s/%s/%s", c.endpoint, portName, sTag, cTag, technologyProfileId)
+
+ return c.makeRequest(method, url)
+}
+
+func (c *OnosClient) RemoveService(portName string, sTag string, cTag string, trafficProfileId string) (RestResponse, error) {
+ method := http.MethodDelete
+ url := fmt.Sprintf("http://%s/onos/olt/oltapp/services/%s/%s/%s/%s", c.endpoint, portName, sTag, cTag, trafficProfileId)
+
+ return c.makeRequest(method, url)
+}
+
+type ProgrammedSubscriber struct {
+ Location string `json:"location"`
+ TagInfo SadisUniTag `json:"tagInfo"`
+}
+
+type SadisUniTag struct {
+ UniTagMatch int `json:"uniTagMatch,omitempty"`
+ PonCTag int `json:"ponCTag,omitempty"`
+ PonSTag int `json:"ponSTag,omitempty"`
+ TechnologyProfileID int `json:"technologyProfileId,omitempty"`
+ UpstreamBandwidthProfile string `json:"upstreamBandwidthProfile,omitempty"`
+ UpstreamOltBandwidthProfile string `json:"upstreamOltBandwidthProfile,omitempty"`
+ DownstreamBandwidthProfile string `json:"downstreamBandwidthProfile,omitempty"`
+ DownstreamOltBandwidthProfile string `json:"downstreamOltBandwidthProfile,omitempty"`
+ IsDhcpRequired bool `json:"isDhcpRequired,omitempty"`
+ IsIgmpRequired bool `json:"isIgmpRequired,omitempty"`
+ IsPPPoERequired bool `json:"isPppoeRequired,omitempty"`
+ ConfiguredMacAddress string `json:"configuredMacAddress,omitempty"`
+ EnableMacLearning bool `json:"enableMacLearning,omitempty"`
+ UsPonCTagPriority int `json:"usPonCTagPriority,omitempty"`
+ UsPonSTagPriority int `json:"usPonSTagPriority,omitempty"`
+ DsPonCTagPriority int `json:"dsPonCTagPriority,omitempty"`
+ DsPonSTagPriority int `json:"dsPonSTagPriority,omitempty"`
+ ServiceName string `json:"serviceName,omitempty"`
+}
+
+func (c *OnosClient) GetProgrammedSubscribers() ([]ProgrammedSubscriber, error) {
+ method := http.MethodGet
+ url := fmt.Sprintf("http://%s/onos/olt/oltapp/programmed-subscribers", c.endpoint)
+
+ response, err := c.makeRequest(method, url)
+ if err != nil {
+ return nil, err
+ }
+
+ var subscribers struct {
+ Entries []ProgrammedSubscriber `json:"entries"`
+ }
+ err = json.Unmarshal([]byte(response.Body), &subscribers)
+ if err != nil {
+ return nil, err
+ }
+
+ return subscribers.Entries, nil
+}
+
+///////////////////////////////////////////////////////////////////////// ONOS Core APIs
+
+type OnosPort struct {
+ Element string `json:"element"` //Device ID
+ Port string `json:"port"` //Port number
+ IsEnabled bool `json:"isEnabled"`
+ Type string `json:"type"`
+ PortSpeed uint `json:"portSpeed"`
+ Annotations map[string]string `json:"annotations"`
+}
+
+func (c *OnosClient) GetPorts() ([]OnosPort, error) {
+ method := http.MethodGet
+ url := fmt.Sprintf("http://%s/onos/v1/devices/ports", c.endpoint)
+
+ response, err := c.makeRequest(method, url)
+ if err != nil {
+ return nil, err
+ }
+
+ var ports struct {
+ Ports []OnosPort `json:"ports"`
+ }
+ err = json.Unmarshal([]byte(response.Body), &ports)
+ if err != nil {
+ return nil, err
+ }
+
+ return ports.Ports, nil
+}
+
+///////////////////////////////////////////////////////////////////////// ONOS SADIS APIs
+
+type BandwidthProfile struct {
+ Id string `json:"id"`
+ Cir int64 `json:"cir"`
+ Cbs string `json:"cbs"`
+ Air int64 `json:"air"`
+ Gir int64 `json:"gir"`
+ Eir int64 `json:"eir"`
+ Ebs string `json:"ebs"`
+ Pir int64 `json:"pir"`
+ Pbs string `json:"pbs"`
+}
+
+func (c *OnosClient) GetBandwidthProfile(id string) (*BandwidthProfile, error) {
+ method := http.MethodGet
+ url := fmt.Sprintf("http://%s/onos/sadis/bandwidthprofile/%s", c.endpoint, id)
+
+ response, err := c.makeRequest(method, url)
+ if err != nil {
+ return nil, err
+ }
+
+ var bwProfiles struct {
+ Entry []BandwidthProfile `json:"entry"`
+ }
+ err = json.Unmarshal([]byte(response.Body), &bwProfiles)
+ if err != nil {
+ return nil, err
+ }
+
+ //The response has a list, but always returns one item
+ //Verify this is correct and return it
+ if len(bwProfiles.Entry) != 1 {
+ return nil, fmt.Errorf("unexpected-number-of-bw-profile-entries: id=%s len=%d", id, len(bwProfiles.Entry))
+ }
+
+ return &bwProfiles.Entry[0], nil
+}
diff --git a/internal/clients/nbi.go b/internal/clients/voltha_nbi.go
similarity index 100%
rename from internal/clients/nbi.go
rename to internal/clients/voltha_nbi.go
diff --git a/internal/core/adapter.go b/internal/core/adapter.go
index 6a59650..5e19753 100644
--- a/internal/core/adapter.go
+++ b/internal/core/adapter.go
@@ -30,13 +30,13 @@
type VolthaYangAdapter struct {
volthaNbiClient *clients.VolthaNbiClient
- oltAppClient *clients.OltAppClient
+ onosClient *clients.OnosClient
}
-func NewVolthaYangAdapter(nbiClient *clients.VolthaNbiClient, oltClient *clients.OltAppClient) *VolthaYangAdapter {
+func NewVolthaYangAdapter(nbiClient *clients.VolthaNbiClient, onosClient *clients.OnosClient) *VolthaYangAdapter {
return &VolthaYangAdapter{
volthaNbiClient: nbiClient,
- oltAppClient: oltClient,
+ onosClient: onosClient,
}
}
@@ -58,7 +58,7 @@
if err != nil {
return nil, fmt.Errorf("get-onu-ports-failed: %v", err)
}
- logger.Debugw(ctx, "get-ports-success", log.Fields{"deviceId": device.Id, "ports": ports})
+ logger.Debugw(ctx, "get-onu-ports-success", log.Fields{"deviceId": device.Id, "ports": ports})
portsItems, err := translateOnuPorts(device.Id, ports)
if err != nil {
@@ -75,3 +75,114 @@
return items, nil
}
+
+func (t *VolthaYangAdapter) GetVlans(ctx context.Context) ([]YangItem, error) {
+ services, err := t.onosClient.GetProgrammedSubscribers()
+ if err != nil {
+ return nil, fmt.Errorf("get-programmed-subscribers-failed: %v", err)
+ }
+ logger.Debugw(ctx, "get-programmed-subscribers-success", log.Fields{"services": services})
+
+ //No need for other requests if there are no services
+ if len(services) == 0 {
+ return []YangItem{}, nil
+ }
+
+ ports, err := t.onosClient.GetPorts()
+ if err != nil {
+ return nil, fmt.Errorf("get-onos-ports-failed: %v", err)
+ }
+ logger.Debugw(ctx, "get-onos-ports-success", log.Fields{"ports": ports})
+
+ items, err := translateVlans(services, ports)
+ if err != nil {
+ return nil, fmt.Errorf("cannot-translate-vlans: %v", err)
+ }
+
+ return items, nil
+}
+
+func (t *VolthaYangAdapter) GetBandwidthProfiles(ctx context.Context) ([]YangItem, error) {
+ services, err := t.onosClient.GetProgrammedSubscribers()
+ if err != nil {
+ return nil, fmt.Errorf("get-programmed-subscribers-failed: %v", err)
+ }
+ logger.Debugw(ctx, "get-programmed-subscribers-success", log.Fields{"services": services})
+
+ //No need for other requests if there are no services
+ if len(services) == 0 {
+ return []YangItem{}, nil
+ }
+
+ bwProfilesMap := map[string]bool{}
+ bwProfiles := []clients.BandwidthProfile{}
+
+ for _, service := range services {
+ //Get information on downstream bw profile if new
+ if _, ok := bwProfilesMap[service.TagInfo.DownstreamBandwidthProfile]; !ok {
+ bw, err := t.onosClient.GetBandwidthProfile(service.TagInfo.DownstreamBandwidthProfile)
+ if err != nil {
+ return nil, fmt.Errorf("get-bw-profile-failed: %s %v", service.TagInfo.DownstreamBandwidthProfile, err)
+ }
+ logger.Debugw(ctx, "get-bw-profile-success", log.Fields{"bwProfile": bw})
+
+ bwProfiles = append(bwProfiles, *bw)
+ bwProfilesMap[service.TagInfo.DownstreamBandwidthProfile] = true
+ }
+
+ //Get information on upstream bw profile if new
+ if _, ok := bwProfilesMap[service.TagInfo.UpstreamBandwidthProfile]; !ok {
+ bw, err := t.onosClient.GetBandwidthProfile(service.TagInfo.UpstreamBandwidthProfile)
+ if err != nil {
+ return nil, fmt.Errorf("get-bw-profile-failed: %s %v", service.TagInfo.UpstreamBandwidthProfile, err)
+ }
+ logger.Debugw(ctx, "get-bw-profile-success", log.Fields{"bwProfile": bw})
+
+ bwProfiles = append(bwProfiles, *bw)
+ bwProfilesMap[service.TagInfo.UpstreamBandwidthProfile] = true
+ }
+ }
+
+ items, err := translateBandwidthProfiles(bwProfiles)
+ if err != nil {
+ return nil, fmt.Errorf("cannot-translate-bandwidth-profiles: %v", err)
+ }
+
+ return items, nil
+}
+
+func (t *VolthaYangAdapter) GetServices(ctx context.Context) ([]YangItem, error) {
+ services, err := t.onosClient.GetProgrammedSubscribers()
+ if err != nil {
+ return nil, fmt.Errorf("get-programmed-subscribers-failed: %v", err)
+ }
+ logger.Debugw(ctx, "get-programmed-subscribers-success", log.Fields{"services": services})
+
+ //No need for other requests if there are no services
+ if len(services) == 0 {
+ return []YangItem{}, nil
+ }
+
+ ports, err := t.onosClient.GetPorts()
+ if err != nil {
+ return nil, fmt.Errorf("get-onos-ports-failed: %v", err)
+ }
+ logger.Debugw(ctx, "get-onos-ports-success", log.Fields{"ports": ports})
+
+ items, err := translateServices(services, ports)
+ if err != nil {
+ return nil, fmt.Errorf("cannot-translate-services: %v", err)
+ }
+
+ return items, nil
+}
+
+func (t *VolthaYangAdapter) ProvisionService(portName string, sTag string, cTag string, technologyProfileId string) error {
+ _, err := t.onosClient.ProvisionService(portName, sTag, cTag, technologyProfileId)
+ return err
+}
+
+func (t *VolthaYangAdapter) RemoveService(portName string, sTag string, cTag string, technologyProfileId string) error {
+ _, err := t.onosClient.RemoveService(portName, sTag, cTag, technologyProfileId)
+ return err
+}
diff --git a/internal/core/translation.go b/internal/core/translation.go
index ef6582d..623e261 100644
--- a/internal/core/translation.go
+++ b/internal/core/translation.go
@@ -18,8 +18,10 @@
import (
"fmt"
+ "strconv"
"time"
+ "github.com/opencord/voltha-northbound-bbf-adapter/internal/clients"
"github.com/opencord/voltha-protos/v5/go/common"
"github.com/opencord/voltha-protos/v5/go/voltha"
)
@@ -28,6 +30,15 @@
DeviceAggregationModule = "bbf-device-aggregation"
DevicesPath = "/" + DeviceAggregationModule + ":devices"
+ ServiceProfileModule = "bbf-nt-service-profile"
+ ServiceProfilesPath = "/" + ServiceProfileModule + ":service-profiles"
+
+ VlansModule = "bbf-l2-access-attributes"
+ VlansPath = "/" + VlansModule + ":vlan-translation-profiles"
+
+ BandwidthProfileModule = "bbf-nt-line-profile"
+ BandwidthProfilesPath = "/" + BandwidthProfileModule + ":line-bandwidth-profiles"
+
//Device types
DeviceTypeOlt = "bbf-device-types:olt"
DeviceTypeOnu = "bbf-device-types:onu"
@@ -49,6 +60,10 @@
eventContextKeyPonId = "pon-id"
eventContextKeyOnuSn = "serial-number"
eventContextKeyOltSn = "olt-serial-number"
+
+ //Values to allow any VLAN ID
+ YangVlanIdAny = "any"
+ VolthaVlanIdAny = 4096
)
type YangItem struct {
@@ -66,6 +81,16 @@
return fmt.Sprintf("%s/device[name='%s']/data/ietf-hardware:hardware/component[name='%s']", DevicesPath, id, id)
}
+//GetServicePortPath returns the yang path to a service's port node
+func GetServicePortPath(serviceName string, portName string) string {
+ return fmt.Sprintf("%s/service-profile[name='%s']/ports/port[name='%s']", ServiceProfilesPath, serviceName, portName)
+}
+
+//GetVlansPath returns the yang path to a vlan translation profile's root node
+func GetVlansPath(serviceName string) string {
+ return fmt.Sprintf("%s/vlan-translation-profile[name='%s']", VlansPath, serviceName)
+}
+
//ietfHardwareAdminState returns the string that represents the ietf-hardware admin state
//enum value corresponding to the one of VOLTHA
func ietfHardwareAdminState(volthaAdminState voltha.AdminState_Types) string {
@@ -146,10 +171,20 @@
})
} else {
//ONU
- result = append(result, YangItem{
- Path: devicePath + "/type",
- Value: DeviceTypeOnu,
- })
+ result = append(result, []YangItem{
+ {
+ Path: devicePath + "/type",
+ Value: DeviceTypeOnu,
+ },
+ {
+ Path: hardwarePath + "/parent",
+ Value: device.ParentId,
+ },
+ {
+ Path: hardwarePath + "/parent-rel-pos",
+ Value: strconv.FormatUint(uint64(device.ParentPortNo), 10),
+ },
+ }...)
}
//Vendor name
@@ -284,3 +319,193 @@
return notification, channelTermination, nil
}
+
+//translateServices returns a slice of yang items that represent the currently programmed services
+func translateServices(subscribers []clients.ProgrammedSubscriber, ports []clients.OnosPort) ([]YangItem, error) {
+ //Create a map of port IDs to port names
+ //e.g. of:00000a0a0a0a0a0a/256 to BBSM000a0001-1
+ portNames := map[string]string{}
+
+ for _, port := range ports {
+ portId := fmt.Sprintf("%s/%s", port.Element, port.Port)
+ name, ok := port.Annotations["portName"]
+ if ok {
+ portNames[portId] = name
+ }
+ }
+
+ result := []YangItem{}
+
+ for _, subscriber := range subscribers {
+ portName, ok := portNames[subscriber.Location]
+ if !ok {
+ return nil, fmt.Errorf("no-port-name-for-location: %s", subscriber.Location)
+ }
+
+ serviceName := fmt.Sprintf("%s-%s", portName, subscriber.TagInfo.ServiceName)
+
+ portPath := GetServicePortPath(serviceName, portName)
+
+ if subscriber.TagInfo.ConfiguredMacAddress != "" {
+ result = append(result, YangItem{
+ Path: portPath + "/bbf-nt-service-profile-voltha:configured-mac-address",
+ Value: subscriber.TagInfo.ConfiguredMacAddress,
+ })
+ }
+
+ result = append(result, []YangItem{
+ {
+ Path: fmt.Sprintf("%s/port-vlans/port-vlan[name='%s']", portPath, serviceName),
+ Value: "",
+ },
+ {
+ Path: portPath + "/bbf-nt-service-profile-voltha:technology-profile-id",
+ Value: strconv.Itoa(subscriber.TagInfo.TechnologyProfileID),
+ },
+ {
+ Path: portPath + "/bbf-nt-service-profile-voltha:downstream-subscriber-bp-name",
+ Value: subscriber.TagInfo.DownstreamBandwidthProfile,
+ },
+ {
+ Path: portPath + "/bbf-nt-service-profile-voltha:upstream-subscriber-bp-name",
+ Value: subscriber.TagInfo.UpstreamBandwidthProfile,
+ },
+ {
+ Path: portPath + "/bbf-nt-service-profile-voltha:mac-learning-enabled",
+ Value: strconv.FormatBool(subscriber.TagInfo.EnableMacLearning),
+ },
+ {
+ Path: portPath + "/bbf-nt-service-profile-voltha:dhcp-required",
+ Value: strconv.FormatBool(subscriber.TagInfo.IsDhcpRequired),
+ },
+ {
+ Path: portPath + "/bbf-nt-service-profile-voltha:igmp-required",
+ Value: strconv.FormatBool(subscriber.TagInfo.IsIgmpRequired),
+ },
+ {
+ Path: portPath + "/bbf-nt-service-profile-voltha:pppoe-required",
+ Value: strconv.FormatBool(subscriber.TagInfo.IsPPPoERequired),
+ },
+ }...)
+
+ if subscriber.TagInfo.UpstreamOltBandwidthProfile != "" {
+ result = append(result, YangItem{
+ Path: portPath + "/bbf-nt-service-profile-voltha:upstream-olt-bp-name",
+ Value: subscriber.TagInfo.UpstreamOltBandwidthProfile,
+ })
+ }
+
+ if subscriber.TagInfo.DownstreamOltBandwidthProfile != "" {
+ result = append(result, YangItem{
+ Path: portPath + "/bbf-nt-service-profile-voltha:downstream-olt-bp-name",
+ Value: subscriber.TagInfo.UpstreamOltBandwidthProfile,
+ })
+ }
+ }
+
+ return result, nil
+}
+
+//translateVlans returns a slice of yang items that represent the vlans used by programmed services
+func translateVlans(subscribers []clients.ProgrammedSubscriber, ports []clients.OnosPort) ([]YangItem, error) {
+ //Create a map of port IDs to port names
+ //e.g. of:00000a0a0a0a0a0a/256 to BBSM000a0001-1
+ portNames := map[string]string{}
+
+ for _, port := range ports {
+ portId := fmt.Sprintf("%s/%s", port.Element, port.Port)
+ name, ok := port.Annotations["portName"]
+ if ok {
+ portNames[portId] = name
+ }
+ }
+
+ result := []YangItem{}
+
+ for _, subscriber := range subscribers {
+ portName, ok := portNames[subscriber.Location]
+ if !ok {
+ return nil, fmt.Errorf("no-port-name-for-location: %s", subscriber.Location)
+ }
+
+ serviceName := fmt.Sprintf("%s-%s", portName, subscriber.TagInfo.ServiceName)
+
+ vlansPath := GetVlansPath(serviceName)
+
+ uniTagMatch := YangVlanIdAny
+ sTag := YangVlanIdAny
+ cTag := YangVlanIdAny
+
+ if subscriber.TagInfo.UniTagMatch != VolthaVlanIdAny {
+ uniTagMatch = strconv.Itoa(subscriber.TagInfo.UniTagMatch)
+ }
+ if subscriber.TagInfo.PonSTag != VolthaVlanIdAny {
+ sTag = strconv.Itoa(subscriber.TagInfo.PonSTag)
+ }
+ if subscriber.TagInfo.PonCTag != VolthaVlanIdAny {
+ cTag = strconv.Itoa(subscriber.TagInfo.PonCTag)
+ }
+
+ if subscriber.TagInfo.UniTagMatch > 0 {
+ result = append(result, []YangItem{
+ {
+ Path: vlansPath + "/match-criteria/outer-tag/vlan-id",
+ Value: uniTagMatch,
+ },
+ {
+ Path: vlansPath + "/match-criteria/second-tag/vlan-id",
+ Value: "any",
+ },
+ }...)
+ }
+
+ if subscriber.TagInfo.UsPonSTagPriority >= 0 {
+ result = append(result, YangItem{
+ Path: vlansPath + "/ingress-rewrite/push-outer-tag/pbit",
+ Value: strconv.Itoa(subscriber.TagInfo.UsPonSTagPriority),
+ })
+ }
+ if subscriber.TagInfo.DsPonSTagPriority >= 0 {
+ result = append(result, YangItem{
+ Path: vlansPath + "/ingress-rewrite/push-outer-tag/bbf-voltha-vlan-translation:dpbit",
+ Value: strconv.Itoa(subscriber.TagInfo.DsPonSTagPriority),
+ })
+ }
+ if subscriber.TagInfo.UsPonCTagPriority >= 0 {
+ result = append(result, YangItem{
+ Path: vlansPath + "/ingress-rewrite/push-second-tag/pbit",
+ Value: strconv.Itoa(subscriber.TagInfo.UsPonCTagPriority),
+ })
+ }
+ if subscriber.TagInfo.DsPonCTagPriority >= 0 {
+ result = append(result, YangItem{
+ Path: vlansPath + "/ingress-rewrite/push-second-tag/bbf-voltha-vlan-translation:dpbit",
+ Value: strconv.Itoa(subscriber.TagInfo.DsPonCTagPriority),
+ })
+ }
+
+ result = append(result, []YangItem{
+ {
+ Path: vlansPath + "/ingress-rewrite/push-outer-tag/vlan-id",
+ Value: sTag,
+ },
+ {
+ Path: vlansPath + "/ingress-rewrite/push-second-tag/vlan-id",
+ Value: cTag,
+ },
+ }...)
+ }
+
+ return result, nil
+}
+
+//translateBandwidthProfiles returns a slice of yang items that represent the bandwidth profiles used by programmed services
+func translateBandwidthProfiles(bwProfiles []clients.BandwidthProfile) ([]YangItem, error) {
+ result := []YangItem{}
+
+ //TODO: The best way to translate this information is still under discussion, but the code
+ // to retrieve it is ready. Since this is not fundamental at the moment, an empty slice is
+ // returned, and the correct translation can be added here at a later time.
+
+ return result, nil
+}
diff --git a/internal/core/translation_test.go b/internal/core/translation_test.go
index 41dc1dc..837acd9 100644
--- a/internal/core/translation_test.go
+++ b/internal/core/translation_test.go
@@ -21,6 +21,7 @@
"testing"
"time"
+ "github.com/opencord/voltha-northbound-bbf-adapter/internal/clients"
"github.com/opencord/voltha-protos/v5/go/openflow_13"
"github.com/opencord/voltha-protos/v5/go/voltha"
"github.com/stretchr/testify/assert"
@@ -43,7 +44,22 @@
func TestDevicePath(t *testing.T) {
path := getDevicePath(testDeviceId)
- assert.Equal(t, fmt.Sprintf("/bbf-device-aggregation:devices/device[name='%s']", testDeviceId), path)
+ assert.Equal(t, "/bbf-device-aggregation:devices/device[name='123145abcdef']", path)
+}
+
+func TestDeviceHardwarePath(t *testing.T) {
+ path := getDeviceHardwarePath(testDeviceId)
+ assert.Equal(t, "/bbf-device-aggregation:devices/device[name='123145abcdef']/data/ietf-hardware:hardware/component[name='123145abcdef']", path)
+}
+
+func TestServicePortPath(t *testing.T) {
+ path := GetServicePortPath("testService", "testPort")
+ assert.Equal(t, "/bbf-nt-service-profile:service-profiles/service-profile[name='testService']/ports/port[name='testPort']", path)
+}
+
+func TestVlansPath(t *testing.T) {
+ path := GetVlansPath("testProfile")
+ assert.Equal(t, "/bbf-l2-access-attributes:vlan-translation-profiles/vlan-translation-profile[name='testProfile']", path)
}
func TestTranslateDevice(t *testing.T) {
@@ -115,6 +131,8 @@
FirmwareVersion: "v0.0.3",
AdminState: voltha.AdminState_ENABLED,
OperStatus: voltha.OperStatus_ACTIVE,
+ ParentId: "abcdef1234",
+ ParentPortNo: 1,
}
items = translateDevice(onu)
@@ -154,6 +172,14 @@
Path: onuHwPath + "/state/oper-state",
Value: ietfOperStateEnabled,
},
+ {
+ Path: onuHwPath + "/parent",
+ Value: "abcdef1234",
+ },
+ {
+ Path: onuHwPath + "/parent-rel-pos",
+ Value: "1",
+ },
}
assert.NotEmpty(t, items, "No ONU items")
@@ -297,3 +323,192 @@
assert.Equal(t, e.Value, val, "Wrong value for "+e.Path)
}
}
+
+func TestTranslateServices(t *testing.T) {
+ subscribers := []clients.ProgrammedSubscriber{
+ {
+ Location: "of:00001/256",
+ TagInfo: clients.SadisUniTag{
+ UniTagMatch: 100,
+ PonCTag: 4096,
+ PonSTag: 102,
+ TechnologyProfileID: 64,
+ UpstreamBandwidthProfile: "BW1",
+ DownstreamBandwidthProfile: "BW2",
+ UpstreamOltBandwidthProfile: "OLTBW",
+ IsDhcpRequired: true,
+ IsIgmpRequired: false,
+ IsPPPoERequired: false,
+ ConfiguredMacAddress: "00:11:22:33:44:55",
+ EnableMacLearning: true,
+ UsPonCTagPriority: 1,
+ UsPonSTagPriority: 2,
+ DsPonCTagPriority: 3,
+ DsPonSTagPriority: -1,
+ ServiceName: "testService",
+ },
+ },
+ }
+
+ ports := []clients.OnosPort{
+ {
+ Element: "of:00001",
+ Port: "256",
+ Annotations: map[string]string{
+ "portName": "TESTPORT-1",
+ },
+ },
+ {
+ Element: "of:00001",
+ Port: "257",
+ Annotations: map[string]string{
+ "portName": "TESTPORT-2",
+ },
+ },
+ }
+
+ servicesItesm, err := translateServices(subscribers, ports)
+ assert.Nil(t, err, "Translation error")
+
+ assert.NotEmpty(t, servicesItesm, "No services items")
+
+ servicePortPath := ServiceProfilesPath + "/service-profile[name='TESTPORT-1-testService']/ports/port[name='TESTPORT-1']"
+
+ expected := []YangItem{
+ {
+ Path: servicePortPath + "/bbf-nt-service-profile-voltha:configured-mac-address",
+ Value: "00:11:22:33:44:55",
+ },
+ {
+ Path: servicePortPath + "/bbf-nt-service-profile-voltha:upstream-subscriber-bp-name",
+ Value: "BW1",
+ },
+ {
+ Path: servicePortPath + "/bbf-nt-service-profile-voltha:downstream-subscriber-bp-name",
+ Value: "BW2",
+ },
+ {
+ Path: servicePortPath + "/bbf-nt-service-profile-voltha:upstream-olt-bp-name",
+ Value: "OLTBW",
+ },
+ {
+ Path: servicePortPath + "/bbf-nt-service-profile-voltha:mac-learning-enabled",
+ Value: "true",
+ },
+ {
+ Path: servicePortPath + "/bbf-nt-service-profile-voltha:dhcp-required",
+ Value: "true",
+ },
+ {
+ Path: servicePortPath + "/bbf-nt-service-profile-voltha:igmp-required",
+ Value: "false",
+ },
+ {
+ Path: servicePortPath + "/bbf-nt-service-profile-voltha:pppoe-required",
+ Value: "false",
+ },
+ }
+
+ _, ok := getItemWithPath(servicesItesm, servicePortPath+"/port-vlans/port-vlan[name='TESTPORT-1-testService']")
+ assert.True(t, ok, "No vlans leafref in services")
+
+ _, ok = getItemWithPath(servicesItesm, servicePortPath+"/bbf-nt-service-profile-voltha:downstream-olt-bp-name")
+ assert.False(t, ok, "Downstream OLT bandwidth profile should not be present")
+
+ for _, e := range expected {
+ val, ok := getItemWithPath(servicesItesm, e.Path)
+ assert.True(t, ok, e.Path+" missing for services")
+ assert.Equal(t, e.Value, val, "Wrong value for "+e.Path)
+ }
+}
+
+func TestTranslateVlans(t *testing.T) {
+ subscribers := []clients.ProgrammedSubscriber{
+ {
+ Location: "of:00001/256",
+ TagInfo: clients.SadisUniTag{
+ UniTagMatch: 100,
+ PonCTag: 4096,
+ PonSTag: 102,
+ TechnologyProfileID: 64,
+ UpstreamBandwidthProfile: "BW1",
+ DownstreamBandwidthProfile: "BW2",
+ UpstreamOltBandwidthProfile: "OLTBW",
+ IsDhcpRequired: true,
+ IsIgmpRequired: false,
+ IsPPPoERequired: false,
+ ConfiguredMacAddress: "00:11:22:33:44:55",
+ EnableMacLearning: true,
+ UsPonCTagPriority: 1,
+ UsPonSTagPriority: 2,
+ DsPonCTagPriority: 3,
+ DsPonSTagPriority: -1,
+ ServiceName: "testService",
+ },
+ },
+ }
+
+ ports := []clients.OnosPort{
+ {
+ Element: "of:00001",
+ Port: "256",
+ Annotations: map[string]string{
+ "portName": "TESTPORT-1",
+ },
+ },
+ {
+ Element: "of:00001",
+ Port: "257",
+ Annotations: map[string]string{
+ "portName": "TESTPORT-2",
+ },
+ },
+ }
+
+ vlanItems, err := translateVlans(subscribers, ports)
+ assert.Nil(t, err, "Translation error")
+
+ assert.NotEmpty(t, vlanItems, "No vlans items")
+
+ vlanPath := VlansPath + "/vlan-translation-profile[name='TESTPORT-1-testService']"
+
+ expected := []YangItem{
+ {
+ Path: vlanPath + "/match-criteria/outer-tag/vlan-id",
+ Value: "100",
+ },
+ {
+ Path: vlanPath + "/ingress-rewrite/push-second-tag/vlan-id",
+ Value: "any",
+ },
+ {
+ Path: vlanPath + "/ingress-rewrite/push-outer-tag/vlan-id",
+ Value: "102",
+ },
+ {
+ Path: vlanPath + "/match-criteria/second-tag/vlan-id",
+ Value: "any",
+ },
+ {
+ Path: vlanPath + "/ingress-rewrite/push-second-tag/pbit",
+ Value: "1",
+ },
+ {
+ Path: vlanPath + "/ingress-rewrite/push-outer-tag/pbit",
+ Value: "2",
+ },
+ {
+ Path: vlanPath + "/ingress-rewrite/push-second-tag/bbf-voltha-vlan-translation:dpbit",
+ Value: "3",
+ },
+ }
+
+ _, ok := getItemWithPath(vlanItems, vlanPath+"/ingress-rewrite/push-outer-tag/bbf-voltha-vlan-translation:dpbit")
+ assert.False(t, ok, "Pbit value should not be present")
+
+ for _, e := range expected {
+ val, ok := getItemWithPath(vlanItems, e.Path)
+ assert.True(t, ok, e.Path+" missing for vlans")
+ assert.Equal(t, e.Value, val, "Wrong value for "+e.Path)
+ }
+}
diff --git a/internal/sysrepo/callbacks.go b/internal/sysrepo/callbacks.go
index 1256568..27c8362 100644
--- a/internal/sysrepo/callbacks.go
+++ b/internal/sysrepo/callbacks.go
@@ -21,6 +21,8 @@
import "C"
import (
"context"
+ "fmt"
+ "strconv"
"github.com/opencord/voltha-lib-go/v7/pkg/log"
"github.com/opencord/voltha-northbound-bbf-adapter/internal/core"
@@ -65,3 +67,331 @@
return C.SR_ERR_OK
}
+
+//export get_services_cb
+func get_services_cb(session *C.sr_session_ctx_t, parent **C.lyd_node) C.sr_error_t {
+ //This function is a callback for the retrieval of devices from sysrepo
+ //The "export" comment instructs CGO to create a C function for it
+
+ ctx := context.Background()
+ logger.Debug(ctx, "processing-get-services-request")
+
+ if session == nil {
+ logger.Error(ctx, "sysrepo-get-services-null-session")
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ if parent == nil {
+ logger.Error(ctx, "sysrepo-get-services-null-parent-node")
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ if core.AdapterInstance == nil {
+ logger.Error(ctx, "sysrepo-get-services-nil-translator")
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ services, err := core.AdapterInstance.GetServices(ctx)
+ if err != nil {
+ logger.Errorw(ctx, "sysrepo-get-services-translation-error", log.Fields{"err": err})
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ err = updateYangTree(ctx, session, parent, services)
+ if err != nil {
+ logger.Errorw(ctx, "sysrepo-get-services-update-error", log.Fields{"err": err})
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ logger.Info(ctx, "services-information-request-served")
+
+ return C.SR_ERR_OK
+}
+
+//export get_vlans_cb
+func get_vlans_cb(session *C.sr_session_ctx_t, parent **C.lyd_node) C.sr_error_t {
+ //This function is a callback for the retrieval of vlans from sysrepo
+ //The "export" comment instructs CGO to create a C function for it
+
+ ctx := context.Background()
+ logger.Debug(ctx, "processing-get-vlans-request")
+
+ if session == nil {
+ logger.Error(ctx, "sysrepo-get-vlans-null-session")
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ if parent == nil {
+ logger.Error(ctx, "sysrepo-get-vlans-null-parent-node")
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ if core.AdapterInstance == nil {
+ logger.Error(ctx, "sysrepo-get-vlans-nil-translator")
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ vlans, err := core.AdapterInstance.GetVlans(ctx)
+ if err != nil {
+ logger.Errorw(ctx, "sysrepo-get-vlans-translation-error", log.Fields{"err": err})
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ err = updateYangTree(ctx, session, parent, vlans)
+ if err != nil {
+ logger.Errorw(ctx, "sysrepo-get-vlans-update-error", log.Fields{"err": err})
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ logger.Info(ctx, "vlans-information-request-served")
+
+ return C.SR_ERR_OK
+}
+
+//export get_bandwidth_profiles_cb
+func get_bandwidth_profiles_cb(session *C.sr_session_ctx_t, parent **C.lyd_node) C.sr_error_t {
+ //This function is a callback for the retrieval of bandwidth profiles from sysrepo
+ //The "export" comment instructs CGO to create a C function for it
+
+ ctx := context.Background()
+ logger.Debug(ctx, "processing-get-bandwidth-profiles-request")
+
+ if session == nil {
+ logger.Error(ctx, "sysrepo-get-bandwidth-profiles-null-session")
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ if parent == nil {
+ logger.Error(ctx, "sysrepo-get-bandwidth-profiles-null-parent-node")
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ if core.AdapterInstance == nil {
+ logger.Error(ctx, "sysrepo-get-bandwidth-profiles-nil-translator")
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ bwProfiles, err := core.AdapterInstance.GetBandwidthProfiles(ctx)
+ if err != nil {
+ logger.Errorw(ctx, "sysrepo-get-bandwidth-profiles-translation-error", log.Fields{"err": err})
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ err = updateYangTree(ctx, session, parent, bwProfiles)
+ if err != nil {
+ logger.Errorw(ctx, "sysrepo-get-bandwidth-profiles-update-error", log.Fields{"err": err})
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ logger.Info(ctx, "bandwidth-profiles-information-request-served")
+
+ return C.SR_ERR_OK
+}
+
+//export edit_service_profiles_cb
+func edit_service_profiles_cb(editSession *C.sr_session_ctx_t, runningSession *C.sr_session_ctx_t, event C.sr_event_t) C.sr_error_t {
+ //This function is a callback for changes on service profiles
+ //The "export" comment instructs CGO to create a C function for it
+
+ if event != C.SR_EV_CHANGE {
+ return C.SR_ERR_OK
+ }
+
+ ctx := context.Background()
+ logger.Debug(ctx, "processing-service-profile-changes")
+
+ serviceNamesChanges, err := getChangesList(ctx, editSession, core.ServiceProfilesPath+"/service-profile/name")
+ if err != nil {
+ logger.Errorw(ctx, "cannot-get-service-profile-names-changes", log.Fields{"err": err})
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ for _, n := range serviceNamesChanges {
+ switch n.Operation {
+ case C.SR_OP_CREATED:
+ if errCode := edit_service_create(ctx, editSession, runningSession, n.Value); errCode != C.SR_ERR_OK {
+ return errCode
+ }
+ case C.SR_OP_DELETED:
+ if errCode := edit_service_delete(ctx, editSession, runningSession, n.Value); errCode != C.SR_ERR_OK {
+ return errCode
+ }
+ default:
+ return C.SR_ERR_UNSUPPORTED
+ }
+ }
+
+ return C.SR_ERR_OK
+}
+
+func edit_service_create(ctx context.Context, editSession *C.sr_session_ctx_t, runningSession *C.sr_session_ctx_t, serviceName string) C.sr_error_t {
+ portName, err := getSingleChangeValue(ctx, editSession, fmt.Sprintf("%s/service-profile[name='%s']/ports/port/name", core.ServiceProfilesPath, serviceName))
+ if err != nil {
+ logger.Errorw(ctx, "cannot-get-service-profile-port-changes", log.Fields{"err": err, "service": serviceName})
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ servicePortPath := core.GetServicePortPath(serviceName, portName)
+
+ tpId, err := getSingleChangeValue(ctx, editSession, servicePortPath+"/bbf-nt-service-profile-voltha:technology-profile-id")
+ if err != nil {
+ logger.Errorw(ctx, "cannot-get-service-profile-tp-id-change", log.Fields{"err": err, "service": serviceName})
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ vlanName, err := getSingleChangeValue(ctx, editSession, servicePortPath+"/port-vlans/port-vlan/name")
+ if err != nil {
+ logger.Errorw(ctx, "cannot-get-service-profile-vlan-change", log.Fields{"err": err, "service": serviceName})
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ vlansPath := core.GetVlansPath(vlanName)
+
+ sTag, err := getSingleChangeValue(ctx, editSession, vlansPath+"/ingress-rewrite/push-outer-tag/vlan-id")
+ if err != nil {
+ logger.Errorw(ctx, "cannot-get-service-profile-stag-changes", log.Fields{"err": err, "service": serviceName})
+ return C.SR_ERR_OPERATION_FAILED
+ }
+ if sTag == core.YangVlanIdAny {
+ sTag = strconv.Itoa(core.VolthaVlanIdAny)
+ }
+
+ cTag, err := getSingleChangeValue(ctx, editSession, vlansPath+"/ingress-rewrite/push-second-tag/vlan-id")
+ if err != nil {
+ logger.Errorw(ctx, "cannot-get-service-profile-stag-changes", log.Fields{"err": err, "service": serviceName})
+ return C.SR_ERR_OPERATION_FAILED
+ }
+ if cTag == core.YangVlanIdAny {
+ cTag = strconv.Itoa(core.VolthaVlanIdAny)
+ }
+
+ logger.Infow(ctx, "new-service-profile-information", log.Fields{
+ "service": serviceName,
+ "port": portName,
+ "vlanName": vlanName,
+ "tpId": tpId,
+ "sTag": sTag,
+ "cTag": cTag,
+ })
+
+ if core.AdapterInstance == nil {
+ logger.Error(ctx, "sysrepo-service-changes-nil-translator")
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ if err := core.AdapterInstance.ProvisionService(portName, sTag, cTag, tpId); err != nil {
+ logger.Errorw(ctx, "service-provisioning-error", log.Fields{
+ "service": serviceName,
+ "err": err,
+ })
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ logger.Infow(ctx, "service-profile-creation-request-served", log.Fields{
+ "service": serviceName,
+ })
+
+ return C.SR_ERR_OK
+}
+
+func edit_service_delete(ctx context.Context, editSession *C.sr_session_ctx_t, runningSession *C.sr_session_ctx_t, serviceName string) C.sr_error_t {
+ portName, err := getDatastoreLeafValue(ctx, runningSession, fmt.Sprintf("%s/service-profile[name='%s']/ports/port/name", core.ServiceProfilesPath, serviceName))
+ if err != nil {
+ logger.Errorw(ctx, "cannot-get-service-profile-port-leaf", log.Fields{"err": err, "service": serviceName})
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ servicePortPath := core.GetServicePortPath(serviceName, portName)
+
+ tpId, err := getDatastoreLeafValue(ctx, runningSession, servicePortPath+"/bbf-nt-service-profile-voltha:technology-profile-id")
+ if err != nil {
+ logger.Errorw(ctx, "cannot-get-service-profile-tp-id-leaf", log.Fields{"err": err, "service": serviceName})
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ vlanName, err := getDatastoreLeafValue(ctx, runningSession, servicePortPath+"/port-vlans/port-vlan/name")
+ if err != nil {
+ logger.Errorw(ctx, "cannot-get-service-profile-vlan-leaf", log.Fields{"err": err, "service": serviceName})
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ vlansPath := core.GetVlansPath(vlanName)
+
+ sTag, err := getDatastoreLeafValue(ctx, runningSession, vlansPath+"/ingress-rewrite/push-outer-tag/vlan-id")
+ if err != nil {
+ logger.Errorw(ctx, "cannot-get-service-profile-stag-leaf", log.Fields{"err": err, "service": serviceName})
+ return C.SR_ERR_OPERATION_FAILED
+ }
+ if sTag == core.YangVlanIdAny {
+ sTag = strconv.Itoa(core.VolthaVlanIdAny)
+ }
+
+ cTag, err := getDatastoreLeafValue(ctx, runningSession, vlansPath+"/ingress-rewrite/push-second-tag/vlan-id")
+ if err != nil {
+ logger.Errorw(ctx, "cannot-get-service-profile-stag-leaf", log.Fields{"err": err, "service": serviceName})
+ return C.SR_ERR_OPERATION_FAILED
+ }
+ if cTag == core.YangVlanIdAny {
+ cTag = strconv.Itoa(core.VolthaVlanIdAny)
+ }
+
+ logger.Infow(ctx, "service-profile-deletion-information", log.Fields{
+ "service": serviceName,
+ "port": portName,
+ "vlanName": vlanName,
+ "tpId": tpId,
+ "sTag": sTag,
+ "cTag": cTag,
+ })
+
+ if err := core.AdapterInstance.RemoveService(portName, sTag, cTag, tpId); err != nil {
+ logger.Errorw(ctx, "service-removal-error", log.Fields{
+ "service": serviceName,
+ "err": err,
+ })
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ logger.Infow(ctx, "service-profile-removal-request-served", log.Fields{
+ "service": serviceName,
+ })
+
+ return C.SR_ERR_OK
+}
+
+//export edit_vlans_cb
+func edit_vlans_cb(editSession *C.sr_session_ctx_t, event C.sr_event_t) C.sr_error_t {
+ //This function is a callback for changes on VLANs
+ //The "export" comment instructs CGO to create a C function for it
+
+ if event != C.SR_EV_CHANGE {
+ return C.SR_ERR_OK
+ }
+
+ ctx := context.Background()
+ logger.Debug(ctx, "processing-vlans-changes")
+
+ vlanChanges, err := getChangesList(ctx, editSession, core.VlansPath+"//.")
+ if err != nil {
+ logger.Errorw(ctx, "cannot-get-vlans-changes", log.Fields{"err": err})
+ return C.SR_ERR_OPERATION_FAILED
+ }
+
+ for _, n := range vlanChanges {
+ //VLANs must be defined through creation (for service provisioning)
+ //or deletion (for service removal). Changes to the VLAN values
+ //are not supported, because VOLTHA does not support dynamic changes
+ //to the service.
+ switch n.Operation {
+ case C.SR_OP_CREATED:
+ case C.SR_OP_DELETED:
+ //Everything will be handled in the services callback
+ //Just approve the change here
+ return C.SR_ERR_OK
+ default:
+ return C.SR_ERR_UNSUPPORTED
+ }
+ }
+
+ return C.SR_ERR_OK
+}
diff --git a/internal/sysrepo/plugin.c b/internal/sysrepo/plugin.c
index f9f53c6..82e9e3e 100644
--- a/internal/sysrepo/plugin.c
+++ b/internal/sysrepo/plugin.c
@@ -42,6 +42,11 @@
// Exported by callbacks.go
sr_error_t get_devices_cb(sr_session_ctx_t *session, lyd_node **parent);
+sr_error_t get_services_cb(sr_session_ctx_t *session, lyd_node **parent);
+sr_error_t get_vlans_cb(sr_session_ctx_t *session, lyd_node **parent);
+sr_error_t get_bandwidth_profiles_cb(sr_session_ctx_t *session, lyd_node **parent);
+sr_error_t edit_service_profiles_cb(sr_session_ctx_t *session, sr_session_ctx_t *runningSession, sr_event_t event);
+sr_error_t edit_vlans_cb(sr_session_ctx_t *session, sr_event_t event);
//The wrapper functions are needed because CGO cannot express some keywords
//such as "const", and thus it can't match sysrepo's callback signature
@@ -57,4 +62,68 @@
void *private_data)
{
return get_devices_cb(session, parent);
+}
+
+int get_services_cb_wrapper(
+ sr_session_ctx_t *session,
+ uint32_t subscription_id,
+ const char *module_name,
+ const char *path,
+ const char *request_xpath,
+ uint32_t request_id,
+ struct lyd_node **parent,
+ void *private_data)
+{
+ return get_services_cb(session, parent);
+}
+
+int get_vlans_cb_wrapper(
+ sr_session_ctx_t *session,
+ uint32_t subscription_id,
+ const char *module_name,
+ const char *path,
+ const char *request_xpath,
+ uint32_t request_id,
+ struct lyd_node **parent,
+ void *private_data)
+{
+ return get_vlans_cb(session, parent);
+}
+
+int get_bandwidth_profiles_cb_wrapper(
+ sr_session_ctx_t *session,
+ uint32_t subscription_id,
+ const char *module_name,
+ const char *path,
+ const char *request_xpath,
+ uint32_t request_id,
+ struct lyd_node **parent,
+ void *private_data)
+{
+ return get_bandwidth_profiles_cb(session, parent);
+}
+
+int edit_service_profiles_cb_wrapper(
+ sr_session_ctx_t *session,
+ uint32_t subscription_id,
+ const char *module_name,
+ const char *path,
+ sr_event_t event,
+ uint32_t request_id,
+ void *private_data)
+{
+ sr_session_ctx_t* runningSession = (sr_session_ctx_t*)private_data;
+ return edit_service_profiles_cb(session, runningSession, event);
+}
+
+int edit_vlans_cb_wrapper(
+ sr_session_ctx_t *session,
+ uint32_t subscription_id,
+ const char *module_name,
+ const char *path,
+ sr_event_t event,
+ uint32_t request_id,
+ void *private_data)
+{
+ return edit_vlans_cb(session, event);
}
\ No newline at end of file
diff --git a/internal/sysrepo/sysrepo.go b/internal/sysrepo/sysrepo.go
index 973dbb9..a2b19af 100644
--- a/internal/sysrepo/sysrepo.go
+++ b/internal/sysrepo/sysrepo.go
@@ -133,6 +133,22 @@
defer freeCString(devicesModule)
defer freeCString(devicesPath)
+ servicesModule := C.CString(core.ServiceProfileModule)
+ servicesPath := C.CString(core.ServiceProfilesPath + "/*")
+ defer freeCString(servicesModule)
+ defer freeCString(servicesPath)
+
+ vlansModule := C.CString(core.VlansModule)
+ vlansPath := C.CString(core.VlansPath + "/*")
+ defer freeCString(vlansModule)
+ defer freeCString(vlansPath)
+
+ bwProfilesModule := C.CString(core.BandwidthProfileModule)
+ bwProfilesPath := C.CString(core.BandwidthProfilesPath + "/*")
+ defer freeCString(bwProfilesModule)
+ defer freeCString(bwProfilesPath)
+
+ //Get devices
errCode := C.sr_oper_get_subscribe(
plugin.operationalSession,
devicesModule,
@@ -143,7 +159,90 @@
&plugin.subscription,
)
if errCode != C.SR_ERR_OK {
- err := fmt.Errorf("sysrepo-failed-subscription-to-get-events")
+ err := fmt.Errorf("sysrepo-failed-subscription-to-get-devices")
+ logger.Errorw(ctx, err.Error(), log.Fields{"errCode": errCode, "errMsg": srErrorMsg(errCode)})
+ return nil, err
+ }
+
+ //Get services
+ errCode = C.sr_oper_get_subscribe(
+ plugin.operationalSession,
+ servicesModule,
+ servicesPath,
+ C.function(C.get_services_cb_wrapper),
+ C.NULL,
+ C.SR_SUBSCR_DEFAULT,
+ &plugin.subscription,
+ )
+ if errCode != C.SR_ERR_OK {
+ err := fmt.Errorf("sysrepo-failed-subscription-to-get-services")
+ logger.Errorw(ctx, err.Error(), log.Fields{"errCode": errCode, "errMsg": srErrorMsg(errCode)})
+ return nil, err
+ }
+
+ //Get vlans
+ errCode = C.sr_oper_get_subscribe(
+ plugin.operationalSession,
+ vlansModule,
+ vlansPath,
+ C.function(C.get_vlans_cb_wrapper),
+ C.NULL,
+ C.SR_SUBSCR_DEFAULT,
+ &plugin.subscription,
+ )
+ if errCode != C.SR_ERR_OK {
+ err := fmt.Errorf("sysrepo-failed-subscription-to-get-services")
+ logger.Errorw(ctx, err.Error(), log.Fields{"errCode": errCode, "errMsg": srErrorMsg(errCode)})
+ return nil, err
+ }
+
+ //Get bandwidth profiles
+ errCode = C.sr_oper_get_subscribe(
+ plugin.operationalSession,
+ bwProfilesModule,
+ bwProfilesPath,
+ C.function(C.get_bandwidth_profiles_cb_wrapper),
+ C.NULL,
+ C.SR_SUBSCR_DEFAULT,
+ &plugin.subscription,
+ )
+ if errCode != C.SR_ERR_OK {
+ err := fmt.Errorf("sysrepo-failed-subscription-to-get-services")
+ logger.Errorw(ctx, err.Error(), log.Fields{"errCode": errCode, "errMsg": srErrorMsg(errCode)})
+ return nil, err
+ }
+
+ //Subscribe with a callback to changes of configuration in the services modules
+ //Changes to services
+ errCode = C.sr_module_change_subscribe(
+ plugin.runningSession,
+ servicesModule,
+ servicesPath,
+ C.function(C.edit_service_profiles_cb_wrapper),
+ unsafe.Pointer(plugin.runningSession), //Pass session for running datastore to get current data
+ 0,
+ C.SR_SUBSCR_DEFAULT,
+ &plugin.subscription,
+ )
+ if errCode != C.SR_ERR_OK {
+ err := fmt.Errorf("sysrepo-failed-subscription-to-change-services")
+ logger.Errorw(ctx, err.Error(), log.Fields{"errCode": errCode, "errMsg": srErrorMsg(errCode)})
+ return nil, err
+ }
+
+ //Changes to VLANs
+ errCode = C.sr_module_change_subscribe(
+ plugin.runningSession,
+ vlansModule,
+ vlansPath,
+ C.function(C.edit_vlans_cb_wrapper),
+ C.NULL,
+ 0,
+ C.SR_SUBSCR_DEFAULT,
+ &plugin.subscription,
+ )
+ if errCode != C.SR_ERR_OK {
+ err := fmt.Errorf("sysrepo-failed-subscription-to-change-vlans")
logger.Errorw(ctx, err.Error(), log.Fields{"errCode": errCode, "errMsg": srErrorMsg(errCode)})
return nil, err
}
diff --git a/internal/sysrepo/utils.go b/internal/sysrepo/utils.go
index d564dc7..4db9a53 100644
--- a/internal/sysrepo/utils.go
+++ b/internal/sysrepo/utils.go
@@ -135,7 +135,7 @@
path := C.CString(item.Path)
value := C.CString(item.Value)
- lyErr := C.lyd_new_path(*parent, ly_ctx, path, value, 0, nil)
+ lyErr := C.lyd_new_path(*parent, ly_ctx, path, value, C.LYD_NEW_PATH_UPDATE, nil)
if lyErr != C.LY_SUCCESS {
freeCString(path)
freeCString(value)
@@ -171,3 +171,110 @@
return nil
}
+
+type YangChange struct {
+ Path string
+ Value string
+ Operation C.sr_change_oper_t
+ /* Operation values:
+ SR_OP_CREATED
+ SR_OP_MODIFIED
+ SR_OP_DELETED
+ SR_OP_MOVED
+ */
+}
+
+//Provides a list of the changes occured under a specific path
+//Should only be used on the session from an sr_module_change_subscribe callback
+func getChangesList(ctx context.Context, editSession *C.sr_session_ctx_t, path string) ([]YangChange, error) {
+ result := []YangChange{}
+
+ changesPath := C.CString(path)
+ defer freeCString(changesPath)
+
+ var changesIterator *C.sr_change_iter_t
+ errCode := C.sr_get_changes_iter(editSession, changesPath, &changesIterator)
+ if errCode != C.SR_ERR_OK {
+ return nil, fmt.Errorf("cannot-get-iterator: %d %s", errCode, srErrorMsg(errCode))
+ }
+ defer C.sr_free_change_iter(changesIterator)
+
+ //Iterate over the changes
+ var operation C.sr_change_oper_t
+ var prevValue, prevList *C.char
+ var prevDefault C.int
+
+ var node *C.lyd_node
+ defer C.lyd_free_all(node)
+
+ errCode = C.sr_get_change_tree_next(editSession, changesIterator, &operation, &node, &prevValue, &prevList, &prevDefault)
+ for errCode != C.SR_ERR_NOT_FOUND {
+ if errCode != C.SR_ERR_OK {
+ return nil, fmt.Errorf("next-change-error: %d %s", errCode, srErrorMsg(errCode))
+ }
+
+ currentChange := YangChange{}
+ currentChange.Operation = operation
+
+ nodePath := C.lyd_path(node, C.LYD_PATH_STD, nil, 0)
+ if nodePath == nil {
+ return nil, fmt.Errorf("cannot-get-change-path")
+ }
+ currentChange.Path = C.GoString(nodePath)
+ freeCString(nodePath)
+
+ nodeValue := C.lyd_get_value(node)
+ if nodeValue != nil {
+ currentChange.Value = C.GoString(nodeValue)
+ result = append(result, currentChange)
+ }
+
+ errCode = C.sr_get_change_tree_next(editSession, changesIterator, &operation, &node, &prevValue, &prevList, &prevDefault)
+ }
+
+ return result, nil
+}
+
+//Verify that only one change occured under the specified path, and return its value
+//Should only be used on the session from an sr_module_change_subscribe callback
+func getSingleChangeValue(ctx context.Context, session *C.sr_session_ctx_t, path string) (string, error) {
+ changesList, err := getChangesList(ctx, session, path)
+ if err != nil {
+ return "", err
+ }
+
+ if len(changesList) != 1 {
+ logger.Errorw(ctx, "unexpected-number-of-yang-changes", log.Fields{
+ "changes": changesList,
+ })
+ return "", fmt.Errorf("unexpected-number-of-yang-changes")
+ }
+
+ return changesList[0].Value, nil
+}
+
+//Get the value of a leaf from the datastore
+//The target datastore is the one on which the session has been created
+func getDatastoreLeafValue(ctx context.Context, session *C.sr_session_ctx_t, path string) (string, error) {
+ cPath := C.CString(path)
+ defer freeCString(cPath)
+
+ var data *C.sr_data_t
+ defer C.sr_release_data(data)
+
+ errCode := C.sr_get_subtree(session, cPath, 0, &data)
+ if errCode != C.SR_ERR_OK {
+ return "", fmt.Errorf("cannot-get-data-from-datastore: %d %s", errCode, srErrorMsg(errCode))
+ }
+
+ if data == nil {
+ return "", fmt.Errorf("no-data-found-for-path: %s", path)
+ }
+
+ nodeValue := C.lyd_get_value(data.tree)
+ if nodeValue == nil {
+ return "", fmt.Errorf("cannot-get-value-from-data: %s", path)
+ }
+
+ return C.GoString(nodeValue), nil
+}