Sign in to follow this  
Followers 0
Celeri

proposed UDF: _ToBase64() and _FromBase64()

10 posts in this topic

#1 ·  Posted (edited)

### EDIT: November 7, 2005 ###

Mostly works B) But it's a bit slow and there might be a problem with the expression "(Not IsBinaryString($s_Source))". So rem it out (if needed) while I streamline both To and From functions.

### EDIT: November 4, 2005 ###

Whoohoo! Beta 86 now handles binary strings ... sorta.

I'll have both functions working by the end of this week-end promised :o

P.S.: If anyone has any idea how I could speed this up, it would be great. Some magic math trick perhaps?

### EDIT: October 28, 2005 ###

Confirmed: _ToBase64() will not work on binary files until such time as AutoIT3 is capable of handling binary strings *properly*. For now I would need to convert everything to hex and this function would take a serious performance hit (can you say S-L-O-W ?). I might do it for the kick of it but don't expect anything until next week.

BTW, since _FromBase64() does not handle binary input, it should work fine.

### EDIT: October 25, 2005 ###

Updated both _ToBase64() and _FromBase64()

Respectively, version 1.05 and 1.06

- Can now set line length by calling _ToBase64($Source,$LineLength).

- Default line length = 76 (as per RFC 3548). Different lengths might be less compatible

- New error value for _ToBase64() : @error = 4 - Line size invalid

- _ToBase64() is now completely loop-based.

- More comments to help people understand how this works

- Dumb error: now strips before doing a regular expression search in _FromBase64()

I'm working on an email UDF and I want to integrate attachments.

Since the only Base64 solutions I found were external, I decided to roll my own UDF instead.

It was actually quite a bit harder than I taught and it took me way too much time to do but now I am satisfied with the results.

So here's my two latest babies, _ToBase64() and _FromBase64().

Mind you I haven't tested them completely yet so please come back to me if anything doesn't work.

I'm also open to your suggestions if you find that something should be added/modified.

Although I really can't see what could be.

Attachements at the end of the file, with documentation and example.

;===============================================================================
;
; Function Name:       _ToBase64($s_Source, [$i_LineSize])
; Version:            1.05
; Description:      Create a base 64 string
; Parameter(s):     $s_Source        - Source string
;                    $i_LineSize        - Number of characters before a @CRLF
; Requirement(s):   Requires AutoIT 3.1.1.77 minimum
; Return Value(s):  On Success - Returns converted string
;                   On Failure - Returns "" and sets the @error flag in the following fashion:
;                    @error = 1 - Source string empty
;                    @error = 2 - Invalid source type (not string)
;                    @error = 3 - Wrong version of AutoIT, 3.1.1.77 minimum
;                    @error = 4 - Line size invalid
; Remarks:            RFC 3548 requires a line size of 76 characters (default).
;                    Using different line sizes may not be compatible with certain mail readers.
; Related:            _FromBase64()
; Author(s):        Louis Horvath (celeri@videotron.ca)
;
;===============================================================================
Func _ToBase64($s_Source, $i_LineSize = 76)
    Local $a_Base64[65], $i_Loop1, $i_Loop2, $a_Mask6[4], $a_Shift6[4], $a_Shift8[4]
    Local $i_SourceLen, $i_Pad, $s_SrcChr, $i_Convert, $i_Assembly, $s_Result
    Local $i_LineSizeCounter
    
; Sanity checks
    If $s_Source = "" Then
        SetError(1); Source string empty
        Return
    EndIf
    If Not IsString($s_Source) Then
        SetError(2); Invalid source type (not string)
        Return
    EndIf
    If Not StringLen(Chr(0)) Then
        SetError(3); Cannot detect character "0" then wrong version of AutoIT ...
        Return
    EndIf
    If (Not IsInt($i_LineSize)) Or $i_LineSize < 2 Or $i_LineSize > 250 Then
        SetError(4); Line Size is invalid
        Return; Actual size suggested by RFC 3548: 76. 64 tolerated.
    EndIf
    
