{ "cells": [ { "cell_type": "markdown", "metadata": { "toc": "true" }, "source": [ "# Table of Contents\n", "
" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "ExecuteTime": { "end_time": "2017-02-08T12:49:25.379657", "start_time": "2017-02-08T12:49:22.585794" }, "collapsed": true }, "outputs": [], "source": [ "import scipy as sp\n", "\n", "import matplotlib.pylab as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# ハノイの塔" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- [GitHub this](https://github.com/Cartman0/TowerOfHanoiProblem)\n", "- [nbviewer this](http://nbviewer.jupyter.org/github/Cartman0/TowerOfHanoiProblem/blob/master/hanoi.ipynb)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 規則" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- 1回に1枚の円盤だけ動かす.\n", "- 移動の途中で円盤の大小を逆に積んではいけない.\n", "常に大きい方の円盤が下になるようにする.\n", "- 棒A,B,C以外のところに円盤を置いてはいけない." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ハノイの塔($n=3$段)の目標\n", "\n", "```\n", " 1 1\n", "22 -> 22\n", "333 333\n", "場所A 場所B 場所C 場所A 場所B 場所C\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ハノイの塔を解く手順" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2段ハノイの塔の場合" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "初期状態\n", "```\n", " 1 \n", "22 \n", "場所A 場所B 場所C \n", "```\n", "\n", "1回目:1段目 A->B\n", "\n", "``` \n", "22 1 \n", "場所A 場所B 場所C \n", "```\n", "\n", "2回目:2段目 A->C\n", "\n", "``` \n", " 1 22 \n", "場所A 場所B 場所C \n", "```\n", "\n", "3回目:1段目 B->C\n", "\n", "``` \n", " 1\n", " 22 \n", "場所A 場所B 場所C \n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3段ハノイの塔の場合" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "初期状態\n", "```\n", " 1 \n", "22 \n", "333\n", "場所A 場所B 場所C \n", "```\n", "\n", "まず,[1-2]段を場所Bに逃がす\n", "\n", "1回目:1段目 A->C\n", "\n", "``` \n", "22\n", "333 1\n", "場所A 場所B 場所C \n", "```\n", "\n", "2回目:2段目 A->B\n", "\n", "``` \n", "333 22 1\n", "場所A 場所B 場所C \n", "```\n", "\n", "3回目:1段目 C -> B\n", "\n", "``` \n", " 1\n", "333 22 \n", "場所A 場所B 場所C \n", "```\n", "\n", "避難完了したので,3段目を場所Cへ\n", "\n", "4回目:1段目 A -> C\n", "\n", "``` \n", " 1\n", " 22 333\n", "場所A 場所B 場所C \n", "```\n", "\n", "2段目を場所$C$へ移動させるため,\n", "[1]段を避難させる\n", "\n", "5回目:1段目 B -> A\n", "\n", "``` \n", " \n", " 1 22 333\n", "場所A 場所B 場所C \n", "```\n", "\n", "避難できたので,2段目を場所Cへ\n", "\n", "\n", "6回目:2段目 B -> C\n", "\n", "``` \n", " 22\n", " 1 333\n", "場所A 場所B 場所C \n", "```\n", "\n", "7回目:1段目 A -> C\n", "\n", "```\n", " 1\n", " 22\n", " 333\n", "場所A 場所B 場所C \n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 4段ハノイの塔の場合" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "初期状態\n", "```\n", " 1 \n", " 22 \n", "333\n", "4444\n", "場所A 場所B 場所C \n", "```\n", "\n", "まず,[1-3]段を場所Bに逃がす.\n", "そのため,3段目を場所Bに置くことを考える.\n", "\n", "1回目:1段目 A->B\n", "\n", "``` \n", " 22\n", "333 \n", "4444 1\n", "場所A 場所B 場所C \n", "```\n", "\n", "2回目:2段目 A->C\n", "\n", "``` \n", "333 \n", "4444 1 22\n", "場所A 場所B 場所C \n", "```\n", "\n", "3回目:1段目 B -> C\n", "\n", "``` \n", "333 1 \n", "4444 22\n", "場所A 場所B 場所C \n", "```\n", "\n", "3段目を場所Bへ\n", "\n", "4回目:3段目 A -> B\n", "\n", "``` \n", " 1 \n", "4444 333 22\n", "場所A 場所B 場所C \n", "```\n", "\n", "避難させていた[1-2]段を場所$C$から場所Bへ\n", "\n", "5回目:1段目 C -> A\n", "\n", "``` \n", " 1 \n", "4444 333 22\n", "場所A 場所B 場所C \n", "```\n", "\n", "6回目:2段目 C -> B\n", "\n", "``` \n", " 1 22 \n", "4444 333 \n", "場所A 場所B 場所C \n", "```\n", "\n", "7回目:1段目 A -> B\n", "\n", "```\n", " 1\n", " 22\n", "4444 333\n", "場所A 場所B 場所C \n", "```\n", "\n", "避難完了したので,4段目を場所Cへ\n", "\n", "8回目:4段目 A -> C\n", "\n", "```\n", " 1\n", " 22\n", " 333 4444\n", "場所A 場所B 場所C \n", "```\n", "\n", "場所Bの3段目を場所Cへ移動させることを考える.\n", "そのため,[1-2]段を場所Aへ避難させる.\n", "\n", "9回目:1段目 B -> C\n", "\n", "```\n", " \n", " 22 1\n", " 333 4444\n", "場所A 場所B 場所C \n", "```\n", "\n", "10回目:2段目 B -> A\n", "\n", "``` \n", " 1\n", " 22 333 4444\n", "場所A 場所B 場所C \n", "```\n", "\n", "11回目:1段目 C -> A\n", "\n", "``` \n", " 1\n", " 22 333 4444\n", "場所A 場所B 場所C \n", "```\n", "\n", "[1-2]段の避難ができたので,\n", "3段目を場所Cへ\n", "\n", "12回目:1段目 B -> C\n", "\n", "``` \n", " 1 333\n", " 22 4444\n", "場所A 場所B 場所C \n", "```\n", "\n", "2段目を場所Cへ動かすことを考える.\n", "\n", "13回目:1段目 A -> B\n", "\n", "``` \n", " 333\n", " 22 1 4444\n", "場所A 場所B 場所C \n", "```\n", "\n", "[1]段の避難ができたので,2団目を場所Cへ移動\n", "\n", "14回目:2段目 A -> C\n", "\n", "``` \n", " 22\n", " 333\n", " 1 4444\n", "場所A 場所B 場所C \n", "```\n", "\n", "移動完了\n", "\n", "15回目:1段目 B -> C\n", "\n", "``` \n", " 1\n", " 22\n", " 333\n", " 4444\n", "場所A 場所B 場所C \n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## n段ハノイの塔を解く手順" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 考え方" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "n段ハノイの塔を徳手順を考える.\n", "\n", "`Hanoi(k, s, p, g)`:\n", "k段の円盤を場所 $s$ から 場所 $g$ へ\n", "途中,場所pを介しながら円盤を移動する手順とする.\n", "\n", "- `Hanoi(1, s, p, g)` のとき:\n", "1段の円盤を場所 $s$ から,場所 $g$ へ移動する手順となる.場所pを介する必要がないので,1回の操作で解決できる.\n", "\n", "- 一般の`Hanoi(k, s, p, g)` のとき:\n", " 1. $k-1$段の円盤を場所 `s` から場所 `p` へ一旦移動(逃がし),\n", " \n", " ```\n", " 1\n", " 333 22 \n", " 場所s 場所p 場所g\n", " ```\n", " \n", " 2. $k$段目を s -> g へ(1回)移動し,\n", " \n", " ```\n", " 1\n", " 22 333\n", " 場所s 場所p 場所g\n", " ```\n", " \n", " 3. 一旦逃がした$k-1$段を場所`p`から場所`g`へ移動させる.\n", " \n", " ``` \n", " 1 \n", " 22\n", " 333\n", " 場所s 場所p 場所g\n", " ```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- $k = 1$ の場合は,1回と決まっている.\n", "- $k$段の解は,$k-1$段の解がわかれば構成できる.\n", "\n", "こういう場合,再帰呼び出しが得意な場合になる." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### フローチャート" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### コード" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ExecuteTime": { "end_time": "2017-02-08T12:49:28.119487", "start_time": "2017-02-08T12:49:28.112481" }, "collapsed": true }, "outputs": [], "source": [ "def hanoi(n:int, start:str, partition:str, goal:str):\n", " '''\n", " n段をstart->goalへ移動.\n", " partitionは途中の移動に使用\n", " '''\n", " if n >= 1:\n", " # 上に乗っているn-1段を一旦移動\n", " hanoi(n-1, start, goal, partition)\n", " print(\"{} 段目を {} -> {} \".format(n, start, goal))\n", " # 一旦移動したn-1段をgoalへ\n", " hanoi(n-1, partition, start, goal)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ExecuteTime": { "end_time": "2017-02-08T12:49:28.133496", "start_time": "2017-02-08T12:49:28.124490" }, "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 段目を A -> C \n", "2 段目を A -> B \n", "1 段目を C -> B \n", "3 段目を A -> C \n", "1 段目を B -> A \n", "2 段目を B -> C \n", "1 段目を A -> C \n" ] } ], "source": [ "hanoi(3, \"A\", \"B\", \"C\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 関数呼び出しを追う" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### n=2の場合" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```\n", "Hanoi(2, f, w, d)\n", "{\n", " Hanoi(1, f, d, w)\n", " {\n", " print(1: f -> w)\n", " }\n", " print(2: f -> d)\n", " Hanoi(1, w, f, d)\n", " {\n", " print(1: w -> d)\n", " }\n", "}\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### n=3の場合" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```\n", "Hanoi(3, f, w, d)\n", "{\n", " Hanoi(2, f, d, w)\n", " {\n", " Hanoi(1, f, w, d)\n", " {\n", " print(1: f -> d)\n", " }\n", " print(2: f -> w)\n", " Hanoi(1, d, f, w)\n", " {\n", " print(1: d -> w)\n", " }\n", " }\n", " \n", " print(3: f -> d)\n", " \n", " Hanoi(2, w, f, d)\n", " {\n", " Hanoi(1, w, d, f)\n", " {\n", " print(1: w -> f)\n", " }\n", " print(2: w -> d)\n", " Hanoi(1, f, w, d)\n", " {\n", " print(1: f -> d)\n", " }\n", " }\n", "}\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### ハノイの塔の証明" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```\n", "01 def hanoi(n:int, start:str, partition:str, goal:str): \n", "02 if n >= 1:\n", "03 hanoi(n-1, start, goal, partition) # 上に乗っているn-1段を一旦移動\n", "04 print(\"{} 段目を {} -> {} \".format(n, start, goal))\n", "05 hanoi(n-1, partition, start, goal) \n", "```\n", "\n", "ここでHanoi(n,start, partition, goal) という操作の意味を正確にしておく。\n", "\n", "- この操作は $1-n$ まで順に積まれた $n$ 個の円盤を `start` から `goal` へ移動する操作。\n", "- 操作開始時,`start` には $1 - n$ まで順に積まれた $n$ 個の円盤がある。\n", "- 操作終了後,`goal` には$1 - n$まで順に円盤が積まれたものになる。\n", "- その際,`partition` を補助的に使っても良い。\n", "- さらに,この操作はゲームの規則(1),(2),(3) を満たす。\n", "- またn+1 以上の円盤があっても,この操作はそれに関係なく行われる。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "証明は数学的帰納法を使う。\n", "\n", "1. $n=0$ の場合:\n", "2行の条件を満たさないから,`Hanoi(n, s, p, g)` は何もしない。\n", "\n", "2. $n=1$ の場合:\n", "$n=1$ の場合,$3-5$行が実行されるが,\n", "3,5行は `Hanoi(0,s, g, p)`,`Hanoi(0, p, s, g)` で何も実行しません。つまり,この場合は,4行だけ実行されます。従って,1番の円盤を `start` から `goal` へ移動と言う操作で,この場合正しい操作になっています。\n", "\n", "3. $n-1$の場合: Hanoi が正しい操作を行っていると仮定します。\n", "このとき $n$の場合正しい操作になることを示す。\n", " 1. まず,開始時 `start` には $1 - n$ まで順に積まれた$n$個の円盤がある。\n", " 2. 03行目で,`Hanoi(n-1, s, g, p)`:このとき,`start` には $1 - n$ までの円盤があるから,この操作は可能。\n", " ここで Hanoi は `n-1` の時は正しい操作をすると言う仮定から,3行の結果,$1 - n-1$ までの円盤が規則(1),(2),(3) を満たしながら `p` へ移動する。\n", " この過程で $1 - n-1$ 以外の円盤の上に乗ることもありますが,あったとしても,\n", " それは $n$ 以上の大きいものの上です。 従って規則(2)を満たす。\n", " 3. 次に,04行目で $n$番目の円盤を `s` から `g` へ移動する。今 $1 - n-1$までの円盤は `p` にあるから,`goal` に円盤があるとしてもそれは$n + 1$番以上の円盤です。従って,$n$の円盤を `g` に移動しても規則(2)を満たす。\n", "\n", "4. 最後に,5行目で `Hanoi(n-1, p, start, goal)`: これは先ほど移動した,$1 - n-1$ の円盤を `p`から `goal` に移動するもの。 \n", " これもHanoi は $n-1$ の時は正しい操作をすると言う仮定から,正しく動作し,規則(2)を満たす。\n", "\n", "\n", "以上から,nの場合も正しい操作になる。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 移動回数" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ExecuteTime": { "end_time": "2017-02-08T12:49:31.021423", "start_time": "2017-02-08T12:49:30.998408" }, "collapsed": false }, "outputs": [], "source": [ "def hanoi(n:int, start:str, partition:str, goal:str):\n", " move_n = 0\n", " def hanoi_rec(n:int, start:str, partition:str, goal:str):\n", " '''\n", " n段をA->Bへ移動.\n", " Cは途中の移動に使用\n", " '''\n", " if n >= 1:\n", " # nonlocal でローカル変数でないことを宣言\n", " # https://docs.python.jp/3/faq/programming.html\n", " nonlocal move_n \n", " \n", " # 上に乗っているn-1段を一旦移動\n", " hanoi_rec(n-1, start, goal, partition)\n", " print(\"{} 段目を {} -> {}\".format(n, start, goal))\n", " # 一旦移動したn-1段をgoalへ\n", " hanoi_rec(n-1, partition, start, goal)\n", " move_n = move_n + 1 \n", " \n", " hanoi_rec(n, start, partition, goal)\n", " print(\"move_n: \", move_n)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ExecuteTime": { "end_time": "2017-02-08T12:49:31.075459", "start_time": "2017-02-08T12:49:31.024424" }, "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 段目を A -> C\n", "2 段目を A -> B\n", "1 段目を C -> B\n", "3 段目を A -> C\n", "1 段目を B -> A\n", "2 段目を B -> C\n", "1 段目を A -> C\n", "move_n: 7\n" ] } ], "source": [ "hanoi(3, \"A\", \"B\", \"C\")" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "ExecuteTime": { "end_time": "2017-02-08T12:49:31.089469", "start_time": "2017-02-08T12:49:31.078462" }, "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 段目を A -> C\n", "2 段目を A -> B\n", "1 段目を C -> B\n", "3 段目を A -> C\n", "1 段目を B -> A\n", "2 段目を B -> C\n", "1 段目を A -> C\n", "4 段目を A -> B\n", "1 段目を C -> B\n", "2 段目を C -> A\n", "1 段目を B -> A\n", "3 段目を C -> B\n", "1 段目を A -> C\n", "2 段目を A -> B\n", "1 段目を C -> B\n", "5 段目を A -> C\n", "1 段目を B -> A\n", "2 段目を B -> C\n", "1 段目を A -> C\n", "3 段目を B -> A\n", "1 段目を C -> B\n", "2 段目を C -> A\n", "1 段目を B -> A\n", "4 段目を B -> C\n", "1 段目を A -> C\n", "2 段目を A -> B\n", "1 段目を C -> B\n", "3 段目を A -> C\n", "1 段目を B -> A\n", "2 段目を B -> C\n", "1 段目を A -> C\n", "move_n: 31\n" ] } ], "source": [ "hanoi(5, \"A\", \"B\", \"C\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 移動回数の計算" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "参考:\n", "http://www2.cc.niigata-u.ac.jp/~takeuchi/tbasic/BackGround/Hanoi.html\n", "\n", "ハノイの塔の解法プログラム Hanoi での移動の回数を計算。\n", "移動の回数を $H(n)$ と表す。\n", "\n", "`Hanoi(n,A$,B$,C$)`は\n", "3,4,5行で移動を出力しますが,\n", "- 3行は $H(n-1)$ 回の移動,\n", "- 4行は 1回の移動,つまり,$H(1)$ \n", "- 5行は $H(n-1)$回の移動を出力します。\n", "\n", "従って,\n", "$H(1)=1, n >1$ のとき,\n", "\n", "$$\n", "H(n)=H(n-1)+1+H(n-1) \n", "$$\n", "\n", "となる。\n", "\n", "この漸化式は,\n", "$H(1)=1, n>1, H(0)=0$ のとき,\n", "\n", "$$\n", "H(n) = 2 \\cdot H(n-1) + 1 \\\\\n", "H(n) + 1 = 2 \\cdot H(n-1) + 2 \\\\\n", "H(n)+1 = 2 \\cdot (H(n-1)+1) \n", "$$\n", "\n", "$$\n", "\\{H(1)+1 = 2, 2(H(1)+1), 2^2 (H(1)+1), \\cdots \\}\n", "$$\n", "\n", "から初項$H(1)+1 = 2$, 公比$r=2$ の等比数列より,\n", "\n", "$$\n", "H(n)+1 = (H(1)+1) \\cdot 2^{n-1} \\\\\n", "= 2^n\\\\\n", "$$\n", "\n", "よって,\n", "\n", "$$\n", "H(n)=2^n - 1\n", "$$\n", "\n", "となる. \n", "\n", "メルセンヌ素数 https://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%AB%E3%82%BB%E3%83%B3%E3%83%8C%E6%95%B0 と一致する." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "ExecuteTime": { "end_time": "2017-02-08T12:49:31.757914", "start_time": "2017-02-08T12:49:31.752910" }, "collapsed": true }, "outputs": [], "source": [ "def H(n):\n", " n_int64 = sp.array(n, dtype=sp.int64)\n", " return sp.power(2, n_int64) - 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "この数値はかなり大きい。\n", "\n", "例えば,\n", "\n", "- $H(10)=1023$\n", "- $H(40)=1099511627775$\n", "\n", "となる。\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "ExecuteTime": { "end_time": "2017-02-08T12:49:32.105146", "start_time": "2017-02-08T12:49:32.078128" }, "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "(1023, 1099511627775)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "H(10), H(40) " ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "ExecuteTime": { "end_time": "2017-02-08T12:49:33.827295", "start_time": "2017-02-08T12:49:32.108148" }, "collapsed": false }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAY4AAAERCAYAAABsNEDqAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xuc3dO9//HXRxRVVUeqzqlL3IpfIoQSitYQjgRtEJeE\nNOhRhIpLqeBo1K2CMhKkUpFQPe4tcUlRMqmQSJCRmyRaEUKkaCiiEZnP74+1t2xjLnvv+e79/a6Z\n9/PxmIes72R/9zsLs7LX+q71MXdHRESkWGukHUBEROKigUNEREqigUNEREqigUNEREqigUNEREqi\ngUNEREqigUNEREqigUNEREqSuYHDzLY0s1vM7J5ce3szG2Vm95jZKWnnExHp6CyrO8fN7B53P6qg\nbcBt7j4oxVgiIh1exT9xmNkYM1tqZjMbXe9tZvPMbIGZndfKPX4IPAw8WsmsIiLSumpMVY0FDiy8\nYGZrADfkrncDBpjZ9o1eZ/lfuPtD7n4wMLDCWUVEpBVrVvoN3H2ymXVpdLkn8Iq7LwIws7uAvsA8\nM9sQuBzokfskMhU4HFgbeKTSeUVEpGUVHziasQnwRkF7MWEwwd3/CQxu9PsntXZDM8vmYo2ISMa5\nu7X+u1bL3FNVbeHumf8aNmxY6hnaS84YMiqncmb9qxxpDRxvApsXtDfNXWv3XnvttbQjFCWGnDFk\nBOVMmnKmr1oDh1Gw2A1MB7Yxsy5mthbQHxhfpSwiItIG1Xgc9/+AZ4Ftzex1MzvB3VcBpwOPA3OA\nu9z95UpnyYLjjz8+7QhFiSFnDBlBOZOmnOnL7AbAUpmZt5c/i4hItZgZ3pEXx2NQV1eXdoSixJAz\nhoygnElTzvRp4BARkZJoqkpEpAPTVJWIiFScBo4qi2XeM4acMWQE5UyacqZPA4eIiJQkk2scZrYl\ncCGwvrsfZWZ9gYOBrwO3uvsTTbxGaxwiIiUqZ40jkwNHXhPFnDYArnb3nzbxezVwiIiUKLOL40kU\nc8r5X+DGyqSsjljmPWPIGUNGUM6kKWf6qrXG0eZiTmZ2JfCou9dXOKuISLvX0ADjxpX32qpNVeWK\nOT3k7jvm2nsAw9y9T649FHB3H15QzGl/4BZgOTCIcDhivbuPbuL+mqoSESnC7NlwyimwciVMm1b6\nVFVahZyg9GJOI1u7YY8ePejRowdbbLEFG2ywAT169KCmpgZY/bFRbbXVVrujtnfbrYYTT6zjj38c\nx9Zbv81GG/2bslSxWEgXYGZBux8wuqA9EBjRhvt7DCZOnJh2hKLEkDOGjO7KmTTlLM/48e5durgf\ne6z7kiWrr+d+dpb08zbNTxwdtpiTiEi1vPEGnHFGmJ4aMwZ69Wr7Pau5xrEFYY2je67dCZgP9AKW\nANOAAV5mXQ6tcYiIrPbZZzBiBFxxBQwZAr/4Bayzzpd/XzmP41blE0eumFMN0NnMXicsio81s3wx\npzWAMeUOGiIistrUqWHxe6ONYMoU+M53kr1/VR7Hdfdj3P3b7r62u2/u7mNz1ye4+3bu/h13v7Ia\nWdKWX6TKuhhyxpARlDNpytm8ZcvCgHH44TB0KDz+ePKDBuisKhGR6LnDHXdA167QqRPMnQv9+4OV\nNAFVvEwfOVIKrXGISEc0fz4MHgzvvw+//S307Fna6zN75IiIiCTrk0/gl7+EvfaCvn1h2rTSB41y\naeCoMs3PJieGjKCcSVNOeOwx6N49TEm99FJ43HbNKm6uSHMfh4iIlGDJEjjrrPDp4oYb4KCD0smh\nNQ4RkYxbtQpGjYJf/QpOOgkuvBDWXTeZe2d2H0cpmiji9IV2uulERKrrhRfg5JPha1+DSZPCk1Np\ny9wah7svdPcTm2vHTvOzyYkhIyhn0jpKzg8+CDu+Dz4YTj8d6uqyMWhAFQaOBIs4iYi0e+5w773Q\nrRssXw5z5sBxx1VuT0Y5Kr7GYWZ7Ax8Bt/vqWhxrAAsI51S9Raiz0d/d5xW87l53P7K5dhPvozUO\nEYna3/8OP/sZLF4c9mTstVfl3zOT+zjcfTKwrNHlnsAr7r7I3VcCdwF9AcxsQzMbBfQws/Matyud\nV0Sk2lasgMsvh913h333hRdfrM6gUa60FsdLLeLUuN2kGAo55a9lJU9z7dra2kz2X2G7vr6eM888\nMzN5mms3/nefdp7m2urPdPqzrg4GDapjk03g+edr2GKLyvffuHHjePvtt/n3vzNcyIkKF3FyFXJK\nXAw5Y8jorpxJay85ly51HzTIfbPN3P/0J/eGhurkaowyCjlVZR9HM/XGL3b33rn25/XG2/AeXo0/\ni4hIWzQ0wK23wgUXwKBBcPHFsN566eXJ8j4Oy33lTQe2yQ0oS4D+wIAqZRERScXMmeHYc3d44gnY\naae0E5WnGo/j/h/wLLCtmb1uZie4+yogX8RpDnCXd5AiToXzs1kWQ84YMoJyJi3GnB9/DOeeC/vv\nD8cfD888E++gAVX4xOHuxzRzfQIwodLvLyKSpvHjwwa+ffaBWbNg443TTtR2OqtKRKQCXn897Px+\n+eVwztR++6WdqGmZ3MchItKRrFwJ11wDu+wC3/1uWNfI6qBRLg0cVRbj/GxWxZARlDNpWc757LNh\nsHj8caitreOii2DttdNOlTwNHCIibfTPf4bjzo88Mhx5/thjsOmmaaeqHK1xiIiUyR3uuCM8MXXE\nEXDZZbDBBmmnKk2W93GIiLQr8+bB4MHh+POHHoLddks7UfVkbqrKzLY0s1vM7J5ce10zG2dmN5tZ\nk4/2xiTL87OFYsgZQ0ZQzqSlnfOTT+Cii2DvveGww0IZ16YGjbRzVlLmBg7/cuGmw4F73f1k4Ecp\nxRIR4bHHYIcdwqeNl14Kj9uu2QHnbapRj2MMcAiwNH9WVe56b6CWMHiNaXxOlZnd46F07FDgUXef\naWZ/cPdjm3kfrXGISEW89RacdRZMnw433gh9+qSdKDlZ3ccxFjiw8EKukNMNuevdgAFmtn2j1+X/\nIIuBTRtdExGpuFWrYORI2HFH2GYbmD27fQ0a5cp8ISfgfuAIM7sReKjSeSstlnnPGHLGkBGUM2nV\nyvn886Gw0n33wV//Ggotrbtu8a+PpT/LEUshp58Uc9NYCjllKU9z7fr6+kzlaapdX1+fqTyxt9Wf\nof3BB3D88XVMmgTXXVfDoEEwaVId//hH++jPugQKOaVVj6MfcKC7n5RrDwR6uvuQNryH1jhEpGzu\ncM89cPbZYTpq+HDo3DntVJUX0z6ON4HNC9qb5q6JiFTd3/8Op50Gb74ZBo8s1/vOgmo9jttsIScz\nW4tQyGl8lbKkKv+RMetiyBlDRlDOpCWZc8WKsNt7992hVy948cXkBo1Y+rMcFf/EkSvkVAN0NrPX\ngWHuPtbM8oWc8o/jdohCTiKSDRMnhp3f224LL7wAXbqknSgeOqtKRDqUf/wjnC1VVwcjRkDfvmkn\nSldW93GIiKSuoQFGjw47vzfaCObM0aBRLg0cVRbLvGcMOWPICMqZtHJyzpwZzpYaNw7+8pdQaGm9\n9RKP9gWx9Gc5NHCISLv10UdhWmr//eH442Hy5LALXNpGaxwi0i49+GA4hHCffcInjG99K+1E2RTT\nPg4RkYpYtCgMGPPnh6mpffdNO1H7o6mqKotl3jOGnDFkBOVMWnM5V66Eq68ONb932y0ce57moBFL\nf5Yjik8cZvb/gIuBd4Gn3P3+dBOJSJY88wyccgp8+9swdWo4yVYqJ4o1DjM7G3jO3Z8xswfd/UsP\n0WmNQ6Tjee89GDoUHn0UrrsOjjwSTMUXShLNPg4zG2NmS81sZqPrvc1snpktyB2pnvd7oL+ZXQVs\nWNWwIpI57nDbbdCtG3z1qzB3Lhx1lAaNaklrjaOk4k7u/o67nw4MJUxXRSuWec8YcsaQEZQzabfd\nVse++4YCSw8/HHZ/f+Mbaaf6slj6sxypDBxlFHfqYmY3A7cBV1c1rIhkwvLlcOGF4YmpI46A556D\nXXdNO1XHlKXF8ZaKOy0CTm7tBjEUcoqlnb+WlTzNtQuzZiFPU+188Zys5GmpnZeVPPn28OF11NbC\nD35Qw8sv17BgQR1PP52dfDH1Z10shZyafOOEiztpcVyk/XnzTTjzTJgxA268EQ48sPXXSGmiWRxv\nRoco7tT4byJZFUPOGDKCcpbjs8/C2sVOO8H228OsWasHjSzlbEksOcuR5lRVs8WdgCWE4k4D0ggm\nIumZPj3syVh//XC21Pbbp51IGktlqqqwuBOwlNXFnfoAtawu7nRlCffUVJVIxD74ICx+338/XHUV\nDByox2uroZypqig2ABZDA4dInNzh7rvh7LPhkEPgyithQ+3WqprY1zg6hFjmPWPIGUNGUM6W/O1v\nYe3iiivgvvtCoaXWBg31Z/o0cIhI1a1YAZdcAnvsEQaOF16APfdMO5UUS1NVIlJVTz0FgwdD165w\n/fWw+eatv0YqR/U4RCSzli6Fc86Bp58Oj9r+6EdpJ5JyaaqqymKZ94whZwwZQTkbGuDmm6F7d/iv\n/4I5c9o2aHT0/swCfeIQkYp56aWwJ2ONNeDJJ8PgIfGLYo3DzDYDRgDvEQ5CHN7E79Eah0hGfPQR\nDBsGv/99eGLqJz8Jg4dkT3t+HLc7cK+7nwj0SDuMiDTNHR54ICx8v/demJY68UQNGu1NLIWcpgIn\nmtlfgD9XNWzCYpn3jCFnDBmh4+RctAj69oXzz4fbb4dx42CjjRKJ9gUdpT+zLIpCTsAJwC/dfX/g\nkGoGFZGWrVwZjgj57ndh993DukbB6fzSDmXpWPU9CGdW9cm1hwLu7sPNrBtwMaH634fu/osm7qc1\nDpEqmzw57MnYdNNw7PlWW6WdSEoV+z6Olgo5zQGObO0GKuSkttrVaT/4YB2jR8NLL9VQWwudO9fx\n+uuw1VbZyKd28+26BAo54e5FfQH/AewI7JL/Kva1zdyvCzCzoN0PGF3QHgiMKOF+HoOJEyemHaEo\nMeSMIaN7+8rZ0OA+dqz7xhu7Dxni/sEHFY/1Je2pP7Mg97OzpJ/fRX3iMLNLgeOBvwP5+SAH9itv\nuGpShyjkJBKruXPDtNTy5fDoo7DLLmknkrQUtcZhZvOB7u7+aWJvbLYFYY2je67dCZgP9CIUcpoG\nDHD3l4u8nxfzZxGR0ixfDpddBr/7HVx8cdjQ16lT2qkkKZXcxzEb2KD0SE3LFXJ6FtjWzF43sxPc\nfRVwOvA4MAe4q9hBQ0Qq49FHYYcdYOFCmDkTTjtNg4YUP3D8GphhZo+Z2fj8V7lv6u7HuPu33X1t\nd9/c3cfmrk9w9+3c/TteQvW/mOQXqbIuhpwxZIQ4c775Jhx5JAwZAr/9Ldx5ZzhnKgti7M/2ptin\nqm4DhgOzgIbKxRGRNH32WXis9tJL4dRTw0a+r3417VSSNcWucUx3992qkKdsWuMQaZtp08L6xQYb\nwE03wfbbt/4aiV/Fao6b2bXACmB87p8AuPuLpYasFA0cIuV5/3248EL44x/h6qvh2GPBSvoxIjGr\n5OL4zsAewBXAb3Jf15QWTyCeec8YcsaQEbKb0z2sXXTtCqtWwc031zFwYPYHjaz2Z2Ox5CxHUWsc\n7r5vpYOISPW88kp4QmrpUrj/fvje96Ad/5yThBU7VfXLpq67+yWJJyqTpqpEWrdiBQwfHkq3XnBB\neGpqzSwdPCRVV8mzqj4u+PU6hBNqtcdCJCJPPhmelOrWDWbMgM02SzuRxKqoNQ53/03B1+VADVC1\nczDNbG8zG2VmvzOzydV630qIZd4zhpwxZIT0cy5dCgMHwv/8D1xzTVgEb2rQSDtnsZQzfeXW41iX\ncJZUVbj7ZHcfDDxM2FMiIq1oaAib97p3h002CdX4fvjDtFNJe1DsGscsVh9u2AnYCLjE3W8o603N\nxhCmu5Z6rh5H7npvoJYwoI3xRrXFzexu4CfuXjh1lv+e1jhEcurrw56MNdeEUaPC4CHSlEqucRRW\n3fuM8AP/s1LeqJGxwEjg9vyFggqAvYC3gOlm9qC7z8t9fzPg/aYGDREJPvwQhg2DP/wBrrgCTjhB\n9b4lecWucSwiFFZaSfjE8W0z27zlV7V4v8nAskaXewKvuPsid18J3AX0Lfj+/xAGnKjFMu8ZQ84Y\nMkJ1crqHtYuuXWHZMpg9O6xplDJoqD+TFUvOchRbj+N0YBiwlNVnVTmhsFNSmq0ACODuF7d2gxgq\nAOZlJU9z7fr6+kzlaapdX1+fqTxptRcuhGOOqeOtt+COO2rYZx/1ZxbaWe3PugQqABa7xvE3YHd3\nf6+sd2n6no1rjvcDDnT3k3LtgUBPdx9S5P20xiEdyqefwrXXhmNCfv5zOOccWGuttFNJbCq5xvEG\n8EHpkUqiCoAiRXr66bD43aULTJ8OW1Xt4XiR4h/HfRWoM7Pzzezs/Fcb39tyX3nTgW3MrIuZrQX0\nJxyq2K7kPzJmXQw5Y8gIyeZ89134yU9gwAC45BJ45JHkBo2O2J+VFEvOchQ7cLwOPAGsBXy94Kss\nqgAoUpqGBhg7Nuz6Xn/9UP+7X7/sH0go7VNRaxyt3sRspLufnkCetmTQGoe0S3PmwODB8O9/hw19\nu+ySdiJpTyp5rHpr9kroPiKSs3w5nH8+1NTA0UfDlCkaNCQbtDWoymKZ94whZwwZobycjzwSpqUW\nLYJZs8IR6J06JZ+tUHvuzzTEkrMcOlBZJEMWL4YzzoCZM2H0aDjggLQTiXxZUmscM9x95wTytCWD\n1jgkWp99BiNHwuWXw89+BkOHwjrrpJ1KOoJK7uPIv8G67r68iW9dX8p9RGS1556Dk0+Gb34Tnn0W\ntt027UQiLStqjcPM9jSzuUD+wMGdzOym/PfdfVxl4rU/scx7xpAzhozQfM5ly8LTUoceCr/4BTzx\nRLqDRuz9mTWx5CxHsYvj1wEHAu8BuPtLwA8qFaoxCy4zsxFm9uNqva9IJbiH02u7dg3tuXPhmGO0\nJ0PiUexZVc+5++6Faxlm9pK771TxhOG9DgUOBd4FHnH3iU38Hq1xSObNnx/Kt773XtiTscceaSeS\njq6S+zjeMLM9ATezr5jZObSh5riZjTGzpWY2s9H13mY2z8wWmNl5Bd/aDnjG3c8BTi33fUXS8u9/\nhzoZe+0FhxwCzz+vQUPiVezAcQpwGuHo8zeBHrl2ucYSpr4+V1DI6UCgGzDAzLbPfXsxq+t3rGrD\n+6YulnnPGHLGkBHgmmvq6N491MiYMQPOOitU5suaWPpTOdNX7H++5u7HJvWm7j45d6x6oc8LOQGY\nWb6Q0zzgj8BIM/s+MCmpHCKV9PbbcPbZ8NRTcMst4ZOGSHtQ7MDxjJm9BtwN3O/u71cgS7OFnNz9\nE+DE1m4QQyGnWNr5a1nJ01y7MGsW8tTU1LBqFfz853WMHQunnlrD3/9ew/TpddTVZSNfS+28rORp\nqp0vRpSVPC2187KSJ993VSnkBGBmPQlHnR8KzCWcXntHWe+KCjlJ+/Tii6FOxtprh8Xvbt3STiTS\nsooecuju09z9bMKngH8Ct5WYrzUdopBT47+JZFUMObOU8cMPw9pFnz5hb8akSasHjSzlbIlyJiuW\nnOUodgPg+mZ2nJlNINTRWEJBPfAydchCTtK+uMP994c9Gf/6VzgC/YQTYA0dHyrtWLH7OBYCDwD3\nuPuUNr9pKORUA3QGlgLD3H2smfUBagkD2hh3v7KEe2qqSqpq4cJwrtRrr4Vpqe9/P+1EIqUrZ6qq\n2IHD3N3NbD0Ad/+ozIwVo4FDquXTT+E3vwlf55wTnpxaa620U4mUp5JrHN3MbAahpOtcM3vBzHYo\nOaFEM+8ZQ840Mv71r9CjB0yeDNOnh1NsWxs0YuhLUM6kxZKzHMU+jjsaODt/1IeZ1eSu7VmhXCKZ\n8u67qw8ivP56OOwwnS0lHVexU1VfOpeqmmdVFUNTVVIJDQ0wblwo4XrssfCrX8HXv552KpHkVLIe\nx6tmdhHw+1x7IPBqKW8kEpvZs8OjtZ9+Cn/+M+ycaqkykewodo3jJ8BGwP25r28CJ1QqVHsWy7xn\nDDkrlfHjj8PaxX77hePOn322bYNGDH0Jypm0WHKWo9iBY2tgs9zvXwvoBfy1UqFE0vLww7DDDqH2\n96xZ4RNHp05ppxLJlmLXOOYD5wCzgYb89fyBhJVmZvsAlxKe6rrT3b80aGmNQ9rijTfgjDPC9NSo\nUdCrV9qJRKqjko/jvuPuD7n7QndflP8qI2O5HPgQWJtw+KFIIj77DK69NkxF7bQTzJypQUOkNcUO\nHMPM7BYzG2Bmh+e/yn3TUgs5uftf3f1gYChwSbnvmwWxzHvGkLOtGadOhV13hQkTYMqUUGhpnXWS\nyVYohr4E5UxaLDnLUexTVScA2wNfYfVUlRPqZJRjLDASuD1/oaCQUy/gLWC6mT3o7vMKXvc+YY1F\npGzLloXHa8ePh2uugQEDtCdDpBRFr3G4+3aJvvGXj1Xfg3BmVZ9ceyjg7j7czA4jVAb8BjBKaxxS\nDnf4wx/g3HPh8MPh8sthgw3STiWSrkru43jWzLq6+9wychWrpUJOfwL+1NoNVMhJ7ebat99eR20t\nuNfwwAPwySd11NdnJ5/aalerXZdAISfcvdUv4GXgU2A+MBOYBcws5rUt3LNL4T2AfsDogvZAYEQJ\n9/MYTJw4Me0IRYkhZzEZP/nE/Ze/dO/c2f2669xXrqx8rsZi6Et35UxaLDlzPztL+vld7CeO3uUN\nSyXpEIWcpHqeeCLsw+jRA+rrYdNN004k0j4UXTo28Tc224KwxtE91+5E+ETTi1AoahowwN1fLvJ+\nntafRbJlyZJw1PnUqXDDDXDwwWknEsmuipaOTVKukNOzwLZm9rqZneDuq4DTgccJG/3uKnbQEAFY\ntQpuvBF23BG23DJU49OgIZK8VAYOdz/G3b/t7mu7++buPjZ3fYK7b+fu3/ESqv/FJL9IlXUx5CzM\n+OKLsMcecPfdUFcHV1wB666bWrQviKEvQTmTFkvOcqgyskTtX/8KR4X06QOnnQaTJkG3bmmnEmnf\nUlvjSJrWODoWd7jvPjjrLOjdG4YPh86d004lEp9K7uMQyYxXXw2fLl5/He68E77//bQTiXQsmqqq\nsljmPbOYc8WKsNu7Z0+oqYHa2rooBo0s9mVTlDNZseQshwYOicKkSWE/xtSp8PzzcN558JWvpJ1K\npGPSGodk2jvvhLOlnnwSRoyAQw/VgYQiSYpmH0c5zGxdM5tuZgelnUUqr6EBbrklPCHVuTPMnQuH\nHaZBQyQLohk4gPOAu9MO0VaxzHummXPWLPjBD8LA8fjj8JvfwNe//uXfp75MlnImK5ac5Uhr53hJ\nhZzMbH9gLvAOoL9ztlMffxzWLnr1gh//GJ59NqxriEi2pLLGYWZ7Ax8Bt/vqehxrAAsoKOQE9Hf3\neWZ2GbAu0A1Y7u6HNXFPrXFE7KGH4PTTYe+9wyeMjTdOO5FIxxDNPg53n5wr5FSoJ/CK52qZm9ld\nQF9gnrv/b+7aIODdqoaVinrjDRgyJKxhjBmjet8iMcjSBsBmCznlufvttCCGQk75a1nJ01y7tra2\nov33l7/Ucf/9cO+9NQwZAoMH19GpE0Dx96uvr+fMM89MpX9KLZyTl4U8zbXVnx2jP+uqVcipEl+o\nkFOmVTLnlCnuO+7ofsAB7gsWlH8f9WWylDNZseSkjEJOadbjaKrm+MXu3jvX/rzmeJH387T+LFKc\nZcvg/PNh/Hi49lo4+mg9XiuSttj2cRhffEJqOrCNmXUxs7WA/sD4VJJJotzhjjuga1dYc82wntG/\nvwYNkVipkFOVFc7PZllSOefPDwve114bPmnccANssEEit+5wfVlpypmsWHKWI62nqo5p5voEYEKV\n40gFfPIJ/PrXcNNNcNFF4TTbNbP0KIaIlE1nVUniHnssDBQ77wy1tbDJJmknEpHmRLOPQ9qnJUtC\nYaVp08KU1EE6VUykXYrprKp2IZZ5z1JyrloVBoodd4Stt4bZs6szaLTHvkyTciYrlpzl0CcOaZMX\nXoCTT4avfS3UzOjaNe1EIlJpWuOQsnzwQVj0vueeUO970CA9XisSo9j2cUiE3OHee0OdjOXLYc4c\nOO44DRoiHUkUA4eZbW9mo8zsHjM7Je08bRHLvGdTOV99Naxd/OpXcNddoV5G587Vz5YXc19mkXIm\nK5ac5Yhi4HD3ee4+GDga2DPtPB3Np5/CFVdAz56w774wY0Y4/lxEOqa06nGMAQ4BlubPqspd7w3U\nEga0MYXnVJnZD4FTgN+7+11N3FNrHBUwaRIMHhyelho5ErbYIu1EIpKkctY4oijk1Oi1D7v7IU3c\nUwNHgt55B849F556CkaMgL59tY4h0h5Fszju7pOBZY0uf17Iyd1XAvlCTpjZPmZ2vZn9FnikummT\nlfV5z4aGUFBp223r6Nw5HEh46KHZHDSy3pd5ypks5UxflvZxNFvIyd0nAZNau0EshZyylKewvXAh\n3HprDStXwokn1nPwwbDeetnJ17hdX1+fqTyxt9WfHaM/6xIo5JSlehz9gAPd/aRceyDQ092HFHk/\nTVWV6eOP4dJL4dZb4ZJL4KSTYI0oHpsQkbaKZqqqGW8Cmxe0N81dkwp65BHYYQdYvBhmzYJTTtGg\nISItUyGnKst/ZEzb4sXQr184lPCWW0KhpY03Xv39rORsSQwZQTmTppzpUyGnDuazz+C666BHD+je\nHWbODIWWRESKpbOqOpBp08KBhBtuCKNGwbbbpp1IRNIW+xqHVMj778Opp4a9GOecA3/5iwYNESmf\nBo4qq+a8pzvceWc46ryhIezJOPbY4vZkxDA/G0NGUM6kKWf6srSPQxL0t7+FTxlLl8L998P3vpd2\nIhFpL7TG0c6sWBHqY4wYAeefD0OGwFe+knYqEckq1Rzv4CZODAcSbrcdvPgibL55668RESmV1jiq\nrBLznu+8E4opHXccXHklPPhg2weNGOZnY8gIypk05UxfFAOHmfU1s9FmdqeZHZB2nqzIH0i4ww6h\noNKcOeFAQhGRSopqjcPMNgCudvefNvG9DrXGMWdOOB5kxQq4+WbYeee0E4lIjKLZx2FmY8xsqZnN\nbHS9t5kDQ2GiAAAKfUlEQVTNM7MFZnZeEy/9X+DG6qTMpuXLw6L3PvtA//4wZYoGDRGprrSmqsYC\nBxZeyBVyuiF3vRswwMy2L/j+lcCj7l5fzaBJa8u855//HKalXn01HBVy2mnQqVNy2QrFMD8bQ0ZQ\nzqQpZ/pSearK3SfnjlUv9HkhJwAzyxdymmdmpxMqA65vZtu4++jqJk7X22+HwwinToWbboI+fdJO\nJCIdWZYex22pkNNIYGRrN4ihkFMp7YYGWLCghosuggMOqGPUKOjduzrvn7+Wpf5oql2YNQt5mmrn\ni+dkJU9L7bys5FF/Jt+uUyGnL9yvXS2Oz5oVDiSEsPjdvXu6eUSkfYpmcbwZHaKQU+O/iTSWX/ze\nb7+wL2Py5HQGjdZyZkEMGUE5k6ac6VMhpwx57LGw+P3aa6s/cayRpaFdRISUpqpyhZxqgM7AUmCY\nu481sz5ALWFAG+PuV5Zwz2inqv7xj7D4PWVKWPzu3TvtRCLSUZQzVRXVBsCWxDhwuMPYsTB0KBx/\nPAwbBl/7WtqpRKQjiX2No0PIz3suWBDWMUaNgscfh6uuytagEcP8bAwZQTmTppzp08BRZStXwmWX\nwZ57hnOlpk4N9b9FRGKhqaoqeuYZOOkk2GoruPFGHXsuIulTPY6M+vBDuOCCUInv+uvhiCOKK98q\nIpJFmqqqsAkTwiO2y5eHE2032qguikEjhvnZGDKCciZNOdOnTxwV8u674RHbZ54JNTP23z/tRCIi\nydAaR8Lc4e67w6AxYABcemm2npYSESnUbtc4zGxL4EJgfXc/Ku08zVm8ONT8XrgQHngAdt897UQi\nIsmLYo3D3Re6+4lp52iOO9x6ayiotOuu8OKLzQ8ascx7xpAzhoygnElTzvSl8onDzMYAhwBL86fj\n5q735otHjgxPI18pliyBn/4U3nwTnnwSdtyx9deIiMQsrbOq9gY+Am4vOFZ9DWABoWDTW4RDD/u7\n+7yC193r7kc2c8+qrnG4w113wZlnhtrfF14Ia61VtbcXEUlENGscZVQA3BC4HOhhZuel/UnknXfg\n1FPD47WPPBKmp0REOoosLY63VAHwn8Dg1m5QjQqA779fw+DB8IMf1FFbC7vuWtrr89eyVBGsqXZt\nbW3mKyjW19dz5plnZiZPc+3G/+7TztNcW/3ZMfqzLoEKgLh7Kl9AF2BmQbsfMLqgPRAYUcL9vJKW\nLXMfNMh9663dn366/PtMnDgxsUyVFEPOGDK6K2fSlDNZuZ+dJf38zlLp2D2Ai929d649NPcHKmpa\nqpJrHM8/D0cdFepkXH219mWISPsR27Hqma8A6A433AAHHRQGjJtu0qAhIpLKwJGrAPgssK2ZvW5m\nJ7j7KuB04HFgDnCXu7+cRj6ADz6Ao48O+zOmTIF+/ZK5b+H8bJbFkDOGjKCcSVPO9KX1VNUxzVyf\nAEyocpwvmTEDjjwS/vu/4fbbYZ110k4kIpIdOquqgDvcfDNcdBGMHAn9+ycUTkQko6LZx5FFH34I\nJ58Ms2fD5Mmw3XZpJxIRyaYozqqqtLfegj32CAvfzz1X2UEjlnnPGHLGkBGUM2nKmb4OP3AsXgw1\nNTBwIPzud/DVr6adSEQk2zr0GseiRbDffuEo9HPOqVAwEZEMi20fR6pefTV80hgyRIOGiEgpohg4\nzGxdMxtnZjebWZOP8pbib3+DffeFc8+FM85IImHxYpn3jCFnDBlBOZOmnOmLYuAADgfudfeTgR+1\n5Ubz54dB46KLwgm31VZfX1/9Ny1DDDljyAjKmTTlTF9aO8fHmNlSM5vZ6HpvM5tnZgvM7LyCb23K\n6pNzV5X7vnPnhjWNyy6DE1OqJ/j++++n88YliiFnDBlBOZOmnOlL6xPHWODAwgu5Qk435K53AwaY\n2fa5b79BGDzgi+dbFW3mTOjVC666Co47rrzQIiKS0sDh7pOBZY0uf17Iyd1XAvlCTgB/Ao4wsxuB\nh0p9v1degQMPhOuvh2OPbUvytnvttdfSDVCkGHLGkBGUM2nKmb4sHaveDzjQ3U/KtQcCPd19SJH3\nax/PFYuIVFmHPXKk1D+4iIiUJ0tPVb0JbF7Q3jR3TUREMkSFnEREpCQq5CQiIiVJ66mqY9z92+6+\ntrtv7u5jc9cnuPt27v4dd7+ymHu1sPcjU8zsNTN7ycxmmNm0tPPkNbWnxsz+w8weN7P5ZvaYmX0j\nzYy5TE3lHGZmi83sxdxX7zQz5jJtamZPmdkcM5tlZkNy1zPVp03kPD13PTN9amZrm9lzuf9nZpnZ\nsNz1rPVlczkz05eFzGyNXJ7xuXbJ/Rn1IYe5vR8LgF7AW4Tprv7uPi/VYE0ws1eB77p748eQU2Vm\newMfAbcXPOE2HHjP3a/KDcb/4e5DM5hzGPChu1+bZrZCZvafwH+6e72ZrQe8QHis/AQy1Kct5Dya\nDPWpma3r7svNrBPwDDAE6EeG+rKFnH3IUF/mmdlZwHeB9d39R+X8/56lxfFytLT3I2uMDPZ3M3tq\n+gK35X59G3BoVUM1oZmcUOaG0Epx97fdvT7364+AlwkPemSqT5vJuUnu25npU3dfnvvl2oSnQJ2M\n9SU0mxMy1JcQPmkCBwG3FFwuuT8z94OsRJuw+igSgMWs/o8/axx4wsymm9lP0w7Tim+5+1IIP2CA\nb6WcpyU/M7N6M7sl7SmLxsxsC6AHMBXYOKt9WpDzudylzPRpblplBvA28IS7TyeDfdlMTshQX+Zc\nB5zL6oENyujP2AeOmOzl7rsQRvvTclMvscjqfOZNwFbu3oPwP2xmpgRy0z/3AWfk/kbfuA8z0adN\n5MxUn7p7g7vvTPjU1tPMupHBvmwiZ1cy1pdmdjCwNPdJs6VPQq32Z+wDRzR7P9x9Se6f7xCOUOmZ\nbqIWLTWzjeHzufB/pJynSe7+TkH1rt8Bu6WZJ8/M1iT8MP69uz+Yu5y5Pm0qZ1b71N3/BdQBvclg\nX+YV5sxgX+4F/Ci33nonsJ+Z/R54u9T+jH3giGLvh4V6Iuvlfv014L+B2emm+oLGe2rGA8fnfn0c\n8GDjF6TkCzlz/5HnHU52+vRWYK67X19wLYt9+qWcWepTM/tmfnrHzL4KHEBYi8lUXzaTc16W+hLA\n3S/IPcW6FeFn5VPu/mPC+X/H535bUf0Z9VNVEB7HBa4nDIJjin2Mt5rMbEvCpwwnLJz9ISs5Leyp\nqQE6A0uBYcADwL3AZsAi4Ch3T/WM6GZy7kuYm28AXgNOzs/VpsXM9gL+Cswi/Pt24AJgGnAPGenT\nFnIeQ0b61My6ExZr18h93e3ul5vZhmSrL5vLeTsZ6cvGzGwf4Oe5p6pK7s/oBw4REamu2KeqRESk\nyjRwiIhISTRwiIhISTRwiIhISTRwiIhISTRwiIhISTRwiIhISTRwiIhISTRwiFRI7iicuWY22sxm\nm9mfzWzttHOJtJUGDpHK2gYY6e47AB8QihCJRE0Dh0hlLXT3WblfvwBskWIWkURo4BCprBUFv15F\nOORSJGoaOEQqK1OlQ0WSoIFDpLJ0/LS0OzpWXURESqJPHCIiUhINHCIiUhINHCIiUhINHCIiUhIN\nHCIiUhINHCIiUhINHCIiUpL/D62ECx65I0MHAAAAAElFTkSuQmCC\n", "text/plain": [ "