1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Oscar

Beiträge von Oscar

  • _ArrayDisplay(): bestimmte nicht nebeneinanderliegende Spalten anzeigen mit $sArrayRange

    • Oscar
    • 19. Mai 2022 um 18:58

    Mit dem ArrayRange sind AFAIR nur zusammenhängende Bereiche möglich.

    Es gibt aber einen etwas trickreichen Workaround (mit der Timer-UDF):

    AutoIt
    #include <Array.au3>
    #include <GuiListView.au3>
    #include <Timers.au3>
    
    Global $a2D[3][4] = [[1,2,3,4], [5,6,7,8], [9,10,11,12]]
    Global $hDummy = GUICreate('dummy')
    _Timer_SetTimer($hDummy, 50, '_CheckDisplay')
    _ArrayDisplay($a2D)
    
    Func _CheckDisplay($hWnd, $iMsg, $iIDTimer, $iTime)
        #forceref $hWnd, $iMsg, $iIDTimer, $iTime
        Local $hDisplay = WinActive('ArrayDisplay')
        If Not $hDisplay Then Return
        Local $hLV = ControlGetHandle($hDisplay, '', '[CLASS:SysListView32; INSTANCE:1]')
        _GUICtrlListView_SetColumnWidth($hLV, 2, 0) ; Spalte 2 verstecken
        _GUICtrlListView_SetColumnWidth($hLV, 3, 0) ; Spalte 3 verstecken
        _Timer_KillAllTimers($hDummy) ; Timer wieder killen
    EndFunc
    Alles anzeigen
  • GUI flackert

    • Oscar
    • 19. Mai 2022 um 10:42
    Zitat von Tweaky

    Woran könnte dies liegen?

    Weiß ich nicht. Ist bei mir auch nicht so, aber ich habe mal eine Alternative erstellt:

    AutoIt
    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <WinAPISysWin.au3>
    #include <WindowsConstants.au3>
    
    Global $aSelect = _SelectRange() ; Rueckgabe: Array[Left, Top, Width, Height]
    _ArrayDisplay($aSelect)
    
    Func _SelectRange($iCrossW = 3, $iCrossColor = 0x0000FF, $iSelColor = 0xFF0000, $iTransColor = 0xA0A0A0)
        Local $hDummy = GUICreate('Dummy', @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW, $WS_EX_LAYERED)) ; Dummy-Gui nur, damit man mit der Maus nicht "durchklicken" kann
        GUISetBkColor($iTransColor)
        WinSetTrans($hDummy, '', 20)
        GUISetCursor(3, 1, $hDummy)
    
        Local $hBgGui = GUICreate('Background', @DesktopWidth, @DesktopHeight, 0, 0, $WS_POPUP, BitOR($WS_EX_TOPMOST, $WS_EX_TOOLWINDOW, $WS_EX_LAYERED), $hDummy)
        GUISetBkColor($iTransColor)
        _WinAPI_SetLayeredWindowAttributes($hBgGui, $iTransColor)
        GUISetCursor(3, 1, $hBgGui)
    
        Local $idSelect = GUICtrlCreateLabel('', 0, 0, 0, 0)
        GUICtrlSetBkColor(-1, $iSelColor)
        WinSetTrans(GUICtrlGetHandle($idSelect), '', 40)
    
        Local $idCrossX = GUICtrlCreateLabel('', 0, 50, @DesktopWidth, $iCrossW)
        GUICtrlSetBkColor(-1, $iCrossColor)
        Local $idCrossY = GUICtrlCreateLabel('', 50, 0, $iCrossW, @DesktopHeight)
        GUICtrlSetBkColor(-1, $iCrossColor)
    
        GUISetState(@SW_SHOW, $hDummy)
        GUISetState(@SW_SHOW, $hBgGui)
        Local $aOldPos[3] = [-1, -1, 0], $aInfo[5], $aSelCoord[4] = [0, 0, 0, 0]
        Do
            $aInfo = GUIGetCursorInfo($hBgGui)
            If $aInfo[0] <> $aOldPos[0] Or $aInfo[1] <> $aOldPos[1] Then
                $aOldPos[0] = $aInfo[0]
                $aOldPos[1] = $aInfo[1]
                GUICtrlSetPos($idCrossX, 0, $aInfo[1] - Ceiling($iCrossW / 2))
                GUICtrlSetPos($idCrossY, $aInfo[0] - Ceiling($iCrossW / 2), 0)
            EndIf
            If $aInfo[2] Then ; wenn linke Maustaste gedrueckt
                If Not $aOldPos[2] Then ; wenn vorher nicht gedrueckt
                    $aOldPos[2] = 1
                    GUICtrlSetState($idSelect, $GUI_SHOW)
                    $aSelCoord[0] = $aInfo[0]
                    $aSelCoord[1] = $aInfo[1]
                EndIf
                $aSelCoord[2] = $aInfo[0] - $aSelCoord[0]
                $aSelCoord[3] = $aInfo[1] - $aSelCoord[1]
                GUICtrlSetPos($idSelect, $aSelCoord[0], $aSelCoord[1], $aSelCoord[2], $aSelCoord[3])
            Else ; wenn linke Maustaste losgelassen
                $aOldPos[2] = 0
            EndIf
            Sleep(10)
        Until $aInfo[3] ; warten, bis rechte Maustaste gedrueckt
        GUIDelete($hBgGui)
        GUIDelete($hDummy)
        Return $aSelCoord
    EndFunc
    Alles anzeigen
  • Doppelaccount mit Werbung

    • Oscar
    • 11. Mai 2022 um 08:19

    Ich habe beide mal angeschrieben, dass sie die Werbung entfernen sollen.

    Passiert das nicht, kann man sie wohl "entsorgen".

  • GUI außerhalb des Bildschirms als Bild speichern

    • Oscar
    • 6. Mai 2022 um 18:44
    Zitat von Michi91

    Immer noch nicht sehr elegant das ganze

    Wäre es nicht sinnvoller ein transparentes Fenster mit den Informationen anzuzeigen?

    Jede Minute das Hintergrundbild zu ändern (inkl. speichern auf Festplatte), lässt die Festplatte nie in den Ruhemodus wechseln.

    Hier mal ein Beispiel, wie das mit einem transparenten Fenster aussehen kann:

    AutoIt
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WinAPIGdi.au3>
    #include <WinAPISysWin.au3>
    #include <WindowsConstants.au3>
    
    #NoTrayIcon
    
    #Region Optionen setzen
    Opt('MustDeclareVars', 1)
    Opt('GUIOnEventMode', 1)
    #EndRegion Optionen setzen
    
    #Region Font im Binaerformat (unten) temporaer bei Windows registrieren
    Global $bFont = _DigitalDreamFat()
    Global $tFont = DllStructCreate('byte[' & BinaryLen($bFont) & ']')
    DllStructSetData($tFont, 1, $bFont)
    Global $hFont = _WinAPI_AddFontMemResourceEx(DllStructGetPtr($tFont), DllStructGetSize($tFont))
    OnAutoItExitRegister('_Cleanup')
    #EndRegion Font im Binaerformat (unten) temporaer bei Windows registrieren
    
    #Region Transparentes Fenster erstellen
    Global $hGui = GUICreate('', 800, 260, @DesktopWidth / 2 - 400, 20, $WS_POPUP, BitOR($WS_EX_LAYERED, $WS_EX_TOOLWINDOW))
    GUISetOnEvent($GUI_EVENT_CLOSE, '_Exit')
    GUISetBkColor(0x444444)
    _WinAPI_SetLayeredWindowAttributes($hGui, 0x444444)
    
    Global $idTime = GUICtrlCreateLabel('', 20, 20, 760, 105, $SS_CENTER, $GUI_WS_EX_PARENTDRAG)
    GUICtrlSetFont(-1, 70, 400, 0, 'Digital dream fat')
    GUICtrlSetColor(-1, 0x4444FF)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    
    Global $idDate = GUICtrlCreateLabel('', 20, 150, 760, 75, $SS_CENTER, $GUI_WS_EX_PARENTDRAG)
    GUICtrlSetFont(-1, 50, 400, 0, 'Digital dream fat')
    GUICtrlSetColor(-1, 0x4444FF)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    #EndRegion Transparentes Fenster erstellen
    
    GUISetState()
    HotKeySet('{ESC}', '_Exit')
    
    Global Const $aWDays[] = ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa']
    Global $sOldTime = '', $sOldDate = '', $sTime, $sDate
    
    #Region Endlosschleife (im EventMode muss ein Sleep vorhanden sein)
    While Sleep(50)
        $sTime = StringFormat('%02i:%02i:%02i', @HOUR, @MIN, @SEC)
        If $sOldTime <> $sTime Then
            GUICtrlSetData($idTime, $sTime)
            $sOldTime = $sTime
        EndIf
        $sDate = StringFormat('%s. %02i.%02i.%04i', $aWDays[@WDAY], @MDAY, @MON, @YEAR)
        If $sOldDate <> $sDate Then
            GUICtrlSetData($idDate, $sDate)
            $sOldDate = $sDate
        EndIf
    WEnd
    #EndRegion Endlosschleife (im EventMode muss ein Sleep vorhanden sein)
    
    Func _Exit()
        Exit
    EndFunc   ;==>_Exit
    
    Func _CleanUp()
        _WinAPI_RemoveFontMemResourceEx($hFont)
    EndFunc   ;==>_CleanUp
    
    #cs
    The font "Digital dream fat" designed and copyrighted Jakob Fischer / pizzadude.dk
    
    The font are provided free for personal or commercial use, however they may not be redistributed,
    sold or modified without the permission of Jakob Fischer / pizzadude.dk.
    
    I have decided to let people use my freeware fonts without paying the usual $US25 commercial fee -
    but, I urge people to buy one of my commercial fonts as compensation and/or creating a link to www.pizzadude.dk
    
    Jakob Fischer / pizzadude.dk is not liable for any damage resulting from the use of these fonts.
    #ce
    Func _DigitalDreamFat($bSaveBinary = False, $sSavePath = @ScriptDir)
        Local $DigitalDreamFat
        $DigitalDreamFat &= '8LoAAAEAAAAPADAAAAMAwE9TLzIAUW1daAAAb4gBAKhWUENMVEt8FMA5ADzgADw2Y20AYXBCtkc8AAAAZPAAAANOY3YAdCBc+F/xAAAEBBgAPhpmcGdtUIMzwk8AHgQAHhQAZ2x5ZthFrOMBAB5wAABbvmhkAG14M1/f+gAAAGhAAAAHSGhlAGFk1qyI7AAAEnABPzZoABAF5AMKqQAPUAAPJGhtdAB4V1wcEQAAYQEAbwG8bG9jYQCAFC2gAABgMAAPAMBtYXhwAQMBClcAL3QALyBuYW2gZTDgfGsAC/wAnwAGcG9zdGe7IiDEAABjrAAvQ3CAcmVwg+z+OACPhjQAIwDXABgBJoACEQMArABWhAQBACKEAROEBQIADgGAeFUCAAOAC46EBQSABVtBhAUFAAIBsYQFBlAAHgHChAUHACXgD4KwAQCBLoMFAQARAYIChAUCAAcBNYQFqgOAC32EBQSABUqEBSAFAAEBsIQFBgAYDwGzhAWDLwMAAfwECYRfgwWDX4MFg1+DBf+DX4MFg1+DBcMvwwLDL8MCAcIXKGMpIEphawBvYiBGaXNjaABlciBhdCB3dwB3LnBpenphZAB1ZGUuZGsgLQAgRE8gTk9UIABESVNUUklCVQBURSBXSVRITyBVVCBBVcABUicAUyBQRVJNSVMAU0lPTiEAKAAAYwApACAASgCAYQBrAG8AYsACIEYAaQBzwAVoAIhlAHLAA2EAdEABondCAC4AcEAHekAAoGEAZAB1wABlwAQiZMAOIAAtwABEACpPQAFOQAFUQgNJAIpTQAJSwAFCAFVAAopFQAVXQANUAEjACDFBBCAAQcIBwQNSACInwAsgAFDACVIAKk1CD1NAAU9AFCFEAGlnaXRhbCBkAHJlYW0gRmF0UYAXaQBnwAB0ACNs1YANZIArZcACbQIxgC2AUmVndWxhcsASimUACnUACWEAcvAR8bAMMgAyRA0CDc8MRwwBwgsAAEABACx2'
        $DigitalDreamFat &= 'AEUgsAMlRSNhAGgYI2hgRC3/IE8DDQBzIFN1AAKqIC+hAetaYloGYqBJIHtACwgIBxAHBgYBoFABjbhAAf+FRWhESQCzAAMCRgArswUEEaAAsQICIAKxBASLoADjXT+gBrYDIGBMAAcAVUAfAQgIAEAJAgcEAgEAQAYFAgMCBYCHByAGBAECAYBQAEYAdi83GAAvPC8IPBD9QQABLzz9AYAB/TwAMTABSQRouSAKCEloYbAAQFJYOBE3uQAACP/AOFkzESEAESUzESM/AXcA/sf6+gMg/OAIPwKjYA8BI/9PEAG0At4gXhIARwBAGAETE0AUEAPgAqAOCgIQDQUGIAMGAAEKgw4/L6AQ/QEv/YINLqQNKAoAE6kNE6ENAScAETcXEQMiJyYANTQ2MzIWFRQABgFtMi8yMCAAFhMnIiAoKAEAHj8BQj8+/r0A/fIdGiIjNDYIISE44CAVAfwBCJUC3WARCwBdQIAkAQwMQA0EYX0ABwECBAQFAwMDQCLgEgsKAggHCQ3hEgeHIcYghy4IxCAI/AjEAeUhBwAKDCkUDCMUNTcXFQIFogABXzk1Ov4AuDg2OAH8N3MGN0UAQC0V/30CwgAC4AAfAINAPgABICBAIRETAyAfHggDB6AQAgMAAQkYFw8DDgIAFRQSAxEaGQ0AAwwCHRwKAwkADg0JAwgEHh0AGQMYCwYQGxYHYJXlFCAUPC8XPP1WF+AVwgDdogAQwwAuoi5lFgEAIGkWIGEWVhegKgIrM4YAB0AAJwQRI4MAUDstLThAO6k5PKk4JgGDgEABQDIvAUFgLSjIATeiADmgALwyAC/+wEBAATf+gMlAPwE4/skhrWAV/08CwmBcoVAnAACjQFABKChAACkhJyQjFxQTACAfGhAPCgMAEAISEQGAUiIhHSQcB8AxDQzAIBwbgAMDAgQVHh3gUwAEDg0HAwYMCwAFAwQECBkYFiADFQEmJcAhAAHSEWRIFzxAABCgHQMgVyEB'
        $DigitalDreamFat &= 'ZSGgNxCBAC4CAACjwwAkIhEAKCkiKCEiChMgWgFgAAMjJzclwAAnwiM3M0EAByMGEYAAwSMHIyeIqQCpAR6pqWq+PgA+s7M+Ai04ARAwvjEupgECL74IMQFpAFssAS/+BFw54Ag6ATABQwA/AS4tLTk8/gDROgIw/r5BAgQtLV0SKQDSQGYAASoqQCsgKSMAIhoZGBIRCQgAJyYfHhwbGhYAFQ4NCwoJKSgAKQgGCwsMCgoACxgXGBkGHByQHRsbHHAUEA9xFJAhIBgXcRQpKHAUkUAUEx0cQRQMC0AUAWA/JCUkABQTAeQBD7QTPD8RP4UTfhPtoS8OoC91AAETFAUABBVRSBUPACpJFSpJFQEIIzU3JxUHFxU3iDMVBzcVNyc1ZBUg/vwxiXxUFT4DjC+P1ABQFT4CLnYVCLl/yFUVOQIwwrjQgMdlFeEAlRWUlBUAJACxQFcBJSUAQCYhJB0cGxIQESEfGRAVCwobABobHAYcHR8fgCAeHh8eHQNBFAADAQIbGhgDFzgHBAOCFYA4oRQBAGAEBwYgH5IoQBQj+iJiKAxnKFMowROmFKYVR1ZEzBOEEwwAJYkTJfOFE2A5IxNTE4YTUDq1EyWgKKgAALK8ABIsLBA4AS+9IBItLYFAP5eJPj68SSgCODEBQoA75BIBO668EGvcOTwwKAEBQgF2UjpAEAEGBkDcBwTwSOJhlUYv8lDnRAoG6QoGJ1ABbSsoLit0T5EFMBiTMBgVAABmQCoBFhZAFwANCgkVEQ0GA8ACExIQAw+AV/AUABQTBAAPDgQL9AwLAm8E2inHFIYTVAioBAAWWQgWUQgFyxIDoEygTRcCWbM6AQArKio1Ai2zOoA6qSsrqTqxYBCkAUMiEQIvUDnGIEyixwCrAQBEEGyVOgsADxUUEQ4NCgYD0wqTCwQDBAAJCN02CwI/Cz8LMAsCPwsyC5/gVzBXcAADHjAxATGlCqA6szoCLMELsbBEIjkgCzo5PEQc'
        $DigitalDreamFat &= '/r4EQAKRrHb/sAJhBAKskm4RABcAugHQLhgYQBkEFhUADw4LBgEAFxZwFBMRECFEMAxhbwFCAgBvAAEFBaABFwASBhUVFhQUFQAJCgYKCwcHCAAGBgcMDQYNDkAQEBEPDxBgDgPAAxMSEQMMBnKSLfoBQy0O8kF1AP9CH0PWEGgHABjZEBhyJHBCM6GhdDMXFRNSACESAQAByz+lMP6rlgAwpealP5b+RQAwlj8BUGvxfwDd3X/xa/5g8UBr3n5+3mvwG0MFUHaUEIgPAFdAIwABEBBAEQwMBEQPDoB0AgcGwD0Ogg3hZQsKBgMF8DsZxCYvL2p0l3MEABA9KQoQAhujGmJzMSYBbUA7sT49sjhSAINJAHA5O8NxOTugcAEBMJETAbT/3wANAAA2QA4BDg5AAA8MDAIGCQIBigbXNf0FBwYADgkHEg4CBwYjyI8BohcAHx8XEykgHykAuDUxKSYgLC0EHyGRK0MBBQKUQdDaCwBFQBfSjgiYCwUIUA/wGwoJ4TxvZCr0G4spX40BAilyNCcAATy7Pj28MS6BUgABBSgqICAwAAfRQxKf0A0LADdAD6FSBwkDAgnBJQNlnkXoDQN/BlkFIoidbAAeKyofHiorsQArHh8oKR4dLGMRrfktdEAvk5wgDQAD/ywgAQsGBgkJCoAICAkEAwcGSp1/HyqZKQ+eqBAyKJgoBij9DoNxJ9CmlHwXADMAAOBAcwE0NEA1ACozMN64AC8lIiEWFRQOAAoJCAIsKSgeABsaEgwGAAsKAAsMBgwNCQkKAAgICRcWFwAGAAABFRUWFBQVAAsKAyoXFgMcAAgHBQMEAi4tACsDKhQTEQMQAAIgHx0DHBAPAA0DDAQjBAMBAAMABBgnJiQDACMBMjEZAxgAAAEcRnYvNxgASD8XPAAEEP0DBgGYLxc8AAYDBRD9AQIAhy4IxAj8CMRpBQcBLgYAAAcKAQAxADABSWi5ABwAADRJaGGwQFJYADgRN7kA'
        $DigitalDreamFat &= 'NP/AADhZFzMXNzMRADcnNQcjNTcjACcHIxEHFxU3gDMVAyMnNycAF0wRNwAfAQIHF4AMEQIHgBAns4kxLrQgLCyCQJcFBA6+AD4CLS0tOAEwgL4xLr4+ASyABQACL74xPC0tAQA5Mi+wvWvcLQAt/sYyL6+9awD+rzkCMQFCMgAvAUM/AS4tLQA5ATD+uzIv/gS+QQAhAAABAEMA/08ClAMNABgAAG5AMAEZGUAAGhUYFREODQoABgITEhADDwIBgqgUEwQDAwQAAAkIBAsMCwEX4haAowABAgedA5IGnKMGjISFAgAZiYUZgYV2BYB5gYURgQMEeIADIwAnATy7Pj2yLcAtsT49vD2AcgICEDGxOTwBNwE6OUA8OQIw/rzAMMeoOTwtQDAVQDDCQDAAKwCYQEgBLCwAQC0aKyUgHRwAFQ8KBwYoGRgAEgMCIyICBQQgDQwCGxrCfgQAABEQDgMNBBMMAAsJAwgEIiEfAAMeFxYUAxMBdCopQjYECYVFgYWGPBz9PMEAzn7EOgQALP3JOizFOgZ3ADxAOcd5QQOfQILDA4E/gXcDd7S0AXhuPoR5AnnHBLFCdkB1LjguAS9AdoB/Qnc/AjlABP7RQgRFeMFHIwAAh0A/ASQkQCUAGiMgHxUPBRwBwEYKAg0MCAMHAAIeHRsDGgcGwUJ5DAsECQhESINF/CIhDXwDQ8FBjn2ERIZ+eiSJQySGfkNCj0NERAEAPr0+PrwxL7KAsj4+srIxLqMByrzAICwAIS69AULgXTwvOoAPiB9GW+FCfQKIwgLgIFtoQCwiW2APGAoRAwBagEEWHhUggiNcg0BiWgYOFPllPy8vBD9lgUM+gBvmPP1vWiXkPII54QCiGSAchDpiO2A3tDg74HUgAfSBABYBQT8+/sjhdoPgAGFawEBAATezWgAlKygnIBsVEgARCgUkIxgODQEBGSYlHh0CEA8LBDcCWQTiGR0cGgN2GcU3pFoPzjcmW75aD/+0'
        $DigitalDreamFat &= 'WghaqJcIWsU5ACDhWKNXj+VbbALhW8Q6Li46oCNzZJYgAv7RIALgfuSWAgHmIwkALQCgQE4BoGBALyctKikiEB0XFBMBIxoQDRAMBQQCYCYfCQMAAAISEQ8DDiQQIyEDIIBbBgMFAWPBCh8eHAMbBAAVGRgWAxUBLIArCwMKAAEOUcKjkUEyJQ4ALiklLue+7aEiEy69byWIoURiAAu9M24lJCX+XGy88SVD/wKw4rwQABYAkEAAQQEXF0AYCBUAFBAMCwUWFRMQEg4NDEHtDQwNAA4GDg8LCwwKAAoLExITFAYUgBURFhYRDw6hJagDEhEiTQEogS/jR1iHLg7V4w6CF+kjF1XhIwEGgBUj4wOgADMCFZJgvDEuuz4wAJg/lYcxxjGYCD8CmLI+L3TeawDaLfzrfuBsAAQAA9ggEwAvAKgAQFQBMDBAMSYALywrIR4dEQwABwIoJSQaFxYEDw7RgSopJwMmZBMKUSEcG0CA8yAfExMhIkEODYAgBBQjECIgAx8QFRUDFPgAARjfM9cz6IJ/IXMPqBgAMHkPMHEPE3YhPxNDHyJLUZchHyKqgAFpfUNh/QABLyK9Ut800TQkQdA0HxwbFA/QNCNAIhgXDBIR0RMoACclAyQJAAIaahlzEx2TYgrjE7AkA0ASISAeAx3VNBnvv3S7dF8TWBMZ3zRYE7ESHx9IPxO1Eh9IPxMt/LcDL0j8EgEjAF8BtBAB/AALYB1EQBYB0mUJEAMCFgkAkAUGEwVAqgEDdWRQEP0Q/ZIOADQNAwGfY1kBIiY1NDaEMzIwrwYHIifHAAABbCApKSAgKAAoICAVFCghHwApKQFUMiEhNAA0ISEy9RwZIcAiMTMgIDYQPjAJIiMyCQwAGjIJGxsAQBwJEwMCGQnIFgUPYAkGDz8JOAkKGzkJGzwJBwYXBgYjaAlVCRMVFhcfAB8XEyghICgBAFIzISE1NSEhABgb8zw3LikiUDI0ICNwCaOQR2EQAqwA'
        $DigitalDreamFat &= 'BdASdkAxoAEMDEANMFgB0LyBsKUEAgEFBAWBvAADAgIDCQgJCgAGCgsHBwgGBoAHBAMLBgEBJAt/gEZARjW4w0ZGRnIjlAwBNAAMmQwM80XhRAMnADUzFxUB2ziTACsrkziGAVBrAPF//YPxa95+gfFRAKEClAG7MAoAFwBjQCkBGBgAQBkIFxELBRRgDggCCgniT7JBBP4MMlAChHVQMCwgAGYtLQnoAgAYKQkYK0/5j9SvAzJPXAABUDQ3KSkNMADYdABRXXb/sAEyNL0VCgngALQVCAeICAkGMBULCwZAAoABBgECBAQFsIJ4AwIHvxW/Fb8VvhUTA1IVA1v8hiuTkysAhjgBUN1/8Wvg/mB+3msTqJCY0EWgGgBwQC9yKRSwWAIJARUMGhkCAgEgBwYCFRQgCwMHgAQNBgUEGRgDungBAQx3Zremp4qbZQwZPyxZBTNBP7cjEQFgbzw4AjC7pZClsySDQFCZAi+VdDkBYi8xtS3+yNBRdVICBcAUCDAXDgARABQFECMzYA4VNwMzNQAlFzUTFzUlM+AnATMnJRIB/1xIrgCmfkdy/mR+rABy/jlycgEefoB+/uJyR34LX10BEkoCmLi4/tGlAopQAFulpXal/QC2uHelpf7RuBz+0+9dWt6zsKwAHwAAp0BPASAgQAAhFhwMBAMVFCUgLQ9B9gYFqjcODQAODwYPEBISE2ARERIfHiAacBoXyhZSwgTScREQ0Brw8783JDeSBBov802BZiUgiRsCIIAbJ7gAWRcnETcXNzUANzMVBzMXNzMAJzUzFxUXBxcAEQcnESMnByMAEVA7OAEjpzIAinwxLnyKMqcAMQItODu0MS4AtIM/AUA/AiEAYPJ/xi0txn8A8l8tAjD+wUAAPwE3LS3+ygAAAAMAFf9PAsIAAw0ACQATAC8AAKhAVAEwMEAAMSYvLCshHh0AEQwHAiglJBoAFxYPDgUDBAIAKiknAyYTCgkAAwACHBsZAxgA'
        $DigitalDreamFat &= 'CQgGAwUEHwQAAwEDAAQTEhAAAw8ODQsDCgQAFCMiIAMfAS4ALRUDFAABGEYAdi83GAA/FzwBAAIQ/Rc8Lxc8WwAFAQkBAwoDBS4CAAADAwYBADEwAUlouQAAGAAwSWhhsABAUlg4ETe5AMAw/8A4WRMBg4N94YYEEyMnN4CTApUBCsMCkIGRByMniIGGigEAvj4CLS0tOAEAML4xLr4+ASwBgAUCL74xAWkuQC4BLy0t/QAIAQAvLi7+XDkCMYABQjIvAUM/AGgALTkBMP67Mi9I/r5BAB8AAYKflAGAnyEAfkA6ASIAIkAjECEbEw0ACgkeFxAGAwIAGRgWAxUCCAcBgJ4dHBoDGQQAABUUEgMRBAsPgA4MAwsBIB+AnHgAAQSNkIiNiopERATUACJJRCJBRAVOP0JHIwBARQMBOrzAPCwsADgBL70xLr0+AD68MS+yLS2yVcQCsQw6PICIxkA6x4vCAsWKYcA6BQALwDsIr0BSwjsEFhUKAAkHBgUDAgAhgB0ZEg8OCwrAOwAEAgEIBwgJBkAJCgYLCwaADAEABgECBAQFAwMABB8eHAMbAhQAExEDECAfBAwAGxoEFxgXAQ2QDAABEMRBPD9AQAOBAMRAhy4IxAj8oAjEhy4OwgEBx4iVk4wQEEgBQs0DI0HRBgEKS4VJAiOZMaYApjGZPv7YvD0EASxCSrw9PbIsACyyPQFR34D0AGv+W3/ga/6vaUlKOTxDSTnAcUaDKQAAk0BHASoqQEArECkjHhjBgyYSG8GDISDGgyUkIgQDIcaDGhkXAxZABCAfHQMcg4YoXiePhgdnFURIRCopICo/WERQAVJFBUUnAVFG0S5kLjpgEv7Rw0ZhIn0BYiIeAHdANgEfAB9AIA0bFRAKAAcGGA0DHh0TCAMSAoBFAwESEQAPAw4ECBcWFAQDE2NlAAwLCQPQCAEBAUYgLy6HTmPoAQAf6R4f4R6hp5gehFA7Fh2DQAFBwBuqQscb0sAb'
        $DigitalDreamFat &= 'O+AAyKQ9QWGnKwCYQEjgRUAgLSUrKCeifyQjgiDtfx4dAiYli4BMIiGAYcM9KinQPTxfgWDlHYABCT5RPixJHyxPv4LApsSkYaQBPGuiPvGgALQsLKKlgAFgAyKkwfiEAS86PDogzIOjAWQ/wgLgABsAcABAMgEcHEAdDwAYChEDGxoIAwIHwz4WFQ0DDALLYsfCPQQCYQYO4MbkPr4v4CADH6zF4B+GPhwpH34ciT4DHeAAyuWgHALkOAsmAUA9QIAaQT8+/irIIBk54AC8oBrAQCpAguXJgAxDpHsbAAZ2IFmhGRAbDRgUwBAKBgIWFQFZ4jyIFxYEgJwAEhGhGWnkvBoZojsC/7xmGgJ/cBrRHLAMUQzVHKMc0hu7BD494FyxPj28MYIuuACxOTwBOZANHjqRGtZKEV0XLCAAfwBAOQEhIUAiFwAgHRwKBhkWFZgSDgPwDEAaEA8RGiAbGhgDFxMaABEAEAQTFBMBHx6/LStTW4caICu6KoYqIakN/iGIKuUaJA4YfNMpsxpAKecBKUZ7Iyk/PzIotA6LekHSa30CYQLe0msZAACWQEMBGhpAGBsEC0CMAIwAFg8TdWsQAAMGgA0FBQAABgcGBwgKCgsgCQkKGRiASQIRgBAOAw0YFwQAPGgMAQ0EKi+BDqpqDjGgagjEDqtq/ToNAFoaaRAaQmriaQOiagUDFyxwHgHJP6YxMUCmP5j97jrwSjoCsoBpAVBs8n/9QH/ybOB+MegrOQ474CrVaBAPFgBiQAApARcXQBgTFngQEwxgSWKa4ypzVwBoCRUU3BwvzSm3KQT0ABeZCxecRk+HAAuANrFoYzABQrAEIRu+MBorADcBKQL2QhDwhahAUk/yhQwdsKYYIoYfCBQOA1KFBgYHBQAFBhkaBhobHQAdHhwcHQgHAymAhAMSMkUCIishIAgeAx2DORcLEQD8ARLnRIpEk4Z/G4+FkA/KEo+FWXIaNQeRG7MPI4UbMBwjJxUA'
        $DigitalDreamFat &= 'AQKKQSBmgkCoJS1QEP0CjjFHLieoQIIsgixTR668bPIy90bBgxww8my8rhEBfxElchEKchEQBHCXHxQMDAYIlngRAgEDCo9xEaIeYx95EQkRD38Rf38RdBFxAH8RfxF2EVAsNWkWIQcnfxE1QhBCWC6E/fR4EVLybL3AD3swZmURMRYuhxGSERNMD1FQeJdASVJ4IlB4HSAaGQoCJOCWExIEDgbTDyYlIwMiqA8NDNDLGICgFNNMOhvTyxBSqWB4UKkAAV4Uj1rPyk89gBAUT3hZ/wAPNU0CW4/KjMpDd1AAT8rv8k6AXGNOpHdSP8qnT9QjATLeIgCEQD0BIwAjQCQZHxwbFCgREAegEA1AMxoZ3CIhYd3iamPdEoMR4iLiCuIiAQELr5jdXg0RqAsAIwkRI9vbA34QP0EQUBIG28IhBhDiDy60TAFqUNqQDvzlCpoB8C/+uz8RE+CZuCGR7Qi8QF6Z7Q4IBwYBpO0SCgQEAwQFAAYFBggICQcHmgiQzCaiIeTuERDl7v9iReXuP+4PI+w0Zcw3YYg0A9/u1+5PuQAXMxc3Myc1MwAXNTcnESMnB4AjEQcXEyMnAGAnARAA2AEIBxcAVBEHAQB0J4i0MS6Jl1BAgiwsACC0ABS+AD4CLS0tOAEwgL4xLr4+ASwAFgACL74xPC0t3ABrva8yLwE6LQAt/sYyL/5SORACMQFCACBDPwEALi0tOQEw/rsJACy+QQA/AAIAFQD/fQLCAw0ACQAAJwCoQFEBKAAoQCkZJCEgHAAbFBEQBwIjIgAgHx4YFw0eHQAeHwYfICIiIwAhISIFBAIaGQAnJgkDAAIPDgAMAwsJCAYDBQAEEgQDAQMABAAmJR4DHQoWFQATAxIBAQtGdgAvNxgAPxc8L4AvFzz9FzwQAAMCAQMKLzz9PIcuAAjECPwIxAEuBQQAAAUELi4xMAEASWi5AAsAKEkAaGGwQFJYOBEAN7kAKP/AOFk2EwGPApsDDpgA'
        $DigitalDreamFat &= 'ChcVWCMnNYGpgZq0gQE4BjuJlYCUfIkxqCNALrQBai4ugYr8UOVAAUGAkUKEkS8A/rs/Ai3If/MAYSAt/sgAAAEFgJNPgpMrAJhASAABLCxALSUrKAAnIBsVEhEKBQAkIxgODQIIBwICAH4dAhAPBwYABAMDBAAiIR8AAx4EDAsJAwgAHRwaAxkEExeAFhQDEwEqKQCU+AABDwZHgAABRolIAEejwQBVRQ8ALElFLEFFfgXAjwZGgpKFRQKYSUgn4AE8vj4+gENBR4GSJwVHygQBlLE5gJQBL2AuLjoBMIWQQAT+stFABAIwhJHAR0PAkQKUwEcTAF5AJwEAFBRAFQ0KEQ0ABwMTEhADDwIhQIwDAQ8OgYkIAPECRAEBB8eGSIWDO0Q56AcAFEk5FEI5QnyEOhOANoHIAW3Ad7E+PQC8MS67Pj2yLRQtg4NzOYEqOTz+CscAvL9GcQLgACEAAHtAOAEiIkAAIxghHh0QGhQADAYDAg4NCwMiCkBxBQMEgq8CHAAbGQMYEhEPA4AOBAAJFyAfQm3+BIctSrNGL4RrhDBAgYkw/iIFauRWoRdiNqYBxjPiew47BX4iWAMyAjABQkGgC0I/P/6+ABvI1eAzOOABROABvAEdQjIqBGAdsGIdBUBoEQAAFwCSQEIBGBgAQBkEFRQMCgmCAEBREwsKCAcgAAAJBgkKBgYHCwALBhUUFRYGFgAXExMUEhITAhIB4DYREOAiDwMXwBIHAwYBDWMfYB0eL0dUZXh1eQQhDQAYFQkhGAEhAYIeASM1UDczFSViARNhohUAAoo7ODv+/TIQmz796iABkKc+EJsBID8gHj7+vQD+UX7fa34/AQJAgAG//lHya98sfgDlmKAdEGA7qEACT2I7CiEgHh0cIBAEAwIAITwfHgAfIAYdHR4cHAAdAAEGAQIEBAIFoHQCAQMKHx5cAxLiPmNA4j4CYkAX4AkRDwESxB6iHqg9rBD9QQDjHg7iHw7lH30v'
        $DigitalDreamFat &= 'dhIRQSXART+DW6IBFcFgIgcjAjWogb6iPxgu/fTBAEBCgkCoQCdS8my9rsK6PgHCPsBAMTFAAUANIAJBIAIAQ669bPKKAOBAduBAYQKs5kAIukBX40AWFQ8OyAsGASJBERAgH6BBJQB1ASAAAwYgXQUFAUADFxIGFRUWFAQUFUBECgsHBwgBAEUMDQYNDhAQQBEPDxAJCCCdE/ASEQMM5XmBQ6BiqSL/qSOqJAkAJiZmf/BFIkWiJgoVI0UhIgIByz+lADD+q5YwpealAD+W/kUwlj8BAFBr8X/d3X/xAGv+YPFr3n5+UN5rAANgIX1oIYkAQD0BEhJAEwQCD8EgCwoCAQUEgAUABgABAwIgIAALBgcGBwgKClALCQkKwJYQAGUNf6JhYh7nHaEd4WCpQeEcDtenYWMbBhsSCRsSjw1CMQEmDSI6NzoBT2sA8n/e3n/ya/5CLqAvPj3+wDAvQ0fQTDFXMS+sQFMyLwgAIRsXFhAMCwUAHhkYFxUUEw4CDcA+CAINDA0OQAYODwsLDAANGAAXGBkGGRoWFlIXoB0PDlF7AwNqEUAgHxIDEQDyawF8AQINavJO/z5/HOgOAg9/L+AO5VsgLjU3IyeWAwABERAH9WoBPIBcweJcMJg/lYeKAHABBAKYkl0vdd9r3IAt/Io5L3TggABTkWlwKwFCcBGTcBEVAABmQCoBFhZAgBcNCgkVEQ0wXgPjaLI+FBMEAA8OQAQLDAsBAXhdPF4/lBwIaVINBl0W+QwWAwxdNmkzFwJZszoAASsqKjUCLbOAOjqpKyupOsJbMkNSOwIvgGkBmsc5A/FLWTp0QC8BDAwaQEALCOAAVDkDBAacBAUwGaAKiCkDAqArHgH4SX0321g0DAEADE05DAyzWFc1AQykNAEGUBc08XNE/08BlQGaFQ8VFBEODQr2BjMV8xUEsI9AMpUVZSR7nxWbFQKfFTONBn8FsQGCMQUVOrM6AiwhFslwigE5Ya85PDAW'
        $DigitalDreamFat &= 'ElFMvkDAEpAVAWaWFXYUQDOSFQRVFQsKC8IGEE0JCAgJAAJXYQAKCQMDAgcGBfwDAH9N/z1yDOY9vxWzFQGzSgIkmDGk/lIAPaQxAWbPd+IwZGTid/OTsDz/oREwCkZAGDIKCAsF5gggCJA4CgmSh+c4gQgfmxM/B9Wg2zRQALEoKpwgIDAAUQewEQE0shEAUUAcAQYGQAfyBLwmAwJgEQ8mhCVFD2gBAAYJCAZCukIP/DiGK5ODDvOXUXqsAAgfAKcweiAgQCEgFhwMBANwShIQhA8O8C4GBQkImGaADg0ODwYPEMCIABEREh8eAgIBABoZAhcWHh0bCAMaBLJ6ERAIA3wHGCkK1XkPig9LbTEg9VkMIFEMF0I9tkkyDVO0AWPbUDs4ASOnMgCKfDEufIoypyoxYLM7EZuDEYoCIQBg8n/GLS3GfwjyXy1QKcFAPwGyN8CzygCwaBXFCTCzAi8wi1QBMDBAMRAmLywrIKkRDAfAAiglJBoX8FlxNUAqKScDJhNQKQA7U6kj1x8j10I30hAEFAkA2wMfULoVAxQAPAEYH8ZN2G2rulsYAPowCREwu9eDq5EAn+ub608y2DYAr+uCrQFpsNgvmC0t/QABAcf+XJ/rB5frs7zRbyEAfkA6IbJvECEbE0BTHheCEJBeGRgWAxVTSZGzbQAVFLBtBAsi6/4B3rwpbl8R77zvvPzWlL0Z8jc6vDAPYJwBL70AMS69Pj68LbgAMS+yLS2yMS4AvT4+vDGxOQIAMQFCMi8BQz8AAS4tLTk8LS1A/sYyL/7HAiwAAAADABX/TwJhAAMNAAUACwAhAACvQFIBIiJAACMEFhUKCQcGAAUDAgAhHRkSAA8OCwoIBwUEAAIBCAcICQYJIAoGCwsGAGQBBgABAgQEBQMDBAAfHhwDGwIUEwARAxAgHwQMGwAaBBcYFwENDAAAARBGdi83GIAAPzw/PBD9AQIAAS8XPP0XPIcALgjECPwIxIekLg4C'
        $DigitalDreamFat &= 'BwEuCgAABwoAMTABSWi5ABAAACJJaGGwQFIAWDgRN7kAIv8AwDhZASc1MxcAFQMjNTczFQEgIyc3JxEBAhc3ADMXByMRBxcRADMXAiOZMaamADGZPv7YvD0BACwsLDgBL7w9AD2yLCyyPQFRAN+A9Gv+W3/gSGv+r4mUOTyDkjkoAAABgpCUgJApAACTQEcBKipAKwAQKSMeGBMNCgAJJhsQBgMCISAgFgMVAoCPAwQAJSQiAyEEABUAFBIDEQQLGhkAFwMWBCAfHQMAHA8ODAMLASgoJwEDACkEBIkXPHsAAYOGEIQBBI6MgYSABNQAKomAKoGABYp6AnwGJ8A+kAIBOrw+AsotAkC9hIcvsgWKRwIhkYzRLi46wCT+0QuDjcFEfcJEHgB3QAA2AR8fQCANGwAVEAoHBhgNA0AeHRMDEgIAiwMAARIRDwMOBAgAFxYUAxMEHRwAGgMZAAwLCQPQCAEBAYZALwdABz+jRD7EPQEAH8k9H8E9EhcbPVA7FjqDQAGqQYA3Qoc30oA3O8ABCshEe8JANisAmEACSMCLQC0lKygnQhtBeyQjIBfBexmCGMZ7Hh0CJiUCNpkGfSIhAMODeyopkHu+PAHBxTsAAwl8kXwsiT7GLJh8grs3MxGgA0ACCBcRB4ACJwE8vgGAPi0tOAEwvjEQLr4+PqAAtCwsGrSgALSAAWADOAIvAr75hAEvOjw6AjAw/r5B4AjjYX0CAMIC4AAbAHBAADIBHBxAHQ8YAAoRAxsaCAMHAcM+FhUNAwwCE1ASEAMPwj0EAmEG6A4UAOU+L+AgAx9kPtelIOAfhj4cKR8ciT4DHV/gAMIcIB4iPqAcOwEbOAsmAUA9QIAaQT8+/irIIBk54AC8oBrAQKhAATcgHMmADEOkexgbAHYgWaEZEBsNABgUEAoGAhYVIwFZ4jwXFgSAnAASShGhGQujOxoZojsC96k71XhkGgJwGqE5YBmhGEelOUM5oje7Pj3AubEg'
        $DigitalDreamFat &= 'Pj28MS5oAbE56DwBOSAbOiE1ppUhugEnWCAAf0A5ASEAIUAiFyAdHAqABhkWFRIOA+AZCYA0EA8hNBsaGAMCFyM0ABEQBBMU8BMBHx5NVqO2BzVAVutqVQZVIUkbIQhVxTVEHJ9hNqpTYzWAUgFSASyANxlHUj8/YlBkHTkBMBz+u0AdZFGh130CYQQC3qLXGQCWQEMAARoaQBsECwkACAYEAwEAFg8T5dYgAAMGABsFBQAABgcGBwgKCgsgCQkKGRgAkwIRgBAOAw0YFwQAeGgMAQ0EVC8BHUrVDjFA1QjEDkvV7XUNAFoaySAagtTC0wNC1QUDJ1jgPAHJP6YxMUCmP5j97jrglToCsgDTAVBs8n/9QH/ybOB+MchXOQ47wFWl0SAeFgBiQAApARcXQBgTFggQEwzAkg4NCwOGCsNVc1cACRUU3BxGL80ptykEABeZCxcfnEblRZpkgDZoYzABQruwBCEbvjAaADcBKQL2QiIQ8IWoQE/yhQwdEBwbGRgihh8UDgIDUoUGBgcFBQYAGRoGGhsdHR5AHBwdCAcDgIQDChIyRQIiKyEgHgMCHYM5FwsRAAESv+dEikSThn8bj4WQDxKPhfJZcho1B5Ebsw+FGzAcSCMnFQABAoogZoKQQKglLVAQ/Y4xR4AuJ6hAgiwsU0dgrrxs8jL3RoMcMHDybLyuEQF/EXIRCglyERAEcJcfFAwGwwiWeBECAQMKcRGiHuNjH3kRCREPfxF/EXQRX3EAfxF/EXYRUCw1FiEHGid/ETVCEEJYLv304XgRUvJsvcAPMGZlEV4xFi6HEZIRE0wPUHiXFEBJUngiUHgdGhkICgIk4JYTEg4GAdMPJiUjAyIPDaAMAwACGICgFNNMwhvAPwMABBBSqWB48VCpAAEUj1ruZ089gRC6FE94WQAPNU0CWxNOef1nToj0TVMAC3n2ToBcY049pHdSLHmqT9QjMBIJAAAiAIRAPQEjIwBAJBkfHBsUERQQ'
        $DigitalDreamFat &= 'B6AQDUAzGhkiHCEJgBHiahBRAwUEFhKDEeIiCuIiAQELR6+Y3V4NEQsAIwkRI8UBERPEhwcjA34QQRAfUBJyEBZ6BhDiDy60AUhqLi6RDvzlCpoBcC/+uz8RE+CZuCETAAAvALxAXgEwADBAMSYvLCshAB4dDggHBgIoACUkGhcWEgoEAAQDBAUGBQYIoAgJBwcIkMwmoiEAAiopJwMmExEmEHARoDYDGGJFBB+BcxEUIyIgAx9gB/GQJAABGA8jDCO2NDlho4g09RIYADD5EjAGJM/VNE8kTySAE4mXcTR/JOF8JNxrva+fJJ8knSQCJ3BIUQEoKEApThlQNrQkIBEfHgAlHgAdHh8GHyAiIpAjISEi0iUnJt8l+VEUJiXfJd8l1CX+E39I6AsAKNkTKN8m3ibBSAY1LycpJ3yJMagjg18nWyfIf/NhIJInA5/Bk8EgGxUSEQrABSQjGA4NsZXADxodsGoH8IcAoyIhH9gDHgSSJ1PCE7LQlcG+Dx0mKRKxwcaWXxEPT0kB8nrNuAAzFzczESMnB8AjJzcnETcAwAEQEQBoByMRA1AXEQcBAXQBPL4+Pr4xAC60tDEuvj4CMC04ATAANAxMAi8AvjGxOTwtLQEALy4uOgEwAUMgPwEuLS0BIv7RAQAiAjD+vkECLQAtAAABAEP/fQAClAMNABMAXgBAJwEUFEAVDQAKEQ0HAxMSEAADDwIFBAIDAQAPDgYDBQQIAAAMCwkDCAEBBwBGdi83GAA/FwA8LxD9FzwBLxQXPAAGLgAAAC4xADABSWi5AAcAABRJaGGwQFJYADgRN7kAFP/AaDhZBQDXJwDiBdoRAQDSAW07LS2xPgA9vDEuuz49sgAtLYNAAUEyLwQBOQFVOTz+xzIIL/6/gVIV/08CAMIC4AAhAHtAADgBIiJAIxghAB4dEBoUDAYDAAIODQsDCgIIAAcFAwQWFRMDABICHBsZAxgSABEPAw4EAAkXUCAfAQOAIQQH'
        $DigitalDreamFat &= 'WzwfiFuHXoFfAAAEYQQAIv0JYSICYYPOAdCBXoLZhgaDBs8ArC04OywsgMYwtCwsOIBwBMgCMAQBQoAuQj8//r5VAGzIgM84gAdEgAe8KwF0gmQEwDqwwjoFAAALABEAFwCSQABCARgYQBkEFQAUDAoJABcWFCATCwoIB0AACQYACQoGBgcLCwYAFRQVFgYWFxOAExQSEhMCAcBtBBEQwEUPAxcSB7ADBgENwz7AOi/APQQ8/YAB/TyHLgigxAj8CMTFAQEDQaOEQQZCDQAYCUIYAUICAQI9ASM1NzMVAiXCAhMnNTMXFQACijs4O/79MhCbPv3qQAKQpz4QmwEgP0A8Pv69AP5Rft9rfj8BAkAAA7/+UfJr31B+AAACQDt9QjsQEcB2qEBPwnYKISAAHh0cEAQDAgABQXgfHh8gBh0dAB4cHB0AAQYBAAIEBAUDAwQCgAEDCh8eAxLCfQvDgMJ9AsKAFwkRD5wBEoQ9Qj1IexD9gQB1wz0Owj8OxT/EPsg/ErsRgkE7NYh+A7dCAxXARIAHIwI1qECCRH8YLv30gQGAhIJAqEAnUvJsva7AuEMDwEGBfcBAMTFAARpAIAJBIAIAQ669bBTyAOBAduBAYQKsEeZAukBX40AWFQ+QDgsGASJBERAgH0ugQQB1ASAAAwYgXQUCBUADFxIGFRUWCBQUFUBECgsHBwIIAEUMDQYNDhAAEBEPDxAJCATiA2B8EQMM5XmBQ6Bi/6kiqSOqJAkAJiZmf/BFIkUVoiYVI0UhIgIByz8ApTD+q5YwpeYApT+W/kUwlj8AAVBr8X/d3X8A8Wv+YPFr3n6gft5rAANgIX1oIQCJQD0BEhJAEwQED8EgCwoCAQUABAUABgABAwIBICALBgcGBwgKoAoLCQkKwJYQAGX+DaJhYh7nHaEd4WCpQeEcrg6nYWMbBhsSCRsSDxsDgmJGGiI6NzoBTwBr8n/e3n/ya4T+LkBfPj3+wGBejkOgmWGuYV6s'
        $DigitalDreamFat &= 'QFNiXgAIIRsXFhAMCwAFHhkYFxUUEwQODYB9CAINDA2ADgYODwsLDAAaABgXGBkGGRoWJBYXQDsPDsCaBAMAHRwaAxkEESCAHxIDEQAHBiAc+AEBAkadQABhneKd9n018zgC8F4BxrdAXDU3WCMnAwACISAH5dUBBjwAucK5MJg/lYcTCgHgAgKYIrsvdd8Aa9wt/Io5L3Qe4AABIdNj0eMiFwBvBEAvYl0PDAsXE0APBwMCFRTgGwIMCglivKC6CAQGBQAREAQNDg0BAfNAB2XSPD9hOaQ6KNPCGx8YVCO7oRuD78PTMxcC0Fe8PQEh1LIA7UPUBLE+Irk5OjwBOCg/Ai+g1MageMc5AAABAUL/fQGVBALeYFRGQBgBDEAMQA0HCQOgcwO2BwPpIFQBhU+GEwDEEmgBAAxpCQw3c0NGASBtKyAgKDAAgz8fMnLUQgAlnxOQExIXFuASDg0KBpATgXxSUhQEA5ITC4ATFBMM/guSE7UikBPHMJ8TJCGfE3+RE1JwoiFCE8ETgyDiEj1QvD0CLiIUAkCJASI5sAs6OTwwFP7HwDo8/shAAlJg8wsJQCcAp1BgIyNAJEAQDQwLCgfwfR5gHRoVEADQTSE+CoFQPQkIAxIgHwAVSAIYF7BeIiHgFRIgEQQOFBMhMSEgABcDFhkYBBsc/BsAQDKGf7QhFWBzcNUAo2o/zzAEACOZDyORD/ATMzUDspoAMEUjRgBB4iQRv3HgO+CKpwAmKwIvvT4+sgKyMwC8PgIuqAEgaaP9bkGwcQEhqGD0MIIk0fAQ0aIRcAE5/sjTcXCPch0zAADgQHMBNDRAADUqMzAvJSIhEBYVFA4RQiwpKEAeGxoSDAaAUAsQDAYMDQASCAgJBxBg4RIzYAsKAyoXCBYDHLNyLi0rAwIqoGMDEAIgHx0AAxwQDw0DDAQIIwQD0RMYJyYkIAMjATIxoHQAAX4cn0Sck91TvkUYdQgVHFQANAkVNAEVFwSVNX+z'
        $DigitalDreamFat &= 'RTI40XRBRoQw1EcHl7OiiVKWgkCXhQAOFJg5hLEBLPSX4bCwJ7C9AwFHMTuvvWv+rzkwAjEBQtJ4ErIBMPz+uzA11LF/KX8pfyl/Kf9/KX8pfyl/KX8pfyl/KX8p/38pfyl/KX8pfyl/KX8pfyn/fyl/KX8pfyl/KX8pfyl/Kf9/KX8pfyl/KX8pfyl/KX8pVX0pCfYXAhCRCPBmDg1QkRTSGKAVNwMzNQAlFzUTFzUlM6AnATMnJRIBE98KAWfLpn5Hcv5kfgCscv45cnIBHgB+fv7ickd+CwMvCyILApi4uP7RBKWKUABbpaV2pQD9trh3paX+0Xi4/tN/C38LfwtyCxd8NQO2CjUMEAF/C3gLzwCAqXFx/uKASABxdXFIgP5xcTCpgIC0XwtUC7m5EP7Ro4xSAP7npCCk/tG5dlIA/tIDbwtnCwIBIwBfAQi0AfzwChgAREAAFgEZGUAaCRAAAwIWCQAFBhMSBcAtAQN1fRD9EEb9Ijx1fQMAGRklGQFylCImNTQ2MzIhsDIGByInwADCtQA2MzIWFRQGAQBsICkpICAoKAAgIBUUKCEfKQApAVQyISE0NAAhITL1HBkhIkAxMyAgNgAGAHwJCwwBCAAGmAAAAgCGAAADrAAABSAGAAAGMAAGigAIAAc+AAbyAAAIIP4AAAmQAAb4AAgACm4ABtIAAAsAdgAADPYAAA0AuAAADtgAAA8A0AAAEI4AABEArgAAEt4AABMAvAAAFPwAABaCLAADwAAAF1gAAwEARxi0AAAZWgAIABokAAPcAAAbAOgAAB0oAAAeEBQAAB8ApiBKAAQAIQAbIkYAACNBABMj5gAAJABvJVDEAAAmAHMnAGMoAKgAACnMAAAqQYAJLBYAAC2AUy4gXgAALwSAAfAAVAAwgD8xgFUzgAczAYAdNOoAADWeAFgANkSAAYALN4AFOEGALTiEAAA5gGs6VYBdO4BXPIAbPYB3PkGALT/uAABAgAlBAYA3'
        $DigitalDreamFat &= 'QnoAAENsAEAARB4AAEWAUUYAUAAAR3QAAEhBgAlJvgAASoBRTFWAm0yAn02ApU6ApU9QoAAAUIAHUYAdUmCSAABTUoABgCtUAIwAAFWkAABXwYBxWDwAAFmAMZEBclqAL1sqgAGAL4MBAUj0AD8B4AMghQEBSiPAARXPAAFCwwAA6kTAAHbAAEPECsUBwQR/wQrAA8oBxQDIA8ELwgCj/8QFxBPRHc4A5QnRCsEZxS7/wTLBAsgzxjD/H94fxiDPE59Ar8djxgDITsMEAAID31j/ewDAnRAAb8AAAQFACQMABAAFAAYAAAcACAAJAAoAAAsADAANAA4AAA8AEAARABIEABPADxUAFgAXAAAYABkAGgAbAAAcAB0AHgAfAAAgACEAIgAjAAAkACUAJgAnAAAoACkAKgArAAAsAC0ALgAvAAAwADEAMgAzAAA0ADUANgA3AAA4ADkAOgA7QAA8AD0APiBLQAAAQQBCAEMARAAARQBGAEcASAAASQBKAEsATAAATQBOAE8AUAAAUQBSAFMAVAAAVQBWAFcAWAAAWQBaAFsAXAAAXQBeAF8AYAAAkACRAKAAoQIBYh0BAwEEAQUAAQYBBwEIAQkACWFmaWkxMDAANzgIZ2x5cGhIMTAxBQEyBwIBOSo35AA45AA5BQQwBWBjaDI1OEJfgyUCdjRgJQEAHCACIAHgAQa2AuCAoA4GJAMHAAGlBv9lMBYAIwcrMACdPzA/MD8wfyYwwIw/MDQwHwAfAA8ACltfBAoAQ18EGgBh7AFiFewBY+wBZKIAZQBmAABnAGgAaQBqgABrAGwAbQAg1dAABAEaoAAQIAChQAB9AMYA2ADmAID4BDwgEP//IALGIC4CK0IQAMonAOADv/9zv0O/Q/9zv0PfIWGQFDpj0BJlsAoDAHEAdAnwCQUABw8ADwAPAA8AGw8ABQAJlgAhJQoFAH4IDwAPAA8ADwAPAAUACsOWAIE8CwYACQ8ADwBvDwAPAA8A'
        $DigitalDreamFat &= 'BQALlgAwBwz8DAawDg8ADwAPAA8ADwCNBAAMlgAwBw0NBz8HXw8ADwAPAA8ABwANOQcO/A4H8BUPAA8ADwAPAA8AjQQADpYAMAcPDwjwFb8PAA8ADwAPAA8ABAAPlgD5ATMQCPAVDwAPAA8ADwAbDwAEABCWADAHEREJf/AVDwAPAA8ADwAPAAQAEfOWADAHEhI/Bw8ADwAPAIsPAAgAEjkHExMKMB2/DwAPAA8ADwAPAAQAE5YA8TAHFBQKMB0PAA8ADwA3DwAPAAQAFJYAMAcVFf4LMB0PAA8ADwAPAA8ABADGFZYAMAcWFgswHQ8A3w8ADwAPAA8ABAAWlgAwB/gXFww/Bw8ADwAPAA8AxQcAFzkHGBgMcCQPAN8PAA8ADwAPAAQAGJYAo64IIAGQUIEAArwCCVDzAI9zAAHFADI+AbKnYOgFALWoAgBNQQRDUnB9IAD4Aw3C/6AEAw0A7XaocgAKgPLeAnDkYAAC1wACdWRpZ2l0YQRsIAEAaLAKIAAA/wAAN////oBESUdSMDAAAwACAQMYeJD7lF8PQDz1AAAD6AFYughrIuwHHP8TAsLEAyAAHAMAAgJiAmYQAyD/EwRePgLCCwQuBwBvAiJvADQAAgkCHgIACABAACIKAAl3AOAAGwE='
        $DigitalDreamFat = _WinAPI_Base64Decode($DigitalDreamFat)
        If @error Then Return SetError(1, 0, 0)
        Local $tSource = DllStructCreate('byte[' & BinaryLen($DigitalDreamFat) & ']')
        DllStructSetData($tSource, 1, $DigitalDreamFat)
        Local $tDecompress
        _WinAPI_LZNTDecompress($tSource, $tDecompress, 28820)
        If @error Then Return SetError(3, 0, 0)
        $tSource = 0
        Local Const $bString = Binary(DllStructGetData($tDecompress, 1))
        If $bSaveBinary Then
            Local Const $hFile = FileOpen($sSavePath & "\DIGITALDREAMFAT.ttf", 18)
            If @error Then Return SetError(2, 0, $bString)
            FileWrite($hFile, $bString)
            FileClose($hFile)
        EndIf
        Return $bString
    EndFunc   ;==>_DigitalDreamFat
    
    Func _WinAPI_Base64Decode($sB64String)
        Local $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "ptr", 0, "dword*", 0, "ptr", 0, "ptr", 0)
        If @error Or Not $aCrypt[0] Then Return SetError(1, 0, "")
        Local $bBuffer = DllStructCreate("byte[" & $aCrypt[5] & "]")
        $aCrypt = DllCall("Crypt32.dll", "bool", "CryptStringToBinaryA", "str", $sB64String, "dword", 0, "dword", 1, "struct*", $bBuffer, "dword*", $aCrypt[5], "ptr", 0, "ptr", 0)
        If @error Or Not $aCrypt[0] Then Return SetError(2, 0, "")
        Return DllStructGetData($bBuffer, 1)
    EndFunc   ;==>_WinAPI_Base64Decode
    
    Func _WinAPI_LZNTDecompress(ByRef $tInput, ByRef $tOutput, $iBufferSize)
        $tOutput = DllStructCreate("byte[" & $iBufferSize & "]")
        If @error Then Return SetError(1, 0, 0)
        Local $aRet = DllCall("ntdll.dll", "uint", "RtlDecompressBuffer", "ushort", 0x0002, "struct*", $tOutput, "ulong", $iBufferSize, "struct*", $tInput, "ulong", DllStructGetSize($tInput), "ulong*", 0)
        If @error Then Return SetError(2, 0, 0)
        If $aRet[0] Then Return SetError(3, $aRet[0], 0)
        Return $aRet[6]
    EndFunc   ;==>_WinAPI_LZNTDecompress
    Alles anzeigen
  • Wie ein Passwort aus Roboform bei einer rdp-Verbindung eingeben?

    • Oscar
    • 16. April 2022 um 16:43

    Ich denke, das alles gesagt wurde. [Thread closed]

  • Strings nach Länge sortieren (_ArraySortStringLen)

    • Oscar
    • 6. April 2022 um 16:05

    Ich habe mal eine UDF daraus gemacht und damit die auch mit älteren AutoIt-Versionen funktioniert, habe ich statt MAPS ein Array benutzt. Das ist nur geringfügig langsamer.

    Alles Weitere in Post#1.

  • Fehler in der deutschen Hilfe bitte hier melden (Hilfedatei 3.3.14.5 2021.12.22)

    • Oscar
    • 2. April 2022 um 09:09
    Zitat von Musashi

    Ist es möglich, dass dieser FTP-Server nicht mehr (allgemein) zugängig ist ?

    Es scheint den Server nicht mehr zu geben! Bereits die IP-Auflösung schlägt fehl:

    AutoIt
    TCPStartup()
    $sUrl = 'ftp.csx.cam.ac.uk'
    $sIP = TCPNameToIP($sUrl)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $sIP = ' & $sIP & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    TCPShutdown()

    Edit: Die Beispiele sind übrigens auch in AutoIt v3.3.16.0 noch enthalten.

  • [Wettbewerb] String komprimieren

    • Oscar
    • 1. April 2022 um 07:40

    Das Ergebnis steht nun fest. Ich habe alles im Post#1 eingetragen.

  • AutoIt 3.3.16.0 ist zur Welt gekommen ...

    • Oscar
    • 26. März 2022 um 18:55
    Zitat von Tweaky

    Arbeitet jemand mit 3.3.16.0?

    Ja, ich!

    Ich mag die Maps-Unterstützung! :)

  • Strings nach Länge sortieren (_ArraySortStringLen)

    • Oscar
    • 19. März 2022 um 10:33

    Ich wollte mal testen, wie die MAPS gegenüber dem ScriptingDictionary-Objekt abschneiden.

    Also habe ich die BucketSort-Funktion (oben aus Post#1) 1:1 auf das ScriptingDictionary-Objekt umgestellt.

    Ergebnis: Die neuen MAPS sind mehr als doppelt so schnell (0.175 s <-> 0.362 s, auf meinem Rechner und mit AutoIt v3.3.16.0).

    AutoIt
    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <WindowsConstants.au3>
    Global $sFile = @ScriptDir & '\autocomplete.txt'
    Global $sData = FileRead($sFile)
    Global $aWords = StringSplit($sData, @CRLF, 3)
    Global $iTimer, $iDiff
    
    $iTimer = TimerInit()
    _BucketSortLength_Dict($aWords)
    $iDiff = TimerDiff($iTimer) / 1000
    ConsoleWrite(StringFormat('Wörter: %i\r\nZeit: %.03f s\r\n', UBound($aWords), $iDiff))
    _ArrayShow($aWords)
    
    Func _BucketSortLength_Dict(ByRef $aData)
        Local $mBucket = ObjCreate('Scripting.Dictionary')
        $mBucket.CompareMode = 1
        Local $iLen, $aKeys, $aTmp, $iIndex = 0
        For $sWord In $aData
            $iLen = StringLen($sWord)
            If $mBucket.exists($iLen) Then
                $mBucket.item($iLen) &= $sWord & ','
            Else
                $mBucket.add($iLen, $sWord & ',')
            EndIf
        Next
        $aKeys = $mBucket.keys
        _ArraySort($aKeys, 1)
        For $sTmp In $aKeys
            $aTmp = StringSplit(StringTrimRight($mBucket.item($sTmp), 1), ',', 2)
            _ArraySort($aTmp, 1, 0, 0, 0, 1)
            For $sWord In $aTmp
                $aData[$iIndex] = $sWord
                $iIndex += 1
            Next
        Next
    EndFunc
    
    ; Funktion zum Anzeigen des Arrays
    Func _ArrayShow(ByRef $aData, $sTitle = 'ArrayShow')
        Local $hGui = GUICreate($sTitle, 540, @DesktopHeight - 140, -1, 10, BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX))
        Local $idLV = GUICtrlCreateListView('Row|Data', 5, 5, 530, @DesktopHeight - 150)
        GUICtrlSetFont(-1, 12, 400, 0, 'Courier New')
        GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
        _GUICtrlListView_SetItemCount($idLV, UBound($aData) + 1)
        _GUICtrlListView_JustifyColumn($idLV, 0, 1)
        _GUICtrlListView_BeginUpdate($idLV)
        For $i = 0 To UBound($aData) - 1
            GUICtrlCreateListViewItem($i & '|"' & $aData[$i] & '"', $idLV)
        Next
        _GUICtrlListView_SetColumnWidth($idLV, 0, $LVSCW_AUTOSIZE)
        _GUICtrlListView_SetColumnWidth($idLV, 1, $LVSCW_AUTOSIZE)
        _GUICtrlListView_EndUpdate($idLV)
        GUISetState()
        Do
        Until GUIGetMsg() = -3
        GUIDelete($hGui)
    EndFunc   ;==>_ArrayShow
    Alles anzeigen
  • Strings nach Länge sortieren (_ArraySortStringLen)

    • Oscar
    • 17. März 2022 um 09:37
    Zitat von Lambdax

    Und die buckets müssen auch noch sortiert werden. Dann vielleicht so hier

    Vielen Dank für die Anregung! :thumbup:

    Ich habe das Ganze jetzt mal mit MAPS umgesetzt und die Geschwindigkeit ist super.

    In Post#1 habe ich das mal ergänzt.

  • Strings nach Länge sortieren (_ArraySortStringLen)

    • Oscar
    • 16. März 2022 um 16:40
    Zitat von AspirinJunkie

    Das StringCompare musst du auf die Strings machen - nicht auf die Längen

    Oha! Ja, klar! :D

    Aber so liegen unsere beiden Funktionen jetzt gleichauf.

  • Strings nach Länge sortieren (_ArraySortStringLen)

    • Oscar
    • 16. März 2022 um 16:21
    Zitat von AspirinJunkie

    Und die Performance dabei ist bei mir um ca. Faktor 4 schneller.

    Nunja, kommt darauf an. Meine Funktion sortiert bei gleich langen Strings noch nach dem Alphabet.

    Wenn ich bei Deinem Script die Sortierfunktion umstelle:

    AutoIt
    Func cbByLength(ByRef $A, ByRef $B)
        Local $nA = StringLen($A), $nB = StringLen($B)
        If $nA = $nB Then Return -StringCompare($nA, $nB, 1)
        Return $nA > $nB ? -1 : 1
    EndFunc

    Dann passt es fasst. Allerdings treten ein paar Merkwürdigkeiten auf:

    dynArray.jpg

    Manche Einträge werden aufsteigend sortiert und manche absteigend.

  • Strings nach Länge sortieren (_ArraySortStringLen)

    • Oscar
    • 16. März 2022 um 14:48

    Ich brauchte eine Sortierfunktion, um Strings der Länge nach zu sortieren.

    Mir war schon klar, dass es auf eine Quicksort-Funktion hinauslaufen würde, aber ich wollte auch mal sehen, wie sich andere Sortierverfahren schlagen.

    BubbleSort ist zwar einfach zu programmieren, aber grottenlahm. InsertionSort war dann schon schneller, aber mit vielen String (mehreren Tausend) auch nicht wirklich brauchbar.

    Meine Quicksort-Funktion schlägt sich schon ganz gut (über 13.000 Strings in ca. 1.8 s, InsertionSort braucht fast 5 Minuten).

    Vielleicht kann ja noch jemand so eine Funktion gebrauchen oder es findet jemand noch Optimierungsmöglichkeiten.

    Im ZIP-Archiv (Anhang) befindet sich neben dem Script auch die Testdatei mit den 13.071 Strings.

    Edit1 17.03.2022:

    Dank Lambdax und AspirinJunkie musste ich feststellen, dass Quicksort hier nicht die schnellste Variante ist, sondern BucketSort.

    Und dank MAPS (ab AutoIt v3.3.16.0 oder Beta-Version) kann man eine recht kleine BucketSort-Funktion damit erstellen.

    Edit2 17.03.2022:

    Die BucketSort-Funktion konnte man noch optimieren (_ArrayConcatenate war überflüssig, das kann man gleich in das Quell-Array schreiben).

    Und _ArraySort mit DualPivot ist auch noch etwas schneller.

    Mit 0.178 s (auf meinem Rechner) ist das wohl jetzt das Optimum.

    Edit3 06.04.2022:

    Ich habe mal eine UDF daraus erstellt. Man kann die Buckets beim BucketSort auch mit einem Array abbilden, was nur geringfügig langsamer als die MAPS-Variante ist.

    Hat aber den Vorteil, dass es auch mit älteren AutoIt-Versionen funktioniert.

    Im Anhang befindet sich das ZIP-Archiv "_ArraySortStringLen.zip", mit der UDF, einem Example und zwei Teilwörterbüchern (107.632 und 538.160 Wörter) zum testen.

    Auf meinem Rechner benötigt die Funktion für das große Wörterbuch nur ca. 7 Sekunden zum sortieren (inkl. Alphabetisch).

    BucketSort mit Arrays:

    AutoIt
    #include-once
    #include <Array.au3>
    #include <AutoItConstants.au3>
    
    ; ============================================================================================================
    ; Name...........: _ArraySortStringLen
    ; Description ...: Sortiert ein 1D-StringArray nach den Stringlaengen
    ; Syntax.........: _ArraySortStringLen($aData[, $iDescending][, $iAlphabetical][, $sSepChar][, $iMax])
    ; Parameters ....: $aData = das Array mit den Strings
    ;                  $iDescending = auf- oder absteigend sortieren (Standard = 0 = aufsteigend)
    ;                  $iAlphabetical = zusaetzlich noch alphabetisch sortieren (Standard = 0 = nein)
    ;                  $sSepChar = das zu verwendende Trennzeichen (darf nicht in den Strings vorkommen)
    ;                  $iMax = die maximale Stringlaenge (Standard = 50, wird aber automatisch vergroessert)
    ; Return values .: bei Erfolg = True und das uebergebene Array ist entsprechend sortiert (ByRef-Uebergabe)
    ;                  im Fehlerfall = False und @error =
    ;                     1: Das uebergenene Array ist kein 1D-Array
    ; Author ........: Oscar (www.autoit.de)
    ; ============================================================================================================
    Func _ArraySortStringLen(ByRef $aData, $iDescending = 0, $iAlphabetical = 0, $sSepChar = Chr(0), $iMax = 50)
        If UBound($aData, $UBOUND_DIMENSIONS) <> 1 Then Return SetError(1, 0, False)
        If UBound($aData, $UBOUND_ROWS) <= 1 Then Return True
        Local $aBucket[$iMax], $iLen, $aTmp, $iIndex = 0
        For $sWord In $aData
            $iLen = StringLen($sWord)
            If $iLen = 0 Then ContinueLoop
            If $iLen >= $iMax Then
                $iMax = $iLen + 1
                ReDim $aBucket[$iMax]
            EndIf
            $aBucket[$iLen] &= $sWord & $sSepChar
        Next
        If $iDescending Then _ArrayReverse($aBucket)
        For $sTmp In $aBucket
            If $sTmp = '' Then ContinueLoop
            $aTmp = StringSplit(StringTrimRight($sTmp, 1), $sSepChar, 3)
            If $iAlphabetical Then _ArraySort($aTmp, $iDescending, 0, 0, 0, 1)
            For $sWord In $aTmp
                $aData[$iIndex] = $sWord
                $iIndex += 1
            Next
        Next
        Return True
    EndFunc   ;==>_ArraySortStringLen
    Alles anzeigen

    BucketSort:

    AutoIt
    #include <Array.au3>
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <WindowsConstants.au3>
    Global $sFile = @ScriptDir & '\autocomplete.txt'
    Global $sData = FileRead($sFile)
    Global $aWords = StringSplit($sData, @CRLF, 3)
    Global $iTimer, $iDiff
    
    $iTimer = TimerInit()
    _BucketSortLength($aWords)
    $iDiff = TimerDiff($iTimer) / 1000
    ConsoleWrite(StringFormat('Wörter: %i\r\nZeit: %.03f s\r\n', UBound($aWords), $iDiff))
    _ArrayShow($aWords)
    
    Func _BucketSortLength(ByRef $aData)
        Local $mBucket[], $iLen, $aKeys, $sTmp, $aTmp, $iIndex = 0
        For $sWord In $aData
            $iLen = StringLen($sWord)
            If $mBucket.exists($iLen) Then
                $mBucket[$iLen] &= $sWord & ','
            Else
                $mBucket[$iLen] = $sWord & ','
            EndIf
        Next
        $aKeys = MapKeys($mBucket)
        _ArraySort($aKeys, 1)
        For $sTmp In $aKeys
            $aTmp = StringSplit(StringTrimRight($mBucket[$sTmp], 1), ',', 2)
            _ArraySort($aTmp, 1, 0, 0, 0, 1)
            For $sWord In $aTmp
                $aData[$iIndex] = $sWord
                $iIndex += 1
            Next
        Next
    EndFunc
    
    ; Funktion zum Anzeigen des Arrays
    Func _ArrayShow(ByRef $aData, $sTitle = 'ArrayShow')
        Local $hGui = GUICreate($sTitle, 540, @DesktopHeight - 140, -1, 10, BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX))
        Local $idLV = GUICtrlCreateListView('Row|Data', 5, 5, 530, @DesktopHeight - 150)
        GUICtrlSetFont(-1, 12, 400, 0, 'Courier New')
        GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
        _GUICtrlListView_JustifyColumn($idLV, 0, 1)
        _GUICtrlListView_BeginUpdate($idLV)
        For $i = 0 To UBound($aData) - 1
            GUICtrlCreateListViewItem($i & '|"' & $aData[$i] & '"', $idLV)
        Next
        _GUICtrlListView_SetColumnWidth($idLV, 0, $LVSCW_AUTOSIZE)
        _GUICtrlListView_SetColumnWidth($idLV, 1, $LVSCW_AUTOSIZE)
        _GUICtrlListView_EndUpdate($idLV)
        GUISetState()
        Do
        Until GUIGetMsg() = -3
        GUIDelete($hGui)
    EndFunc   ;==>_ArrayShow
    Alles anzeigen

    Quicksort:

    AutoIt
    #include <GUIConstantsEx.au3>
    #include <GuiListView.au3>
    #include <WindowsConstants.au3>
    
    Global $sFile = @ScriptDir & '\autocomplete.txt'
    Global $sData = FileRead($sFile)
    Global $aWords = StringSplit($sData, @CRLF, 3)
    Global $iTimer, $iDiff
    
    ; Zur Auswahl der Sortiermethode (Achtung! InsertionSort dauert sehr lange!)
    ; $bQuicksort = True gleich Quicksort (bei mir: 1.865 s)
    ; $bQuicksort = False gleich InsertionSort (bei mir: 287.283 s also fast 5 Minuten)
    Global $bQuicksort = True
    Switch $bQuicksort
        Case True
            $iTimer = TimerInit()
            _QSSortLength($aWords)
            $iDiff = TimerDiff($iTimer) / 1000
        Case False
            $iTimer = TimerInit()
            _QSInsertionSort($aWords)
            $iDiff = TimerDiff($iTimer) / 1000
    EndSwitch
    ;~ _ArrayReverse($aWords)
    ConsoleWrite(StringFormat('Wörter: %i\r\nZeit: %.03f s\r\n', UBound($aWords), $iDiff))
    _ArrayShow($aWords)
    
    ; Funktion fuer den Stringvergleich
    Func _QSStringCmp(Const $sD1, Const $sD2)
        Local $1 = StringLen($sD1), $2 = StringLen($sD2)
        If $1 = $2 Then Return StringCompare($sD1, $sD2, 1) >= 0
        Return $1 > $2
    EndFunc   ;==>_QSStringCmp
    
    ; Rekursive Quicksort-Funktion
    Func _QSSortLength(ByRef $aData, $left = 0, $right = UBound($aWords) - 1)
        If $right - $left >= 20 Then ; bei 20 und mehr Elementen, Quicksort benutzen
            If $left < $right Then
                Local $pivot = _QSSplitSwap($aData, $left, $right)
                _QSSortLength($aData, $left, $pivot - 1)
                _QSSortLength($aData, $pivot + 1, $right)
            EndIf
        Else ; bei weniger als 20 (noch verbleibenden) Elementen, ist InsertionSort schneller
            _QSInsertionSort($aData, $left, $right)
        EndIf
    EndFunc   ;==>_QSSortLength
    
    Func _QSSplitSwap(ByRef $aData, $left, $right)
        Local $i = $left, $j = $right - 1, $pivot = $aData[$right], $h
        Do
            While _QSStringCmp($aData[$i], $pivot) And $i < $right
                $i += 1
            WEnd
            While _QSStringCmp($pivot, $aData[$j]) And $j > $left
                $j -= 1
            WEnd
            If $i < $j Then
                $h = $aData[$i]
                $aData[$i] = $aData[$j]
                $aData[$j] = $h
            EndIf
        Until $i >= $j
        $aData[$right] = $aData[$i]
        $aData[$i] = $pivot
        Return $i
    EndFunc   ;==>_QSSplitSwap
    
    ; InsertionSort-Funktion
    Func _QSInsertionSort(ByRef $aData, $iStart = 0, $iEnd = UBound($aData) - 1)
        Local $sVal, $j
        For $i = $iStart To $iEnd
            $sVal = $aData[$i]
            $j = $i
            While ($j > $iStart) And _QSStringCmp($sVal, $aData[$j - 1])
                $aData[$j] = $aData[$j - 1]
                $j -= 1
            WEnd
            $aData[$j] = $sVal
        Next
    EndFunc   ;==>_QSInsertionSort
    
    ; Funktion zum Anzeigen des Arrays
    Func _ArrayShow(ByRef $aData, $sTitle = 'ArrayShow')
        Local $hGui = GUICreate($sTitle, 540, @DesktopHeight - 140, -1, 10, BitOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX))
        Local $idLV = GUICtrlCreateListView('Row|Data', 5, 5, 530, @DesktopHeight - 150)
        GUICtrlSetFont(-1, 12, 400, 0, 'Courier New')
        GUICtrlSetResizing(-1, $GUI_DOCKBORDERS)
        _GUICtrlListView_JustifyColumn($idLV, 0, 1)
        _GUICtrlListView_BeginUpdate($idLV)
        For $i = 0 To UBound($aData) - 1
            GUICtrlCreateListViewItem($i & '|"' & $aData[$i] & '"', $idLV)
        Next
        _GUICtrlListView_SetColumnWidth($idLV, 0, $LVSCW_AUTOSIZE)
        _GUICtrlListView_SetColumnWidth($idLV, 1, $LVSCW_AUTOSIZE)
        _GUICtrlListView_EndUpdate($idLV)
        GUISetState()
        Do
        Until GUIGetMsg() = -3
        GUIDelete($hGui)
    EndFunc   ;==>_ArrayShow
    Alles anzeigen

    Dateien

    _QuicksortLength.zip 41,04 kB – 363 Downloads _BucketSortLength.zip 40,58 kB – 366 Downloads _ArraySortStringLen.zip 2,98 MB – 469 Downloads
  • [Wettbewerb] String komprimieren

    • Oscar
    • 16. März 2022 um 14:32
    Zitat von AspirinJunkie

    Daher plädiere ich dafür, die Bewertung komplett von der Zeichenlänge zu entkoppeln und nur die resultierende Dateigröße als Bewertungsmaßstab zu verwenden.

    Ja, ich verstehe, was Du meinst, aber mir fehlt eine mögliche Lösung.

    Wenn ich die Datei als UTF8_NOBOM einlese und die komprimierte Datei als Binary speichere, danach wieder als Binary einlese und mit dem Original vergleiche, dann stimmen die Daten nicht mehr, weil jetzt ANSI.

    Oder ich muss gleich die Originaldaten als ANSI speichern. Dann ist das halt nur für den Wettbewerb.

    Angesichts der vielen Probleme, ist die Aufgabenstellung vielleicht doch nicht so gut. :/

  • AutoIt 3.3.16.0 / Änderungen in der GuiListView.au3

    • Oscar
    • 13. März 2022 um 08:24
    Zitat von bazii

    Auch nach Versuch Deiner beiden Tips friert die GUI beim ausführen meines Scriptes für die Zeit einer FTP-Verbindung ein (was beim Ausführen des Scriptes bei AutoIt 3.3.14.5 nicht der Fall ist oder war).

    Dann wäre es hilfreicher, wenn Du mal Dein ganzes Script postest, denn der Fehler hat dann nichts mit dem Schnipsel zu tun, den Du oben gepostest hast.

  • AutoIt 3.3.16.0 ist zur Welt gekommen ...

    • Oscar
    • 10. März 2022 um 14:17
    Zitat von Velted

    und AutoIt unterstützt damit 'offiziell' Maps.

    Das macht das ScriptingDictionary-Objekt überflüssig.

    Finde ich richtig gut! :party:

  • [Wettbewerb] String komprimieren

    • Oscar
    • 4. März 2022 um 19:07
    Zitat von Lambdax

    Aber meine methode hingegen halte ich nicht für unrealistisch.

    Dann müssen wir die Gesamtgröße (inkl. Script und aller Zusatzdateien) vergleichen. Das wird absurd kompliziert.

    Es geht hier ja nicht darum, eine Kompressions-UDF zu entwickeln. Da gibt es bereits zahlreiche Methoden, um Text/Grafik/Binaries zu komprimieren.

    Ich wollte einen Wettbewerb, was mit reinem AutoIt-Code möglich ist.

    Vielleicht um auch mal kuriose Lösungswege aufzuzeigen.

  • [Wettbewerb] String komprimieren

    • Oscar
    • 4. März 2022 um 07:44
    Zitat von Lambdax

    Ehh, wo hast du das gesagt? Lese ich zum ersten mal

    Ok, ich habe das nicht explizit gesagt/geschrieben, aber ich hielt das auch für selbstverständlich.

    Man muss die komprimierte Datei ja schließlich irgendwie wieder entpacken können, z.b auf einem anderen Rechner.

    Und wenn das Wörterbuch nicht mitzählt, dann kann man natürlich gigantische Kompressionsraten erzielen.

  • [Wettbewerb] String komprimieren

    • Oscar
    • 4. März 2022 um 06:52
    Zitat von Lambdax

    Compress-Ratio: 71.987 %

    Eine Kompressionsrate besser als beim ZIP-Format erscheint mir zu gut, um wahr zu sein.

    Nur um das nochmal deutlich zu sagen: Ein verwendetes Wörterbuch bzw. eine Ersetztabelle muss natürlich im Kompressionsformat mit enthalten sein, sodass es von der Größe her mitzählt.

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™