abadesalex commited on
Commit
8765030
β€’
1 Parent(s): 838d68f

plot and logic

Browse files
Files changed (47) hide show
  1. FastAPI/app/__pycache__/api.cpython-310.pyc +0 -0
  2. FastAPI/app/api.py +34 -7
  3. FastAPI/app/build copy/static/js/main.d4022087.js +0 -0
  4. FastAPI/app/build copy/static/js/main.d4022087.js.LICENSE.txt +0 -39
  5. FastAPI/app/build copy/static/js/main.d4022087.js.map +0 -0
  6. FastAPI/app/build/asset-manifest.json +3 -3
  7. FastAPI/app/build/index.html +1 -1
  8. FastAPI/app/build/static/js/main.98763516.js +0 -0
  9. FastAPI/app/build/static/js/main.98763516.js.LICENSE.txt +136 -0
  10. FastAPI/app/build/static/js/main.98763516.js.map +0 -0
  11. FastAPI/app/{build copy β†’ build_copy_v1}/asset-manifest.json +3 -3
  12. FastAPI/app/{build copy β†’ build_copy_v1}/favicon.ico +0 -0
  13. FastAPI/app/{build copy β†’ build_copy_v1}/index.html +1 -1
  14. FastAPI/app/{build copy β†’ build_copy_v1}/logo192.png +0 -0
  15. FastAPI/app/{build copy β†’ build_copy_v1}/logo512.png +0 -0
  16. FastAPI/app/{build copy β†’ build_copy_v1}/manifest.json +0 -0
  17. FastAPI/app/{build copy β†’ build_copy_v1}/robots.txt +0 -0
  18. FastAPI/app/{build β†’ build_copy_v1}/static/js/main.e17bd3d9.js +0 -0
  19. FastAPI/app/{build β†’ build_copy_v1}/static/js/main.e17bd3d9.js.LICENSE.txt +0 -0
  20. FastAPI/app/{build β†’ build_copy_v1}/static/js/main.e17bd3d9.js.map +0 -0
  21. FastAPI/app/build_copy_v2/asset-manifest.json +10 -0
  22. FastAPI/app/build_copy_v2/favicon.ico +0 -0
  23. FastAPI/app/build_copy_v2/index.html +1 -0
  24. FastAPI/app/build_copy_v2/logo192.png +0 -0
  25. FastAPI/app/build_copy_v2/logo512.png +0 -0
  26. FastAPI/app/build_copy_v2/manifest.json +25 -0
  27. FastAPI/app/build_copy_v2/robots.txt +3 -0
  28. FastAPI/app/build_copy_v2/static/js/main.ed106e83.js +0 -0
  29. FastAPI/app/build_copy_v2/static/js/main.ed106e83.js.LICENSE.txt +121 -0
  30. FastAPI/app/build_copy_v2/static/js/main.ed106e83.js.map +0 -0
  31. FastAPI/app/utils/__pycache__/embedding.cpython-310.pyc +0 -0
  32. FastAPI/app/utils/embedding.py +8 -0
  33. FastAPI/requirements.txt +6 -1
  34. FastAPI/test.ipynb +106 -0
  35. my-app/package-lock.json +0 -0
  36. my-app/package.json +4 -1
  37. my-app/src/App.js +0 -53
  38. my-app/src/Components/ActiveWords/index.jsx +66 -0
  39. my-app/src/Components/Body/index.jsx +32 -0
  40. my-app/src/Components/Context/WordsContext.js +6 -0
  41. my-app/src/Components/CreateWord/CreateWord.jsx +65 -0
  42. my-app/src/Components/Header/index.jsx +19 -0
  43. my-app/src/Components/Plot/index.jsx +62 -0
  44. my-app/src/Components/WordCard/index.jsx +26 -0
  45. my-app/src/index.js +12 -8
  46. my-app/testPlot.jsx +88 -0
  47. prev.tsx +18 -0
FastAPI/app/__pycache__/api.cpython-310.pyc CHANGED
Binary files a/FastAPI/app/__pycache__/api.cpython-310.pyc and b/FastAPI/app/__pycache__/api.cpython-310.pyc differ
 
FastAPI/app/api.py CHANGED
@@ -3,9 +3,11 @@ from fastapi.middleware.cors import CORSMiddleware
3
  from fastapi.staticfiles import StaticFiles
4
  from fastapi.responses import FileResponse
5
 
 
 
 
6
  app = FastAPI()
7
- #delocos
8
- # CORS setup
9
  origins = [
10
  "http://localhost:3000",
11
  "http://localhost:8000",
@@ -21,7 +23,9 @@ app.add_middleware(
21
  )
22
 
23
  # Mount static files
24
- app.mount("/static", StaticFiles(directory="app/build/static", html=True), name="static")
 
 
25
 
26
 
27
  # Serve index.html at the root
@@ -29,10 +33,33 @@ app.mount("/static", StaticFiles(directory="app/build/static", html=True), name=
29
  def read_root():
30
  return FileResponse("app/build/index.html")
31
 
32
- # Define API route
33
- @app.get("/api/sum_of_lengths")
34
- def sum_of_lengths(word1: str = Query(...), word2: str = Query(...)):
35
- return {"sum": len(word1) + len(word2)}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
36
 
37
 
38
  if __name__ == "__main__":
 
3
  from fastapi.staticfiles import StaticFiles
4
  from fastapi.responses import FileResponse
5
 
6
+ from app.utils.embedding import get_embedding
7
+
8
+
9
  app = FastAPI()
10
+
 
11
  origins = [
12
  "http://localhost:3000",
13
  "http://localhost:8000",
 
23
  )
24
 
25
  # Mount static files
26
+ app.mount(
27
+ "/static", StaticFiles(directory="app/build/static", html=True), name="static"
28
+ )
29
 
30
 
31
  # Serve index.html at the root
 
33
  def read_root():
34
  return FileResponse("app/build/index.html")
35
 
36
+
37
+ words_db = []
38
+
39
+
40
+ @app.get("/api/words", tags=["words"])
41
+ async def get_todos() -> dict:
42
+ return {"data": words_db}
43
+
44
+
45
+ @app.post("/api/add-word", tags=["words"])
46
+ async def add_word(word: dict) -> dict:
47
+ words_db.append(word)
48
+ word_to_embbed = word["id"]
49
+ word_embedding = get_embedding(word_to_embbed)[:3]
50
+ word["embedding"] = word_embedding.tolist()
51
+ return {"data": {"Succesful"}}
52
+
53
+
54
+ @app.delete("/api/delete-word/{word_id}", tags=["words"])
55
+ async def delete_word(word_id: str) -> dict:
56
+ word_id = int(word_id)
57
+ for word in words_db:
58
+ if int(word["id"]) == word_id:
59
+ print("found")
60
+ words_db.remove(word)
61
+ return {"data": {"Succesful"}}
62
+ return {"data": {"Word not found"}}
63
 
64
 
65
  if __name__ == "__main__":
FastAPI/app/build copy/static/js/main.d4022087.js DELETED
The diff for this file is too large to render. See raw diff
 
FastAPI/app/build copy/static/js/main.d4022087.js.LICENSE.txt DELETED
@@ -1,39 +0,0 @@
1
- /**
2
- * @license React
3
- * react-dom.production.min.js
4
- *
5
- * Copyright (c) Facebook, Inc. and its affiliates.
6
- *
7
- * This source code is licensed under the MIT license found in the
8
- * LICENSE file in the root directory of this source tree.
9
- */
10
-
11
- /**
12
- * @license React
13
- * react-jsx-runtime.production.min.js
14
- *
15
- * Copyright (c) Facebook, Inc. and its affiliates.
16
- *
17
- * This source code is licensed under the MIT license found in the
18
- * LICENSE file in the root directory of this source tree.
19
- */
20
-
21
- /**
22
- * @license React
23
- * react.production.min.js
24
- *
25
- * Copyright (c) Facebook, Inc. and its affiliates.
26
- *
27
- * This source code is licensed under the MIT license found in the
28
- * LICENSE file in the root directory of this source tree.
29
- */
30
-
31
- /**
32
- * @license React
33
- * scheduler.production.min.js
34
- *
35
- * Copyright (c) Facebook, Inc. and its affiliates.
36
- *
37
- * This source code is licensed under the MIT license found in the
38
- * LICENSE file in the root directory of this source tree.
39
- */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
FastAPI/app/build copy/static/js/main.d4022087.js.map DELETED
The diff for this file is too large to render. See raw diff
 
FastAPI/app/build/asset-manifest.json CHANGED
@@ -1,10 +1,10 @@
1
  {
2
  "files": {
3
- "main.js": "/static/js/main.e17bd3d9.js",
4
  "index.html": "/index.html",
5
- "main.e17bd3d9.js.map": "/static/js/main.e17bd3d9.js.map"
6
  },
7
  "entrypoints": [
8
- "static/js/main.e17bd3d9.js"
9
  ]
10
  }
 
1
  {
2
  "files": {
3
+ "main.js": "/static/js/main.98763516.js",
4
  "index.html": "/index.html",
5
+ "main.98763516.js.map": "/static/js/main.98763516.js.map"
6
  },
7
  "entrypoints": [
8
+ "static/js/main.98763516.js"
9
  ]
10
  }
FastAPI/app/build/index.html CHANGED
@@ -1 +1 @@
1
- <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="/logo192.png"/><link rel="manifest" href="/manifest.json"/><title>React App</title><script defer="defer" src="/static/js/main.e17bd3d9.js"></script></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
 
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="/logo192.png"/><link rel="manifest" href="/manifest.json"/><title>React App</title><script defer="defer" src="/static/js/main.98763516.js"></script></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
FastAPI/app/build/static/js/main.98763516.js ADDED
The diff for this file is too large to render. See raw diff
 
FastAPI/app/build/static/js/main.98763516.js.LICENSE.txt ADDED
@@ -0,0 +1,136 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * @copyright 2016 Sean Connelly (@voidqk), http://syntheti.cc
3
+ * @license MIT
4
+ * @preserve Project Home: https://github.com/voidqk/polybooljs
5
+ */
6
+
7
+ /*
8
+ object-assign
9
+ (c) Sindre Sorhus
10
+ @license MIT
11
+ */
12
+
13
+ /*
14
+ * @copyright 2016 Sean Connelly (@voidqk), http://syntheti.cc
15
+ * @license MIT
16
+ * @preserve Project Home: https://github.com/voidqk/polybooljs
17
+ */
18
+
19
+ /*!
20
+ * The buffer module from node.js, for the browser.
21
+ *
22
+ * @author Feross Aboukhadijeh <https://feross.org>
23
+ * @license MIT
24
+ */
25
+
26
+ /*!
27
+ * Determine if an object is a Buffer
28
+ *
29
+ * @author Feross Aboukhadijeh <https://feross.org>
30
+ * @license MIT
31
+ */
32
+
33
+ /*!
34
+ * pad-left <https://github.com/jonschlinkert/pad-left>
35
+ *
36
+ * Copyright (c) 2014-2015, Jon Schlinkert.
37
+ * Licensed under the MIT license.
38
+ */
39
+
40
+ /*!
41
+ * repeat-string <https://github.com/jonschlinkert/repeat-string>
42
+ *
43
+ * Copyright (c) 2014-2015, Jon Schlinkert.
44
+ * Licensed under the MIT License.
45
+ */
46
+
47
+ /*!
48
+ * The buffer module from node.js, for the browser.
49
+ *
50
+ * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
51
+ * @license MIT
52
+ */
53
+
54
+ /*!
55
+ * The buffer module from node.js, for the browser.
56
+ *
57
+ * @author Feross Aboukhadijeh <https://feross.org>
58
+ * @license MIT
59
+ */
60
+
61
+ /*! Native Promise Only
62
+ v0.8.1 (c) Kyle Simpson
63
+ MIT License: http://getify.mit-license.org
64
+ */
65
+
66
+ /*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
67
+
68
+ /*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
69
+
70
+ /**
71
+ * @license React
72
+ * react-dom.production.min.js
73
+ *
74
+ * Copyright (c) Facebook, Inc. and its affiliates.
75
+ *
76
+ * This source code is licensed under the MIT license found in the
77
+ * LICENSE file in the root directory of this source tree.
78
+ */
79
+
80
+ /**
81
+ * @license React
82
+ * react-is.production.min.js
83
+ *
84
+ * Copyright (c) Facebook, Inc. and its affiliates.
85
+ *
86
+ * This source code is licensed under the MIT license found in the
87
+ * LICENSE file in the root directory of this source tree.
88
+ */
89
+
90
+ /**
91
+ * @license React
92
+ * react-jsx-runtime.production.min.js
93
+ *
94
+ * Copyright (c) Facebook, Inc. and its affiliates.
95
+ *
96
+ * This source code is licensed under the MIT license found in the
97
+ * LICENSE file in the root directory of this source tree.
98
+ */
99
+
100
+ /**
101
+ * @license React
102
+ * react.production.min.js
103
+ *
104
+ * Copyright (c) Facebook, Inc. and its affiliates.
105
+ *
106
+ * This source code is licensed under the MIT license found in the
107
+ * LICENSE file in the root directory of this source tree.
108
+ */
109
+
110
+ /**
111
+ * @license React
112
+ * scheduler.production.min.js
113
+ *
114
+ * Copyright (c) Facebook, Inc. and its affiliates.
115
+ *
116
+ * This source code is licensed under the MIT license found in the
117
+ * LICENSE file in the root directory of this source tree.
118
+ */
119
+
120
+ /** @license React v16.13.1
121
+ * react-is.production.min.js
122
+ *
123
+ * Copyright (c) Facebook, Inc. and its affiliates.
124
+ *
125
+ * This source code is licensed under the MIT license found in the
126
+ * LICENSE file in the root directory of this source tree.
127
+ */
128
+
129
+ /** @license React v17.0.2
130
+ * react-is.production.min.js
131
+ *
132
+ * Copyright (c) Facebook, Inc. and its affiliates.
133
+ *
134
+ * This source code is licensed under the MIT license found in the
135
+ * LICENSE file in the root directory of this source tree.
136
+ */
FastAPI/app/build/static/js/main.98763516.js.map ADDED
The diff for this file is too large to render. See raw diff
 
FastAPI/app/{build copy β†’ build_copy_v1}/asset-manifest.json RENAMED
@@ -1,10 +1,10 @@
1
  {
2
  "files": {
3
- "main.js": "/static/js/main.d4022087.js",
4
  "index.html": "/index.html",
5
- "main.d4022087.js.map": "/static/js/main.d4022087.js.map"
6
  },
7
  "entrypoints": [
8
- "static/js/main.d4022087.js"
9
  ]
10
  }
 
1
  {
2
  "files": {
3
+ "main.js": "/static/js/main.e17bd3d9.js",
4
  "index.html": "/index.html",
5
+ "main.e17bd3d9.js.map": "/static/js/main.e17bd3d9.js.map"
6
  },
7
  "entrypoints": [
8
+ "static/js/main.e17bd3d9.js"
9
  ]
10
  }
FastAPI/app/{build copy β†’ build_copy_v1}/favicon.ico RENAMED
File without changes
FastAPI/app/{build copy β†’ build_copy_v1}/index.html RENAMED
@@ -1 +1 @@
1
- <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="/logo192.png"/><link rel="manifest" href="/manifest.json"/><title>React App</title><script defer="defer" src="/static/js/main.d4022087.js"></script></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
 
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="/logo192.png"/><link rel="manifest" href="/manifest.json"/><title>React App</title><script defer="defer" src="/static/js/main.e17bd3d9.js"></script></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
FastAPI/app/{build copy β†’ build_copy_v1}/logo192.png RENAMED
File without changes
FastAPI/app/{build copy β†’ build_copy_v1}/logo512.png RENAMED
File without changes
FastAPI/app/{build copy β†’ build_copy_v1}/manifest.json RENAMED
File without changes
FastAPI/app/{build copy β†’ build_copy_v1}/robots.txt RENAMED
File without changes
FastAPI/app/{build β†’ build_copy_v1}/static/js/main.e17bd3d9.js RENAMED
File without changes
FastAPI/app/{build β†’ build_copy_v1}/static/js/main.e17bd3d9.js.LICENSE.txt RENAMED
File without changes
FastAPI/app/{build β†’ build_copy_v1}/static/js/main.e17bd3d9.js.map RENAMED
File without changes
FastAPI/app/build_copy_v2/asset-manifest.json ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "files": {
3
+ "main.js": "/static/js/main.ed106e83.js",
4
+ "index.html": "/index.html",
5
+ "main.ed106e83.js.map": "/static/js/main.ed106e83.js.map"
6
+ },
7
+ "entrypoints": [
8
+ "static/js/main.ed106e83.js"
9
+ ]
10
+ }
FastAPI/app/build_copy_v2/favicon.ico ADDED
FastAPI/app/build_copy_v2/index.html ADDED
@@ -0,0 +1 @@
 
 
1
+ <!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Web site created using create-react-app"/><link rel="apple-touch-icon" href="/logo192.png"/><link rel="manifest" href="/manifest.json"/><title>React App</title><script defer="defer" src="/static/js/main.ed106e83.js"></script></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
FastAPI/app/build_copy_v2/logo192.png ADDED
FastAPI/app/build_copy_v2/logo512.png ADDED
FastAPI/app/build_copy_v2/manifest.json ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "short_name": "React App",
3
+ "name": "Create React App Sample",
4
+ "icons": [
5
+ {
6
+ "src": "favicon.ico",
7
+ "sizes": "64x64 32x32 24x24 16x16",
8
+ "type": "image/x-icon"
9
+ },
10
+ {
11
+ "src": "logo192.png",
12
+ "type": "image/png",
13
+ "sizes": "192x192"
14
+ },
15
+ {
16
+ "src": "logo512.png",
17
+ "type": "image/png",
18
+ "sizes": "512x512"
19
+ }
20
+ ],
21
+ "start_url": ".",
22
+ "display": "standalone",
23
+ "theme_color": "#000000",
24
+ "background_color": "#ffffff"
25
+ }
FastAPI/app/build_copy_v2/robots.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ # https://www.robotstxt.org/robotstxt.html
2
+ User-agent: *
3
+ Disallow:
FastAPI/app/build_copy_v2/static/js/main.ed106e83.js ADDED
The diff for this file is too large to render. See raw diff
 
FastAPI/app/build_copy_v2/static/js/main.ed106e83.js.LICENSE.txt ADDED
@@ -0,0 +1,121 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * @copyright 2016 Sean Connelly (@voidqk), http://syntheti.cc
3
+ * @license MIT
4
+ * @preserve Project Home: https://github.com/voidqk/polybooljs
5
+ */
6
+
7
+ /*
8
+ object-assign
9
+ (c) Sindre Sorhus
10
+ @license MIT
11
+ */
12
+
13
+ /*!
14
+ * The buffer module from node.js, for the browser.
15
+ *
16
+ * @author Feross Aboukhadijeh <https://feross.org>
17
+ * @license MIT
18
+ */
19
+
20
+ /*!
21
+ * Determine if an object is a Buffer
22
+ *
23
+ * @author Feross Aboukhadijeh <https://feross.org>
24
+ * @license MIT
25
+ */
26
+
27
+ /*!
28
+ * pad-left <https://github.com/jonschlinkert/pad-left>
29
+ *
30
+ * Copyright (c) 2014-2015, Jon Schlinkert.
31
+ * Licensed under the MIT license.
32
+ */
33
+
34
+ /*!
35
+ * repeat-string <https://github.com/jonschlinkert/repeat-string>
36
+ *
37
+ * Copyright (c) 2014-2015, Jon Schlinkert.
38
+ * Licensed under the MIT License.
39
+ */
40
+
41
+ /*!
42
+ * The buffer module from node.js, for the browser.
43
+ *
44
+ * @author Feross Aboukhadijeh <feross@feross.org> <http://feross.org>
45
+ * @license MIT
46
+ */
47
+
48
+ /*!
49
+ * The buffer module from node.js, for the browser.
50
+ *
51
+ * @author Feross Aboukhadijeh <https://feross.org>
52
+ * @license MIT
53
+ */
54
+
55
+ /*! Native Promise Only
56
+ v0.8.1 (c) Kyle Simpson
57
+ MIT License: http://getify.mit-license.org
58
+ */
59
+
60
+ /*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
61
+
62
+ /*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
63
+
64
+ /**
65
+ * @license React
66
+ * react-dom.production.min.js
67
+ *
68
+ * Copyright (c) Facebook, Inc. and its affiliates.
69
+ *
70
+ * This source code is licensed under the MIT license found in the
71
+ * LICENSE file in the root directory of this source tree.
72
+ */
73
+
74
+ /**
75
+ * @license React
76
+ * react-is.production.min.js
77
+ *
78
+ * Copyright (c) Facebook, Inc. and its affiliates.
79
+ *
80
+ * This source code is licensed under the MIT license found in the
81
+ * LICENSE file in the root directory of this source tree.
82
+ */
83
+
84
+ /**
85
+ * @license React
86
+ * react-jsx-runtime.production.min.js
87
+ *
88
+ * Copyright (c) Facebook, Inc. and its affiliates.
89
+ *
90
+ * This source code is licensed under the MIT license found in the
91
+ * LICENSE file in the root directory of this source tree.
92
+ */
93
+
94
+ /**
95
+ * @license React
96
+ * react.production.min.js
97
+ *
98
+ * Copyright (c) Facebook, Inc. and its affiliates.
99
+ *
100
+ * This source code is licensed under the MIT license found in the
101
+ * LICENSE file in the root directory of this source tree.
102
+ */
103
+
104
+ /**
105
+ * @license React
106
+ * scheduler.production.min.js
107
+ *
108
+ * Copyright (c) Facebook, Inc. and its affiliates.
109
+ *
110
+ * This source code is licensed under the MIT license found in the
111
+ * LICENSE file in the root directory of this source tree.
112
+ */
113
+
114
+ /** @license React v16.13.1
115
+ * react-is.production.min.js
116
+ *
117
+ * Copyright (c) Facebook, Inc. and its affiliates.
118
+ *
119
+ * This source code is licensed under the MIT license found in the
120
+ * LICENSE file in the root directory of this source tree.
121
+ */
FastAPI/app/build_copy_v2/static/js/main.ed106e83.js.map ADDED
The diff for this file is too large to render. See raw diff
 
FastAPI/app/utils/__pycache__/embedding.cpython-310.pyc ADDED
Binary file (365 Bytes). View file
 
FastAPI/app/utils/embedding.py ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ import gensim.downloader
2
+
3
+ model = gensim.downloader.load("glove-wiki-gigaword-50")
4
+
5
+
6
+ def get_embedding(word):
7
+ global model
8
+ return model[word]
FastAPI/requirements.txt CHANGED
@@ -1,3 +1,8 @@
1
  uvicorn
2
  fastapi
3
- gensim
 
 
 
 
 
 
1
  uvicorn
2
  fastapi
