From 835ee551faa81614b906847eee5f3529ba900e9e Mon Sep 17 00:00:00 2001 From: Rajendra Dendukuri Date: Mon, 8 Jun 2020 00:18:49 -0700 Subject: [PATCH] SONiC Default Configuration HLD - Initial Revision --- manageability/SONiC_Default_Configuration.md | 748 ++++++++++++++++++ .../default_interface_flow_chart.drawio | 1 + .../images/default_interface_flow_chart.png | Bin 0 -> 36404 bytes 3 files changed, 749 insertions(+) create mode 100644 manageability/SONiC_Default_Configuration.md create mode 100644 manageability/images/default_interface_flow_chart.drawio create mode 100644 manageability/images/default_interface_flow_chart.png diff --git a/manageability/SONiC_Default_Configuration.md b/manageability/SONiC_Default_Configuration.md new file mode 100644 index 000000000000..c5d77394dc10 --- /dev/null +++ b/manageability/SONiC_Default_Configuration.md @@ -0,0 +1,748 @@ +# SONiC Default Configuration + +# High Level Design Document +#### Rev 0.1 + +# Table of Contents + * [List of Tables](#list-of-tables) + * [Revision](#revision) + * [About This Manual](#about-this-manual) + * [Scope](#scope) + * [Definition/Abbreviation](#definitionabbreviation) + * [Feature Overview](#1-feature-overview) + * [Requirements](#11-requirements) + * [Design Overview](#12-design-overview) + * [Functionality](#2-functionality) + * [Target Deployment Use cases](#21-target-deployment-use-cases) + * [Functional Description](#22-functional-description) + * [Default Configuration Profiles](#221-default-configuration-profiles) + * [L2 Switch Configuration Profile](#2211-l2-switch-configuration-profile) + * [L3 Switch Configuration Profile](#2212-l3-switch-configuration-profile) + * [Erase Switch Configuration](#222-erase-switch-configuration) + * [Default Port Configuration](#223-default-port-configuration) + * [Design](#3-design) + * [DB Changes](#32-db-changes) + * [User Interface](#36-user-interface) + * [Data Models](#361-data-models) + * [CLI](#362-cli) + * [Configuration Commands](#3621-configuration-commands) + * [Show Commands](#3622-show-commands) + * [IS-CLI Compliance](#3624-is-cli-compliance) + * [REST API Support](#363-rest-api-support) + * [Flow Diagrams](#4-flow-diagrams) + * [Unit Test](#9-unit-test) + +# List of Tables +[Table 1: Abbreviations](#table-1-abbreviations) +[Table 2: Requirement Traceability Matrix](#table-2-requirement-traceability-matrix) +[Table 3: Default Configuration Profiles](#table-3-default-configuration-profiles) +[Table 4: L2 Profile Platform Constants](#table-4-l2-profile-platform-constants) +[Table 5: L3 Profile Platform Constants](#table-5-l3-profile-platform-constants) +[Table 6: IS-CLI Compliance](#table-6-is-cli-compliance) + +# Revision +| Rev | Date | Author | Change Description | +| :--: | :--------: | :----------------: | ------------------ | +| 0.1 | 06/08/2020 | Rajendra Dendukuri | Initial version | + +# About this Manual +This document provides information about how switch configuration files are managed in a Broadcom SONiC switch. Some of the behavior may also be applicable for community version of SONiC. +# Scope +This document describes the high level design of how default configuration of a SONiC switch is created. The topics discussed in this document are limited to Broadcom SONiC. + + + +# Definition/Abbreviation + +### Table 1: Abbreviations +| **Term** | **Meaning** | +| -------- | --------------------- | +| RPC | Remote Procedure Call | + +# 1 Feature Overview + +When a SONiC switch boots for the first time, the SONiC configuration is created using templates provided as part of the image. These templates are used to create a configuration file */etc/sonic/config_db.json* which is loaded into the Config DB. In addition to the */etc/sonic/config_db.json*, there can be other files that can be created during this process. This first boot configuration is referred to as factory default configuration or simply default configuration throughout this document. A more detailed explanation on the framework used to create the default configuration is provided in the [SONiC Configuration Setup manual](https://github.com/Azure/SONiC/blob/1e289547d1a58ffc1ade50bfd6f0b28016be8566/doc/ztp/SONiC-config-setup.md). + + + +The various conditions under which the default configuration is generated are described in this document. + + + + +## 1.1 Requirements + +### 1.1.1 Functional Requirements + +- 1.1.1.0 - A predictable configuration sequence must be defined when a SONiC switch boots for the first time. +- 1.1.1.1 - The user must be provided a method to restore a SONiC switch to its default configuration state. +- 1.1.1.2 - The user can be provided a method to choose the first boot configuration state the SONiC switch needs to be restored to. +- 1.1.1.3 - The user should be able to save the switch configuration state as a named checkpoint. At a later point in time, such a saved checkpoint can be specified as an input to specify the intended switch configuration. +- 1.1.1.4 - The user must be provided a method to restore a selected switch port's configuration to its default configuration state. +- 1.1.1.5 - All configurations derived from a port configuration must be removed except break out configuration. The port will continue to be in the broken out state when switch port's config is restored to its default configuration. The default speed of the port will be defined by the breakout mode configured on its master port. +- 1.1.1.6 - When a switch port is being restored to its default configuration, configuration operations on the port are allowed only after the configuration restoration procedure is completed. +- 1.1.1.7 - The user should be able to save the configuration state of a selected switch port as a named checkpoint. At a later point in time, such a saved checkpoint can be specified as an input to specify the intended switch port configuration instead of the default configuration. + +### 1.1.2 Configuration and Management Requirements + +- 1.1.2.0 - The user must be able to view and choose between one or more available default configuration profiles. +- 1.1.2.1 - The available configuration profiles are identified using a unique name string. +- 1.1.2.2 - When the user changes the default configuration profile setting, the switch configuration is restored to the default configuration defined by the newly chosen default configuration profile. + +### 1.1.3 Scalability Requirements +N/A +### 1.1.4 Warm Boot Requirements + +N/A + +### 1.1.5 Requirement Traceability + +### Table 2: Requirement Traceability Matrix + +| Requirement No | Requirement Description | Supported Release | +| -------------- | ------------------------------------------------------------ | ----------------- | +| 1.1.1.0 | A predictable configuration sequence must be defined when a SONiC switch boots for the first time. | 2.0 | +| 1.1.1.1 | The user must be provided a method to restore a SONiC switch to its default configuration state. | 3.0 | +| 1.1.1.2 | The user can be provided a method to choose the first boot configuration state the SONiC switch needs to be restored to. | 2.0 | +| 1.1.1.3 | The user should be able to save the switch configuration state as a named checkpoint. At a later point in time, such a saved checkpoint can be specified as an input to specify the intended switch configuration. | Future | +| 1.1.1.4 | The user must be provided a method to restore a selected switch port's configuration to its default configuration state. | 3.1 | +| 1.1.1.5 | All configurations derived from a port configuration must be removed except break out configuration. The port will continue to be in the broken out state when switch port's config is restored to its default configuration. The default speed of the port will be defined by the breakout mode configured on its master port. | 3.1 | +| 1.1.1.6 | When a switch port is being restored to its default configuration, configuration operations on the port are allowed only after the configuration restoration procedure is completed. | 3.1 | +| 1.1.1.7 | The user should be able to save the configuration state of a selected switch port as a named checkpoint. At a later point in time, such a saved checkpoint can be specified as an input to specify the intended switch port configuration instead of the default configuration. | Future | +| 1.1.2.0 | The user must be able to view and choose between one or more available default configuration profiles. | 2.0 | +| 1.1.2.1 | The available configuration profiles are identified using a unique name string. | 2.0 | +| 1.1.2.2 | When the user changes the default configuration profile setting, the switch configuration is restored to the default configuration defined by the newly chosen default configuration profile. | 2.0 | + + + + +## 1.2 Design Overview + +### 1.2.1 Basic Approach +The [SONiC Configuration Setup](https://github.com/Azure/SONiC/blob/1e289547d1a58ffc1ade50bfd6f0b28016be8566/doc/ztp/SONiC-config-setup.md) feature is used to create factory default configuration of a switch. Appropriate factory default configuration hooks are used to define and generate the default configuration files. + +Broadcom SONiC supports the following default configuration profiles: + +### Table 3: Default Configuration Profiles + +| Profile | Description | +| ------- | ---------------------------- | +| l2 | Layer 2 Switch Configuration | +| l3 | Layer 3 Router Configuration | + +As part of the default configuration generation step, the following actions are performed: + +- A */etc/sonic/config_db.json* file is created according to the configured factory default configuration profile +- The switch platform's config.bcm file is adjusted according to the configured default configuration profile + +### 1.2.2 Container +#### 1.2.2.1 Management Framework + +In Broadcom SONiC, the management framework docker container will mount the host volume */usr/share/broadcom_sonic* in read only mode. This allows the REST server to access available default configure profiles and also know which default configuration profile is currently active. + +### 1.2.3 SAI Overview +N/A + +# 2 Functionality +## 2.1 Target Deployment Use Cases +While configuring and managing a network, it is a common practice used by the switch administrators to try different switch configurations. The SONiC switch is expected to come with some predefined configuration which satisfies the first level of basic configuration expected on a typical network switch. The ports need to be defined, appropriate port configuration parameters like speed, MTU and administrative mode need to be set to a typical configuration. The default configuration profiles provided by Broadcom SONiC are intended to provide such configuration which can be used as base to build more complex switch configurations. + + + +It is also a common practice among network administrators to restore the switch to its base configuration state, the default configuration, before they start to rebuild the configuration. This is required for taking a switch offline or to re-provision it. The default configuration state helps the user to place the switch to an identified predictable configuration. Similar to the switch configuration, it is a common practice to undo a configuration made on a single switch port. + + + +## 2.2 Functional Description +### 2.2.1 Default Configuration Profiles + + + +A *default configuration profile* can be described as a set of configuration templates and scripts use to to generate configuration files. In Broadcom SONiC the following files define a configuration profile + + + +1. Description: */description* +2. Config DB configuration template: */templates/config_db.json.j2* +3. scripts/factory-default-hooks/10-render-config-db-json +4. Configuration rendering hooks: + - ConfigDB *scripts/factory-default-hooks/10-render-config-db-json* + - config.bcm changes: *scripts/factory-default-hooks/09-swap-bcm-config* + + + +The constituents of a default configuration profile will be adjusted as per the needs of Broadcom SONiC. + +The default configuration profiles in Broadcom SONiC are defined in the below mentioned source code directory. + +``` +organization_extensions/vendor/broadcom/ +|-- config_profiles +| |-- l2 +| | |-- description +| | `-- templates +| | `-- config_db.json.j2 +| `-- l3 +| |-- description +| `-- templates +| `-- config_db.json.j2 +|-- extensions.sh +`-- scripts + |-- config-profile-migration-hooks + | |-- 08-config-profile-backup + | `-- 08-config-profile-migrate + |-- config-profiles + `-- factory-default-hooks + |-- 09-swap-bcm-config + `-- 10-render-config-db-json +``` + + + +The *l3* profile is selected as the default profile used on a newly installed image. The contents of the file */usr/share/broadcom_sonic/config_profiles/active* on the SONiC switch indicates the current configured default configuration profile on a switch. The profile name (l2, l3, ..) is used to refer to a default configuration profile in the code as well as user commands. + + + +The organization extension script *organization_extensions/vendor/broadcom/extensions.sh* is used to copy the configuration profiles infrastructure into the switch image as part of SONiC image compilation process. The below diagram is a representation of the configuration profiles that are available on a SONiC switch. + +``` +root@sonic:/home/admin# tree --charset=ascii /usr/share/broadcom_sonic +/usr/share/broadcom_sonic +|-- config_profiles +| |-- active +| |-- l2 +| | |-- description +| | `-- templates +| | `-- config_db.json.j2 +| `-- l3 +| |-- description +| `-- templates +| `-- config_db.json.j2 +`-- scripts + |-- config-profile-migration-hooks + | |-- 08-config-profile-backup + | `-- 08-config-profile-migrate + |-- config-profiles + `-- factory-default-hooks + |-- 09-swap-bcm-config + `-- 10-render-config-db-json +``` + + + +The factory default hooks in config-setup infrastructure are also prepared as part of the extension script. + +``` +root@somic:/home/admin# tree --charset=ascii /etc/config-setup/factory-default-hooks.d +/etc/config-setup/factory-default-hooks.d/ +|-- 09-swap-bcm-config -> /usr/share/broadcom_sonic/scripts/factory-default-hooks/09-swap-bcm-config +`-- 10-render-config-db-json -> /usr/share/broadcom_sonic/scripts/factory-default-hooks/10-render-config-db-json + +``` + + + +When a SONiC switch boots and there is no configuration defined in the switch, the factor default configuration is generated using the scripts listed in the */etc/config-setup/factory-default-hooks.d* directory. As indicated above, the scripts *09-swap-bcm-config* and *10-render-config-db-json* are executed which use the profile name defined in the file */usr/share/broadcom_sonic/config_files/active* as a key to generate the *config.bcm* and *config_db.json* files. + + + +A command line utility */usr/bin/config-profiles* is provided to configure the default configuration profile. + + + +``` +root@sonic:/home/admin# /usr/bin/config-profiles -h + Usage: config-profiles < check | factory [profile-name] | + get factory | list | set factory > + + check - Verify if user provided configuration profile exists. + factory - Load factory default config if factory default + profile has changed or if startup config '/etc/sonic/config_db.json' + is not present. + get factory - Display configuration profile currently marked as factory default. + list - Display list of available configuration profiles. + set factory - Set user provided configuration profile as factory default. + help | -h - Display this text. +``` + + + +The sonic YANG model provides an RPC to modify the configured default configuration profile. This RPC takes, default configuration profile name as input. As a result of this RPC action, the current running configuration is removed, a new startup configuration is created using the new default configuration profile and the created startup configuration is applied to the switch. The *config-profile* command is used to initiate the change of default configuration profile. The *config-setup factory* command is used by the *config-profile* command to create a new startup configuration. The *config reload* command is then used by the *config-profile* command to clear and load the newly created configuration. + + + +The following sections describe the switch configuration defined by the supported default configuration profiles in Broadcom SONiC. + +#### 2.2.1.1 L2 Switch Configuration Profile + +The following Switch configuration *(l2/templates/config_db.json.j2)* is rendered as part of L2 default configuration profile: + +- Device metadata + + - Hardware SKU name (hwsku) + - MAC Address + - Platform Name + - Type: ToRRouter + - hostname: sonic + - default_config_profile: l2 + +- VLAN 1 + + - All ports are members of VLAN 1 + - Spanning Tree Enabled + - Forwarding Delay: 15s + - Hello Time: 2s + - Max Age Interval: 20s + - Bridge Priority: 32768 + +- Bridge Ageing Time: 600s + +- Spanning Tree + + - Enabled + - Forward Delay: 15s + - Hello Time: 2s + - Max Age Interval: 20s + - Spanning Tree Mode: pvst + - Bridge Priority: 32768 + - Root Guard Timeout: 30s + +- Ports + + - Administrative mode: Up + - Speed + - MTU: 9100 + - Spanning tree: Enabled + - BPDU Guard: Disabled + - BPDU Guard - do_disable : Disabled + - Root Guard: Disabled + - Port Fast Mode: Enabled + - Uplink Fast Mode: Disabled + +- KDUMP + + - Enabled + - Max number of Kdumps: 3 + - Memory: 0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M + + + + **Platform Specific Configurations** *(09-swap-bcm-config)*: + + The following platform specific configuration is adjusted in the config.bcm file for L2 default configuration profile: + + ALPM is disabled + +### Table 4: L2 Profile Platform Constants +| Broadcom Chip | Max FDB Entries | Max L3 Host Entries | +| ------------- | --------------- | ------------------- | +| Tomahawk | 136K | 8K | +| Tomahawk2 | 256K | 8K | +| Trident2 | 288K | 16K | +| Trident3 | 288K | 16K | + + + + +#### 2.2.1.2 L3 Switch Configuration Profile + +The following Switch configuration *(l3/templates/config_db.json.j2)* is rendered as part of L3 default configuration profile: + +- Device metadata + + - Hardware SKU name (hwsku) + - MAC Address + - Platform Name + - Type: LeafRouter + - hostname: sonic + - default_config_profile: l3 + +- Bridge Ageing Time: 600s + +- Ports + + - Administrative mode: Down + - Speed + - MTU: 9100 + +- KDUMP + + - Enabled + - Max number of Kdumps: 3 + - Memory: 0M-2G:256M,2G-4G:320M,4G-8G:384M,8G-:448M + + + + **Platform Specific Configurations** *(09-swap-bcm-config)*: + + The following platform specific configuration is adjusted in the config.bcm file for L3 default configuration profile: + + ALPM shared mode "2" +### Table 5: L3 Profile Platform Constants +| Broadcom Chip | Max FDB Entries | +| ------------- | --------------- | +| Tomahawk | 40K | +| Tomahawk2 | 40K | +| Trident2 | 16K | +| Trident3 | 40K | + + + +### 2.2.2 Erase Switch Configuration + +A switch's default configuration can be created and applied as the switch startup configuration upon user's request. The following operations are available to the user: + + - **Erase switch configuration excluding management configuration** : This operation deletes the existing startup configuration JSON file */etc/sonic/config_db.json* and all other application configuration files in the */etc/sonic* directory. The management interface configuration in the startup configuration file is retained so that the user can access the switch using the same management address along with other factory default configuration after the switch reboots. A new startup configuration JSON file is created during the switch bootup. It includes restored management interface configuration and the switch factory default configuration generated from the current active default configuration profile. + - **Erase switch configuration** : This operation deletes the startup configuration JSON file */etc/sonic/config_db.json* and all other application configuration files in the */etc/sonic* directory. The management interface configuration in the startup configuration JSON file is also removed. The SONiC switch boots with a factory default configuration file. A new startup configuration JSON file is created during the switch bootup. It includes the switch factory default configuration generated from the current active default configuration profile. + - **Restore switch to first boot state** : This operation removes all the changes made by the user to the SONiC switch files. All user installed packages and file changes are removed. It also deletes the startup configuration JSON file */etc/sonic/config_db.json* and the files in the */etc/sonic* directory. The SONiC switch is reverted to a state similar to a newly installed image. After the SONiC switch is rebooted, if the Zero Touch Provisioning (ZTP) feature is enabled, the SONIC switch will start performing ZTP to discover and download the switch configuration. If ZTP is disabled, a new startup configuration JSON file is created during the switch bootup. It includes the switch factory default configuration generated from the current active default configuration profile. + - **Cancel switch configuration erase operation** : For all of the above configuration erase operations to take effect, the user has to reboot the switch after issuing the erase command. If the user wishes to not proceed with the configuration removal operation, the configuration erase cancel command can be used to undo the previously issued *configuration erase* command. Also, if a configuration save operation is performed it cancels the pending configuration erase command. + + The wam-reboot operation cannot be performed if there is a pending configuration erase operation. If the user issues a warm-reboot command, it is aborted with an alert message. + + + +### 2.2.3 Default Port Configuration + +The default port configuration of a switch port is also part of the switch's default configuration. The sections [2.2.1.1 L2 Switch Configuration Profile](#2211-l2-switch-configuration-profile) and [2.2.1.2 L3 Switch Configuration Profile](#2212-l3-switch-configuration-profile) provide details about the port configuration that is created for the corresponding default configuration profile. The default port configuration is applied to all ports of the switch. + + + +The switch administrators, as part of provisioning the network, configure various parameters on all the switch ports. It may involve VLAN membership, network protocol configurations, port specific parameters like MTU or an IP address. Most of these configurations are not defined as part of the default configuration. After going through various configuration steps, the user may choose to revert all the changes done to a port's configuration. This operation can be performed easily by issuing the *default interface interface-name* command. The port's configuration is reverted to the configuration defined by the current active default configuration profile. Only port breakout configuration of the port is not modified as it alters the identity of the port. + + + +To perform the *default interface* configuration operation, the user has to issue the corresponding KLISH command. + +``` +admin@sonic:~$ sonic-cli +sonic# configure terminal +sonic(config)# default interface Ethernet 8 +``` + + + +The port configuration restore operation is performed as an RPC action by the REST server. The RPC action is initiated by the KLISH CLI command and uses interface name as input. The *default interface* KLISH CLI command is blocked until the RPC operation is completed and feedback is provided to the user. The *default interface* RPC command can also be issued by a REST client. No configurations are allowed on the port, including a parallel instance of the *default interface* command. while a port is going through the port configuration restore operation. A STATE_DB table entry is used to mark the port to be in a busy state. The CVL validation layer in the management framework will make use of this busy state to reject any configuration requests on the interface. The busy status is also used as a gating check to initiate the RPC command and this allows the REST server to not allow more than one parallel instance of *default interface* command on the same port. As the *default interface* command is designed to be a synchronous operation, there is no status command available to the user to view the operation's progress. + + + +#### Dependent Configuration Delete Operations + +The first step of port configuration restore operation is to identify all the configurations performed on the port and remove them. The REST server uses the YANG configuration representation model of the SONiC switch to identify the dependent configuration and the order between each dependent configurations. Delete operations are then issued by the REST server to remove each dependent configuration in the identified order. + + + +#### Default Port Configuration Template + +After the dependent configuration delete operations, the next step is to configure the port to the default configuration state. A port's default configuration profile is represented in the form of a jinja2 (j2) template file. It is accessible to the REST server in the path */usr/share/broadcom_sonic/config_profiles/active-profile-name/templates/port_config.j2*. When the *default interface* command is executed, the port configuration restore operation creates a port specific configuration file using this template file. The contents of the generated file are used by the REST server to configure the port to its default configuration state. + + + +# 3 Design +## 3.1 Overview +## 3.2 DB Changes +### 3.2.1 CONFIG DB + +The active default configuration profile value is set in the DEVICE_METADATA table. + +``` +table: DEVICE_METADATA +key: DEVICE_METADATA|localhost +field: default_config_profile +value: l3 +``` + +### 3.2.2 STATE DB + +A new table **PORT_CONFIG_STATUS** is introduced to mark a port state as busy. This will be used to block port related configuration from the management framework. + +``` +table: PORT_CONFIG_STATUS +key: PORT_CONFIG_STATUS|Ethernet0 +field: state +value: busy + +table: PORT_CONFIG_STATUS +key: PORT_CONFIG_STATUS|Ethernet0 +field: state +value: ok +``` + +## 3.3 Switch State Service Design +### 3.3.1 Orchestration Agent + +A few changes are expected to be made to configure the **PORT_CONFIG_STATUS** table entries while executing the *default interface* command. More details will be added to this section after implementing the feature. + +### 3.3.2 Other Process +N/A + +## 3.4 SyncD +N/A + +## 3.5 SAI +N/A + +## 3.6 User Interface +### 3.6.1 Data Models +``` +module: sonic-config-mgmt + +--ro factory-default-profiles + +--ro factory-default-profile* [name] + +--ro name -> ../state/name + +--ro state + +--ro name string + +--ro description string + +--ro active boolean + + rpcs: + +---x write-erase + +---w input + | +---w subcmd? string + +--ro output + +--ro status? int32 + +--ro status-detail? string +``` + + + +``` +module: openconfig-interfaces-ext + + rpcs: + +---x default + +---w input + | +---w interface string + +--ro output + +--ro status? int32 + +--ro status-detail? string +``` + + + +### 3.6.2 CLI +#### 3.6.2.1 Configuration Commands + +For SONiC switches, the following CLI commands are provided to manage default configuration. + +#### factory default profile < profile-name > + +**Description** + +The *factory default profile* command is used to set the factory default configuration profile of a SONiC switch. This command removes the current switch running configuration, creates a new startup configuration file using the input default configuration profile name. The newly created startup configuration is also applied as part of this command. This command may result in a loss of switch connectivity as it results in a restart of all SONiC application services. + +**Usage** + +``` +factory default profile < profile-name > +``` + +**Example** + +``` +sonic# configure terminal +sonic(config)# factory default profile l2 +``` + + + +#### write erase + +**Description** + +The *write erase* command is used to clear the existing switch configuration files except the management interface configuration. The *write erase* command deletes the startup configuration JSON file and all application configuration files in the */etc/sonic* directory. The management interface configuration in the startup configuration file is retained so that the user can access the switch using the same management address. For the *write erase* command operation to take effect, the user has to reboot the switch after issuing the write erase command. If the user wishes to not proceed with the configuration removal operation, the *write erase cancel* command can be used to undo the previously issued *write erase* command. + +**Usage** + +``` +write erase +``` + +**Example** + +``` +sonic# configure terminal +sonic(config)# write erase +``` + + + +#### write erase boot + +**Description** + +The "write erase boot" command deletes the startup configuration JSON file and all application configuration files in the /etc/sonic directory. The management interface configuration in the startup configuration JSON file is also removed. For the *write erase* command operation to take effect, the user has to reboot the switch after issuing the *write erase boot* command. The SONiC switch boots with a startup configuration which is created using the current active factory default configuration profile. + +**Usage** + +``` +write erase boot +``` + +**Example** + +``` +sonic# configure terminal +sonic(config)# write erase boot +Existing switch configuration files will be removed, continue? [y/N]: +``` + + + +#### write erase install + +**Description** + +The *write erase install* command removes all changes made by the user to a SONiC switch. All user installed packages and file changes are removed. It also deletes the startup configuration JSON file and the files in */etc/sonic* directory. The SONiC switch is reverted to the same state as a newly installed image. For the *write erase install* command operation to take effect, the user has to reboot the switch after issuing the *write erase install* command. After the SONiC switch is rebooted, if the Zero Touch Provisioning (ZTP) feature is enabled, the SONIC switch will start performing ZTP to discover and download the switch configuration. If the ZTP feature is disabled, the SONiC switch boots with a startup configuration which is created using the current active factory default configuration profile. + +**Usage** + +``` +write erase install +``` + +**Example** + +``` +sonic# configure terminal +sonic(config)# write erase install +All SONiC switch content will be restored to default values, continue? [y/N]: +``` + + + +#### no write erase + +**Description** + +For the *write erase* command to take effect, the user has to reboot the switch after issuing the erase command. If the user wishes to not proceed with the configuration removal operation, the configuration *no write erase* command can be used to undo the previously issued *write erase* command. The *no write erase* command can be used to undo the *write erase boot* and *write erase install* command as well. + +**Usage** + +``` +no write erase +``` + +**Example** + +``` +sonic# configure terminal +sonic(config)# no write erase +Switch configuration erase operation will be cancelled, continue? [y/N]: +``` + + + +#### default interface + +**Description** + +The *default interface* command is used to delete all the all the user configuration of a specified interface(s) and restore it to its default state. + + +**Usage** + +``` +default interface < if > +``` + +**Example** + +``` +sonic# configure terminal +sonic(config)# default interface Ethernet 0 +``` + + + +#### 3.6.2.2 Show Commands + +#### show factory default profiles + +**Description** + +Use this command to list all supported factory default configuration profiles. It also specifies the current active default configuration profile. The current active profile name is used to create a startup configuration file when the *write erase* command is used. + +- Name: Profile name used to refer to a default configuration profile +- Description: A descriptive string + +**Usage** + +``` +show factory default profiles +``` + +**Example** + +``` +sonic# show factory default profiles +Factory Default: l3 + +Name Description +------------- ----------------------- +l2 Layer 2 Switch Configuration +l3 Layer 3 Router Configuration +``` + +#### 3.6.2.3 Debug Commands +N/A + +#### 3.6.2.4 IS-CLI Compliance + +### Table 6: IS-CLI Compliance +|CLI Command|Compliance|IS-CLI Command (if applicable)| Link to the web site identifying the IS-CLI command (if applicable)| +|:---:|:-----------:|:------------------:|-----------------------------------| +| show factory default profiles | SONiC | | | +| factory default profile | SONiC | | | +| write erase | IS-CLI drop-in replace | write erase | https://www.cisco.com/c/en/us/td/docs/switches/datacenter/nexus9000/sw/7-x/fundamentals/configuration/guide/b_Cisco_Nexus_9000_Series_NX-OS_Fundamentals_Configuration_Guide_7x/b_Cisco_Nexus_9000_Series_NX-OS_Fundamentals_Configuration_Guide_7x_chapter_01001.html | +| write erase boot | IS-CLI drop-in replace | write erase boot | https://www.cisco.com/c/en/us/td/docs/switches/datacenter/nexus9000/sw/7-x/fundamentals/configuration/guide/b_Cisco_Nexus_9000_Series_NX-OS_Fundamentals_Configuration_Guide_7x/b_Cisco_Nexus_9000_Series_NX-OS_Fundamentals_Configuration_Guide_7x_chapter_01001.html | +| write erase install | IS-CLI-like | write erase | https://www.cisco.com/c/en/us/td/docs/switches/datacenter/nexus9000/sw/7-x/fundamentals/configuration/guide/b_Cisco_Nexus_9000_Series_NX-OS_Fundamentals_Configuration_Guide_7x/b_Cisco_Nexus_9000_Series_NX-OS_Fundamentals_Configuration_Guide_7x_chapter_01001.html | +| default interface | IS-CLI drop-in replace | default interface | https://www.cisco.com/c/en/us/td/docs/switches/datacenter/nexus7000/sw/interfaces/command/cisco_nexus7000_interfaces_command_ref/d_commands.html#wp2521540877 | + + + +### 3.6.3 REST API Support + +This section will be updated with the supported REST API after implementing the YANG data model. + + + +### 3.6.4 Service and Docker Management + +N/A +# 4 Flow Diagrams +**Default Interface Configuration Command Flow** + +![](default_interface_flow_chart.png) + + + +# 5 Error Handling +N/A + +# 6 Serviceability and Debug +Appropriate log messages are generated by the REST server as part of the RPC command handling the *default interface* operation. + +# 7 Warm Boot Support +N/A + +# 8 Scalability +N/A + +# 9 Unit Test +| ID | Description | +| ---- | ------------------------------------------------------------ | +| 1 | Display the list of available configuration profiles and current active factory default configuration profile. | +| 2 | Modify factory default configuration profile to a supported profile name. Verify that the switch configuration is cleared a new default configuration is created as the startup configuration and applied to the switch. | +| 3 | Modify factory default configuration profile to a non-existent profile. | +| 4 | Modify factory default configuration profile to the current active factory default configuration profile name. No change in the switch configuration must be observed. | +| 5 | Issue write erase, reboot. Verify that management interface configuration is not modified and other configurations are restored to default values. | +| 6 | Issue write erase boot, reboot. Verify that all configurations are restored to default values. User installed packages in SONiC o/s remain intact. | +| 7 | Issue write erase install, reboot. Verify that all configurations are restored to default values and all user installed packages in SONiC o/s are also removed. | +| 8 | "no write erase" to cancel a previously issued "write erase/write erase boot/write erase install" command. | +| 9 | Issue write erase/write erase boot/write erase install command followed by config save and reboot. Verify that the configuration erase is not performed and the switch uses the saved configuration file as configuration. | +| 10 | Issue write erase/write erase boot/write erase install commands. Issue warm-reboot command. The warm-reboot command should fail indicating that there is a pending configuration erase action. | +| 11 | Configure factory default configuration profile as l2. Issue "default interface" command and verify that the interface is restored to L2 default configuration. | +| 12 | Configure factory default configuration profile as l3. Issue "default interface" command and verify that the interface is restored to L3 default configuration. | +| 13 | Issue two "default interface Ethernet 0" commands in two sonic-cli sessions. Only one of them should succeed and the other one fails. | +| 14 | Issue "default interface Ethernet 0" command and while it is in progress,and add port Ethernet0 to a port channel. The port channel member add command should fail. | +| 15 | Issue "default interface Ethernet 0" command and after the command exits, issue a command to add the port Ethernet0 to a VLAN. The VLAN add command should succeed indicating that the port Ethernet0 is ready to accept new configurations. | +| 16 | Verify that the STATE_DB table PORT_CONFIG_STATUS indicates busy state when the "default interface" command is in progress. It should be set to ok, once the "default interface" command exits . | diff --git a/manageability/images/default_interface_flow_chart.drawio b/manageability/images/default_interface_flow_chart.drawio new file mode 100644 index 000000000000..67c1fe2c8128 --- /dev/null +++ b/manageability/images/default_interface_flow_chart.drawio @@ -0,0 +1 @@ +7Vptk9o2EP41fLwbbOMXPt4BTdKm7XVIp71PN8KWbSWyRWVxQH59JFvym8zhXDA0IdzMYa0lWdrd59nVmpE1S3ZvKFjHv5MA4pE5DnYjaz4yTWPsOfxLSPaFxHXcQhBRFMhOlWCJPkM1Uko3KIBZoyMjBDO0bgp9kqbQZw0ZoJRsm91CgptPXYMIaoKlD7Au/QcFLC6knj2u5G8himL1ZGMs7yRAdZaCLAYB2dZE1mJkzSghrLhKdjOIhfKUXopxvxy4Wy6MwpT1GfD4XzB9evgb/fm0WH/8lSbPv/0V3xhymmeAN3LHcrVsr1QAA64R2SSUxSQiKcCLSnpPySYNoHjOmLeqPu8JWXOhwYUfIWN7aV6wYYSLYpZgebd4pnjQwc1JUUY21Icv7Ug6CaARZC/0s0sTcN+FJIGM7vk4CjFg6Lm5DiCdKCr7VXrmF1LVX6N2TetLvmCmqx5j7uhCxdsYMbhcg3zvW461pgIzRsmn0kP5xu5DhPGMYELzmazQ86Hvlz1rd1aePbGF3UKSMmVntUBIGdy9bBNdh3KApUAioe/I5rbCUYmWuIahyXggrdua1gMYgg1mTyhlkIZCuYJJkgSkAb96l948UBJRmGWaZWhMktUmO4FlAgC9sNMyju/BVTiEZSZNyxiTDtOYHaYp7XVy27g9eCgN7gSj85aPQZYhv6lpuEPsX8FBt7ZsPdbuzHeSnvLGXjVSvvjaINF8rN+rhuUtNe6EhGX3JCzD6rZpzWZ2h8mUrDexySc8EA6KymUm46bLmNOWJxT7lKPqYejIRJbZmqhQhDZR7lXltr+Bek3N0/4gmq9xbLGmd3EWQJ/BKu8gPGAtFpgv2b4f2XMuARhFqXBOKNiECwRGEU8l7uSNBAVBHi8xWEF8D/xPUR456zSdf3pDXmY9cllVrlH3w8NwO8gPN+Nby7S/zW9UFxKGGRzEkl4HZThYmG3FLyJx8chTRynjjyjFr6eWGrFUNHOEWowGsVQ8c4Ba8tYDpIjrR7jRpfhmekm6KelFRSj3lXSjTeSdl26mHZkeT4rbDqhnCfUUIgZr0S/ZReKQdRtisvVjni/ecgdJUAqYoI/OROTrs8ATpBclDZXGs7X0wu3wHWuo5KIInQ0r5JzUzPDGIQaRmCrl/5Yf7j4snuY6VVRnHeMUabkt/jqTv/wjI0FNXnzOkBSWyDmWFDqDmW1ytUmh8tjjWeGBc+x5aNqaThs+M2mfD/rSdHsiq51eDp0V6mfDGch8IJBujucQ81gsGIKjUBAEC4vkK0TRhnIFkvR6ecLyLs4TepDVeeL7KmI5feHvddvqTGUsR1N8CZV3VUnlWpEx6YsMezBkXG9ZxehdV3EuGUHbubLTToJ7H3Tc5kT2mQ86hn4cn1EIci5YE1Hbnom0Ok+7Zdn1ZwwtjeVeOoaqPfw4MVSp738eQ9UyGzFUwWOWw4Nf8FMq92Y9lqrSQED8TZKr6BhMVoWJ3q/KwmYDZEdRBI3Ahm4XiqaOawHnNCUE22gDRC8heOeMpAoO1xhJvZ5AMi/7hsI4VSRthWS3/UJy4Ehq6tWqGYaAjn7Wq16Koc7lY+h3Vq8a+k2D2beIZV60iNXGu/faIlb71abb9rShiUMvYv34Lxssx24q3R7sZQNvVj/XKoxW/ejNWnwB \ No newline at end of file diff --git a/manageability/images/default_interface_flow_chart.png b/manageability/images/default_interface_flow_chart.png new file mode 100644 index 0000000000000000000000000000000000000000..72c2df90e88c0172f0de961fb0be13380d8843e1 GIT binary patch literal 36404 zcmeFYXIN8B*FQ=TP(W-H0Ra_}-aAMq^pXTZAoLO-K&T<~rXm6Yq7)I4CS5?KNtY(l zyC_|x_uk7Hp8J0O=bY<&I3G^=^om!qGkeY2Gi%nY`K_|Up*pHp$r;EA2nepKt0}_? z2ncZm1VqD^NkK~radk8S!R1^W#1Mz|w#7K13D|^{{<&fk62Q9HU~DmH8#ZBOHX$J) z0U-fi0Wt7jUqF;iSV2$(dTp@8W^`hxVV}mUd|8e;c%2d@)W=mTW>Q zqI?2?lmm%zwsGxP>@fEPZTsM*}J=70g;Nh z7@q*2u!MjlpP;ZLxB+oOTjShaoWZS&JK~^8&(hY?9rJ&9*v0J7I7_>KW~XWHr6{a! zZ-7FmN}5}tc$I{#?f;oE9_{Xd0j&Nbu>U^#qBG9N75z`E4H}QJ2IIJBbp;ag_?P&i zMHm9aZ-cS4bGO8T+n9eP?`r9)=!Nk0u+s5X^A>@d8)zcIj4l{BTY@S5=V4I5idXO- zCgKLJI7dkrAqZ4N&{oUK%1T$;5Q-B~)VI;ZiW?fJyNU}!btE*AR(ePuIMToyrY0(> zp@R3pO8D9vDk})6+xTi5SqeBIZQN}{C7lhht`I>zVH93d#X$`(s;wa63K3OyHgd4^ z74gwWLOpbCy|wh9mMY$AhSo59MYxK#y{;2dNdxMrEr@V*5!O^!M7j8AJ18pa3Ru~> zN;IU52Ub#0$<7rAH8j#zw{+2TQWjV61cHZIt7s{SIXXKCd5Wq^*kiC- zf+$sO4{;y3f(^=2NlU>#zwas%WUI zYK!9?MU)&=?8LONqRJR08%-s5aRWnltcswPfuWd=kUkoxg~uvk-MmE|#69hmylp&; zw5{x|?Sy^tND(nXS37lIAW3HdN2sW`r>L?$R8`vuqUDRV^o2=?so|Y`1>J1~EzwXb zRTW``rk*y|z!`^7R9Cg}k+f3Ov9TA{RB%NoU|cS?hq|b{l@h`Ti}X~twD&Qzvvarc zv=p?{HnOu5#OnLlJ2|SOlst_zG#u^p92Kl2#hfHXBoK-kaI7lQ5{0zacElmDx*{r0 z3U*489y;1S4j1dGXrPaQp!85WKHeC8Wt^^&nx&B|&_y31aXU%0lAVsYot}e)s3jDJ zGP1{uIk|d5pdN-2DvCI9ln2zt%F|a3t>=u_QZ;li(8J>$EY)>XB-}3~=x*0;?P^pO6VcjIXt+Z6JHo_1jOygoMnw}DN zP*nw-imM%7$V$Xk$WYr;0dBA2W~ivEse^$idBIg72ni=~Pdyz)1p`GjjD$B5q9OsT zsERif0T&S!^VPGl6?RoN#2QIjJ2@G+JE;kKN$7a#0>&4U(y{Up*8|kPNJ)f>x2CEp z+!x~LB%+4Ww>QG73ae=OXn0Fl+v~%9oE;o|98}!J&`4Ex6@-qOE(Gb~rRre-ldu+1 zw3NUZDZ8pWxWmOA;I6jzShOQnOcU*-0@rg8b~4m+&`0apI0=bi)liOTeGzvnWjA|g zC0hhS-45k0a4`TB9IXknf#Wb9cmoIL3zLYpwzJVdD7YE9sDod+a9w?O4+#Z*S4C?l zWt5?+hq$4Dm#46o8q(86R8w8u87AN^s^N?9g(|D6!z|%gC3h##Pt?d(+(E>{+0#hO zzyR*7hSo+{S~*_WcLz89i(TpEpe~@IW9aOw>!=9Klrk2nqU;7f1$}^e*-PLY9FS;L zMQb1{Z&6DfH%oncaF!@)3t??9r0lL|qvnBe6BR@&y9yYHfkstpdkJ+7MNbD$YnX(f zorkKrrUODz0iq;=chnTnhub@=t2pA}VrXkEA1x0NeYC5x0UE6(u8CC_wMDDpZEWyv z`l<*IxS)=N63Rf>0O9O}bcJ|}8F^@Iu;5rNpdiQ$lLsz#Oy4$k68H$gE?7i)1RBQR`x zVFNb_aHcCd3MmU&q190aVgeW)L)D87Z)>UUWF;48{2;RP4*|`2R)mAaYY|H#fZ6DnxTs0RdLXILd0LWs|--Z+M{Wgvmh=18mx7u zHHSqO5kXbFLk7PRdE9$RCHB3Q?3(fF=E*}pyq=|jL9a)_V6MWIGDkhFcrJa(hY1`H zpK-N*hoaA_w+`!l=DJ+xf>L?8Z;2BMdhl~+me_T4pPQmonu8MK;YRA5G&8gCw#5O3 z)@a>4%`)Ti4=B2_wC04uTzrQC_3M`wKae7iiDLB$11>B5qdL^~vs zmHKZ|=e>R{mrk8&m1kDWkKzPA#cew>X_UvWo06*%Sw_ofpIP zM6Mp2=;R^IAVUnI?r#}CwX%{EEHGceJs6uQRX_47;I!`A$8CKJoO~&WD1gJaBXjYY zD*CU_MVypRl8j@%Oj{A|yNwkb~x}KwDnN`>kxO*h6j?iyf<1b$8*?*Z9}*7+Ld7{Ty&;a|hgEy#DVNaY18crJMwAf;3~kJaMU+adt8}V}-E#qsQK{ zuVc7|^7S;5f9e-w{WP>RGd1G5e3U4o5^E?VTqb3u%CX!`lV#iWBl^W)()&5KPr{)7 z<5lkmNT^g*2nl3_q_~AOHpBf#4(AwgGt0$i(iGUh8={N9U%%pq2R(EadnxI+*PFh( z%;7a@HklW7yqjZC&!U8I92Og88c_;K1H$_%Ps#mh{z*%zSKDzjhE^7is>m*#NYsmZ zcJ=E1pP^?t(ac!^lL4B)tG%vVkvQ$Qnpt1SSXT8x+&sWO0SbIIBmXD*?7d9sVx`@J zmT#3><{)-5q@Sn{iP(De$<%v{8K)P(D;vV-v`%e{z! z+9HDBwO#JJ!RIx-m77VDai<+BefM`?IS*!>6Bx5>Y@#?0LbAur{dE@QP9K=)F8W^a z44k?b(V~}YR!z;bO($QWrQs&`j(e? zwYc_vzWUF_vCt~*_logc$Z{{}PSHCcDffF-F7YQsyWA z>@M5y(-kPs{^&^cQ;*wiAtZUhMUcjbXeVARuiFx0LLJhJu8f6_P|`1P#7v&yNKXG0 z>pj(`t8mtK>3$C>9O!R85Bl{rmg)mb*5o<<6DFC0oMLgEV)8?Epm@ZR#DlU@?C;jN zN}pSzOpl(9jPI!q$o{#s4xZsBzBl`5o{7$UGO)n#&GPnq7{^Zqe$QW(L2^+^B1vb0 zi~NHRd859|N`<}^bx`wQJ`rYW|8ZT;Zz{<7%9VwZxq3xM@iWEZ9{({xd44IMS3hOX zd0GsLb&&N{-(nFQn~s0ANCWw$Rk$0kq}-l$YydoR1IX$^`DzWUg`FOU2U3O(54CQT5yVFtJtV1XJpf}7sfJWQ@h<=kk2i;9g zTXl2c#C6!q<2^Nh+1lAKW?F&u4)oh|pw&0xAN6L>400YF#aM?=ru(!N2Bo3$@}f6U z6s{Bbx!SK6>=s5+1J0UIpNIOeoQWq*VGHx(w9r{D#6te?gzI25YpV&hKyxt>ffOHQ zDiLF9V1&?lnZY2o^5FZVv~7%!!xo>4Ec9_5*Td1UM%bTrZ08;fs%tonM)RdeDb4h{$rB2Lr`Zl}sTrHy zHQir$Ae9pMG=E4vovKN7iWegG{r#j_spleG>h)`FQ3mn!_ri9OQaci9!A4-iltlP^ zkQv4u&a&vekjNxN~qOEme+=d=rm!8GFiC zw@#QJ|8uNLq4%{NIAUcOeYd06Pb~yjjkaV{c=>4Ab4szAnA&3t_7{Ylx=b<}$Mxs$ zzu;G|7jh#DHF#CV<>{hsW2T%$LWsVDEgQA?)ZiSJ#=)P6uibsfbU4SI`cNH%8JziI z7UvJ6SoolK*RF?ox_0&??d2nQ@setxYD{`Ql}|e9E1O4d>O;}iKN86wbWQf|JfZ)fI=1*ye8q@3FZN;&EMIfr+cfMSy<_5`kE!O`l-W% zJ#1VhmOGw?_GnCdtv8mzERaOB>O>>fwtC0h9;pi#->ZavUsJ|KVllzT5Vi zUUgCV2-Ys=uJ)~3fWO}Va_RMRZI^s_W;UbZB}N)BKBPddjz>5PynVFt$rj#8?%Zy; z+Z}VIyaJx3L5-A-z4_`D$34ODd^UENKYZ)(oSh9e`^#{2Y?{u7Ze|W@>C6X?^ZulF zCR{%{vL3&?!zC5VUry%`^XBO#4X1IH6Lp6HgOje*Kfy$O1^}MoFFlevYdbyW^g1>G zkJOW|oBDM~=0wDV$VcV?fEtkp59MlYz6sFw?62FKiqY-yJ?EyJVg{XChm$Anm*1PF za`V!h%lehCoJ?k+l~25k^3+}neAU!Ry&{EIJSB}A%)UBg8(e`^6-~~oe>m0G(ZB0V zyijy4oq=j&+QHI*mS)aI&k|pLP_1^7q7?euNWZyc_TJCR5P=ouKwXOWQH$Lh5QHQSx66LE2K zq}A)ZRX&&YD_486G3^N40}eb5BTLZPX&;M+LC! z+(I}2agmAIpO*@N=M%;BBtNj3#&2;OIuru(GT#hwGSFN4?qz{{T!23;mg&hz9^ju- zwJ_QS8g!zmoG8=*{Cx1+^%W6lAis2jFAhl{-%9fb0azBRm|4~n;zFNL3_k{F;V%(P z2aKxnW#hdkfS5E?QFtHluVy#+G>8J^j=Rb(R8RtWFZt^hiuzzEnfIkh%fNv*uH)HP z@fr*{7fQ2X-d0STa>xqRP*qnIE#n!B+8ur!ORX$&M@ASa_MB0+#*kYxM= zw?dUjLGP>Np|)$lVtMI)w8$$1vsgnZ=?(525p=JQ8BA+4w%UTAX&{NW08Y(^$ihM8(3S~(!ky%CZ zFv<%EMor!|2GHBud&35}BOosvx>YMF4<cLdH1=Qm*r4CLd0Q^!*{K6e&MIF3)__)5(?Vh+WiU5NIL%P5MnZ4 z(}xG^gn-etOTQ`jzPGmOIXUsLJ$L{$Frdx)@BylzKo}nv2Zh06=^g~fK!XWzCYLlg z1pM}#-il!vXz1vUPx4S@T-vF!Da<}IH`x52-h!sx2NRE=ZtOA5BQI){~dkY+V`i*$jc~0hx^!3#vR%BXUoO{_S%K(h7~f5V;nI z#d8|+4W59d!8{S`@02s$h1aPAzG?tjApSi5OvC9qtxqT;vW@U{*uuscmY^VAn;sl# zabPXre|E}+Tiq$_*TU+d27&k3hF)Y=tD0zCUDn?(=h&Fg1JZg=UQyM(_9#wsTkb5L zJhH=I=Q|=iee@YVZ4cA7Bt_Me77W}Zro<=9Gza*48r9%A@YSTokJ%YAPYRyneTDw+vN1}}`Ga8bLTXZ9!M4~BS_wj8d{@t7Ypt9h6w zA1F>_-^6OB`d7zmX!O9hpOq~XEla_6pK`S?6O+|~4Ytv|j30xyY3uQk4~CpS4`MliU|fsc<2c|;3tk5nswMZXH$ z%8jz6lj~}K`VZ;A#r9^t7c)|ED$iH@N`_rBkuNt zUPJX3pLe!s2aBcKH{K52SY-u9lv%P+us?{JL)tHTf(pL(6Qc;^g1HeQ69NR_hE>)l zG&^}$ffHVp_PuZad-OR2+CqRQf#LcU?F`_)GVfmZZVm2yC%n@imQ0yg>-kp5kjE3H zY!P!|Xoi)Qsi#_c4m-s3+}e!v&@QZ2@4^*689FHPh(vt_I@-*(KM`zxj(a0}BId3e zI8rD;tGQ}$`!oy~B<6f~iDE^PvGN0>bfqfNe->c05ZLgFM&{MYLNK4E(0|030;GV? zU+$|LuRFkqIsHqT1xORWFs~xxTXakQH2otmstbdqziXdre(L=^A+S2E8)mdBWOFmO3yuIgpJHk5+701MUfq^Ft_k9=MpQl&I znQ4#v?ob&q@xJl!_|mLB9rKsvAk&lW?e zccxm^;(_X^wVUxt_D>Fr zn@j#04KP!uZt~QnO}()9YRjs>A(!|mMQGc|_oVNbPeSfxIZADPyw>#B_QAW#ouA9w z%@w5O;dX~Ne~jslQl%`i@bhPUn2B>QZ%@7%Bs~@QYtJtAtxi2-03)y2&f9x(m9aa! zDdK0G-SpCdH`&UVwAixjI34%*ce*w8n&-X7Jrma%UnUnb{bDvHQ6%zRTpYlyOfD}r zp9M5;$W{iK<7zJpNfFoCqC9}F@NUU;D@)Eb*@NJTfPGWT{vWXV z%&#-FgVsMJq*BUKX}js!ZU4}fIT=$mA0=@Um#ddVwkyQ-EcY(nRFa>Mi%g=gl1uAI zejcb&bQ+|nSmwUxf3_I5)2^vY(Yt+cbHN`ddT#0oZ)j^0(;l}S+)7BI2>V9eOFywV>94I?cewQUv%_G4s^I44 z^mcQ0m*VG^R~}nb%-2ujXlVQMtXtc6>5U7ehSvLDGwjwzlnVQ3k{W!tB`KZgdgwN4 zS+yGN_k90tOx3An`^cUo_Gr<(?xdX7kWw+AolTtm_;HfUgOH+>cuh6)!7owk#=-T; z&pKmu{iY>vAV{mkqGtGKr+ajLnyQ@#-%#{J&fjd`EDu?Tc$Xf;1GPkk2q7r*Yw7Er!I zoUhk9b{`9=CqAh3qP|SN^Vqu8{&=~#?{iS`t%&BKeC?}zb#EBV#zLoWIacdrfgrS0 z6^0eDZ;Hq5hGt zpR`6;xtbW__yj+fAC}Y!QI(pty0p;HFNLa}RV;?d?Q(J!8jQsC)LDm?&gIl**eLFo z?_Q3~!khe_SP;J38{>Z(AMCT3G(gQrr<#|zmo|qy@#^bX-C8-ui!vSV`*QJe-PdUm z7}P7S8d-G?#hx!dzRBRZTw7|{#l^4{wm7)opRhBN`8QXy;{EK_H=5brGJ)#TH8Myv zs{1F}*=XYS4CQb0I_a@HRX5TY+tSH2D&K7CEl1+#dIH9_TPOA6n?;s>p3^#@>K{h2 zxCtV3b8q4w^@UVWZ&2*~H_8~Nh8cf5a<%qnA`4QTxx2*0_)HMJI>tHX;M1f%IPE2# zKa;^}e$duKCwmb3#a*|zN_VcWXOb`LUQ^F9ti%92S?9jWcViXAR-BDSi*zRm<2+B^ zxE!Yk^6$qg9rOR1ZN%KUVq8bBUs^FfnPGo7ts_bNIJ;J|jY;yzl&`^kq2XjO2RWl1 z**df=vDVPKSW;HKIGALm@$rW0EfswBQQMGK%k`+*!fzz<^Cp!hJ5JI&s8}o5=@fP6 z-Yg4+xZbfDulur@book0_OR^l=_9YeDj8?*FN3Q$UKE|q1_w^PM&Ivhxr{VS9of7 z5Akueo(u8O?3zprx5<)ciH|D&uHPKJnY>$Rk_XPMk!`ERko9`jiJ#srn*7N!r}y-4v!U_d)dW&GD2Z9C;rk084~u)PJ?0OokCw`i3*x3#&(F7e-sWWYuLnv0 z5+rYjzysgL>G6j|^Vc0bKH6Vjzg-=5yD>7gm~ZmFL%4`qp8D|Ks{AJ6vy6^IPO)%i zAuauiol5DooGAR~xO&*QY$>s)eKgt2#yUu%6@v_J@S7D6ca7!T#|CJGdZ5#whAeoTy`;oo}+($G`jE>@(l_ZX6NQeYxqh< zVI!p&r7!M(&Q6aP3o9lf4sL}MoCUm02naeOOc3i@>JK)<=DMQ;ahJmeLb~@XKT{85 zAmsY(XPzZ*(zi2DOj}QMA*4)8ubZr=^L%4?o8t5Netk@& z*vRji6Ro|0GOV$$&*pI{W?skKPmeUo{$xAZM{4I*3dTBkm*1CS zyaZFEJQW|gHqR0V1}#f4$nE*wi>xE<=(29@iwpOPOm!n^;Y|+OOJQHmUS7^SC|EPh zRN?iV&8iRIJV}{%nGCr5t0Twuc!x<%SIh4QvNG1O<(H4e=RqCM@o}%LCi4KF=k~#9!OJ+>ZJqe*~NCIeRqk zveVfdmg|XnJ1gc9HY$7eMkr`pd3B9J*QMyZ;@S)Z0kBM zdO1uTL!Tv@3-P+Tt}MD?lLtGD!y+-m)h?-j*_Bqu#v5Ikj~A#>Act@rPT|GdySqpy z`8sGSL6EL^IgrqwGG-U(g)d2GAT($dn%mMM&L=GNoC#jZnL;+mvs_rvkp z`>dR-tnktoj~camp3@(xCS%TF%XSOC*Bt};hFK~Y7mj=dog#Vs7(Z57f0a+%wcpvb zSRwVTr1xz?;f6imq;r3tdpY)5G^|^A8^d3xEWAdq>v{850I3G_3J=!$zqJ4!bVnD1X1HKBAGJvx4DR>usy5>O_m7}q3O?O^JgCeBWNUX+(83FOPVDeZ0~)? zg&Pt~`FN5#Q#*Djddg?-=Z=*d!l+V?|BMTT2?_n^zH@YF%Eu4Iz|tp8`6%%dvjA@I zrd0!mDRT275n6>dXmp><{+Nft+fcd0yxZKgu+?9)Hy2J*nWVkA$qa)eafj`a+;F~; zr1HRW=MQJTxsp3--MybXAiM`7f1-Yc)dh~2hfiK%$O~9--zS%TK&KtG;*QZTe(xez zjpwf(YWxwfaH7-CEZki$Juvy%VTg-Cz(PK>2?*Z*aUd-p9b`9kyNH3?T+?<}7MEFV zGE*(>L-st-)`g_^kWn!$Kg?Yap~Z7j)1<$w#8GWhinup>+aSjTT3XO(E-Z34!(BJx z`>@W3jlEX10tHa`9JC~X^6_?Gn!sG&WJBn&$6~nl+1Y(hrA}$ zLB<|CzIrpiD)v&<*!ayFC^ygh=V>8ES4A7Iy23zH!a-s&Z}5 z_OeAE=}!lXhnn9?2?&?cTlHEePrLPYd+Fy!6L@b?r00f3zaq#Edd>6bPh(3D?O?s% zEech6WImT`17oCE{l=ZF;xp8Ne8wt9)%bVyAwDbGkfYl_ydp*r z2FPj(NOWOg-t<$)`)|c8Hih3V6$qA_rTJh(; zq5lsevzi`b;|fT9kblQqYIElKN!-KKjvz-CiRn5Ui0YYFTKmg>m7u@IG&ZNx^B0jT zQgl?|t6{yO*-c5!5R8s{6;*KyP?4?fYH+M-DFxVDm0Lrmsx z`_m~w1$*vVy|sSzDm$OKGr(3x2V3^6@`*zf)w>erW`-30XZ7W`k)OE2QE44tE{)XL zgsRqI7E&L?qut8l@17!FQmPuuBI^%)#%XwS&Bb{FpA{4&_K07?@&1ye@c<5?GM9?q zV6J(p)!)A@s_I=UoEXOkP)cW6knUKFE2`nmF#xWi-UovNtg-}`!MFC7{s=f<1G%p{ zM~5u4-x8benTv3<(}ej|+AFw#t9T=4d1FqvaRT!AYVc63sO7=rm*NOS!Pn5h&FyH* zlw7RvaytXki4c{W8_b!eNvNTln%%j(yfAYXfU`Q6g^7L3Ba^E$=Pr~S(sI<<_1meL zT2<018&$^}l^HI%!1O7gGQFn=k3nKnB9!@_!8Kff24snw!Vc5WCHES?Szl>LmlHg5 zgYVbpgT)U8#=ORgL{)NEBzQAZ+Eg_ku68n(xGrZ{fY4NZT;$J2U@(X|GrKw*Jyyod zCSErFPI}U!yIiEcgG(n$AY_`(FP8rrnPnT&9l_9*K0jv@4uMLR{Osx74ZwITT=>9z z;>EnRelxvC_)cox~5q=v@|71>HC2QdttuP`xjnj4_`mJw#FXE`T61cxb zX7LAn4R_a}hW{^^Z9Lv0&l89WyprB@9mF1$sHt*DkW*TgSGtTHbm`65F)=N=>=5E| zFac60y1C~b{qvN=> zJFsM1PmDajSAB^-*cGSoym>B2oxx{$$y zrzyL`kOWK{_9uP|46!}zS1r{@?S%~X%@{w8)q_fdB1%1;# zQRHKePs^^%wI_YH1G))To3|3<>A+U0y^e127pXSPH$BnHOOgLuTz?zwLR0;4s@vy6 z*RB-le_OE116HUTBm)#pK5_><>-*nRFiZvVkjN~<6P(k6#T#uf7qKgm&a64#Di~vW zr;EM935~@IR8RRGA?7EJbgPeCwfyl-Lxl@l-QHWm?l&6L`atA6CSmLLFq{N`r!xzg zaHiMaBp_$?P!oDv-)wvQ&Rnt!`B&nFhnJM~*nkw{DGQEtFd-9_9(KO_<6fL>Y>;46X{E`} z)@0+}f1`Ff`0Fpj>dw#nHa+e@Vw`&EoWQXhf#MVUww~ZF{fI%Id_4^ zQ#~APyWdF?onc2xH-j}?`y7EHm_>fQf95d2z0yy{;x7-p_WLqt2Y>76tC*+M+Bk0d zf4u<(Sp>Q;ZkpakqwdbK5>GQ~^w(me64J=*q89=$s30JLOFiVOGf30hQ|==sYukC- za`?it#aCK9W8M{L2)+!~Pu0+s(k_a~H_eewovk-ksY1nZXPOy|c)yuE!GU@s@!I^3 zMyhOpKX4w3#%J$)HCZT7C%(!DBg|K!4OAfHn7T-f_JrP{QX=F?yU0i9$A+2%fqMhJ z827k`oV1MVLCAgI=>2C~&VogWr{KIJlnd4a$|2$r1G@NGk!Tiz%x;B&?#>(m;74|e z@S*a>47k2nL#2VpSM})vq>TW_w!RSTJx+qOum_AfaFBB~4Y}JGdSL~=-mkeZN<%-m zSHy#hTwVX5pn#Fd-F86CO$V2-0rDD8gWAvicXp_MHKL0U^rpH@r1d-k7;b%=)-*iO zy3stoBm5UIw%3`&ql#dgT~il(_aPWG5Gg#Rm<2;}gLoqV%Ys47XE-v`$pX@FQEy|=TH{3EI?LM4g;(j&8fXWVzW@IgqOMFUaQ{)8W9bGk*ubxM9- zil8Gc7y?E@dnMdCqd?x@|53~L?{Gy$A~YHe)6gKNp{9nat6!m^p@9rbyr3ev{{iHI z?xhR9s3q@wFO!_DovZ@fyt)t&RM8m7(alk1_GzAI=#!>)y{O_+A|e!SLWyg`$p(@v8+SGv9;UyIv|M{G3U+?gJq1Zv=Imf+seqOUno`^%+|s@0 zy$q)L`HeS=l^nq*T@G!p*h(#%NG*4Fhs|}LkY0662@+YK6uXVxuG@+&~$N>@CWiH#?)f0^dov zDf%PU2lHN&)fkMnbR~-qI2PAF?B_ob;c;JbXdTVmgKn&pN^pt5a;kUxH-~C=j z^YugRn>1`WT1kpgjN*II+Z%(RVy|kN?)%a1a*J3?Id-())N4HJYsG|z%i36FsmHud z)!%68T)+LbiCYBBi5FUb^7vq9KzA`SMm7V)@djSrQ=;Dg>9@vfUiYr<1HoR1)8rFdz`dwfw!7 zR={LIV7hwnc9%+Cyx>j82=M|R#T#`GLfq@eoD+BCk&nI+RE-dl_6|iC8?9dy%2j@p z310gWoFqagFV6X9x{DCkLQMJp4jU)7-pViLzP?8!y6@ag*FX&DG8?Ga@JFDUb zmv6}<`LkyqZISKN)I5S^#Z3A)wKiRoTX|A?X7@I^j4l7 zeUD|v4#(B7A4a?}U1UA3KAn(A+VFax6 zk6+QAQNo-%{_ZUeX%0RfCfc28dp%tfaJ(1ZQ{nV`dfD+?FkzhweFLsPsAOY5O3{%u zrqw#&>~Ox0UTQfz>WKjod+u~=a_WGj4>exN+SyBUP9nC*9PA7is1V&J!;vx*C*J#N z+r?l-aGb2L)d@d)aXL5nJeFQ6wMl+xg7T!{`LPHw?usxe`fhRscJ!e$f&c5J;o{T{ zM_^56PhOwTGrriHyXRukZ;&a~#`vb*g}T9Z!QTvMbaR(}W2&g*a8b%9WT56B#+aHs z!UgB!t1mv*68PHeMjzOR1b2TM>T%k2jXzI))hF^KPzzL>HfnVTpUy6q zLCq?hQ}|mNzEP0|b?-W+cP%oVodZJ?TD}5S${#!*zh#L;=eAjRmT%=2bWRJx-~@2-63 zj~^QfCUfu5b&uZNsrpS{RXaHx&W%}IViIDnJ(J3hgN^rwNc@u8` zp1tX07bfeq%I|W=K9Pd|CWCh68^WrmRqqy;2bgG9-DAahD$UKR8QI>@j-)Q?LC!2X z{$A=xcdRcIX!dY-_ZP;mxPP71zNQ0Rno2&vN!OVoQrXrVu*D@?Zt+;}jBOKNw$^K82&r;;Cm7DfF?-&_p z+p@eLcw5bQQh786pBO&YcHb-Upd+QjW0qK9y=FU_Lp@FIWR+#Oyicx+Gbmd|*Sw;| zoRRhI8!T~JGD2&0516=3Ht7)NXxzvbqA$-h92^`fx2i{u9*)4PP~VnVI_#2XqExOe zLA`1&`AH$7)5jV4BVQgK^W5n=NufwHF3hbyChi?)swXe3xV3Qh-nnLP#1YcKUo>;u z-ld$js$t|3QPmx!fyLmuRrsae-(m7C)em}`PD%AFT{kUaZ-hS@A_b;)ESB`Bh0dJE z_V-AR)@gj#kaGuxJ{jBfUN$urP-Esh9nQ|j!Oh5-=4dx%@)&6l9Czlx!nKtXLX*gB zyI_!;tHW|po4d2D{vm{q`w~M^O8cX)A|`SJdt|tPqb73(w%fhCk~)5!Q<# ze5ocwq!}3}{$CSWf|-jRJEVXEfu@I|CS0UxJbKpqki|$HAsGVf7#_uPG@gf z-n{@Oj{-hvf^jakp#?H|Bx^Kbt*caT)}OQfTfS*zqiq@5qsjnO%=SKsuPs~pLfl&j zherhx;6$evq|%lN*Z4g%$g0NZSqG#-oJnH|s_Nc-s%PR2S^2c}3ef5goCXjsti@PD zuf3B}8ty4So&B;aUu-`d*@;YUOE2+mz>jS7H2n@UgH8T13ncLUN}lg28(d`Yi1n=! z(nJdRl`O6LzSa%loANPl2K(rLbkqCd9(@TMw5ar9t+x1B@xwcYpvtYVruQZgdHer= zr`!MakSsR*{5XNnRO9692{@KbZDl$O)k0=F5+mU)O<~t^8lI3L2k*!sO#o)xBybt~ z8avmWq6zY4A4Xm3P2F5-=O?&}YZOf)15OS$2Z779euW^W;{uciDqMJC;4}e)t-Q$~Z?DQ~PJSl_f~aJm^&PD!tIt1Jfcv7`ztZ zm{wXEcTjK$EcoJD^?Eh{aDLw$%S^}0v5cqNsplW6JeT`l&**$QI` zootSrl3_duISN(pZfvZ{{t>C}#KQB_ROvD2DnV=UF6SH3wHy2k1 zKnoE`=Ag7RMaJ*v1R?97^!mXR(_OAR0Fq_L#Zhl+=UX;CQ;W^JuFn`i(2J#}GgVa$ z0q?Yddcye(VF{H`A{Z!+!N3qxuXSbbO+3T=Ot6^W>;Z00n|t8q6QoI{Ao!PCUxVGKJ6_AQOASb< z!mpw%M|XB`ntJ8{7xJsNUZqNt=6mpyfttK`e|=IHgzr8Co*wmmb^H5N;ij+3H*_J{ ztX~Pm!btKZxsW#T7oc85|FUPMeB#?^CTUvvify7zZ}76lG@U$$e5$w$Gj{B&AV=qe zG@FK8a8&#vP%YZ2UCL|_(o=jZdoD?H3C*02xq`5Fukm#+Z(cQZ{`Jhz%j$}gp zcB$pQ*Xv$liCzicv}4EN8lP?VNxVu7Gp}>phzqH2$_ulEH|gMgQN~pQ;6yvoF5FZz z$wqW{@7`>q=izU5dmGZwCe3^MOJ!wc9rdN*b=x-`Mx4YiR{!Xe#;^u`pS*N1W^uZC zRjK^%m-?~y1>oeRARQiidtAkfRM8PRmqvVO? z-pqyY=>a%kZt;4JaN%Kl#&fd&)&h`t7<)(u^NIF$=cA)dAIFW_+jVR`{D$@=9_KjO zZT;3CXx!U~yr%AR27m!(yvmcXN0<{3dMP@t){@MKy${7_7`T4q? zYS9DXAZfLOZDtwY>%%W%<%ZX6{+Z1D>b0Kt zd4A~~+%YGw?3KT$YnBlk7HR0cH{og26tO8sZVg5&re0xOwTfZevSobp?!=gu3P19?5hJs7`!ugLbSgJ*aMeD+ zMT8clB&}kjY&%C+;}`?@tw)Az4C^!-WK1p$8tn&kiR%ioip)?>Atii?x=mhgM)k1# z9f}KpSj2gM_5c2k@bEjaz-i^M-bdK_D+oeD_~BqVF*G`An}Tta6l(q8P|$Mgm*Mpj z6u`W2-yhv3$A=ka#7v=hptg1ymLV+VDwH_CK_lrHl&7{n6bT(q$XHg~sq%a?CNg3C zw$kC1`Ti?vpAufN+jgIDP-^uro~ww0re{8H^{wm74VZr%eLG%#%9jJSQ>=Poev?GH zPXNt(`mJvDFA>O06umew7TM9nhhQuO_3kC2!;#R{7kUaVsK8mLb%A9FqG7=$IOaLP zs6)9B!|HGzq~SPpXS&EHy^bDXcanNgLL*%Zc~NN|;&531ouBr<-eKUf|7f>J1~-kv zQ2jT6z{NcmbQB73G~p4c#zoH1318UbBe#afD5P*uQ8$7d6tGa$N*g^d3(v<$uqCx{H>fAOIV6T;)2UbZ^ z-jDXev)SBs)xLm2%JA^z)4E(8PnGP?WLPswgYTR9u)Gc}Eei1*aq1~;^ShIKCdw`G zkf}ZxADY^d0}hg{)bojAB_(Q7eFORODZEwV{?pjmp$}IWL10W?6V3y}r zsDqV0N@|*o@ltgl>d6E!>QIW9>r?YqmFxF1>0RirIXOcGx`pqgl$4Y*HT12la^4e0 zk2k=bG#M;5#)=mNkMpeu(r8DbV%(h>9nkJ#WG8|EDtpc`)m1gNC5mxJxH+W*y28@B z+eIRej~;mzZTo`bPBm5hWrPO@}Q$cjHhb zK0_|_R<5Q;ia^Vy*5S|4>bqH2kJ*b=r}c~(72c+G?dgB+)IdHHf&l(~IWPxQoyXP0 zC{IsM$jkN+(uUi78UC-|*-vGw(7xyv6bjOnA;CQa$VwN1Y1$q>5BW`-kdlEPb}dTX zzhUU_RsBcF zg8&NRM@WDg%Gunse-rfk+biOq59`|k_=kliFY8%QLkjq{?w#ZaeUG}#$BE#6eolls z9NvP|(+rvDn|RZG$p|HaiCvJwLrT=MY#hkoAz-OQ*T|Y)V8Prhc_hK2I9=n;-XDju}ImOPyU&n7XS&=1vZUJ3ANM z?^8oC&MarntYyqBe;2_L3*js>+J(m|ZDBUF-a6L3A7J0Qj>2!x|A;vDX>}rKB_No`FpiHL~6(dcgo?` z&(Ns5Tkx{IGS2m{Hc#egu%yl(l#N2-0!pqGTEEw2JJy*#2G5DsSSlKV+KxzmUZ`JW z@K_~*pZcQOb3mA^iprqbr*48>%;(gZLDHklsK1SI7+kNMd#>YzjZhKzw#oWLIopii z#n$#imNC7&Rxlsmtu~2bl}Q6hHYU%#g*1%8FuiqpYX|a0(({|gFO0n|%zH!XBu716 z?doBJM( zE@=8P*>dgzv&HbZxj&z>fQk23m8~eAz;_JGr6LVaF)=byz8p;ydglJ2)K~ z4-R+h59AeC=(ND1{2HiYsVFINst{P%D3-b#$J;Y1CTzjl{Fa>&8OK{w-W{$-(@XNm znprQEuY;n?Lq&#yM=9?V|H0fPOQrtg!{S9|*aT9M+1NBB;chuu8fH(k0 z{o&S2@GNjB5>y9ch|y2>qDmOwEZ*B2wExg4{O|Kh3w~_{tBTDCh^?4*9T)`ab>&+q zVj5nA_fAs+jeyxR90D?-5n6`F*dl;&ZxHh;o5}s3@w<)XQEQ&K+ipmdtF%+Pz71lOiCh7fO%k;cjMNfI8sd=P#MQj(bBD1r5Xk zSFTnlR`YKcugRCP?-Z2aU)VcjwO4s=TdyUiO33JyAu)oe4Pp6cO`QPiHSJurY+nbe9g2A@hB)hn|_0jUs8*D z?*G+vG-h0B*+uqXcdKSjP0H)=eGvs+UpcroQKXS>Av{r1_bvN3$tDWO(L@%L4H?f*7czB=bJXT|2qK- zP8~G^pUZCcy%=&EH_iPUR9zd&uJk&xWsvd`GWA@J!@M2`Wmb^r3U}%R8=+*og7SQK6wnU=LEKsf22WjAeo;8oMxUOZ25i-BZIrgC ziOj$#@3FHpXiYx5p1zZiq^ho-dq*yWZryz9{Xo-B^F@cE$qbTEfEXL88mhTQi3Q7U zSBW2SiGi|8xEGPXOZV9)lsa4btV1!bI6)Y&E+DMJ>0m(9aH~`5a_v~TlHXdfP5k$<+)uK^L>ke9piV6b)X+6N61U_Z6WOb-FO)41Q{}GQtMH3XSaxAdMHBfW!`Gluh6_ed6^* zMlOMi%HQEP&F|=EJg==$qzpngtDTu$UN@vPRXj>DThPDyvL_R(LIEY07j_%KMvg`n z@ABS)T08e83HK8816&7N%Wqz`#SiUc(R|P^@fz5N{HFHo&4^*!K^dGa)KBRS3?>_! zWDqK4$|&VltCufhH?-3i=C4_0{7fnbXFXm@&zbkgH#Fb2UH}j}Mg4}hq86=Z(BL|i zvRXPC@*i00Xk6q@-71UMW_cICfzWa#K8|63<-Z71boC;AB~6*jaml!G^4OnrJmtFk z&yFg5_>jwy3OUkCqFYlnw719n7Iz6?U&wm;`)RHobS#V92q|i*3V??9&hwT*04E(; zIc|nEW9FMR+h7VEf2$*NFedI$nJOKem7YOx>!A)}qlE$mA3ZfjjP@g4U0r=&-@EE; zt@9v+@l98S=bqEoQ_~UzI0lEUA7Ud4DOFn1Ch%YmSBB}=QSM}>{ZT=ENO}z2byQ)` zhkV5l+7h@6;mu71bnJy7I+6`(Bqu*5gJX&rJN^yq(1S=#NFPEQL?X6bo|{%(G*%JE zWo)|aCAiE#SW;uE%L+c&YD9k`_Xp60r?W4aDSyg-9Vn`ZqmA(k_XQi@Hh$U~^jIzC z+?vV-U)E7WMTBlL$jf8@0y!WJmIQc6W<~}(5j+9Y@JKv1YK_Bb~wZ3R4Kiw^6 z(DR^BEajSDP2uTje`GfnvE6cg^*%B@@NQPC;DDqYn1yd0O`I_oh&F;afD(_(@USox z_$+F({f38(!nR*)yJp`+KkkQ?>g3;Q0xl-d#V<0i&gWwiCdf_bFl`HH%mb5zUd#Gl z9i&VBDL>~=lYmF1d98CToP0fA8xD1>Tc$Zm4GE$^T@%mpJDvO@rWr_7)F|5@W?mEV6>PcP2O<0IBuZ>$P%cL*IRY(SxdO55`VM3 z34v&>3;F)Ag-EARFA@-b3IM8ol7u(jjZu!XG;>C=NGW?CZ)QwSn`GeIR6NP3t1{ZjdKM-vD|oQa`<-$f*eL9`JbF0 zpmaWlKoc1g5qs9^5V|tF~@o!qr+P@?*>~r161h^;%M<^MKyiq13phAK(@!m`VNFPDd`FbIS@0Tn!Z;=+Z zK?bak6&H3y=v6uIi$pDUMQbZ4;J>o6B0Bl>`SV)!lw+1&u~GgC|0N*^kdk_aJp(%r zqvo*z{q6UqG%4?)_Y`dRhg~(X&XPwz-BYmvxY_r0(6*&vO440&i-H+&vE6w#KVErS zUHuXqc+bJr6+tftR%rP9SNGeCAfR!|#+W&!jzJK`?JCEaNqbtGQou^rX9kYe{}7az zJ$tjzLAa;e1S$~Au8{++h|}z|(x&62r!Bj~WsU>+xjSMCitg#^T=O?f!6Cx7Ok7tm zjUy1DWdj!e!*4M%VJc9WL{LD$l_TwYj^wMEUa-x*YH|^DFgPkK^mTr_hgDCRX^};0 zl41+s>KE@qS-jqBX=^($k(w%M1%e_E^aiW~jk^%te64$*+Kt8IalKs7PYQm277eVW=(xnQkzRaFD9-i%T__T!gF)x^`lyqWK9=;+HcATE5 z>Q_P3tbbA{7I?jFB$N5-v_JiLuq5&V`_KmOw$@^ad5f97w*6E!-wc>3Vi;%^pF9l& zr2kNVs>E89#5Q7kra{q0XCo9F**;7KC0CajPeHHcrVlBy`aVHloM2ky+D=D0+h-W% z$T09#EB#YD!YJ`Guo&xb_bmhwnwxIdztZ*REFtZL$K16~xTKshghBhye-wq*uwZ$4 z#NdGM84$JxDQ<+iPeULeS1V^)2@}D3wDVE-Z)T0psIpt68;q0oDny~IiFKFzyw5AJSZi110zS!fSek zJ#(^qW@@%ydlq7Bv)(SqDJ`AxmW~=}sjik)Gi&^mT(r}XFQ%2jI8qu0vq zp;3QrwWz{%+6b}gN5jM`Tbu*=1KpOoDKwMf=PUfL{jiJw$sO_@Tmnv#;-e*0ffzMZ z1B9Rq5b>#B3>A-n$~fy{yCFJadh-;&4vY%vIT>L$5c(vCM=~Wm1kU(&o#k27vQi=f zp(~OS$?UTtA3ojsEJsA~Hw41<5i$=+wJs#d|0kQd4yPmJm|g4_)ODO{^mHxHj$+kb zmGf?PuO7H}qw;<%j`IarcjJ=L_>gQrAGF7

MTumGZMiYH5;OAu|=$Us2{fR}#;B@Yb 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 Pz#k=fwI?OA7H|Ixv!KvF literal 0 HcmV?d00001