; Create Base64 matrix
    For $i_Loop1 = 65 To 90; Capital letters
        $a_Base64[$i_Loop1 - 65] = Chr($i_Loop1)
    Next
    For $i_Loop1 = 97 To 122; Small caps
        $a_Base64[$i_Loop1 - 71] = Chr($i_Loop1)
    Next
    For $i_Loop1 = 48 To 57; Numbers
        $a_Base64[$i_Loop1 + 4] = Chr($i_Loop1)
    Next
    $a_Base64[62] = '+'
    $a_Base64[63] = '/'
    $a_Base64[64] = '='; Padding
; Create 6-bit Mask
    $a_Mask6[0] = 0xFC0000
    $a_Mask6[1] = 0x3F000
    $a_Mask6[2] = 0xFC0
    $a_Mask6[3] = 0x3F
; Create 6-bit shifting table
    $a_Shift6[0] = 18
    $a_Shift6[1] = 12
    $a_Shift6[2] = 6
    $a_Shift6[3] = 0
; Create 8-bit shifting table
    $a_Shift8[0] = -16
    $a_Shift8[1] = -8
    $a_Shift8[2] = 0
    
    $i_SourceLen = StringLen($s_Source); Length of input string
    
    For $i_Loop1 = 1 To $i_SourceLen Step 3
    ; Start by assembling a 3-byte integer (24 bits)
        $i_Assembly = ""; Flush beforehand
        For $i_Loop2 = 0 To 2; go though all 3 bytes
            If $i_Loop1 + $i_Loop2 > $i_SourceLen Then
                $i_Pad = $i_Loop2; Stop if end of string is reached, take note where it happens
                ExitLoop
            EndIf
            $s_SrcChr = StringMid($s_Source, $i_Loop1 + $i_Loop2, 1); Get original character from source
            $i_Convert = BitShift(Asc($s_SrcChr), $a_Shift8[$i_Loop2]); Shift it!
            $i_Assembly += $i_Convert; Set as first value
        Next
        
    ; Now set Base64 values!
        For $i_Loop2 = 0 To 3; Set Base64 values
            If $i_Loop2 = 2 And $i_Pad = 1 Then; Special case #1
                $s_Result &= $a_Base64[64]; Insert padding
                ContinueLoop
            ElseIf $i_Loop2 = 3 And $i_Pad > 0 Then; Special case #2
                $s_Result &= $a_Base64[64]; Insert padding
                ContinueLoop
            EndIf
            $i_Convert = BitShift(BitAND($i_Assembly, $a_Mask6[$i_Loop2]), $a_Shift6[$i_Loop2]); Extract first value, shift it to size
            $s_Result &= $a_Base64[$i_Convert]
            $i_LineSizeCounter += 1; Increment counter
            If $i_LineSizeCounter = $i_LineSize Then; Time to change lines
                $s_Result &= @CR; Add CR
                $i_LineSizeCounter = 0; Reset counter
            EndIf
        Next
    Next
    If $i_LineSizeCounter Then; One for the road (don't if the counter just reset)
        $s_Result &= @CR; Add CR
    EndIf
    Return $s_Result
EndFunc  ;==>_ToBase64

;===============================================================================
;
; Function Name:       _FromBase64($s_Source)
; Version:            1.06
; Description:      Restores a string encoded in base 64
; Parameter(s):     $s_Source        - Source string
; Requirement(s):   Requires AutoIT 3.1.1.77 minimum
; Return Value(s):  On Success - Returns restored string
;                   On Failure - Returns "" and sets the @error flag in the following fashion:
;                    @error = 1 - Source string empty
;                    @error = 2 - Invalid source type (not string)
;                    @error = 3 - Not a Base64 source
;                    @error = 4 - Wrong version of AutoIT, 3.1.1.77 minimum
; Remarks:            None
; Related:            _ToBase64()
; Author(s):        Louis Horvath (celeri@videotron.ca)
;
;===============================================================================
Func _FromBase64($s_Source)
    Local $s_Result, $a_Conv[4][3], $a_Base64[123], $i_SourceLen, $a_Mask8[3]
    Local $i_Loop1, $i_Loop2, $i_Loop3, $i_Final, $i_Read, $a_Shift6[4], $a_Shift8[3]
    
; Sanity checks
    If $s_Source = "" Then
        SetError(1); Source string empty
        Return
    EndIf
    If Not IsString($s_Source) Then
        SetError(2); Invalid source type (not string)
        Return
    EndIf
    If Not StringLen(Chr(0)) Then
        SetError(4); Cannot detect character "0" then wrong version of AutoIT ...
        Return
    EndIf
    $s_Source = StringStripWS($s_Source, 15); Just strip EVERYTHING;)
    If StringRegExp($s_Source, "[^a-zA-Z0-9+//=]") Then; Contains characters not in the base64 subset.
        SetError(3); Not a Base64 source
        Return
    EndIf
    
    
