Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
言程序plus
dr_py
提交
c5326d5f
dr_py
项目概览
言程序plus
/
dr_py
与 Fork 源项目一致
Fork自
晚风拂柳颜 / dr_py
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
dr_py
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
c5326d5f
编写于
11月 23, 2022
作者:
H
hjdhnx
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
提交lib
上级
582ccb6e
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
443 addition
and
107 deletion
+443
-107
libs/alist.js
libs/alist.js
+77
-106
libs/alist.min.js
libs/alist.min.js
+1
-1
libs/nameOrder.js
libs/nameOrder.js
+187
-0
libs/sortName.js
libs/sortName.js
+178
-0
未找到文件。
libs/alist.js
浏览文件 @
c5326d5f
// import _ from 'https://underscorejs.org/underscore-esm-min.js'
import
{
distance
}
from
'
https://unpkg.com/fastest-levenshtein@1.0.16/esm/mod.js
'
import
{
getFirstLetterList
}
from
'
https://gitcode.net/qq_32394351/dr_py/-/raw/master/libs/pinyin_getFirstLetterList
.js
'
import
{
distance
}
from
'
https://unpkg.com/fastest-levenshtein@1.0.16/esm/mod.js
'
import
{
sortListByCN
}
from
'
https://unpkg.com/fastest-levenshtein@1.0.16/esm/mod
.js
'
/**
* alist js
...
...
@@ -440,7 +440,7 @@ function search(wd, quick) {
if
(
vhref
){
vhref
=
unescape
(
vhref
);
}
//
print(vhref);
print
(
vhref
);
if
(
excludeReg
.
test
(
vhref
)){
return
;
//跳过本次循环
}
...
...
@@ -499,124 +499,95 @@ function levenshteinDistance(str1, str2) {
return
100
-
100
*
distance
(
str1
,
str2
)
/
Math
.
max
(
str1
.
length
,
str2
.
length
);
}
// 首字母开头排序
const
sortListByFirst
=
(
vodList
,
key
)
=>
{
key
=
key
||
'
vod_name
'
;
// 名字以特殊符号开头的应用列表
const
symbol_list
=
[];
// 名字以中文开头的应用列表
const
cn_list
=
[];
// 名字以英文开头的应用列表
const
en_list
=
[];
// 名字以数字开头的应用列表
const
num_list
=
[];
vodList
.
forEach
((
vod
)
=>
{
const
{
vod_name
}
=
vod
;
//通过正则进行数据分类
if
(
/
[\u
4e00-
\u
9fa5
]
/
.
test
(
vod_name
[
0
]))
{
cn_list
.
push
(
vod
);
}
else
if
(
/
[
a-zA-Z
]
/
.
test
(
vod_name
[
0
]))
{
en_list
.
push
(
vod
);
}
else
if
(
/
[\d]
/
.
test
(
vod_name
[
0
]))
{
num_list
.
push
(
vod
);
}
else
{
symbol_list
.
push
(
vod
);
}
});
//按照要求的方式进行数据排序重组
const
newList
=
[
...
cn_list
.
sort
((
a
,
b
)
=>
a
.
vod_name
[
0
]?.
localeCompare
(
b
.
vod_name
[
0
])),
...
en_list
.
sort
((
a
,
b
)
=>
a
.
vod_name
[
0
].
localeCompare
(
b
.
vod_name
[
0
])),
//localeCompare可以不区分大小写的进行排序
...
num_list
.
sort
((
a
,
b
)
=>
a
.
vod_name
[
0
]
-
b
.
vod_name
[
0
]),
...
symbol_list
.
sort
((
a
,
b
)
=>
a
.
vod_name
[
0
]
-
b
.
vod_name
[
0
])
];
return
newList
};
// 判断字符串是否全是中文
function
isAllChinese
(
str
)
{
return
/^
[\u
4E00-
\u
9FA5
]
+$/
.
test
(
str
);
}
// 判断字符是否为中文
function
isChinese
(
char
)
{
return
/^
[\u
4E00-
\u
9FA5
]
$/
.
test
(
char
);
}
// 完整名称排序
const
sortListByName
=
(
vodList
,
key
,
order
)
=>
{
if
(
!
key
){
return
vodList
/**
* 自然排序
* ["第1集","第10集","第20集","第2集","1","2","10","12","23","01","02"].sort(naturalSort())
* @param options {{key,caseSensitive, order: string}}
*/
function
naturalSort
(
options
)
{
if
(
!
options
)
{
options
=
{};
}
order
=
order
||
'
asc
'
;
// 默认正序
let
ASCarr
=
vodList
.
sort
((
a
,
b
)
=>
{
a
=
a
[
key
];
b
=
b
[
key
];
// 数字排在字符串前面
if
(
typeof
a
===
'
number
'
&&
typeof
b
===
'
string
'
)
{
return
-
1
;
}
if
(
typeof
a
===
'
string
'
&&
typeof
b
===
'
number
'
)
{
return
1
;
return
function
(
a
,
b
)
{
if
(
options
.
key
){
a
=
a
[
options
.
key
];
b
=
b
[
options
.
key
];
}
var
EQUAL
=
0
;
var
GREATER
=
(
options
.
order
===
'
desc
'
?
-
1
:
1
);
var
SMALLER
=
-
GREATER
;
var
re
=
/
(
^-
?[
0-9
]
+
(\.?[
0-9
]
*
)[
df
]?
e
?[
0-9
]?
$|^0x
[
0-9a-f
]
+$|
[
0-9
]
+
)
/gi
;
var
sre
=
/
(
^
[
]
*|
[
]
*$
)
/g
;
var
dre
=
/
(
^
([\w
]
+,
?[\w
]
+
)?[\w
]
+,
?[\w
]
+
\d
+:
\d
+
(
:
\d
+
)?[\w
]?
|^
\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}
|^
\w
+,
\w
+
\d
+,
\d{4})
/
;
var
hre
=
/^0x
[
0-9a-f
]
+$/i
;
var
ore
=
/^0/
;
var
normalize
=
function
normalize
(
value
)
{
var
string
=
''
+
value
;
return
(
options
.
caseSensitive
?
string
:
string
.
toLowerCase
()
);
};
// 当存在非数字时
if
(
isNaN
(
a
)
||
isNaN
(
b
))
{
// 全汉字的排在非全汉字的后面
if
(
isAllChinese
(
a
)
&&
!
isAllChinese
(
b
))
{
return
1
;
}
// Normalize values to strings
var
x
=
normalize
(
a
).
replace
(
sre
,
''
)
||
''
;
var
y
=
normalize
(
b
).
replace
(
sre
,
''
)
||
''
;
if
(
!
isAllChinese
(
a
)
&&
isAllChinese
(
b
))
{
return
-
1
;
}
// chunk/tokenize
var
xN
=
x
.
replace
(
re
,
'
\
0$1
\
0
'
).
replace
(
/
\0
$/
,
''
).
replace
(
/^
\0
/
,
''
).
split
(
'
\
0
'
)
;
var
yN
=
y
.
replace
(
re
,
'
\
0$1
\
0
'
).
replace
(
/
\0
$/
,
''
).
replace
(
/^
\0
/
,
''
).
split
(
'
\
0
'
);
// 存在非数字的数据时,都转为字符串进行比较
a
=
a
.
toString
();
b
=
b
.
toString
();
// Return immediately if at least one of the values is empty.
if
(
!
x
&&
!
y
)
return
EQUAL
;
if
(
!
x
&&
y
)
return
GREATER
;
if
(
x
&&
!
y
)
return
SMALLER
;
let
result
=
0
;
// numeric, hex or date detection
var
xD
=
parseInt
(
x
.
match
(
hre
))
||
(
xN
.
length
!=
1
&&
x
.
match
(
dre
)
&&
Date
.
parse
(
x
));
var
yD
=
parseInt
(
y
.
match
(
hre
))
||
xD
&&
y
.
match
(
dre
)
&&
Date
.
parse
(
y
)
||
null
;
var
oFxNcL
,
oFyNcL
;
// 依次比较两个字符串的各项字符
for
(
let
index
=
0
;
index
<
((
a
.
length
-
b
.
length
)
?
b
.
length
:
a
.
length
);
index
++
)
{
// first try and sort Hex codes or Dates
if
(
yD
)
{
if
(
xD
<
yD
)
return
SMALLER
;
else
if
(
xD
>
yD
)
return
GREATER
;
}
// 汉字排在非汉字的后面
if
(
!
isChinese
(
a
[
index
])
&&
isChinese
(
b
[
index
]))
{
result
=
-
1
;
}
// natural sorting through split numeric strings and default strings
for
(
var
cLoc
=
0
,
numS
=
Math
.
max
(
xN
.
length
,
yN
.
length
);
cLoc
<
numS
;
cLoc
++
)
{
if
(
isChinese
(
a
[
index
])
&&
!
isChinese
(
b
[
index
]))
{
result
=
1
;
}
// find floats not starting with '0', string or 0 if not defined (Clint Priest)
oFxNcL
=
!
(
xN
[
cLoc
]
||
''
).
match
(
ore
)
&&
parseFloat
(
xN
[
cLoc
])
||
xN
[
cLoc
]
||
0
;
oFyNcL
=
!
(
yN
[
cLoc
]
||
''
).
match
(
ore
)
&&
parseFloat
(
yN
[
cLoc
])
||
yN
[
cLoc
]
||
0
;
// 若两个汉字进行比较,则比较他们的拼音首字母
if
(
isChinese
(
a
[
index
])
&&
isChinese
(
b
[
index
]))
{
let
pinyinA
=
getFirstLetterList
(
a
[
index
]).
toString
();
let
pinyinB
=
getFirstLetterList
(
b
[
index
]).
toString
();
// handle numeric vs string comparison - number < string - (Kyle Adams)
if
(
isNaN
(
oFxNcL
)
!==
isNaN
(
oFyNcL
))
return
(
isNaN
(
oFxNcL
))
?
GREATER
:
SMALLER
;
result
=
pinyinA
.
localeCompare
(
pinyinB
,
'
zh-Hans-CN
'
,
{
sensitivity
:
'
accent
'
});
}
// 若已经比较出结果,则跳出循环,不再继续比较剩余字符
if
(
result
!==
0
)
{
break
}
// rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'
else
if
(
typeof
oFxNcL
!==
typeof
oFyNcL
)
{
oFxNcL
+=
''
;
oFyNcL
+=
''
;
}
// 只要有一个无法转换为数字——转换为字符串进行比较——先按字符排序,然后按照数字排序
return
result
||
a
.
toString
().
localeCompare
(
b
.
toString
(),
'
zh-Hans-CN
'
,
{
sensitivity
:
'
accent
'
});
}
else
{
// 都能转换为数字——转换为数字进行比较——从小到大排序
return
Number
(
a
)
-
Number
(
b
);
if
(
oFxNcL
<
oFyNcL
)
return
SMALLER
;
if
(
oFxNcL
>
oFyNcL
)
return
GREATER
;
}
});
if
(
order
===
'
desc
'
){
ASCarr
.
reverse
();
return
EQUAL
;
};
}
// 完整名称排序
const
sortListByName
=
(
vodList
,
key
,
order
)
=>
{
if
(
!
key
){
return
vodList
}
return
ASCarr
order
=
order
||
'
asc
'
;
// 默认正序
// 排序键,顺序,区分大小写
return
vodList
.
sort
(
naturalSort
({
key
:
key
,
order
:
order
,
caseSensitive
:
true
}))
};
const
getTimeInt
=
(
timeStr
)
=>
{
...
...
libs/alist.min.js
浏览文件 @
c5326d5f
import
{
distance
}
from
"
https://unpkg.com/fastest-levenshtein@1.0.16/esm/mod.js
"
;
import
{
getFirstLetterList
}
from
"
https://gitcode.net/qq_32394351/dr_py/-/raw/master/libs/pinyin_getFirstLetterList.js
"
;
String
.
prototype
.
rstrip
=
function
(
chars
){
let
regex
=
new
RegExp
(
chars
+
"
$
"
);
return
this
.
replace
(
regex
,
""
)};
var
showMode
=
"
single
"
;
var
searchDriver
=
""
;
var
limit_search_show
=
200
;
var
search_type
=
""
;
var
detail_order
=
"
name
"
;
function
print
(
any
){
any
=
any
||
""
;
if
(
typeof
any
==
"
object
"
&&
Object
.
keys
(
any
).
length
>
0
){
try
{
any
=
JSON
.
stringify
(
any
);
console
.
log
(
any
)}
catch
(
e
){
console
.
log
(
typeof
any
+
"
:
"
+
any
.
length
)}}
else
if
(
typeof
any
==
"
object
"
&&
Object
.
keys
(
any
).
length
<
1
){
console
.
log
(
"
null object
"
)}
else
{
console
.
log
(
any
)}}
const
http
=
function
(
url
,
options
=
{}){
if
(
options
.
method
===
"
POST
"
&&
options
.
data
){
options
.
body
=
JSON
.
stringify
(
options
.
data
);
options
.
headers
=
Object
.
assign
({
"
content-type
"
:
"
application/json
"
},
options
.
headers
)}
const
res
=
req
(
url
,
options
);
res
.
json
=
()
=>
res
.
content
?
JSON
.
parse
(
res
.
content
):
null
;
res
.
text
=
()
=>
res
.
content
;
return
res
};[
"
get
"
,
"
post
"
].
forEach
(
method
=>
{
http
[
method
]
=
function
(
url
,
options
=
{}){
return
http
(
url
,
Object
.
assign
(
options
,{
method
:
method
.
toUpperCase
()}))}});
const
__drives
=
{};
function
isMedia
(
file
){
return
/
\.(
mp3|aac|wav|wma|cda|flac|m4a|mid|mka|mp2|mpa|mpc|ape|ofr|ogg|ra|wv|tta|ac3|dts|tak|webm|wmv|mpeg|mov|ram|swf|mp4|avi|rm|rmvb|flv|mpg|mkv|m3u8|ts|3gp|asf
)
$/
.
test
(
file
.
toLowerCase
())}
function
get_drives_path
(
tid
){
const
index
=
tid
.
indexOf
(
"
$
"
);
const
name
=
tid
.
substring
(
0
,
index
);
const
path
=
tid
.
substring
(
index
+
1
);
return
{
drives
:
get_drives
(
name
),
path
:
path
}}
function
get_drives
(
name
){
const
{
settings
,
api
,
server
}
=
__drives
[
name
];
if
(
settings
.
v3
==
null
){
settings
.
v3
=
false
;
const
data
=
http
.
get
(
server
+
"
/api/public/settings
"
).
json
().
data
;
if
(
Array
.
isArray
(
data
)){
settings
.
title
=
data
.
find
(
x
=>
x
.
key
===
"
title
"
)?.
value
;
settings
.
v3
=
false
;
settings
.
version
=
data
.
find
(
x
=>
x
.
key
===
"
version
"
)?.
value
;
settings
.
enableSearch
=
data
.
find
(
x
=>
x
.
key
===
"
enable search
"
)?.
value
===
"
true
"
}
else
{
settings
.
title
=
data
.
title
;
settings
.
v3
=
true
;
settings
.
version
=
data
.
version
;
settings
.
enableSearch
=
false
}
api
.
path
=
settings
.
v3
?
"
/api/fs/list
"
:
"
/api/public/path
"
;
api
.
file
=
settings
.
v3
?
"
/api/fs/get
"
:
"
/api/public/path
"
;
api
.
search
=
settings
.
v3
?
"
/api/public/search
"
:
"
/api/public/search
"
}
return
__drives
[
name
]}
function
init
(
ext
){
let
alist_data
=
ext
.
split
(
"
;
"
);
let
alist_data_url
=
alist_data
[
0
];
limit_search_show
=
alist_data
.
length
>
1
?
Number
(
alist_data
[
1
])
||
limit_search_show
:
limit_search_show
;
search_type
=
alist_data
.
length
>
2
?
alist_data
[
2
]:
search_type
;
const
data
=
http
.
get
(
alist_data_url
).
json
();
searchDriver
=
(
data
.
find
(
x
=>
x
.
search
)
||
{}).
name
||
""
;
data
.
forEach
(
item
=>
{
let
_path_param
=
[];
if
(
item
.
params
){
_path_param
=
Object
.
keys
(
item
.
params
);
_path_param
.
sort
((
a
,
b
)
=>
a
.
length
-
b
.
length
)}
__drives
[
item
.
name
]
=
{
name
:
item
.
name
,
server
:
item
.
server
.
endsWith
(
"
/
"
)?
item
.
server
.
rstrip
(
"
/
"
):
item
.
server
,
startPage
:
item
.
startPage
||
"
/
"
,
showAll
:
item
.
showAll
===
true
,
search
:
!!
item
.
search
,
params
:
item
.
params
||
{},
_path_param
:
_path_param
,
settings
:{},
api
:{},
getParams
(
path
){
const
key
=
this
.
_path_param
.
find
(
x
=>
path
.
startsWith
(
x
));
return
Object
.
assign
({},
this
.
params
[
key
],{
path
:
path
})},
getPath
(
path
){
const
res
=
http
.
post
(
this
.
server
+
this
.
api
.
path
,{
data
:
this
.
getParams
(
path
)}).
json
();
return
this
.
settings
.
v3
?
res
.
data
.
content
:
res
.
data
.
files
},
getFile
(
path
){
let
raw_url
=
this
.
server
+
"
/d
"
+
path
;
raw_url
=
encodeURI
(
raw_url
);
return
{
raw_url
:
raw_url
}},
isFolder
(
data
){
return
data
.
type
===
1
},
isVideo
(
data
){
return
this
.
settings
.
v3
?
data
.
type
===
2
:
data
.
type
===
3
},
is_subt
(
data
){
if
(
data
.
type
===
1
){
return
false
}
const
ext
=
/
\.(
srt|ass|scc|stl|ttml
)
$/
;
return
ext
.
test
(
data
.
name
)},
getPic
(
data
){
let
pic
=
this
.
settings
.
v3
?
data
.
thumb
:
data
.
thumbnail
;
return
pic
||
(
this
.
isFolder
(
data
)?
"
http://img1.3png.com/281e284a670865a71d91515866552b5f172b.png
"
:
""
)},
getTime
(
data
,
isStandard
){
isStandard
=
isStandard
||
false
;
try
{
let
tTime
=
data
.
updated_at
||
data
.
time_str
||
data
.
modified
||
""
;
let
date
=
""
;
if
(
tTime
){
tTime
=
tTime
.
split
(
"
T
"
);
date
=
tTime
[
0
];
if
(
isStandard
){
date
=
date
.
replace
(
/-/g
,
"
/
"
)}
tTime
=
tTime
[
1
].
split
(
/Z|
\.
/
);
date
+=
"
"
+
tTime
[
0
]}
return
date
}
catch
(
e
){
return
""
}}}});
print
(
"
init执行完毕
"
)}
function
home
(
filter
){
let
classes
=
Object
.
keys
(
__drives
).
map
(
key
=>
({
type_id
:
`
${
key
}
$
${
__drives
[
key
].
startPage
}
`
,
type_name
:
key
,
type_flag
:
"
1
"
}));
let
filter_dict
=
{};
let
filters
=
[{
key
:
"
order
"
,
name
:
"
排序
"
,
value
:[{
n
:
"
名称⬆️
"
,
v
:
"
vod_name_asc
"
},{
n
:
"
名称⬇️
"
,
v
:
"
vod_name_desc
"
},{
n
:
"
时间⬆️
"
,
v
:
"
vod_time_asc
"
},{
n
:
"
时间⬇️
"
,
v
:
"
vod_time_desc
"
},{
n
:
"
大小⬆️
"
,
v
:
"
vod_size_asc
"
},{
n
:
"
大小⬇️
"
,
v
:
"
vod_size_desc
"
},{
n
:
"
无
"
,
v
:
"
none
"
}]},{
key
:
"
show
"
,
name
:
"
播放展示
"
,
value
:[{
n
:
"
单集
"
,
v
:
"
single
"
},{
n
:
"
全集
"
,
v
:
"
all
"
}]}];
classes
.
forEach
(
it
=>
{
filter_dict
[
it
.
type_id
]
=
filters
});
print
(
"
----home----
"
);
print
(
classes
);
return
JSON
.
stringify
({
class
:
classes
,
filters
:
filter_dict
})}
function
homeVod
(
params
){
return
JSON
.
stringify
({
list
:[]})}
function
category
(
tid
,
pg
,
filter
,
extend
){
let
{
drives
,
path
}
=
get_drives_path
(
tid
);
const
id
=
tid
.
endsWith
(
"
/
"
)?
tid
:
tid
+
"
/
"
;
const
list
=
drives
.
getPath
(
path
);
let
subList
=
[];
let
vodFiles
=
[];
let
allList
=
[];
list
.
forEach
(
item
=>
{
if
(
drives
.
is_subt
(
item
)){
subList
.
push
(
item
.
name
)}
if
(
!
drives
.
showAll
&&!
drives
.
isFolder
(
item
)
&&!
drives
.
isVideo
(
item
)){
return
}
let
vod_time
=
drives
.
getTime
(
item
);
let
vod_size
=
get_size
(
item
.
size
);
let
remark
=
vod_time
.
split
(
"
"
)[
0
].
substr
(
3
)
+
"
\t
"
+
vod_size
;
const
vod
=
{
vod_id
:
id
+
item
.
name
+
(
drives
.
isFolder
(
item
)?
"
/
"
:
""
),
vod_name
:
item
.
name
.
replaceAll
(
"
$
"
,
""
).
replaceAll
(
"
#
"
,
""
),
vod_pic
:
drives
.
getPic
(
item
),
vod_time
:
vod_time
,
vod_size
:
item
.
size
,
vod_tag
:
drives
.
isFolder
(
item
)?
"
folder
"
:
"
file
"
,
vod_remarks
:
drives
.
isFolder
(
item
)?
remark
+
"
文件夹
"
:
remark
};
if
(
drives
.
isVideo
(
item
)){
vodFiles
.
push
(
vod
)}
allList
.
push
(
vod
)});
if
(
vodFiles
.
length
===
1
&&
subList
.
length
>
0
){
let
sub
;
if
(
subList
.
length
===
1
){
sub
=
subList
[
0
]}
else
{
let
subs
=
JSON
.
parse
(
JSON
.
stringify
(
subList
));
subs
.
sort
((
a
,
b
)
=>
{
let
a_similar
=
(
a
.
includes
(
"
chs
"
)?
100
:
0
)
+
levenshteinDistance
(
a
,
vodFiles
[
0
].
vod_name
);
let
b_similar
=
(
b
.
includes
(
"
chs
"
)?
100
:
0
)
+
levenshteinDistance
(
b
,
vodFiles
[
0
].
vod_name
);
if
(
a_similar
>
b_similar
){
return
1
}
else
{
return
-
1
}});
sub
=
subs
.
slice
(
-
1
)[
0
]}
vodFiles
[
0
].
vod_id
+=
"
@@@
"
+
sub
;
vodFiles
[
0
].
vod_remarks
+=
"
🏷️
"
}
else
{
vodFiles
.
forEach
(
item
=>
{
const
lh
=
0
;
let
sub
;
subList
.
forEach
(
s
=>
{
const
l
=
levenshteinDistance
(
s
,
item
.
vod_name
);
if
(
l
>
60
&&
l
>
lh
){
sub
=
s
}});
if
(
sub
){
item
.
vod_id
+=
"
@@@
"
+
sub
;
item
.
vod_remarks
+=
"
🏷️
"
}})}
let
fl
=
filter
?
extend
:{};
if
(
fl
.
order
){
let
key
=
fl
.
order
.
split
(
"
_
"
).
slice
(
0
,
-
1
).
join
(
"
_
"
);
let
order
=
fl
.
order
.
split
(
"
_
"
).
slice
(
-
1
)[
0
];
print
(
`排序key:
${
key
}
,排序order:
${
order
}
`
);
if
(
key
.
includes
(
"
name
"
)){
detail_order
=
"
name
"
;
allList
=
sortListByName
(
allList
,
key
,
order
)}
else
if
(
key
.
includes
(
"
time
"
)){
detail_order
=
"
time
"
;
allList
=
sortListByTime
(
allList
,
key
,
order
)}
else
if
(
key
.
includes
(
"
size
"
)){
detail_order
=
"
size
"
;
allList
=
sortListBySize
(
allList
,
key
,
order
)}
else
if
(
fl
.
order
.
includes
(
"
none
"
)){
detail_order
=
"
none
"
;
print
(
"
不排序
"
)}}
else
{
if
(
detail_order
!==
"
none
"
){
allList
=
sortListByName
(
allList
,
"
vod_name
"
,
"
asc
"
)}}
if
(
fl
.
show
){
showMode
=
fl
.
show
}
print
(
"
----category----
"
+
`tid:
${
tid
}
,detail_order:
${
detail_order
}
,showMode:
${
showMode
}
`
);
return
JSON
.
stringify
({
page
:
1
,
pagecount
:
1
,
limit
:
allList
.
length
,
total
:
allList
.
length
,
list
:
allList
})}
function
getAll
(
otid
,
tid
,
drives
,
path
){
try
{
const
content
=
category
(
tid
,
null
,
false
,
null
);
const
{
list
}
=
JSON
.
parse
(
content
);
let
vod_play_url
=
[];
list
.
forEach
(
x
=>
{
if
(
x
.
vod_tag
===
"
file
"
){
vod_play_url
.
push
(
`
${
x
.
vod_name
}
$
${
x
.
vod_id
.
substring
(
x
.
vod_id
.
indexOf
(
"
$
"
)
+
1
)}
`
)}});
const
pl
=
path
.
split
(
"
/
"
);
const
vod_name
=
pl
[
pl
.
length
-
2
]
||
drives
.
name
;
let
vod
=
{
vod_id
:
otid
,
vod_name
:
vod_name
,
type_name
:
"
文件夹
"
,
vod_pic
:
"
https://avatars.githubusercontent.com/u/97389433?s=120&v=4
"
,
vod_content
:
tid
,
vod_tag
:
"
folder
"
,
vod_play_from
:
drives
.
name
,
vod_play_url
:
vod_play_url
.
join
(
"
#
"
),
vod_remarks
:
drives
.
settings
.
title
};
print
(
"
----detail1----
"
);
print
(
vod
);
return
JSON
.
stringify
({
list
:[
vod
]})}
catch
(
e
){
print
(
e
.
message
);
return
JSON
.
stringify
({
list
:[{}]})}}
function
detail
(
tid
){
let
isSearch
=
tid
.
endsWith
(
"
#search#
"
);
let
otid
=
tid
;
tid
=
tid
.
replace
(
"
#search#
"
,
""
);
let
isFile
=
isMedia
(
tid
);
let
{
drives
,
path
}
=
get_drives_path
(
tid
);
if
(
path
.
endsWith
(
"
/
"
)){
return
getAll
(
otid
,
tid
,
drives
,
path
)}
else
{
if
(
isSearch
&&!
isFile
){
return
getAll
(
otid
,
tid
,
drives
,
path
)}
else
if
(
showMode
===
"
all
"
){
let
new_tid
=
tid
.
split
(
"
/
"
).
slice
(
0
,
-
1
).
join
(
"
/
"
)
+
"
/
"
;
print
(
`全集模式 tid:
${
tid
}
=>tid:
${
new_tid
}
`
);
let
{
drives
,
path
}
=
get_drives_path
(
new_tid
);
return
getAll
(
otid
,
new_tid
,
drives
,
path
)}
else
{
let
paths
=
path
.
split
(
"
@@@
"
);
let
vod_name
=
paths
[
0
].
substring
(
paths
[
0
].
lastIndexOf
(
"
/
"
)
+
1
);
let
vod
=
{
vod_id
:
otid
,
vod_name
:
vod_name
,
type_name
:
"
文件
"
,
vod_pic
:
"
https://avatars.githubusercontent.com/u/97389433?s=120&v=4
"
,
vod_content
:
tid
,
vod_play_from
:
drives
.
name
,
vod_play_url
:
vod_name
+
"
$
"
+
path
,
vod_remarks
:
drives
.
settings
.
title
};
print
(
"
----detail2----
"
);
print
(
vod
);
return
JSON
.
stringify
({
list
:[
vod
]})}}}
function
play
(
flag
,
id
,
flags
){
const
drives
=
get_drives
(
flag
);
const
urls
=
id
.
split
(
"
@@@
"
);
let
vod
=
{
parse
:
0
,
playUrl
:
""
,
url
:
drives
.
getFile
(
urls
[
0
]).
raw_url
};
if
(
urls
.
length
>=
2
){
const
path
=
urls
[
0
].
substring
(
0
,
urls
[
0
].
lastIndexOf
(
"
/
"
)
+
1
);
vod
.
subt
=
drives
.
getFile
(
path
+
urls
[
1
]).
raw_url
}
print
(
"
----play----
"
);
print
(
vod
);
return
JSON
.
stringify
(
vod
)}
function
search
(
wd
,
quick
){
print
(
__drives
);
print
(
"
可搜索的alist驱动:
"
+
searchDriver
);
if
(
!
searchDriver
){
return
JSON
.
stringify
({
list
:[]})}
else
{
let
driver
=
__drives
[
searchDriver
];
print
(
driver
);
let
surl
=
driver
.
server
+
"
/search?box=
"
+
wd
+
"
&url=
"
;
if
(
search_type
){
surl
+=
"
&type=
"
+
search_type
}
print
(
"
搜索链接:
"
+
surl
);
let
html
=
http
.
get
(
surl
).
text
();
let
lists
=
[];
try
{
lists
=
pdfa
(
html
,
"
div&&ul&&a
"
)}
catch
(
e
){}
print
(
`搜索结果数:
${
lists
.
length
}
,搜索结果显示数量限制:
${
limit_search_show
}
`
);
let
vods
=
[];
let
excludeReg
=
/
\.(
pdf|epub|mobi|txt|doc|lrc
)
$/
;
lists
.
forEach
(
it
=>
{
let
vhref
=
pdfh
(
it
,
"
a&&href
"
);
if
(
vhref
){
vhref
=
unescape
(
vhref
)}
if
(
excludeReg
.
test
(
vhref
)){
return
}
let
vid
=
searchDriver
+
"
$
"
+
vhref
+
"
#search#
"
;
vods
.
push
({
vod_name
:
pdfh
(
it
,
"
a&&Text
"
),
vod_id
:
vid
,
vod_pic
:
"
http://img1.3png.com/281e284a670865a71d91515866552b5f172b.png
"
,
vod_remarks
:
searchDriver
})});
vods
=
vods
.
slice
(
0
,
limit_search_show
);
print
(
vods
);
return
JSON
.
stringify
({
list
:
vods
})}}
function
get_size
(
sz
){
if
(
sz
<=
0
){
return
""
}
let
filesize
=
""
;
if
(
sz
>
1024
*
1024
*
1024
*
1024
){
sz
/=
1024
*
1024
*
1024
*
1024
;
filesize
=
"
TB
"
}
else
if
(
sz
>
1024
*
1024
*
1024
){
sz
/=
1024
*
1024
*
1024
;
filesize
=
"
GB
"
}
else
if
(
sz
>
1024
*
1024
){
sz
/=
1024
*
1024
;
filesize
=
"
MB
"
}
else
if
(
sz
>
1024
){
sz
/=
1024
;
filesize
=
"
KB
"
}
else
{
filesize
=
"
B
"
}
let
sizeStr
=
sz
.
toFixed
(
2
)
+
filesize
,
index
=
sizeStr
.
indexOf
(
"
.
"
),
dou
=
sizeStr
.
substr
(
index
+
1
,
2
);
if
(
dou
===
"
00
"
){
return
sizeStr
.
substring
(
0
,
index
)
+
sizeStr
.
substr
(
index
+
3
,
2
)}
else
{
return
sizeStr
}}
function
levenshteinDistance
(
str1
,
str2
){
return
100
-
100
*
distance
(
str1
,
str2
)
/
Math
.
max
(
str1
.
length
,
str2
.
length
)}
const
sortListByFirst
=
(
vodList
,
key
)
=>
{
key
=
key
||
"
vod_name
"
;
const
symbol_list
=
[];
const
cn_list
=
[];
const
en_list
=
[];
const
num_list
=
[];
vodList
.
forEach
(
vod
=>
{
const
{
vod_name
}
=
vod
;
if
(
/
[\u
4e00-
\u
9fa5
]
/
.
test
(
vod_name
[
0
])){
cn_list
.
push
(
vod
)}
else
if
(
/
[
a-zA-Z
]
/
.
test
(
vod_name
[
0
])){
en_list
.
push
(
vod
)}
else
if
(
/
[\d]
/
.
test
(
vod_name
[
0
])){
num_list
.
push
(
vod
)}
else
{
symbol_list
.
push
(
vod
)}});
const
newList
=
[...
cn_list
.
sort
((
a
,
b
)
=>
a
.
vod_name
[
0
]?.
localeCompare
(
b
.
vod_name
[
0
])),...
en_list
.
sort
((
a
,
b
)
=>
a
.
vod_name
[
0
].
localeCompare
(
b
.
vod_name
[
0
])),...
num_list
.
sort
((
a
,
b
)
=>
a
.
vod_name
[
0
]
-
b
.
vod_name
[
0
]),...
symbol_list
.
sort
((
a
,
b
)
=>
a
.
vod_name
[
0
]
-
b
.
vod_name
[
0
])];
return
newList
};
function
isAllChinese
(
str
){
return
/^
[\u
4E00-
\u
9FA5
]
+$/
.
test
(
str
)}
function
isChinese
(
char
){
return
/^
[\u
4E00-
\u
9FA5
]
$/
.
test
(
char
)}
const
sortListByName
=
(
vodList
,
key
,
order
)
=>
{
if
(
!
key
){
return
vodList
}
order
=
order
||
"
asc
"
;
let
ASCarr
=
vodList
.
sort
((
a
,
b
)
=>
{
a
=
a
[
key
];
b
=
b
[
key
];
if
(
typeof
a
===
"
number
"
&&
typeof
b
===
"
string
"
){
return
-
1
}
if
(
typeof
a
===
"
string
"
&&
typeof
b
===
"
number
"
){
return
1
}
if
(
isNaN
(
a
)
||
isNaN
(
b
)){
if
(
isAllChinese
(
a
)
&&!
isAllChinese
(
b
)){
return
1
}
if
(
!
isAllChinese
(
a
)
&&
isAllChinese
(
b
)){
return
-
1
}
a
=
a
.
toString
();
b
=
b
.
toString
();
let
result
=
0
;
for
(
let
index
=
0
;
index
<
(
a
.
length
-
b
.
length
?
b
.
length
:
a
.
length
);
index
++
){
if
(
!
isChinese
(
a
[
index
])
&&
isChinese
(
b
[
index
])){
result
=-
1
}
if
(
isChinese
(
a
[
index
])
&&!
isChinese
(
b
[
index
])){
result
=
1
}
if
(
isChinese
(
a
[
index
])
&&
isChinese
(
b
[
index
])){
let
pinyinA
=
getFirstLetterList
(
a
[
index
]).
toString
();
let
pinyinB
=
getFirstLetterList
(
b
[
index
]).
toString
();
result
=
pinyinA
.
localeCompare
(
pinyinB
,
"
zh-Hans-CN
"
,{
sensitivity
:
"
accent
"
})}
if
(
result
!==
0
){
break
}}
return
result
||
a
.
toString
().
localeCompare
(
b
.
toString
(),
"
zh-Hans-CN
"
,{
sensitivity
:
"
accent
"
})}
else
{
return
Number
(
a
)
-
Number
(
b
)}});
if
(
order
===
"
desc
"
){
ASCarr
.
reverse
()}
return
ASCarr
};
const
getTimeInt
=
timeStr
=>
{
return
new
Date
(
timeStr
).
getTime
()};
const
sortListByTime
=
(
vodList
,
key
,
order
)
=>
{
if
(
!
key
){
return
vodList
}
let
ASCarr
=
vodList
.
sort
((
a
,
b
)
=>
{
a
=
a
[
key
];
b
=
b
[
key
];
return
getTimeInt
(
a
)
-
getTimeInt
(
b
)});
if
(
order
===
"
desc
"
){
ASCarr
.
reverse
()}
return
ASCarr
};
const
sortListBySize
=
(
vodList
,
key
,
order
)
=>
{
if
(
!
key
){
return
vodList
}
let
ASCarr
=
vodList
.
sort
((
a
,
b
)
=>
{
a
=
a
[
key
];
b
=
b
[
key
];
return
(
Number
(
a
)
||
0
)
-
(
Number
(
b
)
||
0
)});
if
(
order
===
"
desc
"
){
ASCarr
.
reverse
()}
return
ASCarr
};
export
default
{
init
:
init
,
home
:
home
,
homeVod
:
homeVod
,
category
:
category
,
detail
:
detail
,
play
:
play
,
search
:
search
};
\ No newline at end of file
import
{
distance
}
from
"
https://unpkg.com/fastest-levenshtein@1.0.16/esm/mod.js
"
;
String
.
prototype
.
rstrip
=
function
(
chars
){
let
regex
=
new
RegExp
(
chars
+
"
$
"
);
return
this
.
replace
(
regex
,
""
)};
var
showMode
=
"
single
"
;
var
searchDriver
=
""
;
var
limit_search_show
=
200
;
var
search_type
=
""
;
var
detail_order
=
"
name
"
;
function
print
(
any
){
any
=
any
||
""
;
if
(
typeof
any
==
"
object
"
&&
Object
.
keys
(
any
).
length
>
0
){
try
{
any
=
JSON
.
stringify
(
any
);
console
.
log
(
any
)}
catch
(
e
){
console
.
log
(
typeof
any
+
"
:
"
+
any
.
length
)}}
else
if
(
typeof
any
==
"
object
"
&&
Object
.
keys
(
any
).
length
<
1
){
console
.
log
(
"
null object
"
)}
else
{
console
.
log
(
any
)}}
const
http
=
function
(
url
,
options
=
{}){
if
(
options
.
method
===
"
POST
"
&&
options
.
data
){
options
.
body
=
JSON
.
stringify
(
options
.
data
);
options
.
headers
=
Object
.
assign
({
"
content-type
"
:
"
application/json
"
},
options
.
headers
)}
const
res
=
req
(
url
,
options
);
res
.
json
=
()
=>
res
.
content
?
JSON
.
parse
(
res
.
content
):
null
;
res
.
text
=
()
=>
res
.
content
;
return
res
};[
"
get
"
,
"
post
"
].
forEach
(
method
=>
{
http
[
method
]
=
function
(
url
,
options
=
{}){
return
http
(
url
,
Object
.
assign
(
options
,{
method
:
method
.
toUpperCase
()}))}});
const
__drives
=
{};
function
isMedia
(
file
){
return
/
\.(
mp3|aac|wav|wma|cda|flac|m4a|mid|mka|mp2|mpa|mpc|ape|ofr|ogg|ra|wv|tta|ac3|dts|tak|webm|wmv|mpeg|mov|ram|swf|mp4|avi|rm|rmvb|flv|mpg|mkv|m3u8|ts|3gp|asf
)
$/
.
test
(
file
.
toLowerCase
())}
function
get_drives_path
(
tid
){
const
index
=
tid
.
indexOf
(
"
$
"
);
const
name
=
tid
.
substring
(
0
,
index
);
const
path
=
tid
.
substring
(
index
+
1
);
return
{
drives
:
get_drives
(
name
),
path
:
path
}}
function
get_drives
(
name
){
const
{
settings
,
api
,
server
}
=
__drives
[
name
];
if
(
settings
.
v3
==
null
){
settings
.
v3
=
false
;
const
data
=
http
.
get
(
server
+
"
/api/public/settings
"
).
json
().
data
;
if
(
Array
.
isArray
(
data
)){
settings
.
title
=
data
.
find
(
x
=>
x
.
key
===
"
title
"
)?.
value
;
settings
.
v3
=
false
;
settings
.
version
=
data
.
find
(
x
=>
x
.
key
===
"
version
"
)?.
value
;
settings
.
enableSearch
=
data
.
find
(
x
=>
x
.
key
===
"
enable search
"
)?.
value
===
"
true
"
}
else
{
settings
.
title
=
data
.
title
;
settings
.
v3
=
true
;
settings
.
version
=
data
.
version
;
settings
.
enableSearch
=
false
}
api
.
path
=
settings
.
v3
?
"
/api/fs/list
"
:
"
/api/public/path
"
;
api
.
file
=
settings
.
v3
?
"
/api/fs/get
"
:
"
/api/public/path
"
;
api
.
search
=
settings
.
v3
?
"
/api/public/search
"
:
"
/api/public/search
"
}
return
__drives
[
name
]}
function
init
(
ext
){
let
alist_data
=
ext
.
split
(
"
;
"
);
let
alist_data_url
=
alist_data
[
0
];
limit_search_show
=
alist_data
.
length
>
1
?
Number
(
alist_data
[
1
])
||
limit_search_show
:
limit_search_show
;
search_type
=
alist_data
.
length
>
2
?
alist_data
[
2
]:
search_type
;
const
data
=
http
.
get
(
alist_data_url
).
json
();
searchDriver
=
(
data
.
find
(
x
=>
x
.
search
)
||
{}).
name
||
""
;
data
.
forEach
(
item
=>
{
let
_path_param
=
[];
if
(
item
.
params
){
_path_param
=
Object
.
keys
(
item
.
params
);
_path_param
.
sort
((
a
,
b
)
=>
a
.
length
-
b
.
length
)}
__drives
[
item
.
name
]
=
{
name
:
item
.
name
,
server
:
item
.
server
.
endsWith
(
"
/
"
)?
item
.
server
.
rstrip
(
"
/
"
):
item
.
server
,
startPage
:
item
.
startPage
||
"
/
"
,
showAll
:
item
.
showAll
===
true
,
search
:
!!
item
.
search
,
params
:
item
.
params
||
{},
_path_param
:
_path_param
,
settings
:{},
api
:{},
getParams
(
path
){
const
key
=
this
.
_path_param
.
find
(
x
=>
path
.
startsWith
(
x
));
return
Object
.
assign
({},
this
.
params
[
key
],{
path
:
path
})},
getPath
(
path
){
const
res
=
http
.
post
(
this
.
server
+
this
.
api
.
path
,{
data
:
this
.
getParams
(
path
)}).
json
();
return
this
.
settings
.
v3
?
res
.
data
.
content
:
res
.
data
.
files
},
getFile
(
path
){
let
raw_url
=
this
.
server
+
"
/d
"
+
path
;
raw_url
=
encodeURI
(
raw_url
);
return
{
raw_url
:
raw_url
}},
isFolder
(
data
){
return
data
.
type
===
1
},
isVideo
(
data
){
return
this
.
settings
.
v3
?
data
.
type
===
2
:
data
.
type
===
3
},
is_subt
(
data
){
if
(
data
.
type
===
1
){
return
false
}
const
ext
=
/
\.(
srt|ass|scc|stl|ttml
)
$/
;
return
ext
.
test
(
data
.
name
)},
getPic
(
data
){
let
pic
=
this
.
settings
.
v3
?
data
.
thumb
:
data
.
thumbnail
;
return
pic
||
(
this
.
isFolder
(
data
)?
"
http://img1.3png.com/281e284a670865a71d91515866552b5f172b.png
"
:
""
)},
getTime
(
data
,
isStandard
){
isStandard
=
isStandard
||
false
;
try
{
let
tTime
=
data
.
updated_at
||
data
.
time_str
||
data
.
modified
||
""
;
let
date
=
""
;
if
(
tTime
){
tTime
=
tTime
.
split
(
"
T
"
);
date
=
tTime
[
0
];
if
(
isStandard
){
date
=
date
.
replace
(
/-/g
,
"
/
"
)}
tTime
=
tTime
[
1
].
split
(
/Z|
\.
/
);
date
+=
"
"
+
tTime
[
0
]}
return
date
}
catch
(
e
){
return
""
}}}});
print
(
"
init执行完毕
"
)}
function
home
(
filter
){
let
classes
=
Object
.
keys
(
__drives
).
map
(
key
=>
({
type_id
:
`
${
key
}
$
${
__drives
[
key
].
startPage
}
`
,
type_name
:
key
,
type_flag
:
"
1
"
}));
let
filter_dict
=
{};
let
filters
=
[{
key
:
"
order
"
,
name
:
"
排序
"
,
value
:[{
n
:
"
名称⬆️
"
,
v
:
"
vod_name_asc
"
},{
n
:
"
名称⬇️
"
,
v
:
"
vod_name_desc
"
},{
n
:
"
时间⬆️
"
,
v
:
"
vod_time_asc
"
},{
n
:
"
时间⬇️
"
,
v
:
"
vod_time_desc
"
},{
n
:
"
大小⬆️
"
,
v
:
"
vod_size_asc
"
},{
n
:
"
大小⬇️
"
,
v
:
"
vod_size_desc
"
},{
n
:
"
无
"
,
v
:
"
none
"
}]},{
key
:
"
show
"
,
name
:
"
播放展示
"
,
value
:[{
n
:
"
单集
"
,
v
:
"
single
"
},{
n
:
"
全集
"
,
v
:
"
all
"
}]}];
classes
.
forEach
(
it
=>
{
filter_dict
[
it
.
type_id
]
=
filters
});
print
(
"
----home----
"
);
print
(
classes
);
return
JSON
.
stringify
({
class
:
classes
,
filters
:
filter_dict
})}
function
homeVod
(
params
){
return
JSON
.
stringify
({
list
:[]})}
function
category
(
tid
,
pg
,
filter
,
extend
){
let
{
drives
,
path
}
=
get_drives_path
(
tid
);
const
id
=
tid
.
endsWith
(
"
/
"
)?
tid
:
tid
+
"
/
"
;
const
list
=
drives
.
getPath
(
path
);
let
subList
=
[];
let
vodFiles
=
[];
let
allList
=
[];
list
.
forEach
(
item
=>
{
if
(
drives
.
is_subt
(
item
)){
subList
.
push
(
item
.
name
)}
if
(
!
drives
.
showAll
&&!
drives
.
isFolder
(
item
)
&&!
drives
.
isVideo
(
item
)){
return
}
let
vod_time
=
drives
.
getTime
(
item
);
let
vod_size
=
get_size
(
item
.
size
);
let
remark
=
vod_time
.
split
(
"
"
)[
0
].
substr
(
3
)
+
"
\t
"
+
vod_size
;
const
vod
=
{
vod_id
:
id
+
item
.
name
+
(
drives
.
isFolder
(
item
)?
"
/
"
:
""
),
vod_name
:
item
.
name
.
replaceAll
(
"
$
"
,
""
).
replaceAll
(
"
#
"
,
""
),
vod_pic
:
drives
.
getPic
(
item
),
vod_time
:
vod_time
,
vod_size
:
item
.
size
,
vod_tag
:
drives
.
isFolder
(
item
)?
"
folder
"
:
"
file
"
,
vod_remarks
:
drives
.
isFolder
(
item
)?
remark
+
"
文件夹
"
:
remark
};
if
(
drives
.
isVideo
(
item
)){
vodFiles
.
push
(
vod
)}
allList
.
push
(
vod
)});
if
(
vodFiles
.
length
===
1
&&
subList
.
length
>
0
){
let
sub
;
if
(
subList
.
length
===
1
){
sub
=
subList
[
0
]}
else
{
let
subs
=
JSON
.
parse
(
JSON
.
stringify
(
subList
));
subs
.
sort
((
a
,
b
)
=>
{
let
a_similar
=
(
a
.
includes
(
"
chs
"
)?
100
:
0
)
+
levenshteinDistance
(
a
,
vodFiles
[
0
].
vod_name
);
let
b_similar
=
(
b
.
includes
(
"
chs
"
)?
100
:
0
)
+
levenshteinDistance
(
b
,
vodFiles
[
0
].
vod_name
);
if
(
a_similar
>
b_similar
){
return
1
}
else
{
return
-
1
}});
sub
=
subs
.
slice
(
-
1
)[
0
]}
vodFiles
[
0
].
vod_id
+=
"
@@@
"
+
sub
;
vodFiles
[
0
].
vod_remarks
+=
"
🏷️
"
}
else
{
vodFiles
.
forEach
(
item
=>
{
const
lh
=
0
;
let
sub
;
subList
.
forEach
(
s
=>
{
const
l
=
levenshteinDistance
(
s
,
item
.
vod_name
);
if
(
l
>
60
&&
l
>
lh
){
sub
=
s
}});
if
(
sub
){
item
.
vod_id
+=
"
@@@
"
+
sub
;
item
.
vod_remarks
+=
"
🏷️
"
}})}
let
fl
=
filter
?
extend
:{};
if
(
fl
.
order
){
let
key
=
fl
.
order
.
split
(
"
_
"
).
slice
(
0
,
-
1
).
join
(
"
_
"
);
let
order
=
fl
.
order
.
split
(
"
_
"
).
slice
(
-
1
)[
0
];
print
(
`排序key:
${
key
}
,排序order:
${
order
}
`
);
if
(
key
.
includes
(
"
name
"
)){
detail_order
=
"
name
"
;
allList
=
sortListByName
(
allList
,
key
,
order
)}
else
if
(
key
.
includes
(
"
time
"
)){
detail_order
=
"
time
"
;
allList
=
sortListByTime
(
allList
,
key
,
order
)}
else
if
(
key
.
includes
(
"
size
"
)){
detail_order
=
"
size
"
;
allList
=
sortListBySize
(
allList
,
key
,
order
)}
else
if
(
fl
.
order
.
includes
(
"
none
"
)){
detail_order
=
"
none
"
;
print
(
"
不排序
"
)}}
else
{
if
(
detail_order
!==
"
none
"
){
allList
=
sortListByName
(
allList
,
"
vod_name
"
,
"
asc
"
)}}
if
(
fl
.
show
){
showMode
=
fl
.
show
}
print
(
"
----category----
"
+
`tid:
${
tid
}
,detail_order:
${
detail_order
}
,showMode:
${
showMode
}
`
);
return
JSON
.
stringify
({
page
:
1
,
pagecount
:
1
,
limit
:
allList
.
length
,
total
:
allList
.
length
,
list
:
allList
})}
function
getAll
(
otid
,
tid
,
drives
,
path
){
try
{
const
content
=
category
(
tid
,
null
,
false
,
null
);
const
{
list
}
=
JSON
.
parse
(
content
);
let
vod_play_url
=
[];
list
.
forEach
(
x
=>
{
if
(
x
.
vod_tag
===
"
file
"
){
vod_play_url
.
push
(
`
${
x
.
vod_name
}
$
${
x
.
vod_id
.
substring
(
x
.
vod_id
.
indexOf
(
"
$
"
)
+
1
)}
`
)}});
const
pl
=
path
.
split
(
"
/
"
);
const
vod_name
=
pl
[
pl
.
length
-
2
]
||
drives
.
name
;
let
vod
=
{
vod_id
:
otid
,
vod_name
:
vod_name
,
type_name
:
"
文件夹
"
,
vod_pic
:
"
https://avatars.githubusercontent.com/u/97389433?s=120&v=4
"
,
vod_content
:
tid
,
vod_tag
:
"
folder
"
,
vod_play_from
:
drives
.
name
,
vod_play_url
:
vod_play_url
.
join
(
"
#
"
),
vod_remarks
:
drives
.
settings
.
title
};
print
(
"
----detail1----
"
);
print
(
vod
);
return
JSON
.
stringify
({
list
:[
vod
]})}
catch
(
e
){
print
(
e
.
message
);
return
JSON
.
stringify
({
list
:[{}]})}}
function
detail
(
tid
){
let
isSearch
=
tid
.
endsWith
(
"
#search#
"
);
let
otid
=
tid
;
tid
=
tid
.
replace
(
"
#search#
"
,
""
);
let
isFile
=
isMedia
(
tid
);
let
{
drives
,
path
}
=
get_drives_path
(
tid
);
if
(
path
.
endsWith
(
"
/
"
)){
return
getAll
(
otid
,
tid
,
drives
,
path
)}
else
{
if
(
isSearch
&&!
isFile
){
return
getAll
(
otid
,
tid
,
drives
,
path
)}
else
if
(
showMode
===
"
all
"
){
let
new_tid
=
tid
.
split
(
"
/
"
).
slice
(
0
,
-
1
).
join
(
"
/
"
)
+
"
/
"
;
print
(
`全集模式 tid:
${
tid
}
=>tid:
${
new_tid
}
`
);
let
{
drives
,
path
}
=
get_drives_path
(
new_tid
);
return
getAll
(
otid
,
new_tid
,
drives
,
path
)}
else
{
let
paths
=
path
.
split
(
"
@@@
"
);
let
vod_name
=
paths
[
0
].
substring
(
paths
[
0
].
lastIndexOf
(
"
/
"
)
+
1
);
let
vod
=
{
vod_id
:
otid
,
vod_name
:
vod_name
,
type_name
:
"
文件
"
,
vod_pic
:
"
https://avatars.githubusercontent.com/u/97389433?s=120&v=4
"
,
vod_content
:
tid
,
vod_play_from
:
drives
.
name
,
vod_play_url
:
vod_name
+
"
$
"
+
path
,
vod_remarks
:
drives
.
settings
.
title
};
print
(
"
----detail2----
"
);
print
(
vod
);
return
JSON
.
stringify
({
list
:[
vod
]})}}}
function
play
(
flag
,
id
,
flags
){
const
drives
=
get_drives
(
flag
);
const
urls
=
id
.
split
(
"
@@@
"
);
let
vod
=
{
parse
:
0
,
playUrl
:
""
,
url
:
drives
.
getFile
(
urls
[
0
]).
raw_url
};
if
(
urls
.
length
>=
2
){
const
path
=
urls
[
0
].
substring
(
0
,
urls
[
0
].
lastIndexOf
(
"
/
"
)
+
1
);
vod
.
subt
=
drives
.
getFile
(
path
+
urls
[
1
]).
raw_url
}
print
(
"
----play----
"
);
print
(
vod
);
return
JSON
.
stringify
(
vod
)}
function
search
(
wd
,
quick
){
print
(
__drives
);
print
(
"
可搜索的alist驱动:
"
+
searchDriver
);
if
(
!
searchDriver
){
return
JSON
.
stringify
({
list
:[]})}
else
{
let
driver
=
__drives
[
searchDriver
];
print
(
driver
);
let
surl
=
driver
.
server
+
"
/search?box=
"
+
wd
+
"
&url=
"
;
if
(
search_type
){
surl
+=
"
&type=
"
+
search_type
}
print
(
"
搜索链接:
"
+
surl
);
let
html
=
http
.
get
(
surl
).
text
();
let
lists
=
[];
try
{
lists
=
pdfa
(
html
,
"
div&&ul&&a
"
)}
catch
(
e
){}
print
(
`搜索结果数:
${
lists
.
length
}
,搜索结果显示数量限制:
${
limit_search_show
}
`
);
let
vods
=
[];
let
excludeReg
=
/
\.(
pdf|epub|mobi|txt|doc|lrc
)
$/
;
lists
.
forEach
(
it
=>
{
let
vhref
=
pdfh
(
it
,
"
a&&href
"
);
if
(
vhref
){
vhref
=
unescape
(
vhref
)}
print
(
vhref
);
if
(
excludeReg
.
test
(
vhref
)){
return
}
let
vid
=
searchDriver
+
"
$
"
+
vhref
+
"
#search#
"
;
vods
.
push
({
vod_name
:
pdfh
(
it
,
"
a&&Text
"
),
vod_id
:
vid
,
vod_pic
:
"
http://img1.3png.com/281e284a670865a71d91515866552b5f172b.png
"
,
vod_remarks
:
searchDriver
})});
vods
=
vods
.
slice
(
0
,
limit_search_show
);
print
(
vods
);
return
JSON
.
stringify
({
list
:
vods
})}}
function
get_size
(
sz
){
if
(
sz
<=
0
){
return
""
}
let
filesize
=
""
;
if
(
sz
>
1024
*
1024
*
1024
*
1024
){
sz
/=
1024
*
1024
*
1024
*
1024
;
filesize
=
"
TB
"
}
else
if
(
sz
>
1024
*
1024
*
1024
){
sz
/=
1024
*
1024
*
1024
;
filesize
=
"
GB
"
}
else
if
(
sz
>
1024
*
1024
){
sz
/=
1024
*
1024
;
filesize
=
"
MB
"
}
else
if
(
sz
>
1024
){
sz
/=
1024
;
filesize
=
"
KB
"
}
else
{
filesize
=
"
B
"
}
let
sizeStr
=
sz
.
toFixed
(
2
)
+
filesize
,
index
=
sizeStr
.
indexOf
(
"
.
"
),
dou
=
sizeStr
.
substr
(
index
+
1
,
2
);
if
(
dou
===
"
00
"
){
return
sizeStr
.
substring
(
0
,
index
)
+
sizeStr
.
substr
(
index
+
3
,
2
)}
else
{
return
sizeStr
}}
function
levenshteinDistance
(
str1
,
str2
){
return
100
-
100
*
distance
(
str1
,
str2
)
/
Math
.
max
(
str1
.
length
,
str2
.
length
)}
function
naturalSort
(
options
){
if
(
!
options
){
options
=
{}}
return
function
(
a
,
b
){
if
(
options
.
key
){
a
=
a
[
options
.
key
];
b
=
b
[
options
.
key
]}
var
EQUAL
=
0
;
var
GREATER
=
options
.
order
===
"
desc
"
?
-
1
:
1
;
var
SMALLER
=-
GREATER
;
var
re
=
/
(
^-
?[
0-9
]
+
(\.?[
0-9
]
*
)[
df
]?
e
?[
0-9
]?
$|^0x
[
0-9a-f
]
+$|
[
0-9
]
+
)
/gi
;
var
sre
=
/
(
^
[
]
*|
[
]
*$
)
/g
;
var
dre
=
/
(
^
([\w
]
+,
?[\w
]
+
)?[\w
]
+,
?[\w
]
+
\d
+:
\d
+
(
:
\d
+
)?[\w
]?
|^
\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}
|^
\w
+,
\w
+
\d
+,
\d{4})
/
;
var
hre
=
/^0x
[
0-9a-f
]
+$/i
;
var
ore
=
/^0/
;
var
normalize
=
function
normalize
(
value
){
var
string
=
""
+
value
;
return
options
.
caseSensitive
?
string
:
string
.
toLowerCase
()};
var
x
=
normalize
(
a
).
replace
(
sre
,
""
)
||
""
;
var
y
=
normalize
(
b
).
replace
(
sre
,
""
)
||
""
;
var
xN
=
x
.
replace
(
re
,
"
\
0$1
\
0
"
).
replace
(
/
\0
$/
,
""
).
replace
(
/^
\0
/
,
""
).
split
(
"
\
0
"
);
var
yN
=
y
.
replace
(
re
,
"
\
0$1
\
0
"
).
replace
(
/
\0
$/
,
""
).
replace
(
/^
\0
/
,
""
).
split
(
"
\
0
"
);
if
(
!
x
&&!
y
)
return
EQUAL
;
if
(
!
x
&&
y
)
return
GREATER
;
if
(
x
&&!
y
)
return
SMALLER
;
var
xD
=
parseInt
(
x
.
match
(
hre
))
||
xN
.
length
!=
1
&&
x
.
match
(
dre
)
&&
Date
.
parse
(
x
);
var
yD
=
parseInt
(
y
.
match
(
hre
))
||
xD
&&
y
.
match
(
dre
)
&&
Date
.
parse
(
y
)
||
null
;
var
oFxNcL
,
oFyNcL
;
if
(
yD
){
if
(
xD
<
yD
)
return
SMALLER
;
else
if
(
xD
>
yD
)
return
GREATER
}
for
(
var
cLoc
=
0
,
numS
=
Math
.
max
(
xN
.
length
,
yN
.
length
);
cLoc
<
numS
;
cLoc
++
){
oFxNcL
=!
(
xN
[
cLoc
]
||
""
).
match
(
ore
)
&&
parseFloat
(
xN
[
cLoc
])
||
xN
[
cLoc
]
||
0
;
oFyNcL
=!
(
yN
[
cLoc
]
||
""
).
match
(
ore
)
&&
parseFloat
(
yN
[
cLoc
])
||
yN
[
cLoc
]
||
0
;
if
(
isNaN
(
oFxNcL
)
!==
isNaN
(
oFyNcL
))
return
isNaN
(
oFxNcL
)?
GREATER
:
SMALLER
;
else
if
(
typeof
oFxNcL
!==
typeof
oFyNcL
){
oFxNcL
+=
""
;
oFyNcL
+=
""
}
if
(
oFxNcL
<
oFyNcL
)
return
SMALLER
;
if
(
oFxNcL
>
oFyNcL
)
return
GREATER
}
return
EQUAL
}}
const
sortListByName
=
(
vodList
,
key
,
order
)
=>
{
if
(
!
key
){
return
vodList
}
order
=
order
||
"
asc
"
;
return
vodList
.
sort
(
naturalSort
({
key
:
key
,
order
:
order
,
caseSensitive
:
true
}))};
const
getTimeInt
=
timeStr
=>
{
return
new
Date
(
timeStr
).
getTime
()};
const
sortListByTime
=
(
vodList
,
key
,
order
)
=>
{
if
(
!
key
){
return
vodList
}
let
ASCarr
=
vodList
.
sort
((
a
,
b
)
=>
{
a
=
a
[
key
];
b
=
b
[
key
];
return
getTimeInt
(
a
)
-
getTimeInt
(
b
)});
if
(
order
===
"
desc
"
){
ASCarr
.
reverse
()}
return
ASCarr
};
const
sortListBySize
=
(
vodList
,
key
,
order
)
=>
{
if
(
!
key
){
return
vodList
}
let
ASCarr
=
vodList
.
sort
((
a
,
b
)
=>
{
a
=
a
[
key
];
b
=
b
[
key
];
return
(
Number
(
a
)
||
0
)
-
(
Number
(
b
)
||
0
)});
if
(
order
===
"
desc
"
){
ASCarr
.
reverse
()}
return
ASCarr
};
export
default
{
init
:
init
,
home
:
home
,
homeVod
:
homeVod
,
category
:
category
,
detail
:
detail
,
play
:
play
,
search
:
search
};
\ No newline at end of file
libs/nameOrder.js
0 → 100644
浏览文件 @
c5326d5f
/**
* 比较字符串
* @param str1
* @param str2
*/
function
strCompare
(
str1
,
str2
)
{
// 处理数据为null的情况
if
(
str1
==
undefined
&&
str2
==
undefined
)
{
return
0
;
}
if
(
str1
==
undefined
)
{
return
-
1
;
}
if
(
str2
==
undefined
)
{
return
1
;
}
// 比较字符串中的每个字符
let
c1
;
let
c2
;
let
regexArr
=
[
'
-
'
,
'
_
'
,
'
—
'
,
'
~
'
,
'
·
'
],
canRegex
=
/
[^
0-9
\.]
/g
;
// 如果都不是数字格式(含有其它内容)
if
(
canRegex
.
test
(
str1
)
&&
canRegex
.
test
(
str2
))
{
for
(
let
i
=
0
;
i
<
regexArr
.
length
;
i
++
)
{
let
regex
=
eval
(
'
(/[^0-9
\\
'
+
regexArr
[
i
]
+
'
\\
.]/g)
'
);
// 去除后缀
let
tps1
=
str1
.
replace
(
/
\.[
0-9a-zA-Z
]
+$/
,
''
);
let
tps2
=
str2
.
replace
(
/
\.[
0-9a-zA-Z
]
+$/
,
''
);
// 如果在名字正则要求范围内(没有正则以外的值)
if
(
!
regex
.
test
(
tps1
)
&&
!
regex
.
test
(
tps2
))
{
// 转换为字符串数组
let
numberArray1
=
tps1
.
split
(
regexArr
[
i
]);
let
numberArray2
=
tps2
.
split
(
regexArr
[
i
]);
return
compareNumberArray
(
numberArray1
,
numberArray2
);
}
}
}
// 逐字比较返回结果
for
(
let
i
=
0
;
i
<
str1
.
length
;
i
++
)
{
c1
=
str1
[
i
];
if
(
i
>
str2
.
length
-
1
)
{
// 如果在该字符前,两个串都一样,str2更短,则str1较大
return
1
;
}
c2
=
str2
[
i
];
// 如果都是数字的话,则需要考虑多位数的情况,取出完整的数字字符串,转化为数字再进行比较
if
(
isNumber
(
c1
)
&&
isNumber
(
c2
))
{
let
numStr1
=
""
;
let
numStr2
=
""
;
// 获取数字部分字符串
for
(
let
j
=
i
;
j
<
str1
.
length
;
j
++
)
{
c1
=
str1
[
j
];
if
(
!
isNumber
(
c1
)
&&
c1
!==
'
.
'
)
{
// 不是数字则直接退出循环
break
;
}
numStr1
+=
c1
;
}
for
(
let
j
=
i
;
j
<
str2
.
length
;
j
++
)
{
c2
=
str2
[
j
];
if
(
!
isNumber
(
c2
)
&&
c2
!==
'
.
'
)
{
break
;
}
numStr2
+=
c2
;
}
// 将带小数点的数字转换为数字字符串数组
let
numberArray1
=
numStr1
.
split
(
'
.
'
);
let
numberArray2
=
numStr2
.
split
(
'
.
'
);
return
compareNumberArray
(
numberArray1
,
numberArray2
);
}
// 不是数字的比较方式
if
(
c1
!=
c2
)
{
return
c1
-
c2
;
}
}
return
0
;
}
/**
* 判断是否为数字
* @param obj
* @returns
*/
function
isNumber
(
obj
)
{
if
(
parseFloat
(
obj
).
toString
()
==
"
NaN
"
)
{
return
false
;
}
return
true
;
}
/**
* 比较两个数字数组
*
* @param numberArray1
* @param numberArray2
*/
export
function
compareNumberArray
(
numberArray1
,
numberArray2
)
{
for
(
let
i
=
0
;
i
<
numberArray1
.
length
;
i
++
)
{
if
(
numberArray2
.
length
<
i
+
1
)
{
// 此时数字数组2比1短,直接返回
return
1
;
}
let
compareResult
=
parseInt
(
numberArray1
[
i
])
-
parseInt
(
numberArray2
[
i
]);
if
(
compareResult
!==
0
)
{
return
compareResult
;
}
}
// 说明数组1比数组2短,返回小于
return
-
1
;
}
/**
* 自然排序
* ["第1集","第10集","第20集","第2集","1","2","10","12","23","01","02"].sort(naturalSort())
* @param options { direction: 'desc', caseSensitive: true }
*/
export
function
naturalSort
(
options
)
{
if
(
!
options
)
options
=
{};
return
function
(
a
,
b
)
{
var
EQUAL
=
0
;
var
GREATER
=
(
options
.
direction
==
'
desc
'
?
-
1
:
1
);
var
SMALLER
=
-
GREATER
;
var
re
=
/
(
^-
?[
0-9
]
+
(\.?[
0-9
]
*
)[
df
]?
e
?[
0-9
]?
$|^0x
[
0-9a-f
]
+$|
[
0-9
]
+
)
/gi
;
var
sre
=
/
(
^
[
]
*|
[
]
*$
)
/g
;
var
dre
=
/
(
^
([\w
]
+,
?[\w
]
+
)?[\w
]
+,
?[\w
]
+
\d
+:
\d
+
(
:
\d
+
)?[\w
]?
|^
\d{1,4}[\/\-]\d{1,4}[\/\-]\d{1,4}
|^
\w
+,
\w
+
\d
+,
\d{4})
/
;
var
hre
=
/^0x
[
0-9a-f
]
+$/i
;
var
ore
=
/^0/
;
var
normalize
=
function
normalize
(
value
)
{
var
string
=
''
+
value
;
return
(
options
.
caseSensitive
?
string
:
string
.
toLowerCase
()
);
};
// Normalize values to strings
var
x
=
normalize
(
a
).
replace
(
sre
,
''
)
||
''
;
var
y
=
normalize
(
b
).
replace
(
sre
,
''
)
||
''
;
// chunk/tokenize
var
xN
=
x
.
replace
(
re
,
'
\
0$1
\
0
'
).
replace
(
/
\0
$/
,
''
).
replace
(
/^
\0
/
,
''
).
split
(
'
\
0
'
);
var
yN
=
y
.
replace
(
re
,
'
\
0$1
\
0
'
).
replace
(
/
\0
$/
,
''
).
replace
(
/^
\0
/
,
''
).
split
(
'
\
0
'
);
// Return immediately if at least one of the values is empty.
if
(
!
x
&&
!
y
)
return
EQUAL
;
if
(
!
x
&&
y
)
return
GREATER
;
if
(
x
&&
!
y
)
return
SMALLER
;
// numeric, hex or date detection
var
xD
=
parseInt
(
x
.
match
(
hre
))
||
(
xN
.
length
!=
1
&&
x
.
match
(
dre
)
&&
Date
.
parse
(
x
));
var
yD
=
parseInt
(
y
.
match
(
hre
))
||
xD
&&
y
.
match
(
dre
)
&&
Date
.
parse
(
y
)
||
null
;
var
oFxNcL
,
oFyNcL
;
// first try and sort Hex codes or Dates
if
(
yD
)
{
if
(
xD
<
yD
)
return
SMALLER
;
else
if
(
xD
>
yD
)
return
GREATER
;
}
// natural sorting through split numeric strings and default strings
for
(
var
cLoc
=
0
,
numS
=
Math
.
max
(
xN
.
length
,
yN
.
length
);
cLoc
<
numS
;
cLoc
++
)
{
// find floats not starting with '0', string or 0 if not defined (Clint Priest)
oFxNcL
=
!
(
xN
[
cLoc
]
||
''
).
match
(
ore
)
&&
parseFloat
(
xN
[
cLoc
])
||
xN
[
cLoc
]
||
0
;
oFyNcL
=
!
(
yN
[
cLoc
]
||
''
).
match
(
ore
)
&&
parseFloat
(
yN
[
cLoc
])
||
yN
[
cLoc
]
||
0
;
// handle numeric vs string comparison - number < string - (Kyle Adams)
if
(
isNaN
(
oFxNcL
)
!==
isNaN
(
oFyNcL
))
return
(
isNaN
(
oFxNcL
))
?
GREATER
:
SMALLER
;
// rely on string comparison if different types - i.e. '02' < 2 != '02' < '2'
else
if
(
typeof
oFxNcL
!==
typeof
oFyNcL
)
{
oFxNcL
+=
''
;
oFyNcL
+=
''
;
}
if
(
oFxNcL
<
oFyNcL
)
return
SMALLER
;
if
(
oFxNcL
>
oFyNcL
)
return
GREATER
;
}
return
EQUAL
;
};
}
\ No newline at end of file
libs/sortName.js
0 → 100644
浏览文件 @
c5326d5f
var
strChineseFirstPY
=
"
YDYQSXMWZSSXJBYMGCCZQPSSQBYCDSCDQLDYLYBSSJGYZZJJFKCCLZDHWDWZJLJPFYYNWJJTMYHZWZHFLZPPQHGSCYYYNJQYXXGJHHSDSJNKKTMOMLCRXYPSNQSECCQZGGLLYJLMYZZSECYKYYHQWJSSGGYXYZYJWWKDJHYCHMYXJTLXJYQBYXZLDWRDJRWYSRLDZJPCBZJJBRCFTLECZSTZFXXZHTRQHYBDLYCZSSYMMRFMYQZPWWJJYFCRWFDFZQPYDDWYXKYJAWJFFXYPSFTZYHHYZYSWCJYXSCLCXXWZZXNBGNNXBXLZSZSBSGPYSYZDHMDZBQBZCWDZZYYTZHBTSYYBZGNTNXQYWQSKBPHHLXGYBFMJEBJHHGQTJCYSXSTKZHLYCKGLYSMZXYALMELDCCXGZYRJXSDLTYZCQKCNNJWHJTZZCQLJSTSTBNXBTYXCEQXGKWJYFLZQLYHYXSPSFXLMPBYSXXXYDJCZYLLLSJXFHJXPJBTFFYABYXBHZZBJYZLWLCZGGBTSSMDTJZXPTHYQTGLJSCQFZKJZJQNLZWLSLHDZBWJNCJZYZSQQYCQYRZCJJWYBRTWPYFTWEXCSKDZCTBZHYZZYYJXZCFFZZMJYXXSDZZOTTBZLQWFCKSZSXFYRLNYJMBDTHJXSQQCCSBXYYTSYFBXDZTGBCNSLCYZZPSAZYZZSCJCSHZQYDXLBPJLLMQXTYDZXSQJTZPXLCGLQTZWJBHCTSYJSFXYEJJTLBGXSXJMYJQQPFZASYJNTYDJXKJCDJSZCBARTDCLYJQMWNQNCLLLKBYBZZSYHQQLTWLCCXTXLLZNTYLNEWYZYXCZXXGRKRMTCNDNJTSYYSSDQDGHSDBJGHRWRQLYBGLXHLGTGXBQJDZPYJSJYJCTMRNYMGRZJCZGJMZMGXMPRYXKJNYMSGMZJYMKMFXMLDTGFBHCJHKYLPFMDXLQJJSMTQGZSJLQDLDGJYCALCMZCSDJLLNXDJFFFFJCZFMZFFPFKHKGDPSXKTACJDHHZDDCRRCFQYJKQCCWJDXHWJLYLLZGCFCQDSMLZPBJJPLSBCJGGDCKKDEZSQCCKJGCGKDJTJDLZYCXKLQSCGJCLTFPCQCZGWPJDQYZJJBYJHSJDZWGFSJGZKQCCZLLPSPKJGQJHZZLJPLGJGJJTHJJYJZCZMLZLYQBGJWMLJKXZDZNJQSYZMLJLLJKYWXMKJLHSKJGBMCLYYMKXJQLBMLLKMDXXKWYXYSLMLPSJQQJQXYXFJTJDXMXXLLCXQBSYJBGWYMBGGBCYXPJYGPEPFGDJGBHBNSQJYZJKJKHXQFGQZKFHYGKHDKLLSDJQXPQYKYBNQSXQNSZSWHBSXWHXWBZZXDMNSJBSBKBBZKLYLXGWXDRWYQZMYWSJQLCJXXJXKJEQXSCYETLZHLYYYSDZPAQYZCMTLSHTZCFYZYXYLJSDCJQAGYSLCQLYYYSHMRQQKLDXZSCSSSYDYCJYSFSJBFRSSZQSBXXPXJYSDRCKGJLGDKZJZBDKTCSYQPYHSTCLDJDHMXMCGXYZHJDDTMHLTXZXYLYMOHYJCLTYFBQQXPFBDFHHTKSQHZYYWCNXXCRWHOWGYJLEGWDQCWGFJYCSNTMYTOLBYGWQWESJPWNMLRYDZSZTXYQPZGCWXHNGPYXSHMYQJXZTDPPBFYHZHTJYFDZWKGKZBLDNTSXHQEEGZZYLZMMZYJZGXZXKHKSTXNXXWYLYAPSTHXDWHZYMPXAGKYDXBHNHXKDPJNMYHYLPMGOCSLNZHKXXLPZZLBMLSFBHHGYGYYGGBHSCYAQTYWLXTZQCEZYDQDQMMHTKLLSZHLSJZWFYHQSWSCWLQAZYNYTLSXTHAZNKZZSZZLAXXZWWCTGQQTDDYZTCCHYQZFLXPSLZYGPZSZNGLNDQTBDLXGTCTAJDKYWNSYZLJHHZZCWNYYZYWMHYCHHYXHJKZWSXHZYXLYSKQYSPSLYZWMYPPKBYGLKZHTYXAXQSYSHXASMCHKDSCRSWJPWXSGZJLWWSCHSJHSQNHCSEGNDAQTBAALZZMSSTDQJCJKTSCJAXPLGGXHHGXXZCXPDMMHLDGTYBYSJMXHMRCPXXJZCKZXSHMLQXXTTHXWZFKHCCZDYTCJYXQHLXDHYPJQXYLSYYDZOZJNYXQEZYSQYAYXWYPDGXDDXSPPYZNDLTWRHXYDXZZJHTCXMCZLHPYYYYMHZLLHNXMYLLLMDCPPXHMXDKYCYRDLTXJCHHZZXZLCCLYLNZSHZJZZLNNRLWHYQSNJHXYNTTTKYJPYCHHYEGKCTTWLGQRLGGTGTYGYHPYHYLQYQGCWYQKPYYYTTTTLHYHLLTYTTSPLKYZXGZWGPYDSSZZDQXSKCQNMJJZZBXYQMJRTFFBTKHZKBXLJJKDXJTLBWFZPPTKQTZTGPDGNTPJYFALQMKGXBDCLZFHZCLLLLADPMXDJHLCCLGYHDZFGYDDGCYYFGYDXKSSEBDHYKDKDKHNAXXYBPBYYHXZQGAFFQYJXDMLJCSQZLLPCHBSXGJYNDYBYQSPZWJLZKSDDTACTBXZDYZYPJZQSJNKKTKNJDJGYYPGTLFYQKASDNTCYHBLWDZHBBYDWJRYGKZYHEYYFJMSDTYFZJJHGCXPLXHLDWXXJKYTCYKSSSMTWCTTQZLPBSZDZWZXGZAGYKTYWXLHLSPBCLLOQMMZSSLCMBJCSZZKYDCZJGQQDSMCYTZQQLWZQZXSSFPTTFQMDDZDSHDTDWFHTDYZJYQJQKYPBDJYYXTLJHDRQXXXHAYDHRJLKLYTWHLLRLLRCXYLBWSRSZZSYMKZZHHKYHXKSMDSYDYCJPBZBSQLFCXXXNXKXWYWSDZYQOGGQMMYHCDZTTFJYYBGSTTTYBYKJDHKYXBELHTYPJQNFXFDYKZHQKZBYJTZBXHFDXKDASWTAWAJLDYJSFHBLDNNTNQJTJNCHXFJSRFWHZFMDRYJYJWZPDJKZYJYMPCYZNYNXFBYTFYFWYGDBNZZZDNYTXZEMMQBSQEHXFZMBMFLZZSRXYMJGSXWZJSPRYDJSJGXHJJGLJJYNZZJXHGXKYMLPYYYCXYTWQZSWHWLYRJLPXSLSXMFSWWKLCTNXNYNPSJSZHDZEPTXMYYWXYYSYWLXJQZQXZDCLEEELMCPJPCLWBXSQHFWWTFFJTNQJHJQDXHWLBYZNFJLALKYYJLDXHHYCSTYYWNRJYXYWTRMDRQHWQCMFJDYZMHMYYXJWMYZQZXTLMRSPWWCHAQBXYGZYPXYYRRCLMPYMGKSJSZYSRMYJSNXTPLNBAPPYPYLXYYZKYNLDZYJZCZNNLMZHHARQMPGWQTZMXXMLLHGDZXYHXKYXYCJMFFYYHJFSBSSQLXXNDYCANNMTCJCYPRRNYTYQNYYMBMSXNDLYLYSLJRLXYSXQMLLYZLZJJJKYZZCSFBZXXMSTBJGNXYZHLXNMCWSCYZYFZLXBRNNNYLBNRTGZQYSATSWRYHYJZMZDHZGZDWYBSSCSKXSYHYTXXGCQGXZZSHYXJSCRHMKKBXCZJYJYMKQHZJFNBHMQHYSNJNZYBKNQMCLGQHWLZNZSWXKHLJHYYBQLBFCDSXDLDSPFZPSKJYZWZXZDDXJSMMEGJSCSSMGCLXXKYYYLNYPWWWGYDKZJGGGZGGSYCKNJWNJPCXBJJTQTJWDSSPJXZXNZXUMELPXFSXTLLXCLJXJJLJZXCTPSWXLYDHLYQRWHSYCSQYYBYAYWJJJQFWQCQQCJQGXALDBZZYJGKGXPLTZYFXJLTPADKYQHPMATLCPDCKBMTXYBHKLENXDLEEGQDYMSAWHZMLJTWYGXLYQZLJEEYYBQQFFNLYXRDSCTGJGXYYNKLLYQKCCTLHJLQMKKZGCYYGLLLJDZGYDHZWXPYSJBZKDZGYZZHYWYFQYTYZSZYEZZLYMHJJHTSMQWYZLKYYWZCSRKQYTLTDXWCTYJKLWSQZWBDCQYNCJSRSZJLKCDCDTLZZZACQQZZDDXYPLXZBQJYLZLLLQDDZQJYJYJZYXNYYYNYJXKXDAZWYRDLJYYYRJLXLLDYXJCYWYWNQCCLDDNYYYNYCKCZHXXCCLGZQJGKWPPCQQJYSBZZXYJSQPXJPZBSBDSFNSFPZXHDWZTDWPPTFLZZBZDMYYPQJRSDZSQZSQXBDGCPZSWDWCSQZGMDHZXMWWFYBPDGPHTMJTHZSMMBGZMBZJCFZWFZBBZMQCFMBDMCJXLGPNJBBXGYHYYJGPTZGZMQBQTCGYXJXLWZKYDPDYMGCFTPFXYZTZXDZXTGKMTYBBCLBJASKYTSSQYYMSZXFJEWLXLLSZBQJJJAKLYLXLYCCTSXMCWFKKKBSXLLLLJYXTYLTJYYTDPJHNHNNKBYQNFQYYZBYYESSESSGDYHFHWTCJBSDZZTFDMXHCNJZYMQWSRYJDZJQPDQBBSTJGGFBKJBXTGQHNGWJXJGDLLTHZHHYYYYYYSXWTYYYCCBDBPYPZYCCZYJPZYWCBDLFWZCWJDXXHYHLHWZZXJTCZLCDPXUJCZZZLYXJJTXPHFXWPYWXZPTDZZBDZCYHJHMLXBQXSBYLRDTGJRRCTTTHYTCZWMXFYTWWZCWJWXJYWCSKYBZSCCTZQNHXNWXXKHKFHTSWOCCJYBCMPZZYKBNNZPBZHHZDLSYDDYTYFJPXYNGFXBYQXCBHXCPSXTYZDMKYSNXSXLHKMZXLYHDHKWHXXSSKQYHHCJYXGLHZXCSNHEKDTGZXQYPKDHEXTYKCNYMYYYPKQYYYKXZLTHJQTBYQHXBMYHSQCKWWYLLHCYYLNNEQXQWMCFBDCCMLJGGXDQKTLXKGNQCDGZJWYJJLYHHQTTTNWCHMXCXWHWSZJYDJCCDBQCDGDNYXZTHCQRXCBHZTQCBXWGQWYYBXHMBYMYQTYEXMQKYAQYRGYZSLFYKKQHYSSQYSHJGJCNXKZYCXSBXYXHYYLSTYCXQTHYSMGSCPMMGCCCCCMTZTASMGQZJHKLOSQYLSWTMXSYQKDZLJQQYPLSYCZTCQQPBBQJZCLPKHQZYYXXDTDDTSJCXFFLLCHQXMJLWCJCXTSPYCXNDTJSHJWXDQQJSKXYAMYLSJHMLALYKXCYYDMNMDQMXMCZNNCYBZKKYFLMCHCMLHXRCJJHSYLNMTJZGZGYWJXSRXCWJGJQHQZDQJDCJJZKJKGDZQGJJYJYLXZXXCDQHHHEYTMHLFSBDJSYYSHFYSTCZQLPBDRFRZTZYKYWHSZYQKWDQZRKMSYNBCRXQBJYFAZPZZEDZCJYWBCJWHYJBQSZYWRYSZPTDKZPFPBNZTKLQYHBBZPNPPTYZZYBQNYDCPJMMCYCQMCYFZZDCMNLFPBPLNGQJTBTTNJZPZBBZNJKLJQYLNBZQHKSJZNGGQSZZKYXSHPZSNBCGZKDDZQANZHJKDRTLZLSWJLJZLYWTJNDJZJHXYAYNCBGTZCSSQMNJPJYTYSWXZFKWJQTKHTZPLBHSNJZSYZBWZZZZLSYLSBJHDWWQPSLMMFBJDWAQYZTCJTBNNWZXQXCDSLQGDSDPDZHJTQQPSWLYYJZLGYXYZLCTCBJTKTYCZJTQKBSJLGMGZDMCSGPYNJZYQYYKNXRPWSZXMTNCSZZYXYBYHYZAXYWQCJTLLCKJJTJHGDXDXYQYZZBYWDLWQCGLZGJGQRQZCZSSBCRPCSKYDZNXJSQGXSSJMYDNSTZTPBDLTKZWXQWQTZEXNQCZGWEZKSSBYBRTSSSLCCGBPSZQSZLCCGLLLZXHZQTHCZMQGYZQZNMCOCSZJMMZSQPJYGQLJYJPPLDXRGZYXCCSXHSHGTZNLZWZKJCXTCFCJXLBMQBCZZWPQDNHXLJCTHYZLGYLNLSZZPCXDSCQQHJQKSXZPBAJYEMSMJTZDXLCJYRYYNWJBNGZZTMJXLTBSLYRZPYLSSCNXPHLLHYLLQQZQLXYMRSYCXZLMMCZLTZSDWTJJLLNZGGQXPFSKYGYGHBFZPDKMWGHCXMSGDXJMCJZDYCABXJDLNBCDQYGSKYDQTXDJJYXMSZQAZDZFSLQXYJSJZYLBTXXWXQQZBJZUFBBLYLWDSLJHXJYZJWTDJCZFQZQZZDZSXZZQLZCDZFJHYSPYMPQZMLPPLFFXJJNZZYLSJEYQZFPFZKSYWJJJHRDJZZXTXXGLGHYDXCSKYSWMMZCWYBAZBJKSHFHJCXMHFQHYXXYZFTSJYZFXYXPZLCHMZMBXHZZSXYFYMNCWDABAZLXKTCSHHXKXJJZJSTHYGXSXYYHHHJWXKZXSSBZZWHHHCWTZZZPJXSNXQQJGZYZYWLLCWXZFXXYXYHXMKYYSWSQMNLNAYCYSPMJKHWCQHYLAJJMZXHMMCNZHBHXCLXTJPLTXYJHDYYLTTXFSZHYXXSJBJYAYRSMXYPLCKDUYHLXRLNLLSTYZYYQYGYHHSCCSMZCTZQXKYQFPYYRPFFLKQUNTSZLLZMWWTCQQYZWTLLMLMPWMBZSSTZRBPDDTLQJJBXZCSRZQQYGWCSXFWZLXCCRSZDZMCYGGDZQSGTJSWLJMYMMZYHFBJDGYXCCPSHXNZCSBSJYJGJMPPWAFFYFNXHYZXZYLREMZGZCYZSSZDLLJCSQFNXZKPTXZGXJJGFMYYYSNBTYLBNLHPFZDCYFBMGQRRSSSZXYSGTZRNYDZZCDGPJAFJFZKNZBLCZSZPSGCYCJSZLMLRSZBZZLDLSLLYSXSQZQLYXZLSKKBRXBRBZCYCXZZZEEYFGKLZLYYHGZSGZLFJHGTGWKRAAJYZKZQTSSHJJXDCYZUYJLZYRZDQQHGJZXSSZBYKJPBFRTJXLLFQWJHYLQTYMBLPZDXTZYGBDHZZRBGXHWNJTJXLKSCFSMWLSDQYSJTXKZSCFWJLBXFTZLLJZLLQBLSQMQQCGCZFPBPHZCZJLPYYGGDTGWDCFCZQYYYQYSSCLXZSKLZZZGFFCQNWGLHQYZJJCZLQZZYJPJZZBPDCCMHJGXDQDGDLZQMFGPSYTSDYFWWDJZJYSXYYCZCYHZWPBYKXRYLYBHKJKSFXTZJMMCKHLLTNYYMSYXYZPYJQYCSYCWMTJJKQYRHLLQXPSGTLYYCLJSCPXJYZFNMLRGJJTYZBXYZMSJYJHHFZQMSYXRSZCWTLRTQZSSTKXGQKGSPTGCZNJSJCQCXHMXGGZTQYDJKZDLBZSXJLHYQGGGTHQSZPYHJHHGYYGKGGCWJZZYLCZLXQSFTGZSLLLMLJSKCTBLLZZSZMMNYTPZSXQHJCJYQXYZXZQZCPSHKZZYSXCDFGMWQRLLQXRFZTLYSTCTMJCXJJXHJNXTNRZTZFQYHQGLLGCXSZSJDJLJCYDSJTLNYXHSZXCGJZYQPYLFHDJSBPCCZHJJJQZJQDYBSSLLCMYTTMQTBHJQNNYGKYRQYQMZGCJKPDCGMYZHQLLSLLCLMHOLZGDYYFZSLJCQZLYLZQJESHNYLLJXGJXLYSYYYXNBZLJSSZCQQCJYLLZLTJYLLZLLBNYLGQCHXYYXOXCXQKYJXXXYKLXSXXYQXCYKQXQCSGYXXYQXYGYTQOHXHXPYXXXULCYEYCHZZCBWQBBWJQZSCSZSSLZYLKDESJZWMYMCYTSDSXXSCJPQQSQYLYYZYCMDJDZYWCBTJSYDJKCYDDJLBDJJSODZYSYXQQYXDHHGQQYQHDYXWGMMMAJDYBBBPPBCMUUPLJZSMTXERXJMHQNUTPJDCBSSMSSSTKJTSSMMTRCPLZSZMLQDSDMJMQPNQDXCFYNBFSDQXYXHYAYKQYDDLQYYYSSZBYDSLNTFQTZQPZMCHDHCZCWFDXTMYQSPHQYYXSRGJCWTJTZZQMGWJJTJHTQJBBHWZPXXHYQFXXQYWYYHYSCDYDHHQMNMTMWCPBSZPPZZGLMZFOLLCFWHMMSJZTTDHZZYFFYTZZGZYSKYJXQYJZQBHMBZZLYGHGFMSHPZFZSNCLPBQSNJXZSLXXFPMTYJYGBXLLDLXPZJYZJYHHZCYWHJYLSJEXFSZZYWXKZJLUYDTMLYMQJPWXYHXSKTQJEZRPXXZHHMHWQPWQLYJJQJJZSZCPHJLCHHNXJLQWZJHBMZYXBDHHYPZLHLHLGFWLCHYYTLHJXCJMSCPXSTKPNHQXSRTYXXTESYJCTLSSLSTDLLLWWYHDHRJZSFGXTSYCZYNYHTDHWJSLHTZDQDJZXXQHGYLTZPHCSQFCLNJTCLZPFSTPDYNYLGMJLLYCQHYSSHCHYLHQYQTMZYPBYWRFQYKQSYSLZDQJMPXYYSSRHZJNYWTQDFZBWWTWWRXCWHGYHXMKMYYYQMSMZHNGCEPMLQQMTCWCTMMPXJPJJHFXYYZSXZHTYBMSTSYJTTQQQYYLHYNPYQZLCYZHZWSMYLKFJXLWGXYPJYTYSYXYMZCKTTWLKSMZSYLMPWLZWXWQZSSAQSYXYRHSSNTSRAPXCPWCMGDXHXZDZYFJHGZTTSBJHGYZSZYSMYCLLLXBTYXHBBZJKSSDMALXHYCFYGMQYPJYCQXJLLLJGSLZGQLYCJCCZOTYXMTMTTLLWTGPXYMZMKLPSZZZXHKQYSXCTYJZYHXSHYXZKXLZWPSQPYHJWPJPWXQQYLXSDHMRSLZZYZWTTCYXYSZZSHBSCCSTPLWSSCJCHNLCGCHSSPHYLHFHHXJSXYLLNYLSZDHZXYLSXLWZYKCLDYAXZCMDDYSPJTQJZLNWQPSSSWCTSTSZLBLNXSMNYYMJQBQHRZWTYYDCHQLXKPZWBGQYBKFCMZWPZLLYYLSZYDWHXPSBCMLJBSCGBHXLQHYRLJXYSWXWXZSLDFHLSLYNJLZYFLYJYCDRJLFSYZFSLLCQYQFGJYHYXZLYLMSTDJCYHBZLLNWLXXYGYYHSMGDHXXHHLZZJZXCZZZCYQZFNGWPYLCPKPYYPMCLQKDGXZGGWQBDXZZKZFBXXLZXJTPJPTTBYTSZZDWSLCHZHSLTYXHQLHYXXXYYZYSWTXZKHLXZXZPYHGCHKCFSYHUTJRLXFJXPTZTWHPLYXFCRHXSHXKYXXYHZQDXQWULHYHMJTBFLKHTXCWHJFWJCFPQRYQXCYYYQYGRPYWSGSUNGWCHKZDXYFLXXHJJBYZWTSXXNCYJJYMSWZJQRMHXZWFQSYLZJZGBHYNSLBGTTCSYBYXXWXYHXYYXNSQYXMQYWRGYQLXBBZLJSYLPSYTJZYHYZAWLRORJMKSCZJXXXYXCHDYXRYXXJDTSQFXLYLTSFFYXLMTYJMJUYYYXLTZCSXQZQHZXLYYXZHDNBRXXXJCTYHLBRLMBRLLAXKYLLLJLYXXLYCRYLCJTGJCMTLZLLCYZZPZPCYAWHJJFYBDYYZSMPCKZDQYQPBPCJPDCYZMDPBCYYDYCNNPLMTMLRMFMMGWYZBSJGYGSMZQQQZTXMKQWGXLLPJGZBQCDJJJFPKJKCXBLJMSWMDTQJXLDLPPBXCWRCQFBFQJCZAHZGMYKPHYYHZYKNDKZMBPJYXPXYHLFPNYYGXJDBKXNXHJMZJXSTRSTLDXSKZYSYBZXJLXYSLBZYSLHXJPFXPQNBYLLJQKYGZMCYZZYMCCSLCLHZFWFWYXZMWSXTYNXJHPYYMCYSPMHYSMYDYSHQYZCHMJJMZCAAGCFJBBHPLYZYLXXSDJGXDHKXXTXXNBHRMLYJSLTXMRHNLXQJXYZLLYSWQGDLBJHDCGJYQYCMHWFMJYBMBYJYJWYMDPWHXQLDYGPDFXXBCGJSPCKRSSYZJMSLBZZJFLJJJLGXZGYXYXLSZQYXBEXYXHGCXBPLDYHWETTWWCJMBTXCHXYQXLLXFLYXLLJLSSFWDPZSMYJCLMWYTCZPCHQEKCQBWLCQYDPLQPPQZQFJQDJHYMMCXTXDRMJWRHXCJZYLQXDYYNHYYHRSLSRSYWWZJYMTLTLLGTQCJZYABTCKZCJYCCQLJZQXALMZYHYWLWDXZXQDLLQSHGPJFJLJHJABCQZDJGTKHSSTCYJLPSWZLXZXRWGLDLZRLZXTGSLLLLZLYXXWGDZYGBDPHZPBRLWSXQBPFDWOFMWHLYPCBJCCLDMBZPBZZLCYQXLDOMZBLZWPDWYYGDSTTHCSQSCCRSSSYSLFYBFNTYJSZDFNDPDHDZZMBBLSLCMYFFGTJJQWFTMTPJWFNLBZCMMJTGBDZLQLPYFHYYMJYLSDCHDZJWJCCTLJCLDTLJJCPDDSQDSSZYBNDBJLGGJZXSXNLYCYBJXQYCBYLZCFZPPGKCXZDZFZTJJFJSJXZBNZYJQTTYJYHTYCZHYMDJXTTMPXSPLZCDWSLSHXYPZGTFMLCJTYCBPMGDKWYCYZCDSZZYHFLYCTYGWHKJYYLSJCXGYWJCBLLCSNDDBTZBSCLYZCZZSSQDLLMQYYHFSLQLLXFTYHABXGWNYWYYPLLSDLDLLBJCYXJZMLHLJDXYYQYTDLLLBUGBFDFBBQJZZMDPJHGCLGMJJPGAEHHBWCQXAXHHHZCHXYPHJAXHLPHJPGPZJQCQZGJJZZUZDMQYYBZZPHYHYBWHAZYJHYKFGDPFQSDLZMLJXKXGALXZDAGLMDGXMWZQYXXDXXPFDMMSSYMPFMDMMKXKSYZYSHDZKXSYSMMZZZMSYDNZZCZXFPLSTMZDNMXCKJMZTYYMZMZZMSXHHDCZJEMXXKLJSTLWLSQLYJZLLZJSSDPPMHNLZJCZYHMXXHGZCJMDHXTKGRMXFWMCGMWKDTKSXQMMMFZZYDKMSCLCMPCGMHSPXQPZDSSLCXKYXTWLWJYAHZJGZQMCSNXYYMMPMLKJXMHLMLQMXCTKZMJQYSZJSYSZHSYJZJCDAJZYBSDQJZGWZQQXFKDMSDJLFWEHKZQKJPEYPZYSZCDWYJFFMZZYLTTDZZEFMZLBNPPLPLPEPSZALLTYLKCKQZKGENQLWAGYXYDPXLHSXQQWQCQXQCLHYXXMLYCCWLYMQYSKGCHLCJNSZKPYZKCQZQLJPDMDZHLASXLBYDWQLWDNBQCRYDDZTJYBKBWSZDXDTNPJDTCTQDFXQQMGNXECLTTBKPWSLCTYQLPWYZZKLPYGZCQQPLLKCCYLPQMZCZQCLJSLQZDJXLDDHPZQDLJJXZQDXYZQKZLJCYQDYJPPYPQYKJYRMPCBYMCXKLLZLLFQPYLLLMBSGLCYSSLRSYSQTMXYXZQZFDZUYSYZTFFMZZSMZQHZSSCCMLYXWTPZGXZJGZGSJSGKDDHTQGGZLLBJDZLCBCHYXYZHZFYWXYZYMSDBZZYJGTSMTFXQYXQSTDGSLNXDLRYZZLRYYLXQHTXSRTZNGZXBNQQZFMYKMZJBZYMKBPNLYZPBLMCNQYZZZSJZHJCTZKHYZZJRDYZHNPXGLFZTLKGJTCTSSYLLGZRZBBQZZKLPKLCZYSSUYXBJFPNJZZXCDWXZYJXZZDJJKGGRSRJKMSMZJLSJYWQSKYHQJSXPJZZZLSNSHRNYPZTWCHKLPSRZLZXYJQXQKYSJYCZTLQZYBBYBWZPQDWWYZCYTJCJXCKCWDKKZXSGKDZXWWYYJQYYTCYTDLLXWKCZKKLCCLZCQQDZLQLCSFQCHQHSFSMQZZLNBJJZBSJHTSZDYSJQJPDLZCDCWJKJZZLPYCGMZWDJJBSJQZSYZYHHXJPBJYDSSXDZNCGLQMBTSFSBPDZDLZNFGFJGFSMPXJQLMBLGQCYYXBQKDJJQYRFKZTJDHCZKLBSDZCFJTPLLJGXHYXZCSSZZXSTJYGKGCKGYOQXJPLZPBPGTGYJZGHZQZZLBJLSQFZGKQQJZGYCZBZQTLDXRJXBSXXPZXHYZYCLWDXJJHXMFDZPFZHQHQMQGKSLYHTYCGFRZGNQXCLPDLBZCSCZQLLJBLHBZCYPZZPPDYMZZSGYHCKCPZJGSLJLNSCDSLDLXBMSTLDDFJMKDJDHZLZXLSZQPQPGJLLYBDSZGQLBZLSLKYYHZTTNTJYQTZZPSZQZTLLJTYYLLQLLQYZQLBDZLSLYYZYMDFSZSNHLXZNCZQZPBWSKRFBSYZMTHBLGJPMCZZLSTLXSHTCSYZLZBLFEQHLXFLCJLYLJQCBZLZJHHSSTBRMHXZHJZCLXFNBGXGTQJCZTMSFZKJMSSNXLJKBHSJXNTNLZDNTLMSJXGZJYJCZXYJYJWRWWQNZTNFJSZPZSHZJFYRDJSFSZJZBJFZQZZHZLXFYSBZQLZSGYFTZDCSZXZJBQMSZKJRHYJZCKMJKHCHGTXKXQGLXPXFXTRTYLXJXHDTSJXHJZJXZWZLCQSBTXWXGXTXXHXFTSDKFJHZYJFJXRZSDLLLTQSQQZQWZXSYQTWGWBZCGZLLYZBCLMQQTZHZXZXLJFRMYZFLXYSQXXJKXRMQDZDMMYYBSQBHGZMWFWXGMXLZPYYTGZYCCDXYZXYWGSYJYZNBHPZJSQSYXSXRTFYZGRHZTXSZZTHCBFCLSYXZLZQMZLMPLMXZJXSFLBYZMYQHXJSXRXSQZZZSSLYFRCZJRCRXHHZXQYDYHXSJJHZCXZBTYNSYSXJBQLPXZQPYMLXZKYXLXCJLCYSXXZZLXDLLLJJYHZXGYJWKJRWYHCPSGNRZLFZWFZZNSXGXFLZSXZZZBFCSYJDBRJKRDHHGXJLJJTGXJXXSTJTJXLYXQFCSGSWMSBCTLQZZWLZZKXJMLTMJYHSDDBXGZHDLBMYJFRZFSGCLYJBPMLYSMSXLSZJQQHJZFXGFQFQBPXZGYYQXGZTCQWYLTLGWSGWHRLFSFGZJMGMGBGTJFSYZZGZYZAFLSSPMLPFLCWBJZCLJJMZLPJJLYMQDMYYYFBGYGYZMLYZDXQYXRQQQHSYYYQXYLJTYXFSFSLLGNQCYHYCWFHCCCFXPYLYPLLZYXXXXXKQHHXSHJZCFZSCZJXCPZWHHHHHAPYLQALPQAFYHXDYLUKMZQGGGDDESRNNZLTZGCHYPPYSQJJHCLLJTOLNJPZLJLHYMHEYDYDSQYCDDHGZUNDZCLZYZLLZNTNYZGSLHSLPJJBDGWXPCDUTJCKLKCLWKLLCASSTKZZDNQNTTLYYZSSYSSZZRYLJQKCQDHHCRXRZYDGRGCWCGZQFFFPPJFZYNAKRGYWYQPQXXFKJTSZZXSWZDDFBBXTBGTZKZNPZZPZXZPJSZBMQHKCYXYLDKLJNYPKYGHGDZJXXEAHPNZKZTZCMXCXMMJXNKSZQNMNLWBWWXJKYHCPSTMCSQTZJYXTPCTPDTNNPGLLLZSJLSPBLPLQHDTNJNLYYRSZFFJFQWDPHZDWMRZCCLODAXNSSNYZRESTYJWJYJDBCFXNMWTTBYLWSTSZGYBLJPXGLBOCLHPCBJLTMXZLJYLZXCLTPNCLCKXTPZJSWCYXSFYSZDKNTLBYJCYJLLSTGQCBXRYZXBXKLYLHZLQZLNZCXWJZLJZJNCJHXMNZZGJZZXTZJXYCYYCXXJYYXJJXSSSJSTSSTTPPGQTCSXWZDCSYFPTFBFHFBBLZJCLZZDBXGCXLQPXKFZFLSYLTUWBMQJHSZBMDDBCYSCCLDXYCDDQLYJJWMQLLCSGLJJSYFPYYCCYLTJANTJJPWYCMMGQYYSXDXQMZHSZXPFTWWZQSWQRFKJLZJQQYFBRXJHHFWJJZYQAZMYFRHCYYBYQWLPEXCCZSTYRLTTDMQLYKMBBGMYYJPRKZNPBSXYXBHYZDJDNGHPMFSGMWFZMFQMMBCMZZCJJLCNUXYQLMLRYGQZCYXZLWJGCJCGGMCJNFYZZJHYCPRRCMTZQZXHFQGTJXCCJEAQCRJYHPLQLSZDJRBCQHQDYRHYLYXJSYMHZYDWLDFRYHBPYDTSSCNWBXGLPZMLZZTQSSCPJMXXYCSJYTYCGHYCJWYRXXLFEMWJNMKLLSWTXHYYYNCMMCWJDQDJZGLLJWJRKHPZGGFLCCSCZMCBLTBHBQJXQDSPDJZZGKGLFQYWBZYZJLTSTDHQHCTCBCHFLQMPWDSHYYTQWCNZZJTLBYMBPDYYYXSQKXWYYFLXXNCWCXYPMAELYKKJMZZZBRXYYQJFLJPFHHHYTZZXSGQQMHSPGDZQWBWPJHZJDYSCQWZKTXXSQLZYYMYSDZGRXCKKUJLWPYSYSCSYZLRMLQSYLJXBCXTLWDQZPCYCYKPPPNSXFYZJJRCEMHSZMSXLXGLRWGCSTLRSXBZGBZGZTCPLUJLSLYLYMTXMTZPALZXPXJTJWTCYYZLBLXBZLQMYLXPGHDSLSSDMXMBDZZSXWHAMLCZCPJMCNHJYSNSYGCHSKQMZZQDLLKABLWJXSFMOCDXJRRLYQZKJMYBYQLYHETFJZFRFKSRYXFJTWDSXXSYSQJYSLYXWJHSNLXYYXHBHAWHHJZXWMYLJCSSLKYDZTXBZSYFDXGXZJKHSXXYBSSXDPYNZWRPTQZCZENYGCXQFJYKJBZMLJCMQQXUOXSLYXXLYLLJDZBTYMHPFSTTQQWLHOKYBLZZALZXQLHZWRRQHLSTMYPYXJJXMQSJFNBXYXYJXXYQYLTHYLQYFMLKLJTMLLHSZWKZHLJMLHLJKLJSTLQXYLMBHHLNLZXQJHXCFXXLHYHJJGBYZZKBXSCQDJQDSUJZYYHZHHMGSXCSYMXFEBCQWWRBPYYJQTYZCYQYQQZYHMWFFHGZFRJFCDPXNTQYZPDYKHJLFRZXPPXZDBBGZQSTLGDGYLCQMLCHHMFYWLZYXKJLYPQHSYWMQQGQZMLZJNSQXJQSYJYCBEHSXFSZPXZWFLLBCYYJDYTDTHWZSFJMQQYJLMQXXLLDTTKHHYBFPWTYYSQQWNQWLGWDEBZWCMYGCULKJXTMXMYJSXHYBRWFYMWFRXYQMXYSZTZZTFYKMLDHQDXWYYNLCRYJBLPSXCXYWLSPRRJWXHQYPHTYDNXHHMMYWYTZCSQMTSSCCDALWZTCPQPYJLLQZYJSWXMZZMMYLMXCLMXCZMXMZSQTZPPQQBLPGXQZHFLJJHYTJSRXWZXSCCDLXTYJDCQJXSLQYCLZXLZZXMXQRJMHRHZJBHMFLJLMLCLQNLDXZLLLPYPSYJYSXCQQDCMQJZZXHNPNXZMEKMXHYKYQLXSXTXJYYHWDCWDZHQYYBGYBCYSCFGPSJNZDYZZJZXRZRQJJYMCANYRJTLDPPYZBSTJKXXZYPFDWFGZZRPYMTNGXZQBYXNBUFNQKRJQZMJEGRZGYCLKXZDSKKNSXKCLJSPJYYZLQQJYBZSSQLLLKJXTBKTYLCCDDBLSPPFYLGYDTZJYQGGKQTTFZXBDKTYYHYBBFYTYYBCLPDYTGDHRYRNJSPTCSNYJQHKLLLZSLYDXXWBCJQSPXBPJZJCJDZFFXXBRMLAZHCSNDLBJDSZBLPRZTSWSBXBCLLXXLZDJZSJPYLYXXYFTFFFBHJJXGBYXJPMMMPSSJZJMTLYZJXSWXTYLEDQPJMYGQZJGDJLQJWJQLLSJGJGYGMSCLJJXDTYGJQJQJCJZCJGDZZSXQGSJGGCXHQXSNQLZZBXHSGZXCXYLJXYXYYDFQQJHJFXDHCTXJYRXYSQTJXYEFYYSSYYJXNCYZXFXMSYSZXYYSCHSHXZZZGZZZGFJDLTYLNPZGYJYZYYQZPBXQBDZTZCZYXXYHHSQXSHDHGQHJHGYWSZTMZMLHYXGEBTYLZKQWYTJZRCLEKYSTDBCYKQQSAYXCJXWWGSBHJYZYDHCSJKQCXSWXFLTYNYZPZCCZJQTZWJQDZZZQZLJJXLSBHPYXXPSXSHHEZTXFPTLQYZZXHYTXNCFZYYHXGNXMYWXTZSJPTHHGYMXMXQZXTSBCZYJYXXTYYZYPCQLMMSZMJZZLLZXGXZAAJZYXJMZXWDXZSXZDZXLEYJJZQBHZWZZZQTZPSXZTDSXJJJZNYAZPHXYYSRNQDTHZHYYKYJHDZXZLSWCLYBZYECWCYCRYLCXNHZYDZYDYJDFRJJHTRSQTXYXJRJHOJYNXELXSFSFJZGHPZSXZSZDZCQZBYYKLSGSJHCZSHDGQGXYZGXCHXZJWYQWGYHKSSEQZZNDZFKWYSSTCLZSTSYMCDHJXXYWEYXCZAYDMPXMDSXYBSQMJMZJMTZQLPJYQZCGQHXJHHLXXHLHDLDJQCLDWBSXFZZYYSCHTYTYYBHECXHYKGJPXHHYZJFXHWHBDZFYZBCAPNPGNYDMSXHMMMMAMYNBYJTMPXYYMCTHJBZYFCGTYHWPHFTWZZEZSBZEGPFMTSKFTYCMHFLLHGPZJXZJGZJYXZSBBQSCZZLZCCSTPGXMJSFTCCZJZDJXCYBZLFCJSYZFGSZLYBCWZZBYZDZYPSWYJZXZBDSYUXLZZBZFYGCZXBZHZFTPBGZGEJBSTGKDMFHYZZJHZLLZZGJQZLSFDJSSCBZGPDLFZFZSZYZYZSYGCXSNXXCHCZXTZZLJFZGQSQYXZJQDCCZTQCDXZJYQJQCHXZTDLGSCXZSYQJQTZWLQDQZTQCHQQJZYEZZZPBWKDJFCJPZTYPQYQTTYNLMBDKTJZPQZQZZFPZSBNJLGYJDXJDZZKZGQKXDLPZJTCJDQBXDJQJSTCKNXBXZMSLYJCQMTJQWWCJQNJNLLLHJCWQTBZQYDZCZPZZDZYDDCYZZZCCJTTJFZDPRRTZTJDCQTQZDTJNPLZBCLLCTZSXKJZQZPZLBZRBTJDCXFCZDBCCJJLTQQPLDCGZDBBZJCQDCJWYNLLZYZCCDWLLXWZLXRXNTQQCZXKQLSGDFQTDDGLRLAJJTKUYMKQLLTZYTDYYCZGJWYXDXFRSKSTQTENQMRKQZHHQKDLDAZFKYPBGGPZREBZZYKZZSPEGJXGYKQZZZSLYSYYYZWFQZYLZZLZHWCHKYPQGNPGBLPLRRJYXCCSYYHSFZFYBZYYTGZXYLXCZWXXZJZBLFFLGSKHYJZEYJHLPLLLLCZGXDRZELRHGKLZZYHZLYQSZZJZQLJZFLNBHGWLCZCFJYSPYXZLZLXGCCPZBLLCYBBBBUBBCBPCRNNZCZYRBFSRLDCGQYYQXYGMQZWTZYTYJXYFWTEHZZJYWLCCNTZYJJZDEDPZDZTSYQJHDYMBJNYJZLXTSSTPHNDJXXBYXQTZQDDTJTDYYTGWSCSZQFLSHLGLBCZPHDLYZJYCKWTYTYLBNYTSDSYCCTYSZYYEBHEXHQDTWNYGYCLXTSZYSTQMYGZAZCCSZZDSLZCLZRQXYYELJSBYMXSXZTEMBBLLYYLLYTDQYSHYMRQWKFKBFXNXSBYCHXBWJYHTQBPBSBWDZYLKGZSKYHXQZJXHXJXGNLJKZLYYCDXLFYFGHLJGJYBXQLYBXQPQGZTZPLNCYPXDJYQYDYMRBESJYYHKXXSTMXRCZZYWXYQYBMCLLYZHQYZWQXDBXBZWZMSLPDMYSKFMZKLZCYQYCZLQXFZZYDQZPZYGYJYZMZXDZFYFYTTQTZHGSPCZMLCCYTZXJCYTJMKSLPZHYSNZLLYTPZCTZZCKTXDHXXTQCYFKSMQCCYYAZHTJPCYLZLYJBJXTPNYLJYYNRXSYLMMNXJSMYBCSYSYLZYLXJJQYLDZLPQBFZZBLFNDXQKCZFYWHGQMRDSXYCYTXNQQJZYYPFZXDYZFPRXEJDGYQBXRCNFYYQPGHYJDYZXGRHTKYLNWDZNTSMPKLBTHBPYSZBZTJZSZZJTYYXZPHSSZZBZCZPTQFZMYFLYPYBBJQXZMXXDJMTSYSKKBJZXHJCKLPSMKYJZCXTMLJYXRZZQSLXXQPYZXMKYXXXJCLJPRMYYGADYSKQLSNDHYZKQXZYZTCGHZTLMLWZYBWSYCTBHJHJFCWZTXWYTKZLXQSHLYJZJXTMPLPYCGLTBZZTLZJCYJGDTCLKLPLLQPJMZPAPXYZLKKTKDZCZZBNZDYDYQZJYJGMCTXLTGXSZLMLHBGLKFWNWZHDXUHLFMKYSLGXDTWWFRJEJZTZHYDXYKSHWFZCQSHKTMQQHTZHYMJDJSKHXZJZBZZXYMPAGQMSTPXLSKLZYNWRTSQLSZBPSPSGZWYHTLKSSSWHZZLYYTNXJGMJSZSUFWNLSOZTXGXLSAMMLBWLDSZYLAKQCQCTMYCFJBSLXCLZZCLXXKSBZQCLHJPSQPLSXXCKSLNHPSFQQYTXYJZLQLDXZQJZDYYDJNZPTUZDSKJFSLJHYLZSQZLBTXYDGTQFDBYAZXDZHZJNHHQBYKNXJJQCZMLLJZKSPLDYCLBBLXKLELXJLBQYCXJXGCNLCQPLZLZYJTZLJGYZDZPLTQCSXFDMNYCXGBTJDCZNBGBQYQJWGKFHTNPYQZQGBKPBBYZMTJDYTBLSQMPSXTBNPDXKLEMYYCJYNZCTLDYKZZXDDXHQSHDGMZSJYCCTAYRZLPYLTLKXSLZCGGEXCLFXLKJRTLQJAQZNCMBYDKKCXGLCZJZXJHPTDJJMZQYKQSECQZDSHHADMLZFMMZBGNTJNNLGBYJBRBTMLBYJDZXLCJLPLDLPCQDHLXZLYCBLCXZZJADJLNZMMSSSMYBHBSQKBHRSXXJMXSDZNZPXLGBRHWGGFCXGMSKLLTSJYYCQLTSKYWYYHYWXBXQYWPYWYKQLSQPTNTKHQCWDQKTWPXXHCPTHTWUMSSYHBWCRWXHJMKMZNGWTMLKFGHKJYLSYYCXWHYECLQHKQHTTQKHFZLDXQWYZYYDESBPKYRZPJFYYZJCEQDZZDLATZBBFJLLCXDLMJSSXEGYGSJQXCWBXSSZPDYZCXDNYXPPZYDLYJCZPLTXLSXYZYRXCYYYDYLWWNZSAHJSYQYHGYWWAXTJZDAXYSRLTDPSSYYFNEJDXYZHLXLLLZQZSJNYQYQQXYJGHZGZCYJCHZLYCDSHWSHJZYJXCLLNXZJJYYXNFXMWFPYLCYLLABWDDHWDXJMCXZTZPMLQZHSFHZYNZTLLDYWLSLXHYMMYLMBWWKYXYADTXYLLDJPYBPWUXJMWMLLSAFDLLYFLBHHHBQQLTZJCQJLDJTFFKMMMBYTHYGDCQRDDWRQJXNBYSNWZDBYYTBJHPYBYTTJXAAHGQDQTMYSTQXKBTZPKJLZRBEQQSSMJJBDJOTGTBXPGBKTLHQXJJJCTHXQDWJLWRFWQGWSHCKRYSWGFTGYGBXSDWDWRFHWYTJJXXXJYZYSLPYYYPAYXHYDQKXSHXYXGSKQHYWFDDDPPLCJLQQEEWXKSYYKDYPLTJTHKJLTCYYHHJTTPLTZZCDLTHQKZXQYSTEEYWYYZYXXYYSTTJKLLPZMCYHQGXYHSRMBXPLLNQYDQHXSXXWGDQBSHYLLPJJJTHYJKYPPTHYYKTYEZYENMDSHLCRPQFDGFXZPSFTLJXXJBSWYYSKSFLXLPPLBBBLBSFXFYZBSJSSYLPBBFFFFSSCJDSTZSXZRYYSYFFSYZYZBJTBCTSBSDHRTJJBYTCXYJEYLXCBNEBJDSYXYKGSJZBXBYTFZWGENYHHTHZHHXFWGCSTBGXKLSXYWMTMBYXJSTZSCDYQRCYTWXZFHMYMCXLZNSDJTTTXRYCFYJSBSDYERXJLJXBBDEYNJGHXGCKGSCYMBLXJMSZNSKGXFBNBPTHFJAAFXYXFPXMYPQDTZCXZZPXRSYWZDLYBBKTYQPQJPZYPZJZNJPZJLZZFYSBTTSLMPTZRTDXQSJEHBZYLZDHLJSQMLHTXTJECXSLZZSPKTLZKQQYFSYGYWPCPQFHQHYTQXZKRSGTTSQCZLPTXCDYYZXSQZSLXLZMYCPCQBZYXHBSXLZDLTCDXTYLZJYYZPZYZLTXJSJXHLPMYTXCQRBLZSSFJZZTNJYTXMYJHLHPPLCYXQJQQKZZSCPZKSWALQSBLCCZJSXGWWWYGYKTJBBZTDKHXHKGTGPBKQYSLPXPJCKBMLLXDZSTBKLGGQKQLSBKKTFXRMDKBFTPZFRTBBRFERQGXYJPZSSTLBZTPSZQZSJDHLJQLZBPMSMMSXLQQNHKNBLRDDNXXDHDDJCYYGYLXGZLXSYGMQQGKHBPMXYXLYTQWLWGCPBMQXCYZYDRJBHTDJYHQSHTMJSBYPLWHLZFFNYPMHXXHPLTBQPFBJWQDBYGPNZTPFZJGSDDTQSHZEAWZZYLLTYYBWJKXXGHLFKXDJTMSZSQYNZGGSWQSPHTLSSKMCLZXYSZQZXNCJDQGZDLFNYKLJCJLLZLMZZNHYDSSHTHZZLZZBBHQZWWYCRZHLYQQJBEYFXXXWHSRXWQHWPSLMSSKZTTYGYQQWRSLALHMJTQJSMXQBJJZJXZYZKXBYQXBJXSHZTSFJLXMXZXFGHKZSZGGYLCLSARJYHSLLLMZXELGLXYDJYTLFBHBPNLYZFBBHPTGJKWETZHKJJXZXXGLLJLSTGSHJJYQLQZFKCGNNDJSSZFDBCTWWSEQFHQJBSAQTGYPQLBXBMMYWXGSLZHGLZGQYFLZBYFZJFRYSFMBYZHQGFWZSYFYJJPHZBYYZFFWODGRLMFTWLBZGYCQXCDJYGZYYYYTYTYDWEGAZYHXJLZYYHLRMGRXXZCLHNELJJTJTPWJYBJJBXJJTJTEEKHWSLJPLPSFYZPQQBDLQJJTYYQLYZKDKSQJYYQZLDQTGJQYZJSUCMRYQTHTEJMFCTYHYPKMHYZWJDQFHYYXWSHCTXRLJHQXHCCYYYJLTKTTYTMXGTCJTZAYYOCZLYLBSZYWJYTSJYHBYSHFJLYGJXXTMZYYLTXXYPZLXYJZYZYYPNHMYMDYYLBLHLSYYQQLLNJJYMSOYQBZGDLYXYLCQYXTSZEGXHZGLHWBLJHEYXTWQMAKBPQCGYSHHEGQCMWYYWLJYJHYYZLLJJYLHZYHMGSLJLJXCJJYCLYCJPCPZJZJMMYLCQLNQLJQJSXYJMLSZLJQLYCMMHCFMMFPQQMFYLQMCFFQMMMMHMZNFHHJGTTHHKHSLNCHHYQDXTMMQDCYZYXYQMYQYLTDCYYYZAZZCYMZYDLZFFFMMYCQZWZZMABTBYZTDMNZZGGDFTYPCGQYTTSSFFWFDTZQSSYSTWXJHXYTSXXYLBYQHWWKXHZXWZNNZZJZJJQJCCCHYYXBZXZCYZTLLCQXYNJYCYYCYNZZQYYYEWYCZDCJYCCHYJLBTZYYCQWMPWPYMLGKDLDLGKQQBGYCHJXY
"
;
//此处收录了375个多音字
var
oMultiDiff
=
{
"
19969
"
:
"
DZ
"
,
"
19975
"
:
"
WM
"
,
"
19988
"
:
"
QJ
"
,
"
20048
"
:
"
YL
"
,
"
20056
"
:
"
SC
"
,
"
20060
"
:
"
NM
"
,
"
20094
"
:
"
QG
"
,
"
20127
"
:
"
QJ
"
,
"
20167
"
:
"
QC
"
,
"
20193
"
:
"
YG
"
,
"
20250
"
:
"
KH
"
,
"
20256
"
:
"
ZC
"
,
"
20282
"
:
"
SC
"
,
"
20285
"
:
"
QJG
"
,
"
20291
"
:
"
TD
"
,
"
20314
"
:
"
YD
"
,
"
20340
"
:
"
NE
"
,
"
20375
"
:
"
TD
"
,
"
20389
"
:
"
YJ
"
,
"
20391
"
:
"
CZ
"
,
"
20415
"
:
"
PB
"
,
"
20446
"
:
"
YS
"
,
"
20447
"
:
"
SQ
"
,
"
20504
"
:
"
TC
"
,
"
20608
"
:
"
KG
"
,
"
20854
"
:
"
QJ
"
,
"
20857
"
:
"
ZC
"
,
"
20911
"
:
"
PF
"
,
"
20504
"
:
"
TC
"
,
"
20608
"
:
"
KG
"
,
"
20854
"
:
"
QJ
"
,
"
20857
"
:
"
ZC
"
,
"
20911
"
:
"
PF
"
,
"
20985
"
:
"
AW
"
,
"
21032
"
:
"
PB
"
,
"
21048
"
:
"
XQ
"
,
"
21049
"
:
"
SC
"
,
"
21089
"
:
"
YS
"
,
"
21119
"
:
"
JC
"
,
"
21242
"
:
"
SB
"
,
"
21273
"
:
"
SC
"
,
"
21305
"
:
"
YP
"
,
"
21306
"
:
"
QO
"
,
"
21330
"
:
"
ZC
"
,
"
21333
"
:
"
SDC
"
,
"
21345
"
:
"
QK
"
,
"
21378
"
:
"
CA
"
,
"
21397
"
:
"
SC
"
,
"
21414
"
:
"
XS
"
,
"
21442
"
:
"
SC
"
,
"
21477
"
:
"
JG
"
,
"
21480
"
:
"
TD
"
,
"
21484
"
:
"
ZS
"
,
"
21494
"
:
"
YX
"
,
"
21505
"
:
"
YX
"
,
"
21512
"
:
"
HG
"
,
"
21523
"
:
"
XH
"
,
"
21537
"
:
"
PB
"
,
"
21542
"
:
"
PF
"
,
"
21549
"
:
"
KH
"
,
"
21571
"
:
"
E
"
,
"
21574
"
:
"
DA
"
,
"
21588
"
:
"
TD
"
,
"
21589
"
:
"
O
"
,
"
21618
"
:
"
ZC
"
,
"
21621
"
:
"
KHA
"
,
"
21632
"
:
"
ZJ
"
,
"
21654
"
:
"
KG
"
,
"
21679
"
:
"
LKG
"
,
"
21683
"
:
"
KH
"
,
"
21710
"
:
"
A
"
,
"
21719
"
:
"
YH
"
,
"
21734
"
:
"
WOE
"
,
"
21769
"
:
"
A
"
,
"
21780
"
:
"
WN
"
,
"
21804
"
:
"
XH
"
,
"
21834
"
:
"
A
"
,
"
21899
"
:
"
ZD
"
,
"
21903
"
:
"
RN
"
,
"
21908
"
:
"
WO
"
,
"
21939
"
:
"
ZC
"
,
"
21956
"
:
"
SA
"
,
"
21964
"
:
"
YA
"
,
"
21970
"
:
"
TD
"
,
"
22003
"
:
"
A
"
,
"
22031
"
:
"
JG
"
,
"
22040
"
:
"
XS
"
,
"
22060
"
:
"
ZC
"
,
"
22066
"
:
"
ZC
"
,
"
22079
"
:
"
MH
"
,
"
22129
"
:
"
XJ
"
,
"
22179
"
:
"
XA
"
,
"
22237
"
:
"
NJ
"
,
"
22244
"
:
"
TD
"
,
"
22280
"
:
"
JQ
"
,
"
22300
"
:
"
YH
"
,
"
22313
"
:
"
XW
"
,
"
22331
"
:
"
YQ
"
,
"
22343
"
:
"
YJ
"
,
"
22351
"
:
"
PH
"
,
"
22395
"
:
"
DC
"
,
"
22412
"
:
"
TD
"
,
"
22484
"
:
"
PB
"
,
"
22500
"
:
"
PB
"
,
"
22534
"
:
"
ZD
"
,
"
22549
"
:
"
DH
"
,
"
22561
"
:
"
PB
"
,
"
22612
"
:
"
TD
"
,
"
22771
"
:
"
KQ
"
,
"
22831
"
:
"
HB
"
,
"
22841
"
:
"
JG
"
,
"
22855
"
:
"
QJ
"
,
"
22865
"
:
"
XQ
"
,
"
23013
"
:
"
ML
"
,
"
23081
"
:
"
WM
"
,
"
23487
"
:
"
SX
"
,
"
23558
"
:
"
QJ
"
,
"
23561
"
:
"
YW
"
,
"
23586
"
:
"
YW
"
,
"
23614
"
:
"
YW
"
,
"
23615
"
:
"
SN
"
,
"
23631
"
:
"
PB
"
,
"
23646
"
:
"
ZS
"
,
"
23663
"
:
"
ZT
"
,
"
23673
"
:
"
YG
"
,
"
23762
"
:
"
TD
"
,
"
23769
"
:
"
ZS
"
,
"
23780
"
:
"
QJ
"
,
"
23884
"
:
"
QK
"
,
"
24055
"
:
"
XH
"
,
"
24113
"
:
"
DC
"
,
"
24162
"
:
"
ZC
"
,
"
24191
"
:
"
GA
"
,
"
24273
"
:
"
QJ
"
,
"
24324
"
:
"
NL
"
,
"
24377
"
:
"
TD
"
,
"
24378
"
:
"
QJ
"
,
"
24439
"
:
"
PF
"
,
"
24554
"
:
"
ZS
"
,
"
24683
"
:
"
TD
"
,
"
24694
"
:
"
WE
"
,
"
24733
"
:
"
LK
"
,
"
24925
"
:
"
TN
"
,
"
25094
"
:
"
ZG
"
,
"
25100
"
:
"
XQ
"
,
"
25103
"
:
"
XH
"
,
"
25153
"
:
"
PB
"
,
"
25170
"
:
"
PB
"
,
"
25179
"
:
"
KG
"
,
"
25203
"
:
"
PB
"
,
"
25240
"
:
"
ZS
"
,
"
25282
"
:
"
FB
"
,
"
25303
"
:
"
NA
"
,
"
25324
"
:
"
KG
"
,
"
25341
"
:
"
ZY
"
,
"
25373
"
:
"
WZ
"
,
"
25375
"
:
"
XJ
"
,
"
25384
"
:
"
A
"
,
"
25457
"
:
"
A
"
,
"
25528
"
:
"
SD
"
,
"
25530
"
:
"
SC
"
,
"
25552
"
:
"
TD
"
,
"
25774
"
:
"
ZC
"
,
"
25874
"
:
"
ZC
"
,
"
26044
"
:
"
YW
"
,
"
26080
"
:
"
WM
"
,
"
26292
"
:
"
PB
"
,
"
26333
"
:
"
PB
"
,
"
26355
"
:
"
ZY
"
,
"
26366
"
:
"
CZ
"
,
"
26397
"
:
"
ZC
"
,
"
26399
"
:
"
QJ
"
,
"
26415
"
:
"
ZS
"
,
"
26451
"
:
"
SB
"
,
"
26526
"
:
"
ZC
"
,
"
26552
"
:
"
JG
"
,
"
26561
"
:
"
TD
"
,
"
26588
"
:
"
JG
"
,
"
26597
"
:
"
CZ
"
,
"
26629
"
:
"
ZS
"
,
"
26638
"
:
"
YL
"
,
"
26646
"
:
"
XQ
"
,
"
26653
"
:
"
KG
"
,
"
26657
"
:
"
XJ
"
,
"
26727
"
:
"
HG
"
,
"
26894
"
:
"
ZC
"
,
"
26937
"
:
"
ZS
"
,
"
26946
"
:
"
ZC
"
,
"
26999
"
:
"
KJ
"
,
"
27099
"
:
"
KJ
"
,
"
27449
"
:
"
YQ
"
,
"
27481
"
:
"
XS
"
,
"
27542
"
:
"
ZS
"
,
"
27663
"
:
"
ZS
"
,
"
27748
"
:
"
TS
"
,
"
27784
"
:
"
SC
"
,
"
27788
"
:
"
ZD
"
,
"
27795
"
:
"
TD
"
,
"
27812
"
:
"
O
"
,
"
27850
"
:
"
PB
"
,
"
27852
"
:
"
MB
"
,
"
27895
"
:
"
SL
"
,
"
27898
"
:
"
PL
"
,
"
27973
"
:
"
QJ
"
,
"
27981
"
:
"
KH
"
,
"
27986
"
:
"
HX
"
,
"
27994
"
:
"
XJ
"
,
"
28044
"
:
"
YC
"
,
"
28065
"
:
"
WG
"
,
"
28177
"
:
"
SM
"
,
"
28267
"
:
"
QJ
"
,
"
28291
"
:
"
KH
"
,
"
28337
"
:
"
ZQ
"
,
"
28463
"
:
"
TL
"
,
"
28548
"
:
"
DC
"
,
"
28601
"
:
"
TD
"
,
"
28689
"
:
"
PB
"
,
"
28805
"
:
"
JG
"
,
"
28820
"
:
"
QG
"
,
"
28846
"
:
"
PB
"
,
"
28952
"
:
"
TD
"
,
"
28975
"
:
"
ZC
"
,
"
29100
"
:
"
A
"
,
"
29325
"
:
"
QJ
"
,
"
29575
"
:
"
SL
"
,
"
29602
"
:
"
FB
"
,
"
30010
"
:
"
TD
"
,
"
30044
"
:
"
CX
"
,
"
30058
"
:
"
PF
"
,
"
30091
"
:
"
YSP
"
,
"
30111
"
:
"
YN
"
,
"
30229
"
:
"
XJ
"
,
"
30427
"
:
"
SC
"
,
"
30465
"
:
"
SX
"
,
"
30631
"
:
"
YQ
"
,
"
30655
"
:
"
QJ
"
,
"
30684
"
:
"
QJG
"
,
"
30707
"
:
"
SD
"
,
"
30729
"
:
"
XH
"
,
"
30796
"
:
"
LG
"
,
"
30917
"
:
"
PB
"
,
"
31074
"
:
"
NM
"
,
"
31085
"
:
"
JZ
"
,
"
31109
"
:
"
SC
"
,
"
31181
"
:
"
ZC
"
,
"
31192
"
:
"
MLB
"
,
"
31293
"
:
"
JQ
"
,
"
31400
"
:
"
YX
"
,
"
31584
"
:
"
YJ
"
,
"
31896
"
:
"
ZN
"
,
"
31909
"
:
"
ZY
"
,
"
31995
"
:
"
XJ
"
,
"
32321
"
:
"
PF
"
,
"
32327
"
:
"
ZY
"
,
"
32418
"
:
"
HG
"
,
"
32420
"
:
"
XQ
"
,
"
32421
"
:
"
HG
"
,
"
32438
"
:
"
LG
"
,
"
32473
"
:
"
GJ
"
,
"
32488
"
:
"
TD
"
,
"
32521
"
:
"
QJ
"
,
"
32527
"
:
"
PB
"
,
"
32562
"
:
"
ZSQ
"
,
"
32564
"
:
"
JZ
"
,
"
32735
"
:
"
ZD
"
,
"
32793
"
:
"
PB
"
,
"
33071
"
:
"
PF
"
,
"
33098
"
:
"
XL
"
,
"
33100
"
:
"
YA
"
,
"
33152
"
:
"
PB
"
,
"
33261
"
:
"
CX
"
,
"
33324
"
:
"
BP
"
,
"
33333
"
:
"
TD
"
,
"
33406
"
:
"
YA
"
,
"
33426
"
:
"
WM
"
,
"
33432
"
:
"
PB
"
,
"
33445
"
:
"
JG
"
,
"
33486
"
:
"
ZN
"
,
"
33493
"
:
"
TS
"
,
"
33507
"
:
"
QJ
"
,
"
33540
"
:
"
QJ
"
,
"
33544
"
:
"
ZC
"
,
"
33564
"
:
"
XQ
"
,
"
33617
"
:
"
YT
"
,
"
33632
"
:
"
QJ
"
,
"
33636
"
:
"
XH
"
,
"
33637
"
:
"
YX
"
,
"
33694
"
:
"
WG
"
,
"
33705
"
:
"
PF
"
,
"
33728
"
:
"
YW
"
,
"
33882
"
:
"
SR
"
,
"
34067
"
:
"
WM
"
,
"
34074
"
:
"
YW
"
,
"
34121
"
:
"
QJ
"
,
"
34255
"
:
"
ZC
"
,
"
34259
"
:
"
XL
"
,
"
34425
"
:
"
JH
"
,
"
34430
"
:
"
XH
"
,
"
34485
"
:
"
KH
"
,
"
34503
"
:
"
YS
"
,
"
34532
"
:
"
HG
"
,
"
34552
"
:
"
XS
"
,
"
34558
"
:
"
YE
"
,
"
34593
"
:
"
ZL
"
,
"
34660
"
:
"
YQ
"
,
"
34892
"
:
"
XH
"
,
"
34928
"
:
"
SC
"
,
"
34999
"
:
"
QJ
"
,
"
35048
"
:
"
PB
"
,
"
35059
"
:
"
SC
"
,
"
35098
"
:
"
ZC
"
,
"
35203
"
:
"
TQ
"
,
"
35265
"
:
"
JX
"
,
"
35299
"
:
"
JX
"
,
"
35782
"
:
"
SZ
"
,
"
35828
"
:
"
YS
"
,
"
35830
"
:
"
E
"
,
"
35843
"
:
"
TD
"
,
"
35895
"
:
"
YG
"
,
"
35977
"
:
"
MH
"
,
"
36158
"
:
"
JG
"
,
"
36228
"
:
"
QJ
"
,
"
36426
"
:
"
XQ
"
,
"
36466
"
:
"
DC
"
,
"
36710
"
:
"
JC
"
,
"
36711
"
:
"
ZYG
"
,
"
36767
"
:
"
PB
"
,
"
36866
"
:
"
SK
"
,
"
36951
"
:
"
YW
"
,
"
37034
"
:
"
YX
"
,
"
37063
"
:
"
XH
"
,
"
37218
"
:
"
ZC
"
,
"
37325
"
:
"
ZC
"
,
"
38063
"
:
"
PB
"
,
"
38079
"
:
"
TD
"
,
"
38085
"
:
"
QY
"
,
"
38107
"
:
"
DC
"
,
"
38116
"
:
"
TD
"
,
"
38123
"
:
"
YD
"
,
"
38224
"
:
"
HG
"
,
"
38241
"
:
"
XTC
"
,
"
38271
"
:
"
ZC
"
,
"
38415
"
:
"
YE
"
,
"
38426
"
:
"
KH
"
,
"
38461
"
:
"
YD
"
,
"
38463
"
:
"
AE
"
,
"
38466
"
:
"
PB
"
,
"
38477
"
:
"
XJ
"
,
"
38518
"
:
"
YT
"
,
"
38551
"
:
"
WK
"
,
"
38585
"
:
"
ZC
"
,
"
38704
"
:
"
XS
"
,
"
38739
"
:
"
LJ
"
,
"
38761
"
:
"
GJ
"
,
"
38808
"
:
"
SQ
"
,
"
39048
"
:
"
JG
"
,
"
39049
"
:
"
XJ
"
,
"
39052
"
:
"
HG
"
,
"
39076
"
:
"
CZ
"
,
"
39271
"
:
"
XT
"
,
"
39534
"
:
"
TD
"
,
"
39552
"
:
"
TD
"
,
"
39584
"
:
"
PB
"
,
"
39647
"
:
"
SB
"
,
"
39730
"
:
"
LG
"
,
"
39748
"
:
"
TPB
"
,
"
40109
"
:
"
ZQ
"
,
"
40479
"
:
"
ND
"
,
"
40516
"
:
"
HG
"
,
"
40536
"
:
"
HG
"
,
"
40583
"
:
"
QJ
"
,
"
40765
"
:
"
YQ
"
,
"
40784
"
:
"
QJ
"
,
"
40840
"
:
"
YK
"
,
"
40863
"
:
"
QJG
"
};
function
checkCh
(
ch
)
{
var
uni
=
ch
.
charCodeAt
(
0
);
//如果不在汉字处理范围之内,返回原字符,也可以调用自己的处理函数
if
(
uni
>
40869
||
uni
<
19968
)
return
ch
;
//dealWithOthers(ch);
//检查是否是多音字,是按多音字处理,不是就直接在strChineseFirstPY字符串中找对应的首字母
return
(
oMultiDiff
[
uni
]
?
oMultiDiff
[
uni
]
:
(
strChineseFirstPY
.
charAt
(
uni
-
19968
)));
}
function
mkRslt
(
arr
)
{
var
arrRslt
=
[
""
];
for
(
var
i
=
0
,
len
=
arr
.
length
;
i
<
len
;
i
++
)
{
var
str
=
arr
[
i
];
var
strlen
=
str
.
length
;
if
(
strlen
==
1
)
{
for
(
var
k
=
0
;
k
<
arrRslt
.
length
;
k
++
)
{
arrRslt
[
k
]
+=
str
;
}
}
else
{
var
tmpArr
=
arrRslt
.
slice
(
0
);
arrRslt
=
[];
for
(
k
=
0
;
k
<
strlen
;
k
++
)
{
//复制一个相同的arrRslt
var
tmp
=
tmpArr
.
slice
(
0
);
//把当前字符str[k]添加到每个元素末尾
for
(
var
j
=
0
;
j
<
tmp
.
length
;
j
++
)
{
tmp
[
j
]
+=
str
.
charAt
(
k
);
}
//把复制并修改后的数组连接到arrRslt上
arrRslt
=
arrRslt
.
concat
(
tmp
);
}
}
}
return
arrRslt
;
}
//两端去空格函数
String
.
prototype
.
trim
=
function
()
{
return
this
.
replace
(
/
(
^
\s
*
)
|
(\s
*$
)
/g
,
""
);
}
//参数——中文字符串
//返回值——拼音首字母串数组
export
function
getFirstLetterList
(
str
)
{
if
(
typeof
(
str
)
!=
"
string
"
)
throw
new
Error
(
-
1
,
"
请传入字符串类型的参数!
"
);
var
arrResult
=
new
Array
();
//保存中间结果的数组
for
(
var
i
=
0
,
len
=
str
.
length
;
i
<
len
;
i
++
)
{
//获得unicode码
var
ch
=
str
.
charAt
(
i
);
//检查该unicode码是否在处理范围之内,在则返回该码对映汉字的拼音首字母,不在则调用其它函数处理
arrResult
.
push
(
checkCh
(
ch
));
}
//处理arrResult,返回所有可能的拼音首字母串数组
return
mkRslt
(
arrResult
);
}
// 判断字符串是否全是中文
function
isAllChinese
(
str
)
{
return
/^
[\u
4E00-
\u
9FA5
]
+$/
.
test
(
str
);
}
// 判断字符是否为中文
function
isChinese
(
char
)
{
return
/^
[\u
4E00-
\u
9FA5
]
$/
.
test
(
char
);
}
// 中文拼音名称排序
export
const
sortListByCN
=
(
vodList
,
key
,
order
)
=>
{
if
(
!
key
){
return
vodList
}
order
=
order
||
'
asc
'
;
// 默认正序
let
ASCarr
=
vodList
.
sort
((
a
,
b
)
=>
{
a
=
a
[
key
];
b
=
b
[
key
];
// 数字排在字符串前面
if
(
typeof
a
===
'
number
'
&&
typeof
b
===
'
string
'
)
{
return
-
1
;
}
if
(
typeof
a
===
'
string
'
&&
typeof
b
===
'
number
'
)
{
return
1
;
}
// 当存在非数字时
if
(
isNaN
(
a
)
||
isNaN
(
b
))
{
// 全汉字的排在非全汉字的后面
if
(
isAllChinese
(
a
)
&&
!
isAllChinese
(
b
))
{
return
1
;
}
if
(
!
isAllChinese
(
a
)
&&
isAllChinese
(
b
))
{
return
-
1
;
}
// 存在非数字的数据时,都转为字符串进行比较
a
=
a
.
toString
();
b
=
b
.
toString
();
let
result
=
0
;
// 依次比较两个字符串的各项字符
for
(
let
index
=
0
;
index
<
((
a
.
length
-
b
.
length
)
?
b
.
length
:
a
.
length
);
index
++
)
{
// 汉字排在非汉字的后面
if
(
!
isChinese
(
a
[
index
])
&&
isChinese
(
b
[
index
]))
{
result
=
-
1
;
}
if
(
isChinese
(
a
[
index
])
&&
!
isChinese
(
b
[
index
]))
{
result
=
1
;
}
// 若两个汉字进行比较,则比较他们的拼音首字母
if
(
isChinese
(
a
[
index
])
&&
isChinese
(
b
[
index
]))
{
let
pinyinA
=
getFirstLetterList
(
a
[
index
]).
toString
();
let
pinyinB
=
getFirstLetterList
(
b
[
index
]).
toString
();
result
=
pinyinA
.
localeCompare
(
pinyinB
,
'
zh-Hans-CN
'
,
{
sensitivity
:
'
accent
'
});
}
// 若已经比较出结果,则跳出循环,不再继续比较剩余字符
if
(
result
!==
0
)
{
break
}
}
// 只要有一个无法转换为数字——转换为字符串进行比较——先按字符排序,然后按照数字排序
return
result
||
a
.
toString
().
localeCompare
(
b
.
toString
(),
'
zh-Hans-CN
'
,
{
sensitivity
:
'
accent
'
});
}
else
{
// 都能转换为数字——转换为数字进行比较——从小到大排序
return
Number
(
a
)
-
Number
(
b
);
}
});
if
(
order
===
'
desc
'
){
ASCarr
.
reverse
();
}
return
ASCarr
};
// 首字母开头排序
export
const
sortListByFirst
=
(
vodList
,
key
)
=>
{
key
=
key
||
'
vod_name
'
;
// 名字以特殊符号开头的应用列表
const
symbol_list
=
[];
// 名字以中文开头的应用列表
const
cn_list
=
[];
// 名字以英文开头的应用列表
const
en_list
=
[];
// 名字以数字开头的应用列表
const
num_list
=
[];
vodList
.
forEach
((
vod
)
=>
{
const
{
vod_name
}
=
vod
;
//通过正则进行数据分类
if
(
/
[\u
4e00-
\u
9fa5
]
/
.
test
(
vod_name
[
0
]))
{
cn_list
.
push
(
vod
);
}
else
if
(
/
[
a-zA-Z
]
/
.
test
(
vod_name
[
0
]))
{
en_list
.
push
(
vod
);
}
else
if
(
/
[\d]
/
.
test
(
vod_name
[
0
]))
{
num_list
.
push
(
vod
);
}
else
{
symbol_list
.
push
(
vod
);
}
});
//按照要求的方式进行数据排序重组
const
newList
=
[
...
cn_list
.
sort
((
a
,
b
)
=>
a
.
vod_name
[
0
]?.
localeCompare
(
b
.
vod_name
[
0
])),
...
en_list
.
sort
((
a
,
b
)
=>
a
.
vod_name
[
0
].
localeCompare
(
b
.
vod_name
[
0
])),
//localeCompare可以不区分大小写的进行排序
...
num_list
.
sort
((
a
,
b
)
=>
a
.
vod_name
[
0
]
-
b
.
vod_name
[
0
]),
...
symbol_list
.
sort
((
a
,
b
)
=>
a
.
vod_name
[
0
]
-
b
.
vod_name
[
0
])
];
return
newList
};
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录