以后做个FORM自动对某目录下的 VCX/SCX/PRG 进行混淆。
看混出来结果我自己也发了神经,只混 local / lparameters也够了,再进一步的加密就是FLL化。
Lparameters tcCode,tcOo
*- 功能: 去掉注解. 针对 PRG代码|代码串的 混淆器,只混淆local定义和lParameters定义。
*-
*- tcCode:代码段,可以是多个function/procedure的文本
*- tcOo:默认为 o0。可为任意可用变量的字符。
*- 建议的选择 : ○◎ ○¤ ∝∞ ∵∴ шщ ┄┈ __ ∵∴ ∝∞ ■□ ★☆
*-
*- 现行的算法: 只是替换 LOCAL定义和lParameters定义中变量。
*- 替换的必须是 独立的“词”,以cSep来界定。
*-
*- 例外:如变量名,出现在 字符串,则不作替换。
Local cSep,XTbl[1,2],i,j,k,cLine,cBin,nLineCnt,cTmp,nLineIdx,nXTBLidx
Local nIdx,cVarName,nPos,cTmpCodes,cTmpLine,cNewCode,n第几次出现
Local nBeforePos,cBeforeChar, nAfterPos,cAfterChar, o1,o2, cBeforeLine
tcOo=Evl(tcOo,'o0')
o1=Substrc(tcOo,1,1)
o2=Substrc(tcOo,2,1)
Rand(-1)
cNewCode=''
cSep = Chr(13)+Chr(10)+Chr(9)+"()=+-*/@#<>.',%&[] !;"+'"'
nLineCnt = Getwordcount(tcCode,Chr(13)+Chr(10))
For nLineIdx=1 To nLineCnt
Wait Window Nowait ( Textmerge('obfuscating line <<nLineidx>> of <<nLineCnt>> ' ) )
cLine = Ltrim(Getwordnum(tcCode,nLineIdx,Chr(13)+Chr(10)),0,Chr(9),' ')
If Empty(cLine)
Loop
Endif
*-- 0. 分号续行的情况, 拼行
If Right(cLine,1)=';'
cBeforeLine = Evl(cBeforeLine,'') + ' ' + Left(cLine,Len(cLine)-1)
Loop
EndIf
If not Empty(cBeforeLine)
cLine = cBeforeLine + cLine
cBeforeLine=''
EndIf
*-- 1. 去掉注解 ----------------------------------------------
If Left(cLine,1)='*'
If not 'remove' $ lower(cLine) && for ca builder
Loop
EndIf
else
For i=1 To Occurs('&'+'&',cLine)
nPos = At('&'+'&',cLine,i)
If not glInString(cLine,nPos) &&不在字符串中
cLine = Substr(cLine,1,nPos-1)
Exit
EndIf
Next
EndIf
*-- 2. 若是local / lparameters 定义,创建对照表 ----------------------------
*- 例子: local i,j(2,3,2) as char , k,alist[2,3,2],oCa as oCa,uVal
cTmp = Lower(GetWordNum(cLine,1,' '))
If cTmp=='local' Or ( At(cTmp,'lparameters')=1 and Len(cTmp)>=4 )
cTmpLine = cLine
*- 2.1 处理一下定义中有数组的情况
If '[' $ cTmpLine OR '(' $ cTmpLine
cTmpLine = Chrtran(cTmpLine,'[]()','<><>')
For i=1 to Occurs('<',cTmpLine)
cTmpLine = Stuff(cTmpLine,At('<',cTmpLine,1),At('>',cTmpLine,1) - At('<',cTmpLine,1)+1,'')
Next
EndIf
*- 2.2 变量名-乱码 对照表,生成
For i=1 To Getwordcount(cTmpLine,',')
cVarName = Lower( Alltrim(Getwordnum(cTmpLine,i,','),1,Chr(10),Chr(9),Chr(13),' ',';') )
cTmp = Getwordnum(cVarName,1 ,' ') &&对付as的情况
If cTmp=='local' or cTmp=='lparameters'
cVarName = Getwordnum(cVarName,2 ,' ')
EndIf
If Ascan(XTbl,cVarName,1,0,1,2+4)>0
Loop
Endif
If Vartype(XTbl(1))<>'L'
Declare XTbl( Alen(XTbl,1)+1, 2)
Endif
XTbl(Alen(XTbl,1),1) = cVarName
cBin = ''
For j=30 To 0 Step -1
cBin = cBin + Iif(Bittest(Rand()*100000000,i),o1,o2)
Next
XTbl(Alen(XTbl,1),2) = o1 + cBin
Next
Endif
*-- 3. 遇到新的函数/过程/类定义,重置XTbl
For i=1 to GetWordCount('function,procedure,define class,func,proc',',')
cTmp=GetWordNum('function,procedure,define class,func,proc',i,',')
If Lower(Left(cLine,Len(cTmp)+1)) == cTmp+' '
Declare XTbl[1,2]
Store .f. to XTbl
Exit
EndIf
next
*--4. 替换变量
![](https://www.cnblogs.com/Images/dot.gif)
For nXTBLidx=1 To Alen(XTbl,1)
n第几次出现 = 1
Do While .T.
If Empty(XTbl(nXTBLidx,1))
Exit
EndIf
nPos = Atc(XTbl(nXTBLidx,1),cLine,n第几次出现)
If nPos=0
Exit
EndIf
nBeforePos = nPos-1
cBeforeChar = Substr(cLine,nBeforePos,1)
nAfterPos = nPos+Len(XTbl(nXTBLidx,1))
cAfterChar = Substr(cLine,nAfterPos,1)
If Not (cBeforeChar $ cSep Or Empty(cBeforeChar)) Or Not (cAfterChar $ cSep Or Empty(cAfterChar))
n第几次出现 = n第几次出现 + 1
Loop
EndIf
*- 字符串中,不替换。之前替换的,也要UNDO。 要确保乱码变量名不重复
If glInString(cLine,nPos)
cNewCode = Strtran(cNewCode,Xtbl(nXTBLidx,2),Xtbl(nXTBLidx,1),1,99999,1)
cLine = Strtran(cLine,Xtbl(nXTBLidx,2),Xtbl(nXTBLidx,1),1,99999,1)
Store .f. to Xtbl(nXTBLidx,2),Xtbl(nXTBLidx,1)
Exit
Else
cLine = Left(cLine, nPos-1) + XTbl(nXTBLidx,2) + Substr(cLine,nPos + Len(XTbl(nXTBLidx,1)) )
EndIf
EndDo
Next
*------------------
cNewCode = cNewCode + cLine +Chr(13)+Chr(10)
Next
Wait clear
tcCode = cNewCode &&for reference call
Return cNewCode
**********************************************************************************************************************
Function glInString
Lparameters tcString,tnPos
*- 判断字符串的某个位置, 是否在字符串中
*- 假定字符串,已是按VFP语法合法, 引号都已配对好的.
*- 为简化计,假定字符串,仅以 单引号 或 双引号 定界
*-
*- 多用于语法分析, 例如: glInString(" ? '这是一个字符串' + _screen.capiton",6 ) -> .t.
*- glInString(" ? '这是一个字符串' + _screen.capiton",2 ) -> .f.
Local cStr,n左位置,c另一半,i,cTmp,n右位置
cStr = Substr(tcString,1,tnPos-1)
If Empty(cStr)
Return .F.
Endif
*- [ ] '' ""
Do While .T.
n左位置 = Min( Evl(At('"',cStr), 99999), Evl(At("'",cStr), 99999) ) &&Evl(At('[',cStr),99999)
If n左位置=99999
Return .f.
EndIf
c另一半 = Substr(cStr,n左位置,1)
* c另一半 = Iif(c另一半='[',']',c另一半)
cStr=Substr(cStr,n左位置+1)
n右位置 = At(c另一半,cStr)
If n右位置 = 0
Return .t.
EndIf
cStr = Substr(cStr,n右位置+1)
EndDo
**********************************************************************************************************************
用于混淆的字符,可以任意指定的单或双字节字符,所以混出来的效果千奇百怪,
搞笑死了。
注意,混出来虽然乱,但都是可以正常运行的。
效果 1
For nlineidx=1 To nlinecnt
∝∞∝∝∝∞∞∞∞∞∝∝∝∝∝∞∝∝∞∝∝∝∝∝∝∞∞∝∝∞∞∞ = Ltrim(Getwordnum(∝∞∝∞∞∞∞∞∝∞∝∝∞∝∝∞∞∞∝∞∞∞∞∝∞∞∞∞∝∞∝∝,nlineidx,Chr(13)+Chr(10)),0,Chr(9),' ')
If Empty(∝∞∝∝∝∞∞∞∞∞∝∝∝∝∝∞∝∝∞∝∝∝∝∝∝∞∞∝∝∞∞∞)
Loop
Endif
If Left(∝∞∝∝∝∞∞∞∞∞∝∝∝∝∝∞∝∝∞∝∝∝∝∝∝∞∞∝∝∞∞∞,1)='*'
Loop
Endif
For ∝∞∝∞∞∝∝∞∝∞∝∝∞∞∝∞∞∞∞∞∝∝∞∞∝∞∞∝∞∝∞∝=1 To Occurs('&'+'&',∝∞∝∝∝∞∞∞∞∞∝∝∝∝∝∞∝∝∞∝∝∝∝∝∝∞∞∝∝∞∞∞)
∝∞∞∞∝∞∞∞∝∞∞∝∝∞∞∝∝∝∝∞∞∝∞∞∝∝∝∞∞∝∞∝ = At('&'+'&',∝∞∝∝∝∞∞∞∞∞∝∝∝∝∝∞∝∝∞∝∝∝∝∝∝∞∞∝∝∞∞∞,∝∞∝∞∞∝∝∞∝∞∝∝∞∞∝∞∞∞∞∞∝∝∞∞∝∞∞∝∞∝∞∝)
效果 2
Function gcO
Lparameters 神经经神神经经神神神经经经经经神神经经神经经神经经神经神经经经经,神经神神经神神经神经经经经经神神神神神神神经经经经经经神经经神经
Local 神经神经经经神经神神神神神神经经神神神神经神神神神神神神神神神神,神神经神经神经经神经神经神经神经神神经经神神经经神经经神经经经经[1,2],神神经经经神经神经神经经经经神经神经经经神经经神经经经神经神神神,神经神神经神神神神神神经神经神经经神神经经神神神神神经经经经经经,神神神经经经经经经经神经经经神经经经神经经神神神神经神经神神神神,神神神经神神经神神神神神经神神经经经神经经神神经经神神神经经经神,神经经经神经神神经神经神神经神神神神经经经经经神神经经经经神神神,nlinecnt,神经神经经神经神神神经经经经神经经经神神神经经经经经神神经经经经,nlineidx,神神神经神神神神神神经神经神神经经经神经经经神神神神神神神经经神
神经经经神经神经经神神经经经神经经经神经神神神经神神经神经经经神=Substrc(神经神神经神神经神经经经经经神神神神神神神经经经经经经神经经神经,2,1)
Rand(-1)
神经经神神神经经经神神经神经经经经神神经神经神经经经经神神经经经=''
神经神经经经神经神神神神神神经经神神神神经神神神神神神神神神神神 = Chr(13)+Chr(10)+Chr(9)+"()=+-*/@#<>.',%&[] !;"+'"'
nlinecnt = Getwordcount(神经经神神经经神神神经经经经经神神经经神经经神经经神经神经经经经,Chr(13)+Chr(10))
For nlineidx=1 To nlinecnt
神神神经神神经神神神神神经神神经经经神经经神神经经神神神经经经神 = Ltrim(Getwordnum(神经经神神经经神神神经经经经经神神经经神经经神经经神经神经经经经,nlineidx,Chr(13)+Chr(10)),0,Chr(9),' ')
If Empty(神神神经神神经神神神神神经神神经经经神经经神神经经神神神经经经神)
Loop
Endif
If Left(神神神经神神经神神神神神经神神经经经神经经神神经经神神神经经经神,1)='*'
Loop
Endif
效果 3 ( ┄ ┈ 很相似,实质是不同的)
Set Procedure To tmp2
Function gcO
Lparameters ┄┄┈┈┄┈┄┄┈┈┈┈┄┄┈┈┈┄┈┈┄┈┄┄┈┄┄┄┄┄┈┄,┄┄┄┈┈┄┈┈┈┈┈┄┄┄┈┄┈┄┄┄┄┈┈┈┈┄┄┄┈┄┄┄
Local ┄┄┄┄┈┈┄┄┈┈┈┈┄┈┄┈┈┈┈┈┈┄┈┄┄┄┄┈┄┈┈┈,┄┄┄┈┄┈┈┄┄┄┈┈┄┈┄┄┄┈┈┈┈┄┄┄┈┈┈┄┈┄┄┄[1,2],┄┈┈┄┄┄┈┈┄┄┈┈┄┈┄┄┈┈┄┄┄┈┄┄┈┄┄┄┄┈┈┈,┄┈┈┄┄┄┄┈┄┄┈┄┈┄┄┈┈┈┈┄┈┈┈┄┈┄┄┈┈┈┈┄,┄┄┈┄┈┈┈┈┄┈┈┄┈┄┄┄┄┄┈┈┄┄┈┄┄┄┄┄┈┄┄┄,┄┄┄┄┄┄┈┈┈┈┄┄┈┄┄┈┄┈┈┄┄┈┄┄┄┈┈┈┈┄┈┄,┄┄┈┄┄┄┈┄┄┄┈┈┈┄┈┄┄┈┄┄┄┄┄┈┄┄┈┈┄┄┄┄,nlinecnt,┄┈┈┄┈┈┄┄┈┈┄┄┄┄┈┈┈┈┈┈┈┈┈┄┈┄┈┈┄┈┄┈,nlineidx,┄┈┄┄┄┄┈┈┈┄┈┄┄┄┄┈┈┄┄┈┈┈┈┈┄┈┄┈┈┄┄┈
Local ┄┈┄┈┈┈┄┄┈┈┄┈┄┄┄┈┄┄┄┄┈┈┄┈┈┈┄┄┄┈┄┄,┄┈┈┄┄┄┄┈┄┈┈┈┈┈┄┈┄┄┄┈┈┄┄┈┈┄┈┄┄┈┄┈,┄┄┈┈┄┈┈┄┄┈┈┈┈┄┈┄┄┄┈┈┄┈┈┈┄┈┈┈┈┄┈┈,┄┈┄┈┄┈┄┈┈┈┄┄┄┈┈┄┄┈┈┄┈┄┈┄┈┈┄┈┄┄┄┈,┄┈┄┈┈┄┄┈┈┄┄┈┈┈┄┄┈┈┄┄┄┄┈┄┄┈┈┄┄┄┈┄,┄┈┄┄┄┈┄┄┈┈┄┈┈┈┄┄┄┈┈┄┄┄┈┄┄┈┄┄┄┄┄┄,┄┈┈┄┈┈┈┄┄┈┄┄┄┈┈┈┈┄┈┈┈┄┄┄┄┄┄┈┈┄┄┈
Local ┄┈┈┈┈┈┄┈┄┈┄┈┈┄┈┄┈┄┈┈┄┄┈┈┈┈┄┄┈┄┈┈,┄┄┄┄┄┈┄┄┈┈┄┈┄┄┈┈┈┈┄┈┈┈┄┈┄┄┈┄┄┄┄┈, ┄┄┄┈┄┈┈┈┈┈┈┄┈┈┈┈┄┄┈┄┄┄┄┈┄┈┄┈┈┄┄┄,┄┄┄┈┈┈┈┄┈┄┄┄┈┈┈┄┄┄┈┈┄┄┄┄┈┈┈┈┄┄┈┄, ┄┈┈┄┈┄┈┈┈┄┈┄┈┈┈┄┄┄┄┄┈┄┄┈┈┈┄┈┈┄┈┈,┄┈┄┈┈┄┈┄┈┈┄┈┈┈┈┄┈┈┄┈┈┄┄┄┈┄┈┈┄┈┄┈
┄┄┄┈┈┄┈┈┈┈┈┄┄┄┈┄┈┄┄┄┄┈┈┈┈┄┄┄┈┄┄┄=Evl(┄┄┄┈┈┄┈┈┈┈┈┄┄┄┈┄┈┄┄┄┄┈┈┈┈┄┄┄┈┄┄┄,'o0')
┄┈┈┄┈┄┈┈┈┄┈┄┈┈┈┄┄┄┄┄┈┄┄┈┈┈┄┈┈┄┈┈=Substrc(┄┄┄┈┈┄┈┈┈┈┈┄┄┄┈┄┈┄┄┄┄┈┈┈┈┄┄┄┈┄┄┄,1,1)
┄┈┄┈┈┄┈┄┈┈┄┈┈┈┈┄┈┈┄┈┈┄┄┄┈┄┈┈┄┈┄┈=Substrc(┄┄┄┈┈┄┈┈┈┈┈┄┄┄┈┄┈┄┄┄┄┈┈┈┈┄┄┄┈┄┄┄,2,1)
Rand(-1)
┄┈┄┄┄┈┄┄┈┈┄┈┈┈┄┄┄┈┈┄┄┄┈┄┄┈┄┄┄┄┄┄=''
┄┄┄┄┈┈┄┄┈┈┈┈┄┈┄┈┈┈┈┈┈┄┈┄┄┄┄┈┄┈┈┈ = Chr(13)+Chr(10)+Chr(9)+"()=+-*/@#<>.',%&[] !;"+'"'
nlinecnt = Getwordcount(┄┄┈┈┄┈┄┄┈┈┈┈┄┄┈┈┈┄┈┈┄┈┄┄┈┄┄┄┄┄┈┄,Chr(13)+Chr(10))
For nlineidx=1 To nlinecnt
┄┄┄┄┄┄┈┈┈┈┄┄┈┄┄┈┄┈┈┄┄┈┄┄┄┈┈┈┈┄┈┄ = Ltrim(Getwordnum(┄┄┈┈┄┈┄┄┈┈┈┈┄┄┈┈┈┄┈┈┄┈┄┄┈┄┄┄┄┄┈┄,nlineidx,Chr(13)+Chr(10)),0,Chr(9),' ')
If Empty(┄┄┄┄┄┄┈┈┈┈┄┄┈┄┄┈┄┈┈┄┄┈┄┄┄┈┈┈┈┄┈┄)
效果 4
Set Procedure To test\ob3
Function gcObfuscate
Lparameters ∵∵∴∴∴∴∵∵∴∵∴∴∵∴∵∵∴∴∴∵∵∵∵∴∴∵∴∵∴∵∴∴,∵∴∴∴∵∴∴∴∴∴∴∴∵∴∴∴∵∴∵∴∵∴∵∴∵∴∵∴∵∴∴∵
Local ∵∴∵∵∵∴∵∴∵∵∴∴∴∴∵∵∵∵∵∵∴∴∴∵∴∵∵∵∴∵∴∴,∵∵∵∴∵∴∴∴∴∵∵∴∴∴∴∴∵∴∴∴∴∵∵∵∵∴∴∵∴∵∴∵[1,2],∵∴∴∴∴∵∴∵∴∴∵∵∵∵∵∴∴∴∵∵∴∴∴∴∵∴∵∵∵∴∴∴,∵∴∴∵∴∴∴∴∵∴∴∴∵∵∵∵∵∵∵∴∵∵∵∵∴∵∴∴∵∴∴∴,∵∵∴∵∴∴∵∵∵∴∵∴∵∵∵∴∴∵∴∵∵∵∴∴∵∵∵∴∴∴∴∵,∵∴∵∴∴∴∴∵∵∴∴∵∴∵∴∵∴∴∵∴∵∵∴∵∴∴∵∴∵∵∵∴,∵∵∵∵∴∵∵∵∴∴∴∵∴∴∴∵∵∴∴∵∴∵∴∴∵∴∴∴∴∴∵∴,nlinecnt,∵∵∵∵∴∵∴∵∵∴∵∴∵∵∴∴∵∴∴∵∴∵∴∴∵∵∴∴∴∵∴∴,nlineidx,∵∵∴∵∴∵∴∴∵∵∴∵∵∵∴∴∴∵∴∴∴∴∴∴∵∴∵∵∵∵∴∴
Local ∵∵∴∵∵∵∴∴∵∵∴∴∴∵∵∵∵∴∵∵∴∵∵∴∵∵∴∴∵∴∵∴,∵∵∴∴∴∴∵∵∵∵∴∴∴∵∵∴∵∵∴∵∵∴∵∵∴∴∴∵∵∴∵∴,∵∴∵∵∵∵∴∵∴∵∴∵∵∴∵∴∵∴∵∴∴∴∵∵∴∴∴∵∴∵∵∴,∵∴∴∴∵∴∴∴∴∴∵∵∵∴∴∴∴∵∵∴∵∵∴∵∵∵∵∴∵∴∴∴,∵∵∴∵∵∵∴∴∵∴∴∵∴∴∵∴∵∴∵∴∴∴∵∴∴∴∵∵∴∵∵∴,∵∴∵∵∴∵∴∵∵∴∵∴∵∴∵∵∴∴∵∴∴∴∴∴∴∴∴∴∴∵∴∵,∵∴∴∵∵∵∵∴∴∵∴∴∵∴∵∵∴∴∵∴∵∴∵∴∴∵∴∵∵∴∵∴
Local ∵∵∵∵∵∵∵∵∵∴∴∴∴∴∵∴∵∵∵∵∵∴∴∵∵∵∴∵∵∴∵∴,∵∴∵∵∵∴∵∵∵∵∴∵∴∴∴∵∵∴∴∴∵∴∴∴∴∴∴∵∴∴∴∵, ∵∴∵∵∴∵∵∴∵∴∵∴∴∵∴∵∵∵∴∴∵∵∵∴∴∵∴∵∵∵∵∴,∵∵∴∴∴∵∵∴∴∴∵∵∴∵∵∵∴∴∵∵∵∵∵∴∴∵∵∴∵∴∴∵, ∵∵∴∴∵∵∴∴∴∴∵∵∴∵∴∵∴∵∴∵∴∵∵∴∴∵∴∴∵∵∵∴,∵∴∵∴∵∵∵∵∵∴∵∵∴∴∴∵∵∵∵∵∴∴∵∴∵∴∴∴∵∵∵∵
∵∴∴∴∵∴∴∴∴∴∴∴∵∴∴∴∵∴∵∴∵∴∵∴∵∴∵∴∵∴∴∵=Evl(∵∴∴∴∵∴∴∴∴∴∴∴∵∴∴∴∵∴∵∴∵∴∵∴∵∴∵∴∵∴∴∵,'o0')
∵∵∴∴∵∵∴∴∴∴∵∵∴∵∴∵∴∵∴∵∴∵∵∴∴∵∴∴∵∵∵∴=Substrc(∵∴∴∴∵∴∴∴∴∴∴∴∵∴∴∴∵∴∵∴∵∴∵∴∵∴∵∴∵∴∴∵,1,1)
∵∴∵∴∵∵∵∵∵∴∵∵∴∴∴∵∵∵∵∵∴∴∵∴∵∴∴∴∵∵∵∵=Substrc(∵∴∴∴∵∴∴∴∴∴∴∴∵∴∴∴∵∴∵∴∵∴∵∴∵∴∵∴∵∴∴∵,2,1)
Rand(-1)
∵∴∵∵∴∵∴∵∵∴∵∴∵∴∵∵∴∴∵∴∴∴∴∴∴∴∴∴∴∵∴∵=''
∵∴∵∵∵∴∵∴∵∵∴∴∴∴∵∵∵∵∵∵∴∴∴∵∴∵∵∵∴∵∴∴ = Chr(13)+Chr(10)+Chr(9)+"()=+-*/@#<>.',%&[] !;"+'"'
nlinecnt = Getwordcount(∵∵∴∴∴∴∵∵∴∵∴∴∵∴∵∵∴∴∴∵∵∵∵∴∴∵∴∵∴∵∴∴,Chr(13)+Chr(10))
For nlineidx=1 To nlinecnt
效果 5
Set Procedure To test\ob3
Function gcObfuscate
Lparameters ■□■■□■■■■□□□■□■■■■■□□■■□□■■■□□■■,■■□□□■■■■□□□□□■■□□□■■■■■□■□■□□□□
Local ■■□■■□■■□□□■□□■□■■■■■□■■■□□□■■□□,■■■□□■□□■■■□□□■■□□□□■□□□■■□■■□■□[1,2],■■■■□■□□■□□■■□■□□■■■■■■□□□□■□□■■,■□■□■□■□■■□□□■□■■■□■□■□■■□■□□□■■,■□■■□■□■■■□□□■■□□■■□■□■□□■□■■■■□,■□□■□□□■□□□■□■□□□□■□■■■■■■□□■■■□,■■■□□■■□□□□■□■□■■■■■□□□■□■■■■■■□,nlinecnt,■□■■□□■■■□■□■■■■■□■□■□■■■■■■□■□■,nlineidx,■□■■□□■□□□□■□■□□■■■■■■□□■□□■■■■■
Local ■□■■□■■■□■■■□□■■□□■□□□□□■□□■□■□■,■□□□□□■□□■■□■□■□□□■■■□■□■□■■□□□■,■■□■■□□■■■■■□□□□■■□■□■■□■■□□□□■■,■□■□■■■□■□■□■□□□□□□□■■□□■■□□□■■■,■□■■□■■□■■□□□□■□□□■□■□■□□■□■■■□■,■□□□■□■□□■■■■■□□□□■□□■□□□■□□□■□□,■□□■□□■■□■■□□□□■■□□□■■■■□□□■■■□■
Local ■□□□□□■□■■□■□■■□■■□□□■■■■■□□□□■□,■■□■■■□□□□□□■■□□□■□□■□□□■■□□■□□□, ■■□□■□■■□□■■■□■■□□□■□■□■■■■■□■■■,■□□■□□□□□■■■□■■■■■■□■□□■■□■□□□□■, ■□■■■□■■□□□□■□■□■■■□■■□■□□■□■■□□,■■■■□□■■■□□□■□■□□□■□□□□■■■□■□■□■
■■□□□■■■■□□□□□■■□□□■■■■■□■□■□□□□=Evl(■■□□□■■■■□□□□□■■□□□■■■■■□■□■□□□□,'o0')
■□■■■□■■□□□□■□■□■■■□■■□■□□■□■■□□=Substrc(■■□□□■■■■□□□□□■■□□□■■■■■□■□■□□□□,1,1)
■■■■□□■■■□□□■□■□□□■□□□□■■■□■□■□■=Substrc(■■□□□■■■■□□□□□■■□□□■■■■■□■□■□□□□,2,1)