File size: 28,834 Bytes
bd30786
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "80b68f52",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/usr/local/lib/python3.10/dist-packages/tqdm/auto.py:22: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n",
      "  from .autonotebook import tqdm as notebook_tqdm\n"
     ]
    }
   ],
   "source": [
    "import stf_alternative\n",
    "import torch\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "8c8a5d19",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "89e49422",
   "metadata": {},
   "outputs": [],
   "source": [
    "stf_path = \"/workspace/docker/jw93/services/poc/ai-presenter/stf/\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "65c8905f",
   "metadata": {},
   "outputs": [],
   "source": [
    "config_path = os.path.join(stf_path, \"front_config.json\")\n",
    "checkpoint_path = os.path.join(stf_path, \"089.pth\")\n",
    "work_root_path = os.path.join(stf_path, \"works\")\n",
    "device =  \"cuda:0\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "1de6e2e9",
   "metadata": {},
   "outputs": [],
   "source": [
    "model = stf_alternative.create_model(\n",
    "    config_path=config_path,\n",
    "    checkpoint_path=checkpoint_path,\n",
    "    work_root_path=work_root_path,\n",
    "    device=device,\n",
    "    wavlm_path=\"microsoft/wavlm-large\",\n",
    ")\n",
    "template = stf_alternative.Template(\n",
    "    model=model,\n",
    "    config_path=config_path,\n",
    "    template_video_path=\"templates/front_one_piece_dress_nodded_cut.webm\",\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "8aeae390",
   "metadata": {},
   "outputs": [],
   "source": [
    "from concurrent.futures import ThreadPoolExecutor\n",
    "\n",
    "from pydub import AudioSegment"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "50aac876",
   "metadata": {},
   "outputs": [],
   "source": [
    "audio = \"../LivePortrait/tmp/0245373b-452d-4341-b2e8-7e37a80de116_1720768774.mp3\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "67fc9bf9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "\n",
       "                    <audio controls>\n",
       "                        <source src=\"data:audio/mpeg;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4Ljc2LjEwMAAAAAAAAAAAAAAA//tAwAAAAAAAAAAAAAAAAAAAAAAASW5mbwAAAA8AAABUAABFSAAFCAsOERQUFxodICMjJiksLzIyNTg7PkFEREdLTlFUVFdaXWBjY2ZpbG9ycnV4e36BhISHio2Qk5OWmZyfoqKlqKuusbG0t7q9wMPDxsnMz9LS1djb3uHh5Ofq7fDw8/b5/P8AAAAATGF2YzU4LjEzAAAAAAAAAAAAAAAAJAJAAAAAAAAARUiZiT0pAAAAAAD/+1DEAACHPGDUwAzFwUWWYMKYgAAQIABZsROlisMLFpfzJ//9pWtW5s0iHHoWEWfNgPmh2kz+ZMPzRnu6DPMP/mDVA4gagU279Jh+ad/RUlg3BuI5+wtBugPzsICwHiWW1cQBUF4xRe4SKLHyL3wZiixLOXflny9aEGf6Joru7py/76IKU8ClA55P4r05R1Nth+UdlOMBCihRznGdRz+IFQlqio3WhgQAAMsc5oSMAoRjdi03M+Iuw/NQEt1iblATQdAWA+nzcySsF7AoAXRk//tSxBeAEEWDITmGgAFmGCVDMsAA8vF46SpQANADcEoenWkZOtEIoCuDIJQ11Nepas3HGI2N5oSbutfVa2bj0NEzQ3T///RN3TdBJBv//q9Bk2Tdac3V//1//6CjSEQ8Hw+GTn////QFRDZJf4BHQs6E2wKcJ2XW3ft8KeLXn+tB8O03Ht2NWushlzVhwPYMFyJksDqJI4CKglSOBDxHCcZAteJ84s/06volVMfWUnKwz7bx3MXzy2Hd+YfiefX//1p4CUAIA4NQGhrJjJzISA7/+1LEB4OMVLEeHaYAAW+WY8WmGXhOsFI2VrARZpsYvxAhCETjtegwt3LiUai4fvlsQgSJwgJCcVONSOpd9alAKfddyUJFqU2gxTXF0SEqrRJM7DyysutdblfJFkfZ///NqVGp0retyGoojICVyCAUbuaUBlzAYGCAhMMkUEjQPx+8JhDhcsECGxZus1x2o1lQvB3cOzl8slLT5m3QMwiSRF0ULLJhCTGbSNH9PFoZRz/C6JWh/ajUg0vpZo1//+1OUVuemhAkAADl3HJqww/7tP/7UsQGAIqctSMsJQmBe5WjhZSaGE5nZVoB8F2LAqFQRDZtcRqsB44WYjKDK8JaDomCC6IgIsgeSeWNPgpHi4uM4SPy3b7VS/weiWddHCg9D4KsX3CzP//9f9z26NKWfg9UFTkAZsSrGxKgw4IHLsvxcB7KeKtGuOO+09SDAGgq0QIm6G1BsaI0FlsHkxgQmzSYnU0udVbiIUEEuWa8Yk0/zfKOSk20XfOoRjr9E0ytdH/Z2HUqXrXWRYVZrlvhghmiI8F8B8Z1V3GkyWYMxaZy//tSxAoAC8SvGgy8ycF2FOQZhg04+E2VRKyFi2GKSA9rlZFVR8mgsPlWudRSdHXCfLMF3V4o4xqMvMBad4BfForxzSj86dzUc+pNe0W39NxR4Qb13f7ej5vQ9il3LsWCgAWXZ6NYUgsRDMQAfpSpBZboU3H0llhUCKllNI/k10dT6BYy0JdzIlQ1mJOmyNbtS8EISPTgdAFuoTYJaaMmu5CWMxQABweYczF2CvX/0dGVfFkJXhxw5N31bmdlC7ypkHIRcMBT6dORD5vA6jSXTd7/+1LECgOLuKkaDDBygYQVo0WXmThdEjssFTHgxdzzNcgJQVsk8FIkBmKyajNQqGy1WVEiG2a2w7BYRUHCCNhBrBNBEOZGGk0SoDsZ3QwTgWAN9xPWj//95C9lbD8aYgMDn0pRvcTIEiBEqJAGaokWSxcuzoslESXAl5gm+lkFMxLWULNE9UVHkJobqYhm80sTNlmf8yORwBP0XqIZ2za2szvjfu51LNezWMLaGzbH85WL7/bZz1Cl3vJjU2LlWG0CGxAoxdltwuAcC9LME+yaR//7UsQIgAp4oRwsPKnBZJQkWYYJeIrZfiXmK3aJgX83X2E6tl5M9eI+CuqLK/VlQjTRFVDLK3VhMKsKlOY9hxRSPG3y1vyI0FHubQR/XrRri//2I3V1b6xcAj7AVWhuRFTrWujS2lOyVdlv4icUCw0O5TV2OVDaCoUfquu34hh7d/3KR7b7ty5Sij7Xgk/u6bNWgpgQwqDxQRhUsUhY+KFa7O7/ZRzIeNDWg2sFyxUEXAYrACSdAgIEtwQUcdIty59VJHRUS14vLnTl4bGA8bDv//tSxBAACkSpK0wkbQFQm6Yo9gogYj+wYLa5iN5A4uJdBDVj+o4uiYeaEUP7+1JDMmerVFQKAwyKC4lkP///lbiptit9oQYhhAAActDCVWVCDUDnOAmAX4QZZDrQwQxKy0YzSbhwEHOPEZ5WsN49cXpGzNfA59/nJm+vFQDjiyZKccAVPzHvVpUM5SutEM3WsnpnpZA44Z////qqAkjjeioEHLwqVCpcOtDw0s6BRBjERjLJ1S7mKsfx920bcwxokTmLXnFKwKmUpSv5Igu2/yz/+1LEGoAN8OEwrShaAc6cKBmWl0Aj/w3EEjCotNGFAShuqg8OWJQxCddui0yhqDHwqHLjuskQnWCGMB+Ro3////6oIqv9jmCOwcWQ/8YymABB//A7KDUUc0CORuUw2gBPNUzCBGNAM8w9vI6iBNqQSyXIYg7ExwwaAjyScoZHZTfac/xlrwu6rhyXquswh228mmVxqmKA11KpqDvA/hRAo5TNU///8lXequkgUIoU6aMsgwUE44oaIf/CAw4U/9u//8hVpLCSAIQX0vpbDuL/c//7UsQGgAmowWenmKmROBvstPGKIjn6qHJEN2yFrnuBw1lHFSom1xWc+dtxAMJ3tXTYcR//27oOdGc6zjFIMESuNAoeK3pECHf/qFkQlf7ERJ/zPNIhDRtYIJQduC2ep0O7Fe+HkViHnhi60uzdNonqfcU6sxidDcyaqIWilvtzjkpc4Ok12////7JRm61mVyGOGCwWDX6DogCCWAjT/eaGlwXVwAkAAAJSBxZEKXJmJ+mywLEohln35fmMIDBGSoVU5RVYUNjZL1yWrZCopWiV//tSxBaACe0PSUykS4FCi+gpvLCQY4pI0LqEmF6GVChSq1W///qUtnOzlK1DPb66l////j3f/UAA+4ALLcD0r4C0kZYABUPMm9yLtZp+TMDaiuk+wjJgWH+5ygv+1cOCsOrOfL1tZOI0M7HwdSLeyWnU+KglZ75LlVG5xjnbk//Uxf/xdQicBgAOhADZlYf5cBqpGBuQEgxsXUNPxbE085WxMD/XL9FPpRG536buuKZbew236+k2JzzbyQuKcU0bIYdrI7d/8ZIk4CG6h0RU1L//+1LEJIAKJIU/TbxJwTwa63WFDfb+2xlea/+p9iAAWjjJMbkQjS+R3bJY4CVLMp2OWbbyLs61bklf6o6wXQoPvN+9ULHAWHI9H/9rvftUdIdiiuc+3fU/n/oxh3VRGZ6poSAsEAWSbvKKOsUqYBDsukUskbD9L5JJpB2Blq9awFjdUbCVxLsyUEaU6dwWutPq5/YZBdQh0sC5eUvI/vTPajCJcmbPMDAykrHjiTiKzwJFhACbEUzlu73Edn9rVwACa2NGRtIZSQDJt4jBV/9g2f/7UsQyAEo8ZV+sMSdxQRcsNYMNtjvbD8C08ZT0OHcST07Gy9e8fYlVmEEABn5AxO9OIPcE8m7urB9/Uv3aW6XNKhMGAACUMTz/24CBD6np0fr0VQHgleD2uGYQXnpnyC4MiTUzIvWXhDCodxJKGWr8HWrE8vVnRSDMFDSXXfh+5crema9DmLXQ4mEqfb3uxA9LDcYnI5FJbT3uZ91LCTFQm9hQ2+mH7zgdMfT2JOOeCe9y2FLpIu5bwxsmiBzPRGECw878RBl6hJF4kUcQv/Tr//tSxD6CC8B5RM2zCUFgD2hBtOFQPh9RQI+1oVyAuKEqZSVshQgSQ0AG4Sze4MCmErh0W3k8Mu41xo1e9DO79melFvETEGf6dSyf/7vqqIOkTIBtluDssMbGyq+oakxYtKIAUTUJzVCzN56k3T1nAa4/id6zxAET6aF3OAW+JcnaFFudvdLutb/6o6f1fIV2Uc///qXPdfW5ko2IRTv/DYuCw0eBmAAogCAHGHA8LSqISRVVQMAaSqPPZO4yMDY2JImVGBpp3U41lFMy02RL26P/+1LEQYAK6Q9lrCRSUUUTKzWHidqvgcCXyMCQMpFEkBo6N8vM/3RtnQIBwvveAUGUr//RnxaXiv/49cGDmk2CZG3BFWTwQ1GQKDMftShXCirrQVqZdKx4ONrV0VSx/Huasgu8Rop+X3DjUP9M3+rVeglnb6PHaCRjt/1+4vKCo16XWAw+0XDEj+DJMGQ8TCKAAiAKADjkotPWVGJ01E/0Fr8TTdYkzlos7VYDVjymO/xPfcuVZvykS1mrdVfmECK0H/ZrfV660olt3llLOty/7v/7UsRLAAqc42msIFDxTRxrNYWWGrXqOGjIyqlt5YY3Hb/nYNQZEqpAAZkNoC2SgRpwSFgeOXNJGuTtKXGBxkTEwJE2RKa3VMCPWQ0Njk9byQ9YCYsUSd5nzwYigr3XQlEq7KSr599Xhh2Q5lGlZvom6++/Vi19VUj1DTqGVYAAyAYAHfvQ3yGo8DB5eq8kAjCBuAGnGTBrAU415pCZEdGGgg9Q3e/F1RUesO2TZz27WFOV3gxEKERVQi/r2/z7PXtUfOP0a7Uan/yiLkVEESwx//tSxFSACsERV6wsTxl0Hak1t5U5CKUwb1fNBiLf+qIBW1YyJGmwyMQCQ7i0lXtlJhX+K+Lp7TpypQTV0YHCWKLEp9s7Ux+zPvqTvxuqKHI4c+XdOsZsF8KLmE/PhJw2SlIPjYPLq3+mmEK5no1Rzu8kJEnDxQuFP72jRoGLwIDRGwhRtJh0UGiQaFEtWylZzJQlFVKwzksqNijVEa6bkI+vPT8+1JjM2Tp2FQ7dpWb1MbSAeifo9gUpyerwQCwMBa/wa0Z7srmRl//ylFh0I9v/+1LEWQAL5PNdrDxPMXmca7WGil66p7UoT9NIOueJwarAODiC3JKIq7yOo2rVaoW1sTYY2oMwgujSw0kY/XrSYr26PoECLp5190oArvH9jfuQp0yMehDORtv9MG9W3xVAf2q//rznIZhZHvFrkRICY5xkq0Dz+/cJhM44VgQDRDYP842KtSB5cS5A150QZhfVENefJL88EOz4oZQFDsu5Et4gfA/GLqmMXQASlDvzsof/tU1iY61z1KsmV0IzdVrkuimNVf/6e053///9YyXgAP/7UsRYAAt451VMpFERR6mr8PQKJlAAAB2W8Q0nuWCEDaQhNB31NJxfV5XjgaVN1cCUyEyBkgpMv/bme0z8WTIPOVIAU4qstGCkmONUWI/RCLuu5dqnn73rez7yJn+XmwYLhAz/7Y6gINgIgiSWUMw7TYcMCDgaDgMssJjCml4lXbjRrS/yqKSnJ2bF8RaPZAvXTTVqBnOIOHEZkTQ+1TbuqLMk1ayn30nW6f//VGMQQYpisMjcEN/rj8kqgAAENQEgE99eKsOptRnRUGNgujhV//tSxF8ACoBxT6yw0IFQo+u08opSC2LRRptm4TjwVLWwG3Kh/Ml7U9KPoqIjCt7trUueQGRy/QiJrq/OevR62cOhDp90oQPkgmg8AHCVN3/lGkrMgN4dVWz/aX92YpvEVcaJS6P1Ck8pk6xNA5EKAOXmZSce8OQ1omgmU9oo9KyhtIWLGVF4Jh8EyBcprUHyH+14ubHHwwt4fFHK0f7ogfYq9hwv14AAAABUrUZEcygdOnQtGcdvFRM5lsA1JNelJbBSZj7bcp/StUVCcRaJp+7/+1LEaIAKWMNV7CRNAUyKbHzzDZSXf///+++IQqDoLwwtbxVTaQhN1X1z/kiEFLlwcNEWXjvi/ThWW7l7e+f/////jqKe/mD6F7MmWUUSpeix6W8GIbJD5gDyABcoyBbfXmROJTyiX51IgsAQOxQ+uxA8PJb58rOD8rTYLCv/tF////85Q4Hg9BwiEXe0fQtI5///5aj5DsUFhypU1V/FzF01Nzcpf/////8tvQu5VzuQIbsqIDeKYaNOYUF0NKClkoNAWhTiAXGVa4ABiDgWoP/7UsRzgI3VhUssGQlJtTDqJYGheb5WUqxU6V/9CM46iR6BqoAjAxcnzBwoj00+5QNGyV8i//+RBhYMOKIRG9Lf/90BDFFT+v/r21Sn//puhHOiSMrpoz0aON8e8RjmbbaOYoAIQT8dQRHw5OHFTRRpsmjCFZtGugmQjHvClXfvY+p27vJDUazkzSU/+hyIJDRQqkAyv+ZG//Xqyjv//f09v//be+KDN/p5/VdfylFpeoSWaJlgBHrhPwtrKXpXkzGLNSWPjbZpY5TPQNWXdQEz//tSxGOASm11WYYMTYlMqitwwxV5rEqaUzMFQz6FaVpfudW0/1KgE4GoNiJosgDA53OWJAIFGQLriR4k2lW/+vQacWQSXssVERFh2EBpZJJN5c2WCepJk6bpclBeiSUxxYSIzT7lGCsxM9pXa2EFHDGmTZ+ZCY9QVFXfUBYlLHg6LC5lbl88G4NFv052w8R/9KWXx7g4sUwE5chVYAS0hAcMtVh5lAOI1wdKcTtDwd8VmzJWDcUdqtL/F54KGMif7dIAubiT7d/kFmQp3rIU7CL/+1LEbgAKSJtdx7BFQU+Nafj0jZiN///6YccHDHI2Quxv61CrpMdV/62TNs8ub3soBWtSQdm/jB5UACQ1ihldZqzSTYUAoImG5MJxic/2V/y5ZwuTmLD1Y2upaDROuXGI1AjNRMI3/Ze4pmlUYXlvrvgm7K9TtYnCbAP2wOga97mamCQUYAlBAp/7hM88lRzIKnIHB1lAEJyS26fqL6atQkNUQjy6yjmy2Ge4abWaqh+VfbGe2EtZnxKXsdKwVOLVlXvt5x/tAY0GK5wbRAqb///7UsR4gAoIs02MJEnBg46p8awk+OxUt6lUZqu93/VHW6NVv/RKGRDlYBxzSHf6lgHle5/TVAAACamAAgNJaLOWYnu2jWwJ3Gq7uDeNt43vaKTtZlWqoG2V3QoIUU7EFZcJWESwj4YTbM1KFjVeYsjJv//77faaTgAmc9L3f8UjhEw/3t/Y1JUHq6f8heAAtoQCLZd/GmYqL0saLeESqVffKHcODnA4PmMDGPXp+nNTLcVwbPSG+1NdMgplKQa//+/85mI6E//op6//6sV1QoID//tSxH2AC/UTWe08ScFcFip9p6j4MXWKDSb/6GMUM77Xzw9cmJuhFtYkUm21IdwLsTlH0HcQZTkEyX8XBYXyK22I3Rb1mUfZutWlQ5Usya71GlC1Wgs///rm3voVQTf6ERh1DmT5L/LNU5aUqv/E6qgNr0tlHbUKwACrAAAFbXDksWWFInnBNP1ksuMMOkojXx8oy6cVGA/Vva/+xfws4WOwA1e1kJ+2RMOLQgEiYartb//an3q06cVl/mjoGX/7F7XHxT+5T1YBUUJIETMNIeL/+1LEgAAKmQ1frDBJgUaa7jT1CibepyaCtV4QiVqQu+kppIOeOl/EVeV/eW3WIfMwXtrD73b9z36L2WI9qERCwKHDi5715JbiPvASBUOPM/3PhgygRDIhT9bz4UJPwBkQIJluCOrwJTj3OgM7AcEsqxwM2HHLBf0JvMYeqCTGViTcYXVwkyM2sKN9LHvLTNPmSJCn/cZQUuOiWd1iRdYUJm3cjSmS+ssLjQ88UaSeo7/5CSoALtiT33Y5hiFVWGL4Epk/Z4KKS22VLxXVyQHOav/7UsSKgAn0uVOsvOmBSY6rZYek/rlvyuxWwAx5IBJNGsE42zgB3/mFMj+ctRntv0QyqzFMGe1u1UMR6HRTN7/TeizYqgo6p81/jJBAABJoYADDc2omH0JiwEAVCTU7O4ttnUlYlCzBsCxUXMSOxVjHLctcfKpaGVjcWo7K6+Z/KXvKVER/0flu+omM1lTrRK4S/iJSoxEOqHO//qYCWtsd/VI+0fFDstrqCsOe+QNOLS0bWYap6HsWQEFiqqCmg6ta7Yl49HOqcLKhjK2n+Vej//tSxJeACrBzU00l6VFSIexw8wnudGSECGNZ1UPiYOYPvA5QwWFSQZe/Sru6IypdAAckEAktBcsKbkxTABGURBOUW7bPCcJdLLgohh3JIQk1kZXaEPaU/fRm2Yn61u2+xX/OHQFgBgPNxAHQnmZm8s6aaspSm3/ZmZmdnb7fb4s27Z4sPG3/uvbWOWODyr5UMI70TiWjYm9Fm+xtKb0ynP7HlOOFH82/exwrgc+lKVu5pbPNOHtO9Xgj5kS4HMC0sTqE8QwkhzSuQVNN66aCd2b/+1LEoIAKELNJ7KRJwTyT6jGDCeag1OpSCm8UeVswVxZgr37PSjJbUvhscfN/q/e1cI12U5iat7nMwAZy4H+o4q8d87aZc6HqN+n37nj/H/1T3p7si7Q9yLw6ZFfF2Mgwz+XNhQMOVFZNkvNG2a09NJDkt8oqyuMdnJDA2XQUpNFSNIs7MhIUtKwQaJ213SOufkUDEVFcbk2IpySWORBIkoQ/M5VRh2LUR82tlIu4Eq5ne5xW9sQpssHxikXWaKdHkiMVHEpLmvLovnhFvIAfgv/7UsSughFhbTssiY3KZzIoQRem6MBiItuQgtioZMYvr5////ZhaZGPTBkDEwQEoNkZOCZcuC4YPNf//xfo41wUOMB8WZl3dKqK5tHHH8QhwrIfoQgWNtQDh8LNU4sEVhU1IVUK9ZVTNTgCSS9BP4xGUgS/piiwnc6tnetji9bZLa3ljHrCFitG7HUnGcNaqNCnni+EEzCyIbYZkEhUUCyK3/EoQBoGQ0Cr9zP8Jg0e+7eFVL/9ZI00tzCrCVUshiKKp5QEIetqSZOSa9JD3Hgk//tSxHoAEL0ZYaelHFFwD6y88aaA2ERklLosZMG25LMFg2EOWUqkFhApDcry2RlM7BjgYmn/fQMb1QoUkZFHlvk2tkvZuWcDS/9M8dUGzVyGM21PLSyMpI0MwAAoz2uJCULeSgsL2rEebgPEMaJICiER+0voQee9FUKQKGtQkfe8zhpSlZ2+6PWcq9azAW+/6/tLZ02L70+xcKt6gL3eGmSQJJyWyefvijJVmGAQAYbMGJF7TV4MMDFYjKFozoOfFTdikDPxh2Oa9kzX2YRbN7z/+1LEZwAKXK1Zx6RFQUihabjzCWAHycHA5A3GPAHHQKD5Lav4HMsluUQAjrac6eZvSvTo2TT/8Gqx/2QhLaMqHPEgeTB8RiKVdySnQgBCbt/kLExwTrPMBHk9XSDUgtBwnXVecDqUBbUO7f7v9Q901E2dB1CzIAXJsW1OI+IacMFs3D9aNazqpRgiICCX+3/r90UCMMFHf/e6mQ9jkZ//rIzcjDmF1cip//+m2PLx//zlzB03iAIYluxoiTEsNZ4CtWWM50gKEURO0VHlobTP+f/7UsRygAuA01PtsEuBpqnrPceVOJ+miSUlRhqCsxv/6DgM0Dt/8kWEgU/ZDX/XhlrkN/w0CwiEoYCJExFRVksWOnQqBQ5CAjM8OoBJ2W8HcI6BeIORg5SVE1HUXQelYURJoLTpD1Ts51TABNjSExYlYYCdPl/O5QMBt77//t2cogSL8cw0iv6uoDPK8/+gHQ6wGgSY0Ck21AjeluC2YhYV2fwL8x1EfS6UlbJe7DPllu3K+nhPRD9Io1AqIqkI9I83CTWkBAbOdEX3OfvQrsqc//tSxG2ACgRzb6ekqZE7Fi388woC85iKRP9SZIg1n7Tjmi7HM/+AGrJrjDkuqAaQbmFNHFdNxQ/GnMmanCZhvaUEYYDLIepcrP55f20TmYAqjbtJPc3zxSGPrGECA25CHb//+mQ1hMik/9HkTr/9Xv6tF571O94CAIIBsGqMOy+QBNSWYSncQxFhQQm1QSxDS5j7hniUssBj99Z7ccyeSRLWKGXSKTryHE3SzxljEDqMn//1TsMhYoEQ6CLs8YEBISg2DLna2ETJoQIt/+HB8oL/+1LEfAAKINdtp6CxEUsh7PWElXKdB2/5kQquThXIsuUUe4olKSd6hp4YOFZO+FGMcgMnuuMTWR4iZOE67B/InzXbb9YQY4Ub8s/58p/WghGn/0XMm3//TZl2dtl///WcpjuKIDGljD23kA11ZzsBisyJItCS4Bkj7LDoQsrymCnja77bK7vVySJICX8FQ31siIZQ4Qzjhoo1vr/0dOyEZHVGN+6yMPKItKn/6vKwylSIo1Bf/2FHGUEAEk3DAAIPnvFVkSYbhCEQk6AXFD2Rif/7UsSIAAqMt2mnsKmRRqpttPQJ42glD0Gx2YxQK6wz0nJjOLke4CwEictEGb6r95RJSwFv5H7/La2gYRAqCoKxcFQVcYLJb/Onjyk//GiijzZRNWeGdDJ+rDlLcUENMjNFEMowCpWVqdaQjFXi6USsbby0kBm3PiG/fxbrBzgJDKQ8Q/MyCDvt3mon8mDHvelzb41CGmVpYq+KKchQE/7V5omnAWa6kAB6bgPC7pbtvAswfTgS6sM2sCRGJEk6miKNdTZ9g22TkeFFQSFhIITC//tSxJMAClUZbYekq3FQliq9hgj4UWJ1NcVBYxrfm/KjHVhV//kEubwXECTbxpear+l+4WMoA4451aRZJIQAHJKBDLR2gTJISMwFOMON2HEoykkPBai5vAUkjafrPieQrZNT2U8NMKuHqiH8XjR0z35isb/3T/3HDQ+AxxEwyYa0yr//9diItxp5gfsrYBazIAAUclEabKyebIKhcdVylpjvWeZNKBTKyOSuW62f7NZig6rG1EnHIVzFC5R9UG2CYqcknmYU/+1/7orQ9Fkpov3/+1LEnYAKOKljx5hRMUiR6jWUjXh2uT/RO2YcoFW+3/ySVexLNG2krY4A/E1AlG4bBlAgxChmQC14h+Q1GgIdHqpzFRqft/uyA55p6QJD0JBihxoZvoAkf/Wz/2YtslGrd/o9t0O/9NlZjlD46GKsAxQFoJXy3ClX0ueXDKl1RZyVRKqG2jFCBeWyzCY0szWtNgGw6gSeBbXaHRZkvbsxnT+yio1DuZVV1236NQxalQcpgdhVkYgev1gqdlbv8l/FaYAU23SE9tdREqVHTBRYSf/7UsSpgApg+12tPKfRRR8rNZeU+o/rOgzKwQNk25dLpLG0kvLQrW+mmTv8yFSigaFCJ3pZyDWKVukwvb3Yo3ptYTeDL0OYrDXG1NQtRiEgY/qNKQvu/+5akwgtspoOW3ACgekVG7iBAbpJlisndJXcMAstTtOh0EcD3NTWCyE4tH3ZuVwOlgfRGYKyybzaGsn1oq/Nc6d/9DFgRH3PIZWy1W1T+vyEwKrSIUqEFposgqy+APm5SajdypAFFfRPYgjaloZ3GIwnyeaJMu8Pvp6T//tSxLUACY0Ha6ewR/lKm6t1hhUi+FLlivuAdA9RWARWl3alB1ewgxOk55D2XkjEi4WKEoqtultgsKcoqUVEhlOv/rYAIIEABblsDvL0WNFVdnrGtSZwle4dcZkNxnU4kixDs3JOWL/jeo1D8MmWKHMN/Rp6CgjbXP/XNRPYxuXDAokosPhuYDB140+9Dpxg4Y/4b/9dLxmAAASdoFLiKK01hFvO7mTLFB0miyV062J16ZL54lKTJl1aWWrreeCH8pI3emsN7fxBpRhMQAAwlyP/+1LEw4AKfNNXrDCn0UYaqrWGDXp7L2abtZJQwiy9MSBuv9H/+VqkOl2Di2A3tt6dTpIsaAyoXCogc3VkG1UmxFK1IEJK8/EFBBerBRIXddzFo4J+J6ByLddF7R3Mw3htN+TCO4QScFCmPJsqVMMParhYvZ/2Qqxy3Oep5/3qRQqhQRWT//ZZVTsmFwlJDpgJBY4C3d/qmRUEDIiVAQgAAmBSiUvEYcqIGEAIdOWKRa+PJ9MxtUDIcyOkUhptQkZYk8X6NDca1jNp2xXoQFFC7v/7UsTOgApw01OsPKfRUZSp9aec+hvpRva2eFP8sJUEhyqkqGKX9CEdmr8if8zmM7I3/1lZ2VapDCp3//6B9o5ABKtVAy274XW6EoCsjxig2L6UhE6WSv3JaBxKDZIlF9Lqpt+Ybxon1R5J7Hf8qDI6+wQMb/uujuh1oY9+XdzKzMMCM6+PnRELgqCRQgnvSs5W/9oaFFLVQACiLICjdYCwyuDGw8PGFYwcClFkzwAiRQDsqpxYHaaxD5MmLorEvBPaMx6tdlrXyMY/nyuAt5xr//tSxNiADATrQu0wVkGAn2z09h12/VVbZ///jHKbfzpSPBSu8v6+zCnnJS7TL5p2w7PJLKf/kWPtT/70AAB5BgAR3wBpSGJiPadQKoDjImo38AUIBIePCUVaU8sqUy1yAv0u6ewjOGsf1fzleqVWdUFYLgqD1+DL/61J3/IaB0bRl8nAbjAYQGKHo9aChyhWr5P/3oUgEN1sgOSWQNOSVC8GgHTcCyoXKcsRAdhBCengujRitgvIJQhcumB/XX8C9KbuT3LgQRaeVx/8odJD/+r/+1LE1gAL4PdDTbxLgV0Za7WFiapVPSFMv55UpvFQ8XuKXECbxef6P/q1f2kzBcUQBCdbQEsmsDoBcKAKY9bfwzI1RBgal1FAMjYrLjMjAxcSuaqY2vHMcoHwdgNAinf+txENvf1XMSr06d8/321ckxXf31CNdeIgQq2se6lsg0XEA9nJ6r3ESMh+hiUqcmATJZIDNZtQ3iCxaQfcpWmQ7j1tWrtIcaBO2qeC6lrAEhdNF4rZ6AJxi/1dGyMggwVwRAQtZ0ZRwRLLLB2TStGIp//7UsTYgAwE2UetvM1RYZgn9bCLEHq5wCqGVz1vjs5+jd77MtCahFDigQIFxlvW16xIgADG4gpZLIJKnIIag6dYMFFsNTnAwaVi/JiDWVvOuyGUf29dpQRpKRaKaSZfxUaY2rW/WOr1IlXuPub7syzophT8dXNDYfoDeGsJgu02jP90n+qY9swZIUN5RzV6keqNONDvcVjlmjPmFbgQavmCrxhci+OLJQlCATa+xwnkDXz//+Pfgw0HRjpwiPpRMMjwX2/74ZA9MSqotTf+zbSS//tSxNoACuizS628adF5nKn1piEiQV2sLkh59JS/DkypwxacgTMWFVPixlAG86CQALCqSkwdYsmnRL5BYsSSMS1tGssvCgQ0YWExxrkAR5/Iw+9ubt0NWxT4QAZECog4bWX/hcP0U3///8mZCKbd8SRNCIKLpdtblvCuE9MFxOItd1///1VQ40ghBQcIyCGLQIAAEAt8XSsLm4EaBCA8j4xTuSPggRgbRuU3AJmUhR7ENXLNRTVO9KsqxQ+HKWNSDrFHjHKO2x8IS2MMu9YnSu3/+1LE3QAL3R9VrBhOkl2kajWXmns4CiIxSFJ9VIbo9mUt5VZSqJFcWCQTMx1MrHIZnAdFILkPf//ykS0VtV0GhFP1rpRV1m9oFLOTjBPxRRyZuJZIQLOL0vBeaDSwkTLiz0O0PejmqXdHHEon1Kn52iVr+uZ6I6Oqk/1qjvdWLdmdUnIVaN//6/eTyFFg0Or/dwGZRMtII8ECTG3BGJiEYoLZYwhqhSmCfxlNhfkupmNtPobkCZuCd29SYEEIDbWa2tTyFYXEiqII//9rIidmIv/7UsS/gBGBI3GsBRwxnKTq6YeVONBjqCGNd0OUo+Y8p1Fm/9SrGgBC1QAAYiCAlI9xtkAKCsInU4AoNiiWqORMNkAID5IBIphJE0kSJVs98eZk1YBmvn/3e/bGvSlqPHU/7+Smn3tHPUYoPfWdMpHgqSAoOgI6gj/NLAhl0RTxWCdQyKSTAREBcprTWWVBwIEgTH2iqvD0e48yYgxUtCk5OzighgVQEyIdWrl5qJmQD6QyJgueOhlKwq1wLPHjGNEQlkv7LLXtvQxe7vvVABAF//tQxKOACg0naUewSRk7nGuo9BXikjTkYJDZEGzVou0w5e6lUDmQSYpLdCdjWzw2DUibLZnvxWKjS7LprMyWfsfUpUs+xKFCRsqCodaul8SjHNKwoJNZ4FQEp//qfUt1qZnkuIg4GkCWcEQLcTEgC/4KLiiM5c44ZAoLrZeuOScFPLASArAYVc6lU4d3eiMtRJgEwFAaF41J7WkiSFdyUoSdlBudIq7kfu0VXjTgwNLN2OAB48D56pUgkBy/a7SxEStorJbznKi67ZgYsGhvaP/7UsSxAAoYdVOsJMhBSg6oaaYNIGzq+XjEq3bjcgVMBhZ0sV30eyuQg4QrHulHeSm+1EM6UluUw7J7kd7HfMv9k7qo+qqnvfF5t5ytLJDaO3GSSSRiJQ7466fQVahYVxYqvG7Wc3j5zvFNQ2fMjzWKp9Rx5mOMnC+CaHBDuqGzgYQZOkCNGFw2jIyduhWTznNvf4QQEAoFAoQIEcgohBMExOQCg3C56ogYg34Que9dhMjC4bWBAkYbnvdPtHj3rIPrQQIEAhR5NCI/aDECabGE//tSxL0AClhnPawxKGFOCqSFDRgoAQIzSdAAIIEJJkwAR+DABH/X5h+Ds2xEizbVLS3KAXQtpfXDO2+HiqgizOHgvTtchmF7bDpVSpquS5sByjPhRi/lnGwoTkPJ+q1fZ/PhMwFBQwNCAfQyqX///9xZo0kgNLAZFQRAo0uIqYQoNybfd6MU6pRRwgkkjFQp0WltvuV0nb3J2nUB5KMx/1Idf3kV5wqF0WSkTpFEEKQ+QgRDkjyJATOGioLU8JTZLVwWGhld3ZntkDZDspEl0ej/+1LEx4IKWOs7rDBK4lkq6Gj0myF8gKRUgGaOq1Is5f127125ZPAnZrgz1NEs2qM02VDzpfq89EuwRwxQFhODFtdBykB///74YCiFFOrYfOvFb/9P//7vtXiHJlIQABquY08XJUL8rMK9CSpjRgIAJy4GACGNhuyEqgndpIEZPIXD/W71Rt1snFholzzf//R87uY0SJxt9ZSVDp9Df61LKRZP/94+Exeyw93t6KNEAArvmolgTCgUm5AJR8e4YIUskOPJkLs8OTEnnAZFNRtUhP/7UsSxABL5kT4HpNqJSBWvPMeKVgEetC3uMxTkx9KCwIxNv//2kOroUQFgEOap+jWMT/WZNGmsOht6//7dWwqlhUUSZBAAA7XL6IeW0EfEJ+U8NXoYsPNotzNTFHFRbrSL9Ngk6iCouzPhzMMMRnqgOI/4dFrzsKGVo73Wf/FkmB7kf+ttwhJh08WKoFgSCANNIEk140COK1POLNIvAxALsRBStbPTdby3GGWQE1tV7EU11/Do46KGPvwXsnJOMRLGSMJ0gR689rma2KZOFvVJ//tSxJoACky1VceYS8FFlmowwxV4LNryz5Jx8W/5Dzv+w0n/3FJz/7SxX0al4CEbIAAn39zosCScik6M8RIVuXFgqMERUilhih48sLNnAAEEkFlhIxEzCOcPIpfXuUY3NPO+j/QFF6WFAoBgqEyH+VSMcCQGNM/6etP1XVIIYAAOgAAO7YCRJWojIWlUIaq6oxJRAnp7xX5/uCeRcZqR0YwHJOgG4ecjHhogyWUM8OmIiORBg1xy0NJHVuSGmgUKjXxPYB4uIQ3AoYJAmQocv///+1LEpgAKbHNX55htAVCN6AGMvPD61YQc74ACrt9hGmEod5a+4upv6WAHUdW3Ar20U+hc06OS7jnVFrFA0c7OLVOIzi01bxEJu36Q9cEOW/4dEpJFl1jZZJfI5PhiX6f/6ns/8iiofEEVMyAVLvaH9XUNCqSQZOIJiOMV+OZQJvjI3mqprUFkoSlMXjZg95Zflnelr0diR/AGUg/+VhIz3p5RUldLaa1P1IgWHo1gQK3Hdf/lv/vk1Yg5LqAAJJEhZbmXyU3UMAbU+GdOI8Ci8f/7UsSwAAokX1WsMWlBUIxptaes+EA0g4BgIx/v5Ocn+gMdXfiq6pSoTWzbtfAy5BT/wQk47MZ36O9UdUZNb3kXUBIHOxEs4u1//63f6OnAb5AHLcAJc3AuhDIrQYILFpXDlQxpV6NSe6533GJTcjbAXZqwF5/UdLI2R7XwwwYj3QsOLCCoyVzGzHxXJ7/Ow848vHJYUKvGc9qQYSAAQjnBOtqANu2oAqSSAN6fOOo0DAO4WtwSb/SncrjzgSzEKamXz3KQtKRErirl0Mf42Xvj//tSxLsAChTJYawccRFCmGs1lhXiwCIEwHBCba/79UMrbodEoyHhzmadyNZ8+/9iHpiIccDFkPD8AblsQATtuol0gZJVFLA941guQUA5DJYtR6q4tsVB3lN6EA1JzRIIrCtS3/CDtGGdjzBcFglBvEnafP//91fW8i8FnOAE4WKH3aMZz//773NWJEUQB1hII1orl291LEj7f/RvYAakiABIkkEy3NH+aIJBLarDKkFUHy/1qQtTD2TP0+vx3SDDFtTgDxZyZuSiSDjqhxVif///+1LEyAAKQL9ZrDBLsU6ZaamXjTvzKlQYOhAosKD2d7vmZnOhEZFdyFWR6XlckUNsc6a//WwgavLqpApiXYG2M0MBsBDKol4NY4xZCnPs1kPJ3oza+OI/RmJeunBngcYcZNfd3YplGCxg6o9v///nco0ijnr0Rra2S/rTUOFOAgAaZiQgtZ3/riIDR4d1ANz3bjGDBUd6FSBw2pRt24y2j4S51iggGlGCATb2V/CMRSTJlWczVtMYiFJerOU4Y/6//+26yjOsqaUqkh3Y4g4ULv/7UsTTAAo1AV+nmE3xjaMrdYYg2gmJgVYKMUn//tUQCptGQU83aL4qMFqi5dljqZbQxwFwD2T4OxHEo4gSxH30t5Znt+yZ6pKVRnGBJlyyhQIHfV1GaSmiYlUwec4VOgJG7xtZWUOhJM9/R/0PRQAC9ogAG56AosYOHZxo0BAxM3h9WECBAiHYwAmACRsBck8g50JWa1Rj59FeuN6yqVSKI0T9GdDP1UnirYr6FPVmIUbAj/YAAQGHgJ/nf/pF3Foh1A/Dpk5FdHMioUFQWHgc//tSxNaACq0FW6ywp9FNn2z88xXaaHRpYe/+oAAKRoBJOWMPiVFxzI7gGuBseEiEsxGoXFTmgnU8aCnUj54tU6y5vJHsCYdgROxcPz7Bry1RaVAsv9WV/xV3Xpq3blLpIyjOGtcatTj7YRHOQUMPkVBwGuv97aU/u6EAACooARcBgYB5iOCZ7qQpgqEBlmhjWgYKAcHSq48GL8uVhE2vxDKxS/M3qlnWG5m3Bb/MPL7IMnd3IJhDhy7ee/wQj/Dl7GIdm1u79//moO7Lk5AnNGb/+1LE4AAKROVp7CBNkT4PavWGCPr86gbDo4a7//zIAAckgAdkygAIYBNMwbMAIqZsxkQIFRB8lV4diC4Kd2NUE7T0lPfvzdipz+/huQVF5qhluagjrTZK2b0cBEM2oRlBi9Qw0nTCNSFbFC/ucLOGCFCSPb//7JX+aRqVAAUusITjulCgxiYFH4gUUC0yqVEHRkHwKsmo4VaUPTUTEofEohFp1bX+02s3wCkRQ+cd7buGCNYTtzyZ8vOh05vz4Z/hopOwWsSoIMoUk23f/+apQv/7UsTtAA0Q1T2uPGnBeRno9aegqq2eaLpKjyYDAEfAwHEEEVMaTOiY2Egb2DqYfA8YyA4iEkbTsh0t6qfrcJSbY4ssW8XF7yRnjFUMIHYAgo4WNLNrxOWpY6uhBxCaIhH4pKp0dW3LDp0ua6erKZuqmM+1//1e///eF5MAAVZoZjJkkkYsqHD940knabfrSpRIHaeubjscjj+9lHyWxZ+/52ynD8HTJp7n/V1mAgwEGa9Q6beM1m9vsvLXXIPm3fJyEKRW3ZKaVtfXrU1CN1/T//tSxOeADBTLM47ga4FymWe1so7Iwr7v0LWABLfswprtsKIdBD1mRqGXWCevOMO03sB2om4opHV92p8w998TVv6+LqIuDUyr9U3/f40kTWPFDNDAPIYImRY4DdHiRa2fVndjf3KKc5giHhED13LGHSDTv39sfEcfQrG6lyxcfMZ1MZDulH5b8DC4BNhMEgEBVWl2MKT3fCwU4YToSsQn/Nx/pbarnylzOUbXEiy+FqWeino0cMF3S/XqQPh1QHMJCDf+Z3nqn9BEaG47tuv//0P/+1LE5oALfL8/riRtQYCj5hnXlTg9HEBWRgAwsYelbSP+hTJgAAWZohSBKrbYsJyKBeLHkn2zfTx7kcmLShPh0RjRIiplRB86iZ31h1VMGsj///mQyFHB7+la9mX8aQSE4ILDkNoSj+//jynOiCZShYPxZn/65x4JKgAFZsgARDJA8wINwPIBQDNlGGRmaA7yu9G35zIuSq3AVT17a9svnXnbF2iXiqgrwWlRJ20R9///OxWEg8HwVPzN/q9LdHNd1IpmdPy+nqVRVXx6oIgJrf/7UsTmgAtFHV/sGFGxz6TrdZeduv0/UsWjQEgAAN1AAksKICgBBAOOqH8BDoEgEDDVnimz5ve4sgTFmjpEIsVdcrWJkSFhqYpQuLCYEQakRE1U1VusyMDGcCKX0MLQjUVjspZvo/gyuET/pLPnnkRgKjTxtGB//4lqABeQDDCQbMMNA+eZDR4gIgeFAW3jWoOjL+54/ZpJqKHTVmfjpvw4rYxfCeiCHRavA672ZnWnZ/rZddHEC0i9BSKgFKw+ejRWCoTc0D+0fWSWocWjtiQm//tSxN2AClkDY+eUc9FRnyx89JWu4gxO63Ox2KRWFxJoIgAKFFAae2Mid59/XHCm7loJK5YAdC8CaqQbfzZ+pB3LZaaRwe7L4I7IMxWYbo1u/CXXW0QhIJVbou/EO4wqii9vMucVAVjJaODi/UZhyll8Pw5Qy2mjUcp34jrcssf5Ur6q9ww/35T5YkxR0XP3SQVUwtybX////P/mq7xxKzCbkU723JYzXqUt7///////w3UkeNunzt5hkTAMYj/13c7sVaQj0VSBIvr8ehpsbSP/+1LE54ALwP9DrbypwXUXpvXEiXDBwy8AFikmZwg/7yxCU77jK5l4nEkYMAVRgJQtB952XV6evL4bct30xGWUkOUlSzU7lhzuuYVMLbh17kTt3z/1hQmnaBrTXyDhGLJmW9Eyym9f/uCu+pq2NvJlWNkCNEEFoOl7EljvHI2zNiiqqxccHWaePq0N4TI5Ek3Gt8vvlX1K9p9JAiaHEZD+RHHf23UhXxQKDgmONvgYVGwkEmf/92z0PbG6jwpKCKN54WIjhQc258+g+o3Pf//6P//7UsTngArwdycVxgACuKTpNzOQAkUuzvj40WcEH7EvnFeDOtaJMKoghEiSbTCRge9hwu1OYg9kUPSUAgBJhUNqvO1T3Q5WlK++vl8wUwU+hLVM5O5Dl1mLgSRZv///wS6sQEFhxDe8ivok5v///mW5XUkMx0//+yXjnEK4gGdOqkTglaAFQAAIk7PbCuj1Gr828rKjAcdh1IsEThiTyuLz1TGk3Mrebx+XyAq8MLr9EUwIpwwlndv97OVKMqEk9baBoovr9FXI52///zXrs0Gh//tSxMKADRx7S52MAAHAJKvxhh1+x2nK+R2N/xDVyURZKYZMacBJw1Bd4hREjhDuFtE6It7gTF5UUB5VaSJWpTyrV+5csRkJuF567hRamIV//7UyoxlBAX5crS+zUR7lUCORi///9Cu4gMw6lMYUK51NQmjyoLYAAAADSZBLmuEBUSBoZGHiIsOwO3IqKopQWHpaxNqyM2TFUxhqAUQ6o+t/ikWCyNVrDcWneO+C8BWwD6MlBszZ5WsZ6NjG9oiEwnd/6liK48SO/9TEaCyS4in/+1LEtAAL6Vtnp5hRGVOlK6mGCTIKlOFOY0AR8ZmEPDRLgzG6kyZaBYdFivcOvrC05ZmUJX7turBsNe3J2WRpc3bHBtFC2KvnkIUsrI5/+rqgEqFLSaytoYxSzq///6SrsCMCX4On1ZJFGCUQ4SSLD4sBAcFcs/UNgGdZUqGNPVD8BWkLCRkw0JUP5e1MGCsGwzGxZzjqDHE+SiYcvnFaAkcKNyZKX//fIufT17c7SQXApHX/3VbEp+mS14JKqk5I7Y2wWwEYfAmwaxMRoilPQP/7UsS3gAsVK2mnpEuxUQ2o6awk4KxJqhSCgG4DoSwahDlL/uNf5iSmY8i3n1X3DUTlgEsEooLhVIOicPAy0Iv0BupYCrQWOPFQmCX/q0JKd1tDa0AkECZV8qUYqArKMaBvwCFELLCnTJotJ5Ci8HAgkYaSt5h1kr0tJH7WNZoo0aKhNpAOggSklh4JmgGFwEyozQGY+VdQVd//nsb3JDSXi6EKAgh3ALLS1Jhgcaj5O6LBiAZSUgSxJBkNp1ucMsjdBYy63BbVpUXeWzwIME2D//tSxL8AC0EzVUewS/FLnKnphI2WIQOudzqDHa7mWL65DQS0OPPJaw2kYw9MDxCAQHrKgFbv///v4sBMAIvCAkmOlsdTLx2kAwQuSyagLbD0azndiD7NESNWKrpg7+P1TxG5TMKIx00FIuYJnGXkOiyE30A0OWkdIGOg4xp5AcPjYDEn//6O53+BstUAGAEO0dZaXpR02uGmLlSGnnXSYa00CJOUw6fZQ/YLICNRc1Ny62KzZi136p33LWGDogqxBcSqHkTkX/J+q9qP4sajRcT/+1LExoAKgGldp7DKcT2MqTGXoGbrP6P//6ehXXNdIEAKQAZmYsiHYKYI0k9kaVgVL2sDXU8aSQjPDHDJOFG7UTRAhPBRaCKqPNc3KZHZ2ZZ5Q8GzO35Vu0xWui5Wv8mM2DoAwfn1tM///+xi6F9imXpVAgASBDgYFtLrhCKCOG1uwOrhALH8NR9ZS3JAy2KvTKZggG0sSVercl3PtZRgBHFIJcJyCqUHKFDyPiEKQ79xs6B7wlMFkMXY23/962oaLaUudxTer22dQKAFRIcIFf/7UsTSggpMeyjOZGPBRA6kScyMeGjGBMAUSAYwlMjgkICDYeQTFx/EW1B4JBwHBOUwKqumoU6JhCS0j+EBSFVGHkrLhmtJ4j98NBscJwXA4QFGveYDBBDShZK//0qKvWlxII6p8wLM/qs/ZpUAGSAAUiVE7hFtCxoCiCPxFmgQ0tACmUZg6KRKCZgnaQJByDIVJF8dc24p1j+BkA6LMJDVvHpW2QEQDOBBw15G9CI1Wn//2cdNWsRpbaHf7uqsAQCadh498sgCvmwrF0VFcl7A//tSxN6ACeyxJSwkbsFLlCPZh5lYuilPw6yQk5Jsonpc2oqzEFsfMMlEG9X3ORd5Z7N7AtYXmaFs1LBwQW8XWUmjDM0vpzvO7DIXspT4PIqC49rz9NrF/Vs1oICpsm9IoKionFQCReCYjv/b3qfpHhAAMkRiBaSaMCFkZoxCElKtGhfigS7DrQkuTkcST54GiMpFIarWVYZU48XTEQwVaRfRsTnLZZ5vHWnZQk3lek1LvZru9RRbjQdEqzDg8FjBp4tqb9f/YyebnmLVj9KAAQL/+1LE6wAK7JsczKRwgXiQY5mGGLgwhwAkegI0WZQoKseYCgLqT6VvghsfRMD8sk4tLiR4/YeoZPGb5ceswWeFaNnTmDEbBCEl/rL8IWtreM3D9KdaQiOAaw20YkiNM3OLU///eQWWQLnsylm8/s/+UooCAAqmDLgc2jGEICNggCSsddw0+mrvbEXhwAyOBwZxMltOu85VB8da/FZCJb0qbCYDAGBGLSwYvWMhwvKSrc8ZU1M4+YIL8aI7Srmf//Xda0knTsSidctnxtaEsMPJ1P/7UsTuAAo4USNMPSRBtJPixZeZOD7GMQIyxA0kIBwV4tETSoFAhLBLLAESGB9DFZynMPHoJ7kU5AwiTAxJE+iOlc1yT6NpenNz5pAkDgKgEuMLDwwRDiyyaDacvj/f2fbfYsBF3tJlmjj6BjHX/9MAsQLeIDxjSZOLEQ5GdrrxT58qFw5kymCAvHYuFEfVS05Egc3y2fLTcutQLnljUV2SjWRhEGN2mLIWoxB2/3w8/HyirAoYKtVMTxm1B5tb/93rYOCj1C5E2kRrmBUV0AO6//tSxOyCC7yZGC08ywF+keNZlhlgwACmWIMNBFyKYOcuhHl1XDehmZpAAxJGCxQqFhKSmkCnwbmYVbV3u2GrFE9YNKaNm5mXn78hsShmAFx1Lg+BB4eDrGM7Xf9X2I7/ZrzIumnL/qUCAIuoZZIpu+MOSFd5rT0s+WBa6hMGQQB6P6QllMxLZyf2WlIT2HAoJwGBz8SI9AiRqSrk5QRhAnBj5jfM8XvfHwzpRfuDIYssIkxK0n70pZ/5ta6CIWXE5gL0AURCpUMtV992z+sYAKr/+1LE64ILeKsczLBrQXiPIwGWGSiknoZwg5o8BNBlbos0aU/7LJz3gWGRRhu4jH0D4cC49H8yaEdQlYTLeCt3CJatTxrNVhIJC2WcdDFtRb2M7RdpU68i8al0QMj7DFdHb936qhXXH7VPqjH6dGvZ9SoQAAQDIhQqXRel8VQ1ZRCq0FV5tYIdKQiZvI4epZQ7LIY5FI1QCQBkXGPh6vNgtVsV7cKGcRXrlPiju4v3OMHCk7u5B1Fki6y5cLn3P//+17zWxFlSkRtwGEgGFRAAY//7UsTsgAvclxgNMMnBUpQkaYSNMB3jM3KJmtmiuupmNUn8/eigVCNQhA2BsDUVqGKOKOgWFmuVFVZu+aU3+V6VWuG1lVZmaGvUoO+SoOyIiYojVbcjV6hGIiK93pjjzHugH9oBAAgAQAAQgNkUumbUIyxKqOUMvCGy01LVl0gygfC6SAc0FaCY5FNSVDmFEd6kpfNZKCUBPRjDWpWaG5s8TUSgOMJ8ICutcpkumYHHCsKAc4eo9ScklVnTqSCjU0J50uDzGGHaTOvsSpiUE0Wd//tSxPCADMCtGqwwywF8lOPZhhnQSBfKJdRNR2mhv/yXNUCQJY+UzYdxw45wtHsTSYYEIeo9Sr/5KkyikbEI2MCQNTpkXER7mxq5JFZIGpsiYoGbt//1mZgbf///ukicIuAQowoCuwUBASDAQqgLZe37BmNRKxijdUvUBEkGAmoCaJ6DR4FRgc8SnRE874iPCVx4jO//6gaWGi3wVUHSvwaWGlfJVUxBTUUzLjEwMFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVX/+1LE64AK9KsgzBhygV2Uo1qegABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVf/7UsTyABbh2QDZloABFI3TB4YwAFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV\" type=\"audio/mpeg\"/>\n",
       "                        Your browser does not support the audio element.\n",
       "                    </audio>\n",
       "                  "
      ],
      "text/plain": [
       "<pydub.audio_segment.AudioSegment at 0x7f5e40c01600>"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "AudioSegment.from_file(audio)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "ca742175",
   "metadata": {},
   "outputs": [],
   "source": [
    "import cv2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "fc2065d4",
   "metadata": {},
   "outputs": [],
   "source": [
    "\n",
    "\n",
    "\n",
    "def create_silent_video(template, audio):\n",
    "    reader = iter(template._get_reader(num_skip_frames=0))\n",
    "    audio_segment = AudioSegment.from_file(audio)\n",
    "    pivot = 0\n",
    "    results = []\n",
    "    with ThreadPoolExecutor(4) as p:\n",
    "        try:\n",
    "\n",
    "            gen_infer = template.gen_infer_concurrent(\n",
    "                p,\n",
    "                audio_segment,\n",
    "                pivot,\n",
    "            )\n",
    "            for idx, (it, chunk) in enumerate(gen_infer, pivot):\n",
    "                frame = next(reader)\n",
    "                composed = template.compose(idx, frame, it)\n",
    "                cv2.imwrite(\"temp/\"+f\"{idx}\".zfill(5)+\".jpg\", it['pred'][:,:,::-1])\n",
    "            pivot = idx + 1\n",
    "        except StopIteration as e:\n",
    "            pass\n",
    "\n",
    "    return results"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "6ceedf46",
   "metadata": {},
   "outputs": [],
   "source": [
    "results = create_silent_video(template, audio)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "4cabfa23",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}