; Create Base64 restore matrix
    For $i_Loop1 = 65 To 90; Capital letters
        $a_Base64[$i_Loop1] = $i_Loop1 - 65
    Next
    For $i_Loop1 = 97 To 122; Small caps
        $a_Base64[$i_Loop1] = $i_Loop1 - 71
    Next
    For $i_Loop1 = 48 To 57; Numbers
        $a_Base64[$i_Loop1] = $i_Loop1 + 4
    Next
    $a_Base64[43] = 62; '+'
    $a_Base64[47] = 63; '/'
    $a_Base64[0] = 64; Padding
; Create 8-bit Mask
    $a_Mask8[0] = 0xFF0000; Mask first pair
    $a_Mask8[1] = 0x00FF00; Mask second pair
    $a_Mask8[2] = 0x0000FF; And the last ...
; Predetermine shift values, 6-bit
    $a_Shift6[0] = -18
    $a_Shift6[1] = -12
    $a_Shift6[2] = -6
    $a_Shift6[3] = 0
; Predetermine shift values, 8-bit
    $a_Shift8[0] = 16
    $a_Shift8[1] = 8
    $a_Shift8[2] = 0
    
    $i_SourceLen = StringLen($s_Source); Get source string length
    
    For $i_Loop1 = 1 To $i_SourceLen Step 4
        For $i_Loop2 = 0 To 3
            If $i_Loop1 + $i_Loop2 > $i_SourceLen Then ExitLoop; Out of bounds
            $a_Conv[$i_Loop2][0] = Asc(StringMid($s_Source, $i_Loop1 + $i_Loop2, 1)); Find original string and it's numerical value
            $a_Conv[$i_Loop2][1] = $a_Base64[$a_Conv[$i_Loop2][0]]; What's it's value according to the table?
            $a_Conv[$i_Loop2][2] = BitShift($a_Conv[$i_Loop2][1], $a_Shift6[$i_Loop2]); Put it in place bit-wise
        Next
        $i_Final = BitOR($a_Conv[0][2], $a_Conv[1][2], $a_Conv[2][2], $a_Conv[3][2]); Combine it all
        For $i_Loop3 = 0 To 2; Now read bytes individually ...
            $i_Read = BitShift(BitAND($i_Final, $a_Mask8[$i_Loop3]), $a_Shift8[$i_Loop3]); mask and move
            If $i_Read Then
                $s_Result &= Chr($i_Read); Append to the complete string, skip chr(0)
            EndIf
        Next
    Next
    Return $s_Result; Return the converted string
EndFunc  ;==>_FromBase64

And here's the attachements for those who have problems copying and pasting by way of Internet Explorer ...

_ToBase64__.zip

_FromBase64__.zip

Edited by Celeri

I am endeavoring, ma'am, to construct a mnemonic circuit using stone knives and bearskins.SpockMy UDFs:Deleted - they were old and I'm lazy ... :)My utilities:Comment stripperPolicy lister 1.07AutoIT Speed Tester (new!)

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

Glad to see someone looking at this, I've been using an external file implementation for a while.

I haven't looked at your technical implementation, but any formal UDF implemenation for en/decoding

operations should be in a single Function, i.e.

_Base64($string_or_file,$encode_flag)

I just went back and looked at the change logs referencing 3.1.77 and binary support - didn't realize we had

jumped that hurdle yet. Kudos to the programmers who went through all the headaches of making that happen!

Edited by flyingboz

Reading the help file before you post... Not only will it make you look smarter, it will make you smarter.

Share this post


Link to post
Share on other sites

@flyingboz

Yup that would be a good idea B)

I'll see what I can do but for now I would like to iron out the bugs and make sure my process is failsafe.

So if anyone can send out some attachments and see if they come back :graduated: that would be great!

Ok so it's not "over and done with" after all :)

In fact there IS something important I didn't integrate in this fuction...

Can you say "split line every 'n' characters"?

Also it would be equally smart to strip @CRLFs before reading ...

I should be able to integrate that before tomorrow.

For those who can't wait, try using my _StringInsert() function. It's in my signature.

Example:

For $i_interval = 1 to StringLen($Base64) step 80

_StringInsert($Base64,@CRLF,$i_interval)

Next

$Base64 &= @CRLF

; Puts @CRLF every 80 characters and at the end of the base 64 file.

P.S.: '&=' only works on beta.

P.S.: Hope I didn't miss anything I'm falling asleep here :o


I am endeavoring, ma'am, to construct a mnemonic circuit using stone knives and bearskins.SpockMy UDFs:Deleted - they were old and I'm lazy ... :)My utilities:Comment stripperPolicy lister 1.07AutoIT Speed Tester (new!)

Share this post


Link to post
Share on other sites

I haven't looked at your technical implementation, but any formal UDF implemenation for en/decoding

operations should be in a single Function, i.e.

_Base64($string_or_file,$encode_flag)
Well after thinking about it I'm not convinced I should merge both options into a single operation (note: I didn't say no).

Why? Check out these function couples:

_StringToHex & _HexToString

_TicksToTime & _TimeToTicks

ControlEnable & ControlDisable

_Degrees & _Radians

etc. etc. etc.

I think users expect a different function to come and go from a specific state.

And I think seperating them respects more the spirit of AutoIT3.

Furthermore, I find both _ToBase64() and _FromBase64 are sufficiently different that no real economy is made by merging them.

(on a technical side, most arrays and sequences are really different, and I fear putting all this together will make these functions very hard to read, which is maybe not what you want if these functions are to have a didactic value)

But then, I might be wrong.

Worse case scenario (I know this s!!ks but ...) a little line of code like this could do the same:

Func Base64($s_String, $i_Switch = 0)
    If $i_Switch Then 
        _ToBase64($s_String)
    Else
        _FromBase64($s_String)
    Endif
EndFunc

Not my idea of an elegant solution but an alternative nevertheless.


I am endeavoring, ma'am, to construct a mnemonic circuit using stone knives and bearskins.SpockMy UDFs:Deleted - they were old and I'm lazy ... :)My utilities:Comment stripperPolicy lister 1.07AutoIT Speed Tester (new!)

Share this post


Link to post
Share on other sites

... _Degrees & _Radians ...

Haha! Those are mine. B) Nice functions btw, I can't find anything wrong with them. I did base64 image encoding a while ago for Firefox. Check it out here: http://www.autoitscript.com/forum/index.php?showtopic=15640

Share this post


Link to post
Share on other sites

Haha! Those are mine. :o Nice functions btw, I can't find anything wrong with them. I did base64 image encoding a while ago for Firefox. Check it out here: http://www.autoitscript.com/forum/index.php?showtopic=15640

Yup saw those :graduated:

Glad to see you know your maths - it's not really my forte ehehehe

And thanks for the contribution!

As for base64 image encoding, I'll check that out today or tomorrow B)

I always wondered why no one ever integrated actual data as part of a html file ... Can be useful sometimes...

BTW there's one last thing I have to do with _ToBase64() and _FromBase64() - check if the padding ('=' char) actually makes a difference / is accepted by Outlook Express/Outlook. So far however all the decoding programs that I've tried have no problems with it but weird things happen when I take them away ...


I am endeavoring, ma'am, to construct a mnemonic circuit using stone knives and bearskins.SpockMy UDFs:Deleted - they were old and I'm lazy ... :)My utilities:Comment stripperPolicy lister 1.07AutoIT Speed Tester (new!)