3
+ scipy==1.11.0
4
+ gensim
5
+
6
+ # gensim==4.0.1
7
+ # scipy==1.7.3
8
+ # numpy==1.19.5
FastAPI/test.ipynb ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 3,
6
+ "metadata": {},
7
+ "outputs": [],
8
+ "source": [
9
+ "import gensim.downloader\n",
10
+ "import numpy as np \n",
11
+ "import matplotlib.pyplot as plt"
12
+ ]
13
+ },
14
+ {
15
+ "cell_type": "code",
16
+ "execution_count": 4,
17
+ "metadata": {},
18
+ "outputs": [],
19
+ "source": [
20
+ "model = gensim.downloader.load(\"glove-wiki-gigaword-50\")"
21
+ ]
22
+ },
23
+ {
24
+ "cell_type": "code",
25
+ "execution_count": 5,
26
+ "metadata": {},
27
+ "outputs": [],
28
+ "source": [
29
+ "sushi_vector = model[\"sushi\"]\n",
30
+ "japanese_vector = model[\"japanese\"]"
31
+ ]
32
+ },
33
+ {
34
+ "cell_type": "code",
35
+ "execution_count": null,
36
+ "metadata": {},
37
+ "outputs": [],
38
+ "source": [
39
+ "# select 3 first elements\n",
40
+ "sushi_vector = sushi_vector[:3]\n",
41
+ "japanese_vector = japanese_vector[:3]"
42
+ ]
43
+ },
44
+ {
45
+ "cell_type": "code",
46
+ "execution_count": 6,
47
+ "metadata": {},
48
+ "outputs": [
49
+ {
50
+ "data": {
51
+ "text/plain": [
52
+ "Text(-0.3091900050640106, -0.35172998905181885, 'japanese')"
53
+ ]
54
+ },
55
+ "execution_count": 6,
56
+ "metadata": {},
57
+ "output_type": "execute_result"
58
+ },
59
+ {
60
+ "data": {
61
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZ4AAAGICAYAAABx84aJAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/TGe4hAAAACXBIWXMAAA9hAAAPYQGoP6dpAAC8M0lEQVR4nOx9d3wc5Z3+s0W9r6olS5ZkyZIsF3VZNmAHfHEosQ2EEI4AIQQuyZlATLhAAuQghSOkmASCQ8Ilxy9x4AycCSVOjLGNjQtYvVerWmWbyvYy8/tDeYfZ1e5qy8zurD3P5+MPaLU7end29n3m255HQtM0DREiRIgQISJIkIZ6ASJEiBAh4vKCSDwiRIgQISKoEIlHhAgRIkQEFSLxiBAhQoSIoEIkHhEiRIgQEVSIxCNChAgRIoIKkXhEiBAhQkRQIRKPCBEiRIgIKkTiESFChAgRQYVIPCJEiBAhIqgQiUeECBEiRAQVIvGIECFChIigQiQeESJEiBARVIjEI0KECBEiggqReESIECFCRFAhEo8IESJEiAgqROIRIUKECBFBhUg8IkSIECEiqBCJR4QIESJEBBUi8YgQIUKEiKBCJB4RIkSIEBFUiMQjQoQIESKCCpF4RIgQIUJEUCESjwgRIkSICCpE4hEhQoQIEUGFSDwiRIgQISKoEIlHhAgRIkQEFSLxiBAhQoSIoEIkHhEiRIgQEVSIxCNChAgRIoIKkXhEiBAhQkRQIRKPCBEiRIgIKkTiESFChAgRQYVIPCJEiBAhIqgQiUeECBEiRAQVIvGIECFChIigQh7qBYi4/EBRFGw2GyQSCeRyOSQSSaiXJEKEiCBCJB4RQQNN07Db7bDZbNDr9ZBKpZBKpZDJZJDL5ZDL5ZDJZCIRiRBxiUNC0zQd6kWIuPRB0zSsVivsdjvz/xKJBBRFgaZp0DQNiUQCqVTqQEIiEYkQcelBJB4RvIOiKFgsFlAUBalUCpqmYbFYIJV+WmIkl6FIRCJEXPoQiUcEbyCpNavVCpqmIZVKmSjHarUCgFsSEYlIhIhLFyLxiOAFpIHAbrcDWCQYQhAkAmI/thzYRERRFPM6kYhEiAg/iMQjglPQNM1ENCRKcSYCf4jH1d8h/5yJKCIigmlYIFGWCBEihAOxq00EZ6BpGjabDTabDQACIpblwD62TCZzICKTycQ8hxARiYhEIhIhIvQQiUcEJyBRjt1uZzb8YMIbItJoNIiNjUVycrJIRCJEhBAi8YgICOzZHNK1JoSN3BURXbx4Eenp6YiOjmae4zxDJJT1ixBxKUMkHhF+gz2bA8DrTTsUGzshIolEgoiICIf6EImIyECrSEQiRPALkXhE+AXn2RxfN+dQb+buUnN2ux12ux1ms9ll+7ZIRCJEBA6ReET4BHezOeEOQkSkNuWJiNhdc3w2UIgQcalCJB4RXsPf1JpQ4MtaPRERETh1VSMSiUiEiOUhEo8Ir2C32zE7O4uWlhZs2bLlsttc3RGRzWZjdOcIEZGIiKTmRIgQ4QiReER4BHs2h6ZpGI3GsCYdrualRSISIcJ/iMQjwi3IbA5FUQAWU2vk/0U4YjkiAlzL+4hEJOJyhEg8IpaALXvD7lojytLhimBGau6IyGq1wmKxYGBgAPn5+YiNjRWJSMRlB5F4RDjAUwMB+S/RYPMXCwsLGBwcRFxcHBQKBRISEsI6fecNnIloamoKubm5sFqtDkrd7IhIdGcVcalCJB4RDNiyN6461gIlHpqmMT4+jp6eHmRkZGB+fh6jo6MAgOTkZKSkpCAlJQVxcXGXxYZLyAVwjDLZAqqEiER3VhGXEkTiEeG17A2beHyFzWZDZ2cn1Go1KisrkZCQwPxuYWEBWq0WarUag4ODkMlkDAmlpKQgJiaGsw1XKKlC53WQRgT2752JiNiEs5sVRCISEY4Qiecyhy+zOf4Sz/z8PFpaWhATE4MtW7YgMjISFouFOWZiYiISExOxatUqUBSF+fl5aLVaTE9Po6+vD5GRkQ5ERLTWwh2eSMNbIhK9iESEI0TiuYxBFAi8lb0h9QlvO9tomsbo6Cj6+vpQWFiIwsJCSCQSJlXnisCkUimSk5ORnJyMgoIC2O12zM3NQavVYmJiAj09PYiOjnYgosjISK/WI5RN2Z+oi01EbFM8i8XiVt5HJCIRQoVIPJchnH1zfBX39GbjtFqt6OjowOzsLKqrq6FQKPxaq0wmg0KhYF5vs9kwOzsLrVaLkZERdHZ2Ii4ujiGh5ORkRERE+PW3gg1/SYGtMQeIRCQi/CASz2UGT5bUy8Fb4pmdnUVrayvi4+OZ1BpXkMvlSEtLQ1paGgDAYrEwRDQ4OAiDwYCEhAQHImKnrIQArutMroiI/DObzUxaUyQiEUKBSDyXCbyxpF4OyxEPTdMYHh5Gf38/iouLkZ+fz/vGFhkZiYyMDGRkZAAAzGYztFottFotenp6YLFYkJiYiJSUFEZN+1KHJ1M8s9nsVvA03LT3RIQvROK5DODcQBCIkKW72ozFYkF7ezsWFhZQV1eH5OTkQJbsN6KiopCVlYWsrCzGfZQQ0fz8PObn56HRaJCSkgKFQoH4+PiQDW0Ga5Nfzp11cnISERERyMzMFG3CRQQFIvFc4lhuNsdXuJLN0Wq1aG1tRVJSErZs2SKYGotEIkFMTAxiYmKQnZ0NiqIQExOD6OhoaLVajI6OgqZph0aFYMwQhbql25mIdDodoqOjHWzCRXdWEXxCJJ5LFHxZUrMjHpqmMTQ0hKGhIaxZswZ5eXmC3pgkEgkiIyOxcuVKrFy5EjRNQ6fTQavVQqPRYGhoCFKplLcZIlfrEQKIrxKp+4jurCL4hkg8lyBomsbs7CxMJhOSk5M53SAI8ZjNZrS1tcFoNKKurg5JSUmcHJ9vsKMNiUSChIQEJCQkIC8vDxRFYWFhARqNhtcZolBHPM5wVqJwl5qjKApmsxkmk0kkIhEBQSSeSwykpXZqagpzc3N+tzG7g0QiwezsLAYHB5GSkoLKykpG9iXcIZVKkZSUhKSkJM5niFxBKJv0chJIzjVB0Z1VRKC4NHYMEUssqWUyGecdXORv9PT0oKysDCtXrgxoYwlUbNRX+Pq3+JohEnrEsxxEd1YRgUIknksAzrM5JA3C5QZnMpnQ2toKiqKwbt065OTkcHbscMGlMEPkCoHeAPhiiuecmhNxeUIknjCGp9kcLk3blEol2trakJ6eDpPJFNZaaVySsacZot7eXpjNZmaGKCUlBUlJSQ6brVDu/rmOPEV3VhHLQSSeMIWz7I1zGkMikQRMPBRFob+/H6Ojo1i7di1ycnJw8uRJwaWKhAL2DBEAGI1GhoguXrwIm82GpKQkJCYmAhBOyo3vlKfozirCGSLxhCHYsznsLzQbgabajEYjWltbYbPZ0NDQgPj4eADuB0hFLAV7hoimaRgMBsb+AQA++ugjxodIoVCEzIcoFLU2T+6sKpUKERERSE9PF4noEoVIPGEEX2ZzAkm1TU9Po6OjA1lZWSgtLXWoU4Qz8YQytSWRSBAXF4e4uDikp6fjo48+QkVFBdM1d+HChaDOELERbOJxhjMRaTQaxMTEIDk5WXRnvUQhEk+YwBffHMA/gqAoCr29vZiYmEB5eTlWrFjByXFFuEZCQgKSkpJczhD19/cjIiIiKD5EZIBUKKBpmiEZ8rPoznppQSSeMACZzfFFgcDXiMdgMKClpQUA0NDQgLi4OJfP46J2FEoIiTTZn2OwZ4jYCHXE4wyKopbUK0V31ksLIvEIGM6zOb5MhvtCPJOTk+js7EROTg5KSko83v1y0aZ9uc9zeHP+gulDJETi8XQNiu6s4Q+ReAQKX1NrzvAmJUaGQScnJ7F+/XpkZmZyclwR3sGXz9N5hshqtTIdc65miJKSkrxWlAg34nEGm4hEU7zwgEg8AoSvltSusFzEo9Pp0NraCqlUii1btiAmJsar44Yz8Qhlo+Hi/EVERPg0Q5SYmOh2mFVoxBPIelyZ4gEiEQkNIvEICP5aUruCp1rMxMQEurq6kJeXh+LiYp/vLsUaT+DgepPzdoaIEFFCQgLzuTvXVEINXyMeT/BERKI7a+ggEo9AQHLUZFMP9IvnqhZjs9nQ3d2NmZkZVFRUID093efjhnPEIxQE4/y5myFi+xCRGSKSzhUKuCQeZ7CJyJU7K5uIRHdW/iAST4jBLoxy6ZvjnGpbWFhAS0sLIiMjsWXLFr9bc7nSgBO/xMEDe4bI2YdIq9XCarWira0NCoWCiYhiY2ND9hkFs717OXdW8pyFhQWkpKQgKipKtIDgACLxhBA0TWNubg56vR4KhYJz3xxg8e6RtOPm5+dj9erVAX2puYp4LveoKdQDm2wfog8//BBFRUWwWCxQKpUYGBiAXC5fMswaLIQy9eeKiCiKQnNzM2praxmtOdGdNTCIxBMikChHpVJhcnKS6VbiCoRc2traoNFoUFVVhdTU1ICPG86pNqFsDEI8f4SI8vPzYbfbMT8/D61Wi8nJSfT29iIqKsqBiKKionhbC5+pNl/BvmaioqIgl8uXuLOKROQ7ROIJMpxlb/jwzQEWu9aARen+LVu2cLZRcEE8drsdAwMDoCgKCoUiqPYBQtn0hbQpOXeRyWQyhmCAxdogGWYdGxtDV1cXZzNEriAk4gHgUHd1l5oT3Vl9g0g8QYSr2RyuiYemaYyOjqK3txcAsHHjRk7vTgO1W9Dr9WhpaYFUKkVMTAx6enpgsViQlJTEDEwmJCRc0l9SoZAfwXLty3K5HKmpqUzEbLVamWHWoaEh6PV6v2eI3K1HiMTj6ubIF3dWkYg+hUg8QYK72RwufXOsVis6OjowOzuLmpoafPzxx5xvcoFEPFNTU+jo6MDKlStRUFDAbHhGoxEajYbpuALAbGIKhYIzsczL+YvuCb7OzRDlaNIVGcgMkSsIrb2bqMB7syZ3ytuiO6sjROLhGezZHFeyN1wRz+zsLFpbWxEfH48tW7YwOl5cp/ECFR8lCglsW4fY2FjExsYyHVdELJMUuolYJum64rO+ECwIZZMhG2MgEUYgM0R8rIdrkJS4P/DFFO9yIiKReHiEK0tq54spUOKhaRrDw8MYGBhAUVER8vPzHaKpUEc8RqMRLS0toCgKmzdvRmxs7LLHT0xMRGJiIlPonpubg0ajcagvEBJKTk4OKK0TCggt1QZwS4SeZojGxsZAURQzQ5SSkoL4+HiHLkwg8Dk2LmG32zkdaPWWiC5ld9bw+saGCTxZUjsjEOKxWCxob2/HwsICamtrkZyczNmx3cEX4iGW2ZmZmSgrK1vi6+MNnMUyiUaZRqNBf38/TCYTEhMTGSJKTEz0+CUVyqYvlLtZcj74Ws9yM0QXLlyARCJxSMsBwiIevgdavSGiffv24eqrr8ZVV13FyzqCDZF4OIZzA8FyIbNUKvVrclyr1aK1tRVJSUnYsmWLy64iPlqfvZHMoWkaAwMDGB4eZiyzuYKzRhlJ62g0GoyPjzN304SIQuXq6QlCIT+Af+JxhvMMEfEh0mq1TGoVAHp6epjPMJgzRK5gt9uD1nXpjojeeecdlJSUBGUNwYBIPByCbUnNl28OTdMYGhrC0NAQ1qxZg7y8PF6iKXeQSqWMK6QrmM1mtLW1wWg0YtOmTUhISOD07zvDOa1D7qbVajUGBweZQUiFQhHUDWQ5CIUMg008zmD7EOXn58NgMODs2bOIiYkJyQyRK4SyvZsQkV6vd+uRFY4QiYcD+GJJ7QxSh/Gms4i9qdfV1SEpKcnj8/kQ9PQURWm1WrS0tCAlJQWVlZUeay98bHSu7qbZZmrz8/OQy+Ww2+3M/BCX8yfhCHJ9CIUIgcW1rF69GoDrGaLY2FgHIuL7Mwz1DQtN00zL+qUCkXgCRKC+OWyFYE8Xt1qtRltbm1ebOvvYwWguYDc4LBeFBRNSqZTZnAoLC5mZIYlEwnjYkLZfhUKBpKSkoNzZXs6ptuXg3NHmaYbowoUL6OjoQHx8vMMwK9fNJkIYaDUYDGLEI2IR/lhSO2M54qEoCoODgxgeHkZpaSlWrlzpUzTFd8RDZofm5uZcNjgICWRotbi4GMBiBEnmhzo7O2Gz2ZhuK4VC4dBtxTWEtNEDwlnPcjM8rmaICBGRZhPnYdZAoxUhEI9er0d8fHxI18AlROLxA4FYUjuDTTzOMJlMaG1thcVi8atewnfEMz8/j5aWFsTGxmLz5s3M7JA3IOnFYML5M4qKisKKFSuwYsUKpu2XENHw8LBDxEQGWbmAGPG4h6+bfFRUFDIzMxn3XKPRyBBRV1cXbDabQ1TraYbIHUKdarPb7TCZTCLxXM7wZjbHF7gjHtKKnJGRgerqar/SB3zVeOx2O8bGxtDT04PCwkIUFhYKZuPyF+y239zcXKbbSqPRYHp6Gn19fYiKinKwDvCFaF39PSFAaO6jgUYXpNmEfTNBWrfZXY+uZoj4WlOgILqLYo3nMoQvszm+gByHEARFUejv78fo6GjArch8pNqAxUhnbm6OM8VrIYLdbVVQUMAUuTUaDUZGRtDZ2Yn4+HiHQVZv74qFFvEIiXi4VC3wdYbInQ9RqCMevV4PAGLEc7nB2ZKaazkLIhTKnvJvaGgI+ELjeo5Hp9PhwoULsNvtuOKKK/w2kwsl/D0fzkVui8XCpOWchU6Xk4UREoRGPHzqtHkzQ+TKhygQyRwuoNfrER0dLZhRAC4gEs8yIA0EH330Eaqrq3kZZpNKpVCpVBgaGkJWVhZKS0s5uci4jHgmJyfR0dGBlJQUUBQVlqTDJSIjIxl9MpqmHQZZidApe5CVfSctpM1eSGsBgpvWcp4hYrffs2eISORkNptDohOo0+kEOQgdCETicQPn2Ry9Xs9LioSiKMafZt26dVixYgVnx+aixkNRFHp6enDx4kVs3LgRVqsVExMTHK0wuOBDyYEclwid5uTkLCt0KqQNRIiCnKFaD7uZBPh0hqi/vx8LCwv46KOPgj5DBCxGPMtpHIYbROJxAVezOf5K23iCwWBAS0sLaJpGeXk5p6QDBN7VRlJ/NE0zAp8XL17kpW50KcGd0CkZglxYWIBEIkFfXx8zyBoqoVOhRTxCWg9Jr05MTCAlJQVZWVlBnyECPm2lFsp54QIi8TjB3WwO14Ztk5OT6OzsRE5ODux2e0AdUu4QSKqNdNU5p/64atG+lL5Ey4EtdLp69WpMT0+jv78fNE07CJ2SiGg5oVMuIaSNHgh9B5krkOYC5xkii8XCNCrwNUME4JKTywFE4mGw3GwOVxGP3W5HT08PpqamGG+a06dP8xJF+JNaYgt8lpeXIzs7O+BjCglCWLtcLkdERAQj+siuD01MTARV6FQknuXhbk2RkZEOM0Qmk4khou7ubqbhhK287c97u9SGRwGReAB4J3vDRcSj0+nQ2toKqVSKzZs3M40KfKTxyHF9WbPZbEZrayvMZrPbrrpwJx4hwPn8OQud6vV6aDQaaDQaB6FTEhFx2dghNOIRWs0J8N4ILjo62mEgmW2IR2aInA3xvDn3Yo3nEoQ7S2pnyGSygMhhYmICXV1dyMvLQ3FxscOXi695G1+Oq9Fo0NraCoVCgaqqKre5aq6IJxSbnZA2WHeQSCSIj49HfHz8EqHTixcvore3FzExMQwJBSp0KjSbaaGtB/DPCM5Vw4ler2eIaHh42KsZIkCMeC4pOM/mLKdA4C852Gw2dHd3Y2ZmBhUVFUx+mItjLwdvSIIt8FlSUoLc3FyP54EPNYTLEb7o7bGFTm02G7N5uRI6TUxM9KmuILSIJ5xSbb6AfUNBlDF0Op1D56PzDFF0dDRjiXCpEY+wPuEggTQQ+DIQ6k/Es7CwgDNnzsBgMGDLli0uSQcIXcRjtVrR3NyMkZER1NXVeaUqzaX+Wyg2PCGkCQNZg1wuR3p6OtasWYNNmzZhy5YtyMnJgdlsRmdnJ06ePImWlhaMjIxgYWHBqxsPkXg8gw/lAqlUynQ9VlZW4qqrrkJ5eTnjQ3T27Fm88sor+Nd//VecO3fO7/3hhRdeQH5+PqKjo1FfX4+PP/7Y4/MPHjyI0tJSREdHY/369XjvvffcPvfrX/86447qKy6riIcte+OPb463Hz5N0xgfH0dPTw/y8/OxevVqj18mPiMed8edm5tDS0sL4uPjfRL4FGs83ICrzT5QoVOhEY9Qazx8r8l5hshut6OlpQWNjY04efIkPvroI5w5cwZXX301rr76atx0003Lrum1117D3r17sX//ftTX12Pfvn3YsWMHent7GQdfNk6fPo3bbrsNTz/9NG644QYcOHAAu3fvRlNTE9atW+fw3P/7v//D2bNnlzQfeYvLhngC9c3xNuKx2Wzo6OiAVqv1WsuMz4jHlXfO2NgYent7sXr1ahQUFPh0HkTiCRx8nT9/hE6FRjyhlqdxBrlZDfaaZDIZqqurUV1djfn5eZSVlaGurg4ffPABXnrpJdx8883LHuMXv/gF7r33Xtx9990AgP379+Pdd9/Ff//3f+ORRx5Z8vznnnsOn/vc5/Dwww8DAH74wx/iyJEjeP7557F//37meRMTE7j//vvx97//Hddff71f7++yIB5/LKmd4Q05zM3NobW1FTExMdi8ebPX8hrBSrXZbDZ0dXVBpVL5LfAZzsQjpA02GHAWOrXb7ZidnXUQOiXXqFqt9knolC9QFCUoV1hi3xHKKEyv1yMjIwM7d+7Ezp07vXqNxWJBY2MjHn30UeYxqVSK7du348yZMy5fc+bMGezdu9fhsR07duDQoUPMzxRF4Y477sDDDz+M8vJy39/MP3FJE08gltTO8BTx0DSN0dFR9PX1+WUTEIzmAp1Oh5aWFkRERGDz5s1+t+SGM/EAwqjxAKEhQZlMtkTodGhoCCqVSjBCp0Kr8ZDvZahFQn1tp1apVLDb7cyMEUFmZiZ6enpcvmZqasrl86emppifn3nmGcjlcnzrW9/yaT3OuGSJJ9DUmjPczdoQB87Z2VlUV1dDoVD4fOxAW7XdgRDaxYsX0dnZiVWrVqGoqCigLzZXJEmi0FCILoYaQiG/yMhIJCQkwGQyYePGjT4JnfKFUEcXzmDvH6GCwWAQhBdPY2MjnnvuOTQ1NQV8HVySxOPtbI4vkMlksFqtDo/Nzs6itbUV8fHx2LJli9+yN1KpdMmxuQBN05ifn4dWq8XGjRtdFhR9BRcRj9FoRHNzM+bn5xlPG4VCwZnESDhAKGk/tkqHK6FTtmUAW+g0JSWFl5sGoc3xkPWEck1EndoXpKWlQSaTYXp62uHx6elpZGVluXxNVlaWx+efPHkSMzMzyMvLY35vt9vx0EMPYd++fRgeHvZ6fZcU8bBncwK1pHYGO+Jhz74UFRUhPz8/4GiK61SbwWDAyMgIrFYrtmzZwtnkc6DEo1ar0dLSgszMTKxdu5Yhxu7ublitVuYOW6FQcC4VI5QNTSgRD+C+q40tdLpq1aolQqddXV2Ii4tzGGTlQiBTaKm2QOrCXIB0Kvoa8URGRqK6uhpHjx7F7t27ASye26NHj2LPnj0uX9PQ0ICjR4/iwQcfZB47cuQIGhoaAAB33HEHtm/f7vCaHTt24I477mAaGLzFJUM8XFtSO4NI5lgsFrS3t0On06G2thbJyckBH5tr4pmZmUF7ezsSExMRFRXFqdwGIR5fu6FomsaFCxcwODiIsrIyZGdnw2KxIDY2lvG0Ia3AGo0GQ0NDkMvlDAkpFApehFQvd3j7OToLnVqt1iUCmVwInQqNeISwHn8lc/bu3Yu77roLNTU1qKurw759+6DX6xmSuPPOO5GTk4Onn34aAPDAAw9g69at+PnPf47rr78er776Ks6fP4+XXnoJABzqgwQRERHIyspidAe9RdgTD2l3nJycxMzMDNauXcvL3YlUKoXRaMRHH32E5ORkbN68mbPuGy7rJgMDAxgZGUF5eTmkUikuXLjAwQo/hT/n1mazob29HXNzc6irq0NSUtKS9+uqFZhYTZM7bC7SckKINoTUwuzvWiIiIpCRkcGkb9m6ZO3t7X4LnQrp3ACht70GFonHnxrPrbfeCqVSiSeeeAJTU1OoqKjA4cOHmQaC0dFRB1LdvHkzDhw4gMceewzf+973UFxcjEOHDi2Z4eECYU087AYCq9WK+fl5Xi5amqahVqsxNzeHsrIyryb8fQEXxGM2m9HS0gKr1coIfE5PT3O+0ZIL1dsNQqfTobm5GdHR0T4NqrIH6lavXs1I0Gs0mqCk5S4XcLXRcyV0KoQIg41Qr8dqtcJisfjdXLBnzx63qbXjx48veeyWW27BLbfc4vXxfanrsBG2xOM8mxMREcFLZ5jZbEZbWxsWFhYQHx+PVatWcf43AlWnZgt8VldXM7l2PmpHZJPy5gs5NTWF9vZ2rFq1CsXFxQFtcGwJ+kshLScUkuSjmO9J6JRYSrsTOg31Ru+MUA+06nQ6ABD9eEINd7M5fLQkq9VqtLa2IjU1FaWlpX6z+3LwlyDYdRNXAp98zNyQ43s6LkVR6O/vx9jYGDZs2LBkNoCLNfiTlhPKZi+EdB9BMFJbriylySDr0NAQk0pSKBSMfqJQ4I8yNZfQ6/UAROIJKTzN5nBJPBRFYXBwEMPDwygtLcXKlSuZgSw+4I/wJrvJgdRNXB2Xr4jH3XotFgtaWlpgsViwadOmoKjqepuWIxBCHSHUf58gFOdCLpcjLS0NaWlpABazCkRfzmw2o7293SGNGkrb51BHYKSxINR1Jq4RNsTjzpKagCviMZlMaG1tZTZOklvla8gT8D3VNjc3h+bmZiQmJnpscuDDwsAT8czOzqKlpQXJyckePX34hru03MTEBNMgQjY1vuZRPOFyi3iWA1voVK1Wo7i4mOma80bolE+EurmA2F6H+jPiGoInnuUsqQkIMQTyRVIqlWhra0NGRoZDrYQcny8fGm8jE7bApzfzQ1xaGBCwazxsjI2Noaenh5O5Ji7BTsvZ7XbodDrk5ORw3i3nz7qEACEQDxs0TSMuLg4JCQkehU7Zg6x81vOEEvFcahA08fgym0M2C3+KgaQmMTo6irVr1yInJ2fJc/iypybHXo54bDYbOjs7odFovJbm4SvVxq4d2e12xujOX+HRYILt+kjmUUiTQrC65YQW8QipmO+8Hm+ETsmNQ0pKCudCp6GOeIhqgZBuDriAIImH7ZtD7si8MWoDfL9QjEYjWlpaQFEU04bs7vihinhIS3JUVJRPqtd8CXqS4xLpG4lEEpDwaLDg6hqKiIhw2y134cIFZnCS3GFfatpyQot4luuycyV0Sup5vb29MJvNnAqdCiHiudTcRwEBEo+zJbW3Oknk4vAlKpmenkZHRweysrJQWlrqkbBI2oqPC9ET8bAFPn1tSeZT9Vqr1aK3txdZWVkoKysT1F2zJ3giYk/dcuPj4+ju7kZ8fLxDG7C/d8NC2eyFRDz+WBA41/OchU5pmnZIy/kqdCoE4rnUOtoAgREP2x0U8E0R1peWaoqi0Nvbi4mJCZSXl2PFihXLvoadyuP6QnQVTdntdvT09DATx+5ssz2BkCWXmws5XldXF9auXYuVK1dyclwhwrlbjp2W6+npgdVqRVJSElJTU5GSkuJ195XQUm1CIR5/vvds8CF0arfbQxrlisTDI7jyzfGGePR6PVpbWwEsSkR4W7hjR1Rcd2s5E4TBYEBLSwuTwvK3i4fdgcbF5kKkbyiKwvr1613WwoSMQM+Bu7ScVqtl0nJkU1suLSeUzV5IxEMImasbOy6EToUQ8YipNh7ApW/OcsQzOTmJzs5O5OTkoKSkxKcLijyXL6dQcmy1Wo22tjZkZ2ejtLQ0YO8cctxAvzxs6ZvIyEhO7sJIrUgoG58v8JSWm5iYQHd3N+Li4hgSYqflhBbxCCVNSr5bfF0P/gidhrq5QCQeHrDcbI6vcEc87LTV+vXr/Zqkl0gkvHW2kS9+X18fxsfHsW7dOq/Sf94eN1CydJa+OXHiBCebZ7iSjis4T+eTTU2tVjuk5RQKBSwWi2DIR0ifQaCpNl/hjdAp2Zd8ETrlEmKqjUN4O5vjK1wRD7F8lsvlAaWtyPH5iHiICZxKpfLYWecrvJG38QSKohgyZEvfhLP9dbDWzd7USNGb1IfUajUAoLOz06u0HJ8QGvGE0nTNldBpW1sbDAYDGhsbmVTqckKnXEKv1zMKD5cSQkI8EomEF98cZ+KZmJhAV1cX8vLyUFxcHPCdFJ96cABQUVHBaVjtbtjTG5jNZkbBoaGhweGuK5yJJxRgF71XrlyJ4eFhaDQaxMTELJuW4xtCIh4hpf2I0GlERARWrVqFtLQ0zM/PQ6PRMEKn0dHRTJNCSkoKZzYpbIipNo7BxxeLEIPNZmOGGv3tCHMFLtuTaZrG0NAQhoaGUFpaiq6uLl5Ugv0hidnZWTQ3NyMlJcWl9A0fUjzBgFA2WIlEgqioKBQWFqKwsJBJy5FZFIvFwqTl+NYqE5LVtJDWQkDSbVKpFMnJyYzmH1vo9MKFC+jo6GCETlNSUjhTwPDHfTQcEPLmAi4hk8lgMBhw5swZREZGYsuWLZyGw1xFPETgU6/Xo76+HomJiejt7eUlivCFLNmSPMXFxVi1apVbW2Qx4vEfzufOU1qOaJWxLR+4TMsJKeIJdQeZK7hrLvAkdNrV1QWbzcbJzYMomSNw0DQNk8mE6elpFBYWYvXq1UEd9PQWREgzMTERDQ0NTHjOZ+OCN2u22+3o6uqCUqlcVpKHCw04oWx2QoNzWo6iKCbFw0daTiQez/B2TWyhU9JqT6LY4eFhpkGBREQxMTFeGymKEQ+H4PJit9ls6OjowPz8PDIyMlBcXMzZsdkIJOKhaRqjo6Po6+tzKaTJp8rAciRB5oakUqlX0jdcRTyh2PCEEKn5stmzUzyu0nJmszkgCwEhEY+QajwE/mg/slvtyc2DP0KnpMHhUuxqE9an7Afm5uZw+vRpWK1WrFy5ktfuIH+jEpvNhtbWVgwNDaGmpgYFBQVLvux8Ec9yx1WpVDhz5gySk5NRV1fnVWpSTLWFDiQtV1paioaGBtTX1yM9PR1zc3NoamrCqVOn0NnZicnJSZjN5mWPJyTiEWKNhwsjOCJ0WlBQgKqqKlx11VUoKSmBXC7HyMgITp06hY8//hgDAwNQq9UOe4zBYPCrueCFF15Afn4+oqOjUV9fj48//tjj8w8ePIjS0lJER0dj/fr1eO+995jfWa1WfPe738X69esRFxeH7Oxs3Hnnnbh48aLP6yII21QbO4IgRdrBwUEYDAbe/qY/7dQLCwtoaWlBdHS0R4HPYBMPu7nBnSK3O4Qr8QhpU+NiLcul5Xp6ehAbG+sxLSc04hFSxEPURLhuhPJG6PTo0aOMErevN9OvvfYa9u7di/3796O+vh779u3Djh070Nvby8wssXH69GncdtttePrpp3HDDTfgwIED2L17N5qamrBu3ToYDAY0NTXh8ccfx8aNG6HVavHAAw9g586dOH/+vF/nICxTbVarFR0dHZidnUVNTQ0ztMenWRvge8RD2rnz8/NRVFS0rHdOsFJtVqsV7e3tWFhYYJobfAFfa71cwBdp+5OWE4nHPdgjH3zCldDp8PAw3nrrLRgMBmzfvh3XXHMNtm/fjuuuuw6FhYUej/eLX/wC9957L+6++24AwP79+/Huu+/iv//7v/HII48sef5zzz2Hz33uc3j44YcBAD/84Q9x5MgRPP/889i/fz+SkpJw5MgRh9c8//zzqKurw+joKPLy8nx+z2EX8ZDifEJCArZs2eKQG+WbeLyNeIhHzfT0tNft3HwNpzqTxMLCApqbmxEbG4uGhga/TLTCNeIBhFHjCRa86ZajKAparRbx8fEht7UQEgkCwVdSAD6NYu+++27867/+K9LT0/H666+jtbUVf/3rX6HX6/Hd737X7estFgsaGxvx6KOPMo9JpVJs374dZ86ccfmaM2fOYO/evQ6P7dixA4cOHXL7d+bm5iCRSBws5X1B2BAPTdMYHh7GwMCAW5dLIUQ8/gp88hnxkONOTk6io6PDqwhsuWOKkjn+IxTv211arq2tDWq1GuPj48um5fjG5RrxuINOpwMANDQ0YMeOHfiP//iPZV+jUqlgt9uXyIJlZmaip6fH5WumpqZcPn9qasrl800mE7773e/itttu8zlbQhAWqTYy96LT6VBbW+uWZYMR8Xg6/vT0NNrb2/0WIeUz4unu7sbExAQ2btzoMs/rCwIlHpqmceHCBfT39zPukampqUhMTOT1Sy4kkgv1WkhaTi6Xo6SkBPHx8W4N1VJTU3kdYiUQGvFwpSHpL3Q6HXPDIBRYrVZ88YtfBE3TePHFF/0+juAjHo1Gg9bWViQnJ2Pz5s0eZSmCEfFYLJYlj7M1zdatW4esrCy/js1X3WRwcBASiWSJ9I2/CIR47HY7Ojo6oNVqsWHDBlgsFmg0GkaUkdxxp6amhjz1czmAtDA7C2ayLR9GRkYYEVTy+fDx2QitndqfVmouQVqpfTknaWlpkMlkmJ6ednh8enra7b6UlZXl1fMJ6YyMjOCDDz7wO9oBBEw87K6rkpIS5ObmemV/Hewaj8lkQktLC+x2e0AbOx/Eo9VqMTc3h8TERNTW1nLmI+Qv8RiNRjQ1NUEul2PTpk3M50mG7sisw9TUFPr6+hATE4PU1NSQpX74gpDqTO7Sfs5puYWFBajValy8eBG9vb2IiYlhSCglJYWTz0Zo7dRctFIHAqJa4Ms5iYyMRHV1NY4ePYrdu3cDWDyvR48exZ49e1y+pqGhAUePHsWDDz7IPHbkyBE0NDQwPxPS6e/vx7Fjx5iOPH8hSOIxm81oa2uD0Wj0qesq2DUelUqFtrY2pKenY+3atQF9+bjWgSPSN7GxscjOzubUvM6ftarVarS0tGDFihUoLS2FRCJxiB7Zpl35+fmw2WyMrQDRLyMdWampqT5/IQmEsukLZYP1pt5E5lCSkpKYbjmiU9bX1+eQllMoFEhISPDr/Qkx1SaEiMdX7N27F3fddRdqampQV1eHffv2Qa/XM11ud955J3JycvD0008DAB544AFs3boVP//5z3H99dfj1Vdfxfnz5/HSSy8BWCSdL3zhC2hqasI777wDu93O1H8UCoVfDUqCq/EQtebU1FRUVlb6tGEGK+KhaRqDg4O4cOECysrKOLF/5koyx263o7OzEyqVCtXV1RgZGeF8s/Ul4qFpGiMjI+jv70dpaSlyc3OZxz1BLpcjPT0d6enpDm6farUaQ0NDiIiIYKIhhULBuSssnxAK+QH+NTpEREQwnw0AB3mYQNJyQiOeUEc8Op3OLw+gW2+9FUqlEk888QSmpqZQUVGBw4cPMw0Eo6OjDu9r8+bNOHDgAB577DF873vfQ3FxMQ4dOoR169YBWBwL+etf/wpgUUGfjWPHjmHbtm0+v7eQflvZGxhFURgcHMTw8DDKysqQk5Pj8wmXy+UMMfBxRymTyWC1WtHY2AiDweDXDIw7cBHxGAwGNDc3QyaTMdI3o6OjISMeQoJqtdph3srX4zi7fZLBOqIM3NnZicTERCYacnfHLZQoAxDOWrj4rpC0XE5OjoM8DLEPYKflXNlLs9ciJOIJNRH6q1oAAHv27HGbWjt+/PiSx2655RbccsstLp+fn5/P+R4iiNtEk8nEeL9s2rTJb1E8cpHY7XZe7oCNRiOjB8cW+OQCgUY8SqUSbW1tTCqLnAs+akfeEIbJZEJzczOAxRwy1yrh7Mlvk8nERENjY2OQSCRu1ZyFFG0IAVzfpLHTcgUFBUzKVKPRMPbS7tJyoU5tOSPUttc6nU5QHW1cIuTEQzbMjIwMVFdXB0QY5LVcEw9JFw0ODiIiIgIVFRWc37G665jzZm0k7VdeXo7s7GyH3/PhnbPcMbVaLZqbm5Geno7y8nLe7xqjo6ORnZ2N7OxsB9mY8fFxdHd3Iz4+HqmpqYwESqghpPklvtfCTpkCcBhiHR0ddVBttlqtvJip+YtQRzyXqgkcEELioWkavb29GBkZcblh+gNifMZlncdms6G9vR1zc3NYs2YNRkZGePmi+hOZWK1WtLW1QafTuU37cWFh4AxPEc/o6Ch6e3u97kTkGs6yMaRdW6PRQKlUwm63o62tjakPBWKFHgiEQDyEiIO5lpiYGOTk5LhMy83NzSEiIgI2m23ZtFwwEOoITCQeHiCRSBAREYGGhgbOTq5EIuG0wYDIy8TExGDz5s0wGAy4cOECJ8d2hq/EQ9YWFxfncb6Jj1Sbq7QgGVKdnp5e1s8nmIiMjERWVhaysrIwMTGBixcvIikpiZGn56MteDkIIeoCPl1HqEjQOS3X1tYGuVwOmqaXTcsFA6FuLrhULRGAEKfaVq9ezfmmyBXxkDRNQUEBVq9eDYlEApPJxFvXnC8EcfHiRXR2djqszR340FVzPqbZbEZzczMoikJDQ0PIoojlIJVKIZfLsWrVKqxatcqh/kDagpOTk5loyJ+OIm8hlIgHEMZaCBISEpjOR+e0HACH2h3fA8ZCSLVdiiZwgABqPFwjUOIhTpwzMzOorKxkrG3JsflSF/CGeCiKQm9vLyYmJrwWH5VKpbBarVwtE4Aj8czOzqK5uRmpqakoLy8XVHHYFdiE6dyyTTY6dss26ZRLSUkRVP2BCwiNeJw3ek9pOV+65fxFqJsL9Ho9VqxYEbK/zydC3k7NNQIhHr1ej5aWFshkMmzZsmXJHRUhBz7y4suRmtlsRktLC2w2GzZv3ux1twufzQXE9qG4uBirVq0SzAbmD1yJaDq3bCckJDDRUGJiot/vV0y1uYanCCOQbrlA1hPKmw0x1RZG8Jd4pqam0NHRgZUrV2LNmjUuvwDk7oePoqOniEer1aKlpcWvqIKP5gJgMdJRKpVLosJLBVKplNnEioqKYDaboVarodFoMDY2BgBMNOTcsr0chNLVJjTi8eW8LNctB8ChdudP+tdut4dUL9BgMIjEEy7wlXjY6avlBD7Zc0LBIB62y+qaNWuQl5fn8ybBdXOBxWLBxYsXYbFYfIq83CGYm3AgfycqKopp2aZp2sHpk7Rss9M+QhqEdAehEU8gNRV2Wo79+QSSlhNCjUfsauMBoU61+SrwyY54uIYzQSw39e8tuGwumJ+fR1NTE1P7uFSH25aDRCJxSPtYrVbmbrurqwt2u92hScHVeRLCZn8pEQ8bzp8POy03MDAAo9HoldKFSDz84bKNeFQqFVpbW5GZmYmysjKvIhg+5oQI2MRDpG/kcnnAU/9cRTykk2716tWQSqXQaDQBHzMU4CPtGBER4WBdrNfrmbmh/v5+REdHM5tccnKyoGo85JoWAviSzPGUliNpU7a2HEnLhbK5gOgTisQTJliOeGiaxsDAAKMJ56vAJ98W1UqlEq2trX6ZyXk6rr+gaRp9fX0YGxtjOun40H+7VCCRSBAfH4/4+Hjk5eXBbrcvKYJHREQgLi4OCwsLQTFYcweh1JoIgmWL4JyWI5YPxI6D3CiYzeaQXuc6nU4kHj4Q7FSbxWJBa2srjEaj35pwfClgSyQSWK1WtLS0cKbkQI7r75eHnC+TyeSQiuSjU+5ShUwmQ1paGtOAYTQa0dHRAbPZjKamJshkMocmhWB2UQmReIKd2mLbcZC0HOlmNJlM6OnpweTkJBMNBdLN6CvEVFsYgShIO4N0hqWkpPhst8AGV/YFbFitVvT09ICiKGzZsoXToTF/Ix6ijBAfH4+GhgaH88XHUGowIIRNNiYmBrGxsYiLi0NeXh7m5uYYOwFXKtt8bsQi8SyFXC5nbhTUajUKCgpAUdSyaTmuQVK2IvGECWQyGUwmE/Mz2w+Gi3kTrlNtCwsLaGpqYi5grieV/YlOpqam0N7ejvz8fBQVFS05X3y1aF9OkEgkjG9NSkoKVq9eDbPZzNQe2traQNM0UlJSmGiI69ZeoRGPEG0RYmJikJSUxHQzkiFWIrlE0nKkbZurIVaTyQSKokTi4QN8p9qsVis6OjowNzeH2tpaJCcnB3x8LiMetvRNTk4OTpw4wfldny8kwa5/bdiwgTGOcka4RjyAMIY33a0hKioKK1ascLACV6vVTEtwbGwsEw0lJSUFXPgWGvEI3fralUsuScsNDg46dMuRIVZ/v8t6vR4AROIJFxDimZ+fR0tLC2JjY7F582a/7FndHT/QiIeiKCZ3TAr2xBKBD+LxZr1E6Vqv1y9b/+KCeITUTRUKLPfenWsPVquVsQLv7u6G1Wp1SPn4YwUuJOIhStlCi3g8rYedlgM+9YXiIi2n0+kglUoFq3sYKC5J4jEYDDh37hwKCwtRWFjIudFVIBGP8+wQmfEgF3goTNt0Oh2jwu2NwV24RjxC2mR9RUREBDIyMpCRkcG02qrVaqjVagwODiIyMtJBV87bAUmhnBNy3QuFeGia9lmhhO0LFWhajqgWCOXz4RqXVKrNbrdjfHwcRqMRNTU1jEMllwgk4vEkfcMX8SwX8czMzKCtrQ25ublYs2aNV58JH1YLlxsCufbZVuCkZds55UN0y1JTU922bAst4gGEQzyBEmGgaTmdTndJE48wPmUOoNfrcebMGVgsFkRHR/NCOoB/EQ9N0xgeHsb58+exevVqrF+/fsmdFJ/E4+oOmziXtra2ory8HCUlJV5f5OEa8QDCqPFwDWIFXlxcjE2bNmHTpk3IzMxkGldOnTqFzs5OTE1NObjcCol4yHUvtPVwNUBK0nJr1qzBpk2b0NDQgBUrVkCv16O1tRWnTp1Ce3s7JiYmcOHChYAEQl944QXk5+cjOjoa9fX1+Pjjjz0+/+DBgygtLUV0dDTWr1+P9957z+H3NE3jiSeewIoVKxATE4Pt27ejv7/fr7URhDzVxsUmRgQ+c3NzkZaWhvb2do5WtxS+Rjw2mw2dnZ3QaDTLSt/wMZzqqquNuKrOz8+7dS5d7piX4gYeLPB97pztBObn56FWqzE2Noauri4kJCRAoVCE1N3TGUJLtZGbS77W4y4tNzo6is9//vNMtPPWW2/hM5/5DJKSkrw67muvvYa9e/di//79qK+vx759+7Bjxw709vYiIyNjyfNPnz6N2267DU8//TRuuOEGHDhwALt370ZTUxPWrVsHAPjpT3+KX/3qV/if//kfFBQU4PHHH8eOHTvQ1dXld6elMD5lP0FcLzs6OrB+/XqUlJQgIiKCN7M2wLcBUr1ej7Nnz8JkMmHz5s3L6q3x5RbKPqbBYMDZs2dhtVrR0NDgM+kA3BGPVqvF7Oxs0NJ2QrmbBoK3FmIFvnr1atTW1uKKK65Abm4uTCYTRkZGYDAYmDtto9EYlDW5Aqk3CeUzIo0FwVgPScvl5+ejoaEBAwMDuPnmmxEZGYlHH30Uqamp2LJlC4aHh5c91i9+8Qvce++9uPvuu7F27Vrs378fsbGx+O///m+Xz3/uuefwuc99Dg8//DDKysrwwx/+EFVVVXj++ecBLN4k7du3D4899hh27dqFDRs24JVXXsHFixdx6NAhv9+zcG55fITRaERLSwtomnZQSZbJZLDZbLz9XW/JgdROfJG+4YN42BEP0afLzs4OSI4nUOIhMjyjo6NMKtBfi4FwRCijRbYV+PT0NC5cuICEhIQlVuBEVy5YWmVC62gLpe11cnIy1q5di5GREfzjH//A6Ogojhw54lE5H1hUGmlsbMSjjz7KPCaVSrF9+3acOXPG5WvOnDmDvXv3Ojy2Y8cOhlQuXLiAqakpbN++nfl9UlIS6uvrcebMGXzpS1/y6z2GnHj82cSUSiXa2tpcCnzKZDKmI4WPC0cmk8FsNrv9PXsWZt26dT45CPIV8dA0jaGhIQwODmLt2rXIyckJ+Jj+rtNms6G1tRV6vR51dXWIjIyETqeDWq1mLAZIKigtLS2oEiXBhFDek1wuR35+PlMAJy3bvb29sFgsSE5OZojIn5ZtbyGkDjsg9CoK7BpPXl4e7rnnnmVfo1KpYLfbl8zfZWZmoqenx+VrpqamXD5/amqK+T15zN1z/EHIiccXsDd1dxso27qAjwvH06ZrsVjQ1tYGg8HglxYcH8RDSH1kZAR1dXVe54o9wd+Ix2AwoKmpCdHR0WhoaACweGdJJOwLCwthsVgY++nW1lYAnxqupaamBjyPJdamPoVzc4GzFbjBYGDmUvi2Ag/1Ru8MIdheX6rDo0AYEY/ZbEZbWxtMJpPHTZ1cLDabjZfiqbsaz/z8PJqbm5GQkODVLIwrcE08RqMRTU1NAID6+nrO/HP8IR61Wo2WlhaHNJ8rTT12KogYeqnVaoyPjzPRECGhcI2GhEJ+ntJb7Jbt3Nxc2O12zM3NQa1WM1bg3njaeAuhEU+o1+NPV1taWhpkMhmmp6cdHp+ennabpiMpV3fPJ/+dnp52yN5MT0+joqLCp/WxEXLi8eZi9UXgkxQE+WowcEUOExMT6OrqCnhglUviIRt9ZmYmdDodp3envhLP6Ogoent7fbahYBt6kWiIDE2Oj48DAFMX8iYaEhJJCWEtvrRTExVthUIB4NMpfdItJ5FImN/7U6cTWo2HD3t7X6DX6302f4yMjER1dTWOHj2K3bt3A1h8H0ePHsWePXtcvqahoQFHjx7Fgw8+yDx25MgRJiNRUFCArKwsHD16lCGa+fl5nDt3Dt/4xjd8fl8EISceTyDzLwMDAz5ZP/PlmUOOTUjNlfRNIOCCeNh22aWlpcjJycH4+Din58Nb4VH2+amurmY2LX8RGRnpoGUWrtGQkCIef88Rux2YoihGV87ZCpzoyi1HKkKr8YSyuQBYTEvn5ub6/Lq9e/firrvuQk1NDerq6rBv3z7o9XrcfffdAIA777wTOTk5ePrppwEADzzwALZu3Yqf//znuP766/Hqq6/i/PnzeOmllwAsftcffPBB/OhHP0JxcTHTTp2dnc2Qmz8QLPFYrVZm1sRXgU8+O9vIACmRvqEoykH6hotj+wu73Y6uri6oVCpmZohsclxudt5EPMTLx2w2c3Z+nNfgKRoid+AkIuJKq48rCGGT5WqAVCqVLvksSJNCZ2cn7HY7o1mWmprqUn8s1KktZwgh4vFngPTWW2+FUqnEE088gampKVRUVODw4cNMcwDpJCXYvHkzDhw4gMceewzf+973UFxcjEOHDjEzPADwH//xH9Dr9bjvvvswOzuLK664AocPHw5ILV2QxDM3N4eWlhbEx8f7JfDJl1kbObbFYsHp06eRnp6OtWvXcnaBBhLxmEwmNDc3A4CDXTaZjeAy4iEXrruNS6fToampCfHx8di0aZPb1CiXmy87GnI1NJmYmIiYmBjYbLaQT+xfChGPJ0RGRjpYget0Omg0GszMzDBW4OSGICUlhelEFRLxhDriCUS5YM+ePW5Ta8ePH1/y2C233IJbbrnF7fEkEgmeeuopPPXUU36txxVCTjzsC5+maYyPj6OnpyegeglfxEPTNJRKJYxGI9auXYvc3FzOBUj9IQhSA0tLS3NJhFwTD3nPrjYuYt2dl5eH4uLikGzwZGiSDE4Sn5uLFy/CZDLh1KlTDp1ywXT9FBKCkd6SSCRISEhAQkICVq1axWiWqdVq9PX1wWw2Izk5GREREaAoKuQ3BQShjsDErrYgwWazMWmiqqqqgLTW+CAem82Gjo4OqNVqREZGIi8vj9PjA/4Rz9jYGHp6ejzWwLg2bmMTDwG7HseldTcXID43kZGR6O/vR2lpKdRqNUZHR5loiJBQoN1Z3kAom2so1uFsJUBaticmJqDX6/HRRx8x0VCwrcDZENup+YUgiEen06GlpQURERHYvHlzwE6LXBOPXq9Hc3MzIiMjsWHDBrS1tXF2bDZ8IR4iFzQ1NbUsUXPdpu1MPBRFobOzEyqVyqdZoVBsvhKJZEk0RGpDpDuLkFAoN75gQAgEGBsbi9jYWNA0DY1Gg9zcXMYKnK0rF+yGkVBGPGSGSiQeHqFWq/Hxxx8zqRkuPmy5XM4Z8RDpm5UrV2LNmjUwGAy8dsx5c2yz2cx4+mzevHlZsyiuRT3Jl5+iKJjNZjQ3N4OmaYfaklDhfB6ioqIcurPm5uaWbHx8REOh3vABYRAPAU3TS1q2SYqU3T5Pfp+amsqrtBJFUSEVURUjHp6RkJCAjRs3ulRO9Rdc2FPTNI3+/n6MjIw4SN+QY/PxpfWmFjM3N4empiYoFAqsW7fOq3QA1xEPuTmYn59HR0cHUlJSvF6LkCGVSpGSkoKUlJQl0dDo6CizMQYaDV3qzQX+wFW9ydkKfH5+nqnVEStw8lkkJydzGqHY7faQdkKKxMMzoqKiOCUdIPBUmyfpG7K58vGllUqlHtvAyaBqUVER8vPzffLP4SPV1tzcHFATCLE7DhZ8XaOraEitVmN4eHhJbcid2RpXa+EDQiMeT8TBbp/3ZAVOiCgmJiZslRRomhaJh2/wceEHQjykldud9A0hHj7aLUmrtjMoikJvby8uXryIyspKpjDrLbhsLiAGcgBQWlrq15BbOIIdDRUVFTlM7o+MjPgUDYkRz1L4utE7W4Hr9XpoNBoolUr09/cjKirKoWXb17RZKJsLDAYDaJoWiSfcIJfLPSpIuwOZgF+9ejUKCgrcdogBixcm14VnVykxi8WClpYWWCwWvwcxuUq12e12tLe3Y25uDgA4cXkN9aCev3Ce3OcyGgoWhEQ8gczxSCQSxMfHIz4+nrEC12q1PluBsxHKiEev1wOASDzhBl8jHnaH2HIRBdGC46PBwJkg5ufn0dTUhKSkJFRVVfld7OSiucBkMqGpqQkymQwNDQ04fvx4QOeApmmmVmaxWCCVSpl/fIKPaMNVNERqQyQaYnfKAcJJtQmF9Lm8AZHJZA4t20ajEWq1mmkaYTcxuFO1COUAqV6vh1wuv6R9qUJOPHx8AX1pLiAT/8RQbrkOMV+P7wvYxDM5OYmOjo6AhUedj+sPZmdn0dzczCg1EPL1dxMnpAN82slH/pH1EsUFIU2ze4vo6GgH6+nZ2VloNBpG1VkikWBmZgbR0dEhjYaEFPFQFMVb63pMTAxWrlyJlStXOnQukjku0rmoUCiQmJjIfF9CRcp6vR6xsbFhee17i5ATDx/wtp2aeL5kZGQsMZTzBL5ESAmh9fb2YmxsjLNuv0CIhzQ0FBcXY9WqVcxG5W/diE0yMpmMieIoioLdbmem18l6CflwQUKhUlEgd9ZFRUWMVQX5r1wud6gNBbOFV2jEE4yN1lXnIvEcam9vB03TSElJgcVi4dXJ2BN0Ot0lnWYDBEI8XM+ZLJdqY0/Z+1Mg5yviIRpjZrMZmzZt4uzi8+f8EnvqsbExl+lHX49JOtjIeXP2s2en2Qj5ECJin2v28zxuVHY7YDBAYjAAOh0kBgMip6ag6O2FXKUC9PrF3xkMkOh0i/8lj+n1kOj1oAoKYP7Zz7x+j94gJiaGcf1UKBSMfMzQ0BA6OzuRlJTEpOXi4uJ4JQYhEU+otNqcW7aJyrZKpUJ3dzdGR0eZG4dgWYEHotMWLhAE8XANT8RDpG9mZ2d9Vr1mH5/riGdhYQEDAwMAgE2bNnGadvA14mHbUzc0NLj8EvhCPOx6DnmtRCIBaBowGhliIGQgZf0MgwFYWACt04H+JyEQYpAYjZCwCINNGhKTack64gB4dq13RHdMJd4pisDXv77UsI4LsKOh4uJih1rEhQsXGMfPtLQ0vzqzloOQiEcItggSiQSJiYlITEzE+Pg4ysvLYbPZoNFo0NPTA6vViuTkZCY65csKnBBPqM8Hn7isiIdI80RGRvqlek3AdcQzPT2NtrY2pKenY2FhgfNcty/NEMSeOioqarGdXC4HTKZFEmBt/Iq2NkSqVJACDEFI9HqAFT2Q10CnQ4RTNAESbfDcWkxLJEBcHOjYWNijo2GSyRCbng76n48hLg50XBwQG7v4c3w86NhY/On/kvDG6ZUoGuXnLtzVpsKuRbAdP9mdWVxGQ0IjHiHVNCiKQlRUFBQKBdOybTAYmKaRwcFBREZGOliBc3VjIEY8QUIwUm3T09Nob29Hbm5uwNI8XEU8NE1jYGAAw8PDWL9+PeRyObq6uvw7mNXKbPJMtPDPTT61sxNxAKRxcYtpJTdEYZ2bg0ylwhU2GyKt1kVy0OkgcfFe6wJ760tAx8Q4kgD5b3w8QAiCEMM/f0fFxICOiwMVE8P8YxOKJD4ekthYSP+ZHtFqteju7sbmzZuXXc+PX4jDMKQ4uNXA8Tv1rrOO3XnFjoaI9XRERARDQv5uekKIMgiEZItAInT2ethW4KRlmzSNkBsD0kKvUCgCklcSiSdMwSYetvTN+vXr3XqP+wK/Ix67nSEE+/w8+ltaYFarceXKlYg9dw76mRlk9/VB1tT0KTmwiAJ6PVOPYEcf0OshsbpPBxV7ubyof/5zBzoqCvjnpm+QSBChUECemLhIBKx/dFwc6JgYUP/8L+LjIWEThxORIDYWCGDTkQCQAZCwGhcoigJF04vn/J+biLc3NyMjEgwPSyGX09i8mR9fJ183JedoiNSGyKZHUkCpqalep4CEFvEIZS3kOvFUz2G3yJMbA9KkMDIywqRR/TEiFJsLwhSEeIgLpslkQkNDg3cfJkUt1h3cRA/Q67GiuxuJMhlkERGO0QOJENwRhVPdYaPTn07+579AQMvlDgSAuDjoASAuDrEZGZ9GD+Q5sbGYWliAxmxG3tq1iMvMZJ7DJgnExQGsu+qzp06hpKRkid23cxMBU88JAtw1KJA1mUwm0DQNq9XqsVPuxInF91ldTYGllsQZAo3u2Zse8Km1AGlS8DYaEhrxCCXiYTfAeIuYmBiHFnpnI0Kisq1QKJa1Ar/UlakBgRCPzxc/TQNm82KaiFU7IEQRNTuL3KYmjP/tb8gDkJWQAOlf/7o0zcQmFFb303Io8u9tfrp8iQRUTAykiYmfppXi4mCLjobGZEJ6fv4iKbDTTM5RBYkWWKklxMcDLu6sBrq6IJPJUFJS4vA42566qqpqUZ7ey/fgKj3K7kQjhBOqjY18scldK3G/zM/PBwCXnXLkNSdOLL5m61b+2mm5PC/EWsA5GhoYGIDJZHIbDYnE4xrseTJ/4GxEaLFYmGioo6MDFEUt0ZVjQ0y1BQqL5dMCM6knuPhZsrAA2cKCY/rIVZqJTRYeaiwRACo5WD6zoZNawz//f85uhzQhAfGZmUy9wRUJsKMFOjYWwyoVBqemUFZZieycnCV/T6fT4ZPTp/HZz36Wg9V/ClfNBd7aU3s6prMRHJt0hLKJAIs+88SgLjMzc0m7Nnt4VSKR4sMPCfHwk2bjU6vNVTREOuWGhoYQGRnJ/F5o6S2hXDN2u53TazgyMhJZWVnIyspirMDVajWmp6fR19eHmJgYKBQKxMfHIyEhATqdzmc9RlfQaDS4//778fbbb0MqleLmm2/Gc8895zGaMplMeOihh/Dqq6/CbDZjx44d+M1vfoPMzEwAQGtrK/7rv/4Lp06dgkqlQn5+Pr7+9a/jgQce8Glt3u82P/+5W+Jw+7OHugMbgXTGM3WHf0YFRqkUJpkM1qgoKHJzIUtIWBIxuIsWHNJKHuoOQx0diIyMxJo1a7xao81mW9Q40+lQe9VVSExMdPk80vbM9Z2oc02KC3tqNpmxN3Hn+ZxQgswiTU5Ooqqqimmdd46G2MOr3d1STE9LERNDo7LSBLudm+HVUIFEQ7m5uQ7RUH9/P4xGI2w2G6xWq0+1IT4gJBLkM/piW4Hn5+fDZrMxunJ/+tOf8MwzzyAhIQE1NTXo7OzE2rVr/T4vt99+OyYnJ3HkyBFYrVbcfffduO+++3DgwAG3r/n2t7+Nd999FwcPHkRSUhL27NmDm266CR999BEAoLGxERkZGfjTn/6E3NxcnD59Gvfddx9kMhn27Nnj9dq8J57vfMfrpy79K3Jmo2f+sX6m/tnKykQP3qaZYmOZuoPRaERLSwsAoKKiAqdPnsSWLVt4CVl90YIj7cnetHDzZbkglUphtVo5tacmxXqhkg4RNNXr9airq/MorspOs50+vfgZbNpkQ1SU55RcIAjFeXKOhs6dO4eEhASX0VBKSkpQJWOElmoL1nuXy+VIT09Heno6vvOd7+Bzn/sc7rnnHoyOjqK2thapqam47bbb8NOf/tSn43Z3d+Pw4cP45JNPUFNTAwD49a9/jeuuuw4/+9nPXH735+bm8PLLL+PAgQO4+uqrAQB/+MMfUFZWhrNnz2LTpk346le/6vCawsJCnDlzBm+++SZPxPPlL7sljmV/Xqajg7bbA5KncCV9w7X9NRvL+eYQqFQqtLa2Ijs7GyUlJct+sdiFcS6/hBKJBHa7HR0dHT7bU3sCRVHMeRAS6RBXVLlcjrq6Op/mokh9Z9s2GtHR0UukfMj7DUTKRyi2CFKpFGlpacjIyGAUndVqNfr6+mCxWBxqQ4H62ywHIRFPqARCpVIpNmzYgBUrVuDWW2/FV77yFZw6dQrT09M+H+vMmTNITk5mSAcAtm/fDqlUinPnzuHGG29c8prGxkZYrVZs376deay0tBR5eXk4c+YMNm3a5PJvzc3NMeK33sJ74vl//8+nAwcD7Dv4srIyrFy5kvkdn8Qjk8k82i54WpcnsImHS1AUBZVKhdjYWE7sqUlEptVqkZSUxPum5At0Oh2am5uRkpLCCJp6C5sNOHlykXg+85lPC8zsz4X9L5BoSAjni11XYSs6k2FJ0ik3MDDA+NvwFQ0JqcYTaqsOYgIXHR3tQAK+YGpqaonOI9EFnJqacvuayMjIJWoumZmZbl9z+vRpvPbaa3j33Xd9Wl94drWBVTeZm3N5B8838bgjB7vdjs7OTqjVap8lefggnvn5eYyOjjJ3/4F+oUhqLScnB6Ojozh9+jTi4+ORlpaG9PR0JCYmhmxTVavVaGtrQ15enl+K3q2tUszNSZCURKOiYuln4Kpdm5CQL9GQUCIedyld9rAkqQ15iob88YhyhpBqPKG0RAA8t1M/8sgjeOaZZzy+vru7m49lLUFHRwd27dqFH/zgBz43RAmCeHwFuauNjo52WzfhO9Xm6thGoxHNzc2QSqXYvHmzz34apP2YK+KZmppCe3s7EwZzRToURSEzMxNZWVmwWCxQq9VQKpVoamqCRCJhSCg1NTVoasvj4+Po7e3F2rVrsWLFCr+OcezY4mZz5ZV2LHeq3DUoEDJaLhoSwibrbS3RVTREhDQHBgYQHR3NkJA/QpqkViikiEeottcPPfQQvvKVr3g8RmFhIbKysjAzM+PwONGdczdET77Ps7OzDjfM09PTS17T1dWFa665Bvfddx8ee+yx5d+YE8KOeKamptDR0YHc3FysWbPG7Rcn2BGPRqNBS0sLMjIyfE7xsMGFWyixp75w4QI2bNgAi8XiV57Y+ZiumggiIyMZdV/idaJUKjE4OIj29nakpKQwmxYfjR5Edmh8fByVlZU+55rZOH6c1Hd8P/+ehlcd27UlDrYPoYQ/TSzO0jE2m43plOvt7YXFYkFKSgozte9NNBTo3AzXCKXtNQCPxEMaEZZDQ0MDZmdn0djYiOrqagDABx98AIqiUF9f7/I11dXViIiIwNGjR3HzzTcDAHp7ezE6OoqGhgbmeZ2dnbj66qtx11134cc//rGvbw9AGBEPRVHo7+/H2NgY1q9fz/SVu4NMJuPNT4Md8dA0jdHRUfT19aGkpAR5eXmcHdsfsO2pN23ahISEBIyPj/u90ZG7UbJ5emoiYHudrFmzBgaDASqVCiqVCv39/YiJiWFIKCUlJeCNhqQ15+fnUVdXFxCxmc3AmTOL69m2LbAbFk/R0NzcHHNdWq1WJh0Xik2Xi+5JuVwecDREUo9CIZ5QNzp4Ih5vUVZWhs997nO49957sX//flitVuzZswdf+tKXmI62iYkJXHPNNXjllVeYcsU999yDvXv3MqZ4999/PxoaGpjGgo6ODlx99dXYsWMH9u7dy9R+ZDKZV4RIIAjiWe7iZ0vfeOtTw5dZG/vYFEWhs7MTSqUSNTU1SElJCfjYgUQ8zvbUJAXpr2mb8926r51rsbGxyMvLY+6MNRoNVCoVOjo6YLfbkZqaivT0dKSlpfmsFG6xWJj2+bq6Or+VxgnOnZPCZJIgM5NGaSm3NRhCLEqlEu3t7SgqKkJCQkLInVe5rqu4ioZIbYjYCpCJfdIpR9ZBXi8EhDLioSgKBoOBk+zAn//8Z+zZswfXXHMNM0D6q1/9ivm91WpFb28vDCy1ll/+8pfMc9kDpASvv/46lEol/vSnP+FPf/oT8/iqVaswPDzs9doEQTyeMDc3h+bmZiQlJaGhocHrmgHfNR6r1Ypz584BADZv3hxwpxj72P4Qjyt76kCO6eyhE+hGKJfLkZGRwUjMLywsQKlUYmxsjDFAI3fOyyn76vV6NDc3IzExEeXl5ZxsEiTNtnWrHXzsfxMTE+jt7WXUEwiC4bzqDnxL5rBnVEjtQqPRMPJFMTExSE1NRcI/BfHEiGfx2gbAnJNAoFAoPA6L5ufnL7khjY6OxgsvvIAXXnjB5Wv+8z//E//5n/8Z8NoETTxjY2Po6elBUVER8vPzffqS8JlqMxgMMBqNSElJ4WzjI/CHJNzZU7OP6atbKJ9DoWzDLWI/TFJyw8PDDumb1NRUh/Or1WrR2tqKnJwcFBUVcba2Eye4SbM5g6ZpDA0NYXR0FBUVFUtqUL46r3K5IQZTq00ikSA+Ph7x8fFLoiFigNjW1rYkGgoFQtlOTYhH1GoLApwvfrvdju7ubszMzKCqqoqZtPYFfEU8Y2Nj6O3thUwmw/r16zn/4vpCPMvZUxP40inHjnSCNRQaFRXloOyr1WqhUqnQ19cHs9mMlJQUpKeng6IoDAwMoKSkxOvZKG+wsACcP0+Ih7v0LEVR6OnpgUqlQm1t7bIpYnZtiHxeXA+vshFKkVB2NKTT6XD+/HkkJycviYZIbSiYEUgoU20GgwGRkZE+d8SGGwRBPGyQlmSJRIKGhga/73xkMhmsXmrFeQOyiUxOTqKsrAy9vb28fGm9JR62PfVydS9vj8muOYRKiUAqlTIbDmlQUCqVGB4ehslkQnR0NIxGIzO8ysWG9NFHUthsEhQUUFi1ipv6jt1uR1tbG4xGI+rq6nxOxZL3xcfwKoFQ1KnJTc6qVauwatUqph6oVqvR3d0Nm83m0CnHdzREURTnLsDeQqfThVQzL1gQDPFIJBJGvDIrKwtlZWUBbSpcRjxmsxktLS2w2WxMWyGf9aPlSGKJPfUyX5LlHF4DbSLgCxKJBDExMdDpdACA2tpamEwmRooIAFJTU5m0nL+bRSBt1K5AGh8kEglqa2s52cS4Gl5lQyjE41xTca4H6vV6qNXqoEVDoYx4dDrdJZ9mAwRCPGTuZHBw0CeJGU/ginhIcwPRPZLJZIyhGB9FyOWIR61Wo6WlxWv9t+WOyXUTAZewWq1obW2FzWZDXV0dk34g8vJzc3NMXYg0KJAuubi4OK83VXZjQaAwGo1oampCQkIC5/U/gkCHVwmEQjyehkfZtSHnaKirqwt2u92hU46LJp9QNxfEx8cL4nPhE4IgHgCMijAX4pUAN8Rz8eJFdHZ2LmluYH/hub5APbWBj46Oore312dydlfj8XY+JxQwGAxoaWlBbGwsKisrl2zgEomEMdsqKiqCyWSCUqmESqXC4OAgIiMjGRLypC2mVALt7YufYaDEMz8/j+bmZmRlZXkcbuYanhoU3LVrk7UJ4TP35XvkHA0Rb5upqSn09fUhNjaWMVjzNxoKpWSOwWDgRIJI6BAE8UgkEmzcuJHTuZtAiIeiKPT19WF8fBwVFRVLBqPIRWm32zmXhHEVnbDrS9XV1T5P57vqahOqnQGw2Bre0tKCFStWeL2BR0dHIzc3l9EWIzND3d3dsFgsDik59l0xMX0rL6fgpKnoE4hCemFhocvOwmDBXTTk3K4tFL04wP95ImdvG6vVynTKBRINhbKrTafTXfK214BAiIcP+Es8bDvohoYGl/lWvlSkybHZx3Vejz93Q87HFEITgTtMT08zUaa/KhBkiprMj+h0OqhUKly8eBE9PT2Ij49noqHjxxc7AQOJdi5evIju7u6AdOL4grtoaHx8nLkhsVgsDs8L9t0+V5mDiIgIr6Kh1NRUj40poU61iTWeMIY/xENSJYmJiaisrHQbzZDCLR8NBmySCNSemoA0F7CN28jfEgrp0DSNkZERDA0NYf369T7Jb3gC+664oKDAQdR0dHQUhw9vAxCByko1bLZYn84xsb8YHh5GRUWFX23/wQQhmpGREYyMjKCyshJRUVG8tWt7Cz4EQl1FQ6Q21NnZCbvdznTJpaamOrQvh7K5gAu5nHCAYIiH6w1QLpf7RAyTk5Po6OhAQUEBVq9evex6+JLkIcTDhT01+5jsjQWAQ54/1CCpRCI95M4anAuwRU1HRmhcvBgHmYxGeno3jh9fYERN09PTPUaXNE2jt7cX09PTqKmp4WTSnG+Qua+pqakla+ajXdtbBMMSISIiApmZmcjMzHSIhiYnJ9Hb2+sQDYWyxiNGPGEObyMSmqbR39+P0dFRbNy4cYl5UqDH9xUSiQSzs7MYHR0N2J6afUxgUUFboVAIqnPNZrOhra0NZrMZ9fX1nEkPeYMPP1y8/KuqKPzLv9QzoqZKpdJB1DQ9Pd2hUE3cXElDTCin7L0FRVHo6urC7Owsamtrl5AqH+3avqwtmNekp2ioo6MDVqsVw8PDMBqNS6IhviEST5iDpNo8tYySdl2DweC1+Cj7+FxHPBRFQa1Ww2AwoL6+npMOP5LGWLFiBTo6OgAgJH45rmAymdDc3IyoqCjU1tYGfS3O8zuuRE2JsCdFUYz75sWLFzmd0eEbZJjVZDKhtrZ22Y3UVYMCn9FQqNWgnaOhEydOIDY21qEmSKKhxMREXteq1+uXVd6/FCAY4uEj1Qa471Ah9ZO4uDivhjCdwXXEYzab0dzcDKvVivT0dE5Ih33HWl5eDmCxY4y0HBO/HFKID+adO6mnpaeno7S0NOgbD00Dx4+712dzbtudn5/H5OQk+vr6QFEUEhMTMTY2hvT0dEHPXVitVkbFu6amxi+idNegQGqGgUZDQjKBI/XQ3NxcxMbGwmq1Qq1WQ6PRoL29HTRNO3TKcR0NiTWeMAchG1eFwunpabS1tWHVqlV+10+4jHjm5+fR1NTE1BfIpL6/8NREQPxyiouLGTmamZkZ9PX1IS4ujun2SkpK4m0zJVFEKFuP+/okmJqSIiqKRn2958+RbKQzMzPIzs5GQUEB4znDFjVNT0+HQqEIqYkYG2azGU1NTYiOjsaGDRs4WRdXw6tsBKPG4y0IsZL3FxERgaysLGZoeWFhAWq1mrdoiCtLBKHjkiUedj6egO3MuX79ercWsN4en4uIh9hTFxYWorCwECMjIwERmrMSgacmgtjYWEYfi9zZKZVKxr6bvZlylQYbHR3FwMDAEnuAYIOk2TZtorBcoKfRaNDa2or8/HxmkNhZ1FSpVKK3txdmsxkKhYKZGQpV/cdoNKKxsRFJSUkoLy/nLaLwZ3jVeS2hTrWxwV6vM9iq6qRDktSGSDREOuUUCoVf0ZA4xxNk8CG9z26pJkXshYUFxpkzEASqjOBsT002YX9sEdjH9HcolH1nR1EUZmdnmSK7yWRySMn50wBAOqomJydRVVXl4OkeCpA022c+4/kznJqaQmdnJ8rKylw2erBFTYkDp1KpxPT0NHp7exEXF8cQOJ9RJBs6nQ6NjY3IzMxESUlJUBUUgOWHV51TckIkHm+iw8jIyCXRkEqlwsTEBLq7u5GQkMDchCQmJnr1Oej1+rDokAwUgiEePkDIQa/XMykHtjNnoMf2lyBc2VMT+Es8XCoRSKVSKBQKKBQKlJSUQK/XQ6lUYmpqCr29vYiPj2c2U2++UOT9ki6wUEuC2O3AyZNEn839uR4eHsbQ0BA2btzo1nKCDbYDJ+mWIik5Umdh+wzx0ZhADAFXrVqFgoKCkKawPEVD7Js2u90umFQbWZev62FHQ4WFhQ7RUFtbm0M0lJqa6nYPEiVzLgHIZDKo1WoMDQ1h5cqVWLNmDWd3Vv6m2tzZU7OP6yvx8K1EwN5M2QOYTU1NkEqlTCTkqr5Bmibkcjnq6uoE0QXW1iaBVitBYiKNqirXGnbseRd/54qc6wNzc3NQKpW4cOECOjo6kJyczBCRL6Km7qBSqdDW1obi4mLk5uYGdCyu4S4aMplM0Gg0yMzMhMViCfrwqjNIM1Kgn4VzNDQ/Pw+1Wo3x8XEmGmLXhkhTAxcRj0ajwf3334+3334bUumijfVzzz3nMYVnMpnw0EMP4dVXX3WwvHaVDler1di4cSMmJiag1Wr9yl4Ihni43izJ3dXAwADWrVvHyTwMG/5EPJ7sqf05biiUCNgDmGzTNnZ9gxCR1WpFc3MzUlJS3L7fUODYscXN74or7HAuXVEUhY6ODszPz7ucd/EXbFHT4uJiGI1GxnV1cHAQUVFRTBSZkpLi87kiKUEhyva4glQqhcViQVtbGxITE7Fq1SoAWBIN8T286gw+hkclEgmSkpKQlJTERENqtZohIgDo7OwEsNhoFGiN5/bbb8fk5CSOHDkCq9WKu+++G/fdd59HG+xvf/vbePfdd3Hw4EEkJSVhz549uOmmm/DRRx8tee4999yDDRs2YGJiwu81CoZ4uITNZmMGwYqLizknHcD3iGc5e2r2cb0hHmcPnVAoEbDrG2vWrGFSckS7DFjsosvNzRVMKgUATpxwnWYjc112ux11dXWcpGTdISYmZomoqVKpRGdnJ2w2m4Oo6XJF6rGxMfT393udEhQCSPODQqFAWVkZc30Ee3jVGcGoN7Fv3kg0dP78efzlL3/B7Ows7rnnHtx000249tprUVtb61M3Ynd3Nw4fPoxPPvkENTU1AIBf//rXuO666/Czn/3M5V44NzeHl19+GQcOHMDVV18NAPjDH/6AsrIynD17Fps2bWKe++KLL2J2dhZPPPEE/va3v/l9DoRxC8ohDAYDzp07B7PZjKSkJN6mjr2NTIi0Snd3NyorKx3sFVzBG+IhUY6QNNeIb0pBQQGys7OZzq+IiAg0Njbi1KlT6O7uhkql4s1EzxtYLMDp00vnd0wmE86fPw+ZTIaamhpeSccZRNR07dq1uPLKK1FbW4uEhARMTEzg5MmTOHfuHAYHBzE3N+egKk0aVAYGBlBVVRU2pKPX6/HJJ58gPT3dgXSAxWtZJpMhIiICUVFRiIyMhFwudxiPsNlssFgssNlsnA9xB1unjURDe/fuxZkzZwAAd999N/r6+nDdddfhF7/4hU/HO3PmDOMdRrB9+3ZIpVKcO3fO5WsaGxthtVqxfft25rHS0lLk5eUxawKArq4uPPXUU3jllVcCJudLKuIhJmkrVqxAaWkpmpubeXUKtVgsHp/jiz01+7ievkxCtjOgaRoDAwMYHx9HVVUVY99AUZSDTYHVanVIyQVzk//4YykMBgnS0miUly9u4mSYOC0tLSTDrGyw5VxIWoak5EZHR5k297S0NKbWFi5acQCwsLCApqYm5OTkeKWJ6Gl41Tni5yIaCmWHHZnf+8pXvoK9e/cyBOsLpqamlsh+yeVyKBQKTE1NuX1NZGTkklpNZmYm8xqz2YzbbrsNzz77LPLy8jA0NOTTupwhGOIJZAMlirv9/f0OJmlc2l87Y7mIx1d7agJPxCNk0rHb7ejs7MT8/Dzq6uochuDYm2VJSQl0Oh2USiVTaE1MTGQGV/lWASBptm3b7JBIAK1Wi5aWFuTl5aGwsFBQ5xRYTMtkZ2cjOzvboc2dKCwnJydDq9VCJpMJvhtqbm4OTU1NyM/PR0FBgc+v93Z4lT0v5CuJhFqZGgBzgyqXy5n5uUceeQTPPPOMx9eT9DYfePTRR1FWVoYvf/nLnBxPMMQDfCpX4QvIhqdWq1FbW+vA2nwSj6cajz/21OzjOhMPaSIQqoeOxWJh2oWXq40439GbzWZGmHNoaIhxDvW3yL4c2DI5xPtnzZo1nNit8w2pVIqkpCSMjIwgJiYGZWVlmJ+fh1KpZPxmCMH7677JFwjBE7UKLsDF8KozQhnxGAwGREVFuRzWfuihh/CVr3zF4+sLCwuRlZWFmZkZh8eJ7qC7gfmsrCxYLBbMzs467J/T09PMaz744AO0t7fj9ddfB/CpkWBaWhq+//3v48knn/T2bQIQGPH4CqPRyEzZNzQ0LBlsDEXE4689NYEzoTmnFIRGOnq9nvEwKi8v9/luMSoqilEBcFdkJ9FQoCk5nW4x1QYAa9aMo7Ozm1PvH77hSnctOTmZETUlM0NsUVMiBhvMdKYziDsrnwTv7/CqM0LtPuqurZ7cjC2HhoYGzM7OorGxEdXV1QAWSYOiKNTX17t8TXV1NSIiInD06FHcfPPNAIDe3l6Mjo6ioaEBAPDGG2/AaDQyr/nkk0/w1a9+FSdPnsTq1at9fq9hSzwajQYtLS3IyMjw2JocrIgnUHtq9nFJhAPAQf5GSHewwOJdbGtrK3JyclBUVBQwITo7hy4sLDCGbV1dXUhKSmJIyJ+5l9OnpbDZJFixwgKLpRfV1dWciLEGA8vprsnlcgeF5fn5eahUKoyMjKCzszOo6Uw2iC5fWVlZUNu8vR1edW7XDqUXDyGeQFBWVobPfe5zuPfee7F//35YrVbs2bMHX/rSl5iOtomJCVxzzTV45ZVXUFdXh6SkJNxzzz3Yu3cvFAoFEhMTcf/996OhoYHpaHMmF5VKxfy9sJ7jAbxLtdE0jbGxMfT29qKkpMRjq65MJvO5OOct2BEPF/bUBK48UYQW5QCLxnldXV0oKSnh5S6WPQm+evVqmEwmJiVH5l4ISXmbVjp2bPE5GzbMoK6uNmzEGEm9MDk52at5KPbcCPvcqVQqXLhwAREREUxKjk9RUzJbtG7dupDq8rGjIfbsm6t2bZvNFjLiIcrUgX7X//znP2PPnj245pprmAHSX/3qV8zvrVYrent7YTAYmMd++ctfMs9lD5DyBUERz3IgZlYzMzNeRRXBiHi4sqdmHxdYvDhkMpngSIemaQwNDWF0dDSods/R0dFYuXIlVq5cCbvd7jatlJaW5rKRw2az4W9/owBE4uabkxEXJ6zo0R1IF1hWVhbWrFnj17XgfO5cDf2S4VWujPiIerPQZoucaz3OPkPz8/OIiYmBxWIJ+vAqV3I5CoXC47Bofn7+khv86OhovPDCC3jhhRe8+hvbtm3zuR7PRtgQj8lkQktLCyiKQkNDg1eqv3zXeKxWK86ePcuJPTUAxrROIpGgo6MDGRkZQW839gRC/FqtFrW1tSFT0ZXJZEu8cpRKJYaHh9HZ2clI0aSnpyMuLg5msxnHj7djYOBKAMDVV4cH6fChuyaTyZhoh0i0qFQqRoePC2sMMtBaUVHhd8o5WCDEQlLlFosFZWVlTMo7mMOrl4syNRAmxEO+gKmpqT4VsPkiHpqmMT09DbPZjA0bNnCijEDSajRNo66uDkqlEmNjY+ju7kZSUhJDQqFqmSVT/TabDXV1dUG1A/YEdlqpqKiIkaJRKpUYGBhAdHQ0LBYLOjoKQdMSlJVRCANFmaDorpGh3/j4eAdRU6VS6beo6fDwMC5cuCAIBXJvQWSSdDodqqurmWubC68hX3C52F4DAiMeV3dXZNZjOakZV+CDeCiKQmdnJ2ZmZiCTyTgjHXYTgXNtQ6lUMhYFsbGxTG0jWDL7BoMBLS0tiI2NRWVlpWCMzlyBLUVDuqliYmJw9uziF3r9+hlMTRl4U4fmAqR+Vl5eHpBnlK9wtsYgkaSzqCm5AWJfeyQFOzY2hurqar+FVYMNQjp6vX6JYgUf7dqeYDAYxIgn1GB3iVVVVflVS+CaeIjSMk3TqKysxPnz5wM+5nLzOdHR0cxGSlpmZ2ZmmDZyT8rQXGB2dpZRg/C3xhAKzMzMoKOjg4kY+vsXaxebNhkxNDSEjo4OxmMoLS1NMMOXQtFdk0qlLkVNnZs7yMzQ4OAgJicnUVNTEzabJ0VRaG9vh8FgQHV1tceUNlft2p7ARVdbuECQxGM2m9HS0gKbzRZQl5hMJmNytIGCbU+9bt06WCwW5qLzdzP2VYmA3TLLnmInuWlyN8rFzAsAZsCyqKgIeXl5AR8vWBgfH0dfXx/WrVuHjIwMXLwoQX+/FFIpjVtvzURyciYMBgOzkZLhy2BHkmywmzaEmKbyJGpK7AwKCwsFG0U6wxfScQVf27XJ/3uCmGoLESQSCebm5tDc3Izk5GRUV1cH1CUWiFkbG8721MTdFPB/4CxQDx22WduaNWsYGZqxsTGHmZeMjAyfiZtIEA0NDYXVgCURzRwbG3PYvEkbdWUlBbKfx8bGIi8vD3l5eW4N28jwJVe2357W3dvbi+np6ZA2bXgLMm+VmpqKzs5OaLVaZGZmMtFQQkICc/4SEhIEFyUT0jEajX6RjjOWi4a8bVDQ6/XIyckJaC3hAkERz+TkJFpaWrB69WpOunj4sqcGPr3YfNV24sNDx1mGhl0XGhgY8OlunqQ4ifhkOOXqu7u7odFolmze7mwQCJxrG8SwbXBwEO3t7YygaVpamlfdlL6uu7OzE3Nzc6irq+P8+HyBXZCvr69nCvKuRE3JuVMoFLyTuDfrbmtrg8lkQlVVFS8do87RkHPLtvPzyHMNBoMY8YQCcXFxqKio4OwOmxCPP+kwYtc8Ozu7xJ6aHBuATxGVcxMBX22Z/taFbDYb2traYDabUV9fz9lMB99gr7u2ttZh3TTtqM+2HKRSKVJSUpCSksJ4DKlUKkxPTzu0G3tr++0Jdrud2QRra2sF0ym4HMi6zWbzkoK8O1HT/v5+GI1Gh5mhYJMsRVHMoDeRieEbziQEwG00NDs7KxJPKJCUlMRpkZft4eHLnRbbnnrz5s0u74pIF4u3EVWoRD69rQslJCSgo6MDUVFRqK2tDfmdqbewWCyMtTbRL2NjYECCiQkpIiNpNDT4nnYltt+rVq2C1Wpl6kLE9pudkvMl8nWluxYOsNvtaGlpgd1uX3bzZqeDS0pKGBJ3FjUlkTifg5qhIB1nONd62JHQzMwMzpw545dqdzgiPHYXP+FPVOKNPTX7+N6awQnBzsBdXWh4eBh6vZ7xibdYLGFBPERKJikpCeXl5S4/K5Jmq6+nEOg9TUREhIPtNyHxvr4+B9vvtLQ0j9HicrprQoXNZkNzczMkEgmqqqp8vkbYJM4WNW1tbQVN0w4zQ1ymwEiEZrFYQkY6rkCiIbVajS984Qv4zGc+g5/+9KehXlZQIPzdJQCQjchms3l1IXtrT03gTQ0p0CYCvkDqQiaTCcPDwygoKEBUVBRT2wh1l9dyIE0o2dnZHlUjfEmz+QJnEid385OTk+jp6UF8fDxz/tgFdl9114QCq9WKpqYmREREYOPGjQGTpStRU6VSyYiaJiUlOahP+Hv92e12tLa2wmq1oqqqSjCkQzA7O4tdu3YhPz8fr7/+umBUSviGoIiH682NdJ8tRw40TaOvrw9jY2OorKz0en7CkycPH00EXGN0dBQDAwMoLy9nGifYdSGlUhm0eSFfQBSPV69e7dHbhaKADz8kxm/cWiSz4awAwC6wj4yMQC6XM6rQQ0NDYTcTRSK02NhYrF+/nnOydFafYIuaEo8mQkIpKSleX3+EdGw2myBJZ35+Hrt370ZmZib+93//97IhHUBgxMMHliMef+yp2cd2lWpzbiIg9SChgBAtGc51nhkJ9ryQL5iYmEBPT49XU/3t7RKo1RLEx9OoruaPeJzhXGDXarUYHx9Hb28vJBIJDAYDJiYmkJ6eLviGApPJhMbGRsZvKRgRmjtR0+7ublgsFq9SmmzSqaysFBzp6HQ63HTTTUhMTMSbb74ZNo08XOGyJh5/7akJXEU8QnYKBT7t1jMYDKirq1u2mcPbeSGSEuEL7AHLyspKr8Qnjx9fvDPesoVCqPYdIkCpVqtRUlIChUIBpVLJqDcnJCQw5y+YPjnewGAwoLGxEampqSgrKwvJ2tiipuwGBXZKk9wIkS5DdgOEP7UovqHX6/GFL3wBEREROHToUNi00HMJQX0ifFzY7ognEHtq9rHZEY9QmgjcgUj+yOVy1NbW+ky0XM4L+QIyW6RSqXwasCTEw3V9xxe40l2Lj49HQUEBLBYLlEolVCoVhoeHERER4TDzEsr6j16vR2NjIzIzMwWTFnQlakpSck1NTZBIJEhNTYVOp4NMJhMk6RiNRnzpS1+C3W7H4cOHBT8szBckdCCmCjzAbDZzerwzZ84gPz/fwf0wUHtqgk8++QRZWVnIzc0VbBMBgU6nQ3NzM1JSUngparPrQkqlkrO6EOlIMhqNqKqq8jolYbUCOTkx0OslOH3aiI0bg3+Zkxrahg0blq0bkpQSOX9c2377goWFBTQ2NmLlypVYvXq14K5lVyApza6uLlgsFtA0jZSUFCZaEsJ8jNlsxm233QatVot//OMfYeN+yweEdTsA71xIfQE74uHKntr52OyJZCGSjlqtRltbG/Ly8hjJH67hri5EzMZSU1ORkZHh0yZqsVjQ0tICiUTic4R2/rwUer0EaWk01q8PLun4o7vGTimVlpYuSWkS6+pAu7yWw9zcHJqampCfnx9WMyU0TePChQuIjo5GQ0ODw8wVsccg5zclJSXo0aTFYsGdd96JmZkZvP/++5c16QACJB6uQciBS3tqAqlUCpvNBpvNxjQQCI10SFF77dq1QfO856IuZDQaGWfXdevW+RwxkTbqq66yI5h7DNFdm5mZ8Vt3zTmlaTabmUhoaGgIUVFRDl1eXG2iWq2WkawKJ1FYu92O5uZmAEBlZSXkcjnkcrmDqCmZGers7Ax6NGm1WvHVr34VIyMj+OCDDwRvjhcMCC7VRsJkrtDS0sLMp8THx2PDhg2c5H1pmkZHRwfm5uawcuVKZGRkCKpDiaZpDAwMYHx8HBUVFUhJSQn1kgDAoS6k0Whc1oXm5+fR3NyMzMxMlJSU+EXmn/tcFE6elOG55yz42te4UShfDmzdterqal6KxmxlaKVS6WD7HcjgJfEuWrNmTUDp52CDPdTqjVcUTdNYWFhgakPz8/NITExkoiGuRU1tNhvuvfdetLe34/jx48jIyODs2OEMwRGP1WrlRFGa4JNPPoFWq0V+fj4n9tTAp00EJpMJU1NTUCqVmJ+fD0gRmkvY7XZ0dnZifn4elZWVgshvu4KrulBCQgK0Wi0KCgr8Foo1GBbrOxaLBK2tRhQV8X+Jk/Zdi8WCysrKoNyEkMFLklLS6XR+dRmSuaiysrKgRcVcgJCOVCpFRUWFX3VEs9nMXINqtZqZuSIKCoHMrNntdnzzm9/Exx9/jOPHj4fVueUblyzx0DSN4eFh9PX1ITU1FTU1NRyszn3nGkmHzMzMQKPRMGKSGRkZQZWGJ3URAKioqAiboTSKojA4OMh0d9ntdr/qQgDw/vtS7NoVjZUrKfT0mMD3qbdarcxdd0VFRchmRkg0qVKpoNFomLpGeno6kpOTXabkpqam0NnZifXr14fV3TgXpOMM0qBAiNxsNjuYBfoSwVIUhW9961v48MMPcezYMd7sy8MVlyTxkJSHSqVi7lrKy8sDOqazEoGneg7xd5mZmYFKpWLaZDMyMtxuAFxAr9ejubmZGfYLtcKAtyA3CcPDw9iwYQMUCgVTF1IqlVhYWPDpTv7xxyPwi19E4PbbbXjpJQuvaxeq7hqpaxAioijKQdA0IiKCmSXyputOSLDZbIyIL1ek4wpkZkilUkGr1TJp4bS0NI+iphRF4Tvf+Q4OHz6M48ePIz8/n5f1hTMERzw2my0gDx1ne+qJiQno9Xps2LDB72Oyh0IB35QIKIqCRqPBzMwMlEolI4aYkZERcCjPhkajQWtrK1auXImioiLBNTm4A9sEraqqaon9BABGQoVEk8vNC115ZRSammT43e/M+Nd/5W+GJ1x019haaEqlEnq9HjExMTAajSgvLw+rFFCwSMcZVquVqa2pVCoHUdO0tDQmyqUoCo8++igOHTqEY8eOoaioKCjrCzdcUsTjbE8tk8kwPDwMrVaLyspKv47JpYcOTdOYm5vDzMwMZmZmHNqM09PT/U7RkCHFkpKSsCoM2+12xkysqqrKq1SGq7oQIXKFQoH5eRlyc2NA0xL09xuRnc3P5b2wsICmpiZkZWUJZsDSW/T392N0dBTx8fFYWFhwuJNPTk4W7HshKU25XM6JUKm/YBO5SqWCTqfDgQMHsGLFCqhUKrz//vs4fvw4SkpKQrK+cMAlQzyu7KkBYGxsDNPT037VePhUIqBpGnq9niEhnU7H5JO9Ncliz4ts2LABqampnK2PbxA/Gpqm/a5FseeFSE6+s7MYjz5aiuJiO1pauB1GJiBtx/n5+cjPzxfsRu0Mcr0Qa/DExEQHIlepVACCa/vtLbhWx+YSJpMJ+/fvx/79+zE2Nobs7GzceOONuOGGG7Bt27bLTofNGwjjqgoAnuypAf/tr/mWv2HLfxQWFsJoNDIbaF9fH+Lj45GRkYGMjAyXA4MURaGrqwtardbveZFQwWg0orm5mVE79ncTcWVN8Je/LB6rqGgUn3wyyrmOHOkAC7e2Y5qm0d/fj8nJSdTU1DDXi7M9gbPtt683Q3yAkE5kZKSg6mgEUVFRsFqtMBgMOHfuHNRqNd555x3827/9G/7whz/g6quvDvUSBQfBRTx2u52xg/XmucSeurq62mV9YHp6GoODg9i8ebNXxyRNBKGUvyGy+uQuNCoqiiGhpKQkRlGbKO8KaX5oOSwsLDBGe6WlpZyf2+rqaPT0SPHHPy6goWHS67qQN3CluxYOoGma0bqrrq72utXfYDAw16BWq2U6NUlxPRjfCzbpbNy4UXB1NJqm8atf/QrPPvssjhw5gurqaoff0TQtuDULAWFLPGx76srKSrepGiKnfuWVVy57zECaCPgCuztJqVQCWFxnbGysID1GPIE0QKxatcrvGR1PmJwEiopiIZHQGB01ggyIO6eTJBKJQ13Imztooru2cePGsEppksiY3Jz5G7WQTk1yDtm23wqFgpeUnNVqRWNjI6KiogRLOi+++CJ+9KMf4e9//zvq6+tDvaSwQVim2ny1p/Ym1cZlEwGXkMlkTLSj1WrR3NyMmJgYWCwWnDx50qFDTsgkROZFysrKkJ2dzcvfIDbXGzfSYKuSeKMjR6Ih5xsY57qIN7prQgFFUUzzRm1tbUCRcUREBLKyspCVlcWcQ5VKhf7+fphMJoeUHBc1DUI6pE1dKN9HApqm8fLLL+OHP/wh3nvvPZF0fITgiGe5u2A+7KmFbmcALKYMOzs7UVRUhLy8PEb6Y2ZmBhcuXEBHRwcUCgXTISek9NvIyAgGBwexceNGXudFvLFBcFUXUiqVGB8fR3d3t8O8UGxsLKO7xq6LhAOIqrfZbEZNTQ2ng8TuzuHU1BR6e3tdeuT4AovF4jAbJUTS+X//7//h+9//Pt5++21s2bIl1EsKOwgu1UZRFKxW65LH2fbUFRUVXm9ger0eH330ET772c+6/D1N00xqTwipNWfQNI2RkREMDQ1h/fr1SE9Pd/k8g8HAzArNzc0hMTGRIaFQSeaQz2xqagoVFRW8KvLSNFBWFo2xMSkOHTLhX/7F9yFkMi9EdOTI9bB27VpkZGQI7tpwB7YRWrDdN9mq0Gq12md7DIvFgsbGRt5stgMFTdP4y1/+ggcffBBvvfUWrrnmmlAvKSwRFsTDtqeuqqry6c7TZDLh+PHj2LFjh8vOMCF76BAbB6VSicrKSiQmJnr1OraasVqtRmxsLENC/tyB+gOS5pmfn0dVVRXv2nVDQxKsXx+DiAgaExNGBMK1ZOM2GAxITEyEVqtl6kKkzVhonVUEpE2dyPeEsh3alQQNsa12FZULnXQA4PXXX8c3v/lNHDx4ENdee22olxO2EHyqLVB7arJB2O125kvo3EQgRNKx2WxMqqS+vt6nvHlUVBTjWU8K6zMzM0wzBiEhvnxJrFYrWltbYbfbUVdXFxS9OGKDUFdHBUQ6bN21TZs2ISIiwqEu1NfXt2xdKFSwWCxobm4WTNuxVCpFamoqUlNTHVJybNtvQuZRUVFoamoSNOm89dZb+MY3voG//OUvIukECMERDxtc2VMDnxKPUJsI2DCZTGhubkZUVBRqa2sDumt1LqxrtVrMzMygo6MDFEUxm2daWhonGxVZe3R0tFcy9VyBNBYEYnNN1h4TE+MwX+RLXShUaU2iGSfUjZs9t0Zsv0kkNDIyAoqiEB0djRUrVnBqi8IV3n33XXzta1/DK6+8gp07d4Z6OWEPwaXaaJqGxWJh7KlLS0sDVnb9+9//jiuvvBIxMTGMW6gQoxwAjBcNmXPhawMhsh9EOcFkMjk0J/hzF0/stRUKBcrKyoK2+VEUUFAQA5VKgn/8w4QtW3yv7/iru+ZcF4qOjmbOYbBmXUwmExobG5GUlCRozThXMJvNOH/+PCIjIxEfHw+VSgWr1eqQkgt1RHnkyBHcfvvt+N3vfofbbrstpGu5VCA44qEoCq2trZicnERlZSUnbn3vv/8+6urqEBsbK9h6DvDpVHxhYaFXHXtcgi3fs7CwgOTkZEZR25vZDyIjw6e9tju0t0uwaVMMYmMX6zu+7lNc6a65mxfisy5kMBjQ2NiI1NRUlJWVCfK6dgez2YzGxkYkJCSgvLwcUqkUNE0zyuRsozYSlcfHxwf1PR4/fhxf/OIX8Zvf/AZ33HFHWJ1fIUNwqTabzQaTycSZPTWwmG6zWCyIjo4WLOmQAcXy8vIlsj/BQFxcHGO+RnxdZmZm0N/fj/j4eIaEXH3xSat3qGRkSJptyxbKZ9LhUnfN3bwQX3UhvV6PxsZGZGZmhp1QqSvSAVzbfpOIcmhoCJGRkcw55KtGSXDq1Cnceuut2Ldvn0g6HENwEQ/Anf01kaxoamqCVqtlhi3T0tIEI35IWo4nJydRUVEhuAFF0h47MzMDtVrNfPGJt9DY2BgGBgY8tnrzjS98IQp/+5sMP/qRBd/+tvc218HSXSOCsITMffUXcoWFhQU0NjZi5cqVWL16dVhtiiS9lpSUhPLycq/XTmy/CRHZbDaGzH01C1wOZ8+exY033oif/OQn+OY3vxlW5zcccMkSD7uJgB2+z8zMwGg0QqFQIDMzMyA7gkBBtOYMBgMqKipCapftDcgXn8wLkfNbVFSE3NzckHRR2WzAypUxWFiQ4NQpIyorvbtuiO7aunXrgh5hstvd/akLzc3NoampCfn5+SgoKAjSqrkBux7lC+k4gwxQk/PItv1OS0tzKazrLRobG/H5z38eTz75JL71rW+JpMMDLkniIe3S7poISD1jenqasSMgsjTBmvgnhnXEW0TIcjfOIA6vGo0Gqamp0Gq1sFqtDlbVwXo/H38sxWc+E42UlEV9Nm8yL0LSXXNlS0AiIVd1IZIaXL16NfLy8kKxZL9BSIc0cHC5oTs3eURFRTHn0RfX39bWVlx//fV49NFH8Z3vfEckHZ4gSOIJxP7aV/kbo9HIFNXZE/8ZGRm8RSCk+yslJSXsupDIMK/VamWUsUlESSIhNplzpd3lDj/9qRxPPhmJXbtsOHDAs801sdAYHx9HZWUlr0oK/sCVvxC7LrSwsIDW1taws2QAFonh/PnzzDXP54ZOhHUJEVEU5ZCSc3dT1NHRgeuuuw4PPvggvv/974ukwyMuKeIJVImApECIlP5ynjj+QK1Wo62tLSTdX4GCRGlkQNFdnYyQuVKpxOzsLBISEhzOI5e49toofPihDL/8pQX33ee+vkOsAZRKpc/qF6EAuy5EZJAAIDMzE6tXrw7ZvJA/CCbpOMOV7Tfp2CQpOQDo7u7Gddddh3/7t3/Dk08+GVbfy3DEJUE8pI5DxEC50FxjF9VVKhWTh8/IyPBbdmZ8fBy9vb1Yu3ZtWPncA4vpSWIr7kuUZrFYHOR7uDiPBEYjkJMTA7NZguZmI9ascX0pE/mehYUFry22hYSpqSl0dHQgJycHJpOJqQuRJo9gzQv5A6PRiMbGRma2K9TrNBqNTCTU0dGBH//4x6ipqcGJEydwzz334JlnngmrDES4QpDE44v9tbMSAR9Cn3a73YGE5HI5s3l641FP0zQGBgYwPj6OiooKpKSkcLo+vjE7O4uWlhbk5OSgqKjI7/NLziMhIqlUypxHf1pjjx2T4oYborFiBYX+fhNcLctut6O1tRUWiwVVVVUhH0b0FRMTE+jt7cWGDRsYYVxf60KhgtBIxxnz8/P43e9+h5/85CeQSCSIiYnBtddei89//vO4+eabOet8feGFF/Dss89iamoKGzduxK9//WvU1dW5ff7Bgwfx+OOPY3h4GMXFxXjmmWdw3XXXuXzu17/+dfz2t7/FL3/5Szz44IOcrDcYEEZPsZ8Ilp2BTCZzmM8gnV2tra0AwGyeCoViyeZpt9vR2dmJ+fl51NXVhVWKBAAjr1NcXBywgoTzedRqtVAqlejs7ITdbnfwFvLmS/+pDQLlknSI7ppUKkVNTY1gWui9xdjYGPr7+1FRUeEwSO08LzQ3N4eZmRlB6cgZjUacP38eaWlpvDjNcgGtVovf//73uPvuu/Hcc8/h/PnzePvtt/Hb3/4Wt9xyCyd/47XXXsPevXuxf/9+1NfXY9++fdixYwd6e3uRkZGx5PmnT5/Gbbfdhqeffho33HADDhw4gN27d6OpqQnr1q1zeO7//d//4ezZs7z5W/GJsI14hOChQ4rBpDmBvXmmpaUxKscAUFFREXZ32+Pj4+jr68O6detcfkm4AjsPz253d6diTLBtWxQ++USG3/7WjC9/2fF6cae7Fi4YHh7GhQsXUFlZ6fVsl3NdiEz9B9seIxxIZ2JiAjt27MA111yD3/72t7yl1+rr61FbW4vnn38ewOKekZubi/vvvx+PPPLIkuffeuut0Ov1eOedd5jHNm3ahIqKCuzfv99h/fX19fj73/+O66+/Hg8++KAY8QSK5S5UodgZsMUjS0pKGO2zgYEBdHR0AADi4+OxcePGsCId0v01NjaGyspK3lODEokESUlJSEpKQlFR0RIVYzKfwe40nJsDGhsXN4tt2xzrgURGJtiacVyA7XhaXV3ttRUGsFSIkz0vNDg4GJS6ECGd9PR0lJSUCJJ0pqamcP311+PKK6/E/v37ebs+iM3Do48+yjwmlUqxfft2nDlzxuVrzpw5g7179zo8tmPHDhw6dIj5maIo3HHHHXj44YdRXl7Oy9r5hiCJxx2cmwiEJH/D3jwVCgVaW1uRkJAAm82GU6dOMQKcGRkZgiYhiqLQ3d0NjUaD2trakHR/xcXFIS4uDvn5+Q6dhgMDA4iLi0N6ejqam3NBUbEoKqKwcuWnQTvRXVuxYgWKi4sFc314A5qm0d/fj8nJSU4cT13ZYyiVSiYK57ouRAhfyKQzMzODG264ATU1NXj55Zd5jYRVKhXsdvuSAeXMzEz09PS4fM3U1JTL509NTTE/P/PMM5DL5fjWt77F/aKDhLAhHmcPHSG6hQKfTsSXlJQwsxbEHZR9B09UE4TUYcX2AKqtreV1/sZbsDdPq9XKeAu9+aYWQAo2blRDozEjOTkZc3NznOmuBRuk3VulUqG2tpbzGTK+60KEdDIyMgSrG6dWq7Fz506sXbsW//M//xN2NT9gUVXhueeeQ1NTkyDPsbcIizPPrudIJBJBpk5IimR0dBQVFRUOE/GxsbHMZsgW4Ozr6+N1xsUXEBMxmUyGmpoaQSopREREICsrC1lZWRgYWKz71NTMo729j7k+cnJykJeXF1ZfSoqi0NXVhdnZWdTU1PB+MyKVSpGSkoKUlBQHf6GJiQl0d3f7XBcyGAw4f/68oMVKtVotdu3ahYKCAhw4cCAo1zfxuJqennZ4fHp6GllZWS5fk5WV5fH5J0+exMzMjINqhd1ux0MPPYR9+/ZheHiY2zfBEwTZXMC2vxZCE8FyIBuHVqtFZWWl1ykSYoY1PT0NjUaDmJgYhoQSEhKC9l6JFw3RzxIisbMxPQ0UFi5GBCMjBpjNixtmamoq9Ho9zGYzY0cQSi0+b0BmjHQ6Haqrq4Mm2eQOrnTk2NIzruSnGhsbkZWVJdjU5tzcHHbu3Im0tDQcOnQoqOe4vr4edXV1+PWvfw1g8fPOy8vDnj173DYXGAwGvP3228xjmzdvxoYNG7B//36o1WpMTk46vGbHjh244447cPfdd6OkpITfN8QRBB3xhAPpEJtnm82Guro6ny7qyMhIZGdnIzs7GzabjZkVIsZYhIT4HBCcm5tDc3MzsrOzBbtxOOPDDxfz8hs2UDAYFnXXKisrkZqaynR2zczMYHR0FF1dXUhJSWGK6kJIHxLY7XYmtVlTUyOI2p9zXch5dIBdFyLaa0ImnYWFBdx8881ISkrCm2++GXRi37t3L+666y7U1NSgrq4O+/btg16vx9133w0AuPPOO5GTk4Onn34aAPDAAw9g69at+PnPf47rr78er776Ks6fP4+XXnoJABgrcTZIJiBcSAcQKPGw6zlCJh2DwYCWlhbExsYGbPMsl8uZNBJbBbqlpQUSiSSgQUt3ILYAq1evxqpVqzg5ZjBA5nc2blRjaGgI1dXVjO4au7OrsLAQRqORuYPv6+vjRQbJH5BWe7vdjurqakFGZexBaVIXYvsL0TQNhUIh2NSmXq/HLbfcgsjISLz11lshqafeeuutUCqVeOKJJzA1NYWKigocPnyYaSAYHR11+D5v3rwZBw4cwGOPPYbvfe97KC4uxqFDh5bM8IQ7BJlqe+GFF6DVarF7927k5+cLMvVDpvlXrFjBa16bDFqSWSGKopi790C6kSYmJtDT04Py8nK3+Wahorw8GsPDUjz55Hl8/et5Pqc2ycR/VFRUUKJKZ1itVuaGoqKiIuyK3DqdDufPn0dcXBwzg0VcQkNdqyQwGo245ZZbYLFY8Le//Q0JCQmhXpIIFgRJPAcPHsRLL72EEydOoLy8HLt378auXbsEE84Tx82ioqKgStPTNM10I83MzMBisfhsbkfTNC5cuICRkRFs3LiRE2vxYGJoiMb69XGQySgMDGiRkeHfXSxRMCYySBKJhNk4XSlQcAWLxYKmpiZERUVhw4YNYTfYqtPp0NjYiJycHMaAzte6EN8wmUy47bbbMDc3h7///e+CUyEXIVDiARY3SI1Gg0OHDuGNN97A0aNHsWbNGuzatQu7d+8OifYTTdMYGRnB0NBQSB03yVqIFcHMzAz0ej3jh+OuJZaiKKZlt7KyMuzuAu12O3784yk880wx6upsOHbMsw2Ct2ArUCiVSlitVgf5Hq7SYGazGU1NTYiNjcX69esFGcl7givScYYzoQPB1ZGzWCz48pe/jMnJSbz//vthp4t4uUCwxMMGudP/61//ijfeeAP/+Mc/sGrVKuzcuRM33nhjUL7EZNNWKpWorKz0aaI8GCAFdWKt7OyHw3Y7raqqElSR3RsQ3bUf/Wgtjh7NwCOPWPH441bO/w5xtiQkpNfrmeFfT/I9y4HtvBluHkzAp6SzcuVKr+08aJpm/IVmZmZgNpuZc5mWlsZ5od9qteIrX/kKhoaGcPToUUZUVYTwEBbE44z5+Xm8++67eOONN5hCHSGhqqoqzr/U7MHKyspKwW/apKA+MzOD2dlZxMfHw2q1IiIiQrCFbE8wmUxoampCTEwsbrppE2ZmpDh82IQrr/TPLNAXkOFf4onjj/YZGa5MTU0VpErzciA1ndzcXKxevdqvY7jTkWNLIQVyXmw2G772ta+hs7MTx44d41VbUETgCEviYUOv1+Nvf/sb3nzzTbz77rtITk7Gzp07sWvXLtTX1wcc2hOxSZKTD7dCMJnmBxbvCOPi4piCenx8vOA3QeIDtFiLKkddXSxiYmhMTBgR7JEXdi1DrVYjNjaWISF33kJkzkXIw5WesLCwgMbGxoBIxxW4rAvZ7XZ84xvfwCeffILjx4+HndfV5YiwJx42jEYjjhw5gjfeeANvv/02oqOjsXPnTuzevRubN2/2mTTm5+fR3NyM9PR0lJaWhl16hKw/MzMTJSUlDrNCXJnb8QmyfqK79uKLEXj44UhcfbUdb79tDunaiPYZOZcymYwhIdLyTjbtlStXuq2JCBlk/cQtly+QuhAhIsD7uhBFUbj//vtx8uRJHDt2LGDrDhHBwSVFPGxYLBYcPXoUb7zxBt566y1IJBJ8/vOfx+7du3HVVVctm24iMy6FhYVYtWpV2G0aarUara2tbtfPLgIrlUpm4yTmdqEmWa1Wi5aWFhQUFCA/Px8AcOutkXjnHTmeesqChx5yb3MdbLhqeU9KSoJWq0V+fj6nkUKwQEhn1apVKCgoCNrfdVcXcmWRQVEUHnroIfzjH//AsWPHmOtEhPBxyRIPGzabDSdOnMDBgwfx1ltvwWKx4IYbbsCuXbvwmc98ZkmRc3R0cRq+vLx8iVJsOODixYvo7u722mKbbW6nVCpB07TDrFCwSYiQ/po1axihVZsNyMuLwdycBB9+aEJ1Nf/1HX9A0zRjcS6Xy2G32wVhzOYL5ufn0dTUFHTScYarulBMTAwOHz6M3bt349VXX8Vf//pXHD9+PCzJ/XJGeOWO/IRcLsc111yD/fv3Y3x8HG+++SYSExPxwAMPoKCgAPfccw/efvttLCws4N5778XLL7+MqqqqsCMdMqPT29uLiooKr3PdUqkUaWlpWLt2La666ips3LgRcrkcPT09OH78ONrb2zE9PQ2bjf8o4+LFi2hra0N5eTlDOgDQ0iLF3JwEyck0KiqESToAoNFo0N/fj7KyMmzbtg319fVISkrC+Pg4PvzwQ5w/fx4jIyMwGo2hXqpLzM/PhyTScQWiQlFQUIC6ujpceeWViI2Nxblz57Bt2zb89re/xWc/+1lcvHhxWeNIf/DCCy8gPz8f0dHRqK+vx8cff+zx+QcPHkRpaSmio6Oxfv16vPfee8zvrFYrvvvd72L9+vWIi4tDdnY27rzzTly8eJHzdYcDLgviYUMmk2Hr1q349a9/jZGREbz33ntYsWIFvvvd7yInJweHDh3yehhTSKBpGr29vRgdHUV1dfUSPSdvIZFIkJKSgpKSElxxxRWMWvLAwABOnDiBlpYWXLx4kRFx5RIjIyPo6elBRUXFEtI/fnzxUr3ySjuEOnNJJI7KysqQk5MDAMzGWV9fjyuuuAKZmZlQqVT46KOPcPbsWQwODmJhYQFCSDwQ0ikoKAg56bhCVFQUKioqcOWVVyI1NRW/+MUvQFEUbrrpJmRlZTl41gQKYln9gx/8AE1NTdi4cSN27NiBmZkZl88nltX33HMPmpubsXv3buzevZsxhCRCvI8//jiamprw5ptvore3Fzt37uRszeGEyyLVthwmJyfx+c9/HgCwZcsW/O1vf8P4+Dj+5V/+Bbt27cJ1110nuLkdNux2O6NwXFVVxZsmFXtgVafTcTLfAnzqeDo+Po7KykqXk+Y33BCFY8dk+NnPLPjGN4RT3yGYmppCV1eX1zbhVquVafRQq9WIjIxk0puhmPafm5tDU1OTQ01NaKBpGs8++yyef/55fPDBB9iwYQOAxev/k08+QX19PWfnjS/LajY++eQT1NXVYWRkJKgKKELAZU88NE2joaEBJSUl+N3vfofIyEhQFIX29na8/vrrePPNNzE4OIhrrrkGO3fuxA033BCSjcEdiO4XTdOoqKgIWg3BaDQyJDQ3N4ekpCSmOcEX4iMGaEqlElVVVS5110wmICcnBiaTBOfPG1FWJqxLdmJiAr29vdiwYYNfQ4tsUVh2VxeR7+F72p+QDmlEESJomsZzzz2Hn/3sZzhy5Aiqq6t5+1sWiwWxsbF4/fXXsXv3bubxu+66C7Ozs3jrrbeWvCYvLw979+7Fgw8+yDz2gx/8AIcOHWKUvZ3x/vvv47Of/SxmZ2cFfWPLB8Irn8QDJBIJ3nzzTaxYsYIhE6lUio0bN2Ljxo146qmn0N3djddffx0vvvgi7r//fmzbtg27du3CDTfcgLS0tJCRkNFoRHNzMyPBEkzdr5iYGKxatQqrVq2C2WxmSKi/v99BAdqTgCfxollYWEBtba1bwvr4YylMJgkyM2mUlgqLdEZHRzE4OIiKigq/de9kMhnTfEC6umZmZtDT0wOr1cpIIaWlpXE+/EtIZ/Xq1YK966ZpGr/5zW/w7LPP4u9//zuvpAPwZ1nNhslkwne/+13cdtttlx3pACLxAACys7Pd/k4ikWDt2rV44okn8Pjjj2NgYACvv/46/vjHP+LBBx/EFVdcgV27dmHnzp3IzMwMGgktLCygubkZaWlpIZ8xioqKQm5uLnJzc2G1WplW2AsXLrg1tyNqEBaLBbW1tR4jNWKDsHWrHQIJNAEAw8PDuHDhAqqqqjgToiQ1NuIOStKbIyMj6OzsXCKFFAhmZ2fR3NwseNL5/e9/jx/96Ed47733UFdXF+olBQyr1YovfvGLoGkaL774YqiXExKIxOMDJBIJiouL8eijj+KRRx7B8PAw3njjDRw8eBAPP/ww6uvrsWvXLuzatQs5OTm8kZBGo0FrayvTeSSUtB+waErFNrcjs0Lnz59HREQEkz4aGhpibLaXa+QgjQXbtnHfueQP2DWpmpoa3sRWJRIJEhISkJCQgNWrVzPpzenpafT29gZkm05Ip6ioSLBDlzRN45VXXsFjjz2Gt99+G1u2bAnK3+XDspqAkM7IyAg++OCDyzLaAcQaDyegaRoTExN488038cYbb+D06dOoqqpi7By4HECdmppCZ2cnSktLmc6pcABFUYxt7/T0NCQSCVasWIGsrCyP5nYLC4v1Hbtdgu5uI/LyQnu50jSNvr4+TE1Nobq62msvIK5hsVgc5Ht8UaEIF9I5cOAAvv3tb+Ott97CNddcE9S/z7VlNfAp6fT39+PYsWMhVbcPNUTi4Rg0TWNqaoqxczhx4gTWr1/P2DkUFRX5TUIjIyMYHBz0u4gdahDdtZSUFGRlZTFdXXa73a253eHDUtx8czQKCih0dJhCuPpPGyFUKhWqq6sRGxsb0vUQkMiSEBGpGblyrNVqtWhubkZxcbFgSQdYnIn593//dxw8eBDXXntt0P/+a6+9hrvuugu//e1vGcvq//3f/0VPTw8yMzOXWFafPn0aW7duxX/9138xltU/+clP0NTUhHXr1sFqteILX/gCmpqa8M477zjUgxQKRVgMFnMJkXh4BE3TUKvVeOutt/D666/jgw8+QElJCaMf561SMbnLnpycdNtuLHQ4666R900cLEkKyWw2M1446enp+P73Y/D88xG4+24bnn+eG/8df0BRFLq6ujA3N8dry3qgIPI9pM5mt9uZ8ymTydDW1uagCCFEHDp0CPfeey/+8pe/hHTO5fnnn8ezzz7LWFb/6le/Qn19PQBg27ZtyM/Pxx//+Efm+QcPHsRjjz2G4eFhFBcX46c//Smuu+46AIv1QHezUceOHcO2bdv4fjuCgkg8QQLpViKeQkeOHEF+fj5j57Bu3TqX6SbS+TU/P4+qqirB3GX7Ale6a67gytzuoYeuxsBAPF5+WY8vfSk0tSzSXk+8jLj2keELhNSVSiUmJydhMpkQHx+P3NxcZGRkCPIu+5133sHdd9+NV155BTfffHOolyOCJ4jEEyLMz8/jnXfeYTyFVqxYwZBQZWUlpFIpVCoVjh07hry8PFRWVgpyo1gOMzMz6OjoQElJic81qdFRI8rKFhUY/ud/DiM/P5apYwTLE8lutzNeTFVVVWH5GWg0GrS0tCA/Px9SqRQzMzOYn59HUlKSgx9OqPH3v/8dd9xxB37/+9/jS1/6UqiXI4JHiMQjAOh0OgdPIYVCga1bt+L999/Hhg0b8Nprr4WdhA/wqVjpunXr/NK9e+MNGe68Mwrl5RQ+/HCWiYRmZ2cD6ujyFjabDa2trbDb7aisrAw7Az3gU9JxJn7ihzMzMwONRsP4NKWnpzu0vQcLx44dw6233orf/OY3uOOOOwTVqSmCe4jEIzAYjUa8/PLL+O53vwur1Yq0tDSmRdsfT6FQgTRCBDJY+a1vReDllyPw7/9uxU9/+qk2HOnoInIzfJjbEattmUzGiKaGGwjplJaWepxVs1qtDt5CpO2dmLLxPSN28uRJfOELX8C+ffvw1a9+VSSdywAi8QgMp06dws6dO3H//ffj0UcfxQcffMB4CslkMtxwww248cYbceWVVwryDtwb3TVvsWFDNAYHpTh40IzrrnM9w+NsbhcZGcmQUFJSkl+bmMViQVNTE+M6G0xFCK5A/JiWIx1nuLPI8MaUzR+cOXMGN954I/7rv/4L3/jGN0TSuUwgEo/AcODAASwsLODf/u3fHB63Wq04ceIEXn/9dRw6dAhWqxU33HADdu/ejW3btgmi4E3TNLq7u5l240BSYGNjEpSWxkAmozE+boQ3c3ZcmNuZzWY0NTUxMkShNsTzB4R0ysrKArKBpmkac3NzTIqTdBwSIgr0xuf8+fPYuXMnnnzySXzrW98SSecygkg8YQibzYZTp04xJKTT6XDddddh9+7duOaaa0LS6svWXeOi3fj//T8Zvv71KNTV2XHsmO82186uoGxzO3fCmyaTCY2NjUhKSsLatWvDknRUKhXa2toCJh1nEFM2tjp5SkoKc059bfZoaWnB9ddfj+9973v4zne+I5LOZQaReMIcdrsdZ8+exRtvvIH/+7//g1qtxo4dO7B792589rOf5a3wzgYpwttsNs667+65JxKvvirHww9b8Z//GZj3D7lzn56exszMDFM7I8KbcrkcBoMBjY2NSE1N9Xq+Smjgi3RcwWg0MgOrWq3WQRg2Li7O4/nr6OjAtddei7179+J73/teWJ5rEYFBJJ5LCBRF4fz58wwJTUxMMJ5C1157LS+6UBaLBS0tLZwW4WkaKCqKxtSUFO++a8K2bdw5jtI0jYWFBebO3Wg0IikpCQsLC8jMzAxb0iF24WvXrnWrJ8YXLBaLg7dQVFSU2zpbd3c3rr32Wnz961/Hk08+GZbnWkTgEInnEgVFUWhra2M8hYaGhrB9+3bs3LkT119/PSeeQiaTCU1NTYiLi8O6des4Kzz39kpQVRWDqCgaFy8awefIzszMDNrb2yGXy2G1Whn154yMDEHUzbyBUqlk7MKDTTrOYNfZVCoVJBIJent7kZycjLKyMuzevRt33XUXfvKTn4RlKlMENxA/+UsUUqkUFRUV+NGPfoTOzk40NjaitrYWv/nNb1BQUIAbb7wRf/zjH6FSqfyyXdbr9fjkk0+QlJTEeecXsUHYtInilXTm5ubQ2dmJwsJCbN26FVu2bEFaWhqmpqZw8uRJfPzxxxgeHobRaORvEQGCkM66detCTjoAmIaOdevW4aqrrsL69esxNjaG73znO2hoaEBCQgI2bNiAhYUFXv7+Cy+8gPz8fERHR6O+vh4ff/yxx+cfPHgQpaWliI6Oxvr16/Hee+85/J6maTzxxBNYsWIFYmJisH37dvT39/Oy9ssJIvFcBpBIJCgvL8cPfvADNDc3o6OjA9u2bcMf/vAHrF69GjfccAN+97vfYWpqyisSmp+fxyeffIKsrCysXbuW83QJsUH4zGf4s0HQarWMARrR0CLmdrW1tbjyyiuRnZ0NjUaDjz76CGfPnsXQ0BB0Op1fRM0H2KTjz4Au35BKpVAoFPja176GmJgY3Hzzzbj11lvx9NNPIz09HT/4wQ84/XuvvfYa9u7dix/84AdoamrCxo0bsWPHDszMzLh8/unTp3HbbbfhnnvuQXNzM3bv3o3du3ejo6ODec5Pf/pT/OpXv8L+/ftx7tw5xMXFYceOHTCZQitYG+4QU22XMWiaxoULF5ia0CeffIJNmzYxA6vZ2dlLSIV4AS2nu+Yv7HZg1aoYaLUSHD9uQm0td/UdAtJu7K2Mj9VqdZgV8sWCgC+QFKFQSYdgYmICO3bswPbt27F//34mvTYwMACDwYANGzZw9rfq6+tRW1uL559/HsBiujk3Nxf333+/WysDvV6Pd955h3ls06ZNqKiowP79+0HTNLKzs/HQQw/hO9/5DoDFKDkzMxN//OMfRVmfACBGPJcxJBIJCgsL8fDDD+Ojjz7C0NAQvvCFL+Dtt99GWVkZrrnmGjz33HMYHh4GTdP485//jN/97ndYs2YNL6QDAG1tEmi1EiQm0qis5J50ZmZmmBkXb7XjIiIisGLFCmzcuBHbtm1DUVERU986deoUent7odVqgxYJEdJZv369oElnamoK1113Ha666iq8+OKLDjWdoqIiTknHYrGgsbER27dvZx6TSqXYvn07zpw54/I1Z86ccXg+AOzYsYN5/oULFzA1NeXwnKSkJNTX17s9pgjvIBKPCACLJJSbm4sHHngAx48fx9jYGO688068//772LhxI9auXYtvfvObkMlkPk3C+4pjxxbrO1dcYQfXKjVTU1Po6OjAunXr/G43lslkyMzMxPr167F161aUlZXBbrejtbUVJ06cQFdXF1QqFSiKe9IEFl0tCelkZGTw8je4wMzMDK6//nrU1dXh97//Pe/qDyqVCna7fQkRZ2ZmYmpqyuVrpqamPD6f/NeXY4rwDpcE8Wg0Gtx+++1ITExEcnIy7rnnHuh0Oo+vMZlM+Pd//3ekpqYiPj4eN9988xLrWgK1Wo2VK1dCIpFgdnaWh3cgLBB30G9+85t4//338fjjj2NmZgYbNmzAj3/8YzQ0NODpp59Gd3c353f5J04sblBctlADiymfrq4ubNiwgbMNWyqVIi0tDWvXrsXWrVuxYcMGSKVSdHV14cSJE2hvb8f09DTsdm5qVdPT0+jo6OD0PfABlUqFz3/+81i3bh3++Mc/hqXOnQh+cUkQz+23347Ozk4cOXIE77zzDj788EPcd999Hl/z7W9/G2+//TYOHjyIEydO4OLFi7jppptcPveee+7hNC0QTvjJT36CX//61zh58iTOnz+PyclJ7N27Fy0tLdiyZQtqamrw1FNPob29PeC7fIsFOH168ZLcupW7xoLR0VH09fWhsrKSN+dWiUQChUKB0tJSXHnllaiqqkJ0dDQGBgZw/PhxtLa2YnJyElarf8OwbNIRsmWyVqvFrl27UFhYiD//+c9B0xNMS0uDTCZbcvM4PT3tttsvKyvL4/PJf305pgjvEPbE093djcOHD+P3v/896uvrccUVV+DXv/41Xn31VVy8eNHla+bm5vDyyy/jF7/4Ba6++mpUV1fjD3/4A06fPo2zZ886PPfFF1/E7OwsU1y83LBt2zacOnUKNTU1zOb6la98BW+//Tamp6fx2GOPob+/H1dffTUqKirw+OOPo6mpyS8S+vhjKQwGCdLTaZSXcxNJXbhwAYODg6iqqkJKSgonx1wOEokESUlJKC4uxubNm1FfX4+EhASMjIzgxIkTaGpqwvj4OCwW7xxVSYpQ6KQzNzeHXbt2YcWKFfjf//3foHoXRUZGorq6GkePHmUeoygKR48eRUNDg8vXNDQ0ODwfAI4cOcI8v6CgAFlZWQ7PmZ+fx7lz59weU4R3CPsY+MyZM0hOTkZNTQ3z2Pbt2yGVSnHu3DnceOONS17T2NgIq9XqUDQsLS1FXl4ezpw5g02bNgEAurq68NRTT+HcuXMYGhri/80IEFu2bHH7u6SkJNx+++24/fbbodPp8N577+HNN9/EddddB4VCwVh819bWepXjJ2m2rVvtCLRRjK2SXVNTg4SEhMAO6CckEgni4+MRHx+PwsJCGAwGzMzM4OLFi+jp6UFSUhIyMzORnp7uUt9uamoKXV1d2LhxI2/RGhdYWFjATTfdhJSUFLzxxhshGb7du3cv7rrrLtTU1KCurg779u2DXq/H3XffDQC48847kZOTg6effhoA8MADD2Dr1q34+c9/juuvvx6vvvoqzp8/j5deegnA4mf34IMP4kc/+hGKi4tRUFCAxx9/HNnZ2di9e3fQ39+lhLAnnqmpqSX5brlcDoVC4bGoGBkZieTkZIfH2UVDs9mM2267Dc8++yzy8vIuW+LxFvHx8fjiF7+IL37xizAYDPjHP/6BN954AzfffDPi4uKwc+dO7Nq1Cw0NDW5z/mR+Z9u2wNJsNE2jr68P09PTqKmpQXx8fEDH4xKxsbHIz89Hfn4+TCYT4yvU19e3xNxucnIS3d3d2LBhg6BJR6/X45ZbbkFUVBQOHToUEpFaYLE9WqlU4oknnsDU1BQqKipw+PBhpjlgdHTUobNu8+bNOHDgAB577DF873vfQ3FxMQ4dOoR169Yxz/mP//gP6PV63HfffZidncUVV1yBw4cPB80B91KFYInnkUcewTPPPOPxOd3d3bz9/UcffRRlZWX48pe/zNvfuFQRGxvLDOOZTCYcPXoUb7zxBm6//XbI5XLGU+iKK65gagA63WKqDQissYCmafT09EClUqGmpkYQls7uEB0djdzcXOTm5jJ6Z9PT0xgaGkJERAQsFgtKSkqQmpoa6qW6hdFoxK233gqKovDuu+8GRZTWE/bs2YM9e/a4/N3x48eXPHbLLbfglltucXs8iUSCp556Ck899RRXSxQBARPPQw89hK985Ssen1NYWIisrKwlk8k2mw0ajcZjUdFisWB2dtYh6mEXDT/44AO0t7fj9ddfBwCmeystLQ3f//738eSTT/r5zi4vREdH4/rrr8f1118Pq9WK48eP4/XXX8c999wDm83GeArZbNths0mwahWFggL/6jsURaGrqwtzc3Oora0Nq7vSyMhIZGdnIzs7G2NjY4y+WX9/P0ZG/n97dx4U1ZX9Afz7WBoGEFAWKSIYQ1QwYBQEhIzFKCooI0JIdIgYp2FkCELGuJQ4LuhkMjFi3EaNM04sx1IDCqhRIyQCbkBYmhFkEZewKNJEMRgVZOm+vz/6109aERR6A8+nqgt8ffv1vXSVp999955T0+fidqrw+PFjfPDBB2hubkZ6errGpjNJ/9PvMxdUVFRgzJgxKCwshJubGwDg+++/h7+/P27dutXlnpP79+/DysoK33zzDUJCQgAAlZWVcHR05O/x3LhxQyFHV0FBAcLDw5GTkwMHBwetXs7aH3SuKXT06FHcvbsCbW0fY/Lkn5CcbP7SQUMqleLy5ctobm6Gq6trv0nw+TT5vZ+3334bFhYWkEgkChVBOY7jg9DgwYM1lmizra0NYWFhqK+vx5kzZ9S2cIMMDP0+8ADAjBkz0NDQgN27d6O9vR1CoRATJkzAoUOHAMj2cPj6+mL//v3w8PAAAHz00Uf47rvvsG/fPpiamiI2NhaALH9TV86ePYvJkyfjl19+eebeEOkbiUQCJ6cWXLtmAkvLj9Haug/+/v4ICgrCtGnTepy+kUgkKCkpQWtrK1xdXdW6mkqZ5EFn3LhxGDJkyDPPP13cTiqV8oXYVFGW+nna29uxYMECVFVVITMzU6unAol20tqptpdx8OBBxMTEwNfXFzo6OggJCcH27dv559vb21FZWYnm5mb+2JYtW/i2ra2t8PPzw65duzTR/VdeU5Murl+XLQAoLt6KmzfnISUlBfHx8Vi4cCGmT5/O1xR6ejpHXoROIpHAzc1NbftGlK2urg6VlZXPDTqAbMOqhYUFLCws4OjoyJelvnr1Ktra2p4pbqcKHR0d+NOf/oRr164hKyuLgg7plQFxxUP6t5QU4L33gDFjgLKyJ8elUimKi4v5mkLV1dUKNYU6OjoQHR2N6OhoTJo0SW3f+JXt1q1buHr1ardBpzuMMTx8+JC/EmpubsaQIUNgbW0NKysrpV0BSiQSREVFQSQS4ezZs7SJkvQaBR6icdHRwFdfAbGxQKcLVQWMMZSVlfH3hCoqKiAQCGBjY4OTJ0/Czs5Oa266vwx50Bk/frzS7pM8evSID0IPHjzgi9tZWVn1esGFRCJBbGwssrOzcfbs2RdOsEpIV/p95gJto4q8ccXFxQgNDYWdnR1+85vfwMnJCdu2bVP1UNQmM1P209f3+W04joOzszPWrVuHtLQ0fi/MoEGD4OLiglmzZuE///kPGhoatKZeTk9UEXQAwNjYGCNGjICnpyfeeecdWFlZoaGhARcvXuSL23Wedu6JVCrF0qVLce7cOZw5c4aCDukzuuJRshkzZqC+vh7/+te/+IUO7u7u/EKHrnz00Uc4deoU9u3bBzMzM8TExEBHRwfZ2dkAgL1796K4uBjvvvsu7OzskJOTg8jISGzcuPG5exb6i7o6YNgwQEcHaGwEelq3ce/ePUycOBETJ07E3r17oauri59++kmhppC3tzdmz56NwMDALmsKaYObN2/i+vXrGD9+vNoWq7S1tfFXQvfu3YOxsTGsra0xdOhQGBsbd/l3kkqliIuLw7fffousrCw4ODiopa9kYKPAo0Typd0FBQV8Cp+0tDTMnDmzx6Xdhw4dwnvvvQcAuHLlCpycnBTS9zxt0aJFqKioQKb8cqGf2r8fWLAAcHcHeqhSDEA25Xb48GG8//77zywlZozh5s2bSE1NRWpqKnJycuDu7s4XtrO3t9eKIKSJoPO0FyluJ5VKsWbNGiQlJeHs2bMYNWqURvpKBh6aalOinvLGdaWnvHHPc//+/V7diNY2LzLN1hnHcZg7d26X+1c4joO9vT0WL16Mc+fOoba2FmFhYfj+++8xduxYPi/X9evXNTYdV1tbq/GgAzxb3G7kyJFobW1FUVERZs6cifDwcAiFQhw8eBBnzpxRW9ChqepXAwUeJVJV3rin5eTkICkpqcfSD9qOMUCe+HfKFOWem+M42NraYtGiRcjIyMDt27cRGRnJZ9r29vbGhg0bcOXKFbUFodraWty4cUPjQedpurq6sLa2hrOzM3x8fBAZGYmSkhKkpKSgo6MDW7ZswenTp9Ha2qryvqiixIlIJIK1tTUOHDiAsrIyrFq1CitXruRLZBP1o8DzAuLi4sBxXLePK1euqKUvpaWlmD17NuLj4zF9+nS1vKeqXLsG3LoFCARAN0mw+4zjOFhZWSEyMhJpaWkQi8VYvHgxioqK4O3tDXd3d3z66acoLS1VWeXQmpoavjyDNgWdp3Ech+rqaojFYuTl5eH48eMwMTFBVFQUNmzYoNL3VlWJk/DwcGzbtg0+Pj544403EBYWBqFQiNTUVJWOhzzfgNhAqmqazhsnV15eDl9fX0RGRmL16tW9Gos2kU+zeXsD6srlKa8pJBQKIRQKcf/+fZw4cQKpqan43e9+h9deew2zZ89GUFAQxo0bp5SUNDU1Nfjpp5/g6uoKMzMzJYxCNRhj2LlzJzZt2oT09HS4u7sDACZNmoTNmzer/IpHlSVOnjZQpqr7Kwo8L8DKyuqFCnB5eXmhqakJIpGIzxuXmZkJqVQKT0/PLl8j322fkZGhkDeutrZWodhUWVkZpkyZggULFuCzzz5Twqg0T1XTbC/DzMwMYWFhCAsLw4MHD/iaQjNmzIClpaVCTaHeBKHq6mpUVVX1i6CzZ88efPbZZzh9+jSfWkqO4ziVJ11V91T1qVOnlNJv8vJoqk2JnJyc4O/vj4ULFyI/Px/Z2dmIiYnBH/7wB35FW11dHRwdHZH//0u4zMzMEBERgSVLliArKwsikQhCoRBeXl78t7XS0lJMnjwZ06dPx5IlSyAWiyEWi3Hnzh2NjbWvpFIgK0v2+4suLFC1QYMGYe7cuUhKSkJDQwM2b96MxsZGBAcHw8nJCcuWLcPFixchkbxYvSB50HFzc9P6oPPf//4Xa9euxbfffgtvb2+lnp+mqsnT6IpHyVSRNy45ORl37tzBgQMHcODAAf748OHDUV1drZZxKVtJiWzfjomJbCm1tjEyMkJwcDCCg4Px+PFjnDlzBikpKQgNDYVAIOBrCr3zzjtd5oerrq5GdXU13NzcYGpqqoERvBjGGA4dOoQVK1bg+PHj8PHxUfp70FQ1eRrt4yEa8eWXwLJlwMyZQH+a8Whvb0dWVhaSk5Nx/PhxSKVSBAQEIDg4GD4+PhAIBNiwYQPefPNN+Pn5aXWNGsYYjhw5gpiYGCQnJ8Pf31+j/VFViRNAcap648aN6hsU6RIFHqIRM2cCp0/LAtCSJZruTe90dHTgwoULSE5OxrFjx9Dc3AxbW1tUVVXh6NGjmDRpkqa72K1jx45h4cKFSExMxKxZszTdHQCqKXFSWlqKKVOmwM/PDwkJCfx76erqvtC9W6ICjAwoO3bsYMOHD2cGBgbMw8OD5eXlddv+8OHDbPTo0czAwIA5OzuzU6dOKTwvlUrZmjVrmI2NDTM0NGS+vr7s6tWrfepjWxtjxsaMAYxdutSnU2mNjo4OFhERwQwNDdnQoUOZqakpmzNnDjt48CC7c+cOe/TokVY9kpKSmJGREUtJSdH0n05BY2MjCw0NZSYmJszU1JQJhUL24MED/vmqqioGgGVlZfHHWlpaWHR0NBs8eDAzMjJiwcHBrL6+nn8+Pj6eAXjmMXz4cDWOjHRGgWcASUxMZAKBgO3du5eVlZWxhQsXMnNzc9bQ0NBl++zsbKarq8s2btzIysvL2erVq5m+vj67fPky32bDhg3MzMyMHTt2jBUXF7PAwEA2YsQI1tLS0ut+XrwoCzqWloxJJL0+jVZZt24ds7S0ZCUlJUwikbDc3Fy2bNky5uDgwIyNjVlQUBDbt28fE4vFGg86qampzMjIiCUmJmr6z0ZeURR4BhAPDw+2aNEi/t8SiYTZ2tqyzz//vMv2c+bMYQEBAQrHPD092Z///GfGmOxqx8bGhiUkJPDPNzU1MQMDA/bNN9/0up/r18sCz/vv9/oUWichIUEhYMtJJBImEonYypUr2ejRo5mhoSH7/e9/z/bs2cPq6urYw4cP1Rp0Tpw4wYyNjdn+/fuZVCrVwF+KEMZoOfUA0dbWBpFIpLCRTkdHB1OnTn1uzrfc3FyF9gDg5+fHt6+qqoJYLFZoY2ZmBk9Pz27zyPXkZfOz9QfLli2Ds7PzM8d1dHTg6uqKf/zjH6ioqEB+fj5cXV2xfft2jBgxAiEhIdi/fz8aGxtVnrrn/PnzCA0NxbZt2xAWFqYVCVPJq4kCzwBx9+5dSCQSDB06VOF4dxvpxGJxt+3lP1/mnD1pbgbkMUuTG0c1geM4uLi4YP369SguLkZxcTEmTZqEPXv2wMHBAYGBgfj666/x888/Kz0I5ebmYs6cOdi4cSPCw8Mp6BCNosBD1OriRaCtDbCzA958U9O90RyO4+Do6IhVq1ahsLAQFRUVmD59Og4ePIiRI0dixowZ2L17N27fvt3nIFRQUICQkBD8/e9/R1RUFAUdonEUeAYIS0tL6OrqKqSDB7reSCdnY2PTbXv5z5c5Z086T7PR/38yHMfBwcEBK1asQG5uLq5fv47g4GAcPXoUjo6OmDZtGrZv347a2tqXDkL/+9//EBQUhNWrVyM2NpaCDtEKFHgGCIFAADc3N2TIE6BBVj0yIyNDIedbZ15eXgrtAeCHH37g248YMQI2NjYKbX799Vfk5eU995w90Yb8bNqM4zgMHz4cn3zyCc6fP4+amhp88MEHSE9Ph4uLC3x8fLB582bcuHGjxyB0+fJlBAYGYvny5Vi6dCkFHaI9NLq0gShVYmIiMzAwYPv27WPl5eUsMjKSmZubM7FYzBhjbP78+SwuLo5vn52dzfT09NimTZtYRUUFi4+P73I5tbm5OTt+/DgrKSlhs2fP7vVy6nv3GOM42Yq2urq+j/dVIpVKmVgsZrt372bTpk1j+vr6bOzYsWzt2rWsqKjomdVxBQUFzNLSkq1du5ZWrxGtQ4FngPnnP//J7O3tmUAgYB4eHuzHH3/kn/Px8WELFixQaH/48GE2atQoJhAI2FtvvfXcDaRDhw5lBgYGzNfXl1VWVvaqb0ePyoKOo2OvXk7+n1QqZXfv3mVff/01CwgIYAYGBmzMmDFs5cqVLD8/nxUVFTEbGxsWFxdHQYdoJUqZQ9QmNhbYsQOIjgZ27tR0bwaOpqYmvqZQWloaOjo6EBERgV27dimlnhAhykaBh6jNmDFARQWQkgJ0qkxMlOjXX39FQkIC1q1bB11dXU13h5Au0dchonI7d+7EsGHuqKgAACkGDRJ12/7IkSNwdHSEoaEhXFxc8N133/HPtbe3Y8WKFXBxcYGxsTFsbW3x4YcfPrc08qvG1NQUn376qVqDzr179zBv3jyYmprC3NwcERERePjwYbevefz4MRYtWgQLCwuYmJggJCTkmdWTco2NjRg2bBg4jkNTU5MKRkDUjQIPUamkpCQsWbIEM2duAgBYWt7EnDlTn6m7IpeTk4PQ0FBERETwS4GDgoJQWloKAGhubkZRURHWrFmDoqIipKamorKyEoGBgWobE1E0b948lJWV4YcffsDJkydx/vx5REZGdvuaTz75BCdOnMCRI0dw7tw53L59G+8+5zI4IiICY8eOVUXXiaZo9hYTGejk+eOEQtnCgmXLpH3KH9eV/Px8BoDV1NQote+kZ+Xl5QwAKygo4I+dPn2acRzH6p6zdLGpqYnp6+uzI0eO8McqKioYAJabm6vQdteuXczHx4dlZGQwAOyXX35RyTiIetEVD1EZef44X9+p/P6dqVO5PuWP68r9+/fBcZxCBUqiHrm5uTA3N8eECRP4Y1OnToWOjg7y8vK6fI1IJEJ7e7vC5+zo6Ah7e3uFz7m8vBx/+9vfsH//flokMcDQp0lURp4/rqPDHrW1gL4+8Nvf9i1/3NMeP36MFStWIDQ0VKtLTA9UYrEY1tbWCsf09PQwZMiQbj9jgUDwzBeFzp9za2srQkNDkZCQAHt7e5X0nWgOBR6icoWFZgCAiRMBY2Plnbe9vR1z5swBYwxfffWV8k5MEBcXB47jun1cuXJFZe+/cuVKODk5ISwsTGXvQTRHT9MdIAOXPH9cTo4BgCdlEPqSP05OHnRqamqQmZlJVztKtnTpUvzxj3/sts0bb7wBGxubZxaKdHR04N69e91+xm1tbWhqalK46un8OWdmZuLy5ctITk4GAD49kKWlJVatWoX169f3cmREG1DgISojEAjg6joBIpHsimfKlCf542JiYrp8jTx/3OLFi/ljnfPHAU+CzrVr15CVlQULCwuVjuNVZGVlBSsrqx7beXl5oampCSKRCG5ubgBkQUMqlcLT07PL17i5uUFfXx8ZGRkICQkBAFRWVqK2tpb/nFNSUtDS0sK/pqCgAOHh4bhw4QIcHBz6OjyiaZpe3UAGti++OM0AxgSCNnbpUt/zx7W1tbHAwEA2bNgwdunSJVZfX88/WltbNTLGV52/vz8bP348y8vLYxcvXmQjR45koaGh/PO3bt1io0ePZnl5efyxqKgoZm9vzzIzM1lhYSHz8vJiXl5ez32PrKwsWtU2gFDgISq1ZYtsGbWhYZZS8sdVVVUxAF0+srKy1DMooqCxsZGFhoYyExMTZmpqyoRCIXvw4AH/vPwz6/z5tLS0sOjoaDZ48GBmZGTEgoODWX19/XPfgwLPwEIpc4hKzZoFnDwJbNwILF+u6d4QQrQBrWojKtPRAZw7J/tdvrCAEEIo8BCVKSwEHjwABg8Gxo3TdG8IIdqCAg9RGXm2gsmTAW3beL5z5068/vrrMDQ0hKenJ/Lz87tt313i0qdFRUWB4zhs3bpVyb0mZGDQsv8OyEAiDzzaNs0mT1waHx+PoqIivP322/Dz8+t14tLOjh49ih9//BG2traqHgYh/RYtLiAq0dIim2JrbQWuXAFGj9Z0j57w9PSEu7s7duzYAUC2t8jOzg6xsbGIi4t7pv3cuXPx6NEjnDx5kj82ceJEjBs3Drt37+aP1dXVwdPTE+np6QgICMDixYsV9iMRQmToioeoRE6OLOjY2gKjRmm6N0/IE5d2TlCpo6PT58SlUqkU8+fPx/Lly/HWW2+ppvOEDBAUeIhKdJ5m4zjN9qUzeeLSl0lE+iKJS7/44gvo6enh448/Vn6nCRlgKGUOUYnMTNlPbbu/owoikQjbtm1DUVEROG2KsoRoKbriIUp3/z5QUCD7fcoUzfblafLEpS+SiFSup8SlFy5cwM8//wx7e3vo6elBT08PNTU1WLp0KV5//XWVjIOQ/owCD1G6c+cAqRQYORKws9N0bxQJBAK4ubkhQz4XiCeJSzsnIu1Mnri0s86JS+fPn4+SkhJcunSJf9ja2mL58uVIT09X3WAI6adoqo0onbZPsy1ZsgQLFizAhAkT4OHhga1bt+LRo0cQCoUAgA8//BCvvfYaPv/8cwDAX/7yF/j4+ODLL79EQEAAEhMTUVhYiH//+98AAAsLi2cyZOvr68PGxgajtWk5HyFaggIPUbqtW2UPbTV37lzcuXMHa9euhVgsxrhx45CWlsYvIKitrVUotezt7Y1Dhw5h9erV+Otf/4qRI0fi2LFjcHZ21tQQCOnXaB8PIYQQtaJ7PIQQQtSKAg8hhBC1osBDCCFErSjwEEIIUSsKPIQQQtSKAg8hhBC1osBDCCFErSjwEEIIUSsKPIQQQtSKAg8hhBC1osBDCCFErf4PT48v5B65TI0AAAAASUVORK5CYII=",
62
+ "text/plain": [
63
+ "<Figure size 640x480 with 1 Axes>"
64
+ ]
65
+ },
66
+ "metadata": {},
67
+ "output_type": "display_data"
68
+ }
69
+ ],
70
+ "source": [
71
+ "# create 3d plot with the 2 vecotrs\n",
72
+ "fig = plt.figure()\n",
73
+ "ax = fig.add_subplot(111, projection='3d')\n",
74
+ "\n",
75
+ "# plot the sushi vector\n",
76
+ "ax.quiver(0, 0, 0, sushi_vector[0], sushi_vector[1], sushi_vector[2], color='b')\n",
77
+ "ax.text(sushi_vector[0], sushi_vector[1], sushi_vector[2], \"sushi\", color='b')\n",
78
+ "\n",
79
+ "# plot the japanese vector\n",
80
+ "ax.quiver(0, 0, 0, japanese_vector[0], japanese_vector[1], japanese_vector[2], color='r')\n",
81
+ "ax.text(japanese_vector[0], japanese_vector[1], japanese_vector[2], \"japanese\", color='r')\n"
82
+ ]
83
+ }
84
+ ],
85
+ "metadata": {
86
+ "kernelspec": {
87
+ "display_name": "Python 3",
88
+ "language": "python",
89
+ "name": "python3"
90
+ },
91
+ "language_info": {
92
+ "codemirror_mode": {
93
+ "name": "ipython",
94
+ "version": 3
95
+ },
96
+ "file_extension": ".py",
97
+ "mimetype": "text/x-python",
98
+ "name": "python",
99
+ "nbconvert_exporter": "python",
100
+ "pygments_lexer": "ipython3",
101
+ "version": "3.10.12"
102
+ }
103
+ },
104
+ "nbformat": 4,
105
+ "nbformat_minor": 2
106
+ }
my-app/package-lock.json CHANGED
The diff for this file is too large to render. See raw diff
 
