Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
D
Data Recovery White
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wanglei
Data Recovery White
Commits
b46ca915
Commit
b46ca915
authored
Jan 08, 2025
by
guest
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修改空文件夹
parent
8fa04feb
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
5399 additions
and
16 deletions
+5399
-16
CleanJunkActivity.kt
...base/datarecovery/activity/junkclean/CleanJunkActivity.kt
+37
-16
test9.py
app/test9.py
+1555
-0
word_file.json
app/word_file.json
+3807
-0
No files found.
app/src/main/java/com/base/datarecovery/activity/junkclean/CleanJunkActivity.kt
View file @
b46ca915
...
@@ -17,7 +17,6 @@ import com.base.datarecovery.bean.ChildBean
...
@@ -17,7 +17,6 @@ import com.base.datarecovery.bean.ChildBean
import
com.base.datarecovery.bean.ConstObject.JUNK_CLEANER
import
com.base.datarecovery.bean.ConstObject.JUNK_CLEANER
import
com.base.datarecovery.databinding.ActivityLayoutCleanJunkBinding
import
com.base.datarecovery.databinding.ActivityLayoutCleanJunkBinding
import
com.base.datarecovery.help.BaseActivity
import
com.base.datarecovery.help.BaseActivity
import
com.base.datarecovery.help.FileHelp
import
com.base.datarecovery.help.KotlinExt.toFormatSize
import
com.base.datarecovery.help.KotlinExt.toFormatSize
import
com.base.datarecovery.help.PermissionHelp.checkStorePermission
import
com.base.datarecovery.help.PermissionHelp.checkStorePermission
import
com.base.datarecovery.help.PermissionHelp.requestStorePermission
import
com.base.datarecovery.help.PermissionHelp.requestStorePermission
...
@@ -193,24 +192,32 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() {
...
@@ -193,24 +192,32 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() {
val
list
=
arrayListOf
<
ChildBean
>()
val
list
=
arrayListOf
<
ChildBean
>()
async
{
async
{
val
emptyFolder1
=
FileHelp
.
getFileFolder
(
Environment
.
getExternalStoragePublicDirectory
(
Environment
.
DIRECTORY_DCIM
))
val
empty
=
findEmptyFolders
()
val
emptyFolder2
=
FileHelp
.
getFileFolder
(
Environment
.
getExternalStoragePublicDirectory
(
Environment
.
DIRECTORY_DOWNLOADS
))
empty
.
filter
{
it
.
listFiles
().
isNullOrEmpty
()
}.
forEach
{
l
->
val
emptyFolder3
=
FileHelp
.
getFileFolder
(
Environment
.
getExternalStoragePublicDirectory
(
Environment
.
DIRECTORY_DOCUMENTS
))
totalSize
+=
l
.
length
()
val
emptyFolder4
=
FileHelp
.
getFileFolder
(
Environment
.
getExternalStoragePublicDirectory
(
Environment
.
DIRECTORY_PICTURES
))
list
.
add
(
ChildBean
(
R
.
mipmap
.
kongwenjian
,
l
.
name
,
l
.
path
,
l
.
length
()))
val
emptyFolder5
=
FileHelp
.
getFileFolder
(
Environment
.
getExternalStoragePublicDirectory
(
Environment
.
DIRECTORY_MOVIES
))
val
emptyFolder6
=
FileHelp
.
getFileFolder
(
Environment
.
getExternalStoragePublicDirectory
(
Environment
.
DIRECTORY_MUSIC
))
val
emptyFolder
=
arrayListOf
<
File
>()
emptyFolder
.
addAll
(
emptyFolder1
)
emptyFolder
.
addAll
(
emptyFolder2
)
emptyFolder
.
addAll
(
emptyFolder3
)
emptyFolder
.
addAll
(
emptyFolder4
)
emptyFolder
.
addAll
(
emptyFolder5
)
emptyFolder
.
addAll
(
emptyFolder6
)
emptyFolder
.
filter
{
it
.
listFiles
().
isNullOrEmpty
()
}.
forEach
{
l
->
list
.
add
(
ChildBean
(
R
.
mipmap
.
kongwenjian
,
l
.
name
,
l
.
path
,
1
))
}
}
delay
(
Random
.
nextLong
(
1500
,
2000
))
delay
(
Random
.
nextLong
(
1500
,
2000
))
}.
await
()
}.
await
()
// async {
// val emptyFolder1 = FileHelp.getFileFolder(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM))
// val emptyFolder2 = FileHelp.getFileFolder(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS))
// val emptyFolder3 = FileHelp.getFileFolder(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS))
// val emptyFolder4 = FileHelp.getFileFolder(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES))
// val emptyFolder5 = FileHelp.getFileFolder(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES))
// val emptyFolder6 = FileHelp.getFileFolder(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC))
// val emptyFolder = arrayListOf<File>()
// emptyFolder.addAll(emptyFolder1)
// emptyFolder.addAll(emptyFolder2)
// emptyFolder.addAll(emptyFolder3)
// emptyFolder.addAll(emptyFolder4)
// emptyFolder.addAll(emptyFolder5)
// emptyFolder.addAll(emptyFolder6)
// emptyFolder.filter { it.listFiles().isNullOrEmpty() }.forEach { l ->
// list.add(ChildBean(R.mipmap.kongwenjian, l.name, l.path, 1))
// }
// delay(Random.nextLong(1500, 2000))
// }.await()
junkExpandAdapter
.
addChildData
(
0
,
list
)
junkExpandAdapter
.
addChildData
(
0
,
list
)
...
@@ -281,4 +288,18 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() {
...
@@ -281,4 +288,18 @@ class CleanJunkActivity : BaseActivity<ActivityLayoutCleanJunkBinding>() {
it
.
cancel
()
it
.
cancel
()
}
}
}
}
fun
findEmptyFolders
():
List
<
File
>
{
val
externalStorageDir
=
Environment
.
getExternalStorageDirectory
()
val
filters
=
arrayOf
(
"/storage/emulated/0/Android/data"
,
"/storage/emulated/0/Android/obb"
)
val
emptyFolders
=
getAllEmptyFolders
(
externalStorageDir
,
filters
)
return
emptyFolders
}
private
fun
getAllEmptyFolders
(
root
:
File
,
filters
:
Array
<
String
>):
List
<
File
>
{
return
root
.
walk
()
.
filter
{
it
.
isDirectory
&&
!
filters
.
contains
(
it
.
path
)
&&
!
it
.
isHidden
&&
it
.
list
()
?.
isEmpty
()
==
true
}
.
toList
()
}
}
}
\ No newline at end of file
app/test9.py
0 → 100644
View file @
b46ca915
import
json
import
os
import
random
import
re
import
shutil
from
base64
import
b64encode
,
b64decode
import
cv2
import
numpy
as
np
import
regex
as
re2
# from Cryptodome.Cipher import AES
# from Cryptodome.Random import get_random_bytes
# import chardet
import
string
import
random
def
detect_encoding
(
file_path
):
with
open
(
file_path
,
'rb'
)
as
f
:
raw_data
=
f
.
read
(
1024
)
result
=
chardet
.
detect
(
raw_data
)
return
result
[
'encoding'
]
def
get_classes_impl
(
result
,
class_type
,
path
=
'.'
):
print
(
"get_classes_impl start"
)
listdir
=
os
.
listdir
(
path
)
for
i
in
listdir
:
print
(
i
)
path_join
=
os
.
path
.
join
(
path
,
i
)
if
os
.
path
.
isdir
(
path_join
):
if
path
.
endswith
(
'.'
)
and
i
in
[
"build"
,
"debug"
,
"release"
]:
continue
if
path
.
endswith
(
'src'
)
and
i
in
[
"androidTest"
,
"test"
]:
continue
get_classes_impl
(
result
,
class_type
,
path_join
)
elif
os
.
path
.
isfile
(
path_join
):
if
os
.
path
.
splitext
(
i
)[
-
1
][
1
:]
in
class_type
:
result
.
append
(
path_join
)
print
(
result
)
print
(
"get_classes_impl over"
)
def
get_classes
(
class_type
=
None
):
print
(
"get_classes start"
)
if
class_type
is
None
:
class_type
=
[
"kt"
,
"java"
]
result
=
[]
get_classes_impl
(
result
,
class_type
)
print
(
result
)
print
(
"get_classes over"
)
return
result
def
find_text_impl
(
reg
,
result
,
skip_name
,
path
,
is_one
):
listdir
=
os
.
listdir
(
path
)
for
i
in
listdir
:
if
is_one
and
len
(
result
)
>
0
:
return
path_join
=
os
.
path
.
join
(
path
,
i
)
if
os
.
path
.
isdir
(
path_join
):
if
path
.
endswith
(
'.'
)
and
i
in
[
"build"
,
"debug"
,
"release"
]:
continue
if
path
.
endswith
(
'src'
)
and
i
in
[
"androidTest"
,
"test"
]:
continue
find_text_impl
(
reg
,
result
,
skip_name
,
path_join
,
is_one
)
elif
os
.
path
.
isfile
(
path_join
):
if
path
.
endswith
(
'.'
)
and
i
.
split
(
'.'
)[
-
1
]
in
[
'py'
]:
continue
is_skip
=
False
for
j
in
skip_name
:
if
j
in
i
:
is_skip
=
True
break
if
is_skip
:
continue
with
open
(
path_join
,
'r'
,
encoding
=
'utf-8'
)
as
f
:
if
not
f
.
readable
():
continue
try
:
text
=
f
.
read
()
except
ValueError
:
continue
findall
=
re
.
findall
(
reg
,
text
)
if
len
(
findall
)
>
0
:
result
.
extend
(
findall
)
def
find_text
(
reg
,
path
=
'.'
,
is_one
=
False
,
skip_name
=
None
):
if
skip_name
is
None
:
skip_name
=
[]
result
=
[]
if
os
.
path
.
isdir
(
path
):
find_text_impl
(
reg
,
result
,
skip_name
,
path
,
is_one
)
else
:
with
open
(
path
,
'r'
,
encoding
=
'utf-8'
)
as
f
:
if
f
.
readable
():
try
:
text
=
f
.
read
()
findall
=
re
.
findall
(
reg
,
text
)
if
len
(
findall
)
>
0
:
result
.
extend
(
findall
)
except
ValueError
:
pass
if
is_one
:
if
len
(
result
)
>
0
:
return
result
[
0
]
else
:
return
None
return
result
def
find_file_impl
(
reg
,
result
,
skip_name
,
path
=
'.'
):
listdir
=
os
.
listdir
(
path
)
for
i
in
listdir
:
if
len
(
result
)
>
0
:
return
path_join
=
os
.
path
.
join
(
path
,
i
)
if
os
.
path
.
isdir
(
path_join
):
if
path
.
endswith
(
'.'
)
and
i
in
[
"build"
,
"debug"
,
"release"
]:
continue
if
path
.
endswith
(
'src'
)
and
i
in
[
"androidTest"
,
"test"
]:
continue
find_file_impl
(
reg
,
result
,
skip_name
,
path_join
)
elif
os
.
path
.
isfile
(
path_join
):
if
path
.
endswith
(
'.'
)
and
i
not
in
[
"pro"
]:
continue
is_skip
=
False
for
j
in
skip_name
:
if
j
in
i
:
is_skip
=
True
break
if
is_skip
:
continue
with
open
(
path_join
,
'r'
,
encoding
=
'utf-8'
)
as
f
:
if
not
f
.
readable
():
continue
try
:
text
=
f
.
read
()
except
ValueError
:
continue
findall
=
re
.
findall
(
reg
,
text
)
if
len
(
findall
)
>
0
:
result
.
append
(
path_join
)
def
find_file
(
reg
,
path
=
'.'
,
skip_name
=
None
):
print
(
find_file
)
if
skip_name
is
None
:
skip_name
=
[]
result
=
[]
if
os
.
path
.
isdir
(
path
):
find_file_impl
(
reg
,
result
,
skip_name
,
path
)
else
:
with
open
(
path
,
'r'
,
encoding
=
'utf-8'
)
as
f
:
if
f
.
readable
():
try
:
text
=
f
.
read
()
findall
=
re
.
findall
(
reg
,
text
)
if
len
(
findall
)
>
0
:
result
.
append
(
path
)
except
ValueError
:
pass
return
result
[
0
]
if
len
(
result
)
>
0
else
""
def
get_class_path
(
path
):
with
open
(
path
,
'r'
)
as
f
:
text
=
f
.
read
()
package
=
re
.
search
(
'package (.*?)
\\
s'
,
text
)
.
group
(
1
)
name
=
os
.
path
.
basename
(
path
)
name
=
name
[:
name
.
rfind
(
'.'
)]
return
package
+
'.'
+
name
def
replace_map_text
(
mapping
,
path
=
'.'
):
listdir
=
os
.
listdir
(
path
)
for
i
in
listdir
:
path_join
=
os
.
path
.
join
(
path
,
i
)
if
os
.
path
.
isdir
(
path_join
):
if
path
.
endswith
(
'.'
)
and
i
in
[
"build"
,
"debug"
,
"release"
]:
continue
if
path
.
endswith
(
'src'
)
and
i
in
[
"androidTest"
,
"test"
]:
continue
replace_map_text
(
mapping
,
path_join
)
elif
os
.
path
.
isfile
(
path_join
):
if
path
.
endswith
(
'.'
)
and
os
.
path
.
splitext
(
i
)[
-
1
][
1
:]
not
in
[
"pro"
]:
continue
with
open
(
path_join
,
'r'
,
encoding
=
'utf-8'
)
as
f
:
if
not
f
.
readable
():
continue
try
:
text
=
f
.
read
()
except
ValueError
:
continue
with
open
(
path_join
,
'w'
,
encoding
=
'utf-8'
)
as
f
:
reverse
=
sorted
(
list
(
mapping
.
keys
()),
key
=
len
,
reverse
=
True
)
for
name
in
reverse
:
# text = text.replace(str(name), mapping[name])
text_result
=
re
.
sub
(
rf
'
\b
{name}
\b
'
,
mapping
[
name
],
text_result
)
f
.
write
(
text
)
# 修复某些字符无法匹配的问题,如android:OEM
def
sub_map_text
(
mapping
,
is_reverse
=
True
,
path
=
'.'
,
skip_type
=
None
,
skip_name
=
None
):
print
(
"sub_map_text start"
)
if
len
(
mapping
)
==
0
:
return
[]
if
skip_type
is
None
:
skip_type
=
[]
if
skip_name
is
None
:
skip_name
=
[]
skip_name
.
append
(
'databinding'
)
# 跳过 databinding
result
=
[]
sub_map_text_impl
(
mapping
,
result
,
skip_type
,
skip_name
,
is_reverse
,
path
)
print
(
result
)
print
(
"sub_map_text over"
)
return
result
# def sub_map_text_impl(mapping, result, skip_type, skip_name, is_reverse=True, path='.'):
# print("sub_map_text_impl start")
# listdir = os.listdir(path)
# for i in listdir:
# path_join = os.path.join(path, i)
# if os.path.isdir(path_join):
# if path.endswith('.') and i in ["build", "debug", "release"]:
# continue
# if path.endswith('src') and i in ["androidTest", "test"]:
# continue
# sub_map_text_impl(mapping, result, skip_type, skip_name, is_reverse, path_join)
# elif os.path.isfile(path_join):
# if path.endswith('.') and os.path.splitext(i)[-1][1:] not in ["pro"]:
# continue
# if os.path.splitext(i)[-1][1:] in skip_type:
# continue
# is_skip = False
# for j in skip_name:
# if j in i:
# print(j)
# is_skip = True
# break
# if is_skip:
# continue
# with open(path_join, 'r', encoding='utf-8') as f:
# if not f.readable():
# continue
# try:
# text = f.read()
# except ValueError:
# continue
# with open(path_join, 'w', encoding='utf-8') as f:
# reverse = sorted(list(mapping.keys()), key=len, reverse=is_reverse)
# text_result = text
# for name in reverse:
# text_result = re2.sub(str(name), mapping[name], text_result)
# print(text_result)
# if text_result != text:
# result.append(path_join)
# print(result)
# f.write(text_result)
# print("sub_map_text_impl over")
# 修复datbinding问题
def
sub_map_text_impl
(
mapping
,
result
,
skip_type
,
skip_name
,
is_reverse
=
True
,
path
=
'.'
):
print
(
"sub_map_text_impl start"
)
listdir
=
os
.
listdir
(
path
)
for
i
in
listdir
:
path_join
=
os
.
path
.
join
(
path
,
i
)
if
os
.
path
.
isdir
(
path_join
):
if
path
.
endswith
(
'.'
)
and
i
in
[
"build"
,
"debug"
,
"release"
]:
continue
if
path
.
endswith
(
'src'
)
and
i
in
[
"androidTest"
,
"test"
]:
continue
sub_map_text_impl
(
mapping
,
result
,
skip_type
,
skip_name
,
is_reverse
,
path_join
)
elif
os
.
path
.
isfile
(
path_join
):
if
path
.
endswith
(
'.'
)
and
os
.
path
.
splitext
(
i
)[
-
1
][
1
:]
not
in
[
"pro"
]:
continue
if
os
.
path
.
splitext
(
i
)[
-
1
][
1
:]
in
skip_type
:
continue
is_skip
=
False
for
j
in
skip_name
:
if
j
in
i
:
print
(
j
)
is_skip
=
True
break
if
is_skip
:
continue
# 开始读取文件内容
with
open
(
path_join
,
'r'
,
encoding
=
'utf-8'
)
as
f
:
if
not
f
.
readable
():
continue
try
:
text
=
f
.
read
()
except
ValueError
:
continue
# 替换逻辑
with
open
(
path_join
,
'w'
,
encoding
=
'utf-8'
)
as
f
:
reverse
=
sorted
(
list
(
mapping
.
keys
()),
key
=
len
,
reverse
=
is_reverse
)
text_result
=
text
# 遍历映射规则替换
for
name
in
reverse
:
text_result
=
re2
.
sub
(
str
(
name
),
mapping
[
name
],
text_result
)
# 方案 3:针对特定 import 的直接替换
text_result
=
re
.
sub
(
r'import varietyed\.scratched\.assemblyed\.(R|databinding\.\w+)'
,
r'import com.pots.qasdf.phonemanager.\1'
,
text_result
)
# 检查替换结果
if
text_result
!=
text
:
result
.
append
(
path_join
)
f
.
write
(
text_result
)
print
(
"sub_map_text_impl over"
)
def
replace_text
(
old
,
new
,
path
=
'.'
):
print
(
"replace_text"
)
listdir
=
os
.
listdir
(
path
)
for
i
in
listdir
:
path_join
=
os
.
path
.
join
(
path
,
i
)
if
os
.
path
.
isdir
(
path_join
):
if
path
.
endswith
(
'.'
)
and
i
in
[
"build"
,
"debug"
,
"release"
]:
continue
if
path
.
endswith
(
'src'
)
and
i
in
[
"androidTest"
,
"test"
]:
continue
replace_text
(
old
,
new
,
path_join
)
elif
os
.
path
.
isfile
(
path_join
):
if
path
.
endswith
(
'.'
)
and
os
.
path
.
splitext
(
i
)[
-
1
][
1
:]
not
in
[
"pro"
]:
continue
with
open
(
path_join
,
'r'
,
encoding
=
'utf-8'
)
as
f
:
if
not
f
.
readable
():
continue
try
:
text
=
f
.
read
()
except
ValueError
:
continue
with
open
(
path_join
,
'w'
,
encoding
=
'utf-8'
)
as
f
:
f
.
write
(
text
.
replace
(
old
,
new
))
print
(
text
)
def
get_random_package
():
packages
=
[
get_random_string
(
4
)
for
_
in
range
(
get_random_int
(
1
,
3
))]
return
'.'
.
join
(
packages
)
def
check_mapping
():
print
(
"check_mapping start"
)
try
:
loads
=
json
.
load
(
open
(
'mapping.json'
,
'r'
,
encoding
=
'utf-8'
))
except
(
ValueError
,
IOError
):
loads
=
{}
old_mapping
=
loads
.
get
(
'dir'
,
{})
packages
=
find_text
(
'package (.*?)[;]?
\\
s'
,
'src'
)
packages
.
append
(
applicationId
)
packages
=
sorted
(
set
(
packages
),
key
=
packages
.
index
)
packages
.
sort
(
key
=
len
)
print
(
packages
)
mapping
=
{}
for
i
in
packages
:
# 解决databingding包被混淆
if
'databinding'
in
i
:
# 跳过 databinding 包
mapping
[
i
]
=
i
continue
if
applicationId
not
in
i
:
continue
value
=
old_mapping
.
get
(
i
)
if
value
is
not
None
:
mapping
[
i
]
=
value
continue
mapping
[
i
]
=
get_random_package
()
value
=
mapping
.
get
(
i
[:
i
.
rfind
(
'.'
)])
if
value
is
not
None
:
mapping
[
i
]
=
value
+
'.'
+
mapping
[
i
]
loads
[
"dir"
]
=
mapping
json
.
dump
(
loads
,
open
(
'mapping.json'
,
'w'
,
encoding
=
'utf-8'
),
indent
=
4
)
print
(
json
)
print
(
"check_mapping over"
)
return
mapping
def
check_class_mapping
():
print
(
"check_class_mapping start"
)
try
:
loads
=
json
.
load
(
open
(
'mapping.json'
,
'r'
,
encoding
=
'utf-8'
))
print
(
loads
)
except
(
ValueError
,
IOError
):
loads
=
{}
old_mapping
=
loads
.
get
(
'class'
,
{})
mapping
=
{}
classes
=
get_classes
()
for
i
in
classes
:
if
'_D'
in
i
or
os
.
path
.
basename
(
i
)
==
"GlobalConfig.kt"
:
# 跳过 GlobalConfig.kt
continue
print
(
i
)
name
=
os
.
path
.
basename
(
i
)
name
=
name
[:
name
.
rfind
(
'.'
)]
value
=
old_mapping
.
get
(
name
)
print
(
value
)
if
value
is
not
None
:
mapping
[
name
]
=
value
continue
mapping
[
name
]
=
get_title
(
get_random_string
(
4
),
True
)
print
(
mapping
[
name
])
# method_variable_mapping = generate_method_variable_mapping(i) # 生成方法名和变量名的混淆映射
# for old, new in method_variable_mapping.items():
# mapping[old] = new # 添加方法名和变量名的混淆映射
loads
[
"class"
]
=
mapping
json
.
dump
(
loads
,
open
(
'mapping.json'
,
'w'
,
encoding
=
'utf-8'
),
indent
=
4
)
print
(
json
)
print
(
"check_class_mapping over"
)
return
mapping
# def generate_method_variable_mapping(class_file):
# # 生成方法名和变量名的混淆映射
# mapping = {}
#
# with open(class_file, 'r', encoding='utf-8') as f:
# text = f.read()
#
# methods = re.findall(
# r'\b(public|private|protected|static|final|abstract|synchronized)?\s*(<[^>]+>\s*)?(\w+)\s+(\w+)\s*\(',
# text
# )
# variables = re.findall(
# r'\b(public|private|protected|static|final|transient|volatile)?\s*(<[^>]+>\s*)?(\w+)\s+(\w+)\s*[;=]',
# text
# )
#
# for method in methods:
# old_name = method[3]
# new_name = get_random_string(6)
# mapping[old_name] = new_name
#
# for variable in variables:
# old_name = variable[3]
# new_name = get_random_string(6)
# mapping[old_name] = new_name
#
# return mapping
def
check_type_ids_mapping
(
ids_type
):
try
:
loads
=
json
.
load
(
open
(
'mapping.json'
,
'r'
,
encoding
=
'utf-8'
))
except
(
ValueError
,
IOError
):
loads
=
{}
old_mapping
=
loads
.
get
(
ids_type
+
"_ids"
,
{})
mapping
=
{}
type_ids
=
find_text
(
'<'
+
ids_type
+
' name="(.*?)".*?>'
,
get_path
(
'.
\\
src
\\
main
\\
res'
))
for
i
in
type_ids
:
if
i
.
endswith
(
'_D'
):
continue
value
=
old_mapping
.
get
(
i
)
if
value
is
not
None
:
mapping
[
i
]
=
value
continue
mapping
[
i
]
=
get_random_string
(
5
,
False
)
type_ids
=
find_text
(
'<item name="(.*?)".*? type="'
+
ids_type
+
'">'
,
get_path
(
'.
\\
src
\\
main
\\
res'
))
for
i
in
type_ids
:
value
=
old_mapping
.
get
(
i
)
if
value
is
not
None
:
mapping
[
i
]
=
value
continue
mapping
[
i
]
=
get_random_string
(
5
,
False
)
if
len
(
mapping
)
!=
0
:
loads
[
ids_type
+
"_ids"
]
=
mapping
json
.
dump
(
loads
,
open
(
'mapping.json'
,
'w'
,
encoding
=
'utf-8'
),
indent
=
4
)
return
mapping
def
check_styleable_mapping
():
try
:
loads
=
json
.
load
(
open
(
'mapping.json'
,
'r'
,
encoding
=
'utf-8'
))
except
(
ValueError
,
IOError
):
loads
=
{}
old_mapping
=
loads
.
get
(
"styleable"
,
{})
mapping
=
{}
styleables
=
find_text
(
'<declare-styleable name=".*?">[
\\
s
\\
S]*?</declare-styleable>'
)
for
i
in
styleables
:
styleable_id
=
re
.
findall
(
'<declare-styleable name="(.*?)">'
,
i
)[
0
]
mapping
[
styleable_id
]
=
old_mapping
.
get
(
styleable_id
,
get_random_string
(
5
,
False
))
# styleables_attr = re.findall('<attr name="(.*?)".*?/>', i)
styleables_attr
=
re
.
findall
(
'<attr name="(.*?)".*?>'
,
i
)
# 包括单行和多行定义
for
attr
in
styleables_attr
:
mapping
[
attr
+
'_A'
]
=
old_mapping
.
get
(
attr
+
'_A'
,
get_random_string
(
5
))
if
len
(
mapping
)
!=
0
:
loads
[
"styleable"
]
=
mapping
json
.
dump
(
loads
,
open
(
'mapping.json'
,
'w'
,
encoding
=
'utf-8'
),
indent
=
4
)
return
mapping
def
deal_ids_type
(
ids_type
):
type_ids_mapping
=
check_type_ids_mapping
(
ids_type
)
if
len
(
type_ids_mapping
)
==
0
:
return
print
(
type_ids_mapping
)
sub_map
=
{}
for
i
in
type_ids_mapping
:
sub_map
[
'<'
+
ids_type
+
' name="'
+
i
+
'"'
]
=
'<'
+
ids_type
+
' name="'
+
type_ids_mapping
[
i
]
+
'"'
sub_map
[
'<item name="'
+
i
+
'"(.*? type="'
+
ids_type
+
'")>'
]
=
\
'<item name="'
+
type_ids_mapping
[
i
]
+
'"
\\
g<1>>'
sub_map
[
'(?<=[^
\\
.])R
\\
.'
+
ids_type
+
'
\\
.'
+
i
+
'(?=
\\
W)'
]
=
'R.'
+
ids_type
+
'.'
+
type_ids_mapping
[
i
]
sub_map
[
'(?<=>|")@'
+
ids_type
+
'/'
+
i
+
'(?=<|")'
]
=
'@'
+
ids_type
+
'/'
+
type_ids_mapping
[
i
]
sub_map
[
'<'
+
ids_type
+
'(.*?) parent="'
+
i
+
'"(.*?)>'
]
=
\
'<'
+
ids_type
+
'
\\
g<1> parent="'
+
type_ids_mapping
[
i
]
+
'"
\\
g<2>>'
sub_map_text
(
sub_map
)
def
check_view_ids_mapping
():
try
:
loads
=
json
.
load
(
open
(
'mapping.json'
,
'r'
,
encoding
=
'utf-8'
))
except
(
ValueError
,
IOError
):
loads
=
{}
mapping
=
loads
.
get
(
'view_ids'
,
{})
view_ids
=
find_text
(
'"
\\
@
\\
+id/(.*?)"'
,
get_path
(
'.
\\
src
\\
main
\\
res'
))
for
i
in
view_ids
:
if
i
==
'root'
:
continue
key
=
get_title
(
i
)
if
mapping
.
get
(
key
)
is
not
None
:
continue
mapping
[
key
]
=
get_random_string
(
7
)
loads
[
"view_ids"
]
=
mapping
json
.
dump
(
loads
,
open
(
'mapping.json'
,
'w'
,
encoding
=
'utf-8'
),
indent
=
4
)
return
mapping
def
check_layout_mapping
():
try
:
loads
=
json
.
load
(
open
(
'mapping.json'
,
'r'
,
encoding
=
'utf-8'
))
except
(
ValueError
,
IOError
):
loads
=
{}
mapping
=
loads
.
get
(
'layout'
,
{})
layout_path
=
get_path
(
'.
\\
src
\\
main
\\
res
\\
layout'
)
listdir
=
os
.
listdir
(
layout_path
)
for
i
in
listdir
:
name
=
i
[:
i
.
rfind
(
'.'
)]
if
mapping
.
get
(
name
)
is
not
None
:
continue
mapping
[
name
]
=
get_random_string
(
6
)
loads
[
"layout"
]
=
mapping
json
.
dump
(
loads
,
open
(
'mapping.json'
,
'w'
,
encoding
=
'utf-8'
),
indent
=
4
)
return
mapping
def
check_res_mapping
(
res_type
):
try
:
loads
=
json
.
load
(
open
(
'mapping.json'
,
'r'
,
encoding
=
'utf-8'
))
except
(
ValueError
,
IOError
):
loads
=
{}
mapping
=
loads
.
get
(
res_type
,
{})
res_path
=
get_path
(
'.
\\
src
\\
main
\\
res'
)
listdir
=
os
.
listdir
(
res_path
)
for
i
in
listdir
:
if
not
i
.
startswith
(
res_type
):
continue
for
j
in
os
.
listdir
(
os
.
path
.
join
(
res_path
,
i
)):
if
j
.
startswith
(
'book_'
):
continue
if
j
.
endswith
(
'.9.png'
):
name
=
j
[:
-
len
(
'.9.png'
)]
else
:
name
=
j
.
rsplit
(
'.'
,
1
)[
0
]
if
mapping
.
get
(
name
)
is
not
None
:
continue
mapping
[
name
]
=
normalize_filename
(
get_random_string
(
8
))
if
len
(
mapping
)
!=
0
:
loads
[
res_type
]
=
mapping
json
.
dump
(
loads
,
open
(
'mapping.json'
,
'w'
,
encoding
=
'utf-8'
),
indent
=
4
)
return
mapping
used_words
=
set
()
def
get_random_string
(
length
=
8
,
is_ascii
=
True
):
global
used_words
# 使用全局变量 used_words
words
=
load_words_from_file
(
'word_file.json'
)
if
words
:
while
words
:
random_word
=
random
.
choice
(
words
)
if
random_word
not
in
used_words
:
used_words
.
add
(
random_word
)
if
is_ascii
and
all
(
ord
(
c
)
<
128
for
c
in
random_word
):
return
random_word
elif
not
is_ascii
:
return
random_word
return
None
def
load_words_from_file
(
file_path
):
try
:
with
open
(
file_path
,
'r'
,
encoding
=
'utf-8'
)
as
f
:
data
=
json
.
load
(
f
)
return
data
.
get
(
"word"
,
[])
# 返回单词列表
except
FileNotFoundError
:
print
(
f
"Error: Word file not found at: {file_path}"
)
return
[]
except
json
.
JSONDecodeError
:
print
(
f
"Error: Invalid JSON format in: {file_path}"
)
return
[]
def
get_random_int
(
a
=
0
,
b
=
10000
):
return
random
.
randint
(
a
,
b
)
def
get_dictionary_string
(
length
=
10
):
random_str
=
random
.
choice
(
string
.
ascii_letters
)
random_str
+=
''
.
join
(
random
.
choice
(
string
.
ascii_letters
+
string
.
digits
)
for
_
in
range
(
length
-
1
))
return
random_str
def
check_obfuscation_dictionary
():
if
not
os
.
path
.
exists
(
'dictionary.txt'
):
dictionary
=
set
()
while
len
(
dictionary
)
!=
5000
:
dictionary
.
add
(
get_dictionary_string
())
with
open
(
'dictionary.txt'
,
'w'
,
encoding
=
'utf-8'
)
as
f
:
f
.
write
(
'
\n
'
.
join
(
dictionary
))
with
open
(
'proguard-rules.pro'
,
'r'
,
encoding
=
'utf-8'
)
as
f
:
text
=
f
.
read
()
if
'-obfuscationdictionary'
in
text
:
return
text
+=
'
\n
-obfuscationdictionary dictionary.txt'
text
+=
'
\n
-classobfuscationdictionary dictionary.txt'
text
+=
'
\n
-packageobfuscationdictionary dictionary.txt'
with
open
(
'proguard-rules.pro'
,
'w'
,
encoding
=
'utf-8'
)
as
f
:
f
.
write
(
text
)
def
mkdir
(
dir_path
):
try
:
os
.
makedirs
(
dir_path
)
except
OSError
:
pass
def
replace_click_method
():
print
(
"replace_click_method start"
)
try
:
path
=
get_path
(
'.
\\
src
\\
main
\\
java'
)
file
=
find_file
(
'fun View.setTrackedOnClickListener'
,
path
)
if
file
:
class_path
=
get_class_path
(
file
)
+
'.setTrackedOnClickListener'
# java类不能直接使用扩展函数
sub_map_text
({
'([.@])setOnClickListener'
:
'
\\
g<1>setTrackedOnClickListener'
,
},
path
=
path
,
skip_type
=
[
'java'
])
add_import
(
class_path
,
get_classes
([
'kt'
]))
print
(
"replace_click_method over"
)
except
IndexError
:
return
def
replace_package_in_imports
(
root_path
,
old_package
,
new_package
):
# 匹配旧的 import 包名部分的正则表达式
patterns
=
[
(
re
.
compile
(
rf
'import {re.escape(old_package)}(
\
.databinding
\
.
\
w+)'
),
rf
'import {new_package}
\1
'
),
(
re
.
compile
(
rf
'import {re.escape(old_package)}
\
.R
\b
'
),
rf
'import {new_package}.R'
),
(
re
.
compile
(
rf
'import {re.escape(old_package)}
\
.BuildConfig'
),
rf
'import {new_package}.BuildConfig'
)
]
# 遍历目录中的所有文件
for
dirpath
,
_
,
filenames
in
os
.
walk
(
root_path
):
for
filename
in
filenames
:
# 只处理 .kt 和 .java 文件
if
filename
.
endswith
((
'.kt'
,
'.java'
)):
file_path
=
os
.
path
.
join
(
dirpath
,
filename
)
with
open
(
file_path
,
'r'
,
encoding
=
'utf-8'
)
as
file
:
content
=
file
.
read
()
# 替换匹配到的旧包名
updated_content
=
content
for
pattern
,
replacement
in
patterns
:
updated_content
=
pattern
.
sub
(
replacement
,
updated_content
)
# 如果内容发生了改变,写回文件
if
content
!=
updated_content
:
with
open
(
file_path
,
'w'
,
encoding
=
'utf-8'
)
as
file
:
file
.
write
(
updated_content
)
print
(
f
"已更新文件: {file_path}"
)
# def get_file_names_without_extension(root_path):
# # 遍历 root_path 下的所有 .kt 和 .java 文件
# all_files = []
# for dirpath, _, filenames in os.walk(root_path):
# for filename in filenames:
# if filename.endswith(('.kt', '.java')):
# all_files.append(os.path.join(dirpath, filename))
#
# return all_files
# def get_class_name(text, filename):
# """
# 获取文件中定义的类名(适用于 Java 和 Kotlin 文件)
# :param text: 文件内容
# :param filename: 文件名
# :return: 类名列表
# """
# if filename.endswith('.kt'):
# class_pattern = r'\bclass\s+(\w+)'
# elif filename.endswith('.java'):
# class_pattern = r'\bclass\s+(\w+)'
# else:
# return []
#
# # 获取类名
# return re.findall(class_pattern, text)
def
get_method_names
(
text
,
filename
):
"""
获取 Java 或 Kotlin 文件中的所有方法名
:param text: 文件内容
:param filename: 文件名
:return: 方法名列表
"""
if
filename
.
endswith
(
'.kt'
):
# Kotlin 方法名:匹配包括访问修饰符(private/public)和 fun 关键字,不排除 override
method_pattern
=
r'\b(?:private|protected|public|internal|inline|suspend|)?\s*fun\s+(\w+)\s*\((.*?)\)\s*(?::\s*([\w<>,\s?*]*))?\s*{'
elif
filename
.
endswith
(
'.java'
):
# Java 方法名:包括常见的修饰符和方法名
method_pattern
=
r'\b(?:public|private|protected|static|final|void|int|boolean|float|long|double|char|short|byte|void|[\w<>]+)\s+(\w+)\s*\(.*\)\s*\{'
else
:
return
[]
# 匹配所有方法名
return
re
.
findall
(
method_pattern
,
text
)
def
get_variable_names
(
text
,
filename
):
"""
获取 Java 或 Kotlin 文件中的所有变量名
:param text: 文件内容
:param filename: 文件名
:return: 变量名列表
"""
if
filename
.
endswith
(
'.kt'
):
# Kotlin 变量名:支持 `val` 和 `var` 关键字的变量声明
variable_pattern
=
r'\b(?:val|var)\s+(\w+)\s*(?=[;=])'
elif
filename
.
endswith
(
'.java'
):
# Java 变量名:包括常见的类型声明
variable_pattern
=
r'\b(?:int|boolean|float|long|double|char|short|byte|String|[\w<>]+)\s+(\w+)\s*(?=[;=])'
else
:
return
[]
# 匹配所有变量名
return
re
.
findall
(
variable_pattern
,
text
)
def
get_file_names_without_extension
(
root_path
):
"""
获取所有 `.kt` 和 `.java` 文件的路径(无扩展名)
:param root_path: 根目录路径
:return: 所有文件的路径列表
"""
all_files
=
[]
for
dirpath
,
_
,
filenames
in
os
.
walk
(
root_path
):
for
filename
in
filenames
:
if
filename
.
endswith
((
'.kt'
,
'.java'
)):
all_files
.
append
(
os
.
path
.
join
(
dirpath
,
filename
))
return
all_files
# 存储每个文件名的映射关系
file_to_class_map
=
{}
def
get_constant_names
(
text
,
filename
):
"""
获取 Java 或 Kotlin 文件中的所有常量名
:param text: 文件内容
:param filename: 文件名
:return: 常量名列表
"""
if
filename
.
endswith
(
'.kt'
):
# Kotlin 常量名:匹配以 `const val` 声明的常量
constant_pattern
=
r'const\s+val\s+(\w+)\s*=\s*.*'
elif
filename
.
endswith
(
'.java'
):
# Java 常量名:匹配以 `static final` 声明的常量
constant_pattern
=
r'public\s+static\s+final\s+\w+\s+(\w+)\s*=\s*.*'
else
:
return
[]
# 匹配所有常量名
return
re
.
findall
(
constant_pattern
,
text
)
def
obfuscate_code_in_files
(
all_files
):
"""
遍历所有文件,混淆其中的方法名、变量名和常量名,并返回混淆名称的映射。
:param all_files: 所有文件的路径列表。
:return: 一个字典,键为原始名称,值为混淆后的名称。
"""
name_mapping
=
{}
# 用于存储原始名称和混淆名称的映射
constant_mapping
=
{}
# 用于存储常量的映射
for
file_path
in
all_files
:
current_file_name
=
os
.
path
.
basename
(
file_path
)
.
split
(
'.'
)[
0
]
# 获取文件名
# 读取文件内容
with
open
(
file_path
,
'r'
,
encoding
=
'utf-8'
)
as
f
:
lines
=
f
.
readlines
()
# 获取文件中的常量名
constants
=
get_constant_names
(
""
.
join
(
lines
),
file_path
)
# 为常量名生成混淆名称
for
constant
in
constants
:
if
constant
not
in
name_mapping
:
name_mapping
[
constant
]
=
get_random_string
()
constant_mapping
[
constant
]
=
name_mapping
[
constant
]
# 获取类名(用于判断常量是否在类内引用)
new_lines
=
[]
for
line
in
lines
:
if
line
.
startswith
(
"import "
):
# 跳过 import 行
new_lines
.
append
(
line
)
else
:
# 替换常量名:进行统一的替换,不区分引用的类型
for
constant
,
obfuscated_name
in
constant_mapping
.
items
():
# 直接替换常量,无论是在类内还是外部引用
line
=
re
.
sub
(
r'\b'
+
re
.
escape
(
constant
)
+
r'\b'
,
obfuscated_name
,
line
)
# 替换方法名和变量名
for
original_name
,
obfuscated_name
in
name_mapping
.
items
():
line
=
re
.
sub
(
r'\b'
+
re
.
escape
(
original_name
)
+
r'\b'
,
obfuscated_name
,
line
)
new_lines
.
append
(
line
)
# 写回文件
with
open
(
file_path
,
'w'
,
encoding
=
'utf-8'
)
as
f
:
f
.
writelines
(
new_lines
)
return
constant_mapping
def
replace_with_mapped_names
(
all_files
,
name_mapping
,
constant_mapping
):
"""
在所有文件中替换已经混淆的名称,保证不同文件间共享混淆名称。
:param all_files: 所有文件的路径列表。
:param name_mapping: 名称映射字典。
:param constant_mapping: 常量名称映射字典。
"""
for
file_path
in
all_files
:
# 使用在 obfuscate_code_in_files 中存储的文件名
current_file_name
=
file_to_class_map
.
get
(
file_path
,
None
)
if
not
current_file_name
:
print
(
f
"未找到文件 {file_path} 的类名映射,跳过。"
)
continue
with
open
(
file_path
,
'r'
,
encoding
=
'utf-8'
)
as
f
:
lines
=
f
.
readlines
()
new_lines
=
[]
excluded_constants
=
set
()
# 第一步:提取 `const val` 定义的常量名并排除混淆
for
line
in
lines
:
match
=
re
.
match
(
r'^\s*const\s+val\s+(\w+)\s*=.*$'
,
line
)
if
match
:
constant_name
=
match
.
group
(
1
)
excluded_constants
.
add
(
constant_name
)
for
line
in
lines
:
if
line
.
startswith
(
"import "
):
# 跳过 import 行
new_lines
.
append
(
line
)
continue
# 跳过 context 或 activity 的调用
if
'context.'
in
line
or
'activity.'
in
line
:
new_lines
.
append
(
line
)
continue
# 替换变量和方法名
for
original_name
,
obfuscated_name
in
name_mapping
.
items
():
if
isinstance
(
original_name
,
tuple
):
original_name
=
''
.
join
(
original_name
)
# 如果是 `excluded_constants` 中的常量名,跳过替换
if
original_name
in
excluded_constants
:
continue
# 替换代码中的变量或方法名
line
=
re
.
sub
(
r'\b'
+
re
.
escape
(
original_name
)
+
r'\b'
,
obfuscated_name
,
line
)
new_lines
.
append
(
line
)
with
open
(
file_path
,
'w'
,
encoding
=
'utf-8'
)
as
f
:
f
.
writelines
(
new_lines
)
print
(
f
"文件 {file_path} 引用的名称已进行统一混淆处理。"
)
def
deal_code
():
print
(
"deal_code start"
)
# 替换点击事件
replace_click_method
()
# 生成包映射文件
mapping
=
check_mapping
()
packages
=
list
(
mapping
.
keys
())
print
(
"mapping: "
+
json
.
dumps
(
mapping
,
indent
=
4
))
# 移动文件
root_path
=
get_path
(
'.
\\
src
\\
main
\\
java'
)
for
key
in
packages
:
key
=
str
(
key
)
print
(
key
)
old_path
=
get_path
(
root_path
+
'
\\
'
+
key
.
replace
(
'.'
,
'
\\
'
))
new_path
=
get_path
(
root_path
+
'
\\
'
+
mapping
[
key
]
.
replace
(
'.'
,
'
\\
'
))
print
(
"mapping[key]"
+
mapping
[
key
])
if
not
os
.
path
.
exists
(
old_path
):
mkdir
(
old_path
)
if
not
os
.
path
.
exists
(
new_path
):
mkdir
(
new_path
)
listdir
=
os
.
listdir
(
old_path
)
for
i
in
listdir
:
path_join
=
os
.
path
.
join
(
old_path
,
i
)
if
os
.
path
.
isdir
(
path_join
):
continue
shutil
.
move
(
path_join
,
os
.
path
.
join
(
new_path
,
i
))
shutil
.
rmtree
(
get_path
(
root_path
+
'
\\
'
+
applicationId
[:
applicationId
.
find
(
'.'
)]))
# 修改manifest
with
open
(
get_path
(
'.
\\
src
\\
main
\\
AndroidManifest.xml'
),
'r'
,
encoding
=
'utf-8'
)
as
f
:
text
=
f
.
read
()
findall
=
re
.
findall
(
'android:name=(".*?")'
,
text
)
for
i
in
findall
:
if
i
.
startswith
(
'".'
):
text
=
text
.
replace
(
i
,
'"'
+
applicationId
+
i
[
1
:
-
1
]
+
'"'
)
print
(
text
)
print
(
applicationId
)
with
open
(
get_path
(
'.
\\
src
\\
main
\\
AndroidManifest.xml'
),
'w'
,
encoding
=
'utf-8'
)
as
f
:
f
.
write
(
text
)
# 修改依赖
sub_map
=
{}
for
i
in
mapping
:
sub_map
[
'(?<=
\\
W)'
+
i
+
'(?=
\\
W)'
]
=
mapping
[
i
]
print
(
sub_map
[
'(?<=
\\
W)'
+
i
+
'(?=
\\
W)'
])
print
(
mapping
[
i
])
# 过滤修改
sub_map
[
'(?<=
\\
W)'
+
mapping
[
applicationId
]
+
'.R(?=
\\
W)'
]
=
applicationId
+
'.R'
sub_map
[
'(?<=
\\
W)'
+
mapping
[
applicationId
]
+
'.databinding(?=
\\
W)'
]
=
applicationId
+
'.databinding'
sub_map
[
'(?<=
\\
W)'
+
mapping
[
applicationId
]
+
'.BuildConfig(?=
\\
W)'
]
=
applicationId
+
'.BuildConfig'
sub_map_text
(
sub_map
)
# 根包名下 R 单独处理
new_path
=
get_path
(
root_path
+
'
\\
'
+
mapping
[
packages
[
0
]]
.
replace
(
'.'
,
'
\\
'
))
listdir
=
os
.
listdir
(
new_path
)
result_path
=
[]
for
i
in
listdir
:
if
os
.
path
.
isdir
(
os
.
path
.
join
(
new_path
,
i
)):
continue
result_path
.
append
(
os
.
path
.
join
(
new_path
,
i
))
add_import
(
applicationId
+
'.R'
,
result_path
)
add_import
(
applicationId
+
'.BuildConfig'
,
result_path
)
# 类名
print
(
"类名 start"
)
class_mapping
=
check_class_mapping
()
classes
=
get_classes
()
print
(
class_mapping
)
for
i
in
classes
:
if
'_D'
in
i
or
os
.
path
.
basename
(
i
)
==
"GlobalConfig.kt"
:
# 跳过 GlobalConfig.kt
continue
name
=
os
.
path
.
basename
(
i
)
name
=
name
[:
name
.
rfind
(
'.'
)]
shutil
.
move
(
i
,
i
.
replace
(
name
,
class_mapping
[
name
]))
sub_map
=
{}
for
i
in
class_mapping
:
# 原规则匹配整个单词
# 添加负向环视以排除前后是引号的情况,解决匹配attrs的问题,
# 添加排除前缀 "styleable." 的逻辑
# 原规则匹配整个单词,添加排除前缀 "styleable." 的逻辑,并允许后面有引号的匹配
regex_pattern
=
r'(?<!")(?<!\bstyleable\.)\b'
+
i
+
r'\b'
# 保持原有规则的匹配,优先处理非引号的情况
sub_map
[
regex_pattern
]
=
class_mapping
[
i
]
print
(
class_mapping
[
i
])
sub_map_text
(
sub_map
)
print
(
"类名 over"
)
# 混淆字典
check_obfuscation_dictionary
()
print
(
root_path
)
print
(
mapping
[
applicationId
])
print
(
applicationId
)
# 获取混淆名称映射
# all_files = get_file_names_without_extension(root_path)
# name_mapping = obfuscate_code_in_files(all_files)
#
# # 获取常量映射
# constant_mapping = {} # 获取常量的映射
# for file_path in all_files:
# with open(file_path, 'r', encoding='utf-8') as f:
# lines = f.readlines()
# constants = get_constant_names("".join(lines), file_path)
# for constant in constants:
# if constant not in name_mapping:
# name_mapping[constant] = get_random_string()
# constant_mapping[constant] = name_mapping[constant]
#
# # 第一步:混淆代码,并获取所有混淆的名称映射
# name_mapping = obfuscate_code_in_files(all_files)
#
# # 第二步:替换其他文件中的引用,保证同样的混淆名
# replace_with_mapped_names(all_files, name_mapping, constant_mapping)
replace_package_in_imports
(
root_path
,
mapping
[
applicationId
],
applicationId
)
def
deal_res_type
(
res_type
):
type_mapping
=
check_res_mapping
(
res_type
)
if
len
(
type_mapping
)
==
0
:
return
print
(
type_mapping
)
res_path
=
get_path
(
'.
\\
src
\\
main
\\
res'
)
listdir
=
os
.
listdir
(
res_path
)
for
i
in
listdir
:
if
not
i
.
startswith
(
res_type
):
continue
path_join
=
os
.
path
.
join
(
res_path
,
i
)
for
j
in
os
.
listdir
(
path_join
):
if
j
.
startswith
(
'book_'
):
continue
if
j
.
endswith
(
'.9.png'
):
name
=
j
[:
-
len
(
'.9.png'
)]
else
:
name
=
j
.
rsplit
(
'.'
,
1
)[
0
]
path
=
os
.
path
.
join
(
path_join
,
j
)
if
'.DS_Store'
not
in
path
:
shutil
.
move
(
path
,
path
.
replace
(
name
,
type_mapping
[
name
]))
sub_map
=
{}
for
i
in
type_mapping
:
sub_map
[
'R
\\
.'
+
res_type
+
'
\\
.'
+
i
+
'(
\\
W)'
]
=
'R.'
+
res_type
+
'.'
+
type_mapping
[
i
]
+
'
\\
g<1>'
sub_map
[
'(>|")@'
+
res_type
+
'/'
+
i
+
'(<|")'
]
=
'
\\
g<1>@'
+
res_type
+
'/'
+
type_mapping
[
i
]
+
'
\\
g<2>'
sub_map_text
(
sub_map
)
# 解决mipmip命名中含有大写字母造成的报错
# 'E' is not a valid file-based resource name character: File-based resource names must contain only lowercase a-z, 0-9, or underscore
def
generate_random_letter
():
# 生成一个随机小写字母
return
random
.
choice
(
string
.
ascii_lowercase
)
def
normalize_filename
(
name
):
# 将名称转为小写
normalized_name
=
name
.
lower
()
# 替换所有非法字符为随机字母
normalized_name
=
re
.
sub
(
r'[^a-z]'
,
lambda
match
:
generate_random_letter
(),
normalized_name
)
# 确保名称以字母开头,如果不是,则以随机字母开头
if
not
normalized_name
[
0
]
.
isalpha
():
normalized_name
=
generate_random_letter
()
+
normalized_name
[
1
:]
return
normalized_name
def
add_image_noise
(
path
):
try
:
image
=
cv2
.
imread
(
path
,
cv2
.
IMREAD_UNCHANGED
)
if
path
.
endswith
(
'.9.png'
):
return
# # 添加随机噪声
# noise = np.random.randint(0, 2, image.shape, np.uint8)
# image = cv2.add(image, noise)
# 添加 ±10 的随机噪声
noise
=
np
.
random
.
randint
(
0
,
2
,
image
.
shape
,
np
.
int16
)
# 噪声范围 [-10, 10]
noisy_image
=
np
.
clip
(
image
.
astype
(
np
.
int16
)
+
noise
,
0
,
255
)
.
astype
(
np
.
uint8
)
# 防止溢出
#计算原始图像与添加噪声后图像的差异:如果差值的范围包含 10(噪声范围),说明噪声添加成功。
difference
=
np
.
abs
(
image
.
astype
(
np
.
int16
)
-
noisy_image
.
astype
(
np
.
int16
))
print
(
"Difference range:"
,
difference
.
min
(),
"-"
,
difference
.
max
())
new_path
=
path
.
rsplit
(
'.'
,
1
)[
0
]
+
'.webp'
cv2
.
imwrite
(
new_path
,
noisy_image
,
[
cv2
.
IMWRITE_WEBP_QUALITY
,
75
])
if
new_path
!=
path
:
os
.
remove
(
path
)
except
AttributeError
:
return
def
deal_image
():
res_path
=
get_path
(
'.
\\
src
\\
main
\\
res'
)
listdir
=
os
.
listdir
(
res_path
)
for
i
in
listdir
:
path_join
=
os
.
path
.
join
(
res_path
,
i
)
if
os
.
path
.
isdir
(
path_join
):
for
j
in
os
.
listdir
(
path_join
):
# add_image_noise(os.path.join(path_join, j))
if
j
.
endswith
((
'.png'
,
'.jpg'
,
'.jpeg'
,
'.bmp'
,
'.tiff'
,
'.webp'
)):
add_image_noise
(
os
.
path
.
join
(
path_join
,
j
))
def
get_title
(
string
,
is_all_upper
=
False
):
splits
=
string
.
split
(
'_'
)
print
(
splits
)
s
=
''
for
i
in
range
(
len
(
splits
)):
if
i
==
0
and
not
is_all_upper
:
s
=
splits
[
i
]
elif
len
(
splits
[
i
])
>
0
:
s
+=
splits
[
i
][
0
]
.
upper
()
+
splits
[
i
][
1
:]
return
s
def
add_import
(
path
,
listfile
):
for
i
in
listfile
:
if
'databinding'
in
path
:
# 跳过 databinding
continue
with
open
(
i
,
'r'
,
encoding
=
'utf-8'
)
as
f
:
text
=
f
.
read
()
if
len
(
re
.
findall
(
'import '
+
path
,
text
))
!=
0
:
continue
if
i
.
endswith
(
'kt'
):
text
=
re
.
sub
(
'(package
\\
S+?
\\
s+?)(?=
\\
S)'
,
'
\\
g<1>import '
+
path
+
'
\n
'
,
text
,
flags
=
re
.
S
)
print
(
text
)
elif
i
.
endswith
(
'java'
):
text
=
re
.
sub
(
'(package
\\
S+?
\\
s+?)(?=
\\
S)'
,
'
\\
g<1>import '
+
path
+
';
\n
'
,
text
,
flags
=
re
.
S
)
with
open
(
i
,
'w'
,
encoding
=
'utf-8'
)
as
f
:
f
.
write
(
text
)
def
check_class_string_mapping
():
try
:
loads
=
json
.
load
(
open
(
'mapping.json'
,
'r'
,
encoding
=
'utf-8'
))
except
(
ValueError
,
IOError
):
loads
=
{}
mapping
=
loads
.
get
(
'class_string'
,
{})
classes
=
get_classes
([
'kt'
])
for
path
in
classes
:
if
os
.
path
.
basename
(
path
)
.
startswith
(
'AESHelper'
):
continue
with
open
(
path
,
'r'
,
encoding
=
'utf-8'
)
as
f
:
text
=
f
.
read
()
text
=
re
.
sub
(
'@SuppressLint.*?
\n
'
,
'
\n
'
,
text
)
text
=
re
.
sub
(
'//[^"]*?(("[^"]*?){2})*?
\n
'
,
'
\n
'
,
text
)
text
=
re
.
sub
(
' +
\n
'
,
'
\n
'
,
text
)
text
=
re
.
sub
(
'=
\\
s+'
,
'= '
,
text
)
text
=
re
.
sub
(
':
\\
s+'
,
': '
,
text
)
text
=
re
.
sub
(
',
\\
s+'
,
', '
,
text
)
text
=
re
.
sub
(
'
\n
{2,}'
,
'
\n\n
'
,
text
)
result_text
=
text
strings
=
re
.
findall
(
'".*?[^
\\\\
]"'
,
re
.
sub
(
r'@[^)]*'
,
lambda
x
:
x
.
group
()
.
replace
(
'"'
,
"'"
),
result_text
))
last_string
=
''
for
string
in
strings
:
if
len
(
string
)
<=
4
or
string
.
isspace
()
or
\
string
[
1
:
-
1
]
in
[
'
\\\\
n'
,
'
\\\\
r'
,
'
\\\\\'
'
,
'
\\\\\\
"'
,
'
\\\\
?'
,
'&'
,
'UTF-8'
]:
continue
if
string
in
last_string
:
continue
start
=
text
.
find
(
string
)
if
start
==
-
1
:
continue
index
=
start
+
1
sign_stack
=
[
'"'
]
while
len
(
sign_stack
)
!=
0
:
if
text
[
index
]
==
'
\\
'
:
index
+=
1
elif
text
[
index
]
==
'"'
and
sign_stack
[
-
1
]
==
'"'
:
sign_stack
.
pop
()
elif
text
[
index
]
==
'"'
:
sign_stack
.
append
(
'"'
)
elif
text
[
index
]
==
'}'
and
sign_stack
[
-
1
]
==
'${'
:
sign_stack
.
pop
()
elif
text
[
index
-
1
:
index
+
1
]
==
'${'
:
sign_stack
.
append
(
'${'
)
index
+=
1
string
=
text
[
start
:
index
]
last_string
=
string
params
=
[]
result
=
string
if
'$'
in
string
:
count
=
0
last
=
-
1
res
=
[]
for
i
in
range
(
len
(
string
)):
if
last
==
-
1
and
string
[
i
]
==
'$'
:
if
count
==
0
:
last
=
i
elif
last
!=
-
1
:
if
string
[
i
]
==
'{'
:
count
+=
1
elif
string
[
i
]
==
'}'
:
count
-=
1
if
count
==
0
:
res
.
append
((
last
,
i
+
1
))
last
=
-
1
elif
count
==
0
:
last
=
-
1
for
i
in
re
.
findall
(
'
\\
$
\\
w*'
,
string
):
if
i
==
'$'
:
continue
find
=
string
.
find
(
i
)
res
.
append
((
find
,
find
+
len
(
i
)))
res
=
sorted
(
res
,
key
=
lambda
l
:
l
[
0
])
last_res
=
None
for
i
in
res
:
if
last_res
is
not
None
and
i
[
0
]
<
last_res
[
1
]:
continue
params
.
append
(
string
[
i
[
0
]:
i
[
1
]])
last_res
=
i
for
i
in
params
:
result
=
result
.
replace
(
i
,
"[str]"
)
result
=
result
[
1
:
-
1
]
.
replace
(
'
%
'
,
'
%%
'
)
.
replace
(
'
\\\\
'
,
'
\\
'
)
.
replace
(
'[str]'
,
'
%
s'
)
if
mapping
.
get
(
result
)
is
not
None
:
continue
mapping
[
result
]
=
get_random_string
(
5
,
False
)
+
'_D'
loads
[
'class_string'
]
=
mapping
json
.
dump
(
loads
,
open
(
'mapping.json'
,
'w'
,
encoding
=
'utf-8'
),
indent
=
4
)
return
mapping
def
deal_class_string
():
# 获取映射
string_mapping
=
check_class_string_mapping
()
print
(
string_mapping
)
with
open
(
get_path
(
'.
\\
src
\\
main
\\
res
\\
values
\\
strings.xml'
),
'r'
,
encoding
=
'utf-8'
)
as
f
:
text
=
f
.
read
()
rfind
=
text
.
rfind
(
'
\n
'
)
text_result
=
text
[:
rfind
]
for
i
in
string_mapping
:
string
=
i
string
=
string
.
replace
(
'&'
,
'&'
)
string
=
string
.
replace
(
'?'
,
'
\\
?'
)
string
=
string
.
replace
(
'
\'
'
,
'
\\\'
'
)
text_result
+=
'
\n
<string name="'
+
string_mapping
[
i
]
+
'" translatable="false">'
+
string
+
'</string>'
text_result
+=
text
[
rfind
:]
with
open
(
get_path
(
'.
\\
src
\\
main
\\
res
\\
values
\\
strings.xml'
),
'w'
,
encoding
=
'utf-8'
)
as
f
:
f
.
write
(
text_result
)
# 搜索 Int.string() 路径
file_path
=
find_file
(
'fun Int.string'
,
get_path
(
'.
\\
src
\\
main
\\
java'
))
class_path
=
get_class_path
(
file_path
)
+
'.string'
if
file_path
else
""
classes
=
get_classes
([
'kt'
])
for
path
in
classes
:
# 跳过 AESHelper 类中的字符串,避免嵌套
if
os
.
path
.
basename
(
path
)
.
startswith
(
'AESHelper'
):
continue
with
open
(
path
,
'r'
,
encoding
=
'utf-8'
)
as
f
:
text
=
f
.
read
()
text
=
re
.
sub
(
'@SuppressLint.*?
\n
'
,
'
\n
'
,
text
)
text
=
re
.
sub
(
'//[^"]*?(("[^"]*?){2})*?
\n
'
,
'
\n
'
,
text
)
text
=
re
.
sub
(
' +
\n
'
,
'
\n
'
,
text
)
text
=
re
.
sub
(
'=
\\
s+'
,
'= '
,
text
)
text
=
re
.
sub
(
':
\\
s+'
,
': '
,
text
)
text
=
re
.
sub
(
',
\\
s+'
,
', '
,
text
)
text
=
re
.
sub
(
'
\n
{2,}'
,
'
\n\n
'
,
text
)
result_text
=
text
strings
=
re
.
findall
(
'".*?[^
\\\\
]"'
,
re
.
sub
(
r'@[^)]*'
,
lambda
x
:
x
.
group
()
.
replace
(
'"'
,
"'"
),
result_text
))
last_string
=
''
for
string
in
strings
:
if
len
(
string
)
<=
4
or
string
.
isspace
()
or
\
string
[
1
:
-
1
]
in
[
'
\\\\
n'
,
'
\\\\
r'
,
'
\\\\\'
'
,
'
\\\\\\
"'
,
'
\\\\
?'
,
'&'
,
'UTF-8'
]:
continue
if
string
in
last_string
:
continue
start
=
text
.
find
(
string
)
if
start
==
-
1
:
continue
index
=
start
+
1
sign_stack
=
[
'"'
]
while
len
(
sign_stack
)
!=
0
:
if
text
[
index
]
==
'
\\
'
:
index
+=
1
elif
text
[
index
]
==
'"'
and
sign_stack
[
-
1
]
==
'"'
:
sign_stack
.
pop
()
elif
text
[
index
]
==
'"'
:
sign_stack
.
append
(
'"'
)
elif
text
[
index
]
==
'}'
and
sign_stack
[
-
1
]
==
'${'
:
sign_stack
.
pop
()
elif
text
[
index
-
1
:
index
+
1
]
==
'${'
:
sign_stack
.
append
(
'${'
)
index
+=
1
# 得到完整字符串
string
=
text
[
start
:
index
]
last_string
=
string
# 参数
params
=
[]
result
=
string
# 处理字符串拼接
if
'$'
in
string
:
count
=
0
last
=
-
1
res
=
[]
for
i
in
range
(
len
(
string
)):
if
last
==
-
1
and
string
[
i
]
==
'$'
:
if
count
==
0
:
last
=
i
elif
last
!=
-
1
:
if
string
[
i
]
==
'{'
:
count
+=
1
elif
string
[
i
]
==
'}'
:
count
-=
1
if
count
==
0
:
res
.
append
((
last
,
i
+
1
))
last
=
-
1
elif
count
==
0
:
last
=
-
1
for
i
in
re
.
findall
(
'
\\
$
\\
w*'
,
string
):
if
i
==
'$'
:
continue
find
=
string
.
find
(
i
)
res
.
append
((
find
,
find
+
len
(
i
)))
res
=
sorted
(
res
,
key
=
lambda
l
:
l
[
0
])
last_res
=
None
for
i
in
res
:
if
last_res
is
not
None
and
i
[
0
]
<
last_res
[
1
]:
continue
params
.
append
(
string
[
i
[
0
]:
i
[
1
]])
last_res
=
i
for
i
in
params
:
result
=
result
.
replace
(
i
,
"[str]"
)
for
i
in
range
(
len
(
params
)):
if
params
[
i
][
1
]
==
'{'
:
params
[
i
]
=
params
[
i
][
2
:
-
1
]
else
:
params
[
i
]
=
params
[
i
][
1
:]
# 每个参数加上 toString
params
[
i
]
=
'('
+
params
[
i
]
+
').toString()'
# 拼接部分替换为 %s
result
=
result
[
1
:
-
1
]
.
replace
(
'
%
'
,
'
%%
'
)
.
replace
(
'
\\\\
'
,
'
\\
'
)
.
replace
(
'[str]'
,
'
%
s'
)
# 添加 Int.string() 方法引用
if
class_path
:
if
len
(
re
.
findall
(
'import '
+
class_path
,
text
))
==
0
:
result_text
=
re
.
sub
(
'(package
\\
S+?
\\
s+?)(?=
\\
S)'
,
'
\\
g<1>import '
+
class_path
+
'
\n
'
,
result_text
,
flags
=
re
.
S
)
# 添加资源 R 引用
if
len
(
re
.
findall
(
'import '
+
applicationId
+
'.R'
,
text
))
==
0
:
result_text
=
re
.
sub
(
'(package
\\
S+?
\\
s+?)(?=
\\
S)'
,
'
\\
g<1>import '
+
applicationId
+
'.R'
+
'
\n
'
,
result_text
,
flags
=
re
.
S
)
# 去除 const
result_text
=
re
.
sub
(
'const (val.*?R
\\
.string
\\
.
\\
S+?
\\
.string
\\
(
\\
))'
,
'
\\
g<1>'
,
result_text
)
with
open
(
path
,
'w'
,
encoding
=
'utf-8'
)
as
f
:
f
.
write
(
result_text
)
def
check_xml_string_mapping
():
try
:
loads
=
json
.
load
(
open
(
'mapping.json'
,
'r'
,
encoding
=
'utf-8'
))
except
(
ValueError
,
IOError
):
loads
=
{}
old_mapping
=
loads
.
get
(
'xml_string'
,
{})
strings
=
find_text
(
'android:text="(?<!@string/)([^@"]+?)"'
,
get_path
(
'.
\\
src
\\
main
\\
res
\\
layout'
),
skip_name
=
[
'notify'
,
'notity'
])
mapping
=
{}
for
i
in
strings
:
value
=
old_mapping
.
get
(
i
)
if
value
is
not
None
:
mapping
[
i
]
=
value
continue
# 添加 '_D' 结尾,资源混淆时过滤不用再次改名
mapping
[
i
]
=
get_random_string
(
5
,
False
)
+
'_D'
loads
[
'xml_string'
]
=
mapping
json
.
dump
(
loads
,
open
(
'mapping.json'
,
'w'
,
encoding
=
'utf-8'
),
indent
=
4
)
return
mapping
def
deal_xml_string
():
# 获取映射
string_mapping
=
check_xml_string_mapping
()
print
(
string_mapping
)
with
open
(
get_path
(
'.
\\
src
\\
main
\\
res
\\
values
\\
strings.xml'
),
'r'
,
encoding
=
'utf-8'
)
as
f
:
text
=
f
.
read
()
rfind
=
text
.
rfind
(
'
\n
'
)
text_result
=
text
[:
rfind
]
for
i
in
string_mapping
:
string
=
i
string
=
string
.
replace
(
'&'
,
'&'
)
string
=
string
.
replace
(
'?'
,
'
\\
?'
)
string
=
string
.
replace
(
'
\'
'
,
'
\\\'
'
)
text_result
+=
'
\n
<string name="'
+
string_mapping
[
i
]
+
'" translatable="false">'
+
string
+
'</string>'
text_result
+=
text
[
rfind
:]
with
open
(
get_path
(
'.
\\
src
\\
main
\\
res
\\
values
\\
strings.xml'
),
'w'
,
encoding
=
'utf-8'
)
as
f
:
f
.
write
(
text_result
)
sub_map
=
{}
for
i
in
string_mapping
:
sub_map
[
'(?<=android:text=")'
+
re
.
escape
(
i
)
+
'(?=")'
]
=
'@string/'
+
re
.
escape
(
string_mapping
[
i
])
# 替换时跳过通知布局
sub_map_text
(
sub_map
,
path
=
get_path
(
'.
\\
src
\\
main
\\
res
\\
layout'
),
skip_name
=
[
'notify'
,
'notity'
])
def
deal_code_string
():
# 处理布局文件中的明文字符串
deal_xml_string
()
# 处理代码文件中的明文字符串
deal_class_string
()
def
deal_res
():
# 改 string id
deal_ids_type
(
'string'
)
# 改 color id
deal_ids_type
(
'color'
)
# 改 dimen id
deal_ids_type
(
'dimen'
)
# 改 style id
deal_ids_type
(
'style'
)
# 改 declare-styleable
styleable_mapping
=
check_styleable_mapping
()
print
(
styleable_mapping
)
sub_map
=
{}
styleables
=
find_text
(
'<declare-styleable name=".*?">[
\\
s
\\
S]*?</declare-styleable>'
)
for
i
in
styleables
:
result
=
i
styleable_id
=
re
.
findall
(
'<declare-styleable name="(.*?)">'
,
i
)[
0
]
result
=
result
.
replace
(
'<declare-styleable name="'
+
styleable_id
+
'">'
,
'<declare-styleable name="'
+
styleable_mapping
[
styleable_id
]
+
'">'
)
sub_map
[
'R
\\
.styleable
\\
.'
+
styleable_id
+
'(
\\
W)'
]
=
\
'R.styleable.'
+
styleable_mapping
[
styleable_id
]
+
'
\\
g<1>'
# styleables_attr = re.findall('<attr name="(.*?)".*?/>', i)
styleables_attr
=
re
.
findall
(
'<attr name="(.*?)".*?>'
,
i
)
# 包括单行和多行定义
for
attr
in
styleables_attr
:
result
=
result
.
replace
(
'<attr name="'
+
attr
+
'"'
,
'<attr name="'
+
styleable_mapping
[
attr
+
'_A'
]
+
'"'
)
sub_map
[
'R
\\
.styleable
\\
.'
+
styleable_id
+
'_'
+
attr
+
'(
\\
W)'
]
=
\
'R.styleable.'
+
styleable_mapping
[
styleable_id
]
+
'_'
+
styleable_mapping
[
attr
+
'_A'
]
+
'
\\
g<1>'
sub_map
[
'app:'
+
attr
+
'='
]
=
'app:'
+
styleable_mapping
[
attr
+
'_A'
]
+
'='
sub_map
[
'
\\
?attr/'
+
attr
]
=
'?attr/'
+
styleable_mapping
[
attr
+
'_A'
]
# 新增的替换规则
sub_map
[
'<item name=
\"
'
+
attr
+
'
\"
'
]
=
'<item name=
\"
'
+
styleable_mapping
[
attr
+
'_A'
]
+
'
\"
'
# 新增的替换规则
sub_map
[
re
.
escape
(
i
)]
=
result
sub_map_text
(
sub_map
)
# 改 view id
view_ids
=
find_text
(
'"
\\
@
\\
+id/(.*?)"'
,
get_path
(
'.
\\
src
\\
main
\\
res'
))
view_ids_mapping
=
check_view_ids_mapping
()
print
(
view_ids_mapping
)
sub_map
=
{}
for
i
in
view_ids
:
if
i
==
'root'
:
continue
key
=
get_title
(
i
)
sub_map
[
'(>|")@(
\\
+)?id/'
+
i
+
'(<|")'
]
=
'
\\
g<1>@
\\
g<2>id/'
+
view_ids_mapping
[
key
]
+
'
\\
g<3>'
sub_map
[
'R
\\
.id
\\
.'
+
i
+
'(
\\
W)'
]
=
'R.id.'
+
view_ids_mapping
[
key
]
+
'
\\
g<1>'
sub_map
[
'([bB]inding
\\
??(?:
\\
.
\\
w+)?
\\
??)
\\
.'
+
key
+
'(
\\
W)'
]
=
'
\\
g<1>.'
+
view_ids_mapping
[
key
]
+
'
\\
g<2>'
sub_map
[
'([bB]inding
\\
??(?:
\\
.
\\
w+)?
\\
??)
\\
.'
+
key
+
'
\\
.'
+
key
+
'(
\\
W)'
]
=
'
\\
g<1>.'
+
view_ids_mapping
[
key
]
+
'.'
+
view_ids_mapping
[
key
]
+
'
\\
g<2>'
sub_map
[
r'\(binding as (\w+Binding)\)\.'
+
key
+
r'(\W)'
]
=
r'(binding as \1).'
+
view_ids_mapping
[
key
]
+
r'\2'
sub_map
[
'(?<=app:constraint_referenced_ids=".*?)'
+
i
+
'(?=.*?")'
]
=
view_ids_mapping
[
key
]
sub_map_text
(
sub_map
)
# 改 layout 文件名
layout_mapping
=
check_layout_mapping
()
print
(
layout_mapping
)
layout_path
=
get_path
(
'.
\\
src
\\
main
\\
res
\\
layout'
)
listdir
=
os
.
listdir
(
layout_path
)
for
i
in
listdir
:
name
=
i
[:
i
.
rfind
(
'.'
)]
if
layout_mapping
.
get
(
name
)
is
None
:
continue
path_join
=
os
.
path
.
join
(
layout_path
,
i
)
#解决layout出现大写的问题
shutil
.
move
(
path_join
,
path_join
.
replace
(
name
,
normalize_filename
(
layout_mapping
[
name
])))
sub_map
=
{}
for
i
in
layout_mapping
:
sub_map
[
'R
\\
.layout
\\
.'
+
i
+
'(
\\
W)'
]
=
'R.layout.'
+
layout_mapping
[
i
]
+
'
\\
g<1>'
# ViewBinding 同步修改
sub_map
[
get_title
(
i
,
True
)
+
'Binding'
]
=
get_title
(
layout_mapping
[
i
],
True
)
+
'Binding'
sub_map
[
'(>|")@layout/'
+
i
+
'(<|")'
]
=
'
\\
g<1>@layout/'
+
layout_mapping
[
i
]
+
'
\\
g<2>'
sub_map_text
(
sub_map
)
# 改 drawable 文件名
deal_res_type
(
'drawable'
)
# 改 mipmap 文件名
deal_res_type
(
'mipmap'
)
# 改 raw 文件名
deal_res_type
(
'raw'
)
# 改 raw 文件名
deal_res_type
(
'xml'
)
# 改图片内容
deal_image
()
def
get_path
(
path
):
paths
=
path
.
split
(
'
\\
'
)
return
str
(
os
.
path
.
join
(
*
paths
))
def
main
():
if
not
os
.
path
.
exists
(
get_path
(
'.
\\
src
\\
main
\\
java
\\
'
+
applicationId
[:
applicationId
.
find
(
'.'
)])):
print
(
get_path
(
'.
\\
src
\\
main
\\
java
\\
'
+
applicationId
[:
applicationId
.
find
(
'.'
)]))
return
# 资源混淆
deal_res
()
deal_code
()
if
__name__
==
'__main__'
:
if
os
.
path
.
exists
(
'build.gradle'
):
gradle_path
=
'build.gradle'
elif
os
.
path
.
exists
(
'build.gradle.kts'
):
gradle_path
=
'build.gradle.kts'
else
:
exit
(
'找不到 build.gradle 文件'
)
#获取build.gradle.kts里的namespace,以此确定混淆目录和包名
applicationId
=
re
.
search
(
'namespace .*?["
\'
](.*?)["
\'
]'
,
open
(
gradle_path
,
'r'
,
encoding
=
'utf-8'
)
.
read
())[
1
]
print
(
applicationId
)
main
()
app/word_file.json
0 → 100644
View file @
b46ca915
{
"word"
:
[
"zeroedto"
,
"midnightedto"
,
"yardedto"
,
"volumeedto"
,
"boatedto"
,
"bellyedto"
,
"demandedto"
,
"intelligenceedto"
,
"literacyedto"
,
"voiceedto"
,
"miserableedto"
,
"freeedto"
,
"growthedto"
,
"residenceedto"
,
"apathyedto"
,
"majorityedto"
,
"fastedto"
,
"outlineedto"
,
"degreeedto"
,
"emphasisedto"
,
"positiveedto"
,
"achieveedto"
,
"achievementedto"
,
"agreementedto"
,
"historyedto"
,
"accountedto"
,
"recognizeedto"
,
"accumulationedto"
,
"experienceedto"
,
"chargeedto"
,
"staredto"
,
"hurtedto"
,
"blackedto"
,
"admitedto"
,
"concedeedto"
,
"admissionedto"
,
"thanksedto"
,
"receiptedto"
,
"friendedto"
,
"getedto"
,
"bitteredto"
,
"delayedto"
,
"stimulationedto"
,
"exchangeedto"
,
"dealedto"
,
"favouredto"
,
"performanceedto"
,
"productionedto"
,
"jestedto"
,
"playedto"
,
"activityedto"
,
"soloedto"
,
"playeredto"
,
"castedto"
,
"realedto"
,
"advertisingedto"
,
"versionedto"
,
"dependenceedto"
,
"additionedto"
,
"speechedto"
,
"facilityedto"
,
"stickedto"
,
"formaledto"
,
"orthodoxedto"
,
"glueedto"
,
"plasteredto"
,
"tapeedto"
,
"poisonedto"
,
"counciledto"
,
"divisionedto"
,
"executiveedto"
,
"confessionedto"
,
"includeedto"
,
"warningedto"
,
"teenageredto"
,
"acceptanceedto"
,
"womanedto"
,
"manedto"
,
"noticeedto"
,
"progressedto"
,
"leadedto"
,
"opponentedto"
,
"hardshipedto"
,
"adviseredto"
,
"revolutionaryedto"
,
"functionedto"
,
"affairedto"
,
"attachmentedto"
,
"associationedto"
,
"statementedto"
,
"openedto"
,
"tissueedto"
,
"collectionedto"
,
"hostilityedto"
,
"fanedto"
,
"shakeedto"
,
"excitementedto"
,
"consensusedto"
,
"peasantedto"
,
"helpedto"
,
"supportedto"
,
"objectedto"
,
"windedto"
,
"broadcastedto"
,
"cabinedto"
,
"pilotedto"
,
"wingedto"
,
"planeedto"
,
"alarmedto"
,
"beeredto"
,
"alcoholedto"
,
"consciousnessedto"
,
"excuseedto"
,
"extraterrestrialedto"
,
"foreigneredto"
,
"similaredto"
,
"commitmentedto"
,
"bondedto"
,
"comprehensiveedto"
,
"allocationedto"
,
"compromiseedto"
,
"lonelyedto"
,
"distanceedto"
,
"directoryedto"
,
"indexedto"
,
"changeedto"
,
"heightedto"
,
"aluminiumedto"
,
"graduateedto"
,
"romanticedto"
,
"atmosphereedto"
,
"dreamedto"
,
"ambitionedto"
,
"shelledto"
,
"pardonedto"
,
"quantityedto"
,
"figureedto"
,
"supplyedto"
,
"speededto"
,
"entertainmentedto"
,
"gameedto"
,
"funnyedto"
,
"paralleledto"
,
"ancestoredto"
,
"foxedto"
,
"animaledto"
,
"ankleedto"
,
"birthdayedto"
,
"noteedto"
,
"programedto"
,
"botheredto"
,
"responseedto"
,
"expectedto"
,
"expectationedto"
,
"restlessedto"
,
"anxietyedto"
,
"shareedto"
,
"factoredto"
,
"flatedto"
,
"strokeedto"
,
"clothesedto"
,
"attractedto"
,
"sympatheticedto"
,
"appealedto"
,
"seemedto"
,
"debutedto"
,
"lookedto"
,
"textureedto"
,
"convenienceedto"
,
"engineeredto"
,
"rubedto"
,
"paintedto"
,
"generaledto"
,
"dateedto"
,
"assessmentedto"
,
"estimateedto"
,
"arrestedto"
,
"permissionedto"
,
"spideredto"
,
"randomedto"
,
"walledto"
,
"archiveedto"
,
"archedto"
,
"fireedto"
,
"roomedto"
,
"argumentedto"
,
"lineedto"
,
"desertedto"
,
"riseedto"
,
"weaponedto"
,
"sleeveedto"
,
"tankedto"
,
"smelledto"
,
"garlicedto"
,
"teaseedto"
,
"moveedto"
,
"provokeedto"
,
"movingedto"
,
"packedto"
,
"rowedto"
,
"timetableedto"
,
"bowedto"
,
"galleryedto"
,
"reservoiredto"
,
"craftsmanedto"
,
"painteredto"
,
"artedto"
,
"silveredto"
,
"begedto"
,
"inviteedto"
,
"viewedto"
,
"attackedto"
,
"batteryedto"
,
"assemblyedto"
,
"claimedto"
,
"selectionedto"
,
"astonishingedto"
,
"faredto"
,
"forwardedto"
,
"runneredto"
,
"sportedto"
,
"frontedto"
,
"nuclearedto"
,
"tinedto"
,
"monstrousedto"
,
"strikeedto"
,
"effortedto"
,
"serveedto"
,
"careedto"
,
"costumeedto"
,
"cultureedto"
,
"lawyeredto"
,
"drawedto"
,
"cuteedto"
,
"attractionedto"
,
"propertyedto"
,
"goldedto"
,
"auctionedto"
,
"soundedto"
,
"signedto"
,
"auntedto"
,
"writeredto"
,
"commandedto"
,
"regulationedto"
,
"governmentedto"
,
"caredto"
,
"busedto"
,
"robotedto"
,
"transmissionedto"
,
"motoristedto"
,
"falledto"
,
"supplementaryedto"
,
"commonedto"
,
"consciousedto"
,
"axisedto"
,
"babyedto"
,
"carriageedto"
,
"nurseryedto"
,
"heeledto"
,
"withdrawaledto"
,
"suitcaseedto"
,
"sphereedto"
,
"voteedto"
,
"trivialedto"
,
"patchedto"
,
"bandedto"
,
"slamedto"
,
"depositedto"
,
"failureedto"
,
"feastedto"
,
"banishedto"
,
"tycoonedto"
,
"drumedto"
,
"fenceedto"
,
"baredto"
,
"tradeedto"
,
"basisedto"
,
"baseballedto"
,
"wrongedto"
,
"rationaledto"
,
"democraticedto"
,
"cellaredto"
,
"essentialedto"
,
"infrastructureedto"
,
"introductionedto"
,
"celledto"
,
"principleedto"
,
"foundationedto"
,
"clubedto"
,
"bathtubedto"
,
"bathroomedto"
,
"washedto"
,
"battlefieldedto"
,
"resistedto"
,
"representedto"
,
"opposeedto"
,
"suitedto"
,
"knowedto"
,
"trailedto"
,
"rideedto"
,
"dependedto"
,
"dareedto"
,
"differedto"
,
"matchedto"
,
"likeedto"
,
"dominateedto"
,
"loveedto"
,
"oweedto"
,
"mindedto"
,
"runedto"
,
"belongedto"
,
"beatedto"
,
"hostedto"
,
"winedto"
,
"lackedto"
,
"worryedto"
,
"dropedto"
,
"billedto"
,
"kidneyedto"
,
"carryedto"
,
"testifyedto"
,
"holdedto"
,
"standedto"
,
"postureedto"
,
"presenceedto"
,
"rhythmedto"
,
"scrambleedto"
,
"graceedto"
,
"salonedto"
,
"waveedto"
,
"increaseedto"
,
"conceiveedto"
,
"deteriorateedto"
,
"sheetedto"
,
"friendlyedto"
,
"startedto"
,
"sourceedto"
,
"captivateedto"
,
"lowedto"
,
"absentedto"
,
"presentedto"
,
"criticaledto"
,
"opposededto"
,
"hotedto"
,
"outeredto"
,
"salvationedto"
,
"lateedto"
,
"swallowedto"
,
"thinkedto"
,
"roaredto"
,
"nobleedto"
,
"leftedto"
,
"badedto"
,
"flexedto"
,
"turnedto"
,
"curveedto"
,
"flexibleedto"
,
"goodedto"
,
"advantageedto"
,
"hookedto"
,
"leaveedto"
,
"mourningedto"
,
"shoulderedto"
,
"siegeedto"
,
"engagementedto"
,
"improveedto"
,
"coffeeedto"
,
"wineedto"
,
"drinkedto"
,
"prejudiceedto"
,
"bikeedto"
,
"offeredto"
,
"largeedto"
,
"contractedto"
,
"duckedto"
,
"turkeyedto"
,
"calledto"
,
"deliveryedto"
,
"pilledto"
,
"morseledto"
,
"chipedto"
,
"snackedto"
,
"stingedto"
,
"burnedto"
,
"swordedto"
,
"spaceedto"
,
"coveredto"
,
"blastedto"
,
"combineedto"
,
"approvaledto"
,
"pestedto"
,
"flashedto"
,
"obstacleedto"
,
"brickedto"
,
"forgetedto"
,
"slabedto"
,
"veinedto"
,
"mosquitoedto"
,
"inflateedto"
,
"punchedto"
,
"depressededto"
,
"blueedto"
,
"flushedto"
,
"heartedto"
,
"muscleedto"
,
"scaleedto"
,
"massedto"
,
"constituencyedto"
,
"lakeedto"
,
"appendixedto"
,
"fleshedto"
,
"guardedto"
,
"kettleedto"
,
"steamedto"
,
"cheekedto"
,
"bombedto"
,
"sandwichedto"
,
"ribedto"
,
"toothedto"
,
"dividendedto"
,
"hornedto"
,
"albumedto"
,
"notebookedto"
,
"prosperedto"
,
"stalledto"
,
"lootedto"
,
"dulledto"
,
"adoptedto"
,
"breastedto"
,
"capedto"
,
"baseedto"
,
"avenueedto"
,
"endedto"
,
"borderedto"
,
"rewardedto"
,
"cowedto"
,
"stadiumedto"
,
"ringedto"
,
"electronicsedto"
,
"courageedto"
,
"toastedto"
,
"breadedto"
,
"widthedto"
,
"shatteredto"
,
"smashedto"
,
"cerealedto"
,
"discoveryedto"
,
"hiccupedto"
,
"restedto"
,
"corruptionedto"
,
"workshopedto"
,
"bulletinedto"
,
"summaryedto"
,
"glimpseedto"
,
"lightedto"
,
"brillianceedto"
,
"lipedto"
,
"prosecuteedto"
,
"bringedto"
,
"generateedto"
,
"introduceedto"
,
"createedto"
,
"organizeedto"
,
"publishedto"
,
"discloseedto"
,
"updateedto"
,
"takeedto"
,
"glassedto"
,
"spectrumedto"
,
"receptionedto"
,
"leafletedto"
,
"fragmentedto"
,
"brotheredto"
,
"eyebrowedto"
,
"reviewedto"
,
"crueledto"
,
"champagneedto"
,
"garageedto"
,
"centeredto"
,
"architectureedto"
,
"displaceedto"
,
"rolledto"
,
"clusteredto"
,
"nerveedto"
,
"cottageedto"
,
"nonsenseedto"
,
"loadedto"
,
"rabbitedto"
,
"popedto"
,
"splitedto"
,
"operationedto"
,
"officeedto"
,
"counteredto"
,
"agencyedto"
,
"burstedto"
,
"fussedto"
,
"buttocksedto"
,
"cigaretteedto"
,
"trafficedto"
,
"carbonedto"
,
"taxiedto"
,
"conspiracyedto"
,
"corpseedto"
,
"disasteredto"
,
"multiplyedto"
,
"monthedto"
,
"weekedto"
,
"requestedto"
,
"canceledto"
,
"predictedto"
,
"cardedto"
,
"careeredto"
,
"calmedto"
,
"crusadeedto"
,
"candidateedto"
,
"frankedto"
,
"wolfedto"
,
"sailedto"
,
"canvasedto"
,
"ceilingedto"
,
"ableedto"
,
"contentedto"
,
"memoryedto"
,
"capitaledto"
,
"executionedto"
,
"impulseedto"
,
"legendedto"
,
"prisoneredto"
,
"treatedto"
,
"considerationedto"
,
"sharkedto"
,
"wristedto"
,
"sketchedto"
,
"waterfalledto"
,
"precedentedto"
,
"advanceedto"
,
"registeredto"
,
"barreledto"
,
"coffinedto"
,
"hurledto"
,
"catalogueedto"
,
"captureedto"
,
"bracketedto"
,
"napedto"
,
"ranchedto"
,
"whiteedto"
,
"causeedto"
,
"natureedto"
,
"killedto"
,
"offendedto"
,
"pouredto"
,
"pitedto"
,
"crashedto"
,
"fameedto"
,
"planetedto"
,
"orbitedto"
,
"paperedto"
,
"pennyedto"
,
"coreedto"
,
"headquartersedto"
,
"wheatedto"
,
"hemisphereedto"
,
"ceremonyedto"
,
"paradeedto"
,
"funeraledto"
,
"licenseedto"
,
"neckedto"
,
"strawedto"
,
"necklaceedto"
,
"throneedto"
,
"presidentedto"
,
"championedto"
,
"titleedto"
,
"reformedto"
,
"convertedto"
,
"freezeedto"
,
"roleedto"
,
"featureedto"
,
"provincialedto"
,
"hostileedto"
,
"systematicedto"
,
"pooredto"
,
"loudedto"
,
"plotedto"
,
"chaseedto"
,
"talkativeedto"
,
"checkedto"
,
"chequeedto"
,
"urgeedto"
,
"compoundedto"
,
"elementedto"
,
"reactionedto"
,
"chemistryedto"
,
"kingedto"
,
"chestedto"
,
"mainedto"
,
"headedto"
,
"adoptionedto"
,
"chorusedto"
,
"chopedto"
,
"helicopteredto"
,
"watchedto"
,
"lumpedto"
,
"churchedto"
,
"slideedto"
,
"filmedto"
,
"roundedto"
,
"conditionedto"
,
"referenceedto"
,
"quoteedto"
,
"orangeedto"
,
"blockedto"
,
"mayoredto"
,
"tribeedto"
,
"applaudedto"
,
"bangedto"
,
"confrontationedto"
,
"mudedto"
,
"potteryedto"
,
"soapedto"
,
"clarifyedto"
,
"acquitedto"
,
"cutedto"
,
"crackedto"
,
"mercyedto"
,
"fistedto"
,
"bishopedto"
,
"clerkedto"
,
"smartedto"
,
"tickedto"
,
"snapedto"
,
"customeredto"
,
"climbedto"
,
"climateedto"
,
"cuttingedto"
,
"timeedto"
,
"closeedto"
,
"contactedto"
,
"cupboardedto"
,
"dressedto"
,
"overalledto"
,
"beltedto"
,
"fooledto"
,
"seizeedto"
,
"trainedto"
,
"coalitionedto"
,
"harshedto"
,
"coatedto"
,
"codeedto"
,
"contemporaryedto"
,
"generationedto"
,
"cafeedto"
,
"proofedto"
,
"knowledgeedto"
,
"beliefedto"
,
"judgmentedto"
,
"laseredto"
,
"curledto"
,
"snubedto"
,
"fishedto"
,
"coldedto"
,
"cooperateedto"
,
"giveedto"
,
"tentedto"
,
"raiseedto"
,
"wardrobeedto"
,
"settlementedto"
,
"rainbowedto"
,
"mosaicedto"
,
"chordedto"
,
"landedto"
,
"confrontedto"
,
"enteredto"
,
"appearedto"
,
"discoveredto"
,
"baitedto"
,
"comfortedto"
,
"comfortableedto"
,
"leaderedto"
,
"memorialedto"
,
"recommendedto"
,
"transactionedto"
,
"businessedto"
,
"commerceedto"
,
"marketedto"
,
"committeeedto"
,
"boardedto"
,
"senseedto"
,
"parkedto"
,
"infectedto"
,
"writeedto"
,
"networkedto"
,
"compactedto"
,
"companyedto"
,
"pityedto"
,
"remunerateedto"
,
"competenceedto"
,
"plaintiffedto"
,
"finishedto"
,
"perfectedto"
,
"complicationedto"
,
"complexedto"
,
"followedto"
,
"moduleedto"
,
"behaveedto"
,
"constitutionedto"
,
"understandedto"
,
"squeezeedto"
,
"accountantedto"
,
"calculationedto"
,
"hardwareedto"
,
"menuedto"
,
"mouseedto"
,
"computingedto"
,
"softwareedto"
,
"computeredto"
,
"hideedto"
,
"designedto"
,
"imagineedto"
,
"notionedto"
,
"conceptedto"
,
"embryoedto"
,
"practicaledto"
,
"appliededto"
,
"sacrededto"
,
"personaledto"
,
"domesticedto"
,
"definitionedto"
,
"lastedto"
,
"harmonyedto"
,
"coincideedto"
,
"termsedto"
,
"freedomedto"
,
"dangeredto"
,
"improvementedto"
,
"behavioredto"
,
"experimentedto"
,
"directoredto"
,
"southedto"
,
"federationedto"
,
"trustedto"
,
"constellationedto"
,
"impoundedto"
,
"battleedto"
,
"fitedto"
,
"adjustedto"
,
"standardedto"
,
"normaledto"
,
"complianceedto"
,
"praiseedto"
,
"representativeedto"
,
"linkedto"
,
"relatededto"
,
"nodeedto"
,
"draftedto"
,
"sanctuaryedto"
,
"agreeedto"
,
"productedto"
,
"effectedto"
,
"doubtedto"
,
"courtesyedto"
,
"thoughtfuledto"
,
"tightedto"
,
"structureedto"
,
"useedto"
,
"infectionedto"
,
"binedto"
,
"cassetteedto"
,
"fulledto"
,
"pollutionedto"
,
"competitionedto"
,
"satisfactionedto"
,
"raceedto"
,
"circumstanceedto"
,
"Europeedto"
,
"pupiledto"
,
"denyedto"
,
"contradictionedto"
,
"joystickedto"
,
"recoveryedto"
,
"ruleedto"
,
"transitionedto"
,
"convinceedto"
,
"vehicleedto"
,
"sentenceedto"
,
"fabricateedto"
,
"biscuitedto"
,
"herbedto"
,
"oiledto"
,
"panedto"
,
"potedto"
,
"cageedto"
,
"partnershipedto"
,
"cooperativeedto"
,
"policemanedto"
,
"hospitalityedto"
,
"cordedto"
,
"rightedto"
,
"disciplineedto"
,
"decorativeedto"
,
"makeupedto"
,
"priceedto"
,
"cliqueedto"
,
"cottonedto"
,
"sofaedto"
,
"matteredto"
,
"moleedto"
,
"offsetedto"
,
"polledto"
,
"coupedto"
,
"voucheredto"
,
"braveedto"
,
"seminaredto"
,
"creditedto"
,
"courseedto"
,
"curriculumedto"
,
"directionedto"
,
"warrantedto"
,
"politeedto"
,
"courtedto"
,
"designeredto"
,
"bloodyedto"
,
"jealousedto"
,
"colleagueedto"
,
"cattleedto"
,
"gapedto"
,
"wisecrackedto"
,
"cunningedto"
,
"craftedto"
,
"crackpotedto"
,
"creviceedto"
,
"rottenedto"
,
"appetiteedto"
,
"creepedto"
,
"foldedto"
,
"creationedto"
,
"artistedto"
,
"thinkeredto"
,
"literatureedto"
,
"credibilityedto"
,
"creededto"
,
"sailoredto"
,
"prosecutionedto"
,
"recordedto"
,
"criticismedto"
,
"crosswalkedto"
,
"bendedto"
,
"collapseedto"
,
"squashedto"
,
"graveledto"
,
"copperedto"
,
"snuggleedto"
,
"clueedto"
,
"cucumberedto"
,
"ethnicedto"
,
"mugedto"
,
"cabinetedto"
,
"cupedto"
,
"remedyedto"
,
"suppressedto"
,
"healedto"
,
"lockedto"
,
"moneyedto"
,
"damnedto"
,
"swearedto"
,
"pillowedto"
,
"conventionedto"
,
"traditionedto"
,
"reduceedto"
,
"amputateedto"
,
"cropedto"
,
"carveedto"
,
"skinedto"
,
"forkedto"
,
"saleedto"
,
"patedto"
,
"sunriseedto"
,
"dairyedto"
,
"totaledto"
,
"balletedto"
,
"navyedto"
,
"darkedto"
,
"favouriteedto"
,
"styleedto"
,
"fileedto"
,
"trackedto"
,
"dawnedto"
,
"anniversaryedto"
,
"holidayedto"
,
"fogedto"
,
"shockedto"
,
"bodyedto"
,
"handedto"
,
"lotedto"
,
"franchiseedto"
,
"shortageedto"
,
"consideredto"
,
"exposeedto"
,
"beheadedto"
,
"deathedto"
,
"betrayedto"
,
"decadeedto"
,
"resolutionedto"
,
"classifyedto"
,
"refuseedto"
,
"recessionedto"
,
"descentedto"
,
"decayedto"
,
"medaledto"
,
"reductionedto"
,
"orderedto"
,
"devoteedto"
,
"profoundedto"
,
"welledto"
,
"carrotedto"
,
"comaedto"
,
"nonremittaledto"
,
"faultedto"
,
"lemonedto"
,
"paymentedto"
,
"temperatureedto"
,
"qualityedto"
,
"godedto"
,
"extensionedto"
,
"censorshipedto"
,
"debateedto"
,
"laceedto"
,
"tastyedto"
,
"pleasureedto"
,
"pleaseedto"
,
"pleasantedto"
,
"preachedto"
,
"rescueedto"
,
"challengeedto"
,
"limitedto"
,
"demonstrationedto"
,
"destructionedto"
,
"thickedto"
,
"densityedto"
,
"reliableedto"
,
"describeedto"
,
"subjectedto"
,
"exileedto"
,
"bankedto"
,
"depressionedto"
,
"robedto"
,
"commissionedto"
,
"lineageedto"
,
"originedto"
,
"integrationedto"
,
"meritedto"
,
"motifedto"
,
"planedto"
,
"functionaledto"
,
"architectedto"
,
"wantedto"
,
"despairedto"
,
"sweetedto"
,
"fateedto"
,
"pointedto"
,
"confineedto"
,
"custodyedto"
,
"discourageedto"
,
"weighedto"
,
"decisiveedto"
,
"hateedto"
,
"explodeedto"
,
"explosionedto"
,
"modernizeedto"
,
"abnormaledto"
,
"instrumentedto"
,
"filteredto"
,
"crownedto"
,
"dialogueedto"
,
"negotiationedto"
,
"journaledto"
,
"drownedto"
,
"dietedto"
,
"disagreeedto"
,
"messedto"
,
"difficultyedto"
,
"excavationedto"
,
"industryedto"
,
"proportionedto"
,
"decreaseedto"
,
"diplomaticedto"
,
"managementedto"
,
"manageredto"
,
"soiledto"
,
"disabilityedto"
,
"denialedto"
,
"unpleasantedto"
,
"separationedto"
,
"diskedto"
,
"dumpedto"
,
"studyedto"
,
"negativeedto"
,
"stopedto"
,
"discoedto"
,
"offenseedto"
,
"findedto"
,
"incongruousedto"
,
"digitaledto"
,
"consultationedto"
,
"treatmentedto"
,
"contemptedto"
,
"spiritedto"
,
"maskedto"
,
"pieedto"
,
"dishedto"
,
"disorderedto"
,
"chartedto"
,
"quarreledto"
,
"differenceedto"
,
"neglectedto"
,
"dismissedto"
,
"jointedto"
,
"undressedto"
,
"interruptedto"
,
"disturbanceedto"
,
"disagreementedto"
,
"thesisedto"
,
"deteredto"
,
"mileedto"
,
"aloofedto"
,
"traitedto"
,
"characteristicedto"
,
"spreadedto"
,
"circulateedto"
,
"quarteredto"
,
"upsetedto"
,
"trenchedto"
,
"butterflyedto"
,
"varietyedto"
,
"deviationedto"
,
"evenedto"
,
"harmedto"
,
"workedto"
,
"doctoredto"
,
"philosophyedto"
,
"charteredto"
,
"poundedto"
,
"dollaredto"
,
"goatedto"
,
"dogedto"
,
"chickenedto"
,
"cultivateedto"
,
"controledto"
,
"contributionedto"
,
"gateedto"
,
"belledto"
,
"thresholdedto"
,
"dormedto"
,
"drugedto"
,
"imageedto"
,
"ruinedto"
,
"drainedto"
,
"operaedto"
,
"dramaedto"
,
"theateredto"
,
"curtainedto"
,
"pulledto"
,
"tapedto"
,
"tieedto"
,
"diagramedto"
,
"fearedto"
,
"awfuledto"
,
"sipedto"
,
"dribbleedto"
,
"driveedto"
,
"quitedto"
,
"heroinedto"
,
"useredto"
,
"rehearsaledto"
,
"eastedto"
,
"northedto"
,
"westedto"
,
"ditchedto"
,
"repeatedto"
,
"lengthedto"
,
"twilightedto"
,
"responsibilityedto"
,
"obligationedto"
,
"houseedto"
,
"homeedto"
,
"dynamicedto"
,
"pastedto"
,
"mailedto"
,
"worldedto"
,
"poleedto"
,
"reliefedto"
,
"relaxationedto"
,
"accessibleedto"
,
"tenderedto"
,
"distinctedto"
,
"handyedto"
,
"restaurantedto"
,
"aidedto"
,
"economistedto"
,
"boomedto"
,
"economicsedto"
,
"economyedto"
,
"valueedto"
,
"marginedto"
,
"beanedto"
,
"onionedto"
,
"cornedto"
,
"buildingedto"
,
"schooledto"
,
"influenceedto"
,
"effectiveedto"
,
"eggedto"
,
"selfedto"
,
"egoedto"
,
"hipedto"
,
"elbowedto"
,
"oldedto"
,
"chooseedto"
,
"voteredto"
,
"currentedto"
,
"electronedto"
,
"hilledto"
,
"liftedto"
,
"eliteedto"
,
"bananaedto"
,
"articulateedto"
,
"flagedto"
,
"eagleedto"
,
"utteredto"
,
"glowedto"
,
"sentimentedto"
,
"painedto"
,
"stressedto"
,
"conglomerateedto"
,
"empiricaledto"
,
"authoriseedto"
,
"blankedto"
,
"clearedto"
,
"brainedto"
,
"witchedto"
,
"surroundedto"
,
"frameedto"
,
"meetingedto"
,
"favorableedto"
,
"invasionedto"
,
"restrainedto"
,
"settleedto"
,
"outputedto"
,
"acuteedto"
,
"conclusionedto"
,
"terminaledto"
,
"survivaledto"
,
"oppositionedto"
,
"fueledto"
,
"wrapedto"
,
"wrestleedto"
,
"mastermindedto"
,
"technologyedto"
,
"concentrationedto"
,
"enjoyedto"
,
"indulgeedto"
,
"expansionedto"
,
"soldieredto"
,
"registrationedto"
,
"pleadedto"
,
"penetrateedto"
,
"temptedto"
,
"temptationedto"
,
"solidedto"
,
"burialedto"
,
"entryedto"
,
"accessedto"
,
"ticketedto"
,
"twistedto"
,
"environmentedto"
,
"eraedto"
,
"balanceedto"
,
"breakdownedto"
,
"justedto"
,
"ambiguousedto"
,
"ambiguityedto"
,
"deleteedto"
,
"erroredto"
,
"intensifyedto"
,
"adventureedto"
,
"flightedto"
,
"leakedto"
,
"perfumeedto"
,
"habitedto"
,
"institutionedto"
,
"admirationedto"
,
"respectedto"
,
"eveningedto"
,
"incidentedto"
,
"troubleedto"
,
"eternaledto"
,
"estateedto"
,
"groundsedto"
,
"contraryedto"
,
"testedto"
,
"screenedto"
,
"inspectoredto"
,
"mineedto"
,
"excludeedto"
,
"fatedto"
,
"selledto"
,
"redeemedto"
,
"correspondedto"
,
"correspondenceedto"
,
"proclaimedto"
,
"exclusiveedto"
,
"monopolyedto"
,
"justifyedto"
,
"exampleedto"
,
"illustrateedto"
,
"practiceedto"
,
"dominantedto"
,
"exerciseedto"
,
"pressedto"
,
"showedto"
,
"displayedto"
,
"museumedto"
,
"emergencyedto"
,
"elaborateedto"
,
"areaedto"
,
"anticipationedto"
,
"prospectedto"
,
"ejectedto"
,
"spendedto"
,
"feeledto"
,
"authorityedto"
,
"expertiseedto"
,
"reasonedto"
,
"explainedto"
,
"remarkedto"
,
"graphicedto"
,
"exhibitionedto"
,
"complainedto"
,
"explicitedto"
,
"apologyedto"
,
"highwayedto"
,
"delicateedto"
,
"reachedto"
,
"societyedto"
,
"surfaceedto"
,
"outsideedto"
,
"blackmailedto"
,
"deportedto"
,
"galaxyedto"
,
"glassesedto"
,
"lidedto"
,
"silkedto"
,
"materialedto"
,
"manufactureedto"
,
"sideedto"
,
"grimaceedto"
,
"aspectedto"
,
"beardedto"
,
"faxedto"
,
"parameteredto"
,
"observationedto"
,
"attentionedto"
,
"fairyedto"
,
"missedto"
,
"overlookedto"
,
"loseedto"
,
"weaknessedto"
,
"absenceedto"
,
"sunshineedto"
,
"forgeedto"
,
"illusionedto"
,
"distortedto"
,
"acquaintanceedto"
,
"kinshipedto"
,
"crystaledto"
,
"agricultureedto"
,
"modeledto"
,
"trickedto"
,
"secureedto"
,
"screwedto"
,
"knotedto"
,
"creamedto"
,
"tirededto"
,
"blameedto"
,
"preferedto"
,
"progressiveedto"
,
"coweredto"
,
"concernedto"
,
"boldedto"
,
"viableedto"
,
"banquetedto"
,
"agentedto"
,
"tolledto"
,
"desireedto"
,
"unrestedto"
,
"confidenceedto"
,
"proudedto"
,
"catedto"
,
"criminaledto"
,
"henedto"
,
"girledto"
,
"bitchedto"
,
"queenedto"
,
"motheredto"
,
"ironedto"
,
"ferryedto"
,
"conceptionedto"
,
"celebrationedto"
,
"storyedto"
,
"fibreedto"
,
"characteredto"
,
"noveledto"
,
"fightedto"
,
"stuffedto"
,
"filledto"
,
"occupyedto"
,
"movieedto"
,
"produceredto"
,
"fundedto"
,
"treasureredto"
,
"convictedto"
,
"clayedto"
,
"powderedto"
,
"sandedto"
,
"thumbedto"
,
"fastidiousedto"
,
"particularedto"
,
"goaledto"
,
"fireplaceedto"
,
"shootedto"
,
"rifleedto"
,
"firefighteredto"
,
"strongedto"
,
"cousinedto"
,
"initialedto"
,
"beginningedto"
,
"initiativeedto"
,
"freshmanedto"
,
"financialedto"
,
"salmonedto"
,
"aquariumedto"
,
"fishermanedto"
,
"healthyedto"
,
"equipedto"
,
"convulsionedto"
,
"sceneedto"
,
"cookedto"
,
"feeedto"
,
"interestedto"
,
"tileedto"
,
"meatedto"
,
"stewardedto"
,
"tossedto"
,
"deckedto"
,
"leveledto"
,
"stunedto"
,
"flooredto"
,
"vegetationedto"
,
"plantedto"
,
"doughedto"
,
"spilledto"
,
"lilyedto"
,
"variationedto"
,
"chimneyedto"
,
"soaredto"
,
"concentrateedto"
,
"familyedto"
,
"folkedto"
,
"conventionaledto"
,
"secondedto"
,
"cheeseedto"
,
"grainedto"
,
"saladedto"
,
"cheatedto"
,
"recklessedto"
,
"footballedto"
,
"traceedto"
,
"marathonedto"
,
"stepedto"
,
"bootedto"
,
"offensiveedto"
,
"raidedto"
,
"patienceedto"
,
"poweredto"
,
"campedto"
,
"impactedto"
,
"forceedto"
,
"exoticedto"
,
"chiefedto"
,
"deeredto"
,
"preventedto"
,
"branchedto"
,
"spinedto"
,
"shapeedto"
,
"balledto"
,
"formatedto"
,
"abandonedto"
,
"strengthedto"
,
"castleedto"
,
"accidentedto"
,
"coaledto"
,
"springedto"
,
"wheeledto"
,
"skeletonedto"
,
"rackedto"
,
"hotdogedto"
,
"fraudedto"
,
"monsteredto"
,
"relieveedto"
,
"straightedto"
,
"safeedto"
,
"cleanedto"
,
"dryedto"
,
"pureedto"
,
"weightedto"
,
"exemptedto"
,
"releaseedto"
,
"libertyedto"
,
"haltedto"
,
"frequencyedto"
,
"originaledto"
,
"clashedto"
,
"refrigeratoredto"
,
"allyedto"
,
"warmedto"
,
"terrifyedto"
,
"medievaledto"
,
"facadeedto"
,
"iceedto"
,
"cherryedto"
,
"appleedto"
,
"defeatedto"
,
"footedto"
,
"smokeedto"
,
"officialedto"
,
"mushroomedto"
,
"moldedto"
,
"deskedto"
,
"seatedto"
,
"lampedto"
,
"rageedto"
,
"jokeedto"
,
"chokeedto"
,
"profitedto"
,
"makeedto"
,
"gallonedto"
,
"riskedto"
,
"netedto"
,
"scoreedto"
,
"topedto"
,
"gasedto"
,
"meetedto"
,
"homosexualedto"
,
"regardedto"
,
"gearedto"
,
"jellyedto"
,
"diamondedto"
,
"jeweledto"
,
"gemedto"
,
"sexedto"
,
"categoryedto"
,
"healthedto"
,
"productiveedto"
,
"mutationedto"
,
"geneticedto"
,
"explorationedto"
,
"zoneedto"
,
"circleedto"
,
"escapeedto"
,
"copeedto"
,
"ageedto"
,
"abolishedto"
,
"eliminateedto"
,
"masteredto"
,
"ariseedto"
,
"outfitedto"
,
"ghostwriteredto"
,
"charityedto"
,
"talentededto"
,
"daughteredto"
,
"blessedto"
,
"defineedto"
,
"performedto"
,
"payedto"
,
"distributeedto"
,
"thankedto"
,
"spareedto"
,
"resignationedto"
,
"secretionedto"
,
"marbleedto"
,
"glanceedto"
,
"shineedto"
,
"gloomedto"
,
"glareedto"
,
"frownedto"
,
"stickyedto"
,
"sinkedto"
,
"retireedto"
,
"happenedto"
,
"accompanyedto"
,
"passedto"
,
"failedto"
,
"goalkeeperedto"
,
"departureedto"
,
"golfedto"
,
"peanutedto"
,
"charmedto"
,
"bloodshededto"
,
"overeatedto"
,
"extortedto"
,
"ministryedto"
,
"ministeredto"
,
"gradientedto"
,
"markedto"
,
"driftedto"
,
"riceedto"
,
"grandfatheredto"
,
"grandmotheredto"
,
"gripedto"
,
"hayedto"
,
"scrapeedto"
,
"tipedto"
,
"gravityedto"
,
"cemeteryedto"
,
"majoredto"
,
"highedto"
,
"produceedto"
,
"greenedto"
,
"welcomeedto"
,
"grudgeedto"
,
"milledto"
,
"tractionedto"
,
"armyedto"
,
"backgroundedto"
,
"cooperationedto"
,
"flockedto"
,
"herdedto"
,
"organisationedto"
,
"fleetedto"
,
"troopedto"
,
"adultedto"
,
"developmentedto"
,
"ensureedto"
,
"defendedto"
,
"hypothesisedto"
,
"directedto"
,
"guideedto"
,
"guidelineedto"
,
"guiltedto"
,
"innocentedto"
,
"tasteedto"
,
"wateredto"
,
"inhabitantedto"
,
"haircutedto"
,
"halledto"
,
"hammeredto"
,
"basketedto"
,
"manualedto"
,
"cartedto"
,
"umbrellaedto"
,
"gloveedto"
,
"hangedto"
,
"yearnedto"
,
"coincidenceedto"
,
"difficultedto"
,
"cashedto"
,
"woodedto"
,
"nutedto"
,
"damageedto"
,
"collaredto"
,
"harvestedto"
,
"harassedto"
,
"rushedto"
,
"haveedto"
,
"wearedto"
,
"dineedto"
,
"affordedto"
,
"brownedto"
,
"souredto"
,
"steepedto"
,
"smoothedto"
,
"sharpedto"
,
"sensitiveedto"
,
"completeedto"
,
"squareedto"
,
"deepedto"
,
"weakedto"
,
"infiniteedto"
,
"matureedto"
,
"meadowedto"
,
"veiledto"
,
"governoredto"
,
"helmetedto"
,
"clearanceedto"
,
"therapistedto"
,
"pileedto"
,
"listenedto"
,
"rumoredto"
,
"griefedto"
,
"heatedto"
,
"responsibleedto"
,
"serviceedto"
,
"portionedto"
,
"domeedto"
,
"momentedto"
,
"futureedto"
,
"reluctanceedto"
,
"retreatedto"
,
"feveredto"
,
"highlightedto"
,
"extremeedto"
,
"handicapedto"
,
"interferenceedto"
,
"employedto"
,
"slapedto"
,
"pawnedto"
,
"pigedto"
,
"keepedto"
,
"resortedto"
,
"tubeedto"
,
"bubbleedto"
,
"excavateedto"
,
"habitatedto"
,
"housewifeedto"
,
"honoredto"
,
"addictededto"
,
"tireedto"
,
"basketballedto"
,
"platformedto"
,
"wardedto"
,
"innedto"
,
"enemyedto"
,
"firmedto"
,
"hutedto"
,
"houredto"
,
"husbandedto"
,
"coloredto"
,
"embraceedto"
,
"giantedto"
,
"actedto"
,
"faceedto"
,
"armedto"
,
"humanityedto"
,
"comedyedto"
,
"huntingedto"
,
"safariedto"
,
"hunteredto"
,
"sufferedto"
,
"injuryedto"
,
"sufferingedto"
,
"crossedto"
,
"theoryedto"
,
"preoccupationedto"
,
"identityedto"
,
"identificationedto"
,
"dialectedto"
,
"lighteredto"
,
"sickedto"
,
"unlawfuledto"
,
"notoriousedto"
,
"fantasyedto"
,
"projectionedto"
,
"pictureedto"
,
"copyedto"
,
"hugeedto"
,
"exemptionedto"
,
"affectedto"
,
"spoiledto"
,
"fairedto"
,
"jungleedto"
,
"pressureedto"
,
"flawededto"
,
"temporaryedto"
,
"tooledto"
,
"brushedto"
,
"issueedto"
,
"jailedto"
,
"unlikelyedto"
,
"momentumedto"
,
"tenseedto"
,
"regularedto"
,
"unanimousedto"
,
"accurateedto"
,
"centraledto"
,
"inchedto"
,
"passiveedto"
,
"stilledto"
,
"deadedto"
,
"helplessedto"
,
"tendencyedto"
,
"wholeedto"
,
"conflictedto"
,
"incapableedto"
,
"containedto"
,
"fewedto"
,
"insuranceedto"
,
"bayedto"
,
"separateedto"
,
"needleedto"
,
"neededto"
,
"personedto"
,
"moraleedto"
,
"singleedto"
,
"lazyedto"
,
"incentiveedto"
,
"splurgeedto"
,
"cheapedto"
,
"implicitedto"
,
"childishedto"
,
"virusedto"
,
"helledto"
,
"hospitaledto"
,
"determineedto"
,
"fluedto"
,
"informationedto"
,
"recordingedto"
,
"rareedto"
,
"violationedto"
,
"consumptionedto"
,
"monkedto"
,
"instinctedto"
,
"heiredto"
,
"firstedto"
,
"shotedto"
,
"pioneeredto"
,
"inquiryedto"
,
"askedto"
,
"questionedto"
,
"dedicateedto"
,
"beeedto"
,
"indooredto"
,
"insistenceedto"
,
"freshedto"
,
"establishedto"
,
"episodeedto"
,
"exceptionedto"
,
"collegeedto"
,
"teachedto"
,
"lectureedto"
,
"educationedto"
,
"teacheredto"
,
"meansedto"
,
"deficiencyedto"
,
"abuseedto"
,
"coverageedto"
,
"policyedto"
,
"premiumedto"
,
"guerrillaedto"
,
"rebeledto"
,
"rebellionedto"
,
"unityedto"
,
"newsedto"
,
"meanedto"
,
"purposeedto"
,
"interventionedto"
,
"insideedto"
,
"middleedto"
,
"mediumedto"
,
"translateedto"
,
"readedto"
,
"spokespersonedto"
,
"crossingedto"
,
"periodedto"
,
"boweledto"
,
"fascinateedto"
,
"suspicionedto"
,
"feelingedto"
,
"floodedto"
,
"innovationedto"
,
"stockedto"
,
"reverseedto"
,
"speculateedto"
,
"detectiveedto"
,
"investmentedto"
,
"guestedto"
,
"physicaledto"
,
"angeredto"
,
"publicationedto"
,
"exitedto"
,
"loopedto"
,
"twitchedto"
,
"appointmentedto"
,
"athleteedto"
,
"reporteredto"
,
"voyageedto"
,
"joyedto"
,
"litigationedto"
,
"parachuteedto"
,
"judicialedto"
,
"lawedto"
,
"judgeedto"
,
"justiceedto"
,
"depriveedto"
,
"discreetedto"
,
"pianoedto"
,
"childedto"
,
"calorieedto"
,
"favoredto"
,
"lionedto"
,
"affinityedto"
,
"ovenedto"
,
"kneeedto"
,
"stabedto"
,
"horseedto"
,
"sweateredto"
,
"experiencededto"
,
"laboratoryedto"
,
"unionedto"
,
"mazeedto"
,
"ignoranceedto"
,
"ignorantedto"
,
"shallowedto"
,
"baldedto"
,
"softedto"
,
"bareedto"
,
"girlfriendedto"
,
"secularedto"
,
"islandedto"
,
"siteedto"
,
"groundedto"
,
"landowneredto"
,
"nameedto"
,
"lickedto"
,
"theftedto"
,
"cathedraledto"
,
"tigeredto"
,
"greatedto"
,
"riveredto"
,
"crowdedto"
,
"stageedto"
,
"rangeedto"
,
"pumpkinedto"
,
"whipedto"
,
"endureedto"
,
"permanentedto"
,
"tensionedto"
,
"fashionedto"
,
"crimeedto"
,
"grassedto"
,
"saveedto"
,
"storeedto"
,
"leadershipedto"
,
"bladeedto"
,
"leafedto"
,
"thinedto"
,
"jumpedto"
,
"academyedto"
,
"resignedto"
,
"farewelledto"
,
"departedto"
,
"talkedto"
,
"leftoversedto"
,
"actionedto"
,
"trusteeedto"
,
"liabilityedto"
,
"opinionedto"
,
"jurisdictionedto"
,
"trialedto"
,
"verdictedto"
,
"keyedto"
,
"legislationedto"
,
"legislatureedto"
,
"continuationedto"
,
"woundedto"
,
"minoredto"
,
"disappointedto"
,
"disappointmentedto"
,
"deadlyedto"
,
"letteredto"
,
"hoveredto"
,
"dictionaryedto"
,
"licenceedto"
,
"lieedto"
,
"biographyedto"
,
"revokeedto"
,
"beamedto"
,
"bulbedto"
,
"pasteledto"
,
"igniteedto"
,
"blondeedto"
,
"equaledto"
,
"restrictedto"
,
"diameteredto"
,
"columnedto"
,
"languageedto"
,
"contextedto"
,
"connectionedto"
,
"soupedto"
,
"eavesdropedto"
,
"torchedto"
,
"essayedto"
,
"fictionedto"
,
"smalledto"
,
"aliveedto"
,
"acceptedto"
,
"enthusiasmedto"
,
"residentedto"
,
"socialedto"
,
"lendedto"
,
"engineedto"
,
"housingedto"
,
"atticedto"
,
"logedto"
,
"implicationedto"
,
"lingeredto"
,
"stripedto"
,
"ridgeedto"
,
"shaftedto"
,
"benchedto"
,
"monkeyedto"
,
"admireedto"
,
"relaxedto"
,
"misplaceedto"
,
"sacrificeedto"
,
"drawingedto"
,
"speakeredto"
,
"chinedto"
,
"minimumedto"
,
"fortuneedto"
,
"chanceedto"
,
"trunkedto"
,
"timberedto"
,
"lunchedto"
,
"thrustedto"
,
"grandedto"
,
"intermediateedto"
,
"machineryedto"
,
"spelledto"
,
"enlargeedto"
,
"dimensionedto"
,
"maidedto"
,
"postedto"
,
"brandedto"
,
"reproduceedto"
,
"deliveredto"
,
"impressedto"
,
"guessedto"
,
"activateedto"
,
"barkedto"
,
"enhanceedto"
,
"weaveedto"
,
"amuseedto"
,
"obscureedto"
,
"touchedto"
,
"reviseedto"
,
"developedto"
,
"knitedto"
,
"reconcileedto"
,
"decideedto"
,
"widenedto"
,
"presentationedto"
,
"fatheredto"
,
"spiteedto"
,
"canceredto"
,
"mistreatedto"
,
"financeedto"
,
"exploitedto"
,
"falsifyedto"
,
"laboreredto"
,
"constructedto"
,
"demonstrateedto"
,
"marchedto"
,
"sealedto"
,
"wildedto"
,
"selleredto"
,
"distributoredto"
,
"proposaledto"
,
"weddingedto"
,
"marriageedto"
,
"wifeedto"
,
"marshedto"
,
"wonderedto"
,
"communistedto"
,
"grindedto"
,
"rallyedto"
,
"glacieredto"
,
"dominationedto"
,
"chewedto"
,
"concreteedto"
,
"plasticedto"
,
"mathematicsedto"
,
"equationedto"
,
"growedto"
,
"maximumedto"
,
"buffetedto"
,
"wayedto"
,
"qualifyedto"
,
"measureedto"
,
"beefedto"
,
"pumpedto"
,
"dressingedto"
,
"clinicedto"
,
"medicineedto"
,
"specimenedto"
,
"symptomedto"
,
"seeedto"
,
"conferenceedto"
,
"qualifiededto"
,
"themeedto"
,
"tuneedto"
,
"partneredto"
,
"citizenedto"
,
"memorandumedto"
,
"learnedto"
,
"crewedto"
,
"threatedto"
,
"attitudeedto"
,
"outlookedto"
,
"referedto"
,
"merchantedto"
,
"freighteredto"
,
"crueltyedto"
,
"deserveedto"
,
"funedto"
,
"hypnothizeedto"
,
"steeledto"
,
"wireedto"
,
"metaledto"
,
"subwayedto"
,
"cityedto"
,
"microphoneedto"
,
"bomberedto"
,
"campaignedto"
,
"occupationedto"
,
"factoryedto"
,
"minuteedto"
,
"awareedto"
,
"mineredto"
,
"misleadedto"
,
"distortionedto"
,
"mixtureedto"
,
"cakeedto"
,
"airedto"
,
"solutionedto"
,
"confusionedto"
,
"groanedto"
,
"patternedto"
,
"mildedto"
,
"routineedto"
,
"empireedto"
,
"abbeyedto"
,
"grantedto"
,
"coinedto"
,
"allowanceedto"
,
"debtedto"
,
"virtueedto"
,
"ethicsedto"
,
"integrityedto"
,
"morningedto"
,
"breakfastedto"
,
"gestureedto"
,
"movementedto"
,
"motivationedto"
,
"motorcycleedto"
,
"truckedto"
,
"sloganedto"
,
"mountainedto"
,
"volcanoedto"
,
"ofedto"
,
"atedto"
,
"ifedto"
,
"noedto"
,
"myedto"
,
"meedto"
,
"toedto"
,
"beedto"
,
"soedto"
,
"weedto"
,
"heedto"
,
"byedto"
,
"onedto"
,
"upedto"
,
"amedto"
,
"usedto"
,
"stiredto"
,
"danceedto"
,
"skateedto"
,
"glideedto"
,
"swipeedto"
,
"bounceedto"
,
"swingedto"
,
"migrationedto"
,
"circulationedto"
,
"cinemaedto"
,
"mobileedto"
,
"multimediaedto"
,
"mutteredto"
,
"contractionedto"
,
"composeredto"
,
"pieceedto"
,
"orchestraedto"
,
"concertedto"
,
"dragonedto"
,
"sodiumedto"
,
"appointedto"
,
"nominationedto"
,
"telledto"
,
"channeledto"
,
"laneedto"
,
"narrowedto"
,
"congressedto"
,
"hairedto"
,
"tongueedto"
,
"sicknessedto"
,
"marineedto"
,
"approachedto"
,
"tidyedto"
,
"requirementedto"
,
"thirstyedto"
,
"negligenceedto"
,
"ignoreedto"
,
"bargainedto"
,
"neighbouredto"
,
"cooledto"
,
"nervousedto"
,
"latestedto"
,
"reportedto"
,
"headlineedto"
,
"nightedto"
,
"agileedto"
,
"retirededto"
,
"lostedto"
,
"dukeedto"
,
"owledto"
,
"batedto"
,
"extinctedto"
,
"articleedto"
,
"civilianedto"
,
"objectiveedto"
,
"averageedto"
,
"censusedto"
,
"relativeedto"
,
"indirectedto"
,
"ordinaryedto"
,
"genuineedto"
,
"unfortunateedto"
,
"toughedto"
,
"slowedto"
,
"modestedto"
,
"integratededto"
,
"inappropriateedto"
,
"otheredto"
,
"looseedto"
,
"rawedto"
,
"hardedto"
,
"mentionedto"
,
"warnedto"
,
"reputationedto"
,
"harmfuledto"
,
"reactoredto"
,
"chainedto"
,
"countedto"
,
"numberedto"
,
"fosteredto"
,
"foodedto"
,
"approveedto"
,
"oakedto"
,
"fixtureedto"
,
"protestedto"
,
"dirtyedto"
,
"stubbornedto"
,
"reserveedto"
,
"borrowedto"
,
"availableedto"
,
"professionedto"
,
"seasonaledto"
,
"seaedto"
,
"visualedto"
,
"eyeedto"
,
"primaryedto"
,
"heavyedto"
,
"superioredto"
,
"neutraledto"
,
"oraledto"
,
"diplomatedto"
,
"twinedto"
,
"senioredto"
,
"noseedto"
,
"bearedto"
,
"legedto"
,
"pageedto"
,
"criticedto"
,
"survivoredto"
,
"traineredto"
,
"linearedto"
,
"halfedto"
,
"trayedto"
,
"windowedto"
,
"holeedto"
,
"surgeonedto"
,
"automaticedto"
,
"aviationedto"
,
"driveredto"
,
"contrastedto"
,
"choiceedto"
,
"mouthedto"
,
"satelliteedto"
,
"agendaedto"
,
"liveredto"
,
"donoredto"
,
"orgyedto"
,
"decorationedto"
,
"kitedto"
,
"expenditureedto"
,
"printeredto"
,
"scandaledto"
,
"overwhelmedto"
,
"manageedto"
,
"exaggerateedto"
,
"revolutionedto"
,
"obeseedto"
,
"dueedto"
,
"possessionedto"
,
"rateedto"
,
"elephantedto"
,
"treatyedto"
,
"bucketedto"
,
"shameedto"
,
"palmedto"
,
"tractedto"
,
"chaosedto"
,
"gaspedto"
,
"trouseredto"
,
"heavenedto"
,
"idealedto"
,
"paralyzededto"
,
"uncleedto"
,
"parkingedto"
,
"wordedto"
,
"draweredto"
,
"memberedto"
,
"rootedto"
,
"colonedto"
,
"thighedto"
,
"jawedto"
,
"unfairedto"
,
"brideedto"
,
"detailedto"
,
"elapseedto"
,
"perforateedto"
,
"faintedto"
,
"skipedto"
,
"rejectedto"
,
"exceededto"
,
"aisleedto"
,
"hallwayedto"
,
"passageedto"
,
"passionedto"
,
"grazeedto"
,
"pastureedto"
,
"patentedto"
,
"routeedto"
,
"terraceedto"
,
"nationalistedto"
,
"nationalismedto"
,
"syndromeedto"
,
"hesitateedto"
,
"pauseedto"
,
"wageedto"
,
"pensionedto"
,
"royaltyedto"
,
"rentedto"
,
"peaceedto"
,
"furedto"
,
"punishedto"
,
"retireeedto"
,
"populationedto"
,
"hearedto"
,
"observeredto"
,
"percentedto"
,
"insightedto"
,
"absoluteedto"
,
"benefitedto"
,
"performeredto"
,
"centuryedto"
,
"magazineedto"
,
"cycleedto"
,
"dieedto"
,
"allowedto"
,
"verticaledto"
,
"persistedto"
,
"remainedto"
,
"porteredto"
,
"rideredto"
,
"conductoredto"
,
"vegetarianedto"
,
"virginedto"
,
"slaveedto"
,
"patientedto"
,
"witnessedto"
,
"consumeredto"
,
"workeredto"
,
"heroedto"
,
"radicaledto"
,
"personalityedto"
,
"pinedto"
,
"manneredto"
,
"staffedto"
,
"sweatedto"
,
"basicedto"
,
"operationaledto"
,
"dramaticedto"
,
"throatedto"
,
"telephoneedto"
,
"photographedto"
,
"cameraedto"
,
"wordingedto"
,
"evolutionedto"
,
"assaultedto"
,
"fitnessedto"
,
"sizeedto"
,
"shelteredto"
,
"physicsedto"
,
"brokenedto"
,
"prescriptionedto"
,
"collectedto"
,
"pluckedto"
,
"photographyedto"
,
"printedto"
,
"chalkedto"
,
"bededto"
,
"fieldedto"
,
"mechanismedto"
,
"stereotypeedto"
,
"tabletedto"
,
"dismissaledto"
,
"organedto"
,
"urineedto"
,
"slantedto"
,
"arenaedto"
,
"buryedto"
,
"insertedto"
,
"mosqueedto"
,
"sowedto"
,
"addressedto"
,
"putedto"
,
"arrangementedto"
,
"positionedto"
,
"braidedto"
,
"layoutedto"
,
"biologyedto"
,
"floweredto"
,
"houseplantedto"
,
"fossiledto"
,
"weededto"
,
"sculptureedto"
,
"paneledto"
,
"penedto"
,
"fragrantedto"
,
"attractiveedto"
,
"abundantedto"
,
"showeredto"
,
"featheredto"
,
"lootingedto"
,
"diveedto"
,
"assetedto"
,
"poetryedto"
,
"concessionedto"
,
"locationedto"
,
"extentedto"
,
"corneredto"
,
"arrowedto"
,
"officeredto"
,
"partyedto"
,
"ideologyedto"
,
"colonyedto"
,
"pyramidedto"
,
"baconedto"
,
"doseedto"
,
"partedto"
,
"portraitedto"
,
"easyedto"
,
"orientationedto"
,
"charismaticedto"
,
"beautifuledto"
,
"richedto"
,
"acquisitionedto"
,
"possibilityedto"
,
"stationedto"
,
"stampedto"
,
"tailedto"
,
"possibleedto"
,
"potentialedto"
,
"pocketedto"
,
"swarmedto"
,
"flouredto"
,
"hierarchyedto"
,
"blowedto"
,
"applicationedto"
,
"realismedto"
,
"sermonedto"
,
"priorityedto"
,
"exactedto"
,
"definiteedto"
,
"precisionedto"
,
"precedeedto"
,
"predatoredto"
,
"horoscopeedto"
,
"preferenceedto"
,
"racismedto"
,
"chauvinistedto"
,
"assumptionedto"
,
"absorptionedto"
,
"trainingedto"
,
"bakeedto"
,
"readyedto"
,
"prevalenceedto"
,
"giftedto"
,
"conservationedto"
,
"jamedto"
,
"administrationedto"
,
"presidencyedto"
,
"pushedto"
,
"lobbyedto"
,
"coerceedto"
,
"gloryedto"
,
"prestigeedto"
,
"assumeedto"
,
"imposteredto"
,
"mainstreamedto"
,
"quotationedto"
,
"discountedto"
,
"chimpanzeeedto"
,
"crudeedto"
,
"formedto"
,
"prisonedto"
,
"hostageedto"
,
"coachedto"
,
"privacyedto"
,
"awardedto"
,
"likelyedto"
,
"investigationedto"
,
"processedto"
,
"gradualedto"
,
"perceptionedto"
,
"announcementedto"
,
"manufactureredto"
,
"professoredto"
,
"uniformedto"
,
"professionaledto"
,
"chairedto"
,
"techniqueedto"
,
"gainedto"
,
"offspringedto"
,
"forecastedto"
,
"forbidedto"
,
"banedto"
,
"missileedto"
,
"predictionedto"
,
"sustainedto"
,
"pledgeedto"
,
"marketingedto"
,
"remindedto"
,
"launchedto"
,
"pitchedto"
,
"advocateedto"
,
"quotaedto"
,
"adviceedto"
,
"suggestedto"
,
"owneredto"
,
"protectionedto"
,
"demonstratoredto"
,
"prideedto"
,
"entertainedto"
,
"feededto"
,
"stateedto"
,
"souledto"
,
"analysisedto"
,
"analystedto"
,
"psychologyedto"
,
"sensationedto"
,
"forumedto"
,
"publicityedto"
,
"riotedto"
,
"editionedto"
,
"promotionedto"
,
"publisheredto"
,
"pooledto"
,
"dragedto"
,
"extractedto"
,
"penaltyedto"
,
"studentedto"
,
"buyedto"
,
"hobbyedto"
,
"buttonedto"
,
"advertiseedto"
,
"layedto"
,
"instaledto"
,
"installedto"
,
"executeedto"
,
"nominateedto"
,
"earthquakeedto"
,
"dilemmaedto"
,
"preyedto"
,
"satisfiededto"
,
"pursuitedto"
,
"problemedto"
,
"quietedto"
,
"silenceedto"
,
"fractionedto"
,
"radioedto"
,
"radiationedto"
,
"railcaredto"
,
"railroadedto"
,
"stormedto"
,
"rainedto"
,
"breededto"
,
"buildedto"
,
"noiseedto"
,
"knockedto"
,
"rapeedto"
,
"ecstasyedto"
,
"rankedto"
,
"preparationedto"
,
"realityedto"
,
"backedto"
,
"beneficiaryedto"
,
"mutualedto"
,
"appreciateedto"
,
"realizeedto"
,
"tolerateedto"
,
"referraledto"
,
"compensationedto"
,
"documentedto"
,
"matrixedto"
,
"correctionedto"
,
"recoveredto"
,
"lossedto"
,
"rededto"
,
"redundancyedto"
,
"polishedto"
,
"sugaredto"
,
"elegantedto"
,
"mirroredto"
,
"reflectionedto"
,
"asylumedto"
,
"garbageedto"
,
"popularedto"
,
"continentaledto"
,
"nationaledto"
,
"presidentialedto"
,
"constitutionaledto"
,
"imperialedto"
,
"culturaledto"
,
"economicedto"
,
"magneticedto"
,
"moraledto"
,
"environmentaledto"
,
"ratioedto"
,
"relationedto"
,
"relevanceedto"
,
"faithedto"
,
"commentedto"
,
"commemorateedto"
,
"retainedto"
,
"shaveedto"
,
"relinquishedto"
,
"restorationedto"
,
"leaseedto"
,
"tenantedto"
,
"fixedto"
,
"mealedto"
,
"refundedto"
,
"repetitionedto"
,
"regretedto"
,
"substituteedto"
,
"reproductionedto"
,
"answeredto"
,
"storageedto"
,
"recycleedto"
,
"reptileedto"
,
"horroredto"
,
"researcheredto"
,
"qualificationedto"
,
"palaceedto"
,
"communityedto"
,
"ashedto"
,
"immuneedto"
,
"conservativeedto"
,
"tolerantedto"
,
"pneumoniaedto"
,
"lungedto"
,
"feedbackedto"
,
"kneeledto"
,
"brakeedto"
,
"constraintedto"
,
"resultedto"
,
"revivaledto"
,
"reviveedto"
,
"retaileredto"
,
"outletedto"
,
"revengeedto"
,
"withdrawedto"
,
"rememberedto"
,
"echoedto"
,
"oppositeedto"
,
"readeredto"
,
"reinforceedto"
,
"wealthedto"
,
"jockeyedto"
,
"entitlementedto"
,
"copyrightedto"
,
"optionedto"
,
"fruitedto"
,
"rearedto"
,
"inflationedto"
,
"ventureedto"
,
"ritualedto"
,
"gownedto"
,
"rockedto"
,
"kitchenedto"
,
"suiteedto"
,
"rotationedto"
,
"pathedto"
,
"roadedto"
,
"carpetedto"
,
"rugbyedto"
,
"finishededto"
,
"flowedto"
,
"countryedto"
,
"countrysideedto"
,
"undermineedto"
,
"salespersonedto"
,
"greetingedto"
,
"ironyedto"
,
"moonedto"
,
"strolledto"
,
"flavoredto"
,
"prayedto"
,
"dictateedto"
,
"expressionedto"
,
"strikebreakeredto"
,
"frightenedto"
,
"sprayedto"
,
"landscapeedto"
,
"schemeedto"
,
"systemedto"
,
"scholaredto"
,
"sessionedto"
,
"classroomedto"
,
"forestryedto"
,
"scienceedto"
,
"despiseedto"
,
"scratchedto"
,
"conscienceedto"
,
"bronzeedto"
,
"gossipedto"
,
"harboredto"
,
"seekedto"
,
"coastedto"
,
"endorseedto"
,
"mysteryedto"
,
"secretaryedto"
,
"patroledto"
,
"securityedto"
,
"visibleedto"
,
"seededto"
,
"recruitedto"
,
"questedto"
,
"transparentedto"
,
"geneedto"
,
"sectionedto"
,
"biteedto"
,
"electedto"
,
"pickedto"
,
"assertiveedto"
,
"vainedto"
,
"paradoxedto"
,
"willpoweredto"
,
"spontaneousedto"
,
"arrogantedto"
,
"dignityedto"
,
"autonomyedto"
,
"exportedto"
,
"greetedto"
,
"perceiveedto"
,
"humoredto"
,
"earedto"
,
"reasonableedto"
,
"sensitivityedto"
,
"detectoredto"
,
"discriminateedto"
,
"distantedto"
,
"barrieredto"
,
"scenarioedto"
,
"sequenceedto"
,
"seriesedto"
,
"snakeedto"
,
"waiteredto"
,
"establishededto"
,
"arrangeedto"
,
"apparatusedto"
,
"strictedto"
,
"stitchedto"
,
"faithfuledto"
,
"shadowedto"
,
"nuanceedto"
,
"feignedto"
,
"embarrassmentedto"
,
"disgraceedto"
,
"cylinderedto"
,
"edgeedto"
,
"bundleedto"
,
"bleededto"
,
"protectedto"
,
"budgeedto"
,
"reflectedto"
,
"horseshoeedto"
,
"beachedto"
,
"jacketedto"
,
"shortsedto"
,
"deficitedto"
,
"abridgeedto"
,
"injectionedto"
,
"strapedto"
,
"bragedto"
,
"proveedto"
,
"shrinkedto"
,
"bushedto"
,
"shiveredto"
,
"mixedto"
,
"ostracizeedto"
,
"closededto"
,
"templeedto"
,
"profileedto"
,
"digressedto"
,
"pavementedto"
,
"symboledto"
,
"meaningedto"
,
"importantedto"
,
"loveredto"
,
"velvetedto"
,
"flatwareedto"
,
"plainedto"
,
"stooledto"
,
"simplicityedto"
,
"honestedto"
,
"unitedto"
,
"sinedto"
,
"sisteredto"
,
"nunedto"
,
"sitedto"
,
"locateedto"
,
"ampleedto"
,
"magnitudeedto"
,
"surveyedto"
,
"slipedto"
,
"skillededto"
,
"scanedto"
,
"freckleedto"
,
"peeledto"
,
"omissionedto"
,
"captainedto"
,
"horizonedto"
,
"angleedto"
,
"killeredto"
,
"murderedto"
,
"bedroomedto"
,
"steakedto"
,
"stumbleedto"
,
"gaffeedto"
,
"slipperyedto"
,
"dipedto"
,
"slumpedto"
,
"slimeedto"
,
"snailedto"
,
"bulletedto"
,
"sleepedto"
,
"particleedto"
,
"berryedto"
,
"ponyedto"
,
"limitededto"
,
"packetedto"
,
"sampleedto"
,
"scrapedto"
,
"slotedto"
,
"compartmentedto"
,
"villageedto"
,
"minorityedto"
,
"fineedto"
,
"pettyedto"
,
"dashedto"
,
"smileedto"
,
"spotedto"
,
"trapedto"
,
"snatchedto"
,
"kidnapedto"
,
"snowedto"
,
"seriousedto"
,
"gregariousedto"
,
"antedto"
,
"welfareedto"
,
"socialistedto"
,
"civilizationedto"
,
"puddingedto"
,
"wormedto"
,
"casualtyedto"
,
"suspectedto"
,
"communicationedto"
,
"wreckedto"
,
"princeedto"
,
"resourceedto"
,
"monarchedto"
,
"bridgeedto"
,
"formationedto"
,
"shoutedto"
,
"snarledto"
,
"whisperedto"
,
"privilegeedto"
,
"audienceedto"
,
"hypothesizeedto"
,
"accentedto"
,
"tranceedto"
,
"spitedto"
,
"sectoredto"
,
"pepperedto"
,
"shededto"
,
"angeledto"
,
"divorceedto"
,
"divideedto"
,
"refereeedto"
,
"stainedto"
,
"expandedto"
,
"scatteredto"
,
"encourageedto"
,
"teamedto"
,
"wasteedto"
,
"crouchedto"
,
"jetedto"
,
"crutchedto"
,
"staircaseedto"
,
"stakeedto"
,
"hauntedto"
,
"stemedto"
,
"stableedto"
,
"normedto"
,
"sunedto"
,
"beginedto"
,
"situationedto"
,
"safetyedto"
,
"relationshipedto"
,
"relianceedto"
,
"isolationedto"
,
"sayedto"
,
"declarationedto"
,
"formulaedto"
,
"rungedto"
,
"waitedto"
,
"lodgeedto"
,
"constantedto"
,
"plagiarizeedto"
,
"ladderedto"
,
"stayedto"
,
"pierceedto"
,
"muggyedto"
,
"miscarriageedto"
,
"shareholderedto"
,
"sockedto"
,
"plugedto"
,
"shopedto"
,
"straightenedto"
,
"strategicedto"
,
"wanderedto"
,
"banneredto"
,
"trolleyedto"
,
"struggleedto"
,
"stretchedto"
,
"hitedto"
,
"kickedto"
,
"stunningedto"
,
"guitaredto"
,
"ribbonedto"
,
"convictionedto"
,
"emotionedto"
,
"vigorousedto"
,
"cableedto"
,
"toweredto"
,
"nestedto"
,
"auditoredto"
,
"tripedto"
,
"fashionableedto"
,
"chapteredto"
,
"paragraphedto"
,
"soakedto"
,
"replaceedto"
,
"suburbedto"
,
"brainstormedto"
,
"inspirationedto"
,
"evokeedto"
,
"indicationedto"
,
"properedto"
,
"sulphuredto"
,
"budgetedto"
,
"sumedto"
,
"overviewedto"
,
"summeredto"
,
"summitedto"
,
"superintendentedto"
,
"miracleedto"
,
"dinneredto"
,
"bagedto"
,
"prayeredto"
,
"cateredto"
,
"inspireedto"
,
"provideedto"
,
"provisionedto"
,
"shelfedto"
,
"pieredto"
,
"inhibitionedto"
,
"overchargeedto"
,
"certainedto"
,
"excessedto"
,
"deputyedto"
,
"replacementedto"
,
"defendantedto"
,
"chocolateedto"
,
"swelledto"
,
"dooredto"
,
"shiftedto"
,
"swopedto"
,
"understandingedto"
,
"interactiveedto"
,
"calendaredto"
,
"researchedto"
,
"saltedto"
,
"tableedto"
,
"undertakeedto"
,
"tacticedto"
,
"breatheedto"
,
"insistedto"
,
"injectedto"
,
"eatedto"
,
"absorbedto"
,
"insureedto"
,
"participateedto"
,
"musicaledto"
,
"conversationedto"
,
"discussedto"
,
"treeedto"
,
"suntanedto"
,
"candleedto"
,
"dutyedto"
,
"assignmentedto"
,
"jobedto"
,
"blandedto"
,
"taxedto"
,
"speciesedto"
,
"instructionedto"
,
"tearedto"
,
"rhetoricedto"
,
"televisionedto"
,
"moodedto"
,
"dispositionedto"
,
"paceedto"
,
"loanedto"
,
"trendedto"
,
"strainedto"
,
"fingeredto"
,
"abortionedto"
,
"districtedto"
,
"panicedto"
,
"examinationedto"
,
"willedto"
,
"tributeedto"
,
"recommendationedto"
,
"leashedto"
,
"textedto"
,
"gratefuledto"
,
"tragedyedto"
,
"theoristedto"
,
"sliceedto"
,
"mistedto"
,
"nailedto"
,
"layeredto"
,
"threadedto"
,
"diluteedto"
,
"combinationedto"
,
"thoughtedto"
,
"spineedto"
,
"ideaedto"
,
"brinkedto"
,
"flourishedto"
,
"flingedto"
,
"confuseedto"
,
"boltedto"
,
"relateedto"
,
"bindedto"
,
"leanedto"
,
"occasionedto"
,
"youthedto"
,
"reignedto"
,
"seasonedto"
,
"clockedto"
,
"shyedto"
,
"canedto"
,
"toppleedto"
,
"tiptoeedto"
,
"frogedto"
,
"labouredto"
,
"itemedto"
,
"liberaledto"
,
"graveedto"
,
"toneedto"
,
"knifeedto"
,
"drilledto"
,
"dentistedto"
,
"roofedto"
,
"placeedto"
,
"tumbleedto"
,
"agonyedto"
,
"tortureedto"
,
"addedto"
,
"tournamentedto"
,
"dolledto"
,
"dealeredto"
,
"mythedto"
,
"treadedto"
,
"transferedto"
,
"transformedto"
,
"freightedto"
,
"fareedto"
,
"transportedto"
,
"rubbishedto"
,
"flyedto"
,
"swimedto"
,
"visitedto"
,
"rehabilitationedto"
,
"juryedto"
,
"triangleedto"
,
"victoryedto"
,
"prizeedto"
,
"gutteredto"
,
"truthedto"
,
"loyaltyedto"
,
"vatedto"
,
"pipeedto"
,
"stomachedto"
,
"tumouredto"
,
"rotateedto"
,
"ivoryedto"
,
"dozenedto"
,
"yearedto"
,
"dayedto"
,
"pairedto"
,
"coupleedto"
,
"tropicaledto"
,
"incredibleedto"
,
"uncertaintyedto"
,
"revealedto"
,
"vagueedto"
,
"spyedto"
,
"caveedto"
,
"underlineedto"
,
"bottomedto"
,
"minimizeedto"
,
"projectedto"
,
"unlikeedto"
,
"uniqueedto"
,
"surpriseedto"
,
"discriminationedto"
,
"thawedto"
,
"continuousedto"
,
"lessonedto"
,
"tonedto"
,
"consolidateedto"
,
"globaledto"
,
"differentedto"
,
"volunteeredto"
,
"artificialedto"
,
"liveedto"
,
"dangerousedto"
,
"invisibleedto"
,
"blindedto"
,
"roughedto"
,
"crisisedto"
,
"frozenedto"
,
"prematureedto"
,
"strangeedto"
,
"illnessedto"
,
"unawareedto"
,
"folkloreedto"
,
"promoteedto"
,
"hilariousedto"
,
"nightmareedto"
,
"urgencyedto"
,
"sweepedto"
,
"walkedto"
,
"mechanicaledto"
,
"usefuledto"
,
"sighedto"
,
"threatenedto"
,
"vacuumedto"
,
"valleyedto"
,
"evaluateedto"
,
"worthedto"
,
"disappearedto"
,
"variableedto"
,
"variantedto"
,
"broccoliedto"
,
"vegetableedto"
,
"vanedto"
,
"rocketedto"
,
"embarkedto"
,
"promiseedto"
,
"poemedto"
,
"peakedto"
,
"bottleedto"
,
"veteranedto"
,
"neighborhoodedto"
,
"winneredto"
,
"videoedto"
,
"competeedto"
,
"wakeedto"
,
"energyedto"
,
"activeedto"
,
"ghostedto"
,
"sightedto"
,
"touristedto"
,
"appearanceedto"
,
"colorfuledto"
,
"visionedto"
,
"singeredto"
,
"sopranoedto"
,
"intentionedto"
,
"bookedto"
,
"electionedto"
,
"ballotedto"
,
"exposureedto"
,
"betedto"
,
"waistedto"
,
"queueedto"
,
"loungeedto"
,
"hikeedto"
,
"strideedto"
,
"pedestrianedto"
,
"caneedto"
,
"deprivationedto"
,
"waredto"
,
"birdedto"
,
"guaranteeedto"
,
"laundryedto"
,
"basinedto"
,
"passwordedto"
,
"fountainedto"
,
"streamedto"
,
"vesseledto"
,
"acidedto"
,
"fluctuationedto"
,
"methodedto"
,
"lifestyleedto"
,
"gunedto"
,
"cryedto"
,
"validedto"
,
"familiaredto"
,
"wagonedto"
,
"sniffedto"
,
"linenedto"
,
"extendedto"
,
"pigeonedto"
,
"wildernessedto"
,
"winteredto"
,
"hopeedto"
,
"retirementedto"
,
"fadeedto"
,
"expressedto"
,
"feminineedto"
,
"feministedto"
,
"forestedto"
,
"courtshipedto"
,
"sheepedto"
,
"termedto"
,
"formulateedto"
,
"solveedto"
,
"employeeedto"
,
"studioedto"
,
"declineedto"
,
"respectableedto"
,
"acceptableedto"
,
"miseryedto"
,
"composeedto"
,
"wriggleedto"
,
"scriptedto"
,
"messageedto"
,
"offenderedto"
,
"sausageedto"
,
"photocopyedto"
,
"annualedto"
,
"screamedto"
,
"amberedto"
,
"calfedto"
,
"kidedto"
,
"boyedto"
,
"lambedto"
,
"junioredto"
,
"youngedto"
,
"breezeedto"
,
"earthflaxedto"
,
"earthwaxedto"
,
"earwaxedto"
,
"eauxedto"
,
"econoboxedto"
,
"effluxedto"
,
"emboxedto"
,
"enfixedto"
,
"epicalyxedto"
,
"equinoxedto"
,
"exedto"
,
"executrixedto"
,
"quaintedto"
,
"tomorrowedto"
,
"nearestedto"
,
"cookiesedto"
,
"bornedto"
,
"steppededto"
,
"fallenedto"
,
"togetheredto"
,
"threwedto"
,
"stoveedto"
,
"suchedto"
,
"yellowedto"
,
"nationedto"
,
"yesterdayedto"
,
"whistleedto"
,
"longeredto"
,
"clothedto"
,
"primitiveedto"
,
"insteadedto"
,
"feetedto"
,
"entireedto"
,
"settingedto"
,
"gaveedto"
,
"layersedto"
,
"hardlyedto"
,
"stoneedto"
,
"teethedto"
,
"drivingedto"
,
"hiddenedto"
,
"beingedto"
,
"atomedto"
,
"ropeedto"
,
"universeedto"
,
"birdsedto"
,
"greatlyedto"
,
"studyingedto"
,
"slopeedto"
,
"thatedto"
,
"needsedto"
,
"wiseedto"
,
"fullyedto"
,
"apartmentedto"
,
"gettingedto"
,
"earlieredto"
,
"soldedto"
,
"whatedto"
,
"ladyedto"
,
"childrenedto"
,
"shorteredto"
,
"specificedto"
,
"untiledto"
,
"interioredto"
,
"boxedto"
,
"weatheredto"
,
"traveledto"
,
"famousedto"
,
"stairsedto"
,
"centedto"
,
"headededto"
,
"incomeedto"
,
"afraidedto"
,
"fortyedto"
,
"factedto"
,
"nothingedto"
,
"announcededto"
,
"everyedto"
,
"eventuallyedto"
,
"noneedto"
,
"fairlyedto"
,
"explanationedto"
,
"goneedto"
,
"shirtedto"
,
"militaryedto"
,
"biggestedto"
,
"hatedto"
,
"southernedto"
,
"thereedto"
,
"partsedto"
,
"naturaledto"
,
"feathersedto"
,
"thoughedto"
,
"sidesedto"
,
"grewedto"
,
"completelyedto"
,
"fartheredto"
,
"rubberedto"
,
"anythingedto"
,
"happyedto"
,
"localedto"
,
"elevenedto"
,
"worseedto"
,
"whaleedto"
,
"wouldedto"
,
"blewedto"
,
"thanedto"
,
"himedto"
,
"sillyedto"
,
"teaedto"
,
"gooseedto"
,
"outedto"
,
"somethingedto"
,
"driededto"
,
"tobaccoedto"
,
"huntedto"
,
"fromedto"
,
"pluraledto"
,
"laidedto"
,
"everybodyedto"
,
"observeedto"
,
"perhapsedto"
,
"partlyedto"
,
"simplestedto"
,
"acresedto"
,
"chosenedto"
,
"hearingedto"
,
"mightedto"
,
"nearlyedto"
,
"choseedto"
,
"becameedto"
,
"neveredto"
,
"wereedto"
,
"aboutedto"
,
"consonantedto"
,
"variousedto"
,
"whomedto"
,
"scientificedto"
,
"authoredto"
,
"alikeedto"
,
"stiffedto"
,
"foreignedto"
,
"goldenedto"
,
"shownedto"
,
"setsedto"
,
"hungedto"
,
"withinedto"
,
"boneedto"
,
"shouldedto"
,
"happenededto"
,
"silentedto"
,
"wheneveredto"
,
"frequentlyedto"
,
"hasedto"
,
"exclaimededto"
,
"swamedto"
,
"dirtedto"
,
"maybeedto"
,
"plannededto"
,
"tonightedto"
,
"tooedto"
,
"earthedto"
,
"nobodyedto"
,
"gulfedto"
,
"antsedto"
,
"furnitureedto"
,
"somebodyedto"
,
"graphedto"
,
"gentlyedto"
,
"depthedto"
,
"toyedto"
,
"peredto"
,
"anyedto"
,
"bowledto"
,
"hereedto"
,
"drewedto"
,
"kidsedto"
,
"furtheredto"
,
"earnedto"
,
"necessaryedto"
,
"afteredto"
,
"easilyedto"
,
"floatingedto"
,
"farmedto"
,
"excellentedto"
,
"deeplyedto"
,
"intoedto"
,
"yourselfedto"
,
"correctedto"
,
"foughtedto"
,
"importanceedto"
,
"nutsedto"
,
"troopsedto"
,
"eatenedto"
,
"massageedto"
,
"noonedto"
,
"whisperededto"
,
"biggeredto"
,
"highestedto"
,
"yesedto"
,
"porchedto"
,
"evidenceedto"
,
"asideedto"
,
"notededto"
,
"opportunityedto"
,
"keptedto"
,
"underedto"
,
"requireedto"
,
"actualedto"
,
"shipedto"
,
"halfwayedto"
,
"givenedto"
,
"quietlyedto"
,
"behindedto"
,
"emptyedto"
,
"tenedto"
,
"flameedto"
,
"clothingedto"
,
"didedto"
,
"sevenedto"
,
"adjectiveedto"
,
"grabbededto"
,
"upperedto"
,
"aloneedto"
,
"feltedto"
,
"suddenlyedto"
,
"saddleedto"
,
"twoedto"
,
"zipperedto"
,
"merelyedto"
,
"signaledto"
,
"ouredto"
,
"taskedto"
,
"ranedto"
,
"eventedto"
,
"believededto"
,
"throughedto"
,
"properlyedto"
,
"agoedto"
,
"doingedto"
,
"skilledto"
,
"costedto"
,
"madeedto"
,
"caughtedto"
,
"possiblyedto"
,
"themselvesedto"
,
"shinningedto"
,
"labeledto"
,
"dustedto"
,
"mentaledto"
,
"forgottenedto"
,
"beganedto"
,
"suddenedto"
,
"talledto"
,
"carefullyedto"
,
"upwardedto"
,
"independentedto"
,
"alongedto"
,
"mysteriousedto"
,
"gatheredto"
,
"betteredto"
,
"journeyedto"
,
"sonedto"
,
"bothedto"
,
"oxygenedto"
,
"sentedto"
,
"anybodyedto"
,
"beautyedto"
,
"failededto"
,
"policeedto"
,
"songedto"
,
"zuluedto"
,
"slightedto"
,
"overedto"
,
"cannotedto"
,
"couldedto"
,
"fliesedto"
,
"enoughedto"
,
"everywhereedto"
,
"butedto"
,
"woreedto"
,
"connectededto"
,
"continuededto"
,
"mustedto"
,
"missionedto"
,
"magnetedto"
,
"rhymeedto"
,
"risingedto"
,
"impossibleedto"
,
"whoedto"
,
"aloudedto"
,
"birthedto"
,
"thingedto"
,
"speakedto"
,
"menedto"
,
"excitingedto"
,
"tideedto"
,
"lyingedto"
,
"sameedto"
,
"slightlyedto"
,
"everythingedto"
,
"leavingedto"
,
"pondedto"
,
"modernedto"
,
"earlyedto"
,
"noredto"
,
"particularlyedto"
,
"anywhereedto"
,
"buriededto"
,
"drawnedto"
,
"sadedto"
,
"westernedto"
,
"ateedto"
,
"townedto"
,
"noddededto"
,
"neighboredto"
,
"milkedto"
,
"shellsedto"
,
"helpfuledto"
,
"previousedto"
,
"motionedto"
,
"stoodedto"
,
"fastenededto"
,
"searchedto"
,
"extraedto"
,
"spentedto"
,
"aboveedto"
,
"broughtedto"
,
"inventededto"
,
"donkeyedto"
,
"stuckedto"
,
"instanceedto"
,
"quicklyedto"
,
"happilyedto"
,
"magicedto"
,
"handleedto"
,
"marriededto"
,
"gentleedto"
,
"removeedto"
,
"discussionedto"
,
"fortedto"
,
"towardedto"
,
"newspaperedto"
,
"sweptedto"
,
"beyondedto"
,
"miceedto"
,
"obtainedto"
,
"moreedto"
,
"pineedto"
,
"oneedto"
,
"zebraedto"
,
"whichedto"
,
"plusedto"
,
"tornedto"
,
"particlesedto"
,
"perfectlyedto"
,
"becomeedto"
,
"whateveredto"
,
"wrappededto"
,
"exactlyedto"
,
"boundedto"
,
"circusedto"
,
"angryedto"
,
"eightedto"
,
"clearlyedto"
,
"fededto"
,
"chamberedto"
,
"runningedto"
,
"brightedto"
,
"compareedto"
,
"cameedto"
,
"wishedto"
,
"secretedto"
,
"whoseedto"
,
"paleedto"
,
"nowedto"
,
"supperedto"
,
"forthedto"
,
"starededto"
,
"musicedto"
,
"equallyedto"
,
"fasteredto"
,
"fourthedto"
,
"amongedto"
,
"heredto"
,
"herselfedto"
,
"alreadyedto"
,
"attachededto"
,
"eachedto"
,
"clawsedto"
,
"greateredto"
,
"nearbyedto"
,
"itselfedto"
,
"nounedto"
,
"ridingedto"
,
"canaledto"
,
"livingedto"
,
"lededto"
,
"pinkedto"
,
"bestedto"
,
"accordingedto"
,
"unknownedto"
,
"occuredto"
,
"ruleredto"
,
"laughedto"
,
"typicaledto"
,
"todayedto"
,
"studiededto"
,
"saidedto"
,
"liquidedto"
,
"darknessedto"
,
"brassedto"
,
"swimmingedto"
,
"lateredto"
,
"graduallyedto"
,
"notedto"
,
"equipmentedto"
,
"valuableedto"
,
"probablyedto"
,
"lifeedto"
,
"continentedto"
,
"typeedto"
,
"someoneedto"
,
"myselfedto"
,
"shakingedto"
,
"platesedto"
,
"steadyedto"
,
"thusedto"
,
"phraseedto"
,
"aroundedto"
,
"blanketedto"
,
"vesselsedto"
,
"vastedto"
,
"alsoedto"
,
"changingedto"
,
"loweredto"
,
"mayedto"
,
"metedto"
,
"twentyedto"
,
"anotheredto"
,
"gladedto"
,
"rapidlyedto"
,
"heardedto"
,
"dotedto"
,
"grayedto"
,
"curiousedto"
,
"wetedto"
,
"verbedto"
,
"busyedto"
,
"successfuledto"
,
"thirdedto"
,
"foundedto"
,
"mineralsedto"
,
"themedto"
,
"aboardedto"
,
"alledto"
,
"thyedto"
,
"wooledto"
,
"entirelyedto"
,
"againedto"
,
"laboredto"
,
"substanceedto"
,
"rodedto"
,
"raysedto"
,
"felledto"
,
"amountedto"
,
"knewedto"
,
"leatheredto"
,
"recalledto"
,
"chemicaledto"
,
"aheadedto"
,
"mostlyedto"
,
"ontoedto"
,
"organizationedto"
,
"introducededto"
,
"customsedto"
,
"thoseedto"
,
"refusededto"
,
"actuallyedto"
,
"correctlyedto"
,
"becauseedto"
,
"petedto"
,
"fightingedto"
,
"declarededto"
,
"motoredto"
,
"greatestedto"
,
"leastedto"
,
"successedto"
,
"helloedto"
,
"barnedto"
,
"theseedto"
,
"buffaloedto"
,
"alphabetedto"
,
"zooedto"
,
"joinedto"
,
"veryedto"
,
"butteredto"
,
"fifteenedto"
,
"sinceedto"
,
"breathedto"
,
"drivenedto"
,
"puttingedto"
,
"principaledto"
,
"alchemyedto"
,
"anarchyedto"
,
"anechoicedto"
,
"antennaedto"
,
"auroraedto"
,
"azureedto"
,
"balsamedto"
,
"bazaaredto"
,
"belovededto"
,
"blissedto"
,
"bravadoedto"
,
"brimstoneedto"
,
"cadenceedto"
,
"cathodeedto"
,
"caviaredto"
,
"chivalryedto"
,
"chutzpahedto"
,
"cobaltedto"
,
"cobbleredto"
,
"cobblestoneedto"
,
"cognacedto"
,
"cynosureedto"
,
"daffodiledto"
,
"dandelionedto"
,
"decibeledto"
,
"dewdropedto"
,
"diligenceedto"
,
"edictedto"
,
"epicureanedto"
,
"equinoxedto"
,
"etherealedto"
,
"exodusedto"
,
"fjordedto"
,
"flairedto"
,
"flamboyantedto"
,
"floraedto"
,
"fluorescentedto"
,
"fractaledto"
,
"gossameredto"
,
"guildedto"
,
"halcyonedto"
,
"hegemonyedto"
,
"hemoglobinedto"
,
"hibernateedto"
,
"idiosyncrasyedto"
,
"igneousedto"
,
"incognitoedto"
,
"infrastructureedto"
,
"jovialedto"
,
"jubileeedto"
,
"kineticedto"
,
"kioskedto"
,
"lagoonedto"
,
"lavaedto"
,
"libertarianedto"
,
"lilacedto"
,
"liltedto"
,
"maverickedto"
,
"medleyedto"
,
"mesmerizeedto"
,
"metropolisedto"
,
"miasmaedto"
,
"mnemonicedto"
,
"mysticedto"
,
"nemesesedto"
,
"neutronedto"
,
"nirvanaedto"
,
"noxiousedto"
,
"oasisedto"
,
"omnipotentedto"
,
"opaledto"
,
"optimismedto"
,
"papyrusedto"
,
"paradoxedto"
,
"phantomedto"
,
"phosphorescentedto"
,
"plutoniumedto"
,
"poltroonedto"
,
"prismedto"
,
"quasaredto"
,
"quintessenceedto"
,
"quixoticedto"
,
"rhapsodyedto"
,
"serendipityedto"
,
"solsticeedto"
,
"sonorousedto"
,
"spectrumedto"
,
"tachyonedto"
,
"terracottaedto"
,
"threnodyedto"
,
"transcendedto"
,
"turquoiseedto"
,
"ubiquitousedto"
,
"unicornedto"
,
"vacuumedto"
,
"vortexedto"
,
"vividedto"
,
"willowedto"
,
"wisdomedto"
,
"xenonedto"
,
"yinedto"
,
"yogaedto"
,
"zeitgeistedto"
,
"zephyredto"
]
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment