From 5b9e6c0a400fe0a127b9a244a268b072a6682317 Mon Sep 17 00:00:00 2001 From: Denis Shchepakin <1842450+Sowiks@users.noreply.github.com> Date: Sun, 8 Feb 2026 23:40:19 -0800 Subject: [PATCH 1/5] Change Point Detection algorithm documentation --- docs/MATH.md | 76 ++++++++++++++++++++++++++++++++++++++++++ docs/imgs/example.png | Bin 0 -> 35539 bytes 2 files changed, 76 insertions(+) create mode 100644 docs/MATH.md create mode 100644 docs/imgs/example.png diff --git a/docs/MATH.md b/docs/MATH.md new file mode 100644 index 00000000..de987ea6 --- /dev/null +++ b/docs/MATH.md @@ -0,0 +1,76 @@ +# Change Point Detection +## Overview +Otava implements a nonparametric change point detection algorithm designed to identify statistically significant distribution changes in time-ordered data. The method is primarily based on the **E-Divisive family of algorithms** for multivariate change point detection, with some practical adaptations. + +At a high level, the algorithm: +- Measures statistical divergence between segments of a time series +- Searches for change points using hierarchical segmentation +- Evaluates significance of candidate splits using statistical hypothesis testing + +The current implementation prioritizes: +- Robustness to noisy real-world signals +- Deterministic behavior +- Practical runtime for production workloads + +A representative example of algorithm application: +![Example](./imgs/example.png "Example") + +## Technical Details +### Main Idea +The main idea is to use a divergence measure between distributions to identify potential points in time series at which the characteristics of the time series changed. Namely, having a time series $$Z_1, \cdots, Z_T$$ (which may be multidimensional, i.e. from $$\mathbb{R}^d$$ with $$d\geq1$$) we are testing subsequences $$X_\tau = \{ Z_1, Z_2, \cdots, Z_\tau \}$$ and $$Y_\tau(\kappa)=\{ Z_{\tau+1}, Z_{\tau+2}, \cdots, Z_\kappa \}$$ for all possible $$1 \leq \tau < \kappa \leq T$$ to find such $$\hat{\tau}, \hat{\kappa}$$ (called candidates) that maximize the probability that $$X_\tau$$ and $$Y_\tau(\kappa)$$ come from different distributions. If the probability for the best found $$\hat{\tau}, \hat{\kappa}$$ is above a certain threshold, then candidate $$\hat{\tau}$$ is a change point. The process is repeated recursively to the left and to right of $$\hat{\tau}$$ until no candidate corresponds to a high enough probability. This process yields a series of change points $$0 < \hat{\tau}_1 < \hat{\tau}_2 < \cdots < \hat{\tau}_k < T$$. + +### Original Work +The original work was presented in [*"A Nonparametric Approach for Multiple Change Point Analysis of Multivariate Data" by Matteson and James*](https://arxiv.org/abs/1306.4933). The authors provided extensive theoretical reasoning on using the following empirical divergence measure: + +$$\hat{\mathcal{Q}}(X_\tau,Y_\tau(\kappa);\alpha)=\dfrac{\tau(\kappa - \tau)}{\kappa}\hat{\mathcal{E}}(X_\tau,Y_\tau(\kappa);\alpha),$$ + +$$\hat{\mathcal{E}}(X_\tau,Y_\tau(\kappa);\alpha)=\dfrac{2}{\tau(\kappa - \tau)}\sum\limits_{i=1}^\tau\sum\limits_{j=\tau+1}^\kappa \|X_i - Y_j\|^\alpha - {\displaystyle \binom{\tau}{2}^{-1}} \sum\limits_{1\leq i < j \leq\tau}\|X_i - X_j\|^\alpha - {\displaystyle \binom{\kappa - \tau}{2}^{-1}} \sum\limits_{\tau+1\leq i < j \leq\kappa}\|Y_i - Y_j\|^\alpha,$$ + +where $$\alpha \in (0, 2)$$, usually we take $$\alpha=1$$; $$\|\cdot\|$$ is Euclidean distance; and the coefficient in front of the second and third terms in $$\hat{\mathcal{E}}$$ are binomial coefficients. +The candidates are given by the + +$$(\hat{\tau}, \hat{\kappa}) = \text{arg}\max\limits_{(\tau, \kappa)}\hat{\mathcal{Q}}(X_\tau,Y_\tau(\kappa);\alpha).$$ + +After the candidates are found, one needs to find the probability that $$X_{\hat{\tau}}$$ and $$Y_{\hat{\tau}}(\hat{\kappa})$$ come from a different distribution. Generally speaking, the time sub-series $$X$$ and $$Y$$ could come from any distribution(s), and authors proposed the use of a non-parametric permutation test to test for significant difference between them. If the candidates are shown to be significant, the process is to be run using hierarchical segmentation, i.e., recursively. For more details read the linked paper. + +### Hunter Paper +While the original paper was theoretically sound, there were a few practical issues with the methodology. They were outlined pretty well in [*Hunter: Using Change Point Detection to Hunt for Performance Regressions by Fleming et al.*](https://arxiv.org/abs/2301.03034). Here is the short outline, with more details in the linked paper: +- High computational cost due to the permutation significance test +- Non-deterministicity of the results due to the permutation significance test +- Missing change points in some of the patterns as the time series expands. + +The authors proposed a few innovations to resolve the issues. Namely, +1. **Faster significance test:** replace permutation test with Student's t-test, that demonstrated great results in practice - *This helps resolve computational cost and non-deterministicity*. +2. **Fixed-Sized Windows:** Instead of looking at the whole time series, the algorithm traverses it through an overlapping sliding window approach - *This helps catch special pattern-cases described in the paper*. +3. **Weak Change Points:** Having two significance thresholds. Algorithm starts with a more relaxed threshold to find "weak" change points, and then continues by re-evaluating all "weak" change points using stricter threshold to yield the final change points - *Using a single threshold could have myopically stopped the algorithm. Allowing it to look for more points and filter out the "weak" ones later resolves the issue.* + +### Otava Implementation +The current implementation in Apache Otava is effectively the one from Hunter paper with an in-house implementation of the algorithm. + +Starting with a zero-indexed time series $$X_0, X_1, \cdots, X_{T-1}$$, we are interested in computing $$\hat{\mathcal{Q}}(X_\tau,Y_\tau(\kappa);\alpha)$$. Moreover, because we are going to recursively split the time series, the series in the arguments of the function $$\mathcal{Q}$$ do not have to start from the beginning of the series. For simplicity, let us fix $$\alpha=1$$ and define the following function instead: + +$$Q(s, \tau, \kappa) = \left.\mathcal{Q}(\{X_s, X_{s+1}, \dots, X_{\tau-1}\}, +\{X_\tau, X_{\tau + 1}, \cdots, X_\kappa\}; \alpha)\right|_{\alpha=1},$$ + +which is equivalent to comparing the time series slices `X[s:tau]` and `X[tau:kappa]` in Python notation. Next, let us define a symmetric distance matrix $$D$$, with $$D_{ij} = \|X_i - X_j\|$$ and the following auxiliary functions: + +$$V(s, \tau, \kappa) = \sum\limits_{i=s}^{\tau-1} D_{i\tau},$$ + +$$H(s, \tau, \kappa) = \sum\limits_{j=\tau}^{\kappa-1} D_{\tau j}.$$ + +Note that $$V(s, \tau, \kappa) = V(s, \tau, \cdot)$$ and $$H(s, \tau, \kappa) = H(\cdot, \tau, \kappa)$$. +Finally, we can use function $$V$$ and $$H$$ to define recurrence equations for $$Q$$. We start by rewriting the function $$Q$$ as a sum of three functions: + +$$Q(s, \tau, \kappa) = A(s, \tau, \kappa) - B(s, \tau, \kappa) - C(s, \tau, \kappa),$$ + +Here, functions $$A$$, $$B$$, $$C$$ correspond to cross-series distances, left series distances and right series distances, respectively. See **[Original Work](#original-work)** section for function definitions. + +$$A(s, \tau, \kappa) = A(s, \tau - 1, \kappa) - \dfrac{2}{\kappa - s} V(s, \tau - 1, \kappa) + \dfrac{2}{\kappa - s} H(s, \tau - 1, \kappa),$$ + +$$B(s, \tau, \kappa) = \dfrac{2(\kappa - \tau)}{(\kappa - s)(\tau - s - 1)} \left(\dfrac{(\kappa - s)(\tau - s - 2)}{2 (\kappa - \tau + 1)} B(s, \tau - 1, \kappa) + V(s, \tau - 1, \kappa) \right),$$ + +$$C(s, \tau, \kappa) = \dfrac{2(\tau - s)}{(\kappa - s) (\kappa - \tau - 1)} \left( \dfrac{(\kappa - s)(\kappa - \tau - 2)}{2 (\tau + 1 - s)} C(s, \tau + 1, \kappa) - H(s, \tau, \kappa) \right).$$ + +The starting values are $$A(s, s, \kappa)=0$$, and $$B(s, s, \kappa)=0$$, and $$C(s, \kappa, \kappa)=0.$$ Note that functions $$A$$ and $$B$$ are computed as $$\tau$$ increases, and function $$C$$ is computed as $$\tau$$ decreases. + +These formulas are effectively used in Apache Otava after some numpy vectorizations. For details see `change_point_divisive/calculator.py`. diff --git a/docs/imgs/example.png b/docs/imgs/example.png new file mode 100644 index 0000000000000000000000000000000000000000..4c18159dcec678b0404aef3ae8e6c645dac10dcb GIT binary patch literal 35539 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 Date: Sun, 8 Feb 2026 23:45:36 -0800 Subject: [PATCH 2/5] Added more details to the example --- docs/MATH.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/MATH.md b/docs/MATH.md index de987ea6..086226f1 100644 --- a/docs/MATH.md +++ b/docs/MATH.md @@ -13,8 +13,11 @@ The current implementation prioritizes: - Practical runtime for production workloads A representative example of algorithm application: + ![Example](./imgs/example.png "Example") +Here the algorithm detected 4 change points with statistical test showing that behavior of the time series changes at them. In other words, data have different distribution to the left and to the right of each change point. + ## Technical Details ### Main Idea The main idea is to use a divergence measure between distributions to identify potential points in time series at which the characteristics of the time series changed. Namely, having a time series $$Z_1, \cdots, Z_T$$ (which may be multidimensional, i.e. from $$\mathbb{R}^d$$ with $$d\geq1$$) we are testing subsequences $$X_\tau = \{ Z_1, Z_2, \cdots, Z_\tau \}$$ and $$Y_\tau(\kappa)=\{ Z_{\tau+1}, Z_{\tau+2}, \cdots, Z_\kappa \}$$ for all possible $$1 \leq \tau < \kappa \leq T$$ to find such $$\hat{\tau}, \hat{\kappa}$$ (called candidates) that maximize the probability that $$X_\tau$$ and $$Y_\tau(\kappa)$$ come from different distributions. If the probability for the best found $$\hat{\tau}, \hat{\kappa}$$ is above a certain threshold, then candidate $$\hat{\tau}$$ is a change point. The process is repeated recursively to the left and to right of $$\hat{\tau}$$ until no candidate corresponds to a high enough probability. This process yields a series of change points $$0 < \hat{\tau}_1 < \hat{\tau}_2 < \cdots < \hat{\tau}_k < T$$. From e9d8cf65c3077b7a9159ac9393135b85c72fe01f Mon Sep 17 00:00:00 2001 From: Denis Shchepakin <1842450+Sowiks@users.noreply.github.com> Date: Sun, 22 Feb 2026 21:04:28 -0800 Subject: [PATCH 3/5] Implemented suggestions --- docs/MATH.md | 74 ++++++++++++++++++++++++++++------------ docs/imgs/example.png | Bin 35539 -> 45777 bytes docs/imgs/main_idea.png | Bin 0 -> 51244 bytes docs/imgs/tau_kappa.png | Bin 0 -> 25978 bytes 4 files changed, 53 insertions(+), 21 deletions(-) create mode 100644 docs/imgs/main_idea.png create mode 100644 docs/imgs/tau_kappa.png diff --git a/docs/MATH.md b/docs/MATH.md index 086226f1..605c54d7 100644 --- a/docs/MATH.md +++ b/docs/MATH.md @@ -1,6 +1,25 @@ + + # Change Point Detection ## Overview -Otava implements a nonparametric change point detection algorithm designed to identify statistically significant distribution changes in time-ordered data. The method is primarily based on the **E-Divisive family of algorithms** for multivariate change point detection, with some practical adaptations. +Apache Otava implements a nonparametric change point detection algorithm designed to identify statistically significant distribution changes in time-ordered data. The method is primarily based on the **E-Divisive family of algorithms** for multivariate change point detection, with some practical adaptations. At a high level, the algorithm: - Measures statistical divergence between segments of a time series @@ -14,48 +33,61 @@ The current implementation prioritizes: A representative example of algorithm application: -![Example](./imgs/example.png "Example") +![Figure 1. Example](./imgs/example.png "Example") +Figure 1. Here the algorithm detected 4 change points with a statistical test showing that behavior of the time series changes at those points. In other words, the data have different distributions to the left and to the right of each change point. -Here the algorithm detected 4 change points with statistical test showing that behavior of the time series changes at them. In other words, data have different distribution to the left and to the right of each change point. +With that being said, the difference could be merely a change in the mean, but the algorithm isn't restricted to that and could also detect other kinds of changes, such as a change in variance, skewness, and other shifts in the overall shapes between the distributions even if the mean stays constant. Once potential change points are identified, a statistical test is performed to validate which of the points are in fact change points. That is to say, they are statistically significant. The user gets to choose the threshold (also called p-value threshold or significance threshold) used for the statistical test. The threshold adjusts the balance between finding fewer change points and finding false positives. For example, a p-value threshold of 0.01 roughly means that there will be at most 1% false positives. The false negatives are harder to estimate and depend on both the chosen threshold and the actual data distribution. ## Technical Details ### Main Idea -The main idea is to use a divergence measure between distributions to identify potential points in time series at which the characteristics of the time series changed. Namely, having a time series $$Z_1, \cdots, Z_T$$ (which may be multidimensional, i.e. from $$\mathbb{R}^d$$ with $$d\geq1$$) we are testing subsequences $$X_\tau = \{ Z_1, Z_2, \cdots, Z_\tau \}$$ and $$Y_\tau(\kappa)=\{ Z_{\tau+1}, Z_{\tau+2}, \cdots, Z_\kappa \}$$ for all possible $$1 \leq \tau < \kappa \leq T$$ to find such $$\hat{\tau}, \hat{\kappa}$$ (called candidates) that maximize the probability that $$X_\tau$$ and $$Y_\tau(\kappa)$$ come from different distributions. If the probability for the best found $$\hat{\tau}, \hat{\kappa}$$ is above a certain threshold, then candidate $$\hat{\tau}$$ is a change point. The process is repeated recursively to the left and to right of $$\hat{\tau}$$ until no candidate corresponds to a high enough probability. This process yields a series of change points $$0 < \hat{\tau}_1 < \hat{\tau}_2 < \cdots < \hat{\tau}_k < T$$. +The main idea is to use a divergence measure between distributions to identify potential points in time series at which the characteristics of the time series change. Namely, having a time series $$Z_0, \cdots, Z_{T-1}$$ (which may be multidimensional, i.e. from $$\mathbb{R}^d$$ with $$d\geq1$$) we are testing non-empty subsequences $$X_\tau = \{ Z_0, Z_1, \cdots, Z_{\tau-1} \}$$ and $$Y_\tau(\kappa)=\{ Z_\tau, Z_{\tau+1}, \cdots, Z_{\kappa-1} \}$$ for all possible $$1 \leq \tau < \kappa \leq T$$ to find such $$\hat{\tau}, \hat{\kappa}$$ that maximize the probability that $$X_\tau$$ and $$Y_\tau(\kappa)$$ come from different distributions. If the probability for the best found $$\hat{\tau}, \hat{\kappa}$$ is above a certain threshold, then the candidate $$\hat{\tau}$$ is a change point. The process is repeated recursively to the left and to the right of $$\hat{\tau}$$ until no candidate corresponds to a high enough probability. This process yields a series of change points $$1 \leq \hat{\tau}_1 < \cdots < \hat{\tau}_k \leq T - 1$$. See an example in Figure 2. + +![Figure 2. Main Idea](./imgs/main_idea.png "Main Idea") +Figure 2. On the **left subfigure**, there is a time-series $$Z=\{ Z_0, \cdots Z_{21}\}$$ in red color, with two subseries $$X_6 = \{ Z_0, \cdots, Z_5 \}$$ in green and $$Y_6(12) = \{Z_6, \cdots, Z_{11}\}$$ in blue. Among all possible consecutive subseries, the subseries $$X_6$$ and $$Y_6(12)$$ have the highest probability to come from different distributions, i.e., being the most distinct. These subseries are completely defined by the pair $$(\hat{\tau}_1, \hat{\kappa}_1) = (6, 12)$$. If the difference between these subsequences is big enough (above a certain threshold, which depends on the implementation), then $$\hat{\tau}_1=6$$ is a change point, and the algorithm will continue to the next step with the next best pair being $$(\hat{\tau}_2, \hat{\kappa}_2) = (12, 22).$$ Note that the $$\kappa$$ defines the end of the subseries $$Y_\tau(\kappa)$$, which might be before the end of series $$Z$$, i.e., $$\kappa \leq T$$. The reason can be seen on the **right subfigures**. Specifically, it shows that if we restrict the $$Y$$ subseries so that it does not go all the way to the end of series $$Z$$, the algorithm might detect the changes in time series $$Z$$ better. Consider the loosely defined distance between the distributions (cyan) in the **top right subfigure** $$X_6$$ vs $$Y_6(12)$$ and in the **bottom right subfigure** $$X_6$$ vs $$Y_6(22)$$. The tail $$\{ Z_{12}, \cdots Z_{21} \}$$ in $$Y_6(22)$$ muddies the signal, compared to the truncated series $$Y_6(12)$$. + +There are a couple of additional nuances and notes that we want to mention: +- According to the provided definition, the change point is the first point of the *second* subsequence, and, because both subsequences must be non-empty, the change point cannot be the first point of the whole sequence $$Z$$, i.e., point $$Z_0$$. + - There exists an alternative way of defining the change point (as the last point of the first subsequence - in that case, the last point $$Z_{T-1}$$ cannot be the change point). And, in fact, some of the papers cited here are using that other definition. However, Apache Otava uses the term "change point" as defined above,i.e., the change point is the first commit at which metrics change. +- In the example in Figure 2 we effectivelly used distance between means as a distance between the distributions. It's an oversimplification for illustrative purposes, and in reality we actually use a divergence measure between multivariate distributions. See **[Original Work](#original-work)** section for more details. +- In the example in Figure 2, we compared only two pairs of the values $$(\hat{\tau}_1, \hat{\kappa}_1)$$, namely $$(6, 12)$$ and $$(6, 22)$$. The algorithm actually checks for all valid values before choosing the best one. See Figure 3. +![Figure 3. Tau-Kappa](./imgs/tau_kappa.png "Tau Kappa") +Figure 3. Divergence measure between distributions of $$X_\tau$$ and $$T_\tau(\kappa)$$ for all valid values of $$(\tau, \kappa)$$. The biggest number corresponds to the most promising pair of values (marked by a red cross). ### Original Work The original work was presented in [*"A Nonparametric Approach for Multiple Change Point Analysis of Multivariate Data" by Matteson and James*](https://arxiv.org/abs/1306.4933). The authors provided extensive theoretical reasoning on using the following empirical divergence measure: $$\hat{\mathcal{Q}}(X_\tau,Y_\tau(\kappa);\alpha)=\dfrac{\tau(\kappa - \tau)}{\kappa}\hat{\mathcal{E}}(X_\tau,Y_\tau(\kappa);\alpha),$$ -$$\hat{\mathcal{E}}(X_\tau,Y_\tau(\kappa);\alpha)=\dfrac{2}{\tau(\kappa - \tau)}\sum\limits_{i=1}^\tau\sum\limits_{j=\tau+1}^\kappa \|X_i - Y_j\|^\alpha - {\displaystyle \binom{\tau}{2}^{-1}} \sum\limits_{1\leq i < j \leq\tau}\|X_i - X_j\|^\alpha - {\displaystyle \binom{\kappa - \tau}{2}^{-1}} \sum\limits_{\tau+1\leq i < j \leq\kappa}\|Y_i - Y_j\|^\alpha,$$ +$$\hat{\mathcal{E}}(X_\tau,Y_\tau(\kappa);\alpha)=\dfrac{2}{\tau(\kappa - \tau)}\sum\limits_{i=0}^{\tau-1}\sum\limits_{j=\tau}^{\kappa-1} \|Z_i - Z_j\|^\alpha - {\displaystyle \binom{\tau}{2}^{-1}} \sum\limits_{0\leq i < j \leq\tau-1}\|Z_i - Z_j\|^\alpha - {\displaystyle \binom{\kappa - \tau}{2}^{-1}} \sum\limits_{\tau\leq i < j \leq\kappa-1}\|Z_i - Z_j\|^\alpha,$$ + +where $$\alpha \in (0, 2)$$, usually we take $$\alpha=1$$; $$\|\cdot\|$$ is Euclidean distance; and the coefficient in front of the second and third terms in $$\hat{\mathcal{E}}$$ are reciprocals of binomial coefficients. The idea behind each term in $$\hat{\mathcal{E}}$$ is actually quite simple. The first term of $$\hat{\mathcal{E}}$$ is the average of pairwise distances between subsequences $$X_\tau$$ and $$Y_\tau(\kappa)$$. The second and third terms are the average pairwise distances of points within subsequences $$X_\tau$$ and $$Y_\tau(\kappa)$$, respectively. The intuition behind this divergence measure is to compare "how large" is the distance between the distributions, compared to the distances within each distribution on average. And the coefficient in front of $$\hat{\mathcal{E}}$$ in $$\hat{\mathcal{Q}}$$ is a normalization coefficient that is required for some theoretical results to work. -where $$\alpha \in (0, 2)$$, usually we take $$\alpha=1$$; $$\|\cdot\|$$ is Euclidean distance; and the coefficient in front of the second and third terms in $$\hat{\mathcal{E}}$$ are binomial coefficients. -The candidates are given by the +The most distinct subsequences are given by $$(\hat{\tau}, \hat{\kappa}) = \text{arg}\max\limits_{(\tau, \kappa)}\hat{\mathcal{Q}}(X_\tau,Y_\tau(\kappa);\alpha).$$ -After the candidates are found, one needs to find the probability that $$X_{\hat{\tau}}$$ and $$Y_{\hat{\tau}}(\hat{\kappa})$$ come from a different distribution. Generally speaking, the time sub-series $$X$$ and $$Y$$ could come from any distribution(s), and authors proposed the use of a non-parametric permutation test to test for significant difference between them. If the candidates are shown to be significant, the process is to be run using hierarchical segmentation, i.e., recursively. For more details read the linked paper. +After the subsequences are found, one needs to find the probability that $$X_{\hat{\tau}}$$ and $$Y_{\hat{\tau}}(\hat{\kappa})$$ come from different distributions. Generally speaking, the time sub-series $$X$$ and $$Y$$ could come from any distribution(s), and the authors proposed the use of a non-parametric permutation test to test for significant difference between them. If the candidates are shown to be significant, the process is to be run using hierarchical segmentation, i.e., recursively. For more details read the linked paper. ### Hunter Paper -While the original paper was theoretically sound, there were a few practical issues with the methodology. They were outlined pretty well in [*Hunter: Using Change Point Detection to Hunt for Performance Regressions by Fleming et al.*](https://arxiv.org/abs/2301.03034). Here is the short outline, with more details in the linked paper: +While the original paper was theoretically sound, there were a few practical issues with the methodology. They were outlined clearly in [*Hunter: Using Change Point Detection to Hunt for Performance Regressions by Fleming et al.*](https://arxiv.org/abs/2301.03034). Here is the short outline, with more details in the linked paper: - High computational cost due to the permutation significance test -- Non-deterministicity of the results due to the permutation significance test +- Non-determinism of the results due to the permutation significance test - Missing change points in some of the patterns as the time series expands. The authors proposed a few innovations to resolve the issues. Namely, -1. **Faster significance test:** replace permutation test with Student's t-test, that demonstrated great results in practice - *This helps resolve computational cost and non-deterministicity*. +1. **Faster significance test:** replace permutation test with Student's t-test, that demonstrated great results in practice - *This helps reduce computational cost and non-determinism*. 2. **Fixed-Sized Windows:** Instead of looking at the whole time series, the algorithm traverses it through an overlapping sliding window approach - *This helps catch special pattern-cases described in the paper*. -3. **Weak Change Points:** Having two significance thresholds. Algorithm starts with a more relaxed threshold to find "weak" change points, and then continues by re-evaluating all "weak" change points using stricter threshold to yield the final change points - *Using a single threshold could have myopically stopped the algorithm. Allowing it to look for more points and filter out the "weak" ones later resolves the issue.* +3. **Weak Change Points:** Having two significance thresholds. Algorithm starts with a more relaxed threshold to identify a larger set of candidate change points, called "weak" change points, and then continues by re-evaluating all "weak" change points using stricter threshold to yield the final change points - *Using a single threshold could have myopically stopped the algorithm. Allowing it to look for more points and filter out the "weak" ones later resolves the issue.* -### Otava Implementation -The current implementation in Apache Otava is effectively the one from Hunter paper with an in-house implementation of the algorithm. +### Apache Otava Implementation +The current implementation in Apache Otava is conceptually the one from the Hunter paper with a newly rewritten implementation of the algorithm. -Starting with a zero-indexed time series $$X_0, X_1, \cdots, X_{T-1}$$, we are interested in computing $$\hat{\mathcal{Q}}(X_\tau,Y_\tau(\kappa);\alpha)$$. Moreover, because we are going to recursively split the time series, the series in the arguments of the function $$\mathcal{Q}$$ do not have to start from the beginning of the series. For simplicity, let us fix $$\alpha=1$$ and define the following function instead: +Starting with a zero-indexed time series $$Z_0, Z_1, \cdots, Z_{T-1}$$, we are interested in computing $$\hat{\mathcal{Q}}(X_\tau,Y_\tau(\kappa);\alpha)$$. Moreover, because we are going to recursively split the time series, the series in the arguments of the function $$\mathcal{Q}$$ do not have to start from the beginning of the series. For simplicity, let us fix $$\alpha=1$$ and define the following function instead: -$$Q(s, \tau, \kappa) = \left.\mathcal{Q}(\{X_s, X_{s+1}, \dots, X_{\tau-1}\}, -\{X_\tau, X_{\tau + 1}, \cdots, X_\kappa\}; \alpha)\right|_{\alpha=1},$$ +$$Q(s, \tau, \kappa) = \left.\mathcal{Q}(\{Z_s, Z_{s+1}, \dots, Z_{\tau-1}\}, +\{Z_\tau, Z_{\tau + 1}, \cdots, Z_{\kappa-1}\}; \alpha)\right|_{\alpha=1},$$ -which is equivalent to comparing the time series slices `X[s:tau]` and `X[tau:kappa]` in Python notation. Next, let us define a symmetric distance matrix $$D$$, with $$D_{ij} = \|X_i - X_j\|$$ and the following auxiliary functions: +which is equivalent to comparing the time series slices `Z[s:tau]` and `Z[tau:kappa]` in Python notation. Next, let us define a symmetric distance matrix $$D$$, with $$D_{ij} = \|Z_i - Z_j\|$$ and the following auxiliary functions: $$V(s, \tau, \kappa) = \sum\limits_{i=s}^{\tau-1} D_{i\tau},$$ @@ -66,7 +98,7 @@ Finally, we can use function $$V$$ and $$H$$ to define recurrence equations for $$Q(s, \tau, \kappa) = A(s, \tau, \kappa) - B(s, \tau, \kappa) - C(s, \tau, \kappa),$$ -Here, functions $$A$$, $$B$$, $$C$$ correspond to cross-series distances, left series distances and right series distances, respectively. See **[Original Work](#original-work)** section for function definitions. +Here, functions $$A$$, $$B$$, $$C$$ correspond to the average pairwise distances between and within the subsequences. See **[Original Work](#original-work)** section for more details. $$A(s, \tau, \kappa) = A(s, \tau - 1, \kappa) - \dfrac{2}{\kappa - s} V(s, \tau - 1, \kappa) + \dfrac{2}{\kappa - s} H(s, \tau - 1, \kappa),$$ @@ -74,6 +106,6 @@ $$B(s, \tau, \kappa) = \dfrac{2(\kappa - \tau)}{(\kappa - s)(\tau - s - 1)} \lef $$C(s, \tau, \kappa) = \dfrac{2(\tau - s)}{(\kappa - s) (\kappa - \tau - 1)} \left( \dfrac{(\kappa - s)(\kappa - \tau - 2)}{2 (\tau + 1 - s)} C(s, \tau + 1, \kappa) - H(s, \tau, \kappa) \right).$$ -The starting values are $$A(s, s, \kappa)=0$$, and $$B(s, s, \kappa)=0$$, and $$C(s, \kappa, \kappa)=0.$$ Note that functions $$A$$ and $$B$$ are computed as $$\tau$$ increases, and function $$C$$ is computed as $$\tau$$ decreases. +Note that $$A(s, s, \kappa)=0$$, and $$B(s, s, \kappa)=0$$, and $$C(s, \kappa, \kappa)=0$$ because they correspond to empty subsequences. Moreover, $$B(s, s + 1, \kappa) = 0$$ and $$C(s, \kappa - 1, \kappa)=0$$ because each of them corresponds to an average pairwise distance within a subsequence consisting of a single point, i.e., it is the sum with zero terms. Using that, we can compute values for $$A$$, $$B$$, and $$C$$ iteratively. Note that functions $$A$$ and $$B$$ are computed as $$\tau$$ increases, and function $$C$$ is computed as $$\tau$$ decreases. -These formulas are effectively used in Apache Otava after some numpy vectorizations. For details see `change_point_divisive/calculator.py`. +These formulas are effectively used in Apache Otava after some NumPy vectorizations. For details see [change_point_divisive/calculator.py](../otava/change_point_divisive/calculator.py). diff --git a/docs/imgs/example.png b/docs/imgs/example.png index 4c18159dcec678b0404aef3ae8e6c645dac10dcb..75618e744100c0e019310f9a837bcf038153fb50 100644 GIT binary patch literal 45777 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 C!kCo+ literal 35539 zcmagGby$>P_by6E2m+$gC87d?bPgpTAfR+h2?Ej}LpKsCrAWh&5>g`~oq~W814sTd4P|w>Ee$UP0ZQT%k_(R(HK@-g?-(x(M?L3h;^X z-hBgwx_LnO`JMmIEBIXB+VPi`MRb5qx$gGN*aHub>ebZ`ez9DUJs#diIn}4~dOn$3 zGyVZzMsaPs1FFLcit3nxM4dOGVOl+-JjJ9QF6e1Dbf$uP2%&qM7z_H5dFqWpZc4Y? zD|vb_T~74FspAiZgW%QIzCQVuq@LTEtfMw1BH1dJwW|8BQ2dSkWY8Qug+D=>Q#0$! z$m$g4B+Dal%!DKSrUK~@rLoBw!PO&nlaJRR;8*yY+WUjl;K9?z2cdCS|1tUaI`luU zby3Z^deeI^bpjT4@ZjgmTPW~`n|U({PgJfRY$gBCN0gNZ;$P$x7r!qlDY2Dveg6Cg z5fM>;ka;jCZd(Fkl`VfdGxV$#7eDIo;NHDFcjuSKCX?YMC66|}{HwBbxoxr8yjJZ&zBp;I6i*< zq8~pJK7G1b^+^-l-bTWcBGw|!Y-MhxH*ZkJf$l`a#A0Vo6*V~=*t3K6;l$+RTa1j8 zlPTby2^bnm4E6PC#4=u7Kv_Ubcf57g1iiG6K<$hd)925hS0y*Sq|(yToF;#M=;=|@(bY|Z zcs|nB*0#;~_fN+FZr)F45rE(J=QBr|w6Bm^15|M84lV5ut4=bntw|*_bkQBA!_G>)NO1YkWjHM7s=tc zqiG*6X8CU~poa3LFOHYY*L)Tt=*EB8kXP9a*v>ZjCZ?oRxh*JUY7|Y_{!MtWytp!W{u3`>9uh$~RN`JA z?=1Z8?!L{&HZTx;;Q{g9?rRA=`##~+2a`(aE}vB>m&Z4?GDd>gH6ftKI3r`q!^tKP4oz|Fj<-uW@El ziDSmM?2cn$hCtt^3EL$kCO!pkUSD5#8vh;&-f0^Y{h#nPfE`N253es*4anx_<%K0C z-pO|E>FLo@dsQ`o_vi25Ukh%Zl9O#~KE%Y_7Zm)wx#<*1$)e`vB_@^;8-zPea|Ra+ zu6}c-F$G-tkE$xw=g$uqZ!rnICiQBBWo9yieGD{@pK-xHO3+uMW@dJprOm5{hG%mc zvPmge$f&j!%(2M(qrJZn!oWQV2?>3l+JbIRr}<-=Q^Lc;O|~BK@c6DI8Pbb7Br>4x z(9u~}n_Rzseb<4BmR8x_y>j9qFK^k{38Ta9TereS9Ym*&e|T+~%=#=*><8)S+yWbW z@8QEPyE9=s#7%m7qqP&pCDZI+F=kKY}kW9$F|m9!#-aBPPCe=gw2?_RPyO9YjW5UENqqxB)wE+vw|@vmv;A zaQ|68i`O->W&2nAGkjOm?0gP}RGPzJAceDnPVIk=J%>T6e|d=6CVw289NY zJAAymRDW^0;Rwsm$!S~LUP($yS`&HEP+e#&1=FZ#KtIazLvu4zl7LVM*!e~B`t|D_ zgcRnx-yvF=#<_9!OW{#2hbDjR)Rvxs!P^7W&{#_*ZBgPqKEAl~^K(kk;peB1aoePb z>bcWrtbS_-BjX#|k9VTrqYmZ5s@kPn6PeRA3y15&QG_Iv-(6-PK_|Ty1YIdhi=ENj zTwL?HQLI8$l6VUX3wrwc+9oFGq)~2e?p&}ewi#bIHOKsB5)y6+N8e^;HRtKoGBNqs zv9Oay@%H+S8)d@7gX5ObJze~)#V|^!N5BG!r^DM*0WPlhjKc&ESjWqBg%Od{OTN7yFMG-rd^((ce7qEo-?xqfsWpe&_6C3))!wea>bp!G zw4X8eDJ{(xf#d?UhlNXuB7{%sg`?q#2>0NB(nrjR9$@Jej@b`Cyh2O>UX)Sqin9DZ zz9XS}I~RyufI|BH7z}YS{kGPd7Z|hv`H;An$IlKoVDaQ#{sS z-UK^f{nM(N+qk4Po;|ai_+j%rRUi~#wUDqdgSbnkA+hSnSgotY(dGo9WlJmGhYugl zx4m1JLP=OHe}xfUBO*%UQD_uW>mwn}=e`p94wqS$N)bL8=!r;B_5 z8%WD7EbrM#e5E>o>0qJp4mBo8IT~w0aSmCY&ojiFt=9h)Y);k2>lSG&xJht<0$Ns9 zHXE{A3U68b%bEQeSz!iHD#P(Ei)=t0g24xn1<1{){L?uxTGX^B(#(@JIyQEt8p%jW z0KP93)H0Aq6;&_5LRZ=LmtdubhK8ntFL4wt<{mm~qV}Y!M8tW#_>X;*UepF(2KgOr z{>@d4dZwvq*B*ZTYC$;wehtW7X8Lc}7tPLti;2m;JYO>fyACQ-VsSASC7W!YbM4F+ zyZGK61=0n@m;I>sHO@<2v6~ZBQBs(uFDz1CTKf8(9aM5ow!;@E1HpdPRAglB3m2F)e3tV3pcY(4!6)R_-ElTslhx8YZG`4)bvy0kX%g=Dyk|V=K&b!c1t1l8&6`q# zaT^wD_FKc4zJ=SV;_#_bUq~2IZqar3zw9zS<@Nut%h>h07 zO1G*pCnisr@?IDrJ-szYTb{{*Xgr%7BH@Ah`1e9=uxZOEdM~s*d%$X!6}pZ<@4=XO%IkfBQi0_!m|Bfiy^0E$Md| zC1cscMYN6uFl z0&1k}`Hmu}|5q6Ia@q4`hpwhfr@o3 z3tudO6e%*Cx{7RW-NL~lO*Z9N#!kRl`>g>ef=r51=c^Bw4Lo%_SxKn^9236Q7#W-u zcw`(&!PJ!_|LzK*G1UX3AR$sgY=PBTNKof{1%l2rV7F8H@_gSm15`$^Vv2xw;m)vY zs~N7gAcQE6M0t5*Km|NK+UjkOAYUK(cKZ?=d`Z%lCF5UrvYN3zTtxMbn8FH?DVZr7 z*f3VzI1L?saYYZiS^Z<=-w_K!QCe96d#d}#opcsA+5nCL)*9t&0q8qL*00zR)K5*y zqSce~ZnSfi)rKH5Vs++j1?W1cWRF9nw(AHp`VBUGjEqu|xGV5y!=Y4~u(SR#OyY4C zIJ6WPP?-YC!gkmn~oizxAZw)u_&m9n-WQhm^cZySE-5zPLlA@9BDxFDTqT zAiw*U099Tcue5FgWajGro6h%o0YOjit{(eZROA8h0n~*PZ0lt|DElW913|Xt>ehf% zSyh`gsAGMmM`T_$3F0e-@`)k9Xd{wlZ zI&{S{b#rD15VT$3&aSS@XYm6kJzy?ZaPomOE2pVxI^d%4MaJ>z2HY4h7{$mN?0`c= zvHHFL{#{@;5IduMctx)PvZaH%A?SDTW;S5|MNe<<$$s`_UkEjN8#}c^Bx8au=@PIoLi|2gsfSQ%nWp=LKgA+7`4@E^sH=0&fRs#0> z#ShIdXT0ZPJFRk?nldZQ8ihdp?22RQ<%pMVC!#Z*Pa16ixa$sq0b&-Cnwm;HM->91 z9*$K6amsOZ*}*6^0vPR0YUV+={D(gs%fQYg>VV1$*A{+9KuFlU%~RlJ0Jl8>YGm6HwzFRv3OPBZg3K$g)A6r_+#B#mF3BLZ>-_w>l=_#^y z@7}#ILF+DX{rp-62L48y%YVPb$|92=zoZwmy5>FYPV(*BxBCwsh^D^!_6>v=pvJqS zh8Ah@EYd!M8xUeD*5~r__y(m(;FjQ*_c%BB5sTsYI{?cYq29eg1P z_{Z|{^25Vlx_~cI${lALkg}hfBn8_*?+@DJBp$=J9Tegsr_x~m9`f)+Q^}ow0@QK`0BIGdgb&Ts0Z*+5=?EG@ zN{gVA2Nr>cG#;ycxgKi>TiX?oLw3L4Q$Np=PP=-iYb!4KicTm+(~6!Pnz}UYDnmTc zzX4Y`0nt72)BZMi+X`r!?O`1Tv7bMEY6ICJ8FVhu+1Y6q$O^O)WYgHt=O;xo4I+Yx zF{QU0ZM^cF4YpgGRHDoCzoe%A0g24U*SIMJx}@$p_oceSv6mBd?i}Q_yl)PCA8KU& zp$a}$+-}(53p&VW)7I1b{Z;i#dVtJT{sRuVaMiEt7Cv7%nsVj5e?MFU2Ep&z(XzFD zm}2_&I(FKF3Pgsaux;Nwi1cb9(O4R0=DuG3*5~f-f>$fodcMMcMZWjf2INZj>!l9{ z6$8$9yG=pIZ|c!6x(4ODl6%gb#*+TMFk`J@c?1Z6$ysN?*RRW&w8`W*ZhURZ+iQZy zOizL!4Q$EA1FiM~h?Hdz0nXy3B8_#YffaJ%&Jj8vw`UqXK(q1?E;N(;-$vK^w7hkk zlzOOGmavKK(t!yfCucQ%eO;|>F(n;$3OWmh#TyWC`z@G^V*Fy_JST zJ%_^tL?;b79p7?>YYRJAug@GRKb$6nva71YZ?Z(qRubX1( z-amLapDR~;w2~-wdf&P$=2c&+V0j>e0;$}R=@C8Nqg?SDTX-)^G9`#j z6c={KS`t=Y!9`ph8d+9$yGxI%V&d*_kb}h(gi=p-wrDZzP0p6G)oQn%WI~F z{vdAWjwgCkDhz2jzJ{2){Bh(4mgSlVMg#8!I|GdP4=r9Ew~3Sz&(jR8_1W>1FG}U! zENi+G_SmhDdks@390OLn=mGVVJB@4}6lN?^=*EXdN#qF`i9MEdq9l@UC>Cz2(2q^~J10Gb5uvA8B~Ts~zd&<>g}-ML!-K9GINZz{o+j`%Slq zl!Btu>T{}=2q6A_rZ==nwMho}PcdXB7zm;$odH(!yNb04b?s?qm|c#pPRxaEEAnP? ziUHp<7ahHu3=DrkW1wtm%8bVrct9O5cOh~0a}{7)wR5Wg;BC5M7_K<3_*}r3EBMOmOc_e!JXY(c0hA0#A;p0c=)o4fdtp|hLvailJs8JFYr{syrIeabu zu=`Uw%65P%nq#kEqbdmJceFL70;I@|v2yG4<6YB$NQ7|FCYn(foEQ;1KFCbK{&irz()b4x(m{uT~;;=^iXc7 zLH3JNWNSK;TwzhseoE_k#7oy^nvC)jvEH91<#yFQ77M>6hi*_i9CUmbAL~GIyFKf~?#v9T- z+;Byw$|IA7AX%UsWCtEG0NoMjf2m9?lng?@oo>_9|7i;)oM`ms2Xd<@s1p**l)``T zIn)zVQ=b9x?uze7Nik*g+Y(D!ZYn!hO^k!r?(XiswzC5WjjC=u{KT#ZlsHhFfMSZ? zPv7!tM2=lk;}#wsnI<==MR?J(5l`#W+*eDbVE>z5j0F^aQ$@w& z+k@Y3_xw92g0KB^4gB%v5A*=F0vr0qdbAw2hTu zm0u-7N#rD*vA1;2oB@W>N}`$PakPN8W9u{H3~-kPe?v9Q%~?TsfmFH@P@A!{>R@O6 zvD-vb9a%X5rk~a`Cvq z6vuH76EvR*FXyux#+=K|zQbh@{)S)BMNmpr4Bjo%y~!Sn!qi^+;D?0JX#TU`A?>LR z2+M~!-qPM<`9(-Pc4E5a7Lrfq8CTV~xVXr*HO*l7*JmefINXzRu^8Uv`MSjF9>;a3 z_O+?$bY>J#j`x4x)^s~PuorWk?Gql5?#Pdqbzp@vREs{0of{X+T05d)`G2d5Atko6 zYUbQZAk9IK$Kt@Hcsk>LIzxSSV{OdU86KW@TbVd7);@0Fr6a|ecYeHY@QY;To}~lr zYztWRfVNHd?k~uGOY>>;$3)kbvhdt=T z#KghY;NYtMzh7AQ_ctU40HJS=OG!>%bdw0MeP;?P@W!T<>G3MU-avBgz>N#X=>Uo-!qJZ#@yBoZvTHqtiGQx;dGI|@ij^%w$m#f_dY2{< z$+DSI`~9L_o-Q-tE9p!_{$5Y?X%H3G?&lan`hZ+Rtvsr=h0M#BBdKgw^)?@|Cz%?; z9l7f2O_3GQ6NUph^QV_{Q^mbqxh{1SC7Z=AyApDyQ9&oh&lvR1?%h6na;Wz2bmVV? zH;uQ%pnogD)>AeqCut0C=EZ=?!BPLbWJdjQICf-Dc`)u#ennAI=6<)THO&1qsQ$IoCg{F zr$J5J7MUvhF~MJS?%ta`lQzlMOj$gii$XoD&|eC$u0BJg2|<%s)_!!m$?nt7;ZCR| zvV(8o7IiR4|4R!?_|-a8Yod(XUYabL#h3SojM}%KPokynHgBnVOYVo^ehl;KP7-UNwOe6B7VVs{&5mMpCh91O!N1-eCoV z^*bP6l&sQ!5HP8~eSNQ|>)iVxOKRY#G3)|DzV>d|UAFQ2wpe3pcn{fuIrdY8M{l>p zYQHj@)LU6Tu!BW}YdxJ37N!n;v?UCK;Rbf|8Q&?wWv#A39?4QW&h^3Hxhli4 z)B;3Cm3{uiqOvn}Y&tUJbw9J76pc4e{^XOtzV-Zxj&JZs249%(m&8*AZo)w zj(&2q)V!O98J*BY1j&+<<3rG;w1vXmFLuodvVw~c!xDklRPhqC!ZcvoDZ#CX79V@{ zjsHl)hpdKb?m(z;13x1Z55Y+ZSW#r-cZ>hghO6`P^ZSXeMcjPck#<5?%&YR^;zd-3 z##Z#~;e%5*KEHo4g>p!1dvg9WFGcjuWPD>7yG5`*+W`Esnrv@K(qEg-JkG&V-`h-^ zlB6XvQIF%3n@kYuE~1t9N$e>rdNO0c#qZGYNv-PHAE$dq-yCdT?J2H;}}$KX(es4TpRIeV?JuY2*QnL_h+ z$)JG9h}8W88A6tLKqm~}IB}sr8xL!!z=ro6ZJ-Jb>F`p%CT1E|)%-`UlRC;Oq(kng zk8eT5;|qLzU=3M?I%tALSI}lZ>g^6K-~K=)3)^jOZ@BOyDS-?Q9jS5siTXqD@kZh7 zRKd~mm*kpyaKwy7oi1I`6_Z8-&1DDCD=($B2bFXmW9E-dB_AD~rg8JWBcJhJvK zCUloLpSaPDS9Tu5+}fpd^@|KBp|1%!*~4A4$TNLub-V-`zLIt)_)63U+)(O5^Xs43 zX>;hVp2>_<5Uh0gN(2j2uXVJxOJ1@{n6c2GkU^!Zh=@)k! z73KsdQ87{^Mp=T)=&$9bBxzr?$~-s;UZe_C)!Mm$Q|5axVS2UfXLU0-Au zxs*Yu+{&y!$UT16+tA>mlnuH5V03Ml-tV7X&!B7TVqoAUR%{cyUG>&%Ze7=tnA0y? z#l21?Hd;1wZDvrI{;~AxzNxHn`KS3xwV(Y``HFAqc3nMh=2dsq+cLz-%{so$X!A#v z{QS*T7UY$yeaFyL7M#n}c-BKx>mduq8S3%{YH#H%tu%Z?W$f(=@x_&wK~&7X%g zBG3ons3+2dFbvrsCz<6ADZKRqMUl!W6S^V!7YK*X#McAFMVa`lyS^kjaJtbLKkDB!tHMWDO%cGgO zjya#&eO_gko)Pr%Qxqd*6eS~4&rrE&@y4XN{f+LxAG1DA$P@vqL_;yPY}p9N_u8?; zv~H}E_uOvTgFV3*gVN-(&!7d-8%igfOBkY7I9~ni=iPG7i)cNk#g=hAQP)8irJu=RSK@8#&tP(z!(DO z9Wz_gLiR`39J8^{SoM5IC|IPd&Q~sf6H2U2haUC4d9#HO5KXA4;Lwrr^JUvPU!+7k z1$?u1y0L!68G6X9->5obuw{4Ie#nX=jIC?pOAuu1>A$+vgF8=lgZn3x&?Or&hta20 zM}b4TA8r~nOPHGpC!iT4Atx}b|El9U-ay-30aAw+@es9V3K2dx7DkJQ*z3rz>8){* z#phaB*su!Op}=!PhZKVPc6a(6-|p)3>v?o6&MPC{x~#;+ftK{W$RhI$3eU+}k82%)hE=E4r)@7W}3Bz$kTj1QG&1%|* z69_pXvqI)E<6!-0Xp*B~{o-wux49tM7j?~1)*gty_im|X1;I3mvD&O+eJBJya$TPV zb%jIj*Aa3y^XE&=JEI2B*m(`tlkvI*VQdOlDfm za@Nl?Kg+n66Kq2LT9x&9i;2k^Wr~W=$e``{)3uGA@8HcPen*iNS)p;>$|~F|tR+*8 z!~X0F$aHm4N2qkLhN%;~CB?yZk=;x@yiKfFS-HrT+S}|az}*GS1H+f@h$fmfk`~+U8ni!x=3^6_}t8KZ(*>me>=cA!1 zvxfy|f^4C2Yh48;{+fw)bGQ8zi!Alfq&t16@R2{L5dUMe<)K@N3Xxy95e^;5rp=lUJE9B_{&$+-pp6>cXEj1@6K<}*1L(67+Nfabhl`Pd_Ke@ zjcRJ2^8&X=nVOlY;v%$M$M;tH^v!97iH`8xsbi*h}kf}G@Lca4s9U+55lLcQz zHPlq`ZSxsp=&hXAxkFDnr0xX1>b0x;}&S|1y+L zR9M0LV%G;b;egs-U9NeJyI`!tS@bNyX~$ zy&#QN`7Spd(3APQF7=(0pO!k0d?lvzocr+ps3ogn!FH%_k2IudmLKVB+7Vnap*!T> zC5m_Y zi{0gfT;l6%#x7n|>mfahnTBKe11vmQTYR1ek6oTO?ylUPnlY;4Y?HZ`+ja5h>~zuL zwSU}lE_U+?{G!U=;$aGgEGBRI(3JtB9a4Q{ahk>O5irx{Q!8LqNoL}FRWC*8>3kSg z)g9kpcu27wW`j_$9vk5gGHY~g`N1mcNdfnGC9Uc3N2!=?_Vu(X!)sfaCR)Nx(|l6# zaocVAg3H~!%8SI(_cQy`)Z4EFX^=wo#Ckb~xFm?tDpW`u}D(f(b$ znVHRp6=J2479Shj6B^C$^>u#=g$L=|K@Wx$SF252nuke~D;g+q6C}z8omD;(0)I%u zr3d!=@$=hiTabQO(IsU)r>*(C)iNFd!>0y>QSz4}2f=e9V!cqJQ8NWC9PzE4af`rK z%h;H>2B%D9xy}R<>;i!;x+4oUM(~pnmQZW?h+6n?`9+zd0E_SqmO? zP4dP*e(K~HH-A}JcPfnV?9`Z*G-NDts=6N+ zG5TOcsu6FyeXOh4Se$~~|JNAw%8zwEKf?D~g*iTU2vtvLzB}N`I z6??HZ7bEt96q*C!2ovo6%Q!<3=XVD}f+RJNBFZNqtUP~2h#N4BRY0e&HQGw!C1c{n z*@kyNbbT`E&zrAUm^V4&`mKWd3{NlEdA8&`8vMRkmM*8UiA2xBJ4H*c2w@a-;Bl}@ z72B7jQ*3cTxdmNp+E8|bY|N%jI~>-te)*fULPqLl=XU-YRRX&xyrqy?4IyAj8Yc-n z_@v$FfxiFrI1Bb~%omsEO`%D_`s&83r%!*4z35sDC28@hEv;;?7;8A1)f#1BS#k7G z*Ic09##1p4VGPyi-;B^vHYi#><*S%4GPJO!N5xdiec`b#_{Vo3t9h7`denC_BHWMa zn@>&asxrr5DQCx8I%4b4$TCOjQwfja;Nw|Rs3}7t@vN}TM%YTl*^m-vOpGDY%^CtY z#(uRPhpzUw&TBN7du$j;In_v7A*$V}iSd4HDyqwC#rdk#GnM?R-s7fuEO3nzEv;i$;2+ z`c2kaeM7jPX6R89BAT!J?G%*WJq<|^kUS^-vEjn*ChZ5tAmc4gzlt)m?nhJA=rG0} zl;y~nQP=rkGar?Y>+PX&lftf@J~bkvW&?7=WW0U5YcVZG$`)p89~U1z8nY9y28A-2 zTm>0O!HN@%x;Ui}VMTf1_gMXUdl)aHG2S-$dz5JK^jU0nuwkf=Oosv9Zv!gdE`Q#z z@xO9HkgKGc)D zZ+($0$boMi^UkKnRolC->#a9&I8-z`DK~C2azlN<8g@tY$PaLQ&mo%PZJEmHpp?eI zXNGfCuT8s68{bETpRz*mQE4%Z?hN?D7%ZQ|R$9zTckS(+BD!gR72mfn>?yZ(uyLqS z-GUdfq|ksp-c6UqLH*{Y$hm-Pcv-^zjE!u1x4%^)nZ%_F8%hP`p5l(hc;$o*`V6?= z#mID(8CZM03^Wb?J#qtTdO2{GZnEtwLuVekQXAa%cAtNm>Qq%(C9)#?rb|m?`Mtc{ z<7?m$1YX3HB)49lEVc&h+1<8H5v`Q3gj%`NUet5l0rP|kb+!0v+)L`O=LMFcr;wj?J-w7WIjtDv zsDZ2!NGya#vnc`uQx0yupz{nw0NF&ypoRy|K0i@yWIAyT=}U4$Oh|+y;D-JQS{Lc2 z*AJl^SkkVXHO{Q+Lva=4sJL36dRfyMIK{Nx^{)I5f6^sf?C>onPDfcrhl8LlGK@KA zY%t4a^YH1#DLZz+k&uDqi`|oDPI6*3!28*L4&y7$$s^q|d+Bohu$?+f`~^qP&U#SL z>+Y9Ao;V@t2`@sHHQ<7@<9G6-0$o*?=Cvm&25`~08~obeI^1R7@cu4xs4&(M&c96^ zn;s;Gpuo_F{yOU4erMq@&3ZmQ`B=tfI%}ud;|q zlY{JDcz4kqjXHGAt*9gRa+1f4hqd@M4dngu>O@+FW+^^?wb0e-T(8`1{Y3*eDppJh z?Nb`HT55_may$<+guSbTQgpBTQQgba4&=XU`P)VU*&KIt1N!qeZdOW5=99L^UtFOU zExA!Z@B)wHU7v~u|2SU505&^gZUgpDba0TT7eCweGqAWZ zxkzyBdc0E_|KxlFAq&k4YlB1Iy@-n^o|yG!v3QbANyYdZb+W64CL_N&n zj={aqIFvx@jd0r8p8pe3S%v&*-1omq-G9mINBDyc zy`{=$rtlIQTJLxs@mW_^dnpGShU{0)G4{?h+8Wi3p-6A+WkHw>%nl}h=kl0+iZ{>r z!069Xf@!mDJc3wY@`Ll`%4P#`ZAdK}71tB`ngAzhT1MNxpdPs!XI@OD^9?_YD=c;b z`9t6}d8X%fMQvZX-{5(FpP z)8LEi2z|}$8BqvK;u4!%Pww#o{Cnw7YNRamrkP1tP+;|0{ngOeAKVw9tsL@hMm2{S(DV{wY<8Zxewo94y-oAw&8^(NqZy}F% zRJ6%G;%E7OwVVLE#$iM<)xIJMjFTZMmdUUrf)qLw+wI7Ub#bkWI)7=c{pB3j@omC)Q-p0T`TPF3 zJu~98=1JL+St!!XP;2RYj%1aQ3ls#QIF@pb!EYsdSz()NP$eS7+}sBb`I!zV^YP?a z^EX6l@zC76Z5eG*TNKyJ_w_>XeVCy{zymxyuM~U{lxwrU`cbgx8gb-lqaQ> zR~j96uU8JqYn`=!Eqqbgg_~b+jgg4~5I|7Y73R(vJsoXdO%!ngRLcabgTMC@;~(rC z9$k(GW$6ss;oDV5D3j*OTOODODx{fMOJM(FA8 z7HW-EJZ@_ubl4*jSzB*@rnvq?=inn}>{KAJkMmE}PKJY*{J9OBZ9Bb|174VoGsHMl zhobTKpMykLWZ6LT)bB0^qV`vx-S(uck7$lfSH|gRMy~hjBS+J1&FuXDF8`Ern2v8_ z9N+oa;ryO4J5KgHou?Av25+?>DC*8#cD_YM$A4eJ?~=^_wwEH8lk6*+I$FrYGI2y# zqU}BQ720rgXFI(y5iJ_bQDznjyVtE-Vdx0N0m;TR1B)TG%X4vTn2qNa;Yz%;oz}`q z&OX&rsubZ`_oX1)n7IqnzRhUad?OMFSR-N z4$Z3%wJN%=XRaoC0v#kta`>g35}ROTDUiQ}Y8BmDuyNF7+p{iBT`QtNlHG^J&AnBn zRDv_HIVFCyiC#nsFHHM1p{9=j_kZCng8A56{#@xPwZNq@FLHW(GUZ>{RhWl$eDe+3 z5S$|^t-|AJm3^n^XkC9kFx!2Ca)O%24HZHLwRdIu`Nh|y;Pl-IXV&$noOoS*nXX4n z@r_68AJ(_|dLFxGgvKGHLM}E5|Hy?S&dDK{pDHCR4-JUSgMW=ylO(A3uaAWqfILxk z#7>GR@+%t?d_O-Hv+hu_Ad6?{&=+>~3>MQ1epr!Pbo_KgRGje_x@Bf(s-s52N*5T2J{N{B{ z1v5_=b)VjZd&}W1gnsmlZY+nj7U92`snOEWl0>~F{!8<~*fjAKySuW~z5QQa&1><_ zoqaY=EFJg>10@4pZ{8;_u{5hab%Ngi?p;J3^PAJ}#fd>yBh{IX@F2Ie`Q;~bs5qRv z?onm@nbDeM@vOTs9jgbGqAyBw^;S+j%G;7It7-#w&*K z$2zIwB}guTVHWghF%FM} zx{mkuj}`PrnV3sTD@56%t35yRi~D#~yv|+B;Ye~bW!~I#lqP4{fR5WcT72wm zHp`;zF2kXI==6&He!JnN9deH5g)@5)68{f{z^&^R`tc>9@g zo*|MW##-PHXvmPfR_rGt0M+l#5-+iHeO3&kD5)-ScpW3@p?-)a92(sixx?y##MWi` zuNz@m;%VOK$6EH?XffTm3|C3>SNJAn%WxS7mr+#nq&#BXgG4F)3%_}xO29Jo@J37} zwN0sALeALJBs#(GDyg4g+GK!Ex6y_%?kjpXl3I%;uasUs8ynSBfNVxK~xB$#_g^AuwL#dLuoPkTv6G*&TfjGE)OUWOEqho$=jk~m1qL{ zmC00rv1a~wn-T2y^IggOnr_2jX@^L(i8wgp^b)oAJNe&+geWSutMg$nulewK>XU$` zGybN%y|?B;CpNN|=N`Zls{{83$Y+eSOcxoF{>??g20_gGt1sVlJ%3 zd_h4$nR#T1#q%pw)4(_uG1fw?k+GNWI>*-c7DW;If*4NUyj)jee=M-SWb z>O7u`(+0hzw|@6DzO$^v?(F%*r6xhp;>Ct3MPqo#tI=xaK$1LycTHj|2PJcF-lq-i z!Wmg$Cv;15hFL`Mx#D0B%7}2J9(SzEYZO(A4sE-6L|9vp% zxd?^$ZdP`4@q6>9Tmm=mci{B9nh^zKkoCZdY*g()1N_?ch8d4v)(H3?IRWpoim$IE z@YViaKkX#vHU1GkJ#7lcSHQ@^U2*XgV0ujNhG}pDQ*#b5{sYIOAb8i6X)9fnbtCV+ z*UG=&TEG)cqU{6MVAj{}%QQTbOi>wIv zAcDwO=x8!<&{wOE`i9q_Kaj^Lapy|m$Ds_;6$;GWuhguYpZQ&9pNs-ScED5@!yp_9 zMp6DXdb`^8rOLm01tu9JZ8N~UqdOSG6$0ZyR@T-hv)C3DxOuaLTbq$d3m7@W&IM;5 z96*6>@)y){@_7`{cvHW^ORT|vtVJ`_ITwx zU`7-Kj?09EglFpN95OO63MMfvgH<~V<-7^gbo!pX9Ou5N3*J_WKdY6P!{v#~$IA)r z@R;_oCBJ`93PvV7f%WGE3})j$0h8HaOz5YGw}YgRP{QxuPr=|b0|d$iEI+{ca(d`7 z5cf<~^_Oi`r8mZWacSu<0`U;cm;8C=UEcQpG*+5y_-%Pfc{R>7!4vP*o$?>9UUZ@$ z7Aj{E{<5bmIk2y^YdK+&w{Oyg?I-`0n7ib}9}YrV!Arv$=?QID>;hVpO9N-w&H5vb zM%HzU2L&=Mf+F`_2kH$;D_9ZuTAzpJ>)VWdMvN`0bUuclW5|Dr!ONn_YI14I@S+QT z?emn<1g;w$s9btszx}*+&+7ZN5wq}$#oMv$@H$o_-Zl8N*2P?MkoUE%Z*z7ms5j-l zyPb3l0+wKubGy9_cvJQ_s|JJuPoZG^PD@P?JOD0ryeGhD4_tXX5(K2=huha4{m$ z3flTKQ1mR!wdi8#ES-;4Dd?GDX2FATzx%hwtLQpMyCL13w{0IeW^Q! z6vD*Aa5db^h9nTPiep(ju?sdc<#>*!EXS%~j31fo1y$}`Yv`Z{s$(MIvQ~irJkeCkaqV z7oGB9lnatZS_B7{uhHGP1BNayt)MRo{%2ZS851?kni(G?rNN+7Q($AqCFS=sbgW-7 zg~9X9kuIksdP($U!`$ThZ$U=_yzXcX%Rtlso?cQNHu}*tEaE|)a&z<#x3aHyV1rC8 zh{fk_bOyO*w1fT{jc7i6+hw)z zJaFyCW{k=AFrAzOX&iINc`Fzlr$29=1Af^d)sIzVP=j)l&av{BzE^|owrXJRbFa1) z7kf2}e1pxUOz~f-AwQT6J6V&vR0U&i|DUPxVCx=xA0G)Y%KNqOf9A#!|F;Db57-K? z-#9RH8rNa_IyT84{LI88`e@3Ym$mqD^8V4R1Co)?t_L01zlyFMn>5mW*ud0dCGR@3 zESs9L#5XPHF^S8xR&j$k@Rk+Bx=tnX;bJwvo;42ouNwJ`NSeW`{Rze*c+v~z&~a(S zQ$gz$QG5HBuFIEOabQFoR9MTGj{RV3Cz^bPsbmgrR#wgi%NXeEgHc}x8$DiDi)Ub} z8<^HoBf9Z`&+Q8360A0*z9b|l{9k5COD=$P;13#n{P@3W`wnob`~Lq!WkfQ{43$bU zqO9ynBq0fry>rYQGqXimi6nbeWR^Ws$*9b%>`HbVdxrn}bLe^Q(f#~?&+oc^_jTRZ z)#aS?-QUl9y~e#-VE~W=(d|L>4}p)exzd?OXWT|bB4dhz>RluC)&|T)k3R#@!8Y%i zq;(f|>1EzaVI_SOG63fM@nYiUz&CF4i1O~wo^Ns(mw3!{@^+b$+a0Y1mUrC~1;SH^ z2x$?L*M;A_c>{=NH65MvrcVWW+RbtV?7qn8xs4n|OBVnfmw?>91VpOB;Y9yh;ossH zPvk!Q2mGQ9D2bG5dt@XgN2y{u2-a{p6l&{is7Iya1K;cq=DvIv~0PM`YiO2 z(*C`By(|40q9{muo%=lWj&qvTMOLP&ry-&YhC?pE;KQzkdwKuB^KR1{)XhDfX&5yF z8Omo*Z(xpm${x!AKmks9j(*4W?AqNoTTS~L*-I%_oLsY{DDQhQj(56B7Dv4-XkMsp zmvT0b3P})CGdoYj01`0ia6_{H|hL1{D99#9gG}&RwAlW`< zuc5Ld*?}MOgJD3^nB!0BE^X)@Q-mblk7H!f)iUQSM0U%jKcSYj?NXc$GV3yhHVzJ%=VlD21VkL-=U?RE8j z+2u4vj?hfsdE$Gnb{9CFJXoYj!U8t%$ z;rU`R!a0efuh78$h3$8jJfsq`&_-vty52kR1Cl;=&E-;DS*bb|s; zYVlMRi<&F1xJ#;p_pK4Z?;3@4S;)v)=ak+?$)DA%6GL*=~I3 z@R!os>YIwiJs>S)xpU`n6z)@5GIX!6FQ#HweS$_?v~KKymkD*V;YJvl==;cC9wO=W^_OiP8}S_@izm^)oc4Tx zRQimr7`>2XdPz(MMe4f2!i8{9gUC5luF!BCh=jN)=R7uNQ6cf*n8E&TS|`ux6Y4B$ zw`UrHBUbj4@62S5nUTb8n-Gg>%uMmA=nmFA+9_{BnVPc$15JjHw(Q4ao0Ax3Q)7rO zdXN}A{)xTR?iXHWgLFVl+FD(|cmJeus|;;SJ4&=u>b8{Dtu+(Lbw#$ydu0RBhtt-G zIUl4bvKf3>b1t0iUr&4`{YpKn3on}Lo2f0-NPhEH?_h=HJJYSZ8H}<*@>C^5U+}oF z5vM;$pgHBIvA5i{VaqtK@a7(G+xaAlX?rO#{|4c4gQk2nwv$0$Ws~{Y*abrx@_(Eh z(@rbES!D>~wy|}|;C9Gs@ub9^_a3&n?1|%kNfB3ZY<{`3fqWFVwlF|@ij3&2+)!!b z`sMyuSGBsOA$j}gBZdR;Jd^J>joF15$#0rlI}jSqJZ2d{7OE}l0#drp9Pk9ckDwXY2uLZlTN3=9_TGdRYXSU|QQ_ok;6vD+j-U|UGja)9!W}v-z@r_Z! zXidRz%oU;wk916bvh;nl5`N)Ksp`W#dPKM_GG%%{$(@f3#qZVqC^OUmHb$MO1pMJ` zDF!UF6XxAb%Elw>6RjVYs!NWGwS}ELuasVYp@q^Z6|aK24ie?v;$pr83MsP+5Xuut zo)p>YAFJ}{YTM@6>c~H9batZQX$Zf$<{?$}r+N*+siNRg(PK-h9f^0EvJD2g? z0f&N8i(|W|3Xh4=`={%olRY`jX-}aVj@kdLXUyTL4*pK8ew&_9s(DY zcK1LpEpRx)TGKRVK%4@@f9?BONPo@)XTMe$D0zs%0iqu?z~F!m5NOy`TUwu+>dihuvn1NbSF?X@@8gcT!#~U z8O5D=3c9aRfJQ`x?@l_#;oj;mw;A*dpm?v1m5gd^yZ}OM6`-}Dm1{v0KFU?07|!$c z-Ca5mlfb+HdJd3xKCCW)K0)({$?qAe?i2W0*M7LFZqjB{y6@AuLn(DZoyg+GA&)Dt z6@If?M$qL^!1tCt7BD7(69wL6gteZ>oH~*VxkXL~O_9Va1vZrIQqdp?fdM*|3s7Pe zR8%;5c>_Tu09s87z-fd+!8?Se6ND+6lT|={;WqU5;0jmeTX%_G`%Z=tclv=??MMI) zeuSDWAOnOr#t-undR~>?$+VO}$0sIsh)a$ha_X%^v*s_k}*JvP0X8%lCE%9%4lE_&^wuh^JapN36IXvQbSSex0G$}Oz$Ty1ZB zDD*n3H#B^rKzbChIX49prN(5;2R=N6(oMj&S7JuMd``a$7}wvI#{zFpyDd!A^_E>n zq;8Np&SWjc=1#dcdw5`=e%CH>;JmWH^f7%|#5Q{q=s^8fc z8a`SeJ%$d?S)OCnrlkHzqZTw9;b9qQl4qZb2;06*#`o zagBZ##=u$h#Hc)8L2;pr-SM5&&Dkr`xa!9D65%oMV5i~jWV`@Hp*w4>@|ND27xOR3%#$lnAG_yYK8*RmFGS%_|*&5q( z~Vp`HxJ;e{9TTFr^=0M{H5%-|}-6P?09~!+6A|fp44+FK2AC!5* zkLoJ}!x}n)i2MGv!Z!*#Pswx)T3=g1Kcwo-P0|ifQvpde5Zs}P0@#G`o9Y`rEzyn# z$A%*$2pXb^`=CFau3ygPEzjoqZfuI_xEWeuFnq_fjX&kM+w!h(FNZL9%8UF)`Y=d}(kF(bxflz9EA~OVZ zNbIE&(4aWx^y9NwFzL2!0Z>*^jkd)re3J9_q z)r!&z;E8gB?872rt5`-ImcoxYCzIHuO`SLUc{0R^L-%d{+Xk7RU0XgZ7d|qOr(Vu* z4#Cn+3En{8cW^r)1Q_`$XR{tTDljv9858t zI`|NR;j!>k z7}682MGVaqU5p453`Gr44AKE@R84?P9` zV%BEV@m>egG}=GC++*jQ=38p z2r>G;Ombc;-7v1j$VAt!#Ur_eb$IxQ_^v(2C$^q-eGEr+M*+@%lmaI<+SqCzEK|*q zl%(%TKTRcbf!b0=n_DLWzLPIU9HTMB(Kzzuii|}tOj~1`nv_YGz1T4ZO9LK2d(OCK z4fn2-{{4D^Fkq6jquiWc@a~ns;*@uR+!}2ve%l3gQ%bEJY`t#nhu~aM@|XwIH8DFm zc?K_1&Y%)@(PiG{;ez2Wd{wIvHix-nQE)s9$!Vv1+wi6Jt~Zvr+4>9wE9qlOKb{=u zWn3KB=MU+7(=&7e?j&NZ?24q?{1@1}eI1teztB8|_q^;m7vJD?M1%0k26CR(%sAir zsL7u9UVD9eQ&UO#yQNz8glu9+C{5c=AI9#zoB=sqaztTU(OGz-tRI-*ex9r|NWN)` zi?%H_*m`1%uTjw$5l4+r=SeCABP44Qq#a(o9jO(=JT{y=6F}9vqNQaM8?ZgUwNK+1 z3bODtvwB@{FjfJe?`lKwC+&(6wW=7tggFrndcV=OX$JJ%^xT)JKH4IHGp#SStR5SV z=5lDr9;N-}cy`s~#uT14=M6paDoG;omWGAh=&`SeycAFh0;>5|9dBXrBHzA!Kcpc@ znTs8N{bA=&?DZfJ%nDWrJ!IeG*#0=U>o;m9iHV7|!v7j9E)si#>Na^1_Ieo=?ZG*?2V!+KKn0qJW7^0y8hr^UcPMT%0M~$N)hpnIBRE zvxZot|vD)9*|%N6_=5S557=u*Y*v&m~x@tzV*cCvZxZI8+{f+AdCPR zkDF0~gvt|Vd@l&*+=NLgWLTx0paSNM!Xs?2^+V?WiK?%It4e)&G01{&V+z{8rd`yG zr@QDS4v*V6p6F)AV3Y~kdnufVQAR264v}sdP^7_1a&mH#`c|COj=a7wQd4u5mW~eQ zRc6DD2|!;5jppI@thkOt2M=z8*axZ6-QZwOaq%b^dV#Q2o$y8)7#bRS+S1Z8qdmWC z98@`GUR}HgDls!o4%cF`REIJ`np8g+Ni=Yry`)TfF0Z>WaHe^o2_!U*T|JblHk2c! zqPyCr-T$-8!LE4M$MNP1!u{rQj~+6QpDq?&F}ITv8kw=-BnV`qc|@mLc>}O`wP(Kh zA3bL98Ux2$SKa5iVhvf+A}ELs&$w3<^IQUIfSl;w0ytBBx|qh)G`ZS`H^pwjiDn3g7q z;?=9W!}<0_Z@;i>OH5MY-HG1$_L{4;Lp{AXls=Utg?JX|!elL7r|1C;3*cchmkJLJ zttfUJyPRvG8k!`N;h5Cv65HO6ZL#XVigatdR_F3!^)FnIc^F(dQV$|ig@vNiGcznd zuGIA}EmckQbS9Z`t=AY{vKar8)jK1`D(dOQfH5Z)r?G2hmFhat>)BDN8(rqB_MAa@ z#8INP)pn@xn%cEBMQq#q>i>6__y6tw>8a$FrxcEv%uWjG%^s^5@9~&np>i za-3X$%Tx2r8`#dBI~O5fd}k>F-Xo9%N{6wSd93T5-zackAV)m`YeGglFBg|Ujwp zX_rtd)%1@lV9HG1=qz%$8l#C-bl+V-tGmu=DYeAY|IY~B@FUX0JVHgHbZrn?5j6v?Qlgt3NDzkz7f ztvh#UnMZX=L1~eE=T4FK&X*llXsQi}5KzYhQQv(aWC8DUj?9UD`+PuLHXDj!lxV)b z9BK}F<%6zwD49-y!VXl6#vnQiidGMx^ats-7ah!>csE#FEgIjYEWrIDlA-G4nt8gBFHwo3>ThjUHH@QF-z6i(HB-HYtW`HsNN~SiqjZ z`X%Nd_A_2{?6B+LilZN5ugmP7N1XQIDYlh0l0&gOI=T(Mr`RbmiGlg8!9;fvh!i8SMi8a@9LBfg zy9`a61!3yt3w*N9$8S8MtKNHz1d^GyAqyFN=N*7rQ!@tvu{p3AhBGPYGG4_*WlP4h zZAuqZsmfNEPPX`D1v({_`vOMw-u5Oh{j0A^p@V7p`6<84E&KHfN4fiSj9X*GD!$s< zNtIBGkyb#GC)MNa&?-LcQDQgv-M)2;AKRAh*1*cjS_j>ZzVFy+>C~XE2!E2%jJU); zH}X4r#L4#pF_o6LiB5N0H-se=c$jTHXhx_BZ6!c{xUnt7=hJm_iDwN=Xpio*kXHMU|Q)26_9JAnVP>C3>(Zx~L=<}$rY;r7BvhQ1k*1qQC;SBo$q z>W5-`%4R710;?aaaSzi6!{CT4b>7N%SX9)JHeI7-pq+6=`Ap^8yZw4S&%2Fzex7YO zaOt9#pNeexDy`*r3uCf$HO>hBEr95EHaJL7-sMFZ*B6e)B_8~)23yIhyPgG6zKIX+ zJUIf-RN8V-oDjbb`_cOpPGwpDYp~kkGAY?XRHQ%1OWP1=een=y^FsJUuw5Y z>QQemZV(vMZut^Iz58Y=+c7mwotvKP`k?J{Z+R_HuHv24M4iy}LnT{c3b*n|FLKp0 ztWg@$T=qQP5KWtv_0vaFH7EP>1%@EGEU%9)@d+^~k@w5lTk>e-CbLidCSFxJ%ys8# z^zg2#{+oxU%ZD!kC;Ucru^1q$_H|3P_8l82(7S&6Id|6W?`wcx!;zj4I$B|Lvhv;I zlT_Z!(nLo6UrSESrZq4HA6#%|#}CAQedcz^kZD!YD9+8t+xL-6#)_K5AU)%@#?6is z@qxxE(%1_14{rf7+}dR`@H)zFmes^WA7j+7nor%r8=9c0&$GaLYVQ2Br=^7^F`EnV z$Hiy6v1#?fJkGuStO2ehVv;L`?D!@MZ{=0BG0JD9^*tr*M^-gc#PMgeJhE&LK!F!c z!Bjj=F|pT3rM)-r*oj`H-JD^8lDEyzvI-%_X3Ez`#E5P-S^Ge+y>)JawBqRPj5y{6 z;164x;37XiTzN2%?EIxW zXUl%$z^mhYh9Ol}8FbbAxSm#KfrjZVi|tUT-VkrR`{I%CC=<<_*2=d-&-2ezzB6>S zI|w!)xxw zkYHJK0r;jfMt35@GIaXM;9~d?Dp)`IeSN9$V}fT2JPTTT*s-JN*WZ4iYh7yg2t+C2 zCxQ%r{E1JH^nD`}_*UYXnu65wkXuk+k~LYOr-{BH_~d>ho}E|(8?Z&P1F&&nD2}!O zsE{Co?KcRV7HNR}qEBehCmVmJ2Xw0RUn6m(h1pO+z z#Ysa@V+YWdAp|&(S=$2GoJx>%M>4bT0XzXAlafs$qRXZv5K`nBiQfV$L77(x@)wXY zAM`)^3S$8JgGg1CPq#S2dOHP$)=Q&ppf0r^aGR=0av`y?L9LxnY?g=!EfQ+p1O=uT zP=*B!(sq6jsb_PaJPGQ4NE8?(cQMG_0feSJ!37}OqG|s`(GXh@nBzy5tF z0st0%g>w?r(VOh@(~}xv-EityP;_ z6dr(0FdV(cnEQ@A$h+QH=0#dt{;s7Q!58-sTFN9{d+^W)2ljBU1+r5M~DJW?V}_bsuy(nKOhyYub9!U3*L}Zz_P# zXsutyME+1kL?vZ^D%HJOfOKok%ED)!bFJE_{My@pMuQcB(Ckal^4h+Ay9-QZYOSbb z0P6(`bC55(nL0vk0OITA9fN>{$*cdTMzsv+Ap7|ENCoE+(*DVA5V05xmcFFa8sS+W z&-${D^<~4})d>rN=gPg1yf#!i)kTTSG@jl`0}bc2K<=9N4GrdyyFuFP#;UTRYsVu& zvgzUh&+10jKC|5fwFv;V#Y73>z651E)sPM(p#1u^%!AO-s877oU!Vi2$O5At>bj@! zdV-+r~5Y*ACOhu0GXMWv8QP?fqgayNp(6m)t~{!L4J z3KWV#zSzv?8f4Odc{N>{9_V%*iou{JE)0gcb#lz%VLY&*5Qk9Ru#{}{iR-y}0&L}|Yg5)gemk@cjDK~d`MGYc@jMnGb2rvPnkXrQ;NSsW|fYY zNDkYK9V{qzq;H0vB@JjLZ&-6lZ?tL?&!ABAgi-5X@nCa}g?)SNC8TnMuP~Urk%6rz z9wbDjeDBQ&!Uqv#o3mZgMr;!#?CcC-qU{$B4h`kN%s?9^grI|!HE8FA!#zxxx`C44 zU*gQ41D*Z_DO+f@QGe?u?DbyA0LMmja!*^{vXN(Q9MG@Ox}-5jksU+`h_omm9(xLd z+l@H4jj0&Al(0wi+s(b-LhQr&jlZLRzs4GxY(_~V>vR48H0#X?Y>NbBDgk{BIJHb0^<%52wv2*8-I zP8f8^g^|iRFcQpQDtpVD{yQ%)Vl(bCrtwo&AQ6)y=C=xP*3{Wzask`8_!4q@<)609+T%gki-1vz15(S846LL(gI#n9#vhj8qJL zrGES$`ga(Ps2uPds0wCpfVKX-k!9Y%x5a|^UG zH8kikD59;*kDrf|ih;!k^!AZ*a2FV`fRz~rjCTG30I$&&jaU5`Ix>JBFMrWw0X9t; z8d_T7*N}~H@$n%)0JA7qsYs~y)IeLVXn8aZps8>E7k*s_jvf1Ch0vW~zy?@<(4=lF z)+^}=>ah{Qb3a9$1X~f#_9bS=UgpZ0Iu8hgq02o%|DP~Od_hNtQU+`$G`nEp4Z*KY z7(n5aK@wesvHChXI%9hRul};^YRUb(W!E!R4=EOq?A?)nf{FQ@!rVAtLV_$PQ5&^8 zyb^rYH?AuG!&&~v@w4UP%zp!9=LNL}VDj2_#Ady;mS`B~{*>NP^)H_-$@2Jkup3Dw z(J$u;yZElMG9)gp&!8_lStY6f972?qnv&|=eiQ2dHRm+nJ&fA88CMFX0Zr>x7q)%p zPSOA?MOoQfOD+lucOQE|mn9iuFic;w(v`u!1egROUC|P**==KO5`U4Lea$Ebn)0)* z=})E3W;os)nioqA(_gzFq;9<2!{)e|YHTzLm5#`@X%l)pKqEQ5Q&QH-D!qMbL(R1= z(Fl2{KwsRNL|_A=?2^Z|VO;f_kmrhWHZYokpm?my#MG3Ak?}0#Kx*)Unz$9A)O&v< zNSlMV3yX-230RSAB_)l@;|GKVH0{GKA{Ur+$eaP6LC3&Q4V)xoV*)-n!d*fClg1JT zy!K9jD(at6#dL?x#{+l-+EU;s;9F;g&0HAzi6yxm{&do7YCX zfmS1CaVpsBJaC$zUxR#wpbdxKeFrDH*I*g|#uf%s-zo=h_(1EOojzE|j%sj?=UGE4e?85&VSnS^Q+o=r2LjbNfaL@)`8hVtd-4T5++ zHSb9XSq7UCha3f_fthD03#ca)V^~(!rL$;rgZukZ*JSRb{d?1tIG*VcxN_8WXI`nV z`ap{;TO6$=4k1waofXJNr$vY-7Xx_USGi;mXGqTxCQBRPj4;B4IP=#sul8TD#q%U# z+zL^Vu=9VP*M;osgr|tG{f!Wg;=UIYwuI#jf_vZPKUQVf>TCb5c79&9L#4jR1@N1f=s{C&d28*ekPf68@;fJxef9YNAb7@^}l6DsHz~o&Aa|YcqIrD2-yQ@b_bZPAr)N2<;xQO%>Zje zuBvIqx&HvK~=Q$G(){S&wA3+Df%miuAV7u@#sans8h zi$rulI*}d$$>1o6Ko$TmprxTfv_nz1*~8`FgZT#+N-56&qPPozIz6ZE&uptsh;W;1 zD^bzUr9II)L)co^JOE&vdu~?#n`#GUO;M7K$Z!;yAt6xK-o2QoyWk(@Q0@I&VSdU@ z4@Bo->|_@8;>8Q?A)Ay9nfX>Qc!br_6}%;DSD*sr(a!Y)Gn||s))gT4&TQo{cy`zA z)&h?G94{UJDYmu#@TrG^(B}eMb}(((cj(X^NXlM-Cl!oP%Cbd;u4b@E02PM2cy{;I zw!cn^p!~X-)wk;$7woR4p~3crZGGbY87EbH0nT6m_h3)NMSjB1KjD}!A)sTx!R$@n ziglhgOUx6CHW}m%i#&*s&73hz0x+|qt^UAsL>_SupgjM3eJ72qA_<{xN%7pdS{`Ni z%E|(MK}_$LHzY9`3`6+&8;4$oFYnE3Q<5r>hH%%~F^m9WONhP(W9Kw(tV{~U`z#+B{T&Q6N>~9`RPxJM**M+13^lZor1o; z5$IH7fY%51Mv73xB_t$3sRL$<3ZVG?C&r9(uPY~}L2_Xazz{j5q}cek2SbX32s3{T zZQ?^BgQe5kaoYG}Xu+O;_THx+_U!_^s=Ad-M{H*4^tp*wD>j~Bd^YoeJL`qXds4*^~u^} zGJ|Q?u3aul;PU*4o*>jh!fC%M}YyA zcYllpe^~I@HzV7ALL>TR;AZqdt;3zA^yFb1r5mBb+iY|Zsx{~z{)&f4@CO|X3cO#0 zM$T>QlCS{@|4qNXNECc!T3t~cNIit60)MC~Z8r~iBS2@RwUtn!gD!)(%kHv6_r3gn zxE_KGDBS)Ey{JMorms6PZ(@(0D|$ogQ96W` z0GG!KfSy4@_^tOkejw4GZ`#rUn7N2B4xdBm2bACGsJ@?fhKDUM|6s&Cc;bH(^D+W> zRD(B``RJzSDJk&)i-4|Z$I#TzpYCjK!~4Jh@(pqgqf?Q1qvEx!1_Z!5;eP;b{IB9( z@@6A|Txm^%6?{;^Z zPak6af%7Z)2^vE^x97yQt=^k9FbK~JjnAuBuR<3z$FPC~5Wn^Fs}=`0Z}=@U)_wr3 zSaszGve*>*014dzx<`mu{a(e>h{|^0`}Z$)qQHkf9tS?Bu+Z!WKp`@r`5h?t-^MLx zO-!D2pvv$MElrQ#v@}Oc>77fT^AHhwn!hRLM6lo$bnz4r+)))S4gS1^tMgqQfJ;`9 zS~>tOVf+A&eM0DLfw}<)oNaBI*TZ<8T`k#Xz9=C-M{Q4!-s=khP^%OgD z>`fiW9CE*UzPu|b=rca(v-y2bXTeYS{IrhaVg|dY^a1sNnVsl~0*A9~C<377y*%WA zDm;Dc_-@_hdxF^fDM8PlE;GdvaR?mo_pqlvV7_=n;&EbprtG-XyLc0EB5Pbj+B1kc zBb!m@Pw<9Fp~jKUJZ|WnK|{_(vKN52^AkN3|DmI){}0ex=xD}ks^%sWqTO8VN=~Vo z#QGU2&O6E?Y>WCds#?iNO@U8|(mDhy#?CzIe7%)s1(~xzES5u*)UjRcX|15r?NNKf z@DbElk!l|SZbJ^HeH6h&z%Q-&_>lw9IUCl*rNoc_h(Z96GZ?6uU%Hg}IxWmT($slS{It#A)_PJNhp9@aApc1REbN)-z5C>R}Js)N}%p``*aCX7wt zR}$p^2y2KWfKDI_SgQa!Fv93#zy*90RNyqx{T>z@tzsP4UmKptUnnM~4(uI~@iQ0> zd8@i0%M4&2psZZndEx+I5$yY`z~eWvzwD~&pPel8Srt&6$WRzLH24J3S|K`Xk4-_d z{QmpPP2iv zkJocY90|^{UXAG#B=??`z!VX1j-Pce$TcyM(!3!8i4=uHgzhE@)S5mRe@ivB8Z=nW zKSe0@$eL_6N*F&UAkx8ZPUT+Nh?j{y4+yc9dOVy^mJ#NEsIe(qa&W`dwv(4o;=v}~ zf2i?p?Yw4tS~0dOPN7^p=+_%>yZ$L`?4mZd=SDjUl4MPmAia7UnS+8oNHENia_65$ zYr>n+ys=0qmW$t+Z?Ofeu3uXucvgODqBZ-?r-V)Y;lN|)X~7~(Nu)>Cz`y{j|H1X( zznrW#Ndn;nR1G=@LX-JFovoLRQB&0_7@H2nIQJ$L7DfQnd!n$Pim&j?jkZ_mW;31G zEI^vsx=7N~(^t(jNbh8%P$~nLRIAS~kX<&o&Q>E6*Nz->tj>g1SJ`zDa9X7Tj`b5j z8bOiz$e*vcMxr;uv-9_0OYJ1Zz)u&-(ZJ2{?N*Sas1qKanz4Zew|}S%R#ZUEr~owp19>pAn}zz2(jqQSNU$3}zo>Py zw%F1s&U2Yd@ev=Ye}Qlihfts()Pc-fz?9_5%5-EUP@k&+!uD9)Iddrjj6uPz7gGx6 zj;K=v81_c!m>}0vy)iN)52EAT|x8 z+d!JW0~ZQldbcXS#gVt(SzZP2E4%6M3P7?plrjTc6FIp6z97%D0bpA&TWv~KVc$bV zio!c`?wM;*!%cKE!3jB|u9`Id=&MCy|H@OpeDBcZ-t@h*di3k0x5S^xar@#!ItwQA zLvx?OQ5m}mzCZ<^b_pJI3>sz<}wO;Q$?&hP4Z9Jf4lW+ApFWKjF(+s@vTM!YOPKC=#~8QN40ZP z>W6ZDJ>w)?FZO}csvF!v?XjR4*LL^{YyV7}_87SMp0@q`BB8>)jW5#^+v6#XmEKX_ z`3xF>(8OarX5!c052*)S)q;nasit6Te;lT)sGf-RT)qk&I+D#M^1Rzl$hLrbV^HF@ zlexJ8M!Rs?;HPF${{n(a;oG~TQ4ZPiTH9zG!ueWv<=cZkO8Zi2{wF+43ZegB4dZo7R%}C@ zv+k-*R-7|1HdG|0wt|nx1zV*}hXH62|A zRBk@`J$P_mf9W`;f!uJjv<{4~&Sa+by~=&m&}ErN%fKKHSw-P^ei!OP0b35c5a+17 zI{&oHy^VHQkOQ)gYuAneSw}C}+|;zG+-qHtW9?yNa~f>UUNQjr+GTm-O`7 zNRJg4E{`i-UrIL}PJOHk`5!W~2OuWY{4V&ig~L2N-$&E3Y{nI_!T@VC1gM3qygZPg z6u|$@%MPYQsD%Cxooe`{?E`51K^jxHvYF!CzfTQo8Ox94Ix}M!%s}6dmYEq6TrwEL z!erlV_smk%@-i#PIH0BO;3J(=(B0U!Z5#4c<`5KYiN4WGzf$&R5axPhL5CH<2!%$6 ziY4buN=r+1J$tjD_J_KIcP=lMWG;~}B-r(?dcJN5>W*cD+Xx7$j~dJeCFF z_EItn`o*pOFxT_2#IB;n%3VszxC#M6wg^rP6_?E+WGkEuGG||cdjYeAw`Ms_AOYj~ zv!6XmzioUf=g#s^Lc0#-Y{Jb}KSS?*# z9GoTi_-z0430`|A3%=aE;3oJj1P;o&&L|X_G4eM?w(KV>6sj%ZHdV5R*p?LMBJ(4))W$YacbNuhAjT+a!rxLPxae959NTQYC za^Vo)V6jqAe9*hPe^QZeXxmjC+gDQ2y(4vSIV^)SFzjDnHWAGu7~~ZHd}+C<4Tb;v z+vHSkZ2$UVXbwvG*Eid71&lfV_01yr|6d=?klJ19!^6P9P*zbXTJ-2n7RQn&|LQcS z5}6urgZHmXXDD!Ax`Z(?F~NC1kKVA_J;t_1I|uzqJ%tq?Q|4^CTzAS@%hxI00>l$?ep7=Da_T9k$q z-eWtj+B;!_SoS-O4~%?*nWa7JJ3EOWA}q%%MV1E(qTw!eCDHKWlZ2oC=5+V;H0eqf zm-te0_mg@{ZEeiu39qLEl>|O>1 zVcSepUnqUrFSs})YByFtQRCH9Y@s10E^e-OJ{v7N)B2J@Sxv3^^;OkvX~UKXnnKr= z`%<2}_;qLd3?DVpqVDD1pB^c-#wR6ho&T9sXw}D_;xpm7ay=*{#ALY0T$4Kvw?$(= znn03bIJhI0!*u&kM}mYaH!aUY|Fe^W*@owMizB7i)KjIxpG|n+2?z)bkjBD`nQxzS zB4)Tj3}G;Ge-|!dJkuPWtzRMd_i&c1yu3W&k3KB=b5{Jtu?pw>QJri}40z>Xk&%78 zqebRK??kLa>g(m;F)s1*lfS$u(p%MU)c3vC`^c%ewG|UZNk!H3@eadS)iW~L^HZTm zWj0ouJG!M$Y0z5egY|J|{mDFCA>@|^vM#z-!-Hj-wnYuwMPcLOKGoYKW0p#=ty>?j zLT-Pk>RExYhW{!vY>*;7*gX%c+^)a7VHwfKOFvpr#6$_(j!>T;_?_dS4(rZOWK--8;Rdi!QXbpbcR#AhH-(T;(9`4J zx^;`1&yZ2tYrlD}GyeK^GNc4TlikH0hiA{)R)>oVea}3JFAC#dRe4iC>32?2p>J2T z^Si)^h34A*<}|;*Id_taB|LXI?ZzvENtq<-+uHC@U(GrwUDn4g4CWg&d2Q5$cFUeK zu8n@X<>^^D(eztNS{ez~D_5@?Hw5A+tEwu(f;;{__3%DFJ6MEg2}tcumG)wd?bsa9 zv!}82Qxubsz(g@JG8TQY{*{h_dJNC;B>K5cBx|jVa$s0{h~@gjg}qNtCu@D&7gC;0 zZEQq;(nxz6?{~cPX$W~|!d8J(Q;#|0RFY+UE}s8A;p4vdIS9hJp{WVW-}Cf%;EP_N z?dT1c)gcOzr@wzOTl{H{+1%f6h4AYsFp?Fv9w5$AjSopmVz8U24u|(j6%`eAcrfYb zx__CCt>~(0>x+gL7lcsRZDlOtPS_AsB1ayzC+m_g7(_{lXnE>?y;pP{@PXTTSY~sf z%ziQoRtklBI*=FM8P7L6-4wcca4)^ZW^0H6&_|oj}oYpy_b`dlcB~=g%S2_W1^q8?%76awkBth zZJo=KHif^K&#_C&-1*7mIT|%{{`a7cv3qBC=`L(1fzfRti>|Qz{Cty@fiF9L3TQO? z{x;mG<$1y1y+NZVlHJeo$k5?vwt;*DJqwSgPd_iNtzADpIf=Y*;ljwAi1h%qfq_9w zdAV3-Hxn~+zE4z*=N{!f?t1~zu4l)t6#nq;RBOs)9j5&8Ez=u^Wh&`ZjpL3p#YhRj!fWj7>zlGO|NHmv z2<=fGvgEMoW~UmSx3{8_8?t7fnx9Aryn%h|Xh-GDE#Uv#! z3ky?+k}~zK=r=SpSWZ-nL*e=2oC@K58R}Jy*FlIHdmrz{c$Mhu*jTMB6&l!n7m-Bo z;!+aOt@-6vH1i0(aB&^=uK3f+-6W@WIraIjlt^*s`E>0p6{xiBu97S)ECVZCfeBx! zwBEMG>!fq1sc34Ijlcd|!a)0i_ zuaD)+)|Wkw4rik=P<5x4^pGC!}6n6d{be_MjCaa%c5#+UwUQMKk_p zvSvs23TU&@-rn94r9Y>qrzM?L&o-j2>y@S33>Pg96=s%g^Q6}%rM!Lnk;>uziMjvJ(+G@tzo_X`YPZq%NTA_(AQqfV>F(^aRy zPO~&Wdt5^P+x1vqp7d?cG{iyV5Fzl%1Q@`%cL?H_ls?>V0%URMVHIv<= zJI6hh>qn|IgOTsiRb(&vob1neD5A5pFI~FSFtsB0ufkMw`Bs$NdrekWR=JbtRX`|6 zI(k%M8Bq84SapH7N+qiiN-42KsKWdD54U5<>FL8DeAzfTl`YN+P1|1hvB9Qd|DeO& zlly>=QO27-&G(p#T|F5eb$Gl|P-rtOh`e6pn~?im_eU#TuTA(I7`SXqFyWCh%5BZG z^wjzJ5nm8QZ!C4{8yIXg;IT~kou9Dmua8Gwdyo(JW@c^Rm-6kKC;*ShGTTvwEN$cd z&-cV2L8taLo4X$GTA_|OR*$9H($iTFkB+8~_f|YpM#=j=X|xR$nnIM4K#|~>Z1fx~ zFbd_2;IY%gE>xAG7#4|B3AV30qeZ!Vw5f1ip+%)5g|4zWMao04&CdVb*1AfT;Amw+ z0{xXMSJLI5;|{;xi{~@CIA)H(r?C*?3xP<8K$e!+NyNj&HTjh;9|k*fd#*d~R zU&Tv&7G22!toYfGr&C9lb{Iwa=S@vaO46>W8883Np_g>yc?t*+-ssXjob$u2S=8^H z+PgiCv`86-%G3ne+;MYC9s=|+Y{wB-NY%LMsV3$_UyUVBV6m^X%|dY`Ms03RH`%P5 zo}EoEFGs+F%|d~Ns*0D+%pq&ij2~qH=sHQzs`myOZSrQKpgDkDTr)GX zbj46oakrE8o=iLlik@t(%WrrME@p7fz}^sZU8Y7-ARwY!1v}$)ek_p3vo+siR##VV zkKLbK7|K$mvl%HN@H;;f{T|Pkwk8IttOaTa21-jy3-!BZU0C#*w~vqO$GDTZcq4wt z8MJbicJ?-5aR)BRZ+s129340#};97iQQ`YZqwYssi+_}<|AoLZRURnOWWgiFsqK#BTP+?{VwMb69|6-md( z#>GY8f1GB$)SLBQlat@?ulMP0pGLXY0WSo@FG#>h$ANSSe08T8<8NV88babHB4d$h zj=6lRq?27O!T(OujX6oCJdZ-o8#cTF1A|Mgw7 z=McsJ`s^_4zc2p3e)P4jBuX_RIvSEWe`n#@=_xrAlkHp6*rToEVOc}PlQwJ1^VO}3 z-^~P}1+fk_j(u@7W)@vX^kP_$zSx}qNhd%16QA>Q>YN}0C>fV8H~nd&!It;(R=2kI zb3a>UDR_T2D^lWD9TKb|FDp7cyMbw1M%-$10e+r`MyRU!|9*G><3S>Hdc@f>GB~ea zC$X}!8X&!F1OP!9@UX>@uc6WET%uO8O z#>2xa{_#itt!d<-CbiOs4dmL=8?>41cZ-?K-DX-jEX>fD=sz#yf86o^_tMYZ*5SHj zScl&qu1H>B6qK#~Nb*YYL)hg=3Ws=*@;>}EGClMG>N?w%E7%ahO^{{n)*JwN5lY_= z=U~gw54VU`D0RajXUX*?Ms1tC+NDRme}Yw<@(db^MabLvE2H1+qoLL$u6n~tCCKMYx#Cn1*a*FQBV_42p0xmqIjIRtY)5IK@A~?b zr&Z9R8n!*BZqb#I607H7VffHKHH?psw}(N$#wm)l^=#A^RFa1n!#|PH;N!o2Z@0kO z&iG+~G`F2Xi9%VU(@!#vaONG2hh65QVoZg(i{w{4U*tQv2xea$XlcO#8f2tRC5saF zP7~C#uh8}BBhm@X-1X=9+widN5QuQNp!@=z4ayJ~Y2Eo|aLjn!)aUgU>eTccNk zZ~-P;?22VP&dcbVhha&Uq9rAJnAakD`_eCt{1k3e2@4jh4y{b`mbpSSh^5|zBk_`b z8eWb=KEcB2(N5vxhCr$4V$Z#&zrW~-wz*naEho{Fl9JwRGg19P1D90M&=Bp|f|tf= zfjn!T8&7qpeBX+>>T<^GNaJ6-CJ#eq)ke4;Ade7A)&}*U&~97;xPtle@mnlDLC|ph z@yN@Y?KP5Z1DG?ly7~f`2U@YW(D*+7{)S64M~7a}4BvBaIj*}{sGxer=k!qE<_r1& z04VKdg3x6voE-aXcW{Wgt3?HxL`K_G*x&=!KpT+fCMzSXj7{1pz;HSxk&x^(_wuYOKbr0L|?mm^1#dXuGNR`WP1uJJ+>}P#3zLql`r$3d%o`)D%?yhRqUK^o>xY*pIrJT zE5ddqOl`j{{AbKtl01AWY>dEI=f6hxp2EiSU{PBqdapuq7G?36C=b@beUlY>$0Um) z((J0{2icmJx(lc{)XhcvuBi8}($!e*TE zY{4Je{F8H=Ene>~lF6GKr&2&XUcULF9$F$K9&Jq$;{)BopE)|pTUv6;oU95VBpH-c z^wIVlNz~j@-zSMSGD1QH9UYxo$7j&yK)d!^_oJ2WAU**>14Q+X^xI2YPh6)Pae%6P z{;1u4tURE(84aityCsrt&`TB~P>>jEt)wyEcxOwwWf%vkyp$X2Z~Q4n$eb2TSXUvnrH|S<{D4tcM@or+q6n?4 zlLboVWAU9rlNQ#v<-bvMC92gSAC<&KL`vlf!!l&D4u0ga78vO3Ga{P?QtU*!vsJ{; zrO{;#s3JH`K`HI(*;Vm_9j<4&>vJ4EU%l3Yi+{+g-3f4C7i%^>39vrLNbFEe@wdQt z@{P#Wkqr}fiKI(cNZ%3q9g~J-m(4m+j_o+x?Qf3?617&$zR!@o%Z`oLrr-UAxtk?8 z-m!aXJvOQ`1xuWHA}Ht`32TlPUAYI2i2@_GJxjVmw(g?=j44PoNCSp)&Gk^v*RR0j zeb9GR+Iq%TnFn&Y#P#Kvm>9sl&E1O^&Z#^AnX%x<$IAr&ePhYb){pBKyueo$(4fFSoVQ6$ER;ZmStDzLhR$X8H%SgE&cf;`9 zMWKe5G^sU0z`e#g6huc%>ZMor_Da=)lLk3&B2lJA5I`{N4=_^{>c zpK}|uIpKVlEdwcfhQbI`cwFowZ!wn%} zn0Zbn!+&@R^jS!5u63>HII_RRAmgs0<-YpbKR93UlNWKisF^_>?{^a3{nT+e3M@Hm(uef z8+`RSaf5nx0X8ybI`7zn3Mcbj0J8{*;N&ETUst!h(W=YQFmNp$&RHw zxHJPReuU%2-d2RtDt zhgL!Dt>HNxnqLyImi#{Piwk3c18(#eI&2JlE}}~xcz)$GG}CooGL(pnwPs-x6gjZ^P%?WYnu2a(e#_LYvH$bu z&zHf!x2I-i5R%tAR344iG2=JpC^9y2q1K74#bKVrV`S`cQ@G9}nRDyFNy9$kh6)t; z&sX~b;=}#p$*w52DsbMVSX)MY!ONOyo{ufK`Z~*5`t8&oY@N@9?_YbWKY?_SD&_CK zLa1){va_yKLWKMiw_jAq#?Vdc(uvulEUo$$p=I7Z6sxje+x`R0@3k23PZ|7;G@}fT zj7TWl?-&sq6C8W_D=pVK9v4EH4V>gaWMJ5Dt`S=7s#pj>t% zRrqyiiM~qL=_6HVO}yN-h%s$^XKG&rUOR?kPkm+;Im>6$jj)_SU3g{Yw3^fj!k zPSb@5PU3fl(a6myBPsZX-B`Ad{ztV7Ka$1!77NcH_a51s87q`ev*bMw4E#YJzBDwm zlFah2_T~qZ5L7e zKSjO2kA?D2h{2F5C)t9PdzO#!tzh=gTJJGU$*6a4wjn7RUDnvpfC2bdJYQ)3c`;{% z+fIWdU)f*A|Gw;)fDptu#!RttHmy1q8w+Ms)T`4;W&BbG-9KZ;W%n0EZcaQJA-SF+ zo_bDg*ec#Q&cWm=iMPy@J2jQQPHMDHvQ}g@{S2?Y|f8I2vw1SgOPk!(3u z<3+c%wRJcX$*1|LE0;|plJ^Om;N$^c~+%N=BsyZJhPDVAUi87et!uQX{B|8?zYfj)p4fXV*}-@O1V=Lz`6m%Aw=K0H4DU|l7qw7QpKVO z00J36bn2>Pi9`ouTk^nV?DrphV!`vy-NuKS^NmZURL(JvSG(vi~tv zLs)iS%$~KzWNC$iy)LNShPJtL0fl;fAR7c}&Cl<}<7Mk1--j1?nh4b1J&*~#g!!!p z{urCw#=KfxMMV{T2W{4y%iSSwC!e70M>z7<%DQalvko^R?S0Yv)>`g3Tha-lVHl8} zCLpFQ{(Ap>xGU`*@Fj?Z3Pjp85GVtQwdViT%ASDw#0&&?F*?Ch;Kl?fT(gTknGZ`W zDG*u=Fy2W2B(GOQ9CVmpp9e|v@DT5<42A-#fd3WZx-wu4y%I>uH}h%k{1i#E^j&qF zkn?Q$J*W|r-~89eetN4$=MCrDi+Pr~Q2H}^f#TYL!$lcv4vRx?8Jv8Qq@>+yr9`fR zY5$GDO~2T$jspGjGJ3E$k#{_OsA2aVp9NYWT$5VlM|69+Z{@z_B6kj)8K0@!9 zM(^PEUYjrX_2Vs%AC}O&UBzQLB&6o+%r$a2f#>ag>4F4Cx8nDiikDp*Pc?oVF?;8} z$1Ke_4Aoh`b$f?`z&LSf9FUxAGsj@61J8837@B17JdeI+eCo_k z(aGlDId@59y8eq8_@)a|O}=PAUvDq!&!kh{ZC_}aULX(QH1{31?dk2-=3I~KMH4^1 z;wddjtD(`s&&RK>@)=gk0S@}(R8gvU>HE!?_st(XXar+j#|dZIu8^lU{-H{nG8hy- z@!Fx$3LJajBRy-9#}uI?tvXO38c;h*qqESJBH*!Y2BI0XR*KyHwmg34C z$mi(SKJRKk+nEL-LIKPrNLzgCR-4Ue``k9>_#bJ<8SF~eyL3UP)1fR=^Yd?K-QN8< zfNmUl#?LxA8O4UcU`k0bGTgB74-LgbD1{rgBYzm~qS4qu(?173tqEvz|4L4M2M7MQ zJi3^ua?pqnp&s=AOx@xqp3()UGdL&>4GlzI8ZUn{3j zQ9j7#a;$!{pSe*Ky?zVjb#mQh?=Z!e|&t&~r; z(MxQfZ_s>qN~C;ou|xJzk$&6_bQ0bzki# zWe~DQ+Hs#mqua%6F^4oHJg@*Gxl>Feg?hO%QeJB4ry8;Ch!pui{^ z+!5)1=YJnoy9*$)IFqc;!MXu3PVem}Ye9lTLledCeYk1U#%&qz4iYo4Y%|5(GEJZt zZ*5L1f~(4~$}mUAq&bXY9N&M8O2%eHI9wn-JEn1C!;BSmEK}2tNl+P5$5!(v&*K_4mM{Po-QKHAPn-PBpB)#<&apEt-(pk52u zjfwF*D#3^Mg^Ai-86-ml~r7g_*t=TrP+JspT=D*iS zlNtJE&mtuyRWkY%;YW)8!;b|0H-eS-S3%wm;K=B5oJ2*dYf8#EYzH{ZV*&JZ&ocx9 z&*I9=M>1S<2E-^_F}q)~kKT{r$ke&m)NU;qe6MC^$|z-9|Ss`0_(XgqHg(!GG~Vg*#w^PwWU z0&nmB$w}PO3wU+>OJLU+wTtTWtL6W`56pZg2iX%1ArA?Pi+xrQs9yZULe8YnkytOm`^QUhr zND@=XezLK#3E<9vJxPd2hGnOqVel)tvrEtG+1DV7_gr~CaI2vH;{zWmt_QZj7@U8u zB5+md?75Ka?-9v{PnOTZIYdN7zp)va{RHU%d@%#0AW3AmKL%oyH)lD>z`?E5iPcQF z;-jiJ4_YgTmAbUo8I4wY5Kbdb7T_UO@6y5+9_AG5Gr`3s`0}^e-m|i=qp}_Xa^(Im zT=sVVrNhyJ=dxYDcj#*ES8_8_|4-kJG1>|djVmS?xubx^MN7o>(f9F=SLrL$AtE~4 zZ-QqgFF7xC}$3Lm4G14=uG8dU!Vkc$m%UwytkBpyhegDhF%4Zw-<2TjJiM)*2EFTRGgX0Lk zc!I94qH#6>WMiTb2OJQ_kHJH5h}6ZUrK6{pqm23Vy@d^C68{koW6Zw>r)2vhE;2x= zCSVK|^V;Wux|UfL;PyzAeKk06j10wE6r2*4?O-WLU@0ZD;QF#HcaVxg_X3q$1||T0 zTrf_CDn-&Fwj8hhRe8u-uA(Z_C3eB#^T#t1|713tRAf$+#MP9oqU za4X%`E+V2WfSIQ5ZZfcm$;-=wA7OC(mC^zs-B0@cpod|fGxjd2=U_)MyEYGe;T7}z zO`#&`ehj)YvId~0TK3M8g6R}4DzqeE^bI^>zdzq2f*j5sUB{0IU^J^w(tI)jd6V|y ztTEZegU#61w@d{jpGjoejiX%FmLo4I{#hL9r*mDweY~JI(ZK%AlWF^ z`JOqf3|vpKMTk%^%g(|o-IQt?%lh!)F^K<*y;($1wL)fEBCQ8Om?s19(Y^<6MENJ- zIq5%W?AJz09d{SC5UU`9?KmUYqmm=uH1+xK$mYiG5?ol`uy}xZ{ss36&mI~*&=!=U ztO1D^5Q`X~pFoqAh`EX{oDp(QKObXI?JLN?QpVt8*?Z0=807;`O3cW4%k0B?T|_n~ z0WRsAr0Z7k9cD;59LUps4pQOTHVzT(V-Ug*!FN|G`ojqjPawFJGC+kKG4JT;z$YPT zDY2^fmSFYzSoZHBmi0hhfWmvZ0>heD$;o-+?BH>OT|89nQ5@4PXaR2<>@t?4W!F{S zaAM@>d^Q+Nm&Zz$e5Ssz0%{22N%Z#i<_C*VakGx*e8gZ+55-m0w`j2CZO*h1fijtR z!-3m##y+>snsWDD8tU>o=B#!=44HpzXn=Yh=Fd+UB6z5|M;I;KY%QJ?R9X~`dZB1f zq<@3*8-m1VTN}qYQ*R$iE9-9}f!Fl(Y%X&XGYeMw>(WetYgv>DVm(C5t*YaR3rbr4 ztYHbl9aLZRKC!8)TL~IexgiFTEvOlfe`jmKGYKJnJ7hKVE1W#my}%3t*!?$n607n& zcILs-=aG5>CIx$mXus2~TROS-Nx+B70s;ETVB+(=Yc`{0BrJZXju@%B6FS^`lO%~e zCv_G8d&5s=4g2a)oHXn2kVARFL{&*1I+4cfYN0QorkwuidNP(7T<&xidHolb)862HTmW9nEEG z(;T03pv@TJu|356{z?HK6bzwccJeFr)9(kfgE#@_5kw?+vJTmPUHv;OboTD&-grK% z=l*Iq?9oiXqX}Y;YzV?OIGAd{LNs(RG`&*ELVP1r%b$5S4;Onb!;ApEtDP1#1sGqz zeKPe@bmEsT9RMu;tNq1RYA|=noa6q#H2_!;NM@K-&iS|1V8=@{ypvI?lZCWYQfR z*3T@mGKsV6@whS#ra9EnW`a_$Rf>IDRI}W9W2P$5f!8X=f}FK-N;wCo z=7{;mWru+a<4q)x8pivp!w-wh2*9F4Jer8JK*-_Ib9?CQY;WaB-i8~_G|1XOflPt7 zhMxbie^=%I*2CRetNi`@x6Sp*kc*;rjQNH&5s)VT(9@+eUpt2`Ki^LynMXZYEC60S z7(Pxno5&oTojV;R;l;z^Afnj4&pJK2X@e`TH^4(>m!vxUSME2@?Pz^t&x1nn|-|F(fom-l(D7CaG!%X(ys)DV`2TmROhW2&Ea68&$T-cd^~GGM_d?Wwad zcM-ZCAlq;e_gS>ear>enjSe;wVYg2T!ABQoDkU8qPECRMAQ_VS*umF_dEsYNIn);d z{Z9lhtS@K|Vro8!Cfz*fF75Oo2*y0UqF^=&rMG4txD_z#$slV&Miw2&gcb@(fgH=(4a z0J1Y6?MjU5e0f9zML_V-JA=~%S)@{Hx*Ik_{$Q+S{8r_ACJ`7I=)@z3EEM=nkfMaJ zXMj=>3p}S$ZM9pCb`ErnmrFYAVI_;1F4qlS0DskZUU}Yl>ng2iCP`YvX$e+@srB_JsM{DQ=n-8$r=*EFVuE3#Ltq|^ z1B1U#$8X>9*&6{47#aKkDANdr*y)Xpf|qwP9~PP%)$+d0u&>s>JSqFm#QC`FkZPFW zfW1g@Ep6Wl@60e92PPs2pNVZvP;$^n|q1%Ys#9ws(6fUAfhh9h!?Rv=2{ms~YrX z3|oL@1wJSQ2+3t0#K!;wG9}?|2+wh}ZEkDw2y|DZz(S$LLlQ2k9<1)aU{q;Mps}gn zz*wZO4P)7H47CY9<;CQUP!?Y~@Sk90Q!PP!nI~a(=?EM2w(wjxgeo-{l{F}pHfT`c zbaisj97rm9X-{EhSzntXcV~%@wObeU8UBd8TN-b%N3A*%rT5Jt*-h{Jp?eD809GW?iksVlHiatT zD;;+r8nZnTLqG!|RARnjEw69QCsbaSh2BXCIQHV}NIm`E+tjWb-~>ll&7P`f_TU&2 zw*199iN2SH2HRLE_zjSGGGb5O~?1Fa<a7{EsoWR$a`jMo)N~HMcE>xx1h=y$C;|jSP-NgE*D4mZae@+yD z<-yv<8o>rN=f&IWddoI_8A?Qm!US#$_AiXQu^s%b%Q~@48?N9zTpTQ5LHZQ1Ho>@u ztY=%=q6_18bmsAutdY!Xx}-}gnp7?-)JYBh8d=|3gqh{P$kIZ6}T=hije5s7@>8eaw*^#ow@5WZ^E(S z=Q>ySeddYRSrzLn^@qpq->j>(rF+ljF(`ktW@DA}41>GZQwn)^DyC2ZyDE2k#2R za;W)G`kklW!;3%m`jFmRe|i0d1z&;l{W7LvEBl*CbI#SNFMLv*kE@cX*jIJ_tU?0^ z+)E4OI6zD`Z=J)e)P{(zHMG&Op_)Nf1*$y+Rj)@q{Y5kVvqH@5jgCP7w#0jDuAj#& zx|Gg!*yKN>1NA5g?B-shI?!69f@!Y2$B<-wUTG7YjYx#^z*Hg)7c}P$FfCE&Fs)E? zO^8;RJGYtc(YDF*hGWmbON1}Mcc4+y(d5*;1SOoQJ~r>mcEKIv12lKA0{NyKd((6M zr-AqxVg7^jnSY(>aMp-+Jq~`|kcRrEY64-Q659CLS7mDmU(3P`LsC z13U&_yeHi={)=s2=^h2LqMVGThN-HQhd_M?9J0ARr)nMgnh#V8%zGc$M~!m_e}OY3 z|6^O<128qhlxq->=`iruG%`&-d=BpiuH>~zp8i} zFJ!6@wH(q{mFqz|v+?D1`;SqGA_;<$98EChd+{r~^|_7i!$lyI;XR40`{sbX!ZPi~jlh{QpoK^h~UYVaMt;l4)*(poDxyuQL9Es`ER zF(_$_L#SK5lCQ@2S(+JF=NYU+!{IRfvsWRUKr$xB>d_!ZeK>*F`#-a}f4g$V!`c;Q zW@cbS2_NOYHG}hSwksX@5)ew;3hMqoox>036g`Gt$sM!!BB^_1&Tz8PT}F34y#Tv@ zwEy1d90D;`;ojNqs{YI)-&n+!|K6h&_w;M