my-app/package.json CHANGED
@@ -5,12 +5,15 @@
5
  "dependencies": {
6
  "@emotion/react": "^11.11.4",
7
  "@emotion/styled": "^11.11.5",
8
- "@mui/material": "^5.15.15",
 
9
  "@testing-library/jest-dom": "^5.17.0",
10
  "@testing-library/react": "^13.4.0",
11
  "@testing-library/user-event": "^13.5.0",
 
12
  "react": "^18.3.1",
13
  "react-dom": "^18.3.1",
 
14
  "react-scripts": "5.0.1",
15
  "web-vitals": "^2.1.4"
16
  },
 
5
  "dependencies": {
6
  "@emotion/react": "^11.11.4",
7
  "@emotion/styled": "^11.11.5",
8
+ "@mui/icons-material": "^5.16.4",
9
+ "@mui/material": "^5.16.4",
10
  "@testing-library/jest-dom": "^5.17.0",
11
  "@testing-library/react": "^13.4.0",
12
  "@testing-library/user-event": "^13.5.0",
13
+ "plotly.js": "^2.33.0",
14
  "react": "^18.3.1",
15
  "react-dom": "^18.3.1",
16
+ "react-plotly.js": "^2.6.0",
17
  "react-scripts": "5.0.1",
18
  "web-vitals": "^2.1.4"
19
  },
