[dpdk-dev] [PATCH v2 5/5] doc: add flow distributor guide

Pablo de Lara pablo.de.lara.guarch at intel.com
Sat Jan 7 02:06:06 CET 2017


Signed-off-by: Sameh Gobriel <sameh.gobriel at intel.com>
Signed-off-by: Pablo de Lara <pablo.de.lara.guarch at intel.com>
---
 MAINTAINERS                                       |   1 +
 doc/guides/sample_app_ug/flow_distributor.rst     | 492 ++++++++++++++++++++++
 doc/guides/sample_app_ug/img/flow_distributor.svg | 417 ++++++++++++++++++
 doc/guides/sample_app_ug/index.rst                |   1 +
 4 files changed, 911 insertions(+)
 create mode 100644 doc/guides/sample_app_ug/flow_distributor.rst
 create mode 100644 doc/guides/sample_app_ug/img/flow_distributor.svg

diff --git a/MAINTAINERS b/MAINTAINERS
index 66e9466..0d3b247 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -535,6 +535,7 @@ F: lib/librte_efd/
 F: doc/guides/prog_guide/efd_lib.rst
 F: app/test/test_efd*
 F: examples/flow_distributor/
+F: doc/guides/sample_app_ug/flow_distributor.rst
 
 Hashes
 M: Bruce Richardson <bruce.richardson at intel.com>
diff --git a/doc/guides/sample_app_ug/flow_distributor.rst b/doc/guides/sample_app_ug/flow_distributor.rst
new file mode 100644
index 0000000..39820f0
--- /dev/null
+++ b/doc/guides/sample_app_ug/flow_distributor.rst
@@ -0,0 +1,492 @@
+..  BSD LICENSE
+    Copyright(c) 2010-2016 Intel Corporation. All rights reserved.
+    All rights reserved.
+
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions
+    are met:
+
+    * Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+    * 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.
+    * Neither the name of Intel Corporation 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
+    OWNER 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.
+
+Flow Distributor Sample Application
+===================================
+
+This sample application demonstrates the use of EFD library as a flow-level
+load balancer, for more information about the EFD Library please refer to the
+DPDK programmer's guide.
+
+This sample application is a variant of the :ref:`client-server sample application <multi_process_app>`
+where a specific target node is specified for every and each flow
+(not in a round-robin fashion as the original load balancing sample application).
+
+Overview
+--------
+
+The architecture of the EFD flow-based load balancer sample application is
+presented in the following figure.
+
+.. _figure_efd_sample_app_overview:
+
+.. figure:: img/flow_distributor.*
+
+   Using EFD as a Flow-Level Load Balancer
+
+As shown in figure, the sample application consists of a front end node
+(distributor) using the EFD library to create a load-balancing table for flows,
+for each flow a target backend worker node is specified. The EFD table does not
+store the flow key (unlike a regular hash table), and hence, it can
+individually load-balance millions of flows (number of targets * maximum number
+of flows fit in a flow table per target) while still fitting in CPU cache.
+
+It should be noted that although they are referred to as nodes, the frontend
+distributor and worker nodes are processes running on the same platform.
+
+Front-end Distributor
+~~~~~~~~~~~~~~~~~~~~~
+
+Upon initializing, the frontend distributor node (process) creates a flow
+distributor table (based on the EFD library) which is populated with flow
+information and its intended target node.
+
+The sample application assigns a specific target node_id (process) for each of
+the IP destination addresses as follows:
+
+.. code-block:: c
+
+    node_id = i % num_nodes; /* Target node id is generated */
+    ip_dst = rte_cpu_to_be_32(i); /* Specific ip destination address is
+                                     assigned to this target node */
+
+then the pair of <key,target> is inserted into the flow distribution table.
+
+The main loop of the the distributor node receives a burst of packets, then for
+each packet a flow key (IP destination address) is extracted. The flow
+distributor table is looked up and the target node id is returned.  Packets are
+then enqueued to the specified target node id.
+
+It should be noted that flow distributor table is not a membership test table.
+I.e. if the key has already been inserted the target node id will be correct,
+but for new keys the flow distributor table will return a value (which can be
+valid).
+
+Backend Worker Nodes
+~~~~~~~~~~~~~~~~~~~~
+
+Upon initializing, the worker node (process) creates a flow table (a regular
+hash table that stores the key default size 1M flows) which is populated with
+only the flow information that are serviced at this node. This flow key is
+essential to point out new keys that have not been inserted before.
+
+The worker node's main loop is simply receiving packets then doing a hash table
+lookup. If a match occurs then statistics are updated for flows serviced by
+this node. If no match is found in the local hash table then this indicates
+that this is a new flows which is dropped.
+
+
+Compiling the Application
+-------------------------
+
+The sequence of steps used to build the application is:
+
+#.  Export the required environment variables:
+
+    .. code-block:: console
+
+        export RTE_SDK=/path/to/rte_sdk
+        export RTE_TARGET=x86_64-native-linuxapp-gcc
+
+#.  Build the application executable file:
+
+    .. code-block:: console
+
+        cd ${RTE_SDK}/examples/flow_distributor/
+        make
+
+    For more details on how to build the DPDK libraries and sample
+    applications,
+    please refer to the *DPDK Getting Started Guide.*
+
+
+Running the Application
+-----------------------
+
+The application has two binaries to be run: the front-end distributor
+and the back-end node.
+
+The frontend distributor (distributor) has the following command line options::
+
+    ./distributor [EAL options] -- -p PORTMASK -n NUM_NODES -f NUM_FLOWS
+
+Where,
+
+* ``-p PORTMASK:`` Hexadecimal bitmask of ports to configure
+* ``-n NUM_NODES:`` Number of back-end nodes that will be used
+* ``-f NUM_FLOWS:`` Number of flows to be added in the EFD table (1 million, by default)
+
+The back-end node (node) has the following command line options::
+
+    ./node [EAL options] -- -n NODE_ID
+
+Where,
+
+* ``-n NODE_ID:`` Node ID, which cannot be equal or higher than NUM_MODES
+
+
+First, the distributor app must be run, with the number of nodes that will be run.
+Once it has been started, the node instances can be run, with different NODE_ID.
+These instances have to be run as secondary processes, with `--proc-type=secondary`
+in the EAL options, which will attach to the primary process memory, and therefore,
+they can access the queues created by the primary process to distribute packets.
+
+To successfully run the application, the command line used to start the
+application has to be in sync with the traffic flows configured on the traffic
+generator side.
+
+For examples of application command lines and traffic generator flows, please
+refer to the DPDK Test Report. For more details on how to set up and run the
+sample applications provided with DPDK package, please refer to the
+:ref:`DPDK Getting Started Guide for Linux <linux_gsg>` and
+:ref:`DPDK Getting Started Guide for FreeBSD <freebsd_gsg>`.
+
+
+Explanation
+-----------
+
+As described in previous sections, there are two processes in this example.
+
+The first process, the front-end distributor, creates and populates the EFD table,
+which is used to distribute packets to nodes, which the number of flows
+specified in the command line (1 million, by default).
+
+
+.. code-block:: c
+
+    static void
+    create_flow_distributor_table(void)
+    {
+        uint8_t socket_id = rte_socket_id();
+
+        /* create table */
+        efd_table = rte_efd_create("flow table", num_flows * 2, sizeof(uint32_t),
+                        1 << socket_id, socket_id);
+
+        if (efd_table == NULL)
+            rte_exit(EXIT_FAILURE, "Problem creating the flow table\n");
+    }
+
+    static void
+    populate_flow_distributor_table(void)
+    {
+        unsigned int i;
+        int32_t ret;
+        uint32_t ip_dst;
+        uint8_t socket_id = rte_socket_id();
+        uint64_t node_id;
+
+        /* Add flows in table */
+        for (i = 0; i < num_flows; i++) {
+            node_id = i % num_nodes;
+
+            ip_dst = rte_cpu_to_be_32(i);
+            ret = rte_efd_update(efd_table, socket_id,
+                            (void *)&ip_dst, (efd_value_t)node_id);
+            if (ret < 0)
+                rte_exit(EXIT_FAILURE, "Unable to add entry %u in "
+                                    "flow distributor table\n", i);
+        }
+
+        printf("EFD table: Adding 0x%x keys\n", num_flows);
+    }
+
+After initialization, packets are received from the enabled ports, and the IPv4
+address from the packets is used as a key to look up in the EFD table,
+which tells the node where the packet has to be distributed.
+
+.. code-block:: c
+
+    static void
+    process_packets(uint32_t port_num __rte_unused, struct rte_mbuf *pkts[],
+            uint16_t rx_count, unsigned int socket_id)
+    {
+        uint16_t i;
+        uint8_t node;
+        efd_value_t data[EFD_BURST_MAX];
+        const void *key_ptrs[EFD_BURST_MAX];
+
+        struct ipv4_hdr *ipv4_hdr;
+        uint32_t ipv4_dst_ip[EFD_BURST_MAX];
+
+        for (i = 0; i < rx_count; i++) {
+            /* Handle IPv4 header.*/
+            ipv4_hdr = rte_pktmbuf_mtod_offset(pkts[i], struct ipv4_hdr *,
+                    sizeof(struct ether_hdr));
+            ipv4_dst_ip[i] = ipv4_hdr->dst_addr;
+            key_ptrs[i] = (void *)&ipv4_dst_ip[i];
+        }
+
+        rte_efd_lookup_bulk(efd_table, socket_id, rx_count,
+                    (const void **) key_ptrs, data);
+        for (i = 0; i < rx_count; i++) {
+            node = (uint8_t) ((uintptr_t)data[i]);
+
+            if (node >= num_nodes) {
+                /*
+                 * Node is out of range, which means that
+                 * flow has not been inserted
+                 */
+                flow_dist_stats.drop++;
+                rte_pktmbuf_free(pkts[i]);
+            } else {
+                flow_dist_stats.distributed++;
+                enqueue_rx_packet(node, pkts[i]);
+            }
+        }
+
+        for (i = 0; i < num_nodes; i++)
+            flush_rx_queue(i);
+    }
+
+The burst of packets received is enqueued in temporary buffers (per node),
+and enqueued in the shared ring between the distributor and the node.
+After this, a new burst of packets is received and this process is
+repeated infinitely.
+
+.. code-block:: c
+
+    static void
+    flush_rx_queue(uint16_t node)
+    {
+        uint16_t j;
+        struct node *cl;
+
+        if (cl_rx_buf[node].count == 0)
+            return;
+
+        cl = &nodes[node];
+        if (rte_ring_enqueue_bulk(cl->rx_q, (void **)cl_rx_buf[node].buffer,
+                cl_rx_buf[node].count) != 0){
+            for (j = 0; j < cl_rx_buf[node].count; j++)
+                rte_pktmbuf_free(cl_rx_buf[node].buffer[j]);
+            cl->stats.rx_drop += cl_rx_buf[node].count;
+        } else
+            cl->stats.rx += cl_rx_buf[node].count;
+
+        cl_rx_buf[node].count = 0;
+    }
+
+The second process, the back-end node, receives the packets from the shared
+ring with the distributor and send them out, if they belong to the node.
+
+At initialization, it attaches to the distributor process memory, to have
+access to the shared ring, parameters and statistics.
+
+.. code-block:: c
+
+    rx_ring = rte_ring_lookup(get_rx_queue_name(node_id));
+    if (rx_ring == NULL)
+        rte_exit(EXIT_FAILURE, "Cannot get RX ring - "
+                "is distributor process running?\n");
+
+    mp = rte_mempool_lookup(PKTMBUF_POOL_NAME);
+    if (mp == NULL)
+        rte_exit(EXIT_FAILURE, "Cannot get mempool for mbufs\n");
+
+    mz = rte_memzone_lookup(MZ_SHARED_INFO);
+    if (mz == NULL)
+        rte_exit(EXIT_FAILURE, "Cannot get port info structure\n");
+    info = mz->addr;
+    tx_stats = &(info->tx_stats[node_id]);
+    filter_stats = &(info->filter_stats[node_id]);
+
+Then, the hash table that contains the flows that will be handled
+by the node is created and populated.
+
+.. code-block:: c
+
+    static struct rte_hash *
+    create_hash_table(const struct shared_info *info)
+    {
+        uint32_t num_flows_node = info->num_flows / info->num_nodes;
+        char name[RTE_HASH_NAMESIZE];
+        struct rte_hash *h;
+
+        /* create table */
+        struct rte_hash_parameters hash_params = {
+            .entries = num_flows_node * 2, /* table load = 50% */
+            .key_len = sizeof(uint32_t), /* Store IPv4 dest IP address */
+            .socket_id = rte_socket_id(),
+            .hash_func_init_val = 0,
+        };
+
+        snprintf(name, sizeof(name), "hash_table_%d", node_id);
+        hash_params.name = name;
+        h = rte_hash_create(&hash_params);
+
+        if (h == NULL)
+            rte_exit(EXIT_FAILURE,
+                    "Problem creating the hash table for node %d\n",
+                    node_id);
+        return h;
+    }
+
+    static void
+    populate_hash_table(const struct rte_hash *h, const struct shared_info *info)
+    {
+        unsigned int i;
+        int32_t ret;
+        uint32_t ip_dst;
+        uint32_t num_flows_node = 0;
+        uint64_t target_node;
+
+        /* Add flows in table */
+        for (i = 0; i < info->num_flows; i++) {
+            target_node = i % info->num_nodes;
+            if (target_node != node_id)
+                continue;
+
+            ip_dst = rte_cpu_to_be_32(i);
+
+            ret = rte_hash_add_key(h, (void *) &ip_dst);
+            if (ret < 0)
+                rte_exit(EXIT_FAILURE, "Unable to add entry %u "
+                        "in hash table\n", i);
+            else
+                num_flows_node++;
+
+        }
+
+        printf("Hash table: Adding 0x%x keys\n", num_flows_node);
+    }
+
+After initialization, packets are dequeued from the shared ring (from the distributor) and,
+like in the distributor process, the IPv4 address from the packets is used as
+a key to look up in the hash table.
+If there is a hit, packet is stored in a buffer, to be eventually transmitted
+in one of the enabled ports. If key is not there, packet is dropped, since the
+flow is not handled by the node.
+
+.. code-block:: c
+
+    static inline void
+    handle_packets(struct rte_hash *h, struct rte_mbuf **bufs, uint16_t num_packets)
+    {
+        struct ipv4_hdr *ipv4_hdr;
+        uint32_t ipv4_dst_ip[PKT_READ_SIZE];
+        const void *key_ptrs[PKT_READ_SIZE];
+        unsigned int i;
+        int32_t positions[PKT_READ_SIZE] = {0};
+
+        for (i = 0; i < num_packets; i++) {
+            /* Handle IPv4 header.*/
+            ipv4_hdr = rte_pktmbuf_mtod_offset(bufs[i], struct ipv4_hdr *,
+                    sizeof(struct ether_hdr));
+            ipv4_dst_ip[i] = ipv4_hdr->dst_addr;
+            key_ptrs[i] = &ipv4_dst_ip[i];
+        }
+        /* Check if packets belongs to any flows handled by this node */
+        rte_hash_lookup_bulk(h, key_ptrs, num_packets, positions);
+
+        for (i = 0; i < num_packets; i++) {
+            if (likely(positions[i] >= 0)) {
+                filter_stats->passed++;
+                transmit_packet(bufs[i]);
+            } else {
+                filter_stats->drop++;
+                /* Drop packet, as flow is not handled by this node */
+                rte_pktmbuf_free(bufs[i]);
+            }
+        }
+    }
+
+Finally, note that both processes updates statistics, such as transmitted, received
+and dropped packets, which are shown and refreshed by the distributor app.
+
+.. code-block:: c
+
+    static void
+    do_stats_display(void)
+    {
+        unsigned int i, j;
+        const char clr[] = {27, '[', '2', 'J', '\0'};
+        const char topLeft[] = {27, '[', '1', ';', '1', 'H', '\0'};
+        uint64_t port_tx[RTE_MAX_ETHPORTS], port_tx_drop[RTE_MAX_ETHPORTS];
+        uint64_t node_tx[MAX_NODES], node_tx_drop[MAX_NODES];
+
+        /* to get TX stats, we need to do some summing calculations */
+        memset(port_tx, 0, sizeof(port_tx));
+        memset(port_tx_drop, 0, sizeof(port_tx_drop));
+        memset(node_tx, 0, sizeof(node_tx));
+        memset(node_tx_drop, 0, sizeof(node_tx_drop));
+
+        for (i = 0; i < num_nodes; i++) {
+            const struct tx_stats *tx = &info->tx_stats[i];
+
+            for (j = 0; j < info->num_ports; j++) {
+                const uint64_t tx_val = tx->tx[info->id[j]];
+                const uint64_t drop_val = tx->tx_drop[info->id[j]];
+
+                port_tx[j] += tx_val;
+                port_tx_drop[j] += drop_val;
+                node_tx[i] += tx_val;
+                node_tx_drop[i] += drop_val;
+            }
+        }
+
+        /* Clear screen and move to top left */
+        printf("%s%s", clr, topLeft);
+
+        printf("PORTS\n");
+        printf("-----\n");
+        for (i = 0; i < info->num_ports; i++)
+            printf("Port %u: '%s'\t", (unsigned int)info->id[i],
+                    get_printable_mac_addr(info->id[i]));
+        printf("\n\n");
+        for (i = 0; i < info->num_ports; i++) {
+            printf("Port %u - rx: %9"PRIu64"\t"
+                    "tx: %9"PRIu64"\n",
+                    (unsigned int)info->id[i], info->rx_stats.rx[i],
+                    port_tx[i]);
+        }
+
+        printf("\nFLOW DISTRIBUTOR\n");
+        printf("-----\n");
+        printf("distributed: %9"PRIu64", drop: %9"PRIu64"\n",
+                flow_dist_stats.distributed, flow_dist_stats.drop);
+
+        printf("\nNODES\n");
+        printf("-------\n");
+        for (i = 0; i < num_nodes; i++) {
+            const unsigned long long rx = nodes[i].stats.rx;
+            const unsigned long long rx_drop = nodes[i].stats.rx_drop;
+            const struct filter_stats *filter = &info->filter_stats[i];
+
+            printf("Node %2u - rx: %9llu, rx_drop: %9llu\n"
+                    "            tx: %9"PRIu64", tx_drop: %9"PRIu64"\n"
+                    "            filter_passed: %9"PRIu64", "
+                    "filter_drop: %9"PRIu64"\n",
+                    i, rx, rx_drop, node_tx[i], node_tx_drop[i],
+                    filter->passed, filter->drop);
+        }
+
+        printf("\n");
+    }
diff --git a/doc/guides/sample_app_ug/img/flow_distributor.svg b/doc/guides/sample_app_ug/img/flow_distributor.svg
new file mode 100644
index 0000000..b35faad
--- /dev/null
+++ b/doc/guides/sample_app_ug/img/flow_distributor.svg
@@ -0,0 +1,417 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by Microsoft Visio, SVG Export Drawing1.svg Page-1 -->
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events"
+		xmlns:v="http://schemas.microsoft.com/visio/2003/SVGExtensions/" width="7.0721in" height="4.43701in"
+		viewBox="0 0 509.191 319.465" xml:space="preserve" color-interpolation-filters="sRGB" class="st2">
+	<v:documentProperties v:langID="1033" v:viewMarkup="false">
+		<v:userDefs>
+			<v:ud v:nameU="msvNoAutoConnect" v:val="VT0(1):26"/>
+		</v:userDefs>
+	</v:documentProperties>
+
+	<style type="text/css">
+	<![CDATA[
+		.st1 {fill:none;stroke:none;stroke-linecap:round;stroke-linejoin:round;stroke-width:0.75}
+		.st2 {fill:none;fill-rule:evenodd;font-size:12px;overflow:visible;stroke-linecap:square;stroke-miterlimit:3}
+	]]>
+	</style>
+
+	<g v:mID="0" v:index="1" v:groupContext="foregroundPage">
+		<title>Page-1</title>
+		<v:pageProperties v:drawingScale="1" v:pageScale="1" v:drawingUnits="19" v:shadowOffsetX="9" v:shadowOffsetY="-9"/>
+		<g id="shape1-1" v:mID="1" v:groupContext="shape" transform="translate(18.375,-18.375)">
+			<title>Sheet.1</title>
+			<rect v:rectContext="foreign" x="0" y="36.75" width="472.441" height="282.715" class="st1"/>
+			<image x="0" y="36.75" width="472.441" height="282.715" preserveAspectRatio="none" xlink:href="data:image/png;base64,
+						iVBORw0KGgoAAAANSUhEUgAAAnYAAAF5CAIAAACdiPDmAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7E
+						AZUrDhsAAHVJSURBVHhe7b3tdxtXnt/Zf0Dn7Js9p/dNzsmmXyQvku4kk2TWm82Z0+t5sbvJOrs5ORml28eb8ax3ttszZ9zjWD1uuz3u
+						aTvuHXWPrZlW+0kjWW5LsmVKMiVRoihRfMJDAcQjnykKAkkQIAkSJAE+ACRIcb+3bqFYKDwD9Qj+vucrqureW/ehUHU/dQuFul87JJFI
+						JBKJpIMIsSQSiUQi6SJCLIlEIpFIuogQSyKRSCSSLiLEkkgkEomkiwixJBKJRCLpIkIsiUQikUi6iBBLIpFIJJIuIsSSSKT2UXZnZ3Fy
+						Ep7r7Y2eP8/8wQeLJ04onf/61w+/9rWGjE1UmSBbZB7zelHWViYjFU8iFYsQSyKRbKa1pSWALXrtGiA3/8ornHkcnLlvfIOvzr3xhoTY
+						y5c5dGXn83kpo7qFTVSZIFtkvvDiiyhr65vfRNHpb30Ly6gPwpGAuEuCCLEkEsmi4mDDSBHQmn3nHQAMGAPM1p56Csuz776L8HmHgzOv
+						CXBqq3QqhWqgPgyxInc57zHexZB6ZX5eSkc6TiLEkkgkS4gDdfb2bX5rF3zit2cxUmSIvX0bscCYlNoO4netMd7FkHr16acBXSyAwTTA
+						PT4ixJJIJHME/PBvTPmYjwMVo1V+axd8ktK1i0BWtHf+lVfQWBAXVxI0tG17EWJJJJJBWo5Eoteu8SHd4de+BqDyb0wB1OM2sANccSWB
+						/bD21FMYoLff9QSJixBLIpH0EpgKfmBguvzMM2Aq/s6++y59ManU2tIS9g+/h4zdJYWS2kWEWBKJpJkwGJ13OIqY+s47oCzBo7ry+Tyu
+						PLC7MK7FmF4KJdlfhFgSidSS0qkU8IBB2NpTT2E0Nv/KK8TUpoXxPX/Cy14PdpEqiRBLIllCfr8/rNDjx4+fiOGxWEwKKmhjY0OMORwf
+						H5eCRE1PT/NNlpeXpaCCECLGHCKNFFQQ3ySbzfJVVGN2dlYMqyZ2e/P2bf7kTvpb3wJfQVkEStGk1hTzetl3tO++S9/R2l2EWBLJfIFz
+						bkHI7+/nZe3v7x8cPIEOD7GgjGIxYjjisSyFQopNDqpvIkcpN3nyBKuTk1OT09NYlmqmEMZVwCoGWLlvfIMB4J136Pcn+gkfTvTaNfY6
+						i+L7xgiXlkh2ECGWRDJfIKLbLWAoubyc9AdCcCAYCoZCoXAY/7CAVR7Oo5hYFEsjRyk3gUs2CVfcREz/6FEkt7s7Nj4xPj6BflzELuvQ
+						MaLCcApMRXcPrGKVhlaGif2y9sQJsJavsq+6X3mFL5NsIUIsiWS+MJR0uYWdnR2H23v5nv90Z8Bgf9gVHHS6gVhgfiebTc4vRK9ejT//
+						fP7rX2dvfrh2jW4Cmyhc4uDiBrhdfuYZ9p5Ikn1EiCWRTBaGi/v7+2wUm8s53d63OkLf+3jcYH//wqjz7v3og77oj1/b/Pt/P/Xbvx19
+						9914OCxVkWS2Zq9e3f57f+9QnJOALndsJEIsiWSylIh1CEYj9ge/GDj37Bvj//h/2vs7f2f2T16K3r27sbaG+vAbxSTTxV9SsSXONMA9
+						73BIcSTLixBLIpksjtjYQiKbzTqMGsW+8rNbn//7H87+3X+48d/8t/d/5/f+5r+83+8QMpubE5OTU1NT/AEokhXEn3tSInb23XelOJLl
+						RYglkczXwcHB7t5ebndXb8T++auX7vzuc/H/7r+Hb/yv//eP37jKw79/YXTAIaTTGY5Y9pSxVDWSJQTQzt6+zScaWjxxQgolWV6EWBLJ
+						fIFoGMju5fM6IRYoHfgf/w8MWGf+/rd/83s/whBWlUCJWNjIG8V3nOEr933kOn3nZ6fn//E/UwWS63E2m5WOOQNFiCWRzBdo5nYL+wcH
+						OiH2r37w1x/+/ts/+MWAKlw2R+xGOj0+Pjk+MQnYS7+W1VkPH8//9skb337hEpmsr//4GigrHXYGihBLIpkv0MwtCBg7GvZdrMoKxLLf
+						xe7u7RmG2O+82vlP/sP7ZLKuBmUJsSTSMRV45na7ATbTETsz8+jRowghltxmJsSSSMdUINk+f7tTLmc6YrNQLrdnBcSejjyJ+0+oAmv5
+						xLW16LUv2PLL/qh4B1702rmXi1Mic889ZcjRhmX8xbk4Mom8rg4vcaHQylmV8euew0JlpIL6j0KKjWrzFsX9r1ercB1uvKqKelY3a0X/
+						aVVgZYuN4tVAEZU3rJWtmE+lBIRYEumYiiGW/y42m3W4TEZsLpfDEDYvfhcr1U9P6YhY0RWp0BBiGY3q4KuYSX0QquCaBSn2SdVrgtpu
+						tarVXJWFpR8rC1mLioHNIxa7zuOvkoAQSyIdU3HE+vwB0xGbTmcW4vHFpaWDgwMjANsAYu/189EbH48qRmAMFeIy71tV4FEitiglMldm
+						eLRhcUFsQz6yZAPHE8WxhQwVUOTZ8hJPR6JxnoBnVa0JYtFHBUkjVEWao/zLILYoZ4lSrCZixcRNkKGYQEEgZVXLtwvYK2QlFiqVqK6V
+						YtvTUhQsF1TIjYcod6aUgOXvucerXUBs+X1VyKQ4Vs6nKoMJsSTSMRW/Uby7u2v6jeJ0hv1oR54Ur2lF5xNgZz2+4wz/6x/VRix6Xt6h
+						s/5a7I5l6sg9uJxAjoKRshSxLIHYrSsT8A3lNHKGzKyLZ7hSVYP/ldIcWQQAwouLUOWsaoK0XCiIhyjTSEaePBMxQx5btlbsrwgkHsvq
+						oAYSLFWVJ+ZGYp6DMkM5f54VX+VWbss3V6FOTiBtpfhYJfMdhbYrQCuXiKjCqpStskRlTWoi9t0vHarDr5JxAEuHcssixJJI5gujxr18
+						HpQ1GbHi72LZZHatjWL/z3e6v/VKV53+9p98peoNJSv6YrnP5QvyqrLb5SHyAjdSclqoUxbzDws8nHXfUnqFSxDLF8onhnnNi4tQJZaz
+						gqUqYbkexBb2ibyVqlZiJhiARl5nFYj0H5GV7QF1hcUM2RhXEX5UVbE+/R4ph7K1Okp8VBMl6tQfkLIJko92lDRuVrVIla2yxGIry1Ub
+						iFUdeFWMA1irJxEIsSSS+cL5vLS0lLfCj3Ym2KsnWvwu9t/9V40Qywcr6JFZX88HLuLNz8Iqel7W4RaWsdVRVy4avbPcHRelVN/FlTeU
+						b0IqOusC+eRyeTVK+3pWnLytXH+piOKci5sg1blQkBSiSCMVoeBT8VY8Z7GSHKUsWWE8raqYuHlxSFHdFO0Ss5KyrVQrxbbXClHxNbkg
+						lpsyPd9cSdkCYvkeU+4c9cctZVvpM5ICj3aXwg0hFgcw/2m4dEC3IEIsiWS+cCoLgo6vnqjpI8Sy38VOtvJEMUbAHLFCeHo1tbaaWq9i
+						T3j6d/7shqo3bBPL5CBbwEDs397yqA6/UuOgxaH7b9++s729w95xJh3UzYsQSyKZL/AMiMXY0XTEilOyTzb9u1hsgwuFZ/7rHfRTQ4HJ
+						5ZXVldRaFQuhKUIs2QBzxKoOv1K7Qwyx/+at7nQmg4Fsk5eZChFiSSTzhZGf281mRDcdsaupFKwJYl3BqfWN9Na2qJ2dsg5PRX7nz+jV
+						E2TdDcR+dndYdfipvb3jH5+REJsmxJJIbSGcxRZ69USOiX8R1SJihfA0ui0MzRFSyYml5G+dvIXEZLLe7hoKqQ4/tff3R6cfIyUhlkRq
+						HzHEWuPVE+hWdnd30bOwb6Ga6lyUiPWEp9EiDNClOBLJ2sLROzEzi0P33759hxBLIrWJOGLHJyetgNiJ1uaLVSM2lyPEkuwiQiyJ1J4C
+						h3b39nKmv3qigFj0LIRY0nETIZZEak9h0Jjf398ze6YdjlhAVrMbxYRYkn1EiCWR2lM4kwOBAMBm+uNO4xNHU7JLlWtEhFiSfUWIJZHa
+						UziT22NKdmxDiCXZVDh6CbEkUhsKPBMED8BmOmJbnJKdEEuyrwixJFIbCmcxsORyC6Y/7sR+Fwu1MCW7ErGu4OSA04tsB53aW/Cyicnc
+						nuGBkihjHB4Z5U2G9KuGU/DgQxj2B8xqJt/PXP5ASKdqOFyezc3N8fEJ5G9KS51uT14EKiGWRGo3McRaakr23d2mpwFQIvaBZ/TekPfk
+						xZGTlzT2T78MDTrdGB8LgqCKMsanrgcHnG40FvsI1q8ayBmFgAFosirKAEv7ucAZHCFouCqNJr476J2fj7kE75mbAVWUMe53COvr62gp
+						IZZEajdZB7HoVtDRbGykgcnmOhdsJSP2vjDaM+R5tqSs1o3aDjrcuBoAgVRRxph3yhjro72QftVAzmgmOIcmq6IMMN/PuOTiRwPGl2i4
+						Ko0mvtnniTyOOt3Dphz8cN+QkEwmcRoSYkmkdhNDbLtMyY4uSUZsrzDSM6gXYvsd7szmpomIfTAk7OzsoLF8MK1KoJWRMz4UcM4sxOJK
+						Ymt7G+xBM/t1Q+yNB97pmYhZBz8MxMYTi7hmGn8YJcSSSO0m9F84va0yJftk81OyG4fYIfdGOm0iYtEpgz3iuyb3dUXs2vrGoEMwC7E4
+						KnApw1oJxDp0ROzUw0eDJt3CgXHBtLAQ3yXEkkhtKZzJbEp2nSeze+7s2IW7wQGn98vegKrL5p0p+9EOn5IdPWpTnYuRiF3fMBOx6JS3
+						tgxCLD4aMxGbYYhlo1g9ETs5PTNkKmJj8QQhlkRqT+E8RmeKbkxXxHY8CNzxzlz3LXYNz3YP+V84PyZHHSG2tSnZayC2IzkcnMHCmWiu
+						s0MRXsUdyfihOnFVxMaGS9Kr/GowFxerUZfLVaAGYptoZm8aOxtWVawyYrVuZrkKEGIJsSRSOwhnMjpTXUexL18c6XUFOnxJ7rveh7++
+						GZBjixGrzasnKiG2ka4/Nrye7CwBVTXE9qaHo+ny+QOW0Zg6sIbLV6AexDZGOMkzndHkq4qQiojVuJmyiypAiCXEkkjtIPRfbjd7dNN0
+						xMZicVg/xMaRRgYAXz08HO5lq2ei6TMsnFFNiZnSsWAVxIqZKHPAaI8PzmKd62zhCaLAJ1aiFPXkUCy3Nx1fzx2tKlxagZqIbaKZUspi
+						OlZCrB7NZC6uACGWEEsi2V44i9GBGTAl+41+f5c3Ar7eGI71OgPKXltGrPjmCW1ePVFhFJuUwXAmyrv+Ao3Q+2NYxv/Km5QjXGXExobF
+						rORNMJTkYGOW+SGy5yiqUC6vRtEmoptAbBPNFFmoxl4FxOrSzNIKEGIJsSSS7cUQa8jvYp8/N/5ZTxC9dteA76XPikZFvDNFt5LbRT+z
+						hy61uc6lDsQe9fIl6OJ3ZdWYaQCxhS8UYQ6whthTZhPRTSG20WbOdK6XGVaWR6wuzSxTAUIsIZZEsr04Yi0yJXvk8eNoNKrJlOxVHneS
+						+nfAQMEJHi4N9STLNzmlu6zclRCrgFlhQFZUhJgb8q90B7UMe8pXoC7ENtBMJTWLeFwWsTo0s3wFCLGEWBLJ9mKIFV89Yfo7ivmrJ/iU
+						7FLlGlQNxNayut+v4EqINcw1EFvLdTYTLotYw0yIJcSSSO0gDBrz+TzOcJMRK0/JrsULFBtHbPmbpaW2OWLrbSZMiDXGhFgSqZ2FMxlj
+						R3TW5iKWv3oC1mQagCZGsXXa5ohtwIRYY0yIJZHaWTiT229KdkJs6ybEGmNCLInUzgLPBMGz1/iN4onElpRF43rp84dyPjJix8S3OxFi
+						q5sQq60JsSQSSXvNLSx6R2c6h8be7Qw6XM1Myf7hQPyqP9mcX7gwJecjIzYrShPE9nnH+p2ezgdedKDa+lafZ8DBEOtyC6ooY9w94O1z
+						HCFWv2pwxA463Lf71VEGGPsZRcuIHXQKdwfVaTTxkEuYfhRxur33Bj2qKGOMTzCRWCbEkki21z3PxNnu8JtXijh6pW/EOlOy5zSakt0V
+						mpqJREcnpkPjk8ExLY0Mpx9FUdv52ML41MPw+JQqgd5GBWZjcXmmnYWFuB7VCI1PTT6MALEL8cWJqZnw+LQqgd5GMx9GZuWZdpaXkzpV
+						Y2xyJrW2sbS8jLGsGc2cmngYAVMJsSSS7ZVcTan4+vt/O4oBmUWmZF9bR120mZLdHZpGv5lcSS0ur2juldQauv7Nra3U2vpSclUVa4BX
+						U+vyfLE72SwjhA7VwNGSzmTAcoDWlGZiP8vzxeLqS6dqYHdupFkzcfBhWRVrgJdXUjiYwFRCLIlkewGlr31+xNGO/lF0YPFEookXKP74
+						WuStW7PN+T+fm5DzkRCr6e9ihfB0JrMJEOIvctbQyBDdMUbb0PbOjub51zRK3N7e3tvbQ3sh9MWsGpvaNxPXEOy2wt4ecK55/jXN9zN2
+						Mr/gwlhWp2qgmezrid1d/EWbVbF6W9rPu7u4kpiYmSXEkkj21uh09PUvQt//hD05giEszm8MEdCN4iQ393EndCscsZq83QmIHR2fCAZD
+						oVBYc8/Pz2OnRSKPVeGGeWlpidEVTT481K8ajyIRFBKLxVThhnkO+7nAGTRZFauVR8fG8Gmur6+HwljV5YCp7snpabQSLSXEkkj2VufQ
+						2PtdIVytD/gmwTYMYRGIcxtX0E1MZqfxKDadkadkb65zwVYyYvs8ow8cntNfBU53auwPu4KDTjfqJwiCKsoYn7/jx+6S95B+1UDOODYG
+						nQKarIoywPJ+5kKT0XBVGk3c6/DgMsIleC/f0yX/mna4BAAeRy8hlkSyqzBafbsjeM8zwVcB1D88z4awWOa0AJwaRaxWlh93Yr+LndBm
+						SvYHwph+P9oZdLjRA2KnqaKM8clLI/1OARcivNX6VQM547MA59BkVZQB5vsZByo7Fp4wxOr0o52bfZ7Z2Tkg1pSDH+5zCKurKRy6hFgS
+						yZaKzC28eSU0t7AorYuaiszzBZzJboF12ZZArEavnrgvjPYM6YVY1HZ7e8dMxDrY5IPYS7CuiN3a3gbnzEIs9vNONnsAPXmCqwrdEOud
+						efTYrIMf7hsSFpeWcDFBjzuRSPbTbdfYqeshPmAtK/Rgbrew2/h3sZr/LlbfKdk1MmrbN+RGJ2giYh8MMcYb8OqJ9Y30oHmvnsCVBI5b
+						1sqDA/0Qe+OBd+rhoyHzEItPcyG+SD/aIZFspmw2+15nCIiV1ssJZzH6r+amZNf87U6oMKqhyY1iertT60bO9HYnA0xvdyKR7Ke5hcUf
+						Xw7Ld4MriSG22SnZtX3cCYiVp2QHYqX6NSJCrLYmxBpjQiyJZDMN+Car3xyWxRHr8weaQKxW5p0pupVEIrG4uMS+epNq15gIsdqaEGuM
+						CbEkkm0EUr7fFeroH83n81JQVTHEilOyN3GjWCtLiBVfPTE9Pd10v0KI1daEWGNMiCWR7KHE0vLbHcHR6ai0Xp8OxDcE4Qw3GbEmT8le
+						rwmxxpgQS4glkSwkZ2AafE2upqT1uoUz2TpTsrNXT9CU7FVNiNXWhFgSiVRNYNKFnvDl3nCdN4dVwnnsdlvm1RPj2rx6ghDbugmxxpgQ
+						SyJZVxi2YvDqHZ2R1hsXeIbOFKe06YilKdnrMSFWWxNiSSRSeQUmIuBrYmlZWm9K6L/cbncT0wBoZRmxq6kUTIitbkKstibEkkgktfL5
+						fEf/6NnucDablYKaEs5idNNWmC8WiM2KU7Kjc6HvYquYEKutCbEkEqlI6PhOXQ8N+Cal9RZkHcSiW9nd3cWlA+rTXOdCiNXWhFhjTIgl
+						kSykqch86Tv9mxZHbGwhAcR6fWz+MlM06DyaLxY9S3NdCyFWWyNnQqwBJsSSSFZR59DYe51swldpXQuh/8Lpndvd3clm0aUmllZiieWF
+						+JJhjiWWlpKr6Ew5YjWZkh2IvT/kOXlxBP2ytv7plyEZsaooY3zqelCFWFUCrSwjFk1WRRlgFKpCLBquSqOJuwckxJ65GVBFGeN+JyGW
+						RDJbm5tbp66H5AlfNRSIlkwm5+bmorNzDx9FJqZmxqdmFpeTydUUjGWlpx9FefhcLK6KWkgAlCxq8uEjZThWeTgSKMPhx3MxhK+srkXn
+						5h9FHgcCQfa7WC1uFDsCEw8cngeDQu+Qp3fIrak9g+5hIBadcp9Dj/xr2uMeDsiIdehWjX6nB4h1eXxmNXPQ7ZMR6w+GcWGhQzWEPnGi
+						m/AoG01itSSB7u5zeFJra4RYEsk08Qlf8Vda11Q4jyORSCgUCgZDgWDIHwj6AsHU2vr29g7MV0WH4NGxia1taGduPubzH4VjIbG0zDcJ
+						hkeUmwRDYb7J4tKSapOZyGMWtbMz/XAmEIRCC/G4Jr+LdYemV9fWl5ZXEovJeGJZSy8i19V0Bp3/Ji4O0Gp1Ar29uIRysdcYeQ4OsPdW
+						UjpUA59WcnUjnca13SryX15RJ9Db4n7e3NrCZQSamc1mV1PrelRjcXkFF0xoJo55LKtidffiEgrF4YTDnhBLIpkgjFzrfKd/00IXhlOa
+						v6kYfRn+yk8e4czngTuic7kcUiICZukL4WwjeZN8HsmKNhHnz5E2yeVKN8Fffqd6Z2cHl/OaIBZ4wCAM/Sa6Zg2NDJEz6onabqQzmudf
+						0ygRPTJ2F/YSjAWsptY2VMlaNEpBOwFyfEy4mjClmewh88KU7DgqcE2jRzVQztbWNgrCKYZlVaze5vsZRxNOA0IsiWSocNq/1xnqHKo2
+						4asmAplAQcZF0QyK+Tzv2jj8WDgkopeNKtC5y5uIYpsAjXyTAkqlCHC0wiboN9kIBWgsABuBSNxc56JErBCaxviYZSe2SENDqCp2C+qp
+						3GmGmVUA+21/n7f6aK9qarGYo8sszfOvabF8duTgY8XhoFMzYd5M9mnKh7qBZuInyMHBxMwsIZZEMkhzC4tvXgnVnPC1deFE5nBio0nR
+						EAOfeA8ZC2JAIQrrQKLIMx4lb4IoaZNKuZXdROxI5AqISRHQjHgmHLGe8DSAzfITh3raWpRUoirKGEvFF6RTNeRidMq/pkWJNRCFFVUC
+						TczF84dUsQaYSSydEEsiGSRnYPrU9dDa+oa0rr/YSV5sLlUgLEsVDsuqMxyWVRrSqNAlFSE2lwOvpTgSydoixJJIRghjr7Pdzb/T/ziL
+						EEuyrwixJJLuSorv9A9MRKR1rRWdW/mjTya/9/H4ixeH1jeqDZHDE4vDUyPSSn26547Jm6Cgly8GH8fmsDzom+ULZaXcqlTKfGqKEEuy
+						rwixJJK+8o7OvHklBMpK6zoIxOr2+7FQHXtQ64j98Hb443sOLDeN2LW1zQ+7PeduPyTEktpehFgSSS/l8/nLveELPbrfHJZHsa9fHchm
+						s8Ablv/gEx9nGJD22qWHCLnqcnPEIsEvu/rkrTgLEfXa52F5KCxvJSeAOMuv3I8gZ45YOVnZrVRFKMUzkVaqihBLsq8IsSSSLuI3h52B
+						aWldT3HyYQGYBEd5oLysHFAiEMDj4b+5w0gMA7c8ii/w9PJWys15Qfh76oaz2/UIjJRjeXGqrVRFKEWIJR0HEWJJJO01Oh1tfcLX+qVC
+						LPDGwVYWsd2e0Q+7PRjsqiDHt8UCT6+CpZjkqCAE/uyqtyZiq3CUEEs6DiLEkkhaKi9O+Pp+l8bv9K8ukE/5uBPwpkSsHItVgBDkQ8jH
+						9xzKcCRTIVa+5fva52FOTUhGLGL/4sswGFnpRjHfSlUEl+pmshRaWYRYkn1FiCWRNBN/p78mE76SZBFiSfYVIZZE0kZTkfkfXw5rNeEr
+						SRYhlmRfEWJJJA1026X9hK8kLkIsyb4ixJJILQlYPXU9BMRK6yStRYgl2VeEWBKpec0tLP74clinCV9JXErEDvknBpwet1vQQ0MuAcU5
+						XNKq8XIJXt5kSL9quNwC+ng01izx/czlEjxSqNZCM1dXV32+gLRuuFABXH8TYkmkJjXgm3y7I6jrhK8kSInYB57RnkHPs+LTyNr6+xdG
+						B53u/f19dI6qKGN88tLIgFPAAB0dMKxfNZAzmonGosmqKAMs7WexmdCAQ0DDVWk08a0+z9z8vEsYfqsjpIoyxn0Oz9raGj5QQiyJ1Jhw
+						cfp+V6ijf1RaJ+kpJWLvC6M9Q3ohFt39zs6OiYjtdwi5wpTsuiJ2Zyc76DANsdjP/G4/mjno1AuxN/u8M5HHDhMROyQsLyfzNCU7idSQ
+						EkvLb14JjU5HpXWSzlIitlcY0W8UC8JlMpsmIvbBkLC9s4PGQroidiOdHnQIZiEW+3lza4tPItyvG2JvPPBOPXw05PaaiNiF+OLe3h4h
+						lkSqV87A9NsdQSMnfCUZh9gh9/pG2lzEbm1t58V57XVFLA5gDCXNQiyKxqUMWskQq9uNYiB2cnpmyGUaYvFpxuKJXUIsiVSP8vk8Tfhq
+						igix2poQa4wJsSRSvUqupt68EtJvwldSFdVGbEdyODiDhTPRXGdHcVTdroXY2PBhtcxfDebiYh2adm3EatFMuCpiazQTbrGltRGrUTOr
+						Ilb3ZsKEWIsqLM6FApdOTqKh5Ne1Q/KLZOt5YewxFMiq94SvpCqqE7Gtd/3VENubHo6my+TfkYxHpTdCt+g6Edt6118Nsfo3s07Ett7M
+						aojVv5kwIdaikt/G3pD4i92llTqkRGzNebyPrfiEr2e76eawmaoHsXEkkztHvnp4ONzLVs9E02dYeGx4PfmqmADdN4vqLepkqyNWzETO
+						AWMgln88GOtcZwtPEI5eWyxOjn1yKJaLUtZzR6uiy1agHsQ21MzSEO4qiK3dTIRLLa3dzLIVqAexDTUTxv5UFQ1XQWxxM2G5LaIbbGbZ
+						0mFCrEWlHMXyZdUcJnwVUfIE2onFlfeuPcby61cHJh8uKoekymSlM2bzEoHnly8GOWVVI1q5Ah/eDvPNP+z2lBbB0yABy65dhG7IsAlf
+						SVVU3yg2KfeYZ6K8Tyx005xkRTybYcxQ9NFwVcTGhsWs+K1LCZA8CgAolMIDj2IL5fJqFG1VrgL1jWIbaWaZhjNXRmwdzYTFltbVzHIV
+						qAexDX6aogsVkF0ZsUXNxMJRnZtrphirKh0mxFpUIJY8isWyDEJ53MkT4K9yAm15FNvEPNvQ9nYWkEa2pZurCq2Spp00Oh1980rIsAlf
+						SVVUH2KPur+S7/DYeKVTGv1wN4hY5Mx7eTakY/cwj7rXOhDLYVDcKTeN2IaaWRrCXBGx9TRTTIbw+ppZpgL1IbahZhZXr+CKiC1uJkKO
+						6txcM8uVDhNiLSqOMXlZplcpYnkyFWKbmGebi+dQujlPxsevF++PY6haKU3bqHNozOAJX0lVVC9i5Y4PXZ6iA+XhykEGBkYsWaET566C
+						WEUvHxs+TJ8pyl+8kYh8CoiVQphFDJTrlMtWoF7E1t3MsiFwJcTW1UzESi2t3Uy+qqpAvYhtpJmFkW4RjCshVt1MLBwVkWyimWVLhwmx
+						FpUMRb4s06v0RrGSnTwWw0r5Ti+PLZsMscp5tvmo9A8+8QGcpZsrk/Fha5U0dtfm5tbbHcF7nglpnWQB1UZsLav6/bKuglhjXBuxtVza
+						zLINr4RYPVxagdqIreV6Pk242uNOhpgQSyIVKTK38OaVEE34ajW1jNiZzvXi+4rlbH/EljazfMMNRGyZCrSM2Lo+TZgQSyJZSLddY6eu
+						h+id/hZU66PYemx/xNZrAxFbxi0jtl4TYkkkSyibzb7XSRO+WleEWG1NiDXGhFgSSZrwdSoyL62TrCdCrLYmxBpjQizpuGvAN0k3h60v
+						JWIHfeN9uk3JPuBgiB106pN7Hep3emXEOnSrBjJmiHVKq8Zr0HmE2CGXjlOyP56dd3t90rrhcrqE5MoqIdZmis6tdPv90kodUv44R34S
+						uOxrItrpweCakid8pdc2WV9KxLpCU6uptcXllVhiaSGupZHhUjK5kUY3mEmupOKJZVUCvY0KJFdTW9sSYre3d7CqeTViieWl5RVcSQBy
+						K6m1+KI6gd5GM5eTq7iuZa08ONjJZvGB6lGNxNIKriTQTOSfWEyqYvU29jOOUhxMhFibqUXE8m3LvjHx+CAW5/jbHUGa8NUuUiLWHZoG
+						HtBpAj8AoZZeTaXW1kE4sA1ds/b51zRatb4hz1WOBbR0ZXVNnaxFr6ZWU+ubGCzv7OiSf02L+3mHT4v75EludxeXNXpUA7szs7mJZuJq
+						AhcTqljdLe5n8YIpT4i1kEp//KoadMqYVKUESrHMf9uqjIVLR7GvXx3AME61CUdsaWDZ9y+e+irAs+KZl9bTsnKKE77iBJDWSZaXErFC
+						aJrjgVlb7WBAld2D8vlcLqd9/jWFCuRy8m0VjPF0qQbgls1iaIWCgDesSeGGie9nkTRgDT5ZnarBm4mCdk1qJiqA8tHAiZlZQqxVJA86
+						Aa2r4iucVCNLGbGqlGLk0bIcKy9A8rZlN1GWpQws+/5FO75DEX3KhR6a8NV+KkJseBo9F7/HqLkxqIIh/FVFGWOUy9orGtKpGmI5pjaT
+						V0BsI6RfM3k78ReLqlgDzMvHP0KshaQCZym6KiEWq5x5HI1yrLwAqRCr2oSXVRqozFDOzXbvUMSwFYNX7+iMtE6yj9AlocPiiPWEp/mt
+						VCmORLK2cPQSYi2k0hvFKnTJN3tf/FS6Vau8USyjUc5H+aLEo23LbVIPYuUc5BvFym2xYE0FJiLgK73T36YixJLsK0IsqZ2Vz+c7+kfP
+						doez9E5/24oQS7KvCLGkttXa+sap66EB36S0TrKnCLEk+4oQS2pPTUXm6Z3+jx8/DiuEVR4ei8WkoII2Co+Cj4+PS0GipqelGemXl5el
+						oIIQwqOQRgoqiIdns1lpXZG4CRFiSfYVIZbUhuocGnuv87hP+IrzWBAE0HR+nns+mUyyZxwPDwFUMZyLLezs7CAGUYlEohDFtlpaWuKb
+						bG5uqjbJZDJ8E6RRboL/2CZPnuTzeR4eDAaBYTFtM8KGhFiSTYWjlxBLah9tbm6duh6iCV8hnMlut7C7u5vjwtLuLntrHSJE/rEoHrvL
+						fkAIbiEcf7EshYsbIaW0yf4+0smbYBnkkzdhuYliMYVN9sVNxicmJyYnsdxc18LyIcSS7CkcvYRYUpuIT/iKv9L68RawBMRieOr1BfhL
+						U43XkFMAcmMLC7HYAqM4w65UvfpFiCXZV4RYUpsII1d6p78snMUYNbrcQjabdQjmTDby/Qujg043H/iCi1ggxJKOmwixJNsLFHmvM9Q5
+						RBO+HokjFqNYAMlMxDoY4wFXiN9wlurXiAixJPuKEEuyt+YWFt+8EqIJX1XiiPX5A2wU6zYNsf0OYXNrK74ILYGLzXUthFiSfUWItaXQ
+						b46Ojkq/h9BZqZR135jvDEyfuh5aW7f63APGiyH24GBXvEPrMGlWaj75djqTmZicZE8US1VrWIRYkn1FiLWfANcBp/Drm4HTnUb4/pDH
+						6wvkLfbqfFxknO2md/pX08GTJzifd/f2TBzFMsSmGWInJ6eAyeY6FxViF+Lxubn5mA5aXV1FcbimlNYN1+bmJm8ypF81+G+U+Q+3TBHf
+						z1z6VSMejyP/ra0tad1w8f1MiLWTEokE4Hrutv/5c+ruTD8/d3bsb24E0FfOzMy0fGxoI/5O/8BERFonlRPO5Kmpqf39fXMRu5FO8x/t
+						aPJd7IBvfMDpufnAe6tPY9/u8ww53aifyy2ooozx3UHvkMsj7yD9qiEIAnbpoFO43e9RRRlgeT9zDTkFNFyVRhMPuQR0mG7P8P1BE5oJ
+						4xPENRMh1h7CtZjT7b3TL7z02aiqIzPGL5wf++LeMHrMVl7To4m8ozNvXgnRhK81hfPY7RYAJ/MROz4xPj6pyY92HghjPYOeZ0vKat2o
+						7aDDjR4QBFJFGeOTl0b6nUJe/PUwrF81kDM+i0GnG01WRRlgvp9xvcWOhSeHA043Gq5Ko4lv9nlm5+acJj3rB/c5hNXVFA5dQqylhWMx
+						GArj0/rpl+YcKErjZEAH5x32Z814cRJ2xeXe8IUeujlcl8Az1pnm86YjdkxErCY/2ukVRnqG9EIsaru1vW0mYh3sCfADUboidmtrG5wz
+						C7HYzzs7O/hMIVxV6IZY78yjx2Yd/HDfkLC4tITOavxhlBBrUc3NzeEQ/PiWz8g7wzX9y+tBIH9swtA3KPGbw86A9MpcUk2h/3K73bnd
+						XdMRiwsySDPEDnp1QiwIl85kTETsgyFhe1tij66IxYcy6BDMQix/znyfTauvI2JvPPBOPXw0ZCpiF+KLe3t7hFgramNjw+HydD4Y/qNP
+						zbkzXN0vnB/7TbdvwOlOJBItHzC1NTodpQlfGxI+FOl3sdmsuU8UM8SKr1VE59L6d7EiYvUaxfYPudc30uYiFuPLfB4f3b6uiF1b38BH
+						YxZiUXQms8ne5QnEOnRE7OT0zJBJBz+MTzMWT+DKkhBrLeXzeX8g1Dvk+ckXYdVnZjW/fHHkTr/g9vi2tvR6pxL2Rkf/6Ptdx/2d/o3K
+						OohFt8JfdIz6NNe5EGK1NSHWGBNirajHjx8PONxnbgSeOzum+sAs6//vWqDPIYyOjrV85KjF3+lPE742IY7Y2ELCCoidmJycmppCz9Lc
+						AUKI1dZWR2xHcjg4g4Uz0VxnhyK81B3J+KGU5tVgWpW4FmJjw4VtS/1qMBcX61DDVStAiLWWUqnUkEu42jv8wnnbwFX28+fGz93xDzrc
+						sVhMK9BOReZ/fDl8zCd8bUXov3B6m/5drIxY9rNYqWqNiRCrrW2B2Logh5TRdDwaw3LDiO1Ns21VRQCZYm71umoFCLEW0rCfzYXy1YNh
+						1Wsf7OVPu/1ohUPwtv7E720XTfjaqkA09NQ4pa2AWBiVaa5zIcRqa+sjNo4PnaOOL6OH7GVRZ6LpMyxNbHg9+aoYCxjzwW6jiBWzKuTD
+						RrSsFMkIBIBZiXJ4+kxvOr6ek5blfKpWgBBrFWHk1zvkUeHKvr7d752cZPNvN3cgAaunroeAWGmd1Kyw+y3zu9jJ8YlJdC4aPVFMiG3J
+						1kfscDDJ4XcmyglXIC44h3En/yulnGEYXk+eaQyxsWExwwIdcxzhLKtCQQg5Cud8lUarhUAxfZUKEGKtIiD2Vp9H+dnY2p/dHR4bn8DZ
+						IzWvEc0tLP74cpgmfNVEOJPdgoDO2gKInYDR1xBiq5gQK5lzqzcNpJV8HcvGnZ3SWLaQkn91ut4IYpE5J/fhIWhdJ2I518sgtkIFCLGW
+						EHb33Pz8zTZC7MW7vvDoOA6sRo+kAd/k2x1BmvBVK4FnbjebrtV0xM7MPHr0KEKIrW5CrGQFtzCc5TeK5S9NESiNaBUpxTu6KhhXQ6yC
+						3NgwfaZwOzqO0TMWkH/ZG8WVEVu2AoRYSwi7e3Zu7mafV/nZ2Nqf3fUFR0ZzuRz6U6mRtZTNZt/vCnX0j0rrpJaFfY8OTJov1mzE4vNF
+						NTR5gSIhtnVbHbFVXUS4qq7xuJP+JsRaQm2K2LH6EZtYWn7zSmh0Oiqtk7QQQ6xlXj3B3jyh0ZTshNjWbWfEznSuK542qmpCLInJsoh9
+						7uzYB13BG/3+X98MvHo5XP/vdBtCrDMw/XZHECe8tE5qVgCY8h47R6w0JbupiEW3shCPLy5pMyU7IbZ12xmxDZgQS2KyJmJfvjjS4/Df
+						FqZvDs/d9T685wq7BE/XgO8v6piKoE7EAgk04au2evNK6P2uEJ/jjyFWnpLd3B/taDolOyG2dRNijTEh1hKyIGIxYO1zegbcvh7PxB3v
+						o2u+pQ5fEsYyKKtKXOp6EJtcTYEHNOGrtvKOSo+E/PGnI7h2WUqu4nwGZU1GLJ+SfXpaq1Hs/SHPyYsj6Je19U+/DMmIVUUZ41PXgyrE
+						qhJoZRmxaLIqygCjUBVi0XBVGk3cPSAh9szNgCrKGPc7CbEWkAURy/3SZ6MfdgVxNnYNz8qIPd8dVCUrdU3Egqw04aseejwfV30Wb14J
+						js/Mmv+jHe2mZB8KTDxweB4MCr1Dbs094PKituiU+4aQv0cVa4Ddw8GtbQmx+NTEaqjTtO5+pweIdXl9fQ5zmjnoHs5sMsTiY/X6Ariw
+						0KMafKKbQIjdG+jVZ09Wd5/Dk1pbI8SaLMsi9vSN0ANX4MZwDHC97lvE3x7PJK43VclKXQWx6GQxujrbTTeHmxSuSyJzC/Bt1xh8oSd8
+						6noI/v2/ZXf8/vB80X0/BH50y4dezHzEajcluzs0vbq2vri8klhMLiwuxbUzMlxeSWF0tbm5tbK6llha1jb/6kZZqMDKamq7MJHqzs6O
+						HtVAKUvJVXwoaOZqai2xvGJkM2G+n+XJ7LLZ7GpqXfNqIDccJOsbaRSUEg8Y45uJ/YzDiSazM1kWROzLF0fuDvm6hcmrvuVrvqW77rEh
+						9zAQe889Us/kP5UQiwtnmvC1pjhBMdDnEH2/ixEUg36+b398WWIqj/WOzvD08iWL/Cm81xnCGS4IAqJMR6yGU7K7Q1PIEF0nDid0nak1
+						/NXGyDCdyQBs6PSxoHn+tbyOEtEj53Z3Dw6ewLu7u1jVo5nYgQB5NpfD5YThzRT3czqD0sULiScgEGCvQzXWUc72Nvs0QVksG99MtBPF
+						Y7BOiDVTlkIsf4q4F4NX3wKYetM7+8Dp+6Tbf98VxGq/y1/P5LVlETs6HQUnaMJXnPAcirjUACM7h8Y4Mv/LRenaha9ioM8hiv2GxHXu
+						N2SOHP740xGgF6vowCwyJftqKgVrglghNIV+E0cX2qW50d2zW7Tii51VUcaYVaDwWjR8fDpVA8WIt6JZM7GmijXAvJnsWHiCiwnWTD2q
+						ITcTV5mmNBMVQOlo4MTMLCHWNGF3G4NYjE1PXhpBr6cKly0/RQya8sHr9T7/C+fH/uqr4H3vFAa1WFVtUtaliAVIMBoDAPhqe0t1L/dy
+						r/peLl9FOGLveSZ4YlzzStu3IPD4Qk+Y72fse5zcVnn1BENiDp1L64j1hKfRwHx+H1lpb/xDcWKJReGGGf+kRutZDfGxs+PQTCae/0FJ
+						rAHm+/nJE0KsmcLu1hWxb3eEugZ8giBgbIrB6IBrGB3ul70B5XhUHrx+NXw0eMWGPBaJnYL39I16+2glYjc3t97uCAIkUmvbQnMLi4Ci
+						6l4umsmbr7qX6wxMc4ga8PWz8iIGZzGuoK0zJTt6FtSnuc4FWxUhVrzHKMWRSNYWIdZk6YdYDEAx7sRglD+yJBsj1K7h2QeugExN9L8P
+						3CFEXfct9rhH+OBVzgex9dwfli0j9tHswptXQrab8BVM4lAEHcHI0nu5oClWVfdyrdZMjtjxyUkrIDby+HE0GlWOXRoSIZZkXxFiTZZO
+						iH3ps1GMRDEe5Vjlb5Do8U7f9kb4UPWqb1m89xvgr23CSPeuZ7rX6ftpHS+XqG6OWJDpL6+FlO8bso5MvJdrpMCh3b09XOuYe6MY3cqE
+						OCU7DvXWEfvFPR+uaaYic9OP58lkGzgyd3MwSIg1TXogFtTscfg5SvGXPb4kvgfxdGfgNz2B+45h/rQwYm8LU2dusjucGKee7w4+f06d
+						VRP+pNv3F1eCQGyzgxYNxO/loi/mELXOvVwjhf2f39/f03+mHRw8OLRevax+2lyJWEBWkxvFZLJN/W/e6ibEmqAmEPvC+bFrD/ygJnyu
+						3LsgPugK8qeWMHgFa1++OKJKcPpG6L4rAMrC950BDHlVCVT+yRdhPt16Pb+L/eX1QNdggH8XKzVSa6nu5cIcmap7uSArj7XmvVy9hUMr
+						EAgAbLoi9i++ZL+f7vFO33OFL94rOjzkx53GJ46mZJcq14gIseQ2MCHWHDWBWBh92X3PGAh62/NQ1a9hSNHv8oOv13xLD5w+5beqSr/d
+						EbrrHkOyG8Oxmq9FRBGDniC60R7PpKq4Upf90U6jWlvf4BDljJTv5fK3K6ju5cI8se3u5eoqHFp6T8mOo6vfNczviMA9wpiyoCPEtjYl
+						OwTEbu/srKTWFpdXkqup1dTaamqdTLaD11ZWU0vJVTidERErHdTNixDbgJpDLAzU3RQeoV8DZZVj2XeuBns8Ewi/65n8RdVBJwbBgDRS
+						ugQP/0a2iuXibgkPL9yt1l/Xidjq93IxHuUQ5bHyvVzlQ7Ok6sL+FwQPwKYfYk9eGuG/mebu9s58fPvokJMR2+KU7NDBwUE2l1vfSIOy
+						MCGWbB+zwxUHbWptnb0dc3+fEGuoqiD2rzrDQi1xRna5p97vkrq2893BO17GwppvivjrG4G7HnY/udcVePniyPPnxvnd4Eoecnk5ZZXF
+						lZojFh3ro1m6l2uaQDKM/FxuQdfHnXDM9DmH5YkietzsJe9yrIxYXBgBkHstIBaboW9CJhjLksl29E42y04BLR6GJ8Q2oCqI/U1P4LY3
+						wjuvmr7rGuEzzd0d8t3wLaDXQ8eqzK3UP/kifM89gm35y4cxIhl0+9jd4MrmRIe73eN/eb18r/2WOBL9f86P/uU1updrmhhiDfld7Guf
+						h/tcbFKmPndAdeElIxaY393dzTf7XSwXzhRsjh6KRLKrWjj+lSLENqDqiO33jqogpzIfQOBvrzOAHg1bXe/z89/q1Lz9i263R2Bfx/LB
+						B5t9yR0ARKtYHq/c8j7+/H5AlSG3Jt/FklqUYYiFceC9czVY+tAcR2w6nVlfZy9sxai6yTFsQdga25PJtjSOXvynhQixDagKYtFnqW7V
+						Kn3+jr/POXx9OKF6KvjXNwN3vQ9BwfsuNjCVcyv1x7eD3d4ZpOS3lNEhdvb5+IPKZT3k9t4RppD+hnf2al+wEr8JsVYQ9j2QhrFj1v5T
+						spNIJKUIsQ2oCmKrGJ3XnaEA5+td18hrnx/9JFG+/dvljXzWU/Eb0+fPjfc6fdd9i/XcUobfuRbudolPIPsWbg/6qoyPCbEW0cHBwd7e
+						HihrMmKl38U2PyU7iURSihDbgJpALHquXod3wM0mwOl3+/lXsLJfOD923+kHO/lAtvSFANyX7wXAYKS57Xl04W5FEnODrwOCeA/ZO3vP
+						4a/+hopT1wJ97hAh1nTh0FpaWrLCZHbSlOz77N39UuVIJFKzIsQ2oCYQixHkyUts2hy47FsjAF0MbYFPDHN7XYEPuope24RNugZ8XeK7
+						KZDgvqPakJT7Nz3s/VDw9T4/+k1VrMrn7vjf+DwYnU9Qf2qusPcFQdi3/5TsJBJJKUJsA2oCsfX48/vSIJWNU4Vpp9v7wDkMRroET587
+						wCcGYF/i1vq+tgl/dtc3HBz5+dXQ5KM5qZEkM4RDC4htYhR7ZzQ1kdhqzj/4bFrOpxixLb16gkQiySLENiCdEIthK59mR34GGAPWm8Nz
+						8ot4QNkHrsA719ht5D+/Er72oGh2nVYs/y72zK3gVGReaifJcB2IU7I38V0sSCll0bhe+vyhnI+M2FgsDhNiSSRNRIhtQDohlvvtjlCv
+						k70/9qZ3ln87yx5W8kZ6PBNdAz7+Ygr+3S0CHzh9P79a40vZeiw/7oQu9b3OkHd0RmoqyUCBZPvWmZKdvXmipVdPkEgkWYTYBqQrYmF0
+						c6c7AxjRDji9giDcHfL9pifwjgKlv7oZvC+Mgr4Y794VjtDL/fHtYOksAtWteqL4Qk/YGZjmjSUZJoZYy0zJntvF5dYee3UcAZZEalmE
+						2AakN2Jr+rmzYx90Bftdfv4FLb+BLM/WfqPf7xS8SFDzkSjZpT/a4S944sskY8QR2x5TspNIJKUIsQ3IdMRyY+SK8SufRxbGAsa7GL/y
+						F1ncEaY6+2vMxiO7FLEQENvRPyqtkPQXQ6z46gl8EOY+7sRfPcGnZJcqRyKRWhAhtgFZBLHcGLxiCCsNZ33iXO59w/xFFvXMxsNdFrHQ
+						gG/yQk9YWiHpL+z/fD6/2/hMOxojVp6SveUXKJJIJIgQ24AshViYD2fveib5o8i3hek+N5utrM9de+Z27kqIhbyjM2e7w+j3pXWSnsKh
+						hbGjrvPFVjdHLPvRjjgle4vTAJBIJC5CbAOyGmK5f3E9+MDp49MJcKvmKaviKoiFAhOR97tCRFkDhENL7ynZq/sIsfS7WBJJOxFiG5AF
+						EYue8SdfhD/p9guCIL+/4q734a9vlp9aR+XqiIWmIvOnroeyNLm6zsL+FwTPnp5Tsle3jNgx8e1OhFgSSRMRYg8XJyfnHY7o+fMLL764
+						eOKE0ulvfevwa19TOvn00yv/7F/c/53fu/q//+Dcs2+89V8+gVW9lWF+4fyYy+0ZFPxgqvyqiq+GFx54x7/s1Qax0NzCIlFWb4mvnmhm
+						SvYJrV89gQ8aIsSSSJro2CF2bWkpevny7DvvgKC5b3wD1MTC/CuvALExrxe4VTqdSkmbiUKX83Bw0Hn6Q8AViAVoJ/7Bv4A5fWf/7j/8
+						wS8G5D7LGMtPF9/xPupxjwy6vPcdwx/fLjMhaFnXg1gosbT85pUQzdCuk7Dvm/5d7IcD8av+ZHN+4cKUnI+MWBwMuZanZCeRSFzHBbHA
+						J7CKUenaU09FP/hg9vZtEDS7syNF1ycgtsqN4ld+dksVYphP3wid7w7+9MtQoy9WrBOxEPiKsSxRVg+1glitzBGbTmfW1tcBWnqimETS
+						RO2M2K1MBihdePHF/Ne/jr9YVo1KG1V1xNrR9SMWAl8xlsWIVlonaSSG2IODeCJhkSnZ6XexJJJWak/Estu8J05sffObGLli/KrVM7HH
+						HLEQhlkYy84tLErrJI10cHCwu7eXs8aU7EAsvd2JRNJE7YZYDlfmyUkpSDsRYiFOWZqWR1th/+/v7+Na0HTEylOy00CWRGpd7YNYXeHK
+						RYjlAgne7woFJiLSOqllYe9baEr2CZqSnUTSRu2A2OVIRG+4cqHLWV5edrnRGbaPJqdnGkUsBMqe7Q7T5HdaCYcWDiuMHS2BWHr1BImk
+						kWyP2Ojly8vPPKM3XLnQ5ezl85nM5lJyNb64FEss29rxxHJiKbm2vpHb3W0UsVwXesIDPiP2fNuL/y62iSnZtbKMWJqSnUTSUDZGbHZn
+						J/7889EPPpDW9Rd6nP39/e2dHWBpJbXWBk6trW9ube3t7TXdm3b0j9Lkdy2KHVdWmpId1aAbxWXFvo2q6uUIfXtCKpJdEYtDee2pp+Jh
+						o2eDQa+DgSz6oJ22ELpTNl45OJCa15SA2Mu9NC1P8+KXblb4XSwQK0/J3tyNjfYQYDnX2xs9f37+lVcWT5xAV8NfLyN9IVXZy888w1Oy
+						W2snTsy++y4yQW6N/gSf1DayJWL5zeGtTEZaN1DodkBZ9D4YdrSBITZWabkvdQamafK7psUR6/MHOGIv3/Of7gwY7A+7gkBsOp1JJBKL
+						i0vswJBq1/5Kp1LzDgdwCChuffObHKVzb7zBEOtwAJBrS0tS0rrFHhCZnIxeu8YQK75ILv2tb7G7bufP00j3WMl+iF148UUjbw6T6pR3
+						dOa9TpqWpxkxxIpTsmdzufnYgtcXcHkDTo/fYIdGJ/irJ6anp9uer+AcrtTRmYCpgB97heq1a4CifhfuAHk8HGaIfeYZEBclYqBsyjiB
+						ZKRshlhcWuK4lFZIFtNUZJ4mv2tOB+IXELt7e6DsRjq9vLK6uLySWEoaZhS3klrb3Nxq4ynZATn+ujcQDpzDlXrM6zUFctmdHYyP0ZsB
+						8KgPlqUIUtvJToglvlpfoOzbHcEsTcvToMCzkZERQRDcbrfLLbhcgtMtJBLL6XQGdoqrsj3DfmAY4ZNTM6qox7NzfBOX4FWGY5Vv8jg6
+						p9okPDrOojKZQDCEolEB9rvYNpoGAGNT/n5ymL/uzVLfjKI+GNGC+qhbE3ekSRaXbRDLHhy4dk1aIVlYiaXlU9dDGA9J66Q6BJoBafn9
+						/b29vVwut5PNwljYhRQh8kNqLGJvj99blsPFiMImiFJtgqiqm8ixCMOy+C29VD07ipMVw0T22FHL7yfXW/g8UMm1p57CoHZlnl6d1j6y
+						B2JxoYcjT1ohWV6gLMayNC1PQ2JfxypoCgG3+/vsoTTpIXbORRGWgDFi+CZIKdKSbYRVvkk+n5ey4hHYJM8eEy6zye6utMn+PmDLQ1Gi
+						TQG7HIkoyWq7LzvR160+/TQqj0sEKYhkZ9kAsbj8xDGHLkFaJ9lB4CvGsjQtT/3iXAT/2JhS8csZCADE6lFUPs+e+BWfbEcaORwLyIFv
+						wsGs3ASZyJuw3KQIcRMeVdgEf1mIVC97CP0DHwUuP/OMHcmqEvgKysaff97ig29STdkAsThn6DF3O4oo25BEMjIEyobkKFU4j+FLqihx
+						C/aUckkUD2cqDoeKokSxEFsInQN/bqj9vsuMh8N8fmtcBklBJLvJ6oilW8S2VlaclicytyCtk0gaCdSZ6+3lw1YstCuE0K7o5cvsN7WG
+						v2aHpIksjVgcXjh/6Mt/WwuUfa+TJr87UnRu5Y8+mfzex+MvXhxa36j2dXV4YnF4akRaqU/33DF5ExT08sXg49gclgd9s3yhrJRbqYQ6
+						8Nc/XXW5pSCztZXJRM+fB3UweD0mj+CiyfHnn8cwnYaztpOlETt7+zaOKmmFZFuhX3i/K0TT8nCBfN1+PxaqYw9qHbEf3g5/fI/95rJp
+						xHJtb2evDoRxtSStmyQAFVgFXIFYu3/b2oTQH64+/TT9sMdesiJicSTxizUcTzSEbQ/hA73QQ5PfMcmj2NevDgBawBuW/+ATH0fg2trm
+						a5ce8lEjRywS/LKrT96KsxBRr30exiofCstbyQkgzvIr9yPImSNWTlZ2K1URSiGKo9osoR9YePHFtaeeauN7wvUIfEWviB5SWidZXlZE
+						7KL4Ss/Zt9/e+K3fwum0HIkcwyvWthQoS9PycPJhAZiU777Ky8oBJQIBPB7+mzuMxDBwy6P4Ak8vb6XcnBeEv6duOLtdj4BYOZYXp9pK
+						VYQskPgvvxqufk9bP3G4gisxr1cKOt5Clzj7zjuz774rrZOsLSsiNnr+PJ+tghuXrsf5urXNBMR2Dh1ryqoQC7xxsJVFbLdn9MNuDwa7
+						fDDKwyG+LRZ4ehUsxSRHBSHwZ1e9NRGrKoJrezt7rnvEFL4SXKsoeu3a/CuvUMdofVkRsezmcIGvbIYK+mVYe+meZ+I4T8sD8ikfdwLe
+						lIiVY7EKEIJ8CPn4nkMZjmQqxMq3fF/7PMypCcmIRexffBmucqOYb6UqggsFIQSWb2UbIIJrPWKzAJ04QS8MsLgs+rgTyMoRS4+qt6W8
+						ozOgLF2Dk1TaymTm3niD4FqnliMRoqzFZVHEst/Cfu1r7I4xqU0FytK0PCRZ7PVM777LfopDU300Ioz4ibJWlkUROyvOOSWtkNpUU5H5
+						9zpDpv8UhGSucJnF364QvXaNLrmaEFHWymoSsS9/cP9br3SRm/ZvnbwVnU9Ie/MYKzK3cOo6Ufb4Sn5HIBGiFS1OTsaff54uUCyoJhH7
+						u3/e9U9OfPxP/sP75Ob8r//06pB/Qtqbx1s0Lc/x1FYms/Dii/Sme62EixXsTGmFZBkRYs0xIVap5GoKY1mi7DGRfGeYnmnSVtFr1+j3
+						slYTIdYcE2JVAl8xlqVpedpei5OTq08/TbPH6KT5V16Zd5j5Hi6SSlZH7Ilra08OD0VHXkfI6Yi0GvefkJdhzz1pk5f9UTnwcO3cy0W5
+						MWMrObGYf/TaF/KqYSbElmpzc4smv2tjZXd25t54Y/HECXrLrn7ChQtNnWIp2QGxCiIyQAKu6uV7/YeH/acLaf7D+697FNBVmRBrYWWz
+						WYxlaVqe9tNyJMJnnZPWSbopnUqtPv00PT5mER0h9vHjx+G69TuvGz6K5Vwsj1g1iZWIlXOQGIytFGPcAmIZpOVAvqGu/h/+pOPTW05p
+						b5bT9PS09MEcM+Ey/P2u0Oh0VFon2Vzsm9cPPgBfafBqmHApM/fGG9IKyVQdIXbQKXzYFTzdGajH//LPzBvFchYisEHESqNVbCVG8TQc
+						sXKao2Q6+5//cceLHzlUe1VpQRAOnqA6x1GcsjQtTxsIg1f2zevly9I6ySjFn3+eXo1nBUmIRV8+6HR//8Iofx9pTf/Tk7dtcqP4i3Nx
+						FsVRKm1VFrHKUvT3P/2jq//bLz2qvao0ELu3t3dwcMA/oGOoCz1hZ+CYDuXbQDR4NVdbmczaU0/R7WLTxRCLwRIGTIMOqyJWGl8WHndS
+						IlaKUg89q49io3EeUvZGcRGq9XM9iN3a2s7v7x/XoSzT5V6a/M6WWpmfp8Gr6aLbxVaQiNjDQ4yWrInYdnU9iE2nMxjIPjnOjBUnv+vo
+						H5VWSHYQyEqDV4uIbhebLkKsOa4HsRvpNCEWGvBNHufJ72wkYBVwpd+8Wkf4RFaffpo+DhPVPGK//Yeff/uFS+Qm/cNOQmz9oml5rC8M
+						XtGbL0ci0jrJGpp9993otWt8mc4g49UAYk9dP3re+E/Puf6vvxm0pv/dLx2/+3Mn/v77v7K0//Q3oZOXRlQ7WTYhVqXR6ShR1prK7uws
+						njhBg1draiuTwaUP/vLfy0qhJKNUL2K//8mo2zn08NPXLe6xzg8v3Xa99Blq6xDuXLW6+3tw4aLa1dyE2FJNReZpWh6riT/ZtDg5Ka2T
+						rCeMYhdefDH3jW8cfo11+CQjVTdiL4y4+ntTP/mnFnf0wx9cuu08eTkMgKmiLGhcE5zuDKh2NTchtqzmFhaJstbRXG/v8jPP0FQ5ltXs
+						7duz77yT/kf/iMH1a1/b+uY3pQiSUWpgFGsfxLpOXhohxLarEkvLb16haXlMVj6fR98998YbdHPYytrKZHANxPkKp7/1LSmCZJTqR2wd
+						o9grA8iKOXl+QxXVgjcGZvcH/pNyNXflKFZlIPbibcfJS/YaxY6p9jZMiK0i8BVj2eQqDZ7METruxRMnMEKS1kkWFr8YIsSapfpvFNca
+						xf7q/L5M1isDVSjYoutArOvk5Qqj2F+dzxVovTEwsPOr4lilrwwouX7kqk2rXrdSM8TeEEexZyeUexsmxFYXTX5nlvg7EenJYXsJ10P5
+						r3+dEGu8NENsGbpIg9qBTbb6kxwf4PJVGWCcWFhNzoqxs2WwJ1FNzuGwCsbsh1h+o5gQ27iy2SzGsnMLi9I6SX9Fr11bfuYZjGKldfOE
+						wdnDx/Pk+h3sHVz4zu+qAsk1HZ1PSMdcU9IcsRII2bKCRkfs4egqRWxhtQzYxDRyDtUxVhOx+wVOc5wjN3mZJSjc686Ny9TnlwgFyxUu
+						ii3Gf6GUogqXaxohtkVxytLkdwYISJt/5ZXZd9+V1s1WZ3/wt0/e+M6rneT6/W9+eFkVQq7pf/lnt1qhrKY3igs0kqHCGXMUgmVOGnk0
+						aThiy49iFRWQcIuF8Z+IyYqLK1RYGauq2+a4hFueJvWT/7STLP/9NCG2daHrf78rFJig+5Y6Kp1KYfA673BI6xbQlfu+b79wSfXSNDJZ
+						c4OyGMtKh13j0g6xcGEICHMOcfCILr5RrBr2HW1YPGTklvKRNsHwUZGt2o0iFlDkRSvQzoiIUnhIJcQqY0sQq7rdTYjVV6Ds2e4wTX6n
+						k2Je7+rTT6/MW+tWASGWbIythNimXXbw2pRbRKw8AGU3iutGrBr/hRvFcp58k8Kg9siEWA11oSd8zzMhrZA0UvT8+YUXX7TgnGiEWLIx
+						bj/EHg1wZUrV7xqItZgJsdqqc2iMJr/TSvl8fu6NN4BYad1iqoZY5ZSX9bkwqaW4+rI/etQFsSkv5WTMhQmnZRdtqzabr1qaiLO6C4VW
+						zkpt1azYKKVfMYmn2vLUn3H/69UqXIdbqmp1S9N7l4SXs9giXgfkX3WratnKdWPTnparpIGIHexbeO/3LO6HF39KiD3OAmJpWp7WhWEr
+						Bq9zvb3SuvWkI2JFV6RCQ4hlNKqDr5X797pcTymKfVL1mqC2W6pqDVdFrOpjZatrUTGkFcTyycL7T+NvyeWUaIMQ+/y58a/uOW/fG7C+
+						f97hB2Lt8o7iv/pKfEcxIVY7eUdniLKtiL9Zwvh5Rhv6Hc67XzrqQyzrQHEKSePRohEqM+95qyOWQUVOjMylbaUeubBtcUFsQz64ZAPH
+						E8WxhQwVXOTZ8hJPR6JxnoBnVbEJYrlHpUjD07KjTMU+KVthiVKsGmKtxPTIkBdUxCdlVcu3C+Qr5CYWKpVYVLGKjZLLKuTGQ5Q7s1AN
+						zz1e7QJii/NEGnW2JQkUBRXtLoX/9Y867zjDqsOvkpdXVqWjuaB6ESt64rsfqUIs5+8yj6Gqr1wKn7w0wnzRqr408qNLI8+dZbVVtQIm
+						xLYiUPa9TpqWpxnxOV9NebhpbX3jW6901e96EIvOl3edrBsVe+SjVbHrk1dVPSxSliKWpRF7dmUCvq2cRs6TmXXxjFiqavC/UpojiwBA
+						eHERqpyVWUkFFUrhIXKCIiNPnomYoSofqZRCWRxaPI2KRgVLVeXpuZGeZ4IEcm5yEcoSpQSKDQtRRcNNOY20leJjlVZRFtquAC1PyUvH
+						gipbVaFSPnw/I1DcpNTf/pOvVAdeFePKDz22ss+uD7EiWdlkdjeCf90ZsLJPdwZe+mz0Dz4Zx4It/P1PgFh6gaL2morMv99FEwY0puVI
+						xMTX+q+uras6rOpuCLF8obTP5bHygmzW7Up9bnHiYv5hgYez7ru0jy5BLF8onxjmNS8uQpVYzkqqDwLrRGxhn6iSSQssE4w+I6+z0iOK
+						u6bi8LG0tmKGbJiriDqqqlilfo+USWnFjlKKLkQpEav+jJRNkFbFHF73SINmdYtKslUVKpnvPbH55S4mGkPsL75w5Pf3lZ12vaPY//eT
+						EbcwHB6PWNyB8MTFe0GMDl0evyrKgvYHR//6RvBZ7OGS2wOE2NZFk981pJjXu3jihFkPD+MoX1ld4/1Uam09tbaBvxjXVvK5Lk81xIoZ
+						sh6ZdZ3isgghsT/lq5J5X3zUjxeM3lnujlnXLCdW38WVt5VvQsqQOIKfolyJhaq+nhUnbyvXXyqiOGdFE6Q6F0qRalJIUNQiBZ9UyQr3
+						q0WUsjSFwbSqVoWsigOL6qZol5iblHPZipVvFPatXBbL7Sh9IY1M2QJi+e5SZiKXW5Jtmc+ogOGiT1zp3/mzG96Rh6rDT2Ucqzggcei+
+						c2kwm8vtHxxIh3UjjzuNOATfw/lNi3t0KnaxJ/Cji2GnN6yKsqBB2b/m7yguGcgSYjVRYmkZlMU5IK2TKmj29u2FF1808dY6jvLkSooj
+						dnF5Bcsg7kqqos/erIxYu1uGB9kCBmKF8LTq8FN7de2jmwIO3bc+G9za2t5XDGTrRuwno3ZB7Gc9gZOXRuyC2NOdQfEbbkKsXiLK1lT0
+						gw/YZCymSonY5GoKB//mFrRdyZ92ewmxZAMMxIYmH6kOP5U3N7fO32aj2J99NojjVnmvuH7E2mYU+9k9v60Qi1EsPe6kr8BXUJam5SmV
+						9OPXy5eldfOkRCw+r51sFnXDaKCSuobCPDGZrLfnFhalw66C9vL5z+4OIyVGsc0i9oJ9RrH3gicv2wux9KMd3UWULZWlfvyqROz6Rnp3
+						d/dAPPTJZOsbAL3YOmKdwvD4zJLFHR57xBHr8gZVURZ0cGSKEGuYaFoepcz68Wsl4SgvQiwd+ST7CJeDrSL2+XPj1/sCXQN+6/vn10Jo
+						yM1+f9egOsqC/smVMNvDhFhDBMq+30WUNfPHr5VEiCXZVxoglv2wBP5o7NmPxF+YWNjf/XjsWf700EditUsSWMWFuj179mg/yybE6qR8
+						Pv9eZ+g4T8vDZ6Yz68evlUSIJdlXWiD27MR32cJEWR5YzBgRMsQ+W1iwtDlrS0yI1VUXeo7p5Hcg6+KJE1bjK0SIJdlXrSIW4U63F52+
+						9fWTL0IvfzbiFjzSuoWFSv7pZ2F2QUCjWDMEyh63aXksy1eIEEuyr1pFrL1+A/NWR8gTnFRFWdCo5FtfBivdFSDEGiAgtnPouFDWynyF
+						CLEk++oYIfa9zsDPbITYDjbNjjhvgXqfE2KN0T3PxHGYlsfifIWUiI0tJPocwoDDPeAUNPf09MNsNjvk8gygiJJY3e0QYrEYb7Ku1QiP
+						jKIIt2fYnGaK+5k3E9KvGoLXj/yH/QGzmukPst6jZcRetBFigxga2gexoe+x57PUOxwmxBom7+jM2e5wG0/LY32+QkrEBkbGv7znOylP
+						lqWdz9wMuATv/Pz83UGvKsoYn7/jD4XDBwfspAZrdarGqevBAacb/T66EVWUMeb7GRXgH65+1UDODF5O4adfhlRRBhiFDor7GXVoHrHP
+						fjz+IzvdKPbb6UZxR1B8+JlGsSYrMBF5v6s9J7+zBV8hHOUyYv3hsU+7h/V4VhGdw5DbOzs7e6vPo4oyxqc7A/5gCF0wKAvS61QN9P59
+						Q0JudxfdiCrKGGM/O9zevXye4UckvSqBVkbOuVwOnKs0PtTVKBTcRC+9v79PiLWc+SiWEGsRTUXm3+tst2l57MJXSInYQGj8QrdPJ8QO
+						urwzkcc3+7yqKGMMxA77g4Afulwg9qZuiH0wJKCvNxGx2M84m3ApAemK2Mzm5qBDMAuxAw5he2cHV+etItbl8QFgFrc/OCoh1hdSRVnQ
+						qCSNYi2lyNzCqTaa/M5GfIWUiPWFxvRDbL/L+/BRxETEeoYDnD1zc3M6VYMh1iGk0xkTETvg9II9GN6BN7oiFv0kOGcWYvsdwtbWNjrq
+						lhD73Nmxv/oqiINDNBYs68D3L4SfPyfPx66KtZoDqKrYjxBiraLE0vLbHUFTpuUZHh7Ghy5rZHSUf/DT09NSUEHLy9KbllWbBINBvgn6
+						bv+tW2v/6l/hL4+anZ0VYw6RhofI4ptsiSMeLjmxkUI1DEKs03zE7hiA2CHWgeDTVEUZYwmx22xaN70Ru75hJmJRNJjaEmK5Adrvfjz2
+						3XJzwljJE6gnzkxxejhU2NK15ZVkO5Z+F2slJVdTxk9+h8/YLQg4M/Oy0DkdHODTRxQWlFEsRgxHPOvCZBU2Sa+uJv7jf1xLJqXw0k3k
+						rQqbsKgnT7A6OTk1OT2NZalmRgnlVUNsR3I4OIOFM9FcZ8fRaVLNHcn4oTpxVcTGhkvSq/xqMBcXq1GXy1WgBmIbbWZvGvsNVtWqKmI1
+						bWaFChBixVOKqQ7EMhKUH2lZzxPf+2iCXQp8ZIPailcA4kVAuRc8EWJNFPj65hVDp+XBCeh2C9lsdnk56Q+E4EAwFAyFQuEw/mEBqzyc
+						RzGxKJZGjuKbhPv6V373d8N9fSWbhCttwqJC4bn5+dzu7tj4xPj4JOBr8IGHwmoithHCxYbXk50loKqG2N70cDRdJn+QMhpTB9Z2+QrU
+						g9jGQM480xlNvqoIqYZYjZvJra4AIbYRxH48/sL5sa/67TEHwMmL4T/6dPRWSbgFfavfj6qWfbUTTIg1V6AdxrJzC4vSus5Ch+tyCzs7
+						Ow639/I9v/g1RzM+//Gt2D/65/irCq/pD7uCg043EIuGAwC7e3vS2NYo1URsHGlkBvDVw8PhXrZ6Jpo+w8IZ1ZQdfelYsApixUyUOWC0
+						x4qQzMPBJ1aiHCWW25uOr+eOVhUurQB2dXXENtHMUjpWQawezSytACG2McTiA7PN3HBfiW938o+poixoVPKtL0OEWMuKU9aAaXnwCaMn
+						YqPYXM7p9uIAVh0Mdfqln/dM/IN/gb+q8HqMcx89ABAL4S8OPIPvFaOwWqPYpAyGM1He9RdohN4fwzL+V96kHOEqIzY2LGYlb4KhJAdb
+						ET9E9hxFFcrl1TgKL7gJxDbeTIBQzbzKiNWjmWUqQIhtBLEfsQ/MNq+e4Ii10asnxD1ctMNFE2KtoHw+/35XaHQ6Kq3rIyViHULziP3P
+						vw784BcDqsA6zTuL7e0dHHL8K1qDDzwUVvu72EIvX4IufldW3dE3gNjCd4owB1hD7FFvUnBTiG2omTOd6yVjyiqI1b6Z5StAiG14FGuf
+						38XaD7H0dicri1NW12l5OGJjCwmMmx0tjGJbMc79fgf7ieHE5OTU1BSOOoMPOxRXz+NOUv8OHig4wcOloZ7ko/ufCh5URKwCZoUx2VER
+						SZYVz7zSHdQy7ClfgboQW38zj5BZBONKiNW+mRUqQIhtALHP2guxN2z26gmxH1F0JQUTYi2lCz3hAd+ktKKDcALu7u3ldndNRCw6i3Q6
+						wxHLnjKWqmaQUFw1xNZyMd4quhJiDXMNxNZync2sOIo1yoTYxhBLb3fSwxyx9OoJu6ijf1S/ye9ANHRGe/m8FRALozIGH3itIbb87cpS
+						2xyx9TaTEGuMtUSsbR534oi1y+NOhFhbCYi93KvLtDz4jN1uAd2uuYjFITc+Pjk+McnfLmvkoYeiWhnF1mmbI7ZeE2KNsWaIff7c+LW+
+						oOo3J9b0yUshtOKGHX5idGtA/NEOIdZWcgam9Zj8Dp+yWxDQH1kAsROw5X60o5EJscaYENsAYiXLvy35aMy6ls5JsRX8jRmqBJYy358f
+						j9Hbnewl7+jM+1pPywOeud1ugM10xM7MPHr0KEKI1cmEWG3dFoiVflIiAuwsfyGRNc0G3M9+xN5HyJ7RPWv12orVE6tKP9qxm0anoxpS
+						Fp8wOlzpRztmIzYL5XI48MxFLNhzurP5V3BU8uV7fo7Y3iGPKsoYX+0dViJWp2qcv+OXEauKMsbYzyrEqhJoZRmxH3axt74bbBSqAWJf
+						+mwUzbCFftYR+skXYWnF8nrlYphdE5TscG4kIMRaWVOR+bc7guCRtN6CGGL572KzWYfLZMTmcjkMYXH1AMRK9TNESsQuLicFX9Dl8bk8
+						fqemdnn904+i6XTGHwy7hwOa51/TqMDs/AJHLPZyIDSiUzXGJh/i0wyPjJnVzOlHjyXE5vdHx8Z1qkZodAKIHZ+cFpC/Vx2rt9Gi8amH
+						rSL25GV7/Sg2aJfHiXFBoNrVShNira/E0vKp66HNzS1pvVlxxPr8bI4zcxEL9izE44tLS+gQDD7slIhdWV1Lra0vr6wuLq8klpIaejm5
+						mlrfQCeYzmRWUmua51/dKA6NAhJy4nyx6Ii3trb1qMZScnV1bR3NzGxuosEGNxPGfl5b38DxjCsJGKxFNVArVbIWjXatptbQRpyDOGCQ
+						v8EtRYkot9X5Yk9etNGrnYLonmz0ix3sXhrF2lqaTH7HEHtwsLu7a/qNYoBnYnJyenra+GNOiVh0W5nMJrpO1AfU19DIdmt7m72KOZcD
+						3jTPv6ZRgR2xR8Y1DHpd1ESParBmbm3ncjnWzG1zmsnfFHbw5AmMYxvVQKAqWavOZNBMtBFCcdrnX9OowPb27t4eLpGbROx3Pxo7aaO3
+						J3YGfmafUSwG3GxGoKPnnopMiLWLwFeMZXE5K603JZyAe/k8eiKTESv+LpZNZmfqKBbjvMfRaHR2dnZuTnNvbW2hdfF4fK4kyhiDBzip
+						cVqjyfpVY2Mjjeu25MrK3Py8KsoYYz/LzVxZWdWpGsvLSTRzbW3NrGamUms4nFCHZhFrqxvF792029sTK/AVJsTaSKAsxrKtTH6HT3lp
+						aQlnpvk/2plgr54w97vY0Ohk75Bw64Fwq8+rre8PegSvL5FIOFweVZQx7h3yjIyM8JNav2rcHfQOuQSU4nJrvw/rMd/Pct+lXzWQM0oZ
+						dAq3+0z4QG8PeFA0KgCAEmKt5QJii/a20oRYeykrTssTmVuQ1hsUPmN84rgWNh+x4nyx/BafkYceipIR6x8Z/7R7WKcf7Tjdwxjx3Orz
+						qKKM8elONnUvPmjs21gsplM1Tl4a6XeyGf5xUKmijDHfz7yZ/NhWJdDKyBmXg4PO8t9y6m0UiqL3oRYR6xK8oKzF7fL4OGKdwrAqyooW
+						hkXE0ii2fQTKvtfZ5OR36Ip4Z2E6YvmU7Ob+LjYQGtfvd7GDbm8kOnvTPMT6AiG2ew8O5ufndaoGENvnYNMPm4hY7Gf+VBekK2K3trcr
+						PUikt/lZk83lwNSmETv2vbOMsvjMpL+W9eWR3z83/hxqi+WLJbEW848ujTx3ln8RW74fIcTaUWDk+01Ny4MT0O1m07WajtjVVApu41dP
+						DLi8M6a+esLrC6BTxrhHfPWEXojtHRIymU0TETvg9ILxbISn52AaOaczmUHzXj3R72CM32v6iWKGWOlAl96TYE2jet/9iC+AW4WQkmQW
+						ceHVE3yBENtWAmUv9IQboiw+YXS4Vnn1hPh8Jr2jWCcDsZ7j8nYnz3F4uxMQC6aio24SsbJFMLAHjK1pqYZnx549O8mravHaFiyytpwJ
+						sbYWKHvPMyGt1BJDrDVePZFOZ3Z3d8FX1MfgA48Qq6GtgVh6gSJTbcTyH24+iyHXR+z1hNY0f26IVZK/oBguSWMdK55yqtiJEGLtrs6h
+						sTonv+OIHZ+ctAJiJ+w5X2ydJsQaY0Jsw6NYZgy/rGxb17bEhNg2EBBb57Q8OAF39/ZyZt8olhGLo44Qq4cJsdq6vRBLNtCE2PaQd3QG
+						lM3XmjAAg0aclvi4rYBYQJZuFOtkQqy2JsSSmzQhtm1Uz+R3+JQDgQD6I9MfdxqfOJqSXaqcISLEamhCrDEmxNrYhNh20lRkHpTNVp6W
+						B58yTclOiNXKhFhjTIi1sQmxbSZQ9tT1ipQFzwTBA7CZjliakl1XE2K1NSGW3KQJse0nPvld6bQ8+ITR4brcgumPO+GQw0VA1gJTshNi
+						WzEh1hg3iFgnakuyipxuQmwbqixlGWItNSX77m6evovVx4RYbY2cbYPYnZ2d1dRaYjEZSyyTzXU8sbyUTKYzGUJs+6l0Wp7M5ia6CYu8
+						emJ9fZ3Pg2bwgUeI1dCEWGNcN2KfsK+CcO2KPh2UXVklm+4UOmIcoOJHxT8pUvtoc3MLY1mZsj3uiQfDEzQlOyFWKxNijXG9iIWwho+c
+						neTZLIazJJPFvg6T3hPLPyBSmwknGsayU5F54PaPPx358y9COEutMiX7pMlTsgOxX9z3nrwUBiq09ZmbAY7Y7kGPKsoYn7/jVyJWp2qc
+						uh6UEauKMsbYzyrEqhJoZRmxP/0ypIoywCi0XsRCfCzLXFW//sr94q8fkJv2zy8PoSeV9mYV4SMivra18vn8mVuhn3whAXV08hFCdEXs
+						c2fHLtwNou/7sjeguurniEWnLE3Jvr9v8OWdErET05H7Q57eIaF3yK21BY8/vLAQ73cIgFAvK0WVQG8LI+OTHLGrq6kBp17VcAh+fJqD
+						Lo9ZzfT6QxJi8/tDUjVUaTQwDmYg1iF4+xymNNM96B6uF7F1Crnc8MfJTft//mlP6TOlpGMoDGT/8toRTU93BtDt6orYjgeBO96Z677F
+						ruHZ7iH/C+eP7sQeIdYCU7Kz70pSa4mlZHxxKZbQ0omlZeScybAvv5eSq5rnX93xxHKClb+eFSezwxVVZnNTj2okFpPJ1RSamU5nUKDB
+						zYT5ft4pTGa3tbWNdfFBH3XKVox2La+spjMZGMcM8sceVqXR1Xw/157MriEhl8crO+Sm/b+8RYg97kLfOuCb/ONPR2TCwX94fpQ97qQb
+						Yl/6bLTPHejwJbnveh/++mZAji1GrMmvnhAfRUjj3+raOpY1NDJGd4xB5Pb2DopYTWmcf02n1jY2N9mg5+DgAJRFTfSohrj/0iAcmgnK
+						mtHMdQBenpIdBzaqgUBVspbNmok2bu/sbOiSf02vo124YAJTCbFWMSGWBOHiF5Q9db2IpoGJiH6IffniSK+rNmJjsThsLmJxgmxvb6Nf
+						1kNoGnpA/AEApCAjlcuhAoAr9i32Ly62dKoG++UVmpnP8ydsjNdRM3FNub+vUzWw97APIdOaubvLxukHByYhdtL73A/PfueHZ5/rXFRH
+						6eOrZ89+5+w0FlydX2LB1em96uj5sWP6V7wCjh65Mkj5Y0dhQzGc+R2vS9xWvwoTYklK4SwNjEc+6Qk//7djf3MzqOuN4hv9/i5vBHy9
+						MRzrdQaUX8fKiEV92KN2piIWYxN0nei2UAc9zKUKNNKQ1OqSKA3NpQo00pDUTPH9ZTqZSxVopFnpZiGWc04VqIFBRJGF6nDm6R//EOzE
+						3y9/NSmtfueHPVd5LNvwy+fEbdWIVWRIiCUZKZyMuA52u4XH83Fdfxf7/Lnxz3qCgiB0Dfhe+qzM407pdAZsA1+VfYQxQmFKxKISBleA
+						RGpaAK1Jo1g+OuSUxbK4ALYxgDl6nnvnS3HsyFnIEhSHcDpKq4zWbBmwXPzVOzxc8hEpRfOUnJFlRrFnpzlc60BsUQWk9KxFIrDFTa5K
+						tVLXoYoJsSSVOGItMiV75PHjaDQq3uEzVIRYkn1lHmKZRVABriWIlVf5gipESlYYCvO/LBlP+Y73V0gm41lhtjkvsTicmRcx6X2uANqj
+						cE5TcSuO2LIVYH9FoPJYsawydahiQixJJYZY8Vfp5k/JLr56gk/JLlXOKBFiSfaVuYiViOjifxtHLF8oRaw46BRHtHI4zL797bnK/pYj
+						31ERXz73To1RrKoCYs7YqgfD4u+c7SnciIZL6lDVhFhSqXCKskc2rDMlu/jDbKlyhogQS7KvTEMsg6V8H1V+9Okd8TYsQMUHjjKrVCGF
+						9PzGbBFij6KYlTdplVwsg70CYnlZ1RGrqoCEUpasMC5XNbCweXUTYkmlwgmJseO+ZaZkB+/Ra0iVM0SEWJJ9ZfYotqxl2lUJaUcTYkml
+						wglJU7ITYkk2FSHWQibEkkqFU1QQPHuN3yieSGxJWTSulz5/KOcjI3ZMfLsTIZZEql8aI1b1RkByQ6YXKJJKdXBw4G5qSvYPB+JX/cnm
+						/MKFKTkfGbHs5/TiewMIsSRSndISsX/5uePF9x+Qm/Zr5/vz+by0N0kkdpfYWlOy8zfmoNeQ6meICLEk+0pLxJJIJG1lHcSm05m1dQDO
+						5CnZCbEke4kQSyJZVwyxBwfxRCLb+I3iH1+LvHVrtjn/53MTcj4SYul3sSRS4yLEkkiW1sHBAaCSa3xKdm0fd+K/iwVi6e1OJFL9IsSS
+						SJYWTtF9Nnl1w1OyazyKTWfkKdkNJpwSsVMPI0Muwe12CzrIHwiurq66dMm7Lk1PT/N9m0ql9KuGS/CiFIdLWjVe2M/yIaRfNZAzSsHR
+						YpaGnKwChFgSydLC6YjTdV/nKdmrWH7cif0udsLkKdkDI+Ofdg9/7+OjGeO1MvYt2DM3N3+rz6uKMsanOwOhUFicQ+gwFovpVI2Tl0YG
+						nOxwwkGlijLGfD/zZvJjW5VAK7OzZn9/0OnGAayKMsAoFEWjmdjVhFgSybrCCYnxDM5MSyDW7FdP+ENjn3b7dELskNP7ODp7s8+jijLG
+						QCyGd3v5POgzPw/E6lINILZvSMjmciYidsjl5UcRrCtis9nsoMM8xDoEPmUsIZZEsq7472JxrjaKWM1/F2uFKdl9obELuiF2wOWdefT4
+						pnmjWK8vkMvlMO6Zm5/XifRA7IMhIbO5aSJisZ93slmwR9fBNHLOZDbBObMQ2+9wb2/v4JqJEEsiWVQ4GdENsR/tNP5EseZvd2IvnjB7
+						SnZdEdvv9D58FDERsZ7hAGMPEDs3p1M1OGLxaZqJWKdne3ubPWGwv68rYtc30jh0zUOsAKbifCHEkkgWFUNss7+L1fZxJ3TK8pTsQKxU
+						P0NEiNXQ1kCs9zggFkUTYkkkS4sj1ucPWOHVE4lEYnFxiT2oItXOINVAbEdyODiDhTPRXGfHUbUbdVXExoYPa2T+ajAXF6vRtGsgVqNm
+						VkWsEc2sjViNWloVsbq3lBBLItlADLHilOxN3CjWyhJixVdPsF+VSFUzTvUgVpOuvyJie9PD0XT5/DuS8WhMHdiU60Fs682shlhDmlkn
+						YltvaTXEVmqpds0kxJJI9tDBkyd7NCV7VcTGkUbuGfnq4eFwL1s9E02fYeGx4fXkqzyBOEBhsb1FnWwVxIqZKHPAGIgVEQ/GOtfZwhNE
+						oddmJUpRTw7FclHEeu5oVXTZ0uGaiG20mWUDqyBW22YWMhQTKypQD2Ibain2Z2nRcBXEVmqpZB7eyAeqCoEJsSSSPYQT0jpTsrNXT5g6
+						DUCFUWxS7i7PRHmHWOijOcnUPJthzFD0+3BlxMaGxazk+5YSI3ksAFAoCIFHUYVyeTWKNilXOlzHKLbBZpYLrIxYzZtZvgL1ILaJlkqx
+						CldGbOWWys2EG2ypqgKEWBLJHsLp6HZb5tUT4ya/eqLid7GFPq7kCzw2WOmUhj6yG0EscuZdPBvPsW69qHutxZ4ymzSP2EabWSawImK1
+						byZcpgL1IbaRliq5qHBFxFZpaR2IrbZzFCbEkkj2EHiGzmKv8RcoamUZsVaYkr3K405Sr4f+TtF78nDVCAMDI5ay0IlzV0KsoouPDfOb
+						gUVFiDcSkY/YI0urzGLKcj1y2dLhOh93qr+ZZQMrIVbzZnKXVqBexNbd0sIwV0Xiioit2tKk1EwENvKBllaAEEsi2UPiqyfcTUwDoJVl
+						xK6mUrDtXj1R2u+XdSXEGuYaiK3lss0sDaz2uJMOLq1AbcTWcp0faCXEGmNCLIlkA+FkRE/U3O9itbKM2Kw4JTt7w5+RgG0VsTOd6+L4
+						o5ZtjtiyzSwTaCxiy1SgZcTW+4ESYkkkUg1ZB7HpdGZ3dzefRxdx1EcYo9YQW69tjth6bfAottQtI7ZeE2JJJFINccTGFhJArNcXQK9h
+						igadR/PFooMwFLCEWE1NiDXGhFgSyR46KEzJjs53bX0jsbQSSywvxJcMcyyxtJRczWQ2OWLFWcgMFSFWQxNijTEhlkSyh0C0ZDKJPjc6
+						OwcATEzPjE09TCwtJ1dTMJaVnn70eHmFhc/F4qqo2MIi32Ry+pEyfPLhI74JEijD4cez84haWV2Lzs0/ijwOBILsd7Gm3igOjU7eHxRu
+						PPDceODV1j2D3iH38OPZOYcL+atjDXDvkOD1BTliE4nEkD7V6B7wPhC/WXe5zWkm388yYvWrhtPtAWIHHe5b/dofLTV9q89D0wCQSDYQ
+						TsdIJBIKhYLBUCAY8geCvkAwlVrb3t6BfX62KjoEj45NbKH32t6Zm18oRLFwLIDKfJNgKKzcBKtbbJudRGJZtclM5LGY2/b0w5lAEAot
+						xOPoMkx8ohi8n3wYGRmfDo9PhcYnNXR4fBpDdgzWI49nRyYfYlWVQG+jRFw3ZUXE5vN5XNboUQ1kOBuLpzMZHCG4ijKlmdjP2zs7QCwU
+						W2DXgjpUYyoSnU+nMwvxxfGpGVOaictcnFk0mR2JZHUdHBywdyiKbypGF4y/8pNHAB4PxOgHzuVySIkImKUvhLON5E3yeSQr2kScP0fa
+						JJcr3QR/+Z3qnZ0dc3+0s5paW1vfWEmtIWQpuaqhMY7HoAeXGpubW6m1dQzfVQn0Nq4e+DNl+Lixz1ETPaqB/YYdiCsndPdYML6ZfD/j
+						MMOVBIQjCtVAoCpZi15ewZGygTYCcjx/hKjS6Gq+n3HK4NwhxJJIlhY6I1CQc5GRT+Qo65+ePGHwQ7gctbuL3hnhiJTpK0aI87zyTfb3
+						kUy5CULkTeRSkAA0Zf3gkyfIkwMbsSjRUMAWI1bqN7e38U9jg2nZLPYAWop+Xx1rgLe3sX/ZZ3HwBPscNdGlGmimeJ3EmpnNqmMNMJop
+						gocdWOL7t1k1dPhAWTMhnAX65F/T7HASr1AJsSSSdYXzEecku3koDjTZKct6YTajHIwFrB5FYR09F9uKIVMO51HSJpVyEzfB6lEU7wXF
+						KL6JmBQBhgrlyYjFAIhhntVae4mNw05gjZWCjBWvAG+1jtVAMaC4NZrJDy0pQmuZ20zWTlaBA0IsiWR14aRUmUsVCMtShcOy6gyHZZWG
+						GCYUqkQsu1Mtcl574x8vEZc1ynBjzK6lpApw6VUN/NM1/5rGP4Xau5k4VAmxJBLJukKHpEKs3EmRSBYXIZZEIllahFiSfUWIJZFIlhYh
+						lmRfEWJJJDMVnVv5o08mv/fx+IsXh9Y3NqTQcgpPLA5PjUgr9emeOyZvgoJevhh8HJvD8qBvli9UknJDpeTwK/cj1XPQUIRYkn1FiCWR
+						zBTI1+33Y6Em9lpH7Ie3wx/fc2C5acSurW1+2O2ZfLjI8zFGhFiSfUWIJZHMlDyKff3qQDabBduw/Aef+DgCgbTXLj1EyFWXmyMWCX7Z
+						1SdvxUGIqNc+D8tDYXkrOQHEWc5HnzJi5ZRlN1SVwoWy5OoZI0Isyb4ixJJIZoqTDwtAFzjKA+Vl5WgSgaAdD//NHUZiGLjlUXyBp5e3
+						Um7OC8LfUzec3a5HnJFyAl6iakNVKVyIIsSSSHWKEEsimSkVYgEwTrWyiO32jH7Y7cFgV/VVKN8WCzy9vJVyc7kgBP7sqrcexJZ+4Uo3
+						ikmkhkSIJZHMFMinfNwJbFMiVo7FKigI7CEEeFOGI5kKsfL93tc+D3NkQjJiEfsXX4Y5OyvdKOYbqkqBZOhigCvnrLcIsST7ihBLIpEs
+						LUIsyb4ixJJIJEuLEEuyrwixJBLJ0lIhNjo7F9NH2WwWxSUSCWndcOXzed5kSL9qbG1tIf9UKiWtGy6+n7n0qwZyRv4bGxvSuuFC0agA
+						IZZEIllaSsSGRid7h4RbD4RbfV5tfX/QI3h98Xjc4fKoooxxr8MzMjLCe1/wVadq3B30DrkE9PIut/b7sB7z/SxjRr9qIGeUMugUbg+Y
+						8IHe7vOgaFSAEEsikSwtJWL94bFPu4e/9/HY98SHwjT0Wx0hp9s7Nzd3q8+jijLGpzsDwVCITcB2eIgxkE7VOHlppN8p7OXzgiCooowx
+						38/7Imkg/aqBnPf29gad7u9fGFVFGWAUOuhwA6j4QAmxJBLJuipCbGj8QrdPJ8QOuryPHkdvmodYXyC4K86cPzc3r1M1gNg+h7C9s2Mi
+						Yodc3tzuLptN9eBAV8RubW+Dc2YhdsDh5nPsE2JJJJJ1pUSsLzSmH2IHXN6ZR5GbfV5VlDEGYr2+ADpljHswmNapGkBs75CQzmRMRCz2
+						887Ojjhr+b6uiE2nMwMOwSzE9jsY4/fyeUIsiUSyrgxDbL/T+9BUxHqGAzvZrN6IfTAkbKTTZiLW6d3e3gZfwRtdEbu+kTYRsSgaTN3b
+						2yPEkkgk64oQq6EJscaYEEsikewhQqyGtgFiO5LDwRksnInmOjuKo1TuSMYPpTSvBtOqxFURGxsubFjWrwZzcbEONVy5AoRYEolkDxFi
+						NbRdEFsX5JAymo5H2TtHG0Nsb5ptWJo/kCnmVq8rV4AQSyKR7CFCrIa2BWLj+NA56vjy4eFwLwa16TMsQWx4PflqISVgzAe7DSFWzErO
+						ByNaVkQ8GOtcZwtPEA4G9x5FPTlMn+lNx9dz0rKcVeUKEGJJJJI9hA6JEKuVbTKKTXL+nYlywonEBeQw7uR/j1LOMAyvJ880gNjYsMjv
+						AhpzIk1Fy6NYEbFHUZyv0mi1KH2lChBiSSSSPUSI1dC2+S62Nw2kFX8dy8adndJYVpGSf3W6XjdikTPHNhu5sjvSdSKWo70MYstVgBBL
+						IpHsIUKshrbR404MZkHpRrGMN+kGcnFK8Y6uEsbMlRCrwDa2Sp8p3IsWixDvDKOIsjeK5VqVILa0AoRYEolkDxFiNbQNEFvZRXir5UqI
+						NcaEWBKJZA8RYjW0nRE707muuEtcy4RYEolEqi1CrIa29Si2IRNiSSQSqbYIsRqaEGuMCbEkEskeIsRqaEKsMSbEkkgke0iJ2InpyIBT
+						cLvd6EA1l9PrX1iIO13SqvEKhsc4YldXU/pVA1cSQOygU5d9WI+cHr+MWP2q0e8UEeuUVo1Xn9NDiCWRSFaXErErq2srqbXEUjK+uBRP
+						LGvoxNLyamotk9lEv7yUXNU8/5pGo1Jr69lc7uDgIJ/PZzY39ahGYjGZXE2hmRvpzPJKyoxmsv3MJrM7OIC3trZRDdRKlaxVLy4h23QG
+						2sQxo33+tYwSUS5NZkcikawuJWLRO29spNfWN0Cj1ZSWRsbokbd3dtAtgrKa51/TaNTm5hafkh0jPEBIj2qwZqYzyBzjSCwZ30xUANiT
+						p2THJYVYjQ1VshaNdiFbfJRoKdqref41zfczTclOIpGsLiVi0XOi10TPpYeBN/SAGEHu7u6qogwwhApgYIf2ohdGTXSqBmumKFOaCbNm
+						gjRiM7GgVzN3d1k7kf/enirKGKMCaB0+UEIsiUSyrpSIxdhEGgA9eaK5RbHi8J8qygAXdNRqrKjSaGJRLHNIFWWMRRWaKUqVQBOLkopQ
+						RRljUYdYIMSSSCTrCh2SErEYlMidFIlkcRFiSSSSpUWIJdlXhFgSiWRpEWJJ9hUhlkQiWVpKxJLJNjUhlkQiWVGEWHIb+GeEWBKJZEGh
+						Q8rn85nM5vLK6uLySnI1tZpaU/0MkUy2qtdwxPLjlhBLIpEsJ/RI6Ji2trdTa+srq6mVFHvBE5lsG+OgXV1bW9/g77SSDmtCLIlEsogO
+						njzZy+ez2ey2+FoiJiyQyfYxjt58Po8jWTqmCbEkEskiQr/05MmTA/GttmSyHS2+LkUBWEIsiUQikUg6iRBLIpFIJJIuIsSSSCQSiaSD
+						Dg//f9NW31MZe1iBAAAAAElFTkSuQmCC"/>
+			<rect v:rectContext="foreign" x="0" y="36.75" width="472.441" height="282.715" class="st1"/>
+		</g>
+	</g>
+</svg>
diff --git a/doc/guides/sample_app_ug/index.rst b/doc/guides/sample_app_ug/index.rst
index 775e2f7..260f6a5 100644
--- a/doc/guides/sample_app_ug/index.rst
+++ b/doc/guides/sample_app_ug/index.rst
@@ -57,6 +57,7 @@ Sample Applications User Guides
     l3_forward_virtual
     link_status_intr
     load_balancer
+    flow_distributor
     multi_process
     qos_metering
     qos_scheduler
-- 
2.7.4



More information about the dev mailing list