Ra0JY9a)2TQ8shdzX};cO~qiJ>yq2x=^5hQ#}^HPAVj1swM=!KF6ClrTuu3;;If z&6^D!Og5$as~Ft8Z&Y<0ZUps@&3iCXFw;XwLZtpnKvYLg0opQWL*& z)c7a7#ck;5sN5pgdOrv(1;{hVXcmBIDJZge2Jxw>QS5i#Jrs~&D{|${2-_ya`M#h< z&nFnaz8@`AM;+)NDtLi;{w{q1`UxA$>7)LW*9Fnj4=@wn9XStt@bRACCTNvjXbdEf zOf*nXz`XzEQ80)gmswfsN2U`}+G*iF99-`jP5!24mAQy-)=5i|XawGI=v|s@I`K#@ zngv^e56KZ*QzZwT0{~09>vg;J=P_&MPbybN8r?0NxL$->pw=ypMlf8RnDHMo`Ww5) zyUakK%_wo_rHg=B*-40wt0V{~EO+01QSi1$1XMo12U zywQRQY@3z!v5Myi1q*2Ke%On!h`_wyt%>i(HTbORY#pVYXV7$qQxZ(!?LAl)Yv+9OxSO5HJ3{ZzNM=V^wpc4iKq>A0A6?+49kas z0vgJC{4r0k!AvA}LulMgc>4_?s__1qn|L0^sgat2uOD=LEq4pGESHieX)g1mH@_t) zg|HOF7w?1dXG3*9E zFI`v`oB~X&h=%~mpPtTkPA)9_>-O&MZ}mZ1ke6Zds=RXfuf3y#14t(LFgj@ck{o6_ z*7wYqbZdpI24Vj_>4VM?(QeyZk?G+QgSnsPP#h2ojW5t_YeitzD^8_CRW;L51V-~A zn@JajukoQ{0NE=vG!qm^POXffxJ;eJ6@4z_@$WSHBoWO@0A@fB1 z%fapKy(`iBKRp8?%L8AMY>xmF_JHw&m{E)zIV=IpTrz(TO<`bqbd$prCGe8KD~1)C zUyFEmwjzIM)^sJY+1N6reNV5PG&cCN;&U2GE%pnRhzM5r|-X5Qf*r#>Y!n zWdBzR$Vsa8KLZD;_4W0P@v`olC>UhB2FEq{L!Ow0w~o+Oj7&^$O2Z(g%r$9+c8C+;EDK|VIYSr6Js0HeWIC2+No_pMZ&!4-#c10m@ z8N`VwV4(g~7W^|V!1v4J9ybjvN(gKQ6bhM7h0`#=;?-D9;1%J??54hQznnn5%Rg80 z)hT6IG!7(}mCV;-^S5U&JH@(PHYG~Vw?nT0| zO(WEn#BmtW*lK04r?xaQt!%CXFLk-kNm*BstNx zVr#QcL)I8@F)~bmkjT)Hz_A9yHVf4ER9LUyJM#zJ#nH_p)rM3@n8dXXfx*VM5o2=D zs0xEqe&hqc3j84teBkX2Q4 zG1Sl>Hh_{){=gqh!`>6OD~95)8Ul(KqNe4|1LpYVhW{}h$ec^2dmZXlmCbFppkFd{ zW)n>MugEXLL`qz9ptDjWyRn7_-fKhDdg{Q-&@jR;zkX>Vc@KTRKEoOP@y+YJzgZI_W1~b$ zifHs(WT=*kGVv>&bmI7oQW+A4bHdl3nwYTt+qE94o}>bwYl6?+RWWTe{EZI?S_SM( z1Ej%WgoQwKE|j0bKMz4~Le4zt#6=#q0r~iM8)G`aL`*V?!3!|5fxfQ^?G_RiFw|Y< z#tE}oxIh4@-PUvI>aTQsHD?Knfq?%NIELrF6h4)2wa(g$hoz-b@v=m*ot1m zOn@S9yq+X6q$aE=5F@X$uPQ}@*r~vSjw1{VI*<=<-vwza*)|adyWupFEnuO&K@_|n z77-Tq<0Zf=f^Z&*2fOY^s6Z4ab$#c8KZjmLSoOFFJhouKAj5XF3=~AZO~-FG!+|iu{FEi0>n<*w z3lWr-mZr6Zi;H`)v`z$O8z298YaA`GfTrGg#9)@g?_|FIugf_Sd&OL7KV!wrqt-w_ zp`xP;C7@zwg@Z6aVDkst;mqtTa`X$MgbO}+bAzL!H3Fi>VPU|dXL$0k?-4Z<6G^aw z@#Yrxf4Ov7=g)4BKKb`03k0ylIckArcuR6qqqVk6Fj1|5ArpD+;rC`D+3#ezceSXa zpKQbSyDTluH0gVC9mbvu417Tg1Zy%C2xSdm(js)R!NbEtB#`p11hSJ1&XGGs>0thS zE}$18-I`3L=SMp4n<9Qr9uppxf&YQum@gveN07mb$TFuZXq|@!*wFHLdJZL{@6eW?x?7%14Hf?g-nkF&tWr-j3Q9} z^U+81p;zTmj459jh;-i~F~^9G>#ZyV9QX$&w7?EHUk)(Hxq^KMB79OTB&A(Pcy=%) z`I53bU!L;TF75|yxg2cD8KbM4aJE2iiPc?1tA+VD%aIZ;@Q;DP!XKg^8JdT~SmH|+ z!RRW4DEr(1sLco{xu)i@nw4^^T9Ca$1;@J_Y{G#cr!WqN9ID_tPzs(B_-1Mx8=Q^e zT;$p4JNKOiF-^g!vy!*BRPEsm5fEVuTCwPQ77dS|!khy?S;Lceq0F&ME2RMYO71cn>Lk2YM{K}Df8{di}%0IWkGLT^rZ zZCrx6v;rR(FL@Oc^WKLC`cZxT64|78^9l1}Hxkow^3z_uC8Y45T5X)fAu0|&NS~U; zqd?7=x}Oo%)8=2g5IXp47v}MdN?_@=bA$(NKWK9yr%Zrt85!vL`q%|Rf#62kS9{Ph z!3kkIQqtp<2Eq?AP5mEMX?kJ7B8t2e6ASC7r?()VX@OD3bK-7{@^&9h9?o`Q`55`U zBW5+;2NZ=UMnjofr~5suj z3AOE`{IgX_*JWfH(VE42|7BEE2nzdOqQXB#K80EJYNOUCt~b8+R<7s`$AlUUaZ z=e;!F(A_f{y%)Z z2RzsR`ab?fMs`X{X3;>3$evMYh%(Adlq92!j7SKXEsBy^*@Vi76h*_zCNr{=M4|M% zo_x;vp6~B>{(q0p;~et#n$L0H*L_{rU2_FCR)BFx`8iAT0w*J_>qJ)=n0H5IxB!a*5jKkE?FfE$URvw|88;7VyusD2BK6J;#B~72HQ~aA$^)BfXW2Oz8h|DX zQr!k2p^A6)90*g7Dp_P7e!vJqVfN3N!Z71axkVpVyIw}HEnMZ*bfg#oQqY0^*b806 zYKG)n#0m)%LJ9@dYXmqnxL{=wgN)Myo392{nPl7tqlY^+JGe%7#Q+cqK7PAS*`O4i z)T58r6XF%*kk8#FsVP0Zy;N5#MmDU&AAKMTCSyp=b(7ef5VEfBfRhf~-WH|pR%*|s z_hV6$H|$>ysFdKTm?escK^FgHqlNXN6#crI#tPuS{+olFSzkW{eWz-f#uas?zdOtP zOE$kBX*>{B0;6^Cy zN8Q57(s00sTrX%;u{e1C)-mE3KrVRc!j>2JymD_{-Yzk=o>&E7wlI(#`?BWXW~R&F zTj9%!`d|MdI-4#rmblqSW;Hoot}*#{!7IxZP9|uzHXOd(FEsjwI8$l3hTxRfH6nve z`?La~xGL~W;jeHyBSZd5WKHxF8i8ET;nZwz*HiU!?}UERnw9EASZ+J^hD1;UBLBY; z6o~>JoH&JtDpvi=lH55H~v_i;kQj%~a->|%KfxBd92;QjM`NvW%9CC1>y1mh@(|E_(Ow^Wu5NjxpX z|6F>>fPw^RU+)}q4zD_z`gUZ3=Y{sMlLoLW}MAi$vd+3v0kCpkCrc$CW2oqLfEqgMk?OU~PF#qLTs2|BGn^ zVgdjZ%TU3Kw7Uz+Ogw_&6s$%h?*`?w7hKsdETN`-{~p1ik#Yg1$LrGQNq{J5p$s`>yw2u2xIGDN+H`lT_`inxGV)ONoxJTvaf6i`XjzvL4O3CR zc9n!Y>-JvP?e&vaLsx3F5Vsc&k$wU$rOIl#*I1&e7#1i#7~kms#S z%Os6kud_4hK9K5mCoe2Tr*92;V>v@S6cD9oeFfqHn3L)_ao@c7XSxMpYjIa4p$?#4 zer<3k(x}}4+QL}4KvSSl92^{yA|ge%@vB~=>=V9rhvLSyqq}hN&~;=X5__6MqqAv@ zSmi)V1dhQfLec|j(U|qO|K=gbu~rGGv#so+1{qb8Yxuo>tdMsex;E&Ja3m~Tf0ZVI zgkVPI_Bl)@RN2gaS?a29GrAY9MugzlWPa0;b1c(cWnNuwRuNKzvM_CZeLcbQMD$X8 zK#Cd4nD`H*#Df`<7I+zc)gd%+6JQ)D>PgHO_Iys)ZvAXY(Ubf;yL9b6PRU)cTr;@43n$ zOre0IPrRQVpJ@_-#^f^$;9yzH2A9k`=VblvEt%wS9;mP09(3R`?I0zkxZKm--R9bP4b`gO;GPgcvAK6o#0OBXe(@5_8pub7(u*K%>dlX6KFP+kWoAr+j~b09-V!-MQU%dVUDP0!$D#tO?u zzkQ=lmQ+opaP;|{@NQn*yMo4+fn2$FGTBs%RJ z2U@fSViPzLX0G%>?vuV~4s?BioM?j+b8%1KnE}2S?*DTOWBV|_ zx5EqYBAmEj?R4*TjVJ?kJZ~kR?c*t^0ajf1A}cd9_};O&NK5#>66Y=0(b*QRv=w<> z>BO_R*9?P!ab4o$QRf;ycNowj(rhjDQtk)q#lN^a%@#1n-7l4mx)ih?puHTI2cOA#7)L+O7lFf2h)uck8y3&U7CkMWffe;DYP0q70j4bc)= zD^a}a zYh1YWzfJ02&^-0Ptr&IoFm0@0wA5e!H?RwS><0hy^EhUi{XKXzU+|sn8O^ zrJfE_m1Lq*Qg9tB!#E_Cn<)FO^}hBYwX>q&^vXStP93_MT$1~2vd8xs+mBfW!7MZ8 zfz%D`X(bO9zOzYsp2b3OONETa*FfvFfw}Yy4hAA?vjl2P7cn7)5{T!1p*#-#eL*tW z>xbuPQ#6+AB;+2PVa%zV>`63d7l@>Kr&uJtKiOyBa+4Cuw6g2b4@R)_E$rso!g|rqcOS%+@!e>7$-tzty36b)WelO$Zxi5Cq420sbVX=I47{4=7QTg>n(o4c^+b&#C0@$174^Bj zjLgi9HBDV`zs|=_+U*57bXgPcUhh=xdk1dibR1cqYT-~qU6Hbfoo(WygXJNIyf-(v zbQ63ECNHu7{F7j&lf)+!7wX?L2E4o2gHvdgNvB|=4Kx1JO#w$QDcJQ=I_oQh z&JCF!9ed{<z%68MLv&itG(SBvKgBKGDDGqTOVw&o^sj56t-JK2n+|CK8R1>d1kp5Zu>UG zS5dI$<`dWSubqt!{QV`bl5WZ}f-n>f9iw7aZ-c!^;C#oF~-U-kJZ=xkkJ4f3LsEmZw@35vMs1Kxas z@v{B~6EvA!fy5SL1=Cc7-84r~`fUoT##`w7UsD|TT|x>kNR$=dnX@jOvz9HU42C~W zFJZa%Hgx{Z>9K|8vPD#w&hlxf@0*MX@0p*$>}`z5k`MR_9EX1M7mVV`l5`w0STMX) zVVFcLyzH^}eA1o>9_@)MxD&;AuA86zf*sxA8;wlw1Jyr1VDtZ;Fk%-xJDmTU zx-Oi4kK?fvZ`0(jJ4-RL4*jLk>h5LVcT3XvL)y(i!39bFy@%+3`w6U-WK}=c@T03L zq=!G*u$HyJo$^*|gpYCgRpH zjSj2{^$P6RGL?5qu6JDRvkD0ZIW(A+#ME!cRLq7_zD7@ipw8bdwV zUBcdyO%3JPnUT#5b}Bw~Pelu}9xtWl<%Yyw8h{8OqPl+Ywot<{vNYjW^ zQdHx>t+vB=V$!@(wY#MWf_4uitxr5zSx=QYxL)!{K{PK zaGPG0%N;*Vk;%GlcA0*OG1a_G7EWCuQyAldA29Ma($!bO7}J(GYDNXOjV$+sb=Ip_ zug;rx!$LQ~;Prg=RLzCv9R#kQOjAIEiuPhY_wcP-1*#>g&z+TgL2dft zhm@)wS3HM_iTilwhvqInjQp1}0e5CKkt2qb>`wN+;Ut|uk9WrwIL!0*-M71ze^I4!^#$Dr z{%)Uxi-a5B)2qK8<1BvdFB|mt>y?o>rEHGl6oxJIZ#yyt8toFDOqzNmbTUov@5=U} zy4H9&LU*;o&&zI;t132l!g7q}QxW4N+?#9-R8yvQ3WXU_pA;SV%A;H5 z^Xr!~rWx&hP2x@SgLk=B?6a`&X9E64EL2Ka30;*=u9wsFZN|Fq_Kw}8T^GtW$_~qnNQW+vzeKsg<;SsCFSVbf-Q&Ea`|nd z2wWFP(X;VBoxcJFgWo7kUIPIN8(ts0%wIl=^Jcts>5_(~rXUPW)+SQxQvChbpydMh zkK&}z2+bcC;&!w}pAe&3s)~&U84i&)5g< zdDQjIEt_7*{_Ea_3o0B@wE-euqFoJBvsIqcc~jl?2)pj_WsTX_cHhP$f6o*bGG*C2 z+O^Yt&Fl`eoRvARd}&^sz2kXA{`S zQsoEF&iJ$KjLY8-3e1+7v;RCxD}LYi;;&`0hB9Mw!u$$B1#&Ad-?G~K$FE1hdneC( zeMzqm0d+sQN3?$Y+|ysXpmVCwKKtezoj}UD5b8KERIAJw5?Q7dhJXP)l^CNqqTK|M z+=7on@+Lgls}LUydffYD)Cz}`ggWQNq5_Lx5{}cn%modwK7FHpkREhIB}k%;>eyxrw8373EkS^+U&2m z)ce*Qcg%RhapVSeHrl?IFB+NP@-+Kx$8;E7iuvCR7lw)(Cj}N1*<>$KQyR-Tm4B&( z=vB-3r*;Qs*Os%YJ_<@qMbR92H;m5F_GR3O2-MI%1ye5(n%6Z@)y+(FM*!D5rXVGf zCi`IB@LPyUF$i{cc`LkMV~N#$> zemv8mqbWwYuc`jTk=y@S7hRga+NYVjJGD438#eto$;z($oB2k-Rx!Rj>3+koIKZQu zb3*+8xFl|ldGO%gUWYA!#}Blo3P9>W{|p#^|FHq1=Z+j{C-X??Y0^{v#@POyxYfq5 zmxZVA+RmR$EG(}N(SZwK%(UQ_+d1WP`fsl6(-(}E;_sW0X20N|&!$jiGj#dk#xl>6 z-~+i?*A1n;;V+d~hJEPF8Ii<9GkuQ#%kc%&;}kf;_n((Tx1`I2z9=rv3Z+2p=M;@E z!XVU!3RLY7eOSydXk>rx^&_LzuFK%kuGS+T ze3MrCv(2gN=P6f2clXO}D{(tcU(q~~cO@Ek&+r&^{P`I>ps=?5C@xVb#H)pPtbluS zXNNT_u7L{B;4M)@*52M;2G*SyLxrxtJ` zA8SvQOupk(Z*sD>=H2sKzA)QE!Pp{Df@$sW$m3D>s}WT8W>g{riVx7)Vg;u%c7}9- z*wdp<+5Pi~ppS0nUa#~Zb*1Y|Aa0yKq{KH_w7eMGmCPR1PfwOp1oA!j)o+)w3vq-5 zrU>p$Cce&1H`W%~Zy2ucerV)1E^$giP?Gbr zZ4Ci$Jsw6)JJ&fGpgdX$gocy~l7RoN4*wDP`-B;cyI^yhoOcKT^f%NKjO6vUdYKL4 zD7`2Ql!Lej*$tS25@_WF2gn#9x=}Aip-d_8td&hF=Of)yMp%l^bvO*Z$_ z0H>3Ohde24z&!u>mk-guAOc#kcI{P=_>KvFH2m%v3-kJL;;8`w2Qk<|9c{Z^yOhvI zqipZ}-V(O=6x}&spW$yJ{!GWJuwl~|P%n;y@ZFvbHssOmug1QI$cczB!bw;IDED?a zJS{dJ`uHG3>ydk&2gqxtC+g)SeN(iG`Vte0Jg7Dsujo6ZLOmEk}(%N5bOOve=WPk5eEl zBi3)+_{M7MjevI(F7}Nn*K0m2d(9n(CoO6C(si*xzWmnrkhK)>^mBkTknTe}PW5+< zemMN&Dyo5tj0LJ;!54SH?Fqp}5lUM7Nh+#`v6mO&8b@XY&TDQnn=7P68`<aJr ztRz(vC|0akG&t0cDvi=bGkIdk*e20oDdU}(0k)V~^qX5-j+}LspMa@T^23Kj zX%62Uc~aWJ;5ZIP#Den!!Eb9odrYJz#dFlY_Z~{zx4fyH)7`B7DgVDc@6H6KwQ@x6qot62 z2xVzD%4X9dDbk1myOC`m{aTdVb=9n%<}i^;Mv=Sl#N=Dbqw)2WnTD{qAs2-3u*BJe z?d|a4!;pFq)b>?(cXxZj!2TVlb_xorJ(4v%aU${HMyna^1f3rAWYT~OFP`G*smxId zv2g$Y2qp5*5@9=@?V<_7Ns&lK>>y<30cx>&J@jMK?e`!%1%kB%$W2d{YgpZ14-&RF!BAV1eWPXWEdoc*9_Pa>j)FzZl42V<1dU zV$2GKHi_Q>y_daxyT$m5qjB&o9B_iJUai-TeWb+$f?%eBjY9UFf%9_2h@OZziSvq{ zNaRy*pW&;EyX!w>C8vOD=ccehy1Oi#Zit>j1zo0x1u{XkmA0sWxEv)Xx# zneK%sa93jAX!oiVe@Qfcph>l&B@)Q0<7ov{x|fq5|LcVc-iCM-E_nhwcdjO6LgQ!R zFqN=*A~fdmzl`LFcAFTj$h(dOp~WHTkV5R0v73;xalz5YW(Tq9qpKYDq~@$ROfCva znaaeeUyM6_x0%F+@pev-7w9M#r<)Ar=fN&t4g-b9Ch^DmIj2x6`quw;CD}iL;1H)S z(&Yq{taJnO+KCJ0tMN=!F8*Rip0pc^QG|MA!lL_1`w!0?1kLbxppfoxfB#HeBEkyg zzrUTHgIK>YM2(##l59P78g(Cq-F3uh{uFnRUo#;qyHVEZPoY)=U$}JAA^e)GCalEMYlKwBf zZb3h>0-9F}v3?=eg%Fpinrir_)HQ^f(}TLo{Klr3)IRr`(`_2VYbOFW5?7HfXjoL+ zT|gT|ztE$6o+~-2Q=>WiczFf)Mq6F)m9^u-lwUDi-XlIqA}j$00=)M2^!TtT|57df zisc$@k9@UggmUG?WEa^|8mo^xG8My?f-wET4@E)W)Vgz1+{F`5wg?4@?QRgh|G9;5 zIfAM}85L{ajJ}lzir~M7lli*oUQ`}P6;|VmwIktZpmzj03fj*R3!Va}K~~Cfgp9b& z8|0MI|L~fEs;HT@ThW*&5RnP7L;|_+%Dx95v-V?}1CcwxEpWZMepRgH6*uz8)=O^i zTRDTpgN2YNNC^MtX>^u*NM=Z$eV61+ijI6wRH^J1`csc z6q_2fY@`pI8+71L*FIq7Q)DPK2}fMe3vA~Vo&Xs}xcX)E^hvlk^z%G_e-L-51f%IY znRkDa{tIrCCkW$&bOIbeeEb@IPTyb}Ln$Nfb%;I_P^D_OBVDI(XXI@VqC3%M^6-Qr z%!-G#+wM{kjQ|N*3xu>=K~*HrOA1_17)-D9gH){-&Z}@C$bai6l)Gh#)0TW2pR>gN zPSjgSDbh_BpamdZI0(J*#?2;LFO=aJL7qVz&h}N z!w%Wy6nsoto-WaMyQ~Gh4>W5@SYpxMj~dYyEYq&yxx<~TwsCSr+kH|KBFYVnfo$>^ ziC>!6oD@Dn4_{R{DiDeiP!ej=hj$$@`2*vbaHu<u+w>dBsXWWN3MrK_o`9xPl3+ z8a$rw`cTr5f-XH9p9WSHM|cS+URvM*NtcfD8|w=`qYBukzQpqaHZE0A4Djx-7(CWG zL1Ig(3I|b=bM(6XR0sR z+h~`_n;-8&976ifKtwF4tjvdAuz?{VOz7LoMj$EXGuf+4{FZp zBf^vKaCdW~P~cx1>yUjM-7T5<6xUG5t04wP#Htly6^!7iu&Y(KaQZ;zwKpbqV$zA~ zY}arV4AUIMg$6O#KX-S+{y|S_J7`{12LS=P;o7vkP`3Ml0Rrd4u#4-crQiO<4^U;g zkCQf`LuU;!W)NnP`aib#28FMne)#5I+5p$rbVmpF8uUFUSlah_qg=DSSgL(TqI(|?3Kf-@&)<=T_rS2EYUYc8$N`N=j=lT! zRX~QtN_@SGNW+lit%WLB1BrV6d(h%TQN$qd=_D;l*Z+S#}NGRR>*ifI=rl8pirG2o6g+Bn^$2Cry@49c#F|}*EF7L89UbKEBv7+8#Z|3 zShbK(DYdvDE?XmGe@~ZcMO(g}LC_-Uc>Q}U8xs&AJ&n>N;m7>^1|a(4;s>l!*!REX z`A+&#k*^OQdi+c99=`UffcrKBiys!jPro{eie` zGe-K(Ltu98Qd#_qst-T*waT1rJzl34opU5%k-rI*=;B_yql9AyYgx1c>-za?b7zbe znZ!`M5E|t!WYUYba|{j!>v!esTV$=SI2QD>p@^ysfebMS?gjA^()pHSn;583sylw8 zC+KWg)zY@9VI@fSEXTaql?6OcO|&S1u}vt4@IKOBdCB1n%XF?>pHMCfc-%{CB%+T~ zj;~75xeMM^t8h;=6ymo9J3`_aave?ekXznS+`Innb+}jRFY;2+X%hpOU-@Fn&0Fbu zA{5e8ux_abZ%AP{!9YVb?pff4^T|-VPy-qp3N82qa z?a|$2%h!mqaD4R@B}OF8G!$%7S257e5ThPiywZmu;Z@DaOS2h*jQ}(KzLkqDOqNrK zAr!W9qE{wL79y+vTp2-vHh9;@W5GMca;M5jLwDI>+01oIk2k<<`8;%?I%sSx<*Z1wblg1k+cLN2rV6 zP6B%3TieU^o%g9$Djd02z;kz zOq(0crr_y9f?eb(nd}LZqz5qW|HY-hCeP%sbHY-J9SyIrbgy&%4GSSlEX8D^w>5I9wn3J#4t2yB?L~+)8_9BU}oFh(Q@} zPGZ!nfyP#>JhDF62YN%cm2P(l)p!bWD7pU{0{#8^)*BQOQjVQDFOy&1c{9mh5Q&|r zPt-IBs&hlLEFXl6MAQwfwzcu4sV@gf8$3!5r0qbLYvMl>uPoejoBe6h`3#a@;;*dx z%-)pr0U-YOxDtXKIghvNo94Gxc@f8P6r{k-?T#-pr_|Iq4XTXnC#{FqVnvmb5@3-diRn2c~AfAPH)3OFDl9J>y9~dvS5?;I$ng6?ajYH8s#owTU?CLtD+1L35z$YRrilHj<_Z$4bQ=mlLu|n5u(6N zAI`R0>kwjq7}Crm!O<3w57iKt;gYehRXh|}q$%qics0Ra&krQv1cZ7-d5G?92VL)j z1(AeJ?H7!rNRL>2JDj2NPkVX*%KvUpPmm!7X66c#^&oCm^qgTPuAkluv(}`8Z}$|M zAe=xO_(hXi*ux<~iwCb_(W4ULK%@(tL$f3d0$_vQwNYyGa{n}`KahLKkB)^xK^Ljr z2%cDiuZ-O_TkeT9d|`HwpLh|Y*DER@0Rf4Cv|-wRf97^biq3nUa`B~&YAh5BN&qWw z@Y)@x;!#W>wN}!$m51l-cPB429l);0L!4g|b_I@PKy6WHpG10=pz~}Wrq#b%$?u++ z!t%#~0O~blhK{|jXn7Rf*b#-u0VbHDR*FbY7P_Z$i4U3w=@fcj#C~Y>N=<3ED1Y-c zsnBB4W$$zRE46IM>aqMF?jkfEL>t8PraW2eCIPB9j_Nrt?QU(4iLmdI872q(2F^rH zUHnnM2Xd?SWqKQ+%*2!ML%>C>j!nfGsI4TAg>QXNn%&14HoW75JPnlaL@4(NWs~W* zBDOnbNcX^J@tc`PHQy1!&wQJP-4o5b3t_GNX&B~=%Y43LcQzLrQfVen*H~_2wI1MG+uuB#+_+$eCRMRY1 zi#s84AO`BLjh;>Q&k&Cg@jV(5Z-@T@nY@UV=#+OoL3!r1B|#Ph8PqSwC7lv`F1U-1 zWd8rOcW>`n_OQJYU-5kOda^^2IhVlw0%3Qf5Jyt*yOnLvK7|UQ@mG-cGaWqoD{I8{zuAv{0`m?rD>KM2KMt=JXn=)9fTy#wIvW zP>YKtUC|&UMCF4Xc&Hktu@2n+N@_c>`yv}Uj;#i{m>b$wEG*1Bpz%5{3}$PedLb}% zgrcV6&6^WA!!IHQL6Q%qJmNag0F(dXH>&%J?!Fj6eJH2-sV7u57cIymTPJ%Gq$;ZL{3GiO za#5_<*imV!R4iHs<B|NrCDn4}-|6EDP5<~)w{K`YPDd4LUP-ZA5@lXApXBRtU z4~s@F#$;9Aq?sesC~DYqoWJZ~!zzUkhaDv_1V`2#6UdoKYX(vtL@i<+X)lRFV$#oh zL)^q!Dn5&u|Nm`$u7U-QK;{`g<(2{uopggt#b*tJa*Vz{pw?}G!urQ1%`Sk+x{DE+aT$JPEde>;;o$GzNf1)B^9_}1OpEEO@70FB@7?q6(X$G{V4H% z_iY6_fn5u|!<=yDAk*%>v%Q{m3zOXKDxM_)Xk7DcYAO%Sg*U>|M2Ikh39lZeOtD*s zaX<~CD*gP~4;c~=XszNJ@Bxsby}`o&N!C z^8dzK=!>RG>LQUR0G>cI`p)$}(hge(lU2_A6jF^M#->=~V@`@F=bCy{1FCYTd4lTSwgZyqB?|F zXP3`o3#Lj5 z;2S6DPUX+>K#WUZAY?*qsa5qfH%J7Vi^=4Ha9!TAauZA$|D)r#cAPRVQ3#>n2lVdL zunwB|QZw@_lL+_?q-S=MQ#W1CF)LgzT|$?Fef~O3bbU?|nJAgK)WUOq{pDqX2VO}~ z>-y3k&WJzEo-v(z%DA3U|9PgqSaD+KUDG(D^z%BYVJW{(+dj$c+B$ARnT1V{oeTlF*L+d+ax!G+(QopMEEr@#NIT7a!hToBd+cGJzK# zMchWK<5bKM`nKRbPJh@@E49`l{M4iGN;NUk`>|sOOO59p(bT-c=Q$?P=~&LTXH`{0r zc!q|AG?*`Z=Q4G!*OWik=b!2Fwf)I{m4(TO>57$yTIXDP`Aj&vmnTk3sy3dfoz2s} zwdF_L6VroAFFZ{HB4*g^U)gS-JI9)2o_~Lr_*HsJ!P*UDs-BHohc{kgw!l?Te6}*+ zAGTjw{Jxre@4u&Y`51mfIjer0zI_8vtL4&oE?P}$?Luhwx*PXR1g4J2Z<=`Om z?p7*Fr@u`MuMum@_Ry+7NhhzWoOwzw-QgEAZedt$!oikLe-I7MD3sPvJiC8=|6y`} z-_+F969g%ot5ywRDK0|w)&+av{UaQg~JaXJQ!(s6u~P@ojVd! zBLU=(LMamur=K~ZZ)PT5zWvs zS?lS)yJ1x!?0DZasO9*N&pf+TY6K~i*llUlp14Lc@7a^4u5BkX>1ME3Zb8r4+*m-A zpFWvP1Iyh%%CwBybne%XQD*FmMD8PMS|tthqRLyVOA{UUxv}6-7C0g`rOrKZW6s@& zserqUqE6Z%;mYiC1x5JX+qYNG2L5d~KYVz7gOozaPFy0xGPDm~B|S>lmppS%C2uT6 zXxLHnLHMfG?Z^1qFE3rb)4vOp+5$a-_7^4Em zgnj$=Nx{U@U{8zi+lim=Cw|I!W{7rc9F5}CcQ{<9lRlW8_;mOl=ekYj!c9Z|^UfYJojwq9<& zqn7&c;Y@cZ?!HD9c#8q-eytP~jr0~r@1faA=5ieYb{$kK#`#N=Oe`!C8ib`px#O%C z7n#q_wllLA$LGp72-YIK(LnPo*fRd*XKYgu_hh@bhy|#YE3^xjlO`-n~mo zxwi2v+nJ|(3|kH~$i++d1~@%FC#h&=ZA+e2T_)aRbDiVjW8HHS<1xm3s4OkJFuA8Vrl4)Bopu%s3x)`orC6Sy`R&|8w9de@thxtxzb(72+Cb zDOviuT&-TpYrS9OJ;6Wj`SEwx-%~#)ik;%BBPm1SYb@xE)XNu_U{;K#t*IHtAHxFv zJxq-bzg`+zgSdw%|G}Kf20=a?#)k}bCb6Y)?#PZOre%6u<_$-e0=xbc8jT@!bQmEm(1kp${cYXx^PBC=xxR=R&U|R{ub|B-n#R% zJv*(>(AJHUJ0vgJXNURpWP7c&+S}1=Uejl1l9dPdEi6mzrhURcedRz{_TyVNG2EwO z-bo!iN$1CHbR@~`eePdRisKvd{FZMUeM2T^&4JJS86~Tf6|GBN^32R0{(d~wA*#_@ zqrCQ9Nq+f;@o)3%6z^Fa<34(%L7;+d$3YgEgVRD)G(!|z_6^1;7aB@WXp@Ow;TP_D z-Zo)7;PqY{+$330DIQMR_K``6U^P=+j=kC(Kc44$&+_uqDQvnW5eb2Bb=X!8!s&T9TOGD26(=Aqbbz}5AP9Bray zXWSu8Gl%}qeyy!^KZi|^H1vF&>wOs?aQ7i~!nM$vU&>S((&YL?79Z*x4+pdNmGTA2 z9mf)`)ud%Lx9(P3xMOkJIEnp5^z^`o@eLROUod}I zB37;Jn6twoBCi{o?1bY;F@ArTtYqdOR53Byb|lWg(DrWaqw^7ajQ@DsP0vrCDw%f^ z+wXVg%&oP|JMW09e2{ALtC{v0#YF$2As!fU)1vM>Ev4>{9(KjFw2@mA)@uULg(Knn z_wVgnPT3#soH^K@4*J^^-`J{UBg&;G*D$)3h=_h!Gl1@~9y<&QFRzJB(4#6(q;fLIFR{?zIY za`j~StUD-X{PcjkyZiNVB!mNBzQ`Y4K@mUzDD^1utE3D!CRmN*|E%_$XF;Dy%Tk`U ztzsz$9q5lUvf`AY{KyzvUK!@`jJuoo7g~F#Y$94j)34b0E>E}?&|DqDc8L#fa}8ta z!kHO+xBE2Z0dn76>ZOC9I$RjDjr&^bbRdaSzzE@Qj0K6|hBp58e(`(ZA(QXx*RS7> zPVaPzXkHtT0Kf+Kr=0d`n{-R??MB0oYqZi*Q~#u-9lnwrTb&{NqG9kzp~aB-jfJM6 z$0tVRTdbR1GHNqY>rX0qr0lu){5PvotrE{{+K|ZPWKD^oN@vS)r@s?B1IfMKkR$tn z#pI3MF%R*d-m$f9{I~Lp?Uxr-8GUzQnGj*wW&Z2WT%zvwNm^>|!`a4OZflDYq@{x+ zZm8VZd${+ho%ZcIv46#H{Y5IO4_G1=y4YMd7+R9sRC$VYW`WLGTmz9=sYk8Jn z26z|OKC+XL5ZS?O_jCS9iS9L-k*Ijv=TW~M8}x3x_kAREY`J)>yv>@!5q!BE941_? z=SDE+oeG4oNXM5yzd_g1c-rw`SgGkV#dwP~jL8pdrY_UWrA?+huYFW*mhC!!v3-2X z#wDqesWDTSpY>a`OPpt*`qN7eKC$FD>kkexkh_k3eeKq2#w|Mf4<=pIl*i&L8!(y2 zmE(e+cUA5AEId?`mTKc@^C#!HPV~c6?}TeH4%g{5xUf|4kR8G#D?eWkNM{pV?2(7` zJIj^XD2T55DBRRklw3cuY!6G)%=x+9EEAJI^y2s7 z4W+--kIl}$dso{Mw5_zRj#r^SJ@xUtF-`m8YNby$bOwwep4#z*fTz3}Uz$VC0FySpQrAJ!+W z`?Tp{+P?BA7<0C53~ zZ3`R=+kP|2LIXvYecE8~vG8H4(>j+d8Daf{cjA9%hz(eu91dBrVSU_t&mVPzgRzfl zYZbCzdMQdva~E0e@nesRjLXIie=K!i=;X%kt^H5D!<8c@nyc6VEMZ{M?N(%@u+}~; zt$JXS_r%zO7?rjBo;tLA8}FDd;S^mzzbhaio1XP7dtW)IE;kbGqNCfRqEiQ2Oj~*; z=^CrU_|39=J26lto%-vqlHo+QBFF3CcH5wQDG!+X3H(dJEjb|J;^c&$zZu|k;)W7$ zSLRB&)$*})(QW7) z-Er`Ub$uZpFJkMMBbtb0eLPLv2O>R?g-!!>CWb9@Zx4BM$USu#HDFn@z3k7vMEsgU{Nz06J2E2 zfoqo}w`lRb|CsT)@^0gk?Gn0z<#o01-pS7@1gs;Arrt-y@;!Xrvo#kQ(QMSNvq&H8 zum*r^8!FS%)1^WArcb9Sipyi={rDPlpg?z5QLe}SI=iXa{7n0`MV)5Z;cklU?Ca85 zuyda1$wly3tV!@0E;$+^}yHS|Lg#{HSZ<{`R zFJ7GSb^+xDSsfOiFG9zna{bg!%8Zzp3))zl`edt!nDD`K6LkdS=77_7%b6IeCOL21P^!xMM)PNn$`qd-1@<$GP?S+ zGnLP%UOnPZb|u%ZpHi{d%bL>pX!l1-B|qF9H~S||g8B8)r~~D7>IVKpu83^8laSGs z(Hdl#q!Lo;Q;;nLUUYZ&>_lr7d5<3{z#DBZxKoOb{-JZq3+InGyZ=OT$+~ljIfH|P zwxCXkY~EZ45XA+Q^^v}iZQ(o+Hc8$#W)Dti|B);Y1AeErJQX6B}Q2XQP%iJd&R6ny5iBO+I(@wswHCI&f#VOFZuS0iB&J?>zfluFMFslXByBTQb-GEVgnlWHK7O^ zm`;5>@S25G$8quJypr76pTc)Ue!i@vpkUnA*0z<8EqjNNiOE?*t)Z{44i1v=-0>=E z7qX_*j=Ni5IGE?nH<->;=EOxtK5-L^+0$(7v4B0>$fKybNrS$U#?z32&X2L#c)kuv zWJ~5FJLi|?N&iAde*IpnADJt(c5?Z>hRrXRFfIPUoY7-Z575pbB{^9GPx)Z@p*!1O zUQVM>Oov06$54Je0`j4i!iEjIuvm`(nY!)WsVY$SAR;1*Q~A=KKgzr}Z(Tbdu5L2gbhK&P+>9 z#mUL}HaA22(naUYH-p&^`+bB`KjrE*y<4}Tfc~Gu)_bseDVyK^tM+2Y^Iv@-jC6hk zON5zJW3sU#rRRh5ZaP(Nf!Weai6Md0y8VYv*3+HGgCS>m!_6 zrJ=FT!i3AYxQ^nygYOX&#UxOCl0vzCH6+9~7lWeb!{9Fl&yyz~1P2GN??B7~;`D9E z1DgN{^Qw580Hq>+Sjp{jCO2-OXCqiPoA$j~Ta$*Ig7WDk7=cE`u9+y-4>)f@o-fDO zdSR?J0hL(Ir(9c&gi@cLdj}E-fk#FQ2k(dQT$&qxB&^l_cj2croVbi_HDz>lpJf;; zZdgm9Tv#LP7>^bH5iqJSJ|!ctIuF|KIQ3x-y$C2J!j&}hFx7a1u6e5?U~Mu`^!xk! zaZ!epVxcYqbM$c3Do%waw~MZjv1@M}vx5)vS!*p^lPq5=RZFU38^JMTNWHuP7E=W3 z;3k=E*~#48+CdQntT;k+ zT5MBZQuk;m8qsLGC>nw&PbYcBJ|zQlMLT}67@uxHm;Q`lTd&-gYgTgz&#p$ zDoPPH;*@NH=K9S4o_Y4drD)j_9^^#;AixUocgb|5^Sf?`D3YI_fA(i8WA~;Q1LK5K zo*I_bnde4-t_Z7j+GFeT-7|mGeIuUSm2FoaAtNd~8P2bg1>de+uxW{Y_wHRI+)5Ua z*twDP$UAphdn--R2MhVg`VLr0zpJj+N9F5KdY7tzqtVX`)Y2UrxNYsVjf`R%g!4xZ zxZgi{Y%AaS^0h-FgVANIjg`oFeV9<9*$eRX+P?k!$dE)r9S2j|`0TR^H@wWw$;oLL z9b&fkzHfYDO@L8wiS@|T*wk$Mbf7LCDn9|&#DAbRnqE|7gk}gWXi%|!9vuHH4DOQe z??hwdoK6Mub^L>GjyZRY8AowSTL^~6jIRijmZ==?rm4+SDw=aY#p@c+7ecTFt~tSXlc_SbKoqM>QqIw$>a=J-6_J|@X20eTO0|WaIg3KI6w{U=Fc3Bu^ z^tdqdPT@&s0`6i+z;N9)dkr$O6b9(M=}gUM4pcsmw_d2^Oh}dQx8*7Oo79w9(9Sdx^m`kH87$w z3z%uw!)pNr`;^rVJ0M6T)90Z0O@NVWF|Cd+B6?RB5j`Q$0kp|gKR0s-c{b@$Qq&hL z`U9(1$I-Qz^UGWXGRy+q%FEH1v?t@$D|HrL`TXh*$gWdza_Rztf!A(`q*z1_Jc%ph z;ltJ_EiIiHo)zd`Vix_-W|t<|8HmGj_L0=|(*|K-O(Y+7Q?B@5eT=&nu4R-QUd%Pi zrecyOJ;F|IgGydz_&UJ#ijklr589RPYOGwuIXqXF9WhUiis7N=S82x6@DOU82MT}(cESomx%>M>+rdA zj}g0Ud7moSq+y{hD5M1g%gOb?26=$9n&G^ztu68a6>ne!T)eS>br_k zx;U_>+!Rq-z1?sUm86QeQ(py(A-ex+@x(^w*-b`+*4^8VBEx+2h%`>yZ$TvwxQ@AW*-TKBr|`!_6ZnS^5t zdYlIsO0%x})PlXV%ydY5u}*fyts^ULy?B#r!tRsKT!ug5zdLU>4vf10k6=kDLpnu@(w2bpj^!LzK&??w2;r|%@65(kQ`FlT1Ca)5&ZAq z(@ZwE#4oF#T(-=OUfdt5l~q*isehbN?3p-Kt@>-L^q1sOpJ6X7;l*rd(b1 zw>kIOx%mtJ;Wb+>R%J%@`Z==y*lzB%)4VNQBN7V)Lu;;;GW=AmL~q%eP;Z)_@R~oF z+MWMb*ULJS0Lh_$Ovm4rPyc+#?%SYRG1n7wF9rT(|9p^LOXf6JIt&cI&lsqDuy8N- zN4wl{TZUt4NWIp>O};_(FSS>c1=5pDDOcL~rZ?Tbmza_;cgZP+-I+`x7Q0nTT~>W_ z-52UuBOBPro9&&~H^RNG)^s6V!ImZ>q-|>Nb%<{YoxZpn9)dkQdAE9qi&D*&HTkm6 zg>A3tmLb-VE6ygRr`#M%g90rpE13@z{JTX5OWnP9D~7$?IYjabfCxK;2OT)m3Vwft zo1`@;A=32q{SiJ!Ej^@OqO$L9qRl96dLcOHlcHsL@EY0gS{xD`yL!fx&7HnU-w8YW zp;YZhBOj|wURBQ6_qAWKqNSxJGG^bD7uaBZZQYKaX%_IBpY)ylyh$(pyHRtm|EGfC z`295}ujOAo5r~QFHorxxj(K0x^rKjF%A?wHnZ6t#O$`{=O5hg1_L#b+}9v*33=Zfq4>EsT2mR?>}))R11 z^PWsrWWenRA)PaC^e4A?MYtVn4!ETj+_I;*!1>vQAtwc|lBAW)yRJH+&wGASSVTz5 ze{Hofn^Xzz>+`SpHt)|HY0PLTUsGLh{Mpp#zP8Id8&aB|q}Emj#we+NNTm)-8hGHp zatp=C=l;1Zqy6oe)8_)KOc~Za4_C52sPwO5^gLK2yI`$Xe(%`ji=j>WdGqPcbE)Oo zm*IK)7e6*@0Xo!_ho2K=b8QCks!k=6C0Ym%X;K# z`eTDmuau7pZuY}{CzHpkES}kTnkZYoIONA6`>N|B`Jt!WOAA%l-D&fZb?Gl#x7jBb zda@;HdNWSNgcPWA`u0R=>5CwNKO(giS5Ru0uYOLn8F~f+iPge&D@*)mB(x z$5#F9k?JnEO#H&+M%_P*lI_wJJlvJqzM2o;vlp!s&+AIvoLfZC(DjV*s4A^F#DH48s zL{P-&wV!<8*VJTWE&q81P(S*wBX58Byko$==y(B}o=a@ANjvPD2M-7fo*r&_#mB8@ z-E}{wcfDX@unBIJ$|#ZR=>3Ev`;=T z`e?ymgP9HEbTj{8Y-V(3mxoF-(^gqF(9D;b@9@d(F98mBk1XT(1EPi!)mGK-7?*6$ z+Qw-_m^2-%EVO!g%0MY?&jA5z^N5rnl~_)#lV7%*4p2CPPX(G}*DXSfEa%>QEj7~7 ziQRtmwgrku=kW^uu&u@=t_5AL6RL#Ff+W2GZOb$m1!}9y&t*ds&y|pGZD{{WxOiKR zWL{hTSXkyMtu}_J-jCm(zitrfpA) zz{@xN@XEwGj?I3i+5`bU+;~+cBQGvL|19_m^Y`&kC(%xa;qhDP- zW}NwZ<9O_#v0SuJaC&f_(KcI+TC+rT`PkPyf!cMw)mp4ugMwyg)-56G1AL}`dF{{4 zG&eJBH8Z+ye=19#$F1nttK-uG;@9uLHqvIUT4#-oVs3OneRrDy6Q;ce;~g?bl{C|H zY2H$XSLV-)F49l_L1?LMx-o~!KQP9qnDcfzcwvda`ClQdXJLwJ`biAm20ziG=8k!b9A?FV)M%GC5BPF*PW*W^Nc-aH5)#yjj0L? z6*1msSkg$juGR4A&fN#Ru`7~;rtL)8t_vAldKi4+^+2T{Yh_2KhR#BpK=M#R%KFi& zwy_f43W@U>AC>$xIuh=(xx7#upFDACj6GdAEI!hPk+a4vC`Wqwgk=~v-L*T2F)e?W zw!dpMYzt!nu<$Af;NJ2kpIm^?De5nj?@p)@EgYY7L^@tQ03-6i{ z6%-7x3^mj=UgRhQNEiC@Pc?UCZ%pK>%G+%0aHmL;wc<~e`+S0DXX;Bol&wG5XWrFm z6+?Wq#FHn&i4HNce0+SF3*bGfDs>J{Fz3ee>b4gzvUonXNeCuZ zENf?LWv+h{_MbvOE0!1y{IK{wmbl<^*VbFG=zGS{!}NGdWNToVTt zCVYCcuW&4MY-dg`bT|jgl!P?6k94}u*U3F8`_Ya&3TV_nc^SNml2Ehe;OGO?W+wtq zHE6rLm&B=t_1aylk2SO|3cJF2!1<&%H?7!jJk+)Gk7I%^DZWF`19=C}U$L=U_^4&m zTA=UsT=n(LPAlm;-FNgGq%FiU)QhfYN{Tj!B4&kHXpqWi!YKl*sOaSM5`EG|L@NUQ z0yx0MK>-1hXU&VGX!XKoC;7gS27RHEK&O7HTz*~y$G+F0t1wx*jP*%? zb%tZkblTUEO-Lw}hu?f8d8ON8U2^`wzc$Xc+dZ>jXIIaD~y{c~{T`WzN0q-HZH&p0Czt^*w-REB)Y~|V8Ly|{BM-F-NQa_^pv9RQWqCx(HWix3g z;_JP_B3rA@?_Y`$e}Dh)Ol_~xh5#n$w8Otvi$@OZ<5!&cQ7&Mh)aUe44-O#Y3WFTK&@A|RE-Z(gAlg@CQWyE+7@Y=)Mo`OWCw`Vz59!j6nS+eN+ z#2aMQ_F1>^C@pdvJ461B`{S*#_`1eR{%L8CNnMMt|8RXjDo&Pj;Ea%0c&`1y7i6(} zb~z^{thObm`?9XQ9CcHlC}Csr^zCIRwoCfvIuBE*wW?xrd5hE{a37waVMry43+mN>5Pryz(Q_7gAIqh$-VmPFM$IGwDLNx z-laD*?9BUct<_COTiXK1Dzs&o+=8QQ637Rg4(&F8o4_=ey>R=$0*A()ETZEIUqW)ZQd*dYA8;)E4f@UdtnM^g9eGK3OiL{&AiAp=VX z-G#aCh1BogT>*E%{J;u=9nehG;~Ps?GcCW3m9b96%g-r8h){gh-d_CozgEu;=+ZPT zEfX7JpM|gdd20fB`v8CVPtf}V>wJ=ucCY8ye+(@>m#lKQQ>20NuZ4dV61p-UKmQ54&KtbLA5n)>TT{@`9>74GfEQm% zn~a(ME*BI7c$b_#4;cA*V&)^o9v9DCE0Nv1=}>u)E^&3Zv@Rqsb?YTM>Jn9o_q}xI z>~iW^48X&I9nwrbgA((vyS7S+x zfsX4$ASm>S(xXLMFr91)(lxTYm}qgtx^M5>zKO4xq^r1{p1znibnJ|UG|w6mYs{OE z*INB_bak!g7*mYdT934p6k%mLJe($LJ?6Ebq@c69k1g{S@+EU_E|MJkvDnEo0^UR%~eg7<~qp#m)xic_6DYfr9EP>YNLPB;XRWC~kf`VqW|GS$$ zizmy{)LDV;2OBvn6PCFW$K_Bfu6g zVCo2UkaLLk{^r_jVA&UaUJ44~hWc_G_%tyqMv4zggKGHvj$5)mckhyZvZ2!luK+i9 znz5dqUK%I!LKM0ToCYmsy;^CW6)Fs-14w?RAVxPwEk zNWrJy2am_`6UjIXlZfJ;pP(So$T0jj^9xL;_fp=N) z4dyu(U_FgH7c)j2X@eBO;Y~K9OQ3s=tE@b^$GGGiR5wi!xJ_2@M}EPtMsSyR=xzxY zS<1BBzb@L4`Ce{H)RqIo!f>tuNBV-=QcF$k-mRby6fyTXG+6hN}& zm%3+E^nvk~ac|6%?7R_$HNfSr$13dj#GYO@(oee1qwX`(b4=Pop$xY_jvu7FGY?LD z`n0s4-sTr+$PD>cy180#LmZrktkBYi8Bz#|D?$|rehD{BC2x^75)i_42aDrbd!OlmMCYX|c>mxJw%!-s)) z18t8*+wmc2CK%Rkaq%Wx#9y^(#b6Xd6sZHO9f)C}JH;@`Es}lpa**U7K7O1SIX@Y% zpLM|xp<#$(sp<+c2)R0}pR_k6n3G8QEI(HUF@|kD2G3s`?wg)r0eJtgWv~g}O`Joc z-87GQwSZk2j;EcJy-^5>g+yl{j=D{RbyG6-Q?&Q8HzMYpeI$A^HZE?rq@*5nT^exY zh-s5pK07-b3g?Kjrf1QJFcgU1bSZg?!xlZ{GD%d#@gS-<+0&1n$a%2~;#}yVTM+2l zo^m`e_?l%MX?Io>s~Qs}%7HV=To1UPT5x>|`U?`4wU z5={U-w+x923lBA}^g;Ld{(}e6*x1gH&5g`-oDYpPdBiZ1=gSpC% zx`*O(>_hMxIAB=7y$LJnjI#0_qwAm9P@i10n%G3?K&K=DO0R)F`Go>>8+PhG=HulR zKwP5rKvgDsHKiseHg}ekpMqFEd&7Mnsu!?_8`|?f&eJwD#^sj%-j#(fRo-}-S7pU z`*@<*rl|vh&|My@e{wX2)H|=R@lOj^*1F~i*WsKNE4a&W?)&`@+%Xw9?3r!(SE325 zY$?vZ>4Cjk6%9TG#tC#9J6M^fY&SC+xm`dOsUt7Ho0W+Q|>sn%%)ukVeAvi(Sm(y_;RFx$JyYzJ~^ z4Gnj=^DFVcYmf0mhKp$_iv^@t%KtZ&%a2?({4!z{Sz%z()_=5#xZcY_Ha;mx zLJGO<@yYs`X3G3JtMhqoa2?M3UGEXl?T3+(NTSi7uZQ7O%=x`!LLPJh^Y$D>xOEaG zU)LkoYB$*W3s55#Y7n5WJ$jkP(Cc%cZUm>>0vQM4!;#$Wf`7VU;Tcd|;FKF!9kisr ztdFvU<$OG>VNV9u$T2T@3xVwLw)d+OSyFR|Fb#13K_q;-vK(g6hUAGNiZgn6782l_ zMHnDHetu05kP^m*AN#(jru66k$iWLv&38I>H`&+9#&>`3l>p-GH?%-Pmj|Ohsyg6QeVYYVvy0Qv1?GNoFSs45_TEL2-wA79Um5SgYGC~l$Bj%hesHx(O+!^u5ly9PTX1-s`ti4MD42-PsTfaK_s>~yOs=ic+4 zy#3G1xwVijU>_rK2u(CgD0Wk8Uag|8Ax{nI+&WTwz}b?{<=C-Z+2_uk?J3Jx>J(A@ zlf;GCy^)&1wWRGEF%(p$gXb57=!D$v_{fGeUX%}Bo0Cv+E=kT~ zUDMFHKeqDiTM8B3R;m{quKFctvwm{(-%S0uq|X42X22#;3|T*(s&XLCriq0Z+IqCB zn6NjPcz>Ff6_G3JAiu)dAPI4CyE3~+XM}`=RG{E5;3aw~cs`7;8Q+1?3#4v_p!Kb3b1(WL4zv@MTN^c5ekSeqapYd_b#BM;@FA z9>Z=yFc(>h4xiMDJijhsPvafYXCD4y^F;_isUT-J!gA2QctX1hVxbx*8hw zY2}Zw)lLY-F`I{6kTDp|=xiL)F) z8|F%w_>%BD*3vALEnppLU%GTD-p~lGg|>?@;auaTK&n`B;n-ZYVYV62^PynagrwWL z#%@i$J-5riJSp5V)D2UETf=Kbi%uJ*>#q8FYaJ-bVRII0AOc;^{{ZHfm;gP0Q^p2h zz*Ik^0s^wK;nyv2sh6-;Ic1zOz$HZB=1eJ;gH=HBbelDz%pFjhvO!NnxhyCyu7fnT zsl2+T<_rSyBA4Rvenos5d|%RFY}fkU0T!L1`^|j_eVOZ!-C>xhk?t0$!J!xwLMi}h zF=0|n(N#n($!@Bm@}Rb_0eg5HH{bCL$N0xi7{(NAESi z0tm?d6et`XjD|=tI8UwTk(0?>U<{_~>gWWaRE>tz+`80r2^E`9j!D_d&wYJ)j1c&m zFg}ZVB$6253_BR{YHaXImoi!eso(I_2AV`O#fFKwb-4xP9Q5?|1-537=MMh0$GH=AqA&VT)rv?U$K{f>${g#Ys2|>IO(*=l_U6EDK9UN>4>0d(Y$Y0L_dyra|>-;aOBrA z*8)zpJjUZra?K+%#C4`nuAZ<`i>9yW$gz zM2cEL+r*S|md5(1;>v8;W^z5>rfLY+eG}_dTG?2=w&YuMjEwEAiW(_glZCR6aq!wQ zbZXFTq$p=4_VOyKnm^r-OA>#YS@#o5tyJ)SOy-%CRWE#HAN-qFuTck^JqooQJl%7@ z&+)~J#2`sV!~@f&zrcOVA_Nqv)azwIZDQ@ zw7FEt=l$l5^w4r*BAws4$CQ^;vc>o8KO*Hp#xpnmu71>o*hKH%>hwV6Sl&>mY>CtQ zDEEe6$(nGxhI5fg@v^R()AElQ8*Z!6u*;f{e&&xc6m6`G!JFS{sNaK8K1@fTCr>3A zn#^OrFpTbScInM|k-4TDj3Y1TQ>7~1Nr}4`YuWo+;J@UDdvFqsyRyYZMH|AeJ!Y{O z6!-D*Y3;}k59g<)r8Vd)b}XV$xNzaZnaj5yz=N1eb6!vC@TaGzpZ|z2ISkj7he4x- z(b6Ip;=HkJ_rphV)M&L$#kA`3k%`_Sm4f?|3wV97M)9d{8fB-Hx#AiAsP^F;3bsHC zV{@RudcsrllyZqv5oIgK&u7Qa8_mC=lnA~m?V_pIo~kw$+22pus zr6H_(yS3@cF~>3W)iXEY>R}Eu&r|b9>9S1w)UjABC#<9_lb(D#V-j8mB|N^hw{={T z+*T8v@?;(&BO@dE-(JvX+RhI4->e2xn5#d^@MVLE{;z=jMvd} zs{b0yW=ijDyW0Jb=s*eu3}!W6DqQ|FpHpG1L{O~o%abFKFBxX|iY-TEe7wE&X1-S` zXB*vmyjmB;E{O)^a+Ek$I_i2ta3>li&!%I@hjLS()-ID4LTY<*}19Y)_qcrYHMkxaJ7!4DFW}FJD^qShXi)WXL2bq%<)) zO&@k#8HrQQHPb9|Jap)gFgQ@-xD9mKupH#o3QLO5xdhfX}gIc0tT2WicL?yX% zGVIggV2irOc$@>JI#E(#`lt}wDg;%rY6ePBlkypiwYPDr%JEmzn~6t zkO>F~nCG?Zwy5U`WWMXJkg7VeSt09L@#=JxifNI&^V$Hp)nw74L0vG1a>kwKz87yr z&em~BE_PdZ#P}QXeS{U2RX5;@OWJhnZb(eu+93N%N4-<*lP7!U$2(*pV%jZq+`T~C zZ@S2C+)0UDY4mWC+jx?rwQR!LE&uSd`u3cfOfi^muG27WB+xKbT1LimV?NDU|I=%VjiKGPZY8FZ zy+xy~Nq)R5!{^J(%dwuiwSh6sl6-2Cyvxz4MGMLy7Ihp}3mtDYAEO2AO78S!^9$@O zEA(8dy=n8md){ctHdetlJ=nEp4noS3v!nsq_=2vut&GmgHFgKfA!l{nE>E}u0Vz|C z=bbjpaA&b&LB8ckB&=5U+}e@2u++`2r()R51fEwh;pNN^75F_nU;{%EwSd(e zOF8>SgzSn$GfSWIrlYJU2LvnhQt6X}@Dc>NEX(o8$aAuuwq-}zTkKPllRuL%-Fc>e z%4OM=Z|#G)m>3h6^|+qXY%TjWj-pgwWu{WeWrtNb8vjle6xC)CxgD0?=4n^r&feu)4WO+W@5)KLB`tk?%9f2_2)2hl@8;U9u8~nP$L;qRi^ZQk zyGY{_+Lb)>G|OD zie?iWJ(Sj~>gr4~LOLx1u4uc&XHaxD)+v#u|DaHH@t*- zu&IT+PdNmzL6Sy^(}sET<}BZ4RD3**L?BB-)w-CN*j$4k-pE|Dq$0d60U_aqvde3I zy-w@%?eh!IJv`cHe$+t3itaKkQHzO*f#r=2Sw5&>)K{zqp;ABk%f_9V z*SoR@-ap*qX;6G6r|c&AK00=G#aR9QbF+@>Y3sMRnpGnJ3)+?L^NcAf#O?T!+>N(Y0Te0lr%BMHHp8lqtYIus4RhYebDB@m zXgysqFF4Va<3~wINVty&7o&IS)XWowkqTl{lw{`Nv))KkOn(2P!)MmRsaum*EP8E+ z^vBv#&T!kjMVlffE^f6_r#_JN23+Cj&#oL(jSz>Ks?I{&cL+8dX2?Aot_0~}LvkqO zerRG+lGVoY&=^X;UD?L)Cou>hK}a^qoZxT8O`v6D#Ixxe7&%YfN_E5B+&q8j+siTT zyQf@I3unZNAcAz}TP0Pv5#R5gF#huPTCBdo_fK!!s0^$%1~M~QghfQ!?F+3Vm*Lrt z@!T&xNX>FeP;mA8k01J<{ja=$M~Cu2Z;?GcEiG1BTH0DK8Fd<%t`Fi*}L+@~CK5T8m9;#(j<4HT;f+}PRj)*)hKS&b=3 z_+S3O#~0BC*Jd?rOTNAc2rHG%v^N<>Wef|$VyG^Q+gZSq%%*=A#QPD1INn8iQq~4A zi@@DyJ0uUbq?*aABpi4W!kZYfrmCiP!*hVDFzF(d6ER$qe?>9s-Z?JAd&*}ei;PRyx? zX^Deq*G9b1(!dKL5h1_P3-|!MiP=qzF2~*tbIh*tcc$Uu;-WbyY;K;;kUxCRxF=tp zS@(0p9z5>b`X!JYgkU9cjzoL8bM43IrT7azR2YNsEUm5{styxnM^v~H(TV5Br+Qp( zs4gUbEVbZF_fSKG;2Cz4;K-<`EQjTLA!elqm5Uwn;9FLRyQG|!pJaj|M;MuruET>K z3)@_~`*_uIxZ&FB;v}BUu*?Kb=jLk3rr}(!jKuB+sbHDgjtH`2S!b1sC;2v)J)AaI z``B~qr|Tk~J%8SKDX04!cBR(T>3mqdVq6d0mco@QSI#i&iifOUe|3tY?6Q&DvT1Xy z+s3qq^Kjv8U2~!BtR-yNHrw7hL)9^Otf|c7!~Gu~Z{Rf_RXg@`>T6jbkG*wBB}4<# zbtsvnAyTr~%?)#!JHr098pQg?Cfs_bOUuVs^1-ItU(kHGfx?Z1Lq;XXq&4~0yNlHL zu=iK`ALDuZ_{4a7dk?q+UZ)4Vp2ft>>=O{6uiu5@6m_UgB$?x!wBuZ(2&!+OOqCvupGVUF=Q=bcZ-cxFDG59G8;q>>1XE-Wn6?J6E{=bEc` z-jGF4v%;M;$$Fx5B;7vSbJoBlGPVrf(0KqX-t`r{080iW>}hLI)2X9EHT`wD2yhV>F6BtxyJ%Y4c0Q z;`p@U6)}|lVXT>U^9E?+D5q-)zgyR?5l1<6_gy|U`yG(>q<>ln`zLq{^I#SkVco7@IX(a^#N_5I&`f)Vrto8r8#Wly9Sej=g-2~ zn~)%d<3jBcQ}YJTlvh+3G{;I**VniI@Y6^w0hE-z63OxMC5WdI? zr8gtJR^O=O3#@Sefl3c{uKPcYDk>|3_Tb>M4AlnRRgjl&RoR%Ct|Vu_5CHqrlUE0V~!IK(6SzBDu3nf z&UPUHpGy2~OPjU_kFFRK6jLgbd84BSv#_q&n3({q&iP=7{Rq|~#_S+(SH29iA@bkxy zLhoRG4azI3>6ieBXq-Ll(%JW+!pUigH&IO>Cn1b{AxyvRqSyGe&1ch+b++Ll3?}8d zW+2}wJWRMe*S+u05bglbwa=>bJ|)~y5L)$54-?T*Q&&!yQLf*A7SMXI0d}{HuCDH5 zuR)cl(oz8g(c!_hLj~52i-S3L#)1aZ(g@hM7H|NhKYdFrOT%|g>vkxx)v71$eKQc@ zN+x4znfbG1(+$2m^oGOK@Gc>il=^~jM1YGIZ+rReR)K0@n4;(^8Rk|R@lpY^1zwi8;II6ib70RKU3I< zmp-Rr#AOnr!_y$$J$-FVa*|Uwz4vo_G8+n z1@bK-UPim~-Z=*WyE2^BuHFpG&T4L0x;BhY1Gb-y&?gin_h7) z!m?%oc4wkHPZqYbHzg{XJfmUFR1WOHU=FaRi7%5BHsyQazi*s@w^@p4YLdaq+`E@i z^9J3&p8FW#i%Dh)*?OMEU=&}V%c(hDPK;Y44-`8+9ceCfz!HtS- z4U*{N*B4(V;y$uXM;xeRmEc73FyeLSF)E<&l$CLOkCRL8r!ils> zoulh_;DdDQ3%4GpY7SQRJ6EtWX&m=>J#(d7_t-442(r@f`A4T!lPf(2h7Qt z+1M0-SaZuJx+&g#q`<$FaOc$|!q?^OG7Fd8+y!m1I-(w?K8mr0?zn>AieB`a^K9Kd zVkkzM5-G)Z})x>eLuMn=Zl)AQT)FX)jF>_1qZ zZ#71Vg|S$X)mK$D0yjm8MOZS_VFtTt;lZ=uPl*8b87}K&d`+NppS)`J%E)_5`lxFD ziB|aw!deq%t&azs@1fm#*5OHy)z-2V!fmHVq;E<{yLTb(%~AGK(@)MuZZo}f=oJR$ z3(F)Xcn3~yefMW`#4#FGW~3jW+WzTp%2+TIR^lc0xq`}>?B~Ycd=_hEtCt%u`jB19 zDGYma%#@mCtkPrg$=s5{^5?)9?T{0-nv|JUZKV;~;8qoTJQza3Hz!A5;hee;=mMLASb@qG^eEN&v-rB3GgH|>jO4MBf zH6q(T-sZivKjEV{5^sK8Z)tMMbL95_jKSaAP4xQCYk5(mJ?@)biI+P2?Du%L+4Li} z@TL$e;C5O^tw^st)=pQ;B&8=R9 z$*HNX*JOR7&vJ^59SS$w;&H>>Y{rbgoFMu(pmL}Bb^V7)TL~(i^M6LOePLY2os+tA zko8~3q?U4V_dR-cALal^|E*!=ex|M(>KD=v)4mkJ8opyy%+iXfg%y{fZkt+%Lm1M-Gqd6HzM$xI z1V#eb?@{1Z0H)bl{p{{2sV#kaI18{U=PKgCptufi{#vTJwa6G|1Egm-Z8Qt`86*9| z!qQ$cC4>)Z<@b&9T?p5&d3BKQlXq^526R11cS^ zT%+;(#!wPhu}EwVK!khYW^AYaTtCq6XWmdtiL%29cUpyw;0eIx*pFzZK*>IV!#Y0hKIj*cK#KLjJ#GasuwERFN`nV!0mw;} zBOxInZ)cYe@Y;TD*ZJfv5i3&$DgfVX$Xb$o>zUamJ&E1js#fD)(mNd8$#@bW57Mx* z&fAm;`EP|PvjD~I=g_4LS?NE+GMSH`pCLrf6)4D(VR|R}N;DXYmm+}#iej$2dVcTS z2WA3jQ#_zbQOUU}Q+q67vgTK42Erw5JiD7smG&`tkn2@ zmdqorH;b;pE;m$4PEIZ!L^Dnxb+_sj`;CsfVXX@jT~=@rdLAA%z?02@5fKp$L~75| zXE5MLH7rLrh4kY(_dF_}e{znV{>H6ax7>I)mxsdWK~H#4HyPZPXlYJ0tZe^0fG$3G)JAF{~!|AK)nqgAOY6S|2Q;U@h zO9h$15fm2XOuaXdM=gQaV9%8VG5}HJC1C*p380?P^6>N|yuDQO>601PlV{idLX7x& zd_NrL?>swq(3G)|r(oF)Bjo+|CJi0vOy6EIj<%O-YUSE!?nl{D$ZcyZFaja@e5?+d+#u>gq&>eHCdo2bahz_ln+V&bmh zn1QkhKH+ATGKN?);hnbw`4>-{m(RVWQ*VgEwy zABW1ul-DSGI8*{o0rE#e-SNtW3&I>6KRt{gu^;dWgtTzg_0i!jif8_B0KfhtLFe&) zKZwDEXKBl@ojbiVyXtc~Xma5|imxnyUjb=*JM*(1wIxkHV{?n`FtjU-@uTZ`YL*-vsR(m?`R3vazgPfmP3$-1Np)%ggtZ zD4zW+G&Y0@-;VCgI-iF6Wm2gi^*!6dB{0~nRKqYED2*#wJ;di!>|veo%C*1uS&?!ry+uaqv{{1w}Qi&EnDA8zODIGU|&R+Zf_ z^E>@+EBU{n60I$1FwF!rso|j%%+7g3s3hcn>z(>np7oYy9ZG-C=uXgt(Ai_J4ATGj zTT5$NMFu0++rMGuwt?UZdU)@3VuOotpH|(kK5%Xu?x5=H8I9NeKB5`6SJ6UaT~rm$ z_k(E4?ylQ&GSgD@=kEUT(&O;Rbgj)8`FRH{*=7pk12zZqi1qky63>o~OsC9LnOV{* z0wlP+6A~-~$Pn>!ixGI(AF+*Pb`FKN+03#-2`2hqpv-`dK)m|;o!{gC^+1_Pi{FM+ zJ)Jlv^sfTYg&UT0?kjA^vpc_EK`U+RPT!JxWgHjZ`Qy(K{FGZ2=RXU3dun)H)4V7C z7YK_3qz!@r{R{Cdi{JITHy_~6`c&b;f3Bn}w8U>-{k2pc={8~WC``-rnyJ1U`&S)o z%aM4IlxOUBk(sJ(#;Mpw^1b=KYQJNhn}bEuZ5|pvN*2ZP#^2-!jn})(O;zzTbhQ(U68w1hCkqtTXM?5Zhw7Q z;;t)2K&-Yz1fdyEM0|X_RDCFq6`+|>V1@O~f@E)UK!oAgSiN#3)fHkGhF|lw)Eyli zT6+4VDr2w~pwdg6A6~#k!6jhq;8Q}#*n!-(8J?b=ETEUU5wqU}`P72zBK%T#>*3X{ zG>WJ%kZR?Wl;VHX_!&a68weVNmbNx=cU)qk81NJut1g-}6ciseC(WdYMRGsl*Ztu> z#^>a=t_=BKN&TbY!UPfHty?giOdhI9mLB2Zr(+kuCA9}@= z$-BC`2EB#0Vv>@0wuKKNLG4I_M4}o+g=5pluAk`Lm>KLbaXofifgx zC>k{Z3q+hRn|N4JEez&6z5NT z=AdvFWAZ#9*y|GDecQI{38e>mpOuk33poWDecO^Yr3j@whr|li)hE@}$&0e_^aRwp zv189&ozFC}DL*PKRks_tfJ`Wy*5m#wb0bm2 zriIcy`BoNJ?p>w$cH#w$cNFwMxCdj)pf6v(Tz3_G+J$rAUx^c@0A)>c7Eeu=1;Gr; z05*nZ7+XS<=b@Ue)xrqp&1Hv(b<^Il*?onQw{FFV-Pj{aQy3vZQ%zqw@bbE>ivupM z;33OTvY;X($zuLzkBWMlBJjV>pjw3QJA9Icw^%oR0K}{LYWg&Q`Xaz0Hv!q5j6-I_ zj|zI{VGd=gc19ybz=diB*7`u2ZqYcf?rwn4ggir@7jDb};6s2M$j^3=3|c@K=WI_z zYkC+!xZwHgucW{()$;DHBzQAmD~JNs>n%51UIujltKFR5QBqDhuqd<}=k&zBcyS19 zP>nx^j~k>a(je#uY+{YGbCu@>&uCDQdMukIR%U7#voy>0gZv7RS{}e6GHhInJ&eI9 zzY`*9g=nRMrR%2TzAUOx(?!JBdHYzK@1(B{@$(A?yt^8%y-FmXxP@aNb3qDod zz&wMLJzL}-y-!e(N}52UcU+j0@?`O9DzY2kl5#GQOJcEayRB2F@Bo$h z?~P->4o4g9`=TIAf3FSPPaq{4Tg$L3ll>-bQC0wk<(>`hQ<7wt@N%e;9w^*tqMdJd zGZojmSE$~*>~F$l7%JxBqtaO^s&B~7QsZEZ58Ic$QQNj_bTT`|#4mjGi{6+q<&%w) z+mIe`&e;s4kn;@|%%&I-M^!6@%|pOi?^p5pc>8F-&9n+&yFcJ4DNiQ*-NddB0)Ig= zjH+(6nPp^V6~M}!1ktTpl0!K31duoXWWaynn~^D>|3D(AiLwR%WZJDHp2|$3#-^b9 z1@{ja+?k`qn>#2Z>u}QqZv1A7e!<8JNc&a4iJKin%4x;w>pS1Wgqc*m+UF23D}SY4 zNOs<3MA`U&6K($UIsvqIhp^1l#2OL!eRJHf@z3L!%A=}tF`c3Z*3a%rqs|=oUS!_pL5{CsQS4(JCHFPm z>1Xe;l5U@>&lfQ6L}=a+;RQhQCWG|LlO7z1^7~Elu~A8%ee|znybU3NVDkL^$`*pm z3Gjp`B}B86Sdqo8k2q#QbBy~p)0uWa7OtISf-gD(lo8Rw-meX01%hG3#zt}PPuQ&+)0cSgg@60)Di{F~?9I(+`OSiSCjFmugjALS_QrAx#Icj0oLbt@dV*@o&1BTxc zM4v0z7S4Z391!Gl=^-ZSWOE=J>#A@dx*^OZNVqH5{;csA=~kD#z3->bMZhGRg-rK& zc)_aw05S~xLylVb_tuR<5if`;A%tu? z8X8cyU0IAfSwhS!PJ2d!(uRDUlO>zQpx68O`^S6T z$%{%NaZwcnO+-)BvbO61QrNPy0##+Ov9`=01S39nF7^)RQrTA3NBAN+`J#@F4(pOC zgtDJSi@ls4J!WM`^TAC63`H~)k<a!b$4OWdu2b&kmS=?;W>3@U_bOT}_1y zgeqYn0ckb06cKVqIWQ2kJ1+LLkDJATraG2U!!X;IwoY{q#IVHFR9yXJ1z<^js}@zJ zReO_j3>-{o{e1sw53~{Gtiz6E3YxZjrj5I}BKA>o(#`cv3yFxR^tG+_Of-rK`zejn zM?JkLtgk#7ck10>Qm;RgY`RWc$%5O=eiHfjiAjR?4yKq&kLmTCFsoyb@K+L@e`R5(c2`oL&%4!mMst7lZrl>*;T+B-=o zsOG>LLUup*faz9J)KdV((QaWp0oovz?JoSJ0#>uh>O1h7S5>r$tPhnmSIL(9UEKQ!t~64k<>)5q>fi? z#rW>Qri^ruz96hk@o|G+#Eq1zt&QScMg}tE(p|bF@$~6aWZu!O4^7Fl7$Q^jd^9EU z>%D-HZcCE-!uo$O&vvTj=L-K}kSVyV4Ga=tqi2E3?{(J0sbf=CG==Io3==?BJa}de ztSsqOGya5x1QXXs#|~eO@V{yv31uGs3nf@A$6^7oWdS3I5V|L-0s*!s0OSTm7&&kO z$1xM0JZS(i7sV5pcG)3iLcM_9WHWNNZY6-bM(QJ^tOmN%v1K(CoqA*7Uugi^du`G0 z;;nPo>bkl%3HF}o|7MmcNEMz=9c$qr0D_(qOa&089@(N%8wh1Y|04t z1vhmB6s0UqYc}Ba#99n~ZbYV%{srj1XaQ3YZCL$~^Emik+Q1GtrrMp>27opKJX<$G zEl`*G76M*pq_vQOVY}A?3L)giwgj;{9%_OPZB|PLg`(*SV)Rovb#;>wb9$o-1Vwi9 zO;3r`Z$OH_<t*WbgRpiw-Cl?u^o z1D{u{e3Ak!s0q-$B3v}2t*y;^@4F~u{!!$Oiw?w_00VO@DsA?cG?KF#c!SXrc^l!K zM!+fd4oOX@li{e{TDz)+8xnC~c?rhqk5*BKwV>;Rj-DhNceD0qUw7U`rMLV!y>>~P zPPVpr$gPIlRNy9@;^TE#GJ|*n&P@rc1=I2A!M)tHt3c!9S`xvG_UA&2jTrO@fF&K+ z0Mt+8Y1#jN7q$t^XsN&y7{J~+Y7z#!;4ovM6l(eD1&12a_28|2H1|4xTLCVC6&N8f zXgD`R2Mdr>RO>T-C34Uzb8!O3MnFJ7!^|w}IS0;~(fcKRFTH9;Ox5OOpg zN4*5U-#ob9m7NM{uNA!|g?ZUcbP&LF7wr7+^LDMUnW=J;)*E_??C)cn09f8Rbv^l$(=UZAGNxiXWF+)KH+SLY|X6u~2SNUtxpE(VA@cyb^>wL<$tG;;KN zQA?W4DM6rYhJGM;6GBqbp78+*3IvV$za)j+>1p}+qjP!_Rn*WGZ~+Ss5gNx#%<8Uz zeTdBV`*Db*TUyM?i%Q`@4h}=3Qhd$?qA_5B#=`;zrVUo>^z=0H*%34t+yF0b3LPCC zICA>-hnXgZz`(3Wx&YKBB2{a1eGy!JEqbif;PZ&p2eV7!&2J4~w#Q@^)a(^={;fb` zgdh&K31}|j9$lDD5QUnLvUm4~?P&z-Hz3F)Fg*6Yh(?kZWHl>jy%|CMC*anc2S3ml znA;Qp*o+z#n0*z%Ha*7UjR$v*2y`OlSdnFsuMrbJYL(-X2&n;sP%CnCfjJq%Lm-=R zpf96FDo80QAFN@Q#{zL>SE)Zf9eddoQU*pd4d_13uTSvN@`E``?wv*ABWPY|Be|Wr zQo3p5$Dl^pD!0Gbv?D{O6Iv)t@<*sbAcuQK0}M@q34`S=7G>@L&ca&U0)uK8!i84V z_7vKqSXgWFCcJHm^l<>5@DEz|F_&i+}w;RyY(CB4zHY#!Par;3h(1fRcpp|=2XlN=5E2u1kmX|2buA!l! zB*+cOCL2>3RJK(a3cVuZu^Wc?FxR(PM!pdaW-0K_Cp0=T5OT-a!NZ&tWOVDd`4!| zj8i)H;I2wSnlS1)XV0R8ZS4w+PVI`lcRUJDj&=0f7}7r?!DFUcA__`uzmAEME=V~| z+V6z>>i7X$;)jI<6^kZGrOAu_?6F-=1u+gfnn6d)98iOB3x zfaZ?x(>5&T--LM9=bASRKEXX~!8@6(%A|Db=m9=IaNq00p9exqSxjZh*{zuJQA}KX zF6~u|f9En07^iMN?psmudHp&Z?4&LBYp6vgWnf>YyXD%D3{ z%!ZuCE1fgh^3!D4rmvrEe7sc{n<{b^_mU`HWlFj4<1J-T7ZWldudJJrR+#SM7QcJI zBK)W+hVj0ogG8TP=1Upd;Q2*wMz)6d-9)3shrW{}elyTY5Mz=f)aGH(c*d6?NBv}B ziQkYPLHb{#)yDlVu{0fsgq=z-u~)|N4?Afjl2E~GAWIP(KPY_bRsf2skl#ijK%<66 z*Z`L?%$03Mk;A;`A_ zBJg?hCIaZ^L;#S=IVK@pUt#2XT}S%yjtPNR!KO%k*?|{a-fgzs1JkHs(wvqK-Vh_R z_j81(sHhaQx@H-)(xEelZ&LK;yAu)nQo~U2*|}taxC=HTq^Qm} z{z2NOT%fkeH0|RR=D#^a_v^N2z2XE(eB?SWaC|rRj=@ogSgM>fX)JHvh;Eum9K64D zQ`LMdSt@zCnLy3FMwaeUT4tuCVT#n6#m1$4J-geJ37|OH4D<$B^{zWBV1+U31m7g- z5IgczCH1KB`ID#qaFXZFMZ^=5lcxdjf;=mZ;1pCNEBkX^y1AvW4@D~EI-X^P$)w~oB)_BX z+_#!#-MCx!3Opf1I%66l5rc7f^>7z_gE^q_i~836gd75Y83+DnVr`%7 zKA??XaWNZg7Lg)J8U;6Gow9{uVtjlTI2>fS3LY9=G2?q>V|>~M4q5TZXX3rn;6A&1YuveRzy#m^9D%mp zpYslWQQU0c1K7#v_?^CY=S?Q(UpmEhOx^O0@?X6j$#RZh2V)yVdm3>`|BBNf9{h<& zJH!KG!O(wR*`mB_j=1`{Sy>`Zd+WXQ6hKWxO~kO_phHO%ikjxrcZ0t=_p(S7LF1eq zxDjFRTtW2-D#pPxJgC)Twi{VTG2OcPQ~2TkP`n0H%dJU@V?K)NjnP;ymb-N%G11Y( z4{^w(K!NLbqlkQs2X_Hs|k7`5hRs>Mj{lW4mXx! zx5k+QbVdM_2kU&m;AXqa0zBMS0ymZZQ36?%zMc~Yqb5pKE+nDe>pjLMCaJ(VuX%Vt z>obJTqf0hhHfd-VYPBr{G6le71~JvSy(oS0Bl(WLdCimxpP1NQwUYTrRNeX{Iq{`m zvPPF`{#!Kx0RbsoKTpqd39&M70s}{#*PzpGKJlcU?N;BygMp@WZ4tO_JqYj{mEfvE z?k2Eq=AAkn4BiDavNvX$1^+=yg3NCT9d01PN}}$c>(^bt5sJI7B>I`T{kCfNR4u{+TDmhK7Ti9_#W&Al`L9O1ZJQ0Zl(tviqH zWM{c`fe>vK-;pdr#k1eINDtZ)J93d^!fvt*rX2a0%tJS?pww$R`6e5nSbX*9@avqf z^UCBSqizYdlD3k(bf#HZi!FGA+Sil)^}^AW`v@$dftEG|g=J3aF+7yH)-iM#%6&K)6(;eXv@#317Rx%$>n831nl0Tw&{{9if^ z|4WvYc1D*%w{;>R5Qi4l7vTZ&Ql$=B3%x09CG=g$i>#r}{&wi&1!KM=w#0YKai)5n zy}5{0?iiA<;?}jzsZSK!eU$#Th+{f1{2%9(df7TfedmaILbFuWUpoF^7To0VQM~@C z>ltqUSeM>;Y*WulPru)H)|3*-$RlBHpLP$tVUMo#U`;0Hs}}XO3?rK;Q7y(eE$+6x zG%h-I#MjauwbHyU1IylDL3|5ing!{%tzGRPJ4X56)bUq(op(kTkxlKv$(rON6ASRH zpX}y8ET6%v&{rp}Fn`VP<#`2imbr<~cYKoZ)|*l=QXV6vc*iIqCMc789Q_G`q(hvw|KDa9DDE#niRoTS~OL981*G0PV{C7=Lqz#$ph%` z#y!e^iiumMGwp_f=aY3-tZ?VtiSo>}O`l-CfG^}J!QWAOde)oA~#fcLK3k9I2` zC-ON48rTaqPtfRJ#kTuB8#x=(bAhmy`A3gw{8T%;7!yH=3Ecz(ZLFirI|(678esNuF-;x=Z7-G1lFq9 z#UeJj4rE#atX*>8MK%|Z75yl6bah98sceB1bVh>aKbn2qKaxBH@CRDisfTl|#4k@x#HS)0iTsq+*vtvmmpAS>~arWidP;$&?&mb4aW_x*Jw9xm91S-`s?^85N)ew% zv*jn9ZCxB79G^{lN_sGTPfJ>J;_K{PTQfZeu)Ed;_4^*2Rz@FyzPP0Q0Bm3K8A>W zAe%GI2d*QNR{n4#G%z0J-y5I9G7b}Wlq52;AK!Ssg;22M%dGG@)%7-T4iCMmdH$-d5YrBU) zi1sd1Qia%jAD!lA0)^?od%qE|dpw^NB@!hxjZTOx?R-k0KHm7jM9;UVg@gXPv85!} z9ow#t!&lem_l{IcGAbnGfT=u2KHXa2rQY*KbGsr}?}CAQHI6?%W>rLy_)DB2oFf+nhq znxMV@F1mN-MvIk0ZK#*=H-&+~@q^3nh4h8!wh_QDQxsbmW!U2jhsNkPcGv!P+3uVo z1fzF0Ug`RyzN!;he|)FEF2yO!6d?5Q(|>zT|EGPc8##IYfbng}-R%7pnlQI|jkbx8 z9Yzyyx;WtG;OsrP1L~g!p5c!rXzM~5HXY{mkv4|hpnj4AE8o0er7MMy6#`iuzmaM8^%x|}w4?7HJ2Qti9o&`le@=soh@ zmgd3i+w-q2MBV2_%c9pL^GB6@=A90G=P?wKcXgLh(Cfk|bN&(>-n#u7b#Q8_t8_W} zo1LceT1(y3w#BYJkDhK%$rh#Z}>CO|1tzqQkS!x!*XR;yS$0y4WwG+^f?uPt2hm~hl`o%=f<}d z^;UyX_QFdK4@EdC2g$={MV^R$oO1xkyEhuly~vCTUWFdqeVSYT>j&UhvY#KtbRp&U zCf5WD=&~cgGHsnMP+bk&H)-I~G3l+f)esG2(kMD<#+`&C5=7QSxCy(d4>&%dp+Bwl z4(!>wSq5ftSr;(b?=c>8=lXd-;;i2B-`&?++bPuo`Wi*3jlyGo`wn()qTQ~Adl!82{15+hg6_DE6~wDIFQ1$%6(6>C?V<=*m~MQ{etgrX61pSI zS#$bGywajen|K=up99bpaxgdg)D^F%UGyc8K*J(vCV@bOEb@U76KVWuoTlr>8d*IQ z!YUK=B6T02;3-B1!t(ZD%OFze7j$^xdjy=%FhvPEtYLtaN*z2e5>&56Ab5(m8 z?Y|nX`3JB@UdLXT1ry%JvPVcbgmjr54qB}8Pg?5X%bPb2+Y;+mF8Jn1h|cMa zj5V`@v_war0_>i=@-V$RA#Ft3UO6hn2d+lt4102I{^A48q^>H^Y%EV*${%juH7D;M z@>uPm0*$);l&)Lw^j#l?y;GqEPYGYJ>-Hqi>hAv{Nx|#t6w*A`-C`)%^=zMPnyrAw zRez~DvW8od$$_Kj?n-ac%=c?QScsfaT}sc^kk_(&Ux_CttUByGM5ncT^P{w~ zdW`2i!{>gorI&z#l+t)Q!m*d`^^-^iec=a_wA3eF9NT<><0;ibmx9Pb#9+1;Br|ar z>+L;vONf$y56+hhIRvnT{|=~g&r~&?H49>H_>B&D@F{3&Mu3SW3OoYR$VLuPss|Uf zMd;0!77Lg!O=f5eAI``0J%@mr%r@M^(W4l+$fR|Mh)Q`7;VA@#kB0=|3VTc5ma zp22fgwA2YTRAU}Y5h9?4d2q7c(niMGKgAB(MYpAkt+<9U`qg<20h9ZCRbK2r9Uxm# zsU3CfGW-cz$A$3oH=9s<`H9Sx2IfGfDKdnQdY?6(xW}(?JBYZ#+0<~ehXkki$CVp5 z1beTyJk%TOQux^3O~#!Zul>V!VOmb1;|2Y(E9KJ^rssKS+u&Ny)v+>NkKlwd1s6I> z`^ZbhB_5CU=kJTkXld0>N*6pjRIWTu&rCNrbQUM@@*bN@C-4nTWUUpd@!#85TYlpf zShw42w)F8ypqp%Qyl33!mA+7^FhOEdD>wuIg`vHM2g7cnsmgt_gYgR*N%}QaI~9s8 zFUUK(Q>T8>7>-P2jbU(SfiTAp^PfG6Y9sknU zjAJEdIP#2=9~(!M|994n1!i+XRrcS<8Hk6$i4?%X{7=JN2pGe)PyFK--#Nu_Y{FJ# ze)2aC%dKU((EK4rl{5t7?(4qemCthlOr*i>{r_$w!(3b*;@eC>O;x$MO2DkPBIy@w zEIDP5YPMEDZk-}CZC3*MKHgmpprxX-Ag#a|UeEFh;M6#}*z}n6%I~YI`4yi=lA7B=ea(#Yz%j4J2w%NTOr_0Mb zC@2Yd@y#;mk#7X+7;#VSjgb{}lgx@wR_H7QFqPs3W?CkhTY0UT|wNty~2y)Ioc*&RXb&2f3zIpl0Iy%O8UlcX1ac@48 zj9=y%Z7uPtu1QRu9R8^PBtLDpEnj(iVVK?gSoF-y)N;>QV8Bo71D?@8_vGg`sY826 z%!Ia!30=v*-=mF;K{)!ndcV zBjU<^rBw=jk%04{I6Z)An~z>})|en?!j!X}VOR_kkvp`HRHsswI*jqb79!Qnm9y;{ z!&AIm*~#e8D=uX(?wLrgjsGPjwgWoZM^M&0gFtA*j4tBm^Dcw;^gt%*((3B7qNM49 z7f!>qf8XoJww$DHO}x=%(A$^ z-IxYtzAu^{mY*-N1a3*hBRD})E=T^1d3-N^mj)~%U)%z>6*>OUqAlYIkVNQ3cbGTS z1e7b$f8e$eHVBNbd{oM^YOEObAr~%KAl0=&oOQE%q!&Mr#ERs3HYRDXV*uYeV6a?{ zr@^_h?%>z)?~yD;fZ&$jKx>akk6ESjd}k#3yGmg)TVF+(7gRhS>UkpikUs{ZIpvp1 zYLdr?s5uG+G8j%E;2Vim1sGSTWM?~gq6m8*zk&Joxc&&>1BVce^*awn=NI%L20l+*FVL9qfW`{Y^KwlP?cP^qBbge!t@`s*oAs z`~#enTL(cdP1A5re+<=Rpsf5>3 zi#g;AB-+9<*~9{(GUVZ+)h$UtlE2;O(sUh3zn56>TuGLc?y-S%Xn<|OhEWoaMCXtX zL|B~+Lr?&?+D1^u#)K&p3tsOA=ka6k(>cjz@oBWG*y|6602z+PUXWd-yBo1V&vQ!_ zVF<`?Iv55Qis@DT=6MYFkM zee2NOi&&Zeh(~nC*_uz!k{B^d&frZZr5Y|8j`w}o0zYA^h>4 zoCBzbvCsbA8qN>I(gSA1!Yyh~ljl(b*%#bhFExq|d;8Mk3f{8$D#X`Wv08F2l}4FEuWV48;)qIB=DVvjg7y0juG*cQ!XS zk5ukCm6U3kvZ>$+WYNOkPUT6M@@pwcKz9z7y@tBF1>RE%!a%&3XRXDv=cXd2o!4UJ z;E+ytZ>bEU4%=rmmN<4L8dLE#xZ32mCR*EOIR|;dNGlTJK}+-z-Od=Cb+{fvHIyfx z512*mU)XC0yz~VMNWCq(7(8ohsLdE14gF^yUFgd|k^cgPO(tZLHkltNAuhIMxnR${ z#BxBK;qL4alwN%L00aCQ19k8-zaP~xlqsMm(CJPGz6ts^Astk8)z*;{&@*csbo|tM*-&$i%LiBg@bqj za@@d5jR4>mXzCk3n&eyS$}4bSUpo3P#sE_)eMC3$49r$lD|Insv+z|hV?(nY8QYxC`~?JHZf^hp literal 0 HcmV?d00001 From fd90f8b44e8aa69d40a0b63e3e475ca5c90573b3 Mon Sep 17 00:00:00 2001 From: Denis Shchepakin <1842450+Sowiks@users.noreply.github.com> Date: Sun, 22 Feb 2026 21:07:50 -0800 Subject: [PATCH 4/5] Added new line before figure captions. --- docs/MATH.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/MATH.md b/docs/MATH.md index 605c54d7..150a956a 100644 --- a/docs/MATH.md +++ b/docs/MATH.md @@ -34,6 +34,7 @@ The current implementation prioritizes: A representative example of algorithm application: ![Figure 1. Example](./imgs/example.png "Example") + Figure 1. Here the algorithm detected 4 change points with a statistical test showing that behavior of the time series changes at those points. In other words, the data have different distributions to the left and to the right of each change point. With that being said, the difference could be merely a change in the mean, but the algorithm isn't restricted to that and could also detect other kinds of changes, such as a change in variance, skewness, and other shifts in the overall shapes between the distributions even if the mean stays constant. Once potential change points are identified, a statistical test is performed to validate which of the points are in fact change points. That is to say, they are statistically significant. The user gets to choose the threshold (also called p-value threshold or significance threshold) used for the statistical test. The threshold adjusts the balance between finding fewer change points and finding false positives. For example, a p-value threshold of 0.01 roughly means that there will be at most 1% false positives. The false negatives are harder to estimate and depend on both the chosen threshold and the actual data distribution. @@ -43,6 +44,7 @@ With that being said, the difference could be merely a change in the mean, but t The main idea is to use a divergence measure between distributions to identify potential points in time series at which the characteristics of the time series change. Namely, having a time series $$Z_0, \cdots, Z_{T-1}$$ (which may be multidimensional, i.e. from $$\mathbb{R}^d$$ with $$d\geq1$$) we are testing non-empty subsequences $$X_\tau = \{ Z_0, Z_1, \cdots, Z_{\tau-1} \}$$ and $$Y_\tau(\kappa)=\{ Z_\tau, Z_{\tau+1}, \cdots, Z_{\kappa-1} \}$$ for all possible $$1 \leq \tau < \kappa \leq T$$ to find such $$\hat{\tau}, \hat{\kappa}$$ that maximize the probability that $$X_\tau$$ and $$Y_\tau(\kappa)$$ come from different distributions. If the probability for the best found $$\hat{\tau}, \hat{\kappa}$$ is above a certain threshold, then the candidate $$\hat{\tau}$$ is a change point. The process is repeated recursively to the left and to the right of $$\hat{\tau}$$ until no candidate corresponds to a high enough probability. This process yields a series of change points $$1 \leq \hat{\tau}_1 < \cdots < \hat{\tau}_k \leq T - 1$$. See an example in Figure 2. ![Figure 2. Main Idea](./imgs/main_idea.png "Main Idea") + Figure 2. On the **left subfigure**, there is a time-series $$Z=\{ Z_0, \cdots Z_{21}\}$$ in red color, with two subseries $$X_6 = \{ Z_0, \cdots, Z_5 \}$$ in green and $$Y_6(12) = \{Z_6, \cdots, Z_{11}\}$$ in blue. Among all possible consecutive subseries, the subseries $$X_6$$ and $$Y_6(12)$$ have the highest probability to come from different distributions, i.e., being the most distinct. These subseries are completely defined by the pair $$(\hat{\tau}_1, \hat{\kappa}_1) = (6, 12)$$. If the difference between these subsequences is big enough (above a certain threshold, which depends on the implementation), then $$\hat{\tau}_1=6$$ is a change point, and the algorithm will continue to the next step with the next best pair being $$(\hat{\tau}_2, \hat{\kappa}_2) = (12, 22).$$ Note that the $$\kappa$$ defines the end of the subseries $$Y_\tau(\kappa)$$, which might be before the end of series $$Z$$, i.e., $$\kappa \leq T$$. The reason can be seen on the **right subfigures**. Specifically, it shows that if we restrict the $$Y$$ subseries so that it does not go all the way to the end of series $$Z$$, the algorithm might detect the changes in time series $$Z$$ better. Consider the loosely defined distance between the distributions (cyan) in the **top right subfigure** $$X_6$$ vs $$Y_6(12)$$ and in the **bottom right subfigure** $$X_6$$ vs $$Y_6(22)$$. The tail $$\{ Z_{12}, \cdots Z_{21} \}$$ in $$Y_6(22)$$ muddies the signal, compared to the truncated series $$Y_6(12)$$. There are a couple of additional nuances and notes that we want to mention: @@ -51,6 +53,7 @@ There are a couple of additional nuances and notes that we want to mention: - In the example in Figure 2 we effectivelly used distance between means as a distance between the distributions. It's an oversimplification for illustrative purposes, and in reality we actually use a divergence measure between multivariate distributions. See **[Original Work](#original-work)** section for more details. - In the example in Figure 2, we compared only two pairs of the values $$(\hat{\tau}_1, \hat{\kappa}_1)$$, namely $$(6, 12)$$ and $$(6, 22)$$. The algorithm actually checks for all valid values before choosing the best one. See Figure 3. ![Figure 3. Tau-Kappa](./imgs/tau_kappa.png "Tau Kappa") + Figure 3. Divergence measure between distributions of $$X_\tau$$ and $$T_\tau(\kappa)$$ for all valid values of $$(\tau, \kappa)$$. The biggest number corresponds to the most promising pair of values (marked by a red cross). ### Original Work From c77aac04fd41fca57de9d05753fb282e23b33e63 Mon Sep 17 00:00:00 2001 From: Denis Shchepakin <1842450+Sowiks@users.noreply.github.com> Date: Sun, 22 Feb 2026 22:41:15 -0800 Subject: [PATCH 5/5] Fixed several rendering issues. --- docs/MATH.md | 59 ++++++++++++++++++++++++++-------------------------- 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/docs/MATH.md b/docs/MATH.md index 150a956a..e8bea509 100644 --- a/docs/MATH.md +++ b/docs/MATH.md @@ -35,46 +35,46 @@ A representative example of algorithm application: ![Figure 1. Example](./imgs/example.png "Example") -Figure 1. Here the algorithm detected 4 change points with a statistical test showing that behavior of the time series changes at those points. In other words, the data have different distributions to the left and to the right of each change point. +Figure 1. An example of running [compute_change_points](https://github.com/apache/otava/tree/master/otava/analysis.py) function on [Tigerbeetle dataset](https://github.com/apache/otava/tree/master/tests/tigerbeetle_test.py). The parameters for the `compute_change_points` function are displayed in the bottom right corner. Here the algorithm detected 5 change points with a statistical test showing that behavior of the time series changes at those points. In other words, the data have different distributions to the left and to the right of each change point. With that being said, the difference could be merely a change in the mean, but the algorithm isn't restricted to that and could also detect other kinds of changes, such as a change in variance, skewness, and other shifts in the overall shapes between the distributions even if the mean stays constant. Once potential change points are identified, a statistical test is performed to validate which of the points are in fact change points. That is to say, they are statistically significant. The user gets to choose the threshold (also called p-value threshold or significance threshold) used for the statistical test. The threshold adjusts the balance between finding fewer change points and finding false positives. For example, a p-value threshold of 0.01 roughly means that there will be at most 1% false positives. The false negatives are harder to estimate and depend on both the chosen threshold and the actual data distribution. ## Technical Details ### Main Idea -The main idea is to use a divergence measure between distributions to identify potential points in time series at which the characteristics of the time series change. Namely, having a time series $$Z_0, \cdots, Z_{T-1}$$ (which may be multidimensional, i.e. from $$\mathbb{R}^d$$ with $$d\geq1$$) we are testing non-empty subsequences $$X_\tau = \{ Z_0, Z_1, \cdots, Z_{\tau-1} \}$$ and $$Y_\tau(\kappa)=\{ Z_\tau, Z_{\tau+1}, \cdots, Z_{\kappa-1} \}$$ for all possible $$1 \leq \tau < \kappa \leq T$$ to find such $$\hat{\tau}, \hat{\kappa}$$ that maximize the probability that $$X_\tau$$ and $$Y_\tau(\kappa)$$ come from different distributions. If the probability for the best found $$\hat{\tau}, \hat{\kappa}$$ is above a certain threshold, then the candidate $$\hat{\tau}$$ is a change point. The process is repeated recursively to the left and to the right of $$\hat{\tau}$$ until no candidate corresponds to a high enough probability. This process yields a series of change points $$1 \leq \hat{\tau}_1 < \cdots < \hat{\tau}_k \leq T - 1$$. See an example in Figure 2. +The main idea is to use a divergence measure between distributions to identify potential points in time series at which the characteristics of the time series change. Namely, having a time series $Z = \\{Z_0, \cdots, Z_{T-1}\\}$ (which may be multidimensional, i.e. from $\mathbb{R}^d$ with $d\geq1$) we are testing non-empty subsequences $X_\tau = \\{ Z_0, Z_1, \cdots, Z_{\tau-1} \\}$ and $Y_\tau(\kappa)=\\{ Z_\tau, Z_{\tau+1}, \cdots, Z_{\kappa-1} \\}$ for all possible $1 \leq \tau < \kappa \leq T$ to find such $\hat{\tau}, \hat{\kappa}$ that maximize the probability that $X_\tau$ and $Y_\tau(\kappa)$ come from different distributions. If the probability for the best found $\hat{\tau}, \hat{\kappa}$ is above a certain threshold, then the candidate $\hat{\tau}$ is a change point. The process is repeated recursively to the left and to the right of $\hat{\tau}$ until no candidate corresponds to a high enough probability. This process yields a series of change points $1 \leq \hat{\tau}_1 < \cdots < \hat{\tau}_k \leq T - 1$. See an example in Figure 2. ![Figure 2. Main Idea](./imgs/main_idea.png "Main Idea") -Figure 2. On the **left subfigure**, there is a time-series $$Z=\{ Z_0, \cdots Z_{21}\}$$ in red color, with two subseries $$X_6 = \{ Z_0, \cdots, Z_5 \}$$ in green and $$Y_6(12) = \{Z_6, \cdots, Z_{11}\}$$ in blue. Among all possible consecutive subseries, the subseries $$X_6$$ and $$Y_6(12)$$ have the highest probability to come from different distributions, i.e., being the most distinct. These subseries are completely defined by the pair $$(\hat{\tau}_1, \hat{\kappa}_1) = (6, 12)$$. If the difference between these subsequences is big enough (above a certain threshold, which depends on the implementation), then $$\hat{\tau}_1=6$$ is a change point, and the algorithm will continue to the next step with the next best pair being $$(\hat{\tau}_2, \hat{\kappa}_2) = (12, 22).$$ Note that the $$\kappa$$ defines the end of the subseries $$Y_\tau(\kappa)$$, which might be before the end of series $$Z$$, i.e., $$\kappa \leq T$$. The reason can be seen on the **right subfigures**. Specifically, it shows that if we restrict the $$Y$$ subseries so that it does not go all the way to the end of series $$Z$$, the algorithm might detect the changes in time series $$Z$$ better. Consider the loosely defined distance between the distributions (cyan) in the **top right subfigure** $$X_6$$ vs $$Y_6(12)$$ and in the **bottom right subfigure** $$X_6$$ vs $$Y_6(22)$$. The tail $$\{ Z_{12}, \cdots Z_{21} \}$$ in $$Y_6(22)$$ muddies the signal, compared to the truncated series $$Y_6(12)$$. +Figure 2. On the **left subfigure**, there is a time-series $Z=\\{ Z_0, \cdots Z_{21}\\}$ in red color, with two subseries $X_6 = \\{ Z_0, \cdots, Z_5 \\}$ in green and $Y_6(12) = \\{Z_6, \cdots, Z_{11}\\}$ in blue. Among all possible consecutive subseries, the subseries $X_6$ and $Y_6(12)$ have the highest probability to come from different distributions, i.e., being the most distinct. These subseries are defined by the pair $`(\hat{\tau}_1, \hat{\kappa}_1) = (6, 12)`$. If the difference between these subsequences is big enough (above the significance threshold), then $`\hat{\tau}_1=6`$ is a change point, and the algorithm will continue to the next step with the next best pair being $`(\hat{\tau}_2, \hat{\kappa}_2) = (12, 22)`$. Note that the $\kappa$ defines the end of the subseries $Y_\tau(\kappa)$, which might be before the end of series $Z$, i.e., $\kappa \leq T$. The reason can be seen on the **right subfigures**. Specifically, it shows that if we restrict the $Y$ subseries so that it does not go all the way to the end of series $Z$, the algorithm might detect the changes in time series $Z$ better. Consider a loosely defined distance between the distributions (cyan) in the **top right subfigure** $X_6$ vs $Y_6(12)$ and in the **bottom right subfigure** $X_6$ vs $Y_6(22)$. The tail $\\{ Z_{12}, \cdots Z_{21} \\}$ in $Y_6(22)$ muddies the signal, compared to the truncated series $Y_6(12)$. There are a couple of additional nuances and notes that we want to mention: -- According to the provided definition, the change point is the first point of the *second* subsequence, and, because both subsequences must be non-empty, the change point cannot be the first point of the whole sequence $$Z$$, i.e., point $$Z_0$$. - - There exists an alternative way of defining the change point (as the last point of the first subsequence - in that case, the last point $$Z_{T-1}$$ cannot be the change point). And, in fact, some of the papers cited here are using that other definition. However, Apache Otava uses the term "change point" as defined above,i.e., the change point is the first commit at which metrics change. +- According to the provided definition, the change point is the first point of the *second* subsequence, and, because both subsequences must be non-empty, the change point cannot be the first point of the whole sequence $Z$, i.e., point $Z_0$. + - There exists an alternative way of defining the change point (as the last point of the first subsequence - in that case, the last point $Z_{T-1}$ cannot be the change point). And, in fact, some of the papers cited here are using that other definition. However, Apache Otava uses the term "change point" as defined above, i.e., the change point is the first commit at which metrics change. - In the example in Figure 2 we effectivelly used distance between means as a distance between the distributions. It's an oversimplification for illustrative purposes, and in reality we actually use a divergence measure between multivariate distributions. See **[Original Work](#original-work)** section for more details. -- In the example in Figure 2, we compared only two pairs of the values $$(\hat{\tau}_1, \hat{\kappa}_1)$$, namely $$(6, 12)$$ and $$(6, 22)$$. The algorithm actually checks for all valid values before choosing the best one. See Figure 3. +- In the example in Figure 2, we compared only two pairs of the values $(\hat{\tau}_1, \hat{\kappa}_1)$, namely $(6, 12)$ and $(6, 22)$. The algorithm actually checks for all valid values before choosing the best one. See Figure 3. ![Figure 3. Tau-Kappa](./imgs/tau_kappa.png "Tau Kappa") -Figure 3. Divergence measure between distributions of $$X_\tau$$ and $$T_\tau(\kappa)$$ for all valid values of $$(\tau, \kappa)$$. The biggest number corresponds to the most promising pair of values (marked by a red cross). +Figure 3. Divergence measure between distributions of $X_\tau$ and $T_\tau(\kappa)$ for all valid values of $(\tau, \kappa)$. The biggest number corresponds to the most promising pair of values (marked by a red cross). ### Original Work The original work was presented in [*"A Nonparametric Approach for Multiple Change Point Analysis of Multivariate Data" by Matteson and James*](https://arxiv.org/abs/1306.4933). The authors provided extensive theoretical reasoning on using the following empirical divergence measure: -$$\hat{\mathcal{Q}}(X_\tau,Y_\tau(\kappa);\alpha)=\dfrac{\tau(\kappa - \tau)}{\kappa}\hat{\mathcal{E}}(X_\tau,Y_\tau(\kappa);\alpha),$$ +$\hat{𝒬}(X_\tau,Y_\tau(\kappa);\alpha)=\dfrac{\tau(\kappa - \tau)}{\kappa}\hat{ℰ}(X_\tau,Y_\tau(\kappa);\alpha),$ -$$\hat{\mathcal{E}}(X_\tau,Y_\tau(\kappa);\alpha)=\dfrac{2}{\tau(\kappa - \tau)}\sum\limits_{i=0}^{\tau-1}\sum\limits_{j=\tau}^{\kappa-1} \|Z_i - Z_j\|^\alpha - {\displaystyle \binom{\tau}{2}^{-1}} \sum\limits_{0\leq i < j \leq\tau-1}\|Z_i - Z_j\|^\alpha - {\displaystyle \binom{\kappa - \tau}{2}^{-1}} \sum\limits_{\tau\leq i < j \leq\kappa-1}\|Z_i - Z_j\|^\alpha,$$ +$\hat{ℰ}(X_\tau,Y_\tau(\kappa);\alpha)=\dfrac{2}{\tau(\kappa - \tau)}\sum\limits_{i=0}^{\tau-1}\sum\limits_{j=\tau}^{\kappa-1} \|Z_i - Z_j\|^\alpha - {\displaystyle \binom{\tau}{2}^{-1}} \sum\limits_{0\leq i < j \leq\tau-1}\|Z_i - Z_j\|^\alpha - {\displaystyle \binom{\kappa - \tau}{2}^{-1}} \sum\limits_{\tau\leq i < j \leq\kappa-1}\|Z_i - Z_j\|^\alpha,$ -where $$\alpha \in (0, 2)$$, usually we take $$\alpha=1$$; $$\|\cdot\|$$ is Euclidean distance; and the coefficient in front of the second and third terms in $$\hat{\mathcal{E}}$$ are reciprocals of binomial coefficients. The idea behind each term in $$\hat{\mathcal{E}}$$ is actually quite simple. The first term of $$\hat{\mathcal{E}}$$ is the average of pairwise distances between subsequences $$X_\tau$$ and $$Y_\tau(\kappa)$$. The second and third terms are the average pairwise distances of points within subsequences $$X_\tau$$ and $$Y_\tau(\kappa)$$, respectively. The intuition behind this divergence measure is to compare "how large" is the distance between the distributions, compared to the distances within each distribution on average. And the coefficient in front of $$\hat{\mathcal{E}}$$ in $$\hat{\mathcal{Q}}$$ is a normalization coefficient that is required for some theoretical results to work. +where $\alpha \in (0, 2)$, usually we take $\alpha=1$; $\|\cdot\|$ is Euclidean distance; and the coefficient in front of the second and third terms in $\hat{ℰ}$ are reciprocals of binomial coefficients. The idea behind each term in $\hat{ℰ}$ is actually quite simple. The first term of $\hat{ℰ}$ is the average of all possible pairwise distances between subsequences $X_\tau$ and $Y_\tau(\kappa)$. The second and third terms are the average of all possible pairwise distances of points within subsequences $X_\tau$ and $Y_\tau(\kappa)$, respectively. The intuition behind this divergence measure is to compare "how large" is the distance between the distributions, compared to the distances within each distribution on average. And the coefficient in front of $\hat{ℰ}$ in $\hat{𝒬}$ is a normalization coefficient that is required for some theoretical results to work. -The most distinct subsequences are given by +The most "dissimilar" subsequences are given by -$$(\hat{\tau}, \hat{\kappa}) = \text{arg}\max\limits_{(\tau, \kappa)}\hat{\mathcal{Q}}(X_\tau,Y_\tau(\kappa);\alpha).$$ +$(\hat{\tau}, \hat{\kappa}) = \text{arg}\max\limits_{(\tau, \kappa)}\hat{𝒬}(X_\tau,Y_\tau(\kappa);\alpha).$ -After the subsequences are found, one needs to find the probability that $$X_{\hat{\tau}}$$ and $$Y_{\hat{\tau}}(\hat{\kappa})$$ come from different distributions. Generally speaking, the time sub-series $$X$$ and $$Y$$ could come from any distribution(s), and the authors proposed the use of a non-parametric permutation test to test for significant difference between them. If the candidates are shown to be significant, the process is to be run using hierarchical segmentation, i.e., recursively. For more details read the linked paper. +After the subsequences are found, one needs to find the probability that $X_{\hat{\tau}}$ and $Y_{\hat{\tau}}(\hat{\kappa})$ come from different distributions. Generally speaking, the time sub-series $X$ and $Y$ could come from any distribution(s), and the authors proposed the use of a non-parametric permutation test to test for significant difference between them. If the candidates are shown to be significant, the process is to be run using hierarchical segmentation, i.e., recursively. For more details read the linked paper. ### Hunter Paper While the original paper was theoretically sound, there were a few practical issues with the methodology. They were outlined clearly in [*Hunter: Using Change Point Detection to Hunt for Performance Regressions by Fleming et al.*](https://arxiv.org/abs/2301.03034). Here is the short outline, with more details in the linked paper: -- High computational cost due to the permutation significance test -- Non-determinism of the results due to the permutation significance test +- High computational cost due to the permutation significance test. +- Non-determinism of the results due to the permutation significance test. - Missing change points in some of the patterns as the time series expands. The authors proposed a few innovations to resolve the issues. Namely, @@ -85,30 +85,29 @@ The authors proposed a few innovations to resolve the issues. Namely, ### Apache Otava Implementation The current implementation in Apache Otava is conceptually the one from the Hunter paper with a newly rewritten implementation of the algorithm. -Starting with a zero-indexed time series $$Z_0, Z_1, \cdots, Z_{T-1}$$, we are interested in computing $$\hat{\mathcal{Q}}(X_\tau,Y_\tau(\kappa);\alpha)$$. Moreover, because we are going to recursively split the time series, the series in the arguments of the function $$\mathcal{Q}$$ do not have to start from the beginning of the series. For simplicity, let us fix $$\alpha=1$$ and define the following function instead: +Starting with a zero-indexed time series $Z = \\{Z_0, Z_1, \cdots, Z_{T-1} \\}$, we are interested in computing $\hat{𝒬}(X_\tau,Y_\tau(\kappa);\alpha)$. Moreover, because we are going to recursively split the time series, the series in the arguments of the function $𝒬$ do not have to start from the beginning of the series. For simplicity, let us fix $\alpha=1$ and define the following function instead: -$$Q(s, \tau, \kappa) = \left.\mathcal{Q}(\{Z_s, Z_{s+1}, \dots, Z_{\tau-1}\}, -\{Z_\tau, Z_{\tau + 1}, \cdots, Z_{\kappa-1}\}; \alpha)\right|_{\alpha=1},$$ +$Q(s, \tau, \kappa) = \left.𝒬(\\{Z_s, Z_{s+1}, \dots, Z_{\tau-1}\\}, \\{Z_\tau, Z_{\tau + 1}, \cdots, Z_{\kappa-1}\\}; \alpha)\right|_{\alpha=1},$ -which is equivalent to comparing the time series slices `Z[s:tau]` and `Z[tau:kappa]` in Python notation. Next, let us define a symmetric distance matrix $$D$$, with $$D_{ij} = \|Z_i - Z_j\|$$ and the following auxiliary functions: +which is equivalent to comparing the time series slices `Z[s:tau]` and `Z[tau:kappa]` in Python notation. Next, let us define a symmetric distance matrix $D$, with $D_{ij} = \|Z_i - Z_j\|$ and the following auxiliary functions: -$$V(s, \tau, \kappa) = \sum\limits_{i=s}^{\tau-1} D_{i\tau},$$ +$V(s, \tau, \kappa) = \sum\limits_{i=s}^{\tau-1} D_{i\tau},$ -$$H(s, \tau, \kappa) = \sum\limits_{j=\tau}^{\kappa-1} D_{\tau j}.$$ +$H(s, \tau, \kappa) = \sum\limits_{j=\tau}^{\kappa-1} D_{\tau j}.$ -Note that $$V(s, \tau, \kappa) = V(s, \tau, \cdot)$$ and $$H(s, \tau, \kappa) = H(\cdot, \tau, \kappa)$$. -Finally, we can use function $$V$$ and $$H$$ to define recurrence equations for $$Q$$. We start by rewriting the function $$Q$$ as a sum of three functions: +Note that $V(s, \tau, \kappa) = V(s, \tau, \cdot)$ and $H(s, \tau, \kappa) = H(\cdot, \tau, \kappa)$. +Finally, we can use function $V$ and $H$ to define recurrence equations for $Q$. We start by rewriting the function $Q$ as a sum of three functions: -$$Q(s, \tau, \kappa) = A(s, \tau, \kappa) - B(s, \tau, \kappa) - C(s, \tau, \kappa),$$ +$Q(s, \tau, \kappa) = A(s, \tau, \kappa) - B(s, \tau, \kappa) - C(s, \tau, \kappa),$ -Here, functions $$A$$, $$B$$, $$C$$ correspond to the average pairwise distances between and within the subsequences. See **[Original Work](#original-work)** section for more details. +Here, functions $A$, $B$, $C$ correspond to the average pairwise distances between and within the subsequences. See **[Original Work](#original-work)** section for more details. -$$A(s, \tau, \kappa) = A(s, \tau - 1, \kappa) - \dfrac{2}{\kappa - s} V(s, \tau - 1, \kappa) + \dfrac{2}{\kappa - s} H(s, \tau - 1, \kappa),$$ +$A(s, \tau, \kappa) = A(s, \tau - 1, \kappa) - \dfrac{2}{\kappa - s} V(s, \tau - 1, \kappa) + \dfrac{2}{\kappa - s} H(s, \tau - 1, \kappa),$ -$$B(s, \tau, \kappa) = \dfrac{2(\kappa - \tau)}{(\kappa - s)(\tau - s - 1)} \left(\dfrac{(\kappa - s)(\tau - s - 2)}{2 (\kappa - \tau + 1)} B(s, \tau - 1, \kappa) + V(s, \tau - 1, \kappa) \right),$$ +$B(s, \tau, \kappa) = \dfrac{2(\kappa - \tau)}{(\kappa - s)(\tau - s - 1)} \left(\dfrac{(\kappa - s)(\tau - s - 2)}{2 (\kappa - \tau + 1)} B(s, \tau - 1, \kappa) + V(s, \tau - 1, \kappa) \right),$ -$$C(s, \tau, \kappa) = \dfrac{2(\tau - s)}{(\kappa - s) (\kappa - \tau - 1)} \left( \dfrac{(\kappa - s)(\kappa - \tau - 2)}{2 (\tau + 1 - s)} C(s, \tau + 1, \kappa) - H(s, \tau, \kappa) \right).$$ +$C(s, \tau, \kappa) = \dfrac{2(\tau - s)}{(\kappa - s) (\kappa - \tau - 1)} \left( \dfrac{(\kappa - s)(\kappa - \tau - 2)}{2 (\tau + 1 - s)} C(s, \tau + 1, \kappa) - H(s, \tau, \kappa) \right).$ -Note that $$A(s, s, \kappa)=0$$, and $$B(s, s, \kappa)=0$$, and $$C(s, \kappa, \kappa)=0$$ because they correspond to empty subsequences. Moreover, $$B(s, s + 1, \kappa) = 0$$ and $$C(s, \kappa - 1, \kappa)=0$$ because each of them corresponds to an average pairwise distance within a subsequence consisting of a single point, i.e., it is the sum with zero terms. Using that, we can compute values for $$A$$, $$B$$, and $$C$$ iteratively. Note that functions $$A$$ and $$B$$ are computed as $$\tau$$ increases, and function $$C$$ is computed as $$\tau$$ decreases. +Note that $A(s, s, \kappa)=0$, and $B(s, s, \kappa)=0$, and $C(s, \kappa, \kappa)=0$ because they correspond to empty subsequences. Moreover, $B(s, s + 1, \kappa) = 0$ and $C(s, \kappa - 1, \kappa)=0$ because each of them corresponds to an average pairwise distance within a subsequence consisting of a single point, i.e., each of them is the sum with zero terms. Using that, we can compute values for $A$, $B$, and $C$ iteratively. Note that functions $A$ and $B$ are computed as $\tau$ increases, and function $C$ is computed as $\tau$ decreases. -These formulas are effectively used in Apache Otava after some NumPy vectorizations. For details see [change_point_divisive/calculator.py](../otava/change_point_divisive/calculator.py). +These formulas are effectively used in Apache Otava after some NumPy vectorizations. For details see [change_point_divisive/calculator.py](https://github.com/apache/otava/tree/master/otava/change_point_divisive/calculator.py).