my-app/src/App.js DELETED
@@ -1,53 +0,0 @@
1
- import React, { useState } from "react";
2
-
3
- const App = () => {
4
- const [wordOne, setWordOne] = useState("");
5
- const [wordTwo, setWordTwo] = useState("");
6
- const [message, setMessage] = useState("");
7
-
8
- const onPressButton = () => {
9
- // Construct the URL with query parameters
10
- const url = `https://abadesalex-emb-rep.hf.space/api/sum_of_lengths?word1=${wordOne}&word2=${wordTwo}`;
11
- // const url = `http://localhost:8000/api/sum_of_lengths?word1=${wordOne}&word2=${wordTwo}`;
12
-
13
- fetch(url, {
14
- method: "GET",
15
- headers: {
16
- "Content-Type": "application/json",
17
- },
18
- })
19
- .then((response) => response.json())
20
- .then((data) => {
21
- if (data.sum !== undefined) {
22
- setMessage(`Sum of lengths: ${data.sum}`);
23
- } else {
24
- setMessage("Error: Unexpected response");
25
- }
26
- })
27
- .catch((error) => {
28
- console.error("Error:", error);
29
- setMessage("Error: Failed to fetch data");
30
- });
31
- };
32
-
33
- return (
34
- <div>
35
- <input
36
- type="text"
37
- value={wordOne}
38
- onChange={(e) => setWordOne(e.target.value)}
39
- placeholder="First Word"
40
- />
41
- <input
42
- type="text"
43
- value={wordTwo}
44
- onChange={(e) => setWordTwo(e.target.value)}
45
- placeholder="Second Word"
46
- />
47
- <button onClick={onPressButton}>Submit</button>
48
- <p>{message}</p>
49
- </div>
50
- );
51
- };
52
-
53
- export default App;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
my-app/src/Components/ActiveWords/index.jsx ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Grid, Typography } from "@mui/material";
2
+ import { useEffect, useState } from "react";
3
+ import { WordsContext } from "../Context/WordsContext";
4
+ import CreateWordEmbedding from "../CreateWord/CreateWord";
5
+ import WordCard from "../WordCard";
6
+ import EmbeddingPlot from "../Plot";
7
+
8
+ export default function ActiveWords() {
9
+ const [words, setWords] = useState([]);
10
+ // const [embedding, setEmbedding] = useState([]);
11
+
12
+ const fetchWords = async () => {
13
+ const response = await fetch("http://localhost:8000/api/words");
14
+ const wordsResponse = await response.json();
15
+ setWords(wordsResponse.data);
16
+
17
+ // console.log("response", wordsResponse.data);
18
+ // console.log("words", words);
19
+
20
+ };
21
+
22
+ const deleteWord = async (id) => {
23
+ await fetch(`http://localhost:8000/api/delete-word/${id}`, {
24
+ method: "DELETE",
25
+ headers: { "Content-Type": "application/json" },
26
+ });
27
+ await fetchWords();
28
+ };
29
+
30
+ useEffect(() => {
31
+ fetchWords();
32
+ }, []);
33
+
34
+ return (
35
+ <>
36
+ <WordsContext.Provider value={{ words, fetchWords }}>
37
+ <Grid container>
38
+ <Grid item xs={8} container direction={"column"}>
39
+ <Grid item>
40
+ <CreateWordEmbedding />
41
+ </Grid>
42
+ <Grid item>
43
+ <EmbeddingPlot words={words}/>
44
+ </Grid>
45
+ </Grid>
46
+ <Grid item xs={4}>
47
+ <Grid item>
48
+ <Typography variant={"h4"}>Active Words</Typography>
49
+ </Grid>
50
+ <Grid container direction={"column"} mt={2}>
51
+ {words.map((word) => (
52
+ <Grid item key={word.id} mb={1} mr={1}>
53
+ <WordCard
54
+ word={word.item}
55
+ id={word.id}
56
+ deleteWord={deleteWord}
57
+ />
58
+ </Grid>
59
+ ))}
60
+ </Grid>
61
+ </Grid>
62
+ </Grid>
63
+ </WordsContext.Provider>
64
+ </>
65
+ );
66
+ }
my-app/src/Components/Body/index.jsx ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Grid } from "@mui/material";
2
+ import ActiveWords from "../ActiveWords";
3
+ import CreateWordEmbedding from "../CreateWord/CreateWord";
4
+ import { WordsContext } from "../Context/WordsContext";
5
+ import { useEffect, useState } from "react";
6
+
7
+ export default function Body() {
8
+ const [words, setWords] = useState([]);
9
+ const fetchWords = async () => {
10
+ const response = await fetch("http://localhost:8000/api/words");
11
+ const words = await response.json();
12
+ setWords(words.data);
13
+ };
14
+ useEffect(() => {
15
+ fetchWords();
16
+ }, []);
17
+ return (
18
+ <>
19
+ <WordsContext.Provider value={{ words, fetchWords }}>
20
+ <Grid container mt={2} mr={2} ml={2} textAlign={"center"} spacing={2}>
21
+ <Grid item xs={9}>
22
+ <CreateWordEmbedding />
23
+ </Grid>
24
+
25
+ <Grid item xs={3}>
26
+ <ActiveWords />
27
+ </Grid>
28
+ </Grid>
29
+ </WordsContext.Provider>
30
+ </>
31
+ );
32
+ }
my-app/src/Components/Context/WordsContext.js ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ import { createContext } from "react";
2
+
3
+ export const WordsContext = createContext({
4
+ words: [],
5
+ fetchWords: () => {},
6
+ });
my-app/src/Components/CreateWord/CreateWord.jsx ADDED
@@ -0,0 +1,65 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Button, Grid, TextField } from "@mui/material";
2
+ import React, { useContext, useEffect, useState } from "react";
3
+ import { WordsContext } from "../Context/WordsContext";
4
+
5
+ const CreateWordEmbedding = () => {
6
+ const [wordOne, setWordOne] = useState("");
7
+ const { words, fetchWords } = useContext(WordsContext);
8
+
9
+ const onChangeWordOne = (event) => {
10
+ const newWordOne = event.target.value;
11
+ setWordOne(newWordOne);
12
+ };
13
+
14
+ const onPressButton = () => {
15
+ // const url = `https://abadesalex-emb-rep.hf.space/api/sum_of_lengths?word1=${wordOne}&word2=${wordTwo}`;
16
+ // const url = `http://localhost:8000/api/sum_of_lengths?word1=${wordOne}`;
17
+ const url2 = `http://localhost:8000/api/add-word`;
18
+ const newWord = {
19
+ id: words.length + 1,
20
+ item: wordOne,
21
+ };
22
+
23
+ fetch(url2, {
24
+ method: "POST",
25
+ headers: {
26
+ "Content-Type": "application/json",
27
+ },
28
+ body: JSON.stringify(newWord),
29
+ }).then(fetchWords);
30
+ };
31
+
32
+ useEffect(() => {
33
+ fetchWords();
34
+ }, []);
35
+
36
+ return (
37
+ <>
38
+ <Grid container textAlign={"center"} spacing={2}>
39
+ <Grid item xs={5}>
40
+ <TextField
41
+ id="word-one"
42
+ label="Word"
43
+ variant="outlined"
44
+ onChange={onChangeWordOne}
45
+ fullWidth
46
+ />
47
+ </Grid>
48
+
49
+ <Grid item xs={5}>
50
+ <Button
51
+ variant="contained"
52
+ color="primary"
53
+ fullWidth
54
+ sx={{ height: "100%" }}
55
+ onClick={onPressButton}
56
+ >
57
+ Create Embedding
58
+ </Button>
59
+ </Grid>
60
+ </Grid>
61
+ </>
62
+ );
63
+ };
64
+
65
+ export default CreateWordEmbedding;
my-app/src/Components/Header/index.jsx ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { Grid } from "@mui/material";
2
+
3
+
4
+ export default function Intro() {
5
+
6
+ return (<>
7
+ <Grid>
8
+ <h1>Introduction</h1>
9
+ <p>
10
+ This is a simple web application that compares the similarity of two words using their word embeddings.
11
+ Word embeddings are numerical representations of words that capture their meanings.
12
+ This application uses the pre-trained word embeddings from the GloVe model, which is a popular word embedding model.
13
+ The similarity between two words is computed as the cosine similarity between their word embeddings.
14
+ The cosine similarity ranges from -1 to 1, where 1 indicates that the two words are similar, 0 indicates that they are orthogonal, and -1 indicates that they are dissimilar.
15
+ You can enter two words in the input fields below and click the "Compare Embedding" button to see the similarity between them.
16
+ </p>
17
+ </Grid>
18
+ </>);
19
+ }
my-app/src/Components/Plot/index.jsx ADDED
@@ -0,0 +1,62 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import { type } from "@testing-library/user-event/dist/type";
2
+ import { name } from "plotly.js/lib/bar";
3
+ import React from "react";
4
+ import Plot from "react-plotly.js";
5
+
6
+ const colors = [
7
+ 'red', 'blue', 'green', 'orange', 'purple', 'brown', 'pink', 'grey', 'yellow', 'cyan'
8
+ ];
9
+
10
+ export default function EmbeddingPlot({ words }) {
11
+ return (
12
+ <Plot
13
+ data={[
14
+ ...words.map((word, index) => {
15
+ const color = colors[index % colors.length];
16
+ return {
17
+ x: [0, word.embedding[0]],
18
+ y: [0, word.embedding[1]],
19
+ z: [0, word.embedding[2]],
20
+ type: "scatter3d",
21
+ mode: "lines+markers",
22
+ line: {
23
+ width: 6,
24
+ },
25
+ marker: {
26
+ size: 1,
27
+ color: color,
28
+ },
29
+ name: word.item,
30
+ };
31
+ }),
32
+ ...words.map((word, index) => {
33
+ const color = colors[index % colors.length];
34
+ return {
35
+ type: "cone",
36
+ x: [word.embedding[0]],
37
+ y: [word.embedding[1]],
38
+ z: [word.embedding[2]],
39
+ u: [word.embedding[0]],
40
+ v: [word.embedding[1]],
41
+ w: [word.embedding[2]],
42
+ sizemode: "absolute",
43
+ sizeref: 0.05,
44
+ showscale: false,
45
+ colorscale: [[0, color], [1, color]],
46
+ };
47
+ }),
48
+ ]}
49
+ layout={{
50
+ width: 800,
51
+ height: 600,
52
+ title: "3D Plot of Vectors",
53
+ scene: {
54
+ xaxis: { title: "X Axis" },
55
+ yaxis: { title: "Y Axis" },
56
+ zaxis: { title: "Z Axis" },
57
+ },
58
+ autosize: true,
59
+ }}
60
+ />
61
+ );
62
+ }
my-app/src/Components/WordCard/index.jsx ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from "react";
2
+ import { Grid, Typography, IconButton } from "@mui/material";
3
+ import CloseIcon from "@mui/icons-material/Close";
4
+
5
+ const WordCard = ({ word, id, deleteWord }) => {
6
+ return (
7
+ <Grid
8
+ container
9
+ alignItems="center"
10
+ justifyContent="space-between"
11
+ borderRadius={2}
12
+ border={1}
13
+ >
14
+ <Grid item>
15
+ <Typography margin={1}>{word}</Typography>
16
+ </Grid>
17
+ <Grid item>
18
+ <IconButton onClick={() => deleteWord(id)}>
19
+ <CloseIcon />
20
+ </IconButton>
21
+ </Grid>
22
+ </Grid>
23
+ );
24
+ };
25
+
26
+ export default WordCard;
my-app/src/index.js CHANGED
@@ -1,13 +1,17 @@
1
- import React from 'react';
2
- import ReactDOM from 'react-dom/client';
3
- import App from './App';
 
 
 
 
 