Share this post


Link to post
Share on other sites

#7 ·  Posted (edited)

### EDIT: November 7th 2005 ###

Now works with Beta 3.1.1.86. Check out first post ...

Well just hit a (temporary) wall.

Seems even with the latest beta, StringMid() cannot handle binary data.

So _ToBase64() cannot handle binary data for the moment.

Well it's possible to retool _ToBase64() to accept hex input (you have to use String($BinaryString)).

It won't be fun I tell ya.

P.S.: However _FromBase64() is fine - StringMid() is used on non-binary data.

Edited by Celeri

I am endeavoring, ma'am, to construct a mnemonic circuit using stone knives and bearskins.SpockMy UDFs:Deleted - they were old and I'm lazy ... :)My utilities:Comment stripperPolicy lister 1.07AutoIT Speed Tester (new!)

Share this post


Link to post
Share on other sites

Sorry to be grave-digging, but for anyone who is looking for a base64 UDF, try this one:

http://www.autoitscript.com/forum/index.php?showtopic=21399

It's faster than any other I've seen on this board.

Share this post


Link to post
Share on other sites

;===============================================================================
;
; Function Name:       _ToBase64($s_Source, [$i_LineSize])
; Version:            1.05
; Description:      Create a base 64 string
; Parameter(s):     $s_Source        - Source string
;                    $i_LineSize        - Number of characters before a @CRLF
; Requirement(s):   Requires AutoIT 3.1.1.77 minimum
; Return Value(s):  On Success - Returns converted string
;                   On Failure - Returns "" and sets the @error flag in the following fashion:
;                    @error = 1 - Source string empty
;                    @error = 2 - Invalid source type (not string)
;                    @error = 3 - Wrong version of AutoIT, 3.1.1.77 minimum
;                    @error = 4 - Line size invalid
; Remarks:            RFC 3548 requires a line size of 76 characters (default).
;                    Using different line sizes may not be compatible with certain mail readers.
; Related:            _FromBase64()
; Author(s):        Louis Horvath (celeri@videotron.ca)
;
;===============================================================================
Func _ToBase64($s_Source, $i_LineSize = 76)
    Local $a_Base64[65], $i_Loop1, $i_Loop2, $a_Mask6[4], $a_Shift6[4], $a_Shift8[4]
    Local $i_SourceLen, $i_Pad, $s_SrcChr, $i_Convert, $i_Assembly, $s_Result
    Local $i_LineSizeCounter
    
; Sanity checks
    If $s_Source = "" Then
        SetError(1); Source string empty
        Return
    EndIf
    If Not IsString($s_Source) Then
        SetError(2); Invalid source type (not string)
        Return
    EndIf
    If Not StringLen(Chr(0)) Then
        SetError(3); Cannot detect character "0" then wrong version of AutoIT ...
        Return
    EndIf
    If (Not IsInt($i_LineSize)) Or $i_LineSize < 2 Or $i_LineSize > 250 Then
        SetError(4); Line Size is invalid
        Return; Actual size suggested by RFC 3548: 76. 64 tolerated.
    EndIf
    
; Create Base64 matrix
    For $i_Loop1 = 65 To 90; Capital letters
        $a_Base64[$i_Loop1 - 65] = Chr($i_Loop1)
    Next
    For $i_Loop1 = 97 To 122; Small caps
        $a_Base64[$i_Loop1 - 71] = Chr($i_Loop1)
    Next
    For $i_Loop1 = 48 To 57; Numbers
        $a_Base64[$i_Loop1 + 4] = Chr($i_Loop1)
    Next
    $a_Base64[62] = '+'
    $a_Base64[63] = '/'
    $a_Base64[64] = '='; Padding
; Create 6-bit Mask
    $a_Mask6[0] = 0xFC0000
    $a_Mask6[1] = 0x3F000
    $a_Mask6[2] = 0xFC0
    $a_Mask6[3] = 0x3F
; Create 6-bit shifting table
    $a_Shift6[0] = 18
    $a_Shift6[1] = 12
    $a_Shift6[2] = 6
    $a_Shift6[3] = 0