4
 
5
-
6
- const root = ReactDOM.createRoot(document.getElementById('root'));
7
  root.render(
8
  <React.StrictMode>
9
- <App />
 
 
10
  </React.StrictMode>
11
  );
12
-
13
-
 
1
+ import React from "react";
2
+ import ReactDOM from "react-dom/client";
3
+ import CreateWordEmbedding from "./Components/CreateWord/CreateWord";
4
+ import EmbeddingPlot from "./Components/Plot";
5
+ import Intro from "./Components/Header";
6
+ import WordCard from "./Components/WordCard";
7
+ import ActiveWords from "./Components/ActiveWords";
8
+ import Body from "./Components/Body";
9
 
10
+ const root = ReactDOM.createRoot(document.getElementById("root"));
 
11
  root.render(
12
  <React.StrictMode>
13
+ <Intro />
14
+ <ActiveWords />
15
+
16
  </React.StrictMode>
17
  );
 
 
my-app/testPlot.jsx ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+ import Plot from 'react-plotly.js';
3
+
4
+ export default function EmbeddingPlot({words}) {
5
+ const vector1 = [2, 4, 5];
6
+ const vector2 = [-1, 3, 4];
7
+
8
+ return (
9
+ <Plot
10
+ data={[
11
+ {
12
+ // Vector path
13
+ x: [0, 2], // Start at origin and end at (2, -1, 0)
14
+ y: [0, -1],
15
+ z: [0, 0],
16
+ type: "scatter3d",
17
+ mode: "lines+markers",
18
+ line: {
19
+ width: 6, // Line width
20
+ color: "red",
21
+ },
22
+ marker: {
23
+ size: 5,
24
+ color: "red",
25
+ },
26
+ },
27
+ {
28
+ // Cone at the end of the vector
29
+ type: "cone",
30
+ x: [2], // Position of the cone
31
+ y: [-1],
32
+ z: [0],
33
+ u: [2], // Direction of the cone
34
+ v: [-1],
35
+ w: [0],
36
+ sizemode: "absolute",
37
+ sizeref: 0.2,
38
+ showscale: false,
39
+ color: "red",
40
+ },
41
+ {
42
+ // Vector path
43
+ x: [0, -2], // Start at origin and end at (-2, 1, 0)
44
+ y: [0, 1],
45
+ z: [0, 0],
46
+ type: "scatter3d",
47
+ mode: "lines+markers",
48
+ line: {
49
+ width: 6, // Line width
50
+ color: "blue",
51
+ },
52
+ marker: {
53
+ size: 5,
54
+ color: "blue",
55
+ },
56
+ },
57
+ {
58
+ // Cone at the end of the vector
59
+ type: "cone",
60
+ x: [-2], // Position of the cone
61
+ y: [1],
62
+ z: [0],
63
+ u: [-2], // Direction of the cone
64
+ v: [1],
65
+ w: [0],
66
+ sizemode: "absolute",
67
+ sizeref: 0.2,
68
+ showscale: false,
69
+ color: "blue",
70
+ },
71
+ ]}
72
+
73
+ layout={{
74
+ width: 400,
75
+ height: 400,
76
+ title: "3D Plot of Vectors",
77
+ scene: {
78
+ xaxis: { title: "X Axis" },
79
+ yaxis: { title: "Y Axis" },
80
+ zaxis: { title: "Z Axis" },
81
+ },
82
+ autosize: true,
83
+ }}
84
+ />
85
+ );
86
+ };
87
+
88
+
prev.tsx CHANGED
@@ -72,3 +72,21 @@ function App() {
72
  }
73
 
74
  export default App;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
72
  }
73
 
74
  export default App;
75
+
76
+
77
+ <div>
78
+ <input
79
+ type="text"
80
+ value={wordOne}
81
+ onChange={onChangeWordOne}
82
+ placeholder="First Word"
83
+ />
84
+ <input
85
+ type="text"
86
+ value={wordTwo}
87
+ onChange={onChangeWordTwo}
88
+ placeholder="Second Word"
89
+ />
90
+ <button onClick={onPressButton}>Submit</button>
91
+ <p>{message}</p>
92
+ </div>