; Create 8-bit shifting table
    $a_Shift8[0] = -16
    $a_Shift8[1] = -8
    $a_Shift8[2] = 0
    
    $i_SourceLen = StringLen($s_Source); Length of input string
    
    For $i_Loop1 = 1 To $i_SourceLen Step 3
    ; Start by assembling a 3-byte integer (24 bits)
        $i_Assembly = ""; Flush beforehand
        For $i_Loop2 = 0 To 2; go though all 3 bytes
            If $i_Loop1 + $i_Loop2 > $i_SourceLen Then
                $i_Pad = $i_Loop2; Stop if end of string is reached, take note where it happens
                ExitLoop
            EndIf
            $s_SrcChr = StringMid($s_Source, $i_Loop1 + $i_Loop2, 1); Get original character from source
            $i_Convert = BitShift(Asc($s_SrcChr), $a_Shift8[$i_Loop2]); Shift it!
            $i_Assembly += $i_Convert; Set as first value
        Next
        
    ; Now set Base64 values!
        For $i_Loop2 = 0 To 3; Set Base64 values
            If $i_Loop2 = 2 And $i_Pad = 1 Then; Special case #1
                $s_Result &= $a_Base64[64]; Insert padding
                ContinueLoop
            ElseIf $i_Loop2 = 3 And $i_Pad > 0 Then; Special case #2
                $s_Result &= $a_Base64[64]; Insert padding
                ContinueLoop
            EndIf
            $i_Convert = BitShift(BitAND($i_Assembly, $a_Mask6[$i_Loop2]), $a_Shift6[$i_Loop2]); Extract first value, shift it to size
            $s_Result &= $a_Base64[$i_Convert]
            $i_LineSizeCounter += 1; Increment counter
            If $i_LineSizeCounter = $i_LineSize Then; Time to change lines
                $s_Result &= @CR; Add CR
                $i_LineSizeCounter = 0; Reset counter
            EndIf
        Next
    Next
    If $i_LineSizeCounter Then; One for the road (don't if the counter just reset)
        $s_Result &= @CR; Add CR
    EndIf
    Return $s_Result
EndFunc  ;==>_ToBase64oÝ÷ Ù«­¢+Øìôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôô(ì(ìչѥ½¸9µè}ɽµ   ÍØÐ ÀÌØíÍ}M½Õɤ(ìYÉÍ¥½¸èĸÀØ(ìÍÉ¥ÁÑ¥½¸èIÍѽÉÌÍÑÉ¥¹¹½¥¸ÍØÐ(ìAɵÑȡ̤èÀÌØíÍ}M½ÕÉ´M½ÕÉÍÑÉ¥¹(ìIÅեɵ¹Ð¡Ì¤èIÅÕ¥ÉÌÕѽ%P̸ĸĸÜܵ¥¹¥µÕ´(ìIÑÕɸY±Õ¡Ì¤è=¸MÕÍÌ´IÑÕɹÌÉÍѽÉÍÑÉ¥¹(ì=¸¥±ÕÉ´IÑÕɹÌÅÕ½ÐìÅÕ½Ðì¹ÍÑÌÑ¡Éɽȱ¥¸Ñ¡½±±½Ý¥¹Í¡¥½¸è(ìÉɽÈôÄ´M½ÕÉÍÑÉ¥¹µÁÑä(ìÉɽÈôÈ´%¹Ù±¥Í½ÕÉÑåÁ¡¹½ÐÍÑÉ¥¹¤(ìÉɽÈôÌ´9½Ð  ÍØÐͽÕÉ(ìÉɽÈôд]ɽ¹ÙÉÍ¥½¸½Õѽ%P°Ì¸Ä¸Ä¸Üܵ¥¹¥µÕ´(ìIµÉ­Ìè9½¹(ìI±Ñè}Q½   ÍØÐ ¤(ìÕÑ¡½È¡Ì¤è1½Õ¥Ì!½ÉÙÑ ¡±É¥Ù¥½Ñɽ¸¹¤(ì(ìôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôôô)Õ¹}ɽµ ÍØÐ ÀÌØíÍ}M½Õɤ(1½°ÀÌØíÍ}IÍձаÀÌØí}
½¹ÙlÑulÍt°ÀÌØí}   ÍØÑlÄÈÍt°ÀÌØí¥}M½ÕÉ1¸°ÀÌØí}5ͬálÍt(1½°ÀÌØí¥}1½½ÀÄ°ÀÌØí¥}1½½ÀÈ°ÀÌØí¥}1½½ÀÌ°ÀÌØí¥}¥¹°°ÀÌØí¥}I°ÀÌØí}M¡¥ÐÙlÑt°ÀÌØí}M¡¥ÐálÍt((ìM¹¥Ñä¡­Ì(%ÀÌØíÍ}M½ÕÉôÅÕ½ÐìÅÕ½ÐìQ¡¸(MÑÉÉ½È Ä¤ìM½ÕÉÍÑÉ¥¹µÁÑä(IÑÕɸ(¹%(%9½Ð%ÍMÑÉ¥¹ ÀÌØíÍ}M½ÕɤQ¡¸(MÑÉÉ½È È¤ì%¹Ù±¥Í½ÕÉÑåÁ¡¹½ÐÍÑÉ¥¹¤(IÑÕɸ(¹%(%9½ÐMÑÉ¥¹1¸¡
¡È À¤¤Q¡¸(MÑÉÉ½È Ð¤ì
¹¹½ÐÑСÉÑÈÅÕ½ÐìÀÅÕ½ÐìÑ¡¸Ýɽ¹ÙÉÍ¥½¸½Õѽ%P¸¸¸(IÑÕɸ(¹%(ÀÌØíÍ}M½ÕÉôMÑÉ¥¹MÑÉ¥Á]L ÀÌØíÍ}M½ÕÉ°ÄÔ¤ì)ÕÍÐÍÑÉ¥ÀYIeQ!%9ì¤(%MÑÉ¥¹IáÀ ÀÌØíÍ}M½ÕÉ°ÅÕ½ÐímyµéµhÀ´ä¬¼¼õtÅÕ½Ðì¤Q¡¸ì
½¹Ñ¥¹Ì¡ÉÑÉ̹½Ð¥¸Ñ¡ÍØÐÍÕÍи(MÑÉÉ½È Ì¤ì9½Ð    ÍØÐͽÕÉ(IÑÕɸ(¹%(((ì
ÉÑ    ÍØÐÉÍѽɵÑÉ¥à(½ÈÀÌØí¥}1½½ÀÄôØÔQ¼äÀì
Á¥Ñ°±ÑÑÉÌ(ÀÌØí}    ÍØÑlÀÌØí¥}1½½ÀÅtôÀÌØí¥}1½½ÀÄ´ØÔ(9áÐ(½ÈÀÌØí¥}1½½ÀÄôäÜQ¼ÄÈÈìMµ±°ÁÌ(ÀÌØí}   ÍØÑlÀÌØí¥}1½½ÀÅtôÀÌØí¥}1½½ÀÄ´ÜÄ(9áÐ(½ÈÀÌØí¥}1½½ÀÄôÐàQ¼ÔÜì9ÕµÉÌ(ÀÌØí}   ÍØÑlÀÌØí¥}1½½ÀÅtôÀÌØí¥}1½½ÀĬÐ(9áÐ(ÀÌØí}  ÍØÑlÐÍtôØÈìÌäì¬Ìäì(ÀÌØí}    ÍØÑlÐÝtôØÌìÌäì¼Ìäì(ÀÌØí}    ÍØÑlÁtôØÐìA¥¹(ì
ÉÑ൥Ð5ͬ(ÀÌØí}5ͬálÁtôÁáÀÀÀÀì5ͬ¥ÉÍÐÁ¥È(ÀÌØí}5ͬálÅtôÁàÀÁÀÀì5ͬͽ¹Á¥È(ÀÌØí}5ͬálÉtôÁàÀÀÀÁì¹Ñ¡±Íи¸¸(ìAÉÑɵ¥¹Í¡¥ÐÙ±Õ̰ص¥Ð(ÀÌØí}M¡¥ÐÙlÁtô´Äà(ÀÌØí}M¡¥ÐÙlÅtô´ÄÈ(ÀÌØí}M¡¥ÐÙlÉtô´Ø(ÀÌØí}M¡¥ÐÙlÍtôÀ(ìAÉÑɵ¥¹Í¡¥ÐÙ±Õ̰൥Ð(ÀÌØí}M¡¥ÐálÁtôÄØ(ÀÌØí}M¡¥ÐálÅtôà(ÀÌØí}M¡¥ÐálÉtôÀ((ÀÌØí¥}M½ÕÉ1¸ôMÑÉ¥¹1¸ ÀÌØíÍ}M½ÕɤìÐͽÕÉÍÑÉ¥¹±¹Ñ ((½ÈÀÌØí¥}1½½ÀÄôÄQ¼ÀÌØí¥}M½ÕÉ1¸MÑÀÐ(½ÈÀÌØí¥}1½½ÀÈôÀQ¼Ì(%ÀÌØí¥}1½½ÀĬÀÌØí¥}1½½ÀÈÐìÀÌØí¥}M½ÕÉ1¸Q¡¸á¥Ñ1½½Àì=Õн½Õ¹Ì(ÀÌØí}
½¹ÙlÀÌØí¥}1½½ÀÉulÁtôÍ¡MÑÉ¥¹5¥ ÀÌØíÍ}M½ÕÉ°ÀÌØí¥}1½½ÀĬÀÌØí¥}1½½ÀȰĤ¤ì¥¹½É¥¥¹°ÍÑÉ¥¹¹¥ÐÌäí̹յɥ°Ù±Õ(ÀÌØí}
½¹ÙlÀÌØí¥}1½½ÀÉulÅtôÀÌØí} ÍØÑlÀÌØí}
½¹ÙlÀÌØí¥}1½½ÀÉulÁutì]¡ÐÌäíÌ¥ÐÌäíÌٱսɥ¹Ñ¼Ñ¡Ñ±ü(ÀÌØí}
½¹ÙlÀÌØí¥}1½½ÀÉulÉtô  ¥ÑM¡¥Ð ÀÌØí}
½¹ÙlÀÌØí¥}1½½ÀÉulÅt°ÀÌØí}M¡¥ÐÙlÀÌØí¥}1½½ÀÉt¤ìAÕХХ¸Á±¥ÐµÝ¥Í(9áÐ(ÀÌØí¥}¥¹°ô   ¥Ñ=H ÀÌØí}
½¹ÙlÁulÉt°ÀÌØí}
½¹ÙlÅulÉt°ÀÌØí}
½¹ÙlÉulÉt°ÀÌØí}
½¹ÙlÍulÉt¤ì
½µ¥¹¥Ð±°(½ÈÀÌØí¥}1½½ÀÌôÀQ¼Èì9½ÜÉåÑÌ¥¹¥Ù¥Õ±±ä¸¸¸(ÀÌØí¥}Iô    ¥ÑM¡¥Ð¡   ¥Ñ9 ÀÌØí¥}¥¹°°ÀÌØí}5ͬálÀÌØí¥}1½½ÀÍt¤°ÀÌØí}M¡¥ÐálÀÌØí¥}1½½ÀÍt¤ìµÍ¬¹µ½Ù(%ÀÌØí¥}IQ¡¸(ÀÌØíÍ}IÍձеÀìô
¡È ÀÌØí¥}I¤ìÁÁ¹Ñ¼Ñ¡½µÁ±ÑÍÑÉ¥¹°Í­¥À¡È À¤(¹%(9áÐ(9áÐ(IÑÕɸÀÌØíÍ}IÍÕ±ÐìIÑÕɸѡ½¹ÙÉÑÍÑÉ¥¹)¹Õ¹ìôôÐí}ɽµ ÍØÐ


AutoIt-Syntaxsheme for Proton & Phase5 * Firefox Addons by me (resizable Textarea 0.1d) (docked JS-Console 0.1.1)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0