@whitesev/utils 2.8.0 → 2.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +176 -176
- package/dist/index.amd.js +896 -875
- package/dist/index.amd.js.map +1 -1
- package/dist/index.cjs.js +896 -875
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.esm.js +896 -875
- package/dist/index.esm.js.map +1 -1
- package/dist/index.iife.js +896 -875
- package/dist/index.iife.js.map +1 -1
- package/dist/index.system.js +896 -875
- package/dist/index.system.js.map +1 -1
- package/dist/index.umd.js +896 -875
- package/dist/index.umd.js.map +1 -1
- package/dist/types/src/CommonUtil.d.ts +59 -59
- package/dist/types/src/DOMUtils.d.ts +1 -1
- package/dist/types/src/Dictionary.d.ts +1 -1
- package/dist/types/src/Httpx.d.ts +2 -2
- package/dist/types/src/Progress.d.ts +0 -4
- package/dist/types/src/TryCatch.d.ts +2 -2
- package/dist/types/src/Utils.d.ts +365 -365
- package/dist/types/src/UtilsGMCookie.d.ts +2 -2
- package/dist/types/src/UtilsGMMenu.d.ts +1 -1
- package/dist/types/src/indexedDB.d.ts +3 -3
- package/dist/types/src/types/Event.d.ts +188 -188
- package/dist/types/src/types/Httpx.d.ts +1344 -1343
- package/dist/types/src/types/Log.d.ts +19 -19
- package/dist/types/src/types/Progress.d.ts +20 -20
- package/dist/types/src/types/React.d.ts +119 -119
- package/dist/types/src/types/TryCatch.d.ts +9 -9
- package/dist/types/src/types/UtilsGMCookie.d.ts +93 -93
- package/dist/types/src/types/UtilsGMMenu.d.ts +77 -77
- package/dist/types/src/types/Vue2.d.ts +166 -166
- package/dist/types/src/types/WindowApi.d.ts +14 -14
- package/dist/types/src/types/ajaxHooker.d.ts +151 -151
- package/dist/types/src/types/env.d.ts +7 -2
- package/dist/types/src/types/global.d.ts +31 -31
- package/index.ts +3 -0
- package/package.json +19 -8
- package/src/ColorConversion.ts +105 -106
- package/src/CommonUtil.ts +280 -279
- package/src/DOMUtils.ts +251 -272
- package/src/Dictionary.ts +153 -154
- package/src/GBKEncoder.ts +108 -112
- package/src/Hooks.ts +73 -81
- package/src/Httpx.ts +1457 -1466
- package/src/LockFunction.ts +62 -62
- package/src/Log.ts +258 -259
- package/src/ModuleRaid.js +1 -0
- package/src/Progress.ts +108 -114
- package/src/TryCatch.ts +86 -86
- package/src/Utils.ts +4773 -4825
- package/src/UtilsCommon.ts +14 -14
- package/src/UtilsGMCookie.ts +254 -261
- package/src/UtilsGMMenu.ts +445 -454
- package/src/Vue.ts +233 -229
- package/src/WindowApi.ts +59 -59
- package/src/ajaxHooker/ajaxHooker.js +1 -0
- package/src/indexedDB.ts +497 -502
- package/src/types/Event.d.ts +188 -188
- package/src/types/Httpx.d.ts +1344 -1343
- package/src/types/Log.d.ts +19 -19
- package/src/types/Progress.d.ts +20 -20
- package/src/types/React.d.ts +119 -119
- package/src/types/TryCatch.d.ts +9 -9
- package/src/types/UtilsGMCookie.d.ts +93 -93
- package/src/types/UtilsGMMenu.d.ts +77 -77
- package/src/types/Vue2.d.ts +166 -166
- package/src/types/WindowApi.d.ts +14 -14
- package/src/types/ajaxHooker.d.ts +151 -151
- package/src/types/env.d.ts +7 -2
- package/src/types/global.d.ts +31 -31
package/dist/index.cjs.js
CHANGED
|
@@ -9,7 +9,7 @@ class ColorConversion {
|
|
|
9
9
|
if (typeof str !== "string") {
|
|
10
10
|
return false;
|
|
11
11
|
}
|
|
12
|
-
if (!str.match(/^(
|
|
12
|
+
if (!str.match(/^(#|)[0-9a-fA-F]{6}$/)) {
|
|
13
13
|
return false;
|
|
14
14
|
}
|
|
15
15
|
return true;
|
|
@@ -23,18 +23,10 @@ class ColorConversion {
|
|
|
23
23
|
*/
|
|
24
24
|
hexToRgba(hex, opacity) {
|
|
25
25
|
if (!this.isHex(hex)) {
|
|
26
|
-
throw new TypeError(
|
|
26
|
+
throw new TypeError(`输入错误的hex:${hex}`);
|
|
27
27
|
}
|
|
28
28
|
return hex && hex.replace(/\s+/g, "").length === 7
|
|
29
|
-
?
|
|
30
|
-
parseInt("0x" + hex.slice(1, 3)) +
|
|
31
|
-
"," +
|
|
32
|
-
parseInt("0x" + hex.slice(3, 5)) +
|
|
33
|
-
"," +
|
|
34
|
-
parseInt("0x" + hex.slice(5, 7)) +
|
|
35
|
-
"," +
|
|
36
|
-
opacity +
|
|
37
|
-
")"
|
|
29
|
+
? `rgba(${parseInt(`0x${hex.slice(1, 3)}`)},${parseInt(`0x${hex.slice(3, 5)}`)},${parseInt(`0x${hex.slice(5, 7)}`)},${opacity})`
|
|
38
30
|
: "";
|
|
39
31
|
}
|
|
40
32
|
/**
|
|
@@ -43,14 +35,15 @@ class ColorConversion {
|
|
|
43
35
|
*/
|
|
44
36
|
hexToRgb(str) {
|
|
45
37
|
if (!this.isHex(str)) {
|
|
46
|
-
throw new TypeError(
|
|
38
|
+
throw new TypeError(`输入错误的hex:${str}`);
|
|
47
39
|
}
|
|
48
40
|
/* replace替换查找的到的字符串 */
|
|
49
41
|
str = str.replace("#", "");
|
|
50
42
|
/* match得到查询数组 */
|
|
51
|
-
|
|
43
|
+
const hxs = str.match(/../g);
|
|
52
44
|
for (let index = 0; index < 3; index++) {
|
|
53
|
-
|
|
45
|
+
const value = parseInt(hxs[index], 16);
|
|
46
|
+
Reflect.set(hxs, index, value);
|
|
54
47
|
}
|
|
55
48
|
return hxs;
|
|
56
49
|
}
|
|
@@ -62,16 +55,16 @@ class ColorConversion {
|
|
|
62
55
|
*/
|
|
63
56
|
rgbToHex(redValue, greenValue, blueValue) {
|
|
64
57
|
/* 验证输入的rgb值是否合法 */
|
|
65
|
-
|
|
58
|
+
const validPattern = /^\d{1,3}$/;
|
|
66
59
|
if (!validPattern.test(redValue.toString()) ||
|
|
67
60
|
!validPattern.test(greenValue.toString()) ||
|
|
68
61
|
!validPattern.test(blueValue.toString()))
|
|
69
62
|
throw new TypeError("输入错误的rgb颜色值");
|
|
70
|
-
|
|
63
|
+
const hexs = [redValue.toString(16), greenValue.toString(16), blueValue.toString(16)];
|
|
71
64
|
for (let index = 0; index < 3; index++)
|
|
72
65
|
if (hexs[index].length == 1)
|
|
73
|
-
hexs[index] =
|
|
74
|
-
return
|
|
66
|
+
hexs[index] = `0${hexs[index]}`;
|
|
67
|
+
return `#${hexs.join("")}`;
|
|
75
68
|
}
|
|
76
69
|
/**
|
|
77
70
|
* 获取颜色变暗或亮
|
|
@@ -80,11 +73,13 @@ class ColorConversion {
|
|
|
80
73
|
*/
|
|
81
74
|
getDarkColor(color, level) {
|
|
82
75
|
if (!this.isHex(color)) {
|
|
83
|
-
throw new TypeError(
|
|
76
|
+
throw new TypeError(`输入错误的hex:${color}`);
|
|
84
77
|
}
|
|
85
|
-
|
|
78
|
+
const rgbc = this.hexToRgb(color);
|
|
86
79
|
for (let index = 0; index < 3; index++) {
|
|
87
|
-
|
|
80
|
+
const rgbcItemValue = rgbc[index];
|
|
81
|
+
const value = Math.floor(Number(rgbcItemValue) * (1 - Number(level)));
|
|
82
|
+
Reflect.set(rgbc, index, value);
|
|
88
83
|
}
|
|
89
84
|
return this.rgbToHex(rgbc[0], rgbc[1], rgbc[2]);
|
|
90
85
|
}
|
|
@@ -95,40 +90,43 @@ class ColorConversion {
|
|
|
95
90
|
*/
|
|
96
91
|
getLightColor(color, level) {
|
|
97
92
|
if (!this.isHex(color)) {
|
|
98
|
-
throw new TypeError(
|
|
93
|
+
throw new TypeError(`输入错误的hex:${color}`);
|
|
99
94
|
}
|
|
100
|
-
|
|
95
|
+
const rgbc = this.hexToRgb(color);
|
|
101
96
|
for (let index = 0; index < 3; index++) {
|
|
102
|
-
|
|
97
|
+
const rgbcItemValue = Number(rgbc[index]);
|
|
98
|
+
const value = Math.floor(255 - rgbcItemValue * level + rgbcItemValue);
|
|
99
|
+
Reflect.set(rgbc, index, value);
|
|
103
100
|
}
|
|
104
101
|
return this.rgbToHex(rgbc[0], rgbc[1], rgbc[2]);
|
|
105
102
|
}
|
|
106
103
|
}
|
|
107
104
|
|
|
108
105
|
class GBKEncoder {
|
|
109
|
-
#data
|
|
106
|
+
#data;
|
|
110
107
|
#U2Ghash = {};
|
|
111
108
|
#G2Uhash = {};
|
|
112
109
|
constructor() {
|
|
113
|
-
let dataText = this.handleText("4e:020405060f12171f20212326292e2f313335373c40414244464a5155575a5b6263646567686a6b6c6d6e6f727475767778797a7b7c7d7f808182838485878a#909697999c9d9ea3aaafb0b1b4b6b7b8b9bcbdbec8cccfd0d2dadbdce0e2e6e7e9edeeeff1f4f8f9fafcfe,4f:00020304050607080b0c12131415161c1d212328292c2d2e31333537393b3e3f40414244454748494a4b4c525456616266686a6b6d6e7172757778797a7d8081828586878a8c8e909293959698999a9c9e9fa1a2a4abadb0b1b2b3b4b6b7b8b9babbbcbdbec0c1c2c6c7c8c9cbcccdd2d3d4d5d6d9dbe0e2e4e5e7ebecf0f2f4f5f6f7f9fbfcfdff,50:000102030405060708090a#0b0e1011131516171b1d1e20222324272b2f303132333435363738393b3d3f404142444546494a4b4d5051525354565758595b5d5e5f6061626364666768696a6b6d6e6f70717273747578797a7c7d818283848687898a8b8c8e8f909192939495969798999a9b9c9d9e9fa0a1a2a4a6aaabadaeafb0b1b3b4b5b6b7b8b9bcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdced0d1d2d3d4d5d7d8d9dbdcdddedfe0e1e2e3e4e5e8e9eaebeff0f1f2f4f6f7f8f9fafcfdfeff,51:00010203040508#090a0c0d0e0f1011131415161718191a1b1c1d1e1f2022232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e42474a4c4e4f5052535758595b5d5e5f606163646667696a6f727a7e7f838486878a8b8e8f90919394989a9d9e9fa1a3a6a7a8a9aaadaeb4b8b9babebfc1c2c3c5c8cacdced0d2d3d4d5d6d7d8d9dadcdedfe2e3e5e6e7e8e9eaeceef1f2f4f7fe,52:0405090b0c0f101314151c1e1f2122232526272a2c2f313234353c3e4445464748494b4e4f5253555758#595a5b5d5f6062636466686b6c6d6e7071737475767778797a7b7c7e808384858687898a8b8c8d8e8f91929495969798999a9ca4a5a6a7aeafb0b4b5b6b7b8b9babbbcbdc0c1c2c4c5c6c8cacccdcecfd1d3d4d5d7d9dadbdcdddee0e1e2e3e5e6e7e8e9eaebecedeeeff1f2f3f4f5f6f7f8fbfcfd,53:0102030407090a0b0c0e11121314181b1c1e1f2224252728292b2c2d2f3031323334353637383c3d404244464b4c4d505458595b5d65686a6c6d7276797b7c7d7e80818387888a8e8f#90919293949697999b9c9ea0a1a4a7aaabacadafb0b1b2b3b4b5b7b8b9babcbdbec0c3c4c5c6c7cecfd0d2d3d5dadcdddee1e2e7f4fafeff,54:000205070b1418191a1c2224252a303336373a3d3f4142444547494c4d4e4f515a5d5e5f6061636567696a6b6c6d6e6f7074797a7e7f8183858788898a8d919397989c9e9fa0a1a2a5aeb0b2b5b6b7b9babcbec3c5cacbd6d8dbe0e1e2e3e4ebeceff0f1f4f5f6f7f8f9fbfe,55:0002030405080a0b0c0d0e121315161718191a1c1d1e1f212526#28292b2d3234353638393a3b3d40424547484b4c4d4e4f515253545758595a5b5d5e5f60626368696b6f7071727374797a7d7f85868c8d8e9092939596979a9b9ea0a1a2a3a4a5a6a8a9aaabacadaeafb0b2b4b6b8babcbfc0c1c2c3c6c7c8cacbcecfd0d5d7d8d9dadbdee0e2e7e9edeef0f1f4f6f8f9fafbfcff,56:0203040506070a0b0d1011121314151617191a1c1d202122252628292a2b2e2f30333537383a3c3d3e404142434445464748494a4b4f5051525355565a5b5d5e5f6061#636566676d6e6f70727374757778797a7d7e7f80818283848788898a8b8c8d9091929495969798999a9b9c9d9e9fa0a1a2a4a5a6a7a8a9aaabacadaeb0b1b2b3b4b5b6b8b9babbbdbebfc0c1c2c3c4c5c6c7c8c9cbcccdcecfd0d1d2d3d5d6d8d9dce3e5e6e7e8e9eaeceeeff2f3f6f7f8fbfc,57:00010205070b0c0d0e0f101112131415161718191a1b1d1e202122242526272b313234353637383c3d3f414344454648494b52535455565859626365676c6e707172747578797a7d7e7f80#818788898a8d8e8f90919495969798999a9c9d9e9fa5a8aaacafb0b1b3b5b6b7b9babbbcbdbebfc0c1c4c5c6c7c8c9cacccdd0d1d3d6d7dbdcdee1e2e3e5e6e7e8e9eaebeceef0f1f2f3f5f6f7fbfcfeff,58:0103040508090a0c0e0f101213141617181a1b1c1d1f222325262728292b2c2d2e2f31323334363738393a3b3c3d3e3f4041424345464748494a4b4e4f505253555657595a5b5c5d5f6061626364666768696a6d6e6f707172737475767778797a7b7c7d7f82848687888a8b8c#8d8e8f909194959697989b9c9da0a1a2a3a4a5a6a7aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbdbebfc0c2c3c4c6c7c8c9cacbcccdcecfd0d2d3d4d6d7d8d9dadbdcdddedfe0e1e2e3e5e6e7e8e9eaedeff1f2f4f5f7f8fafbfcfdfeff,59:000103050608090a0b0c0e1011121317181b1d1e2021222326282c30323335363b3d3e3f404345464a4c4d505253595b5c5d5e5f616364666768696a6b6c6d6e6f70717275777a7b7c7e7f8085898b8c8e8f90919495989a9b9c9d9fa0a1a2a6#a7acadb0b1b3b4b5b6b7b8babcbdbfc0c1c2c3c4c5c7c8c9cccdcecfd5d6d9dbdedfe0e1e2e4e6e7e9eaebedeeeff0f1f2f3f4f5f6f7f8fafcfdfe,5a:00020a0b0d0e0f101214151617191a1b1d1e2122242627282a2b2c2d2e2f3033353738393a3b3d3e3f414243444547484b4c4d4e4f5051525354565758595b5c5d5e5f60616364656668696b6c6d6e6f7071727378797b7c7d7e808182838485868788898a8b8c8d8e8f9091939495969798999c9d9e9fa0a1a2a3a4a5a6a7a8a9abac#adaeafb0b1b4b6b7b9babbbcbdbfc0c3c4c5c6c7c8cacbcdcecfd0d1d3d5d7d9dadbdddedfe2e4e5e7e8eaecedeeeff0f2f3f4f5f6f7f8f9fafbfcfdfeff,5b:0001020304050607080a0b0c0d0e0f10111213141518191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303133353638393a3b3c3d3e3f4142434445464748494a4b4c4d4e4f52565e606167686b6d6e6f7274767778797b7c7e7f82868a8d8e90919294969fa7a8a9acadaeafb1b2b7babbbcc0c1c3c8c9cacbcdcecf#d1d4d5d6d7d8d9dadbdce0e2e3e6e7e9eaebecedeff1f2f3f4f5f6f7fdfe,5c:0002030507080b0c0d0e10121317191b1e1f2021232628292a2b2d2e2f303233353637434446474c4d5253545657585a5b5c5d5f62646768696a6b6c6d70727374757677787b7c7d7e808384858687898a8b8e8f9293959d9e9fa0a1a4a5a6a7a8aaaeafb0b2b4b6b9babbbcbec0c2c3c5c6c7c8c9cacccdcecfd0d1d3d4d5d6d7d8dadbdcdddedfe0e2e3e7e9ebeceeeff1f2f3f4f5f6f7f8f9fafcfdfeff,5d:00#01040508090a0b0c0d0f10111213151718191a1c1d1f2021222325282a2b2c2f3031323335363738393a3b3c3f4041424344454648494d4e4f5051525354555657595a5c5e5f6061626364656667686a6d6e7071727375767778797a7b7c7d7e7f8081838485868788898a8b8c8d8e8f9091929394959697989a9b9c9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b8b9babbbcbdbebfc0c1c2c3c4c6c7c8c9cacbcccecfd0d1d2d3d4d5d6d7d8d9dadcdfe0e3e4eaeced#f0f5f6f8f9fafbfcff,5e:000407090a0b0d0e1213171e1f20212223242528292a2b2c2f303233343536393a3e3f404143464748494a4b4d4e4f50515253565758595a5c5d5f60636465666768696a6b6c6d6e6f70717577797e8182838588898c8d8e92989b9da1a2a3a4a8a9aaabacaeafb0b1b2b4babbbcbdbfc0c1c2c3c4c5c6c7c8cbcccdcecfd0d4d5d7d8d9dadcdddedfe0e1e2e3e4e5e6e7e9ebecedeeeff0f1f2f3f5f8f9fbfcfd,5f:050607090c0d0e10121416191a1c1d1e21222324#282b2c2e30323334353637383b3d3e3f4142434445464748494a4b4c4d4e4f5154595a5b5c5e5f60636567686b6e6f72747576787a7d7e7f83868d8e8f919394969a9b9d9e9fa0a2a3a4a5a6a7a9abacafb0b1b2b3b4b6b8b9babbbebfc0c1c2c7c8cacbced3d4d5dadbdcdedfe2e3e5e6e8e9eceff0f2f3f4f6f7f9fafc,60:0708090b0c10111317181a1e1f2223242c2d2e3031323334363738393a3d3e404445464748494a4c4e4f5153545657585b5c5e5f606165666e71727475777e80#8182858687888a8b8e8f909193959798999c9ea1a2a4a5a7a9aaaeb0b3b5b6b7b9babdbebfc0c1c2c3c4c7c8c9cccdcecfd0d2d3d4d6d7d9dbdee1e2e3e4e5eaf1f2f5f7f8fbfcfdfeff,61:02030405070a0b0c1011121314161718191b1c1d1e21222528292a2c2d2e2f303132333435363738393a3b3c3d3e4041424344454647494b4d4f50525354565758595a5b5c5e5f606163646566696a6b6c6d6e6f717273747678797a7b7c7d7e7f808182838485868788898a8c8d8f9091929395#969798999a9b9c9e9fa0a1a2a3a4a5a6aaabadaeafb0b1b2b3b4b5b6b8b9babbbcbdbfc0c1c3c4c5c6c7c9cccdcecfd0d3d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e7e8e9eaebecedeeeff0f1f2f3f4f6f7f8f9fafbfcfdfe,62:00010203040507091314191c1d1e2023262728292b2d2f303132353638393a3b3c424445464a4f50555657595a5c5d5e5f6061626465687172747577787a7b7d818283858687888b8c8d8e8f9094999c9d9ea3a6a7a9aaadaeafb0b2b3b4b6b7b8babec0c1#c3cbcfd1d5dddee0e1e4eaebf0f2f5f8f9fafb,63:00030405060a0b0c0d0f10121314151718191c2627292c2d2e30313334353637383b3c3e3f40414447484a51525354565758595a5b5c5d60646566686a6b6c6f707273747578797c7d7e7f81838485868b8d9193949597999a9b9c9d9e9fa1a4a6abafb1b2b5b6b9bbbdbfc0c1c2c3c5c7c8cacbccd1d3d4d5d7d8d9dadbdcdddfe2e4e5e6e7e8ebeceeeff0f1f3f5f7f9fafbfcfe,64:0304060708090a0d0e111215161718191a1d1f222324#252728292b2e2f3031323335363738393b3c3e404243494b4c4d4e4f505153555657595a5b5c5d5f60616263646566686a6b6c6e6f70717273747576777b7c7d7e7f8081838688898a8b8c8d8e8f90939497989a9b9c9d9fa0a1a2a3a5a6a7a8aaabafb1b2b3b4b6b9bbbdbebfc1c3c4c6c7c8c9cacbcccfd1d3d4d5d6d9dadbdcdddfe0e1e3e5e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,65:01020304050607080a0b0c0d0e0f10111314151617191a1b1c1d1e1f2021#222324262728292a2c2d30313233373a3c3d404142434446474a4b4d4e5052535457585a5c5f606164656768696a6d6e6f7173757678797a7b7c7d7e7f8081828384858688898a8d8e8f92949596989a9d9ea0a2a3a6a8aaacaeb1b2b3b4b5b6b7b8babbbebfc0c2c7c8c9cacdd0d1d3d4d5d8d9dadbdcdddedfe1e3e4eaebf2f3f4f5f8f9fbfcfdfeff,66:0104050708090b0d1011121617181a1b1c1e2122232426292a2b2c2e3032333738393a3b3d3f40424445464748494a4d4e505158#595b5c5d5e6062636567696a6b6c6d7172737578797b7c7d7f808183858688898a8b8d8e8f909293949598999a9b9c9e9fa0a1a2a3a4a5a6a9aaabacadafb0b1b2b3b5b6b7b8babbbcbdbfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8dadedfe0e1e2e3e4e5e7e8eaebecedeeeff1f5f6f8fafbfd,67:010203040506070c0e0f1112131618191a1c1e20212223242527292e303233363738393b3c3e3f414445474a4b4d5254555758595a5b5d62636466676b6c6e717476#78797a7b7d8082838586888a8c8d8e8f9192939496999b9fa0a1a4a6a9acaeb1b2b4b9babbbcbdbebfc0c2c5c6c7c8c9cacbcccdced5d6d7dbdfe1e3e4e6e7e8eaebedeef2f5f6f7f8f9fafbfcfe,68:01020304060d1012141518191a1b1c1e1f20222324252627282b2c2d2e2f30313435363a3b3f474b4d4f52565758595a5b5c5d5e5f6a6c6d6e6f707172737578797a7b7c7d7e7f8082848788898a8b8c8d8e90919294959698999a9b9c9d9e9fa0a1a3a4a5a9aaabacaeb1b2b4b6b7b8#b9babbbcbdbebfc1c3c4c5c6c7c8cacccecfd0d1d3d4d6d7d9dbdcdddedfe1e2e4e5e6e7e8e9eaebecedeff2f3f4f6f7f8fbfdfeff,69:00020304060708090a0c0f11131415161718191a1b1c1d1e21222325262728292a2b2c2e2f313233353637383a3b3c3e4041434445464748494a4b4c4d4e4f50515253555658595b5c5f616264656768696a6c6d6f7072737475767a7b7d7e7f8183858a8b8c8e8f909192939697999a9d9e9fa0a1a2a3a4a5a6a9aaacaeafb0b2b3b5b6b8b9babcbd#bebfc0c2c3c4c5c6c7c8c9cbcdcfd1d2d3d5d6d7d8d9dadcdddee1e2e3e4e5e6e7e8e9eaebeceeeff0f1f3f4f5f6f7f8f9fafbfcfe,6a:000102030405060708090b0c0d0e0f10111213141516191a1b1c1d1e20222324252627292b2c2d2e30323334363738393a3b3c3f40414243454648494a4b4c4d4e4f515253545556575a5c5d5e5f60626364666768696a6b6c6d6e6f70727374757677787a7b7d7e7f81828385868788898a8b8c8d8f929394959698999a9b9c9d9e9fa1a2a3a4a5a6#a7a8aaadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,6b:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f252628292a2b2c2d2e2f303133343536383b3c3d3f4041424445484a4b4d4e4f5051525354555657585a5b5c5d5e5f606168696b6c6d6e6f7071727374757677787a7d7e7f808588#8c8e8f909194959798999c9d9e9fa0a2a3a4a5a6a7a8a9abacadaeafb0b1b2b6b8b9babbbcbdbec0c3c4c6c7c8c9caccced0d1d8dadcdddedfe0e2e3e4e5e6e7e8e9ecedeef0f1f2f4f6f7f8fafbfcfeff,6c:000102030408090a0b0c0e12171c1d1e2023252b2c2d31333637393a3b3c3e3f434445484b4c4d4e4f5152535658595a62636566676b6c6d6e6f71737577787a7b7c7f8084878a8b8d8e9192959697989a9c9d9ea0a2a8acafb0b4b5b6b7bac0c1c2c3c6c7c8cbcdcecfd1d2d8#d9dadcdddfe4e6e7e9ecedf2f4f9ff,6d:000203050608090a0d0f101113141516181c1d1f20212223242628292c2d2f30343637383a3f404244494c50555657585b5d5f6162646567686b6c6d707172737576797a7b7d7e7f8081838486878a8b8d8f9092969798999a9ca2a5acadb0b1b3b4b6b7b9babbbcbdbec1c2c3c8c9cacdcecfd0d2d3d4d5d7dadbdcdfe2e3e5e7e8e9eaedeff0f2f4f5f6f8fafdfeff,6e:0001020304060708090b0f12131518191b1c1e1f222627282a2c2e30313335#3637393b3c3d3e3f40414245464748494a4b4c4f5051525557595a5c5d5e606162636465666768696a6c6d6f707172737475767778797a7b7c7d8081828487888a8b8c8d8e91929394959697999a9b9d9ea0a1a3a4a6a8a9abacadaeb0b3b5b8b9bcbebfc0c3c4c5c6c8c9cacccdced0d2d6d8d9dbdcdde3e7eaebecedeeeff0f1f2f3f5f6f7f8fafbfcfdfeff,6f:000103040507080a0b0c0d0e101112161718191a1b1c1d1e1f212223252627282c2e303234353738393a3b3c3d3f404142#43444548494a4c4e4f5051525354555657595a5b5d5f60616364656768696a6b6c6f707173757677797b7d7e7f808182838586878a8b8f909192939495969798999a9b9d9e9fa0a2a3a4a5a6a8a9aaabacadaeafb0b1b2b4b5b7b8babbbcbdbebfc1c3c4c5c6c7c8cacbcccdcecfd0d3d4d5d6d7d8d9dadbdcdddfe2e3e4e5e6e7e8e9eaebecedf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,70:000102030405060708090a0b0c0d0e0f1012131415161718191c1d1e1f2021222425262728292a#2b2c2d2e2f30313233343637383a3b3c3d3e3f404142434445464748494a4b4d4e505152535455565758595a5b5c5d5f606162636465666768696a6e7172737477797a7b7d818283848687888b8c8d8f90919397989a9b9e9fa0a1a2a3a4a5a6a7a8a9aab0b2b4b5b6babebfc4c5c6c7c9cbcccdcecfd0d1d2d3d4d5d6d7dadcdddee0e1e2e3e5eaeef0f1f2f3f4f5f6f8fafbfcfeff,71:0001020304050607080b0c0d0e0f111214171b1c1d1e1f2021222324252728292a2b2c2d2e323334#353738393a3b3c3d3e3f4041424344464748494b4d4f505152535455565758595a5b5d5f6061626365696a6b6c6d6f707174757677797b7c7e7f8081828385868788898b8c8d8e909192939596979a9b9c9d9ea1a2a3a4a5a6a7a9aaabadaeafb0b1b2b4b6b7b8babbbcbdbebfc0c1c2c4c5c6c7c8c9cacbcccdcfd0d1d2d3d6d7d8d9dadbdcdddedfe1e2e3e4e6e8e9eaebecedeff0f1f2f3f4f5f6f7f8fafbfcfdfeff,72:0001020304050708090a0b0c0d0e0f101112131415161718191a#1b1c1e1f2021222324252627292b2d2e2f3233343a3c3e40414243444546494a4b4e4f505153545557585a5c5e60636465686a6b6c6d707173747677787b7c7d828385868788898c8e9091939495969798999a9b9c9d9ea0a1a2a3a4a5a6a7a8a9aaabaeb1b2b3b5babbbcbdbebfc0c5c6c7c9cacbcccfd1d3d4d5d6d8dadb#95$,30:000102,00b702:c9c7,00a830:0305,2014ff5e20:162618191c1d,30:141508090a0b0c0d0e0f16171011,00:b1d7f7,22:362728110f2a2908371aa52520,231222:992b2e614c483d1d606e6f64651e3534,26:4240,00b020:3233,2103ff0400a4ff:e0e1,203000a7211626:0605,25:cbcfcec7c6a1a0b3b2,203b21:92909193,30:13#95$,21:70717273747576777879#4$,24:88898a8b8c8d8e8f909192939495969798999a9b7475767778797a7b7c7d7e7f808182838485868760616263646566676869##,32:20212223242526272829##,21:606162636465666768696a6b#97$,ff:010203e505060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5de3#95$,30:4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f90919293#106$a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6#103$,03:9192939495969798999a9b9c9d9e9fa0a1a3a4a5a6a7a8a9#6$b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c3c4c5c6c7c8c9#5$,fe:3536393a3f403d3e41424344##3b3c373831#3334#104$,04:10111213141501161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f#13$30313233343551363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f#11$,02:cacbd9,20:13152535,21:050996979899,22:151f23526667bf,25:505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727381828384858687#88898a8b8c8d8e8f939495bcbde2e3e4e5,2609229530:121d1e#9$,010100e101ce00e0011300e9011b00e8012b00ed01d000ec014d00f301d200f2016b00fa01d400f901:d6d8dadc,00:fcea,0251e7c701:4448,e7c802:61#2$,31:05060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223242526272829#19$,30:212223242526272829,32a333:8e8f9c9d9ea1c4ced1d2d5,fe30ff:e2e4#,212132:31#,20:10#1$,30:fc9b9cfdfe069d9e,fe:494a4b4c4d4e4f50515254555657595a5b5c5d5e5f6061#626364656668696a6b,e7:e7e8e9eaebecedeeeff0f1f2f3,30:07#11$,25:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b#13$,72:dcdddfe2e3e4e5e6e7eaebf5f6f9fdfeff,73:00020405060708090b0c0d0f1011121418191a1f2023242627282d2f30323335363a3b3c3d404142434445464748#494a4b4c4e4f515354555658595a5b5c5d5e5f6162636465666768696a6b6e7071#92$72737475767778797a7b7c7d7f808182838586888a8c8d8f90929394959798999a9c9d9ea0a1a3a4a5a6a7a8aaacadb1b4b5b6b8b9bcbdbebfc1c3c4c5c6c7#cbccced2d3d4d5d6d7d8dadbdcdddfe1e2e3e4e6e8eaebeceeeff0f1f3f4f5f6f7#92$f8f9fafbfcfdfeff,74:0001020407080b0c0d0e1112131415161718191c1d1e1f2021232427292b2d2f31323738393a3b3d3e3f4042434445464748494a4b4c4d#4e4f505152535456585d606162636465666768696a6b6c6e6f717273747578797a#92$7b7c7d7f8284858688898a8c8d8f9192939495969798999a9b9d9fa0a1a2a3a4a5a6aaabacadaeafb0b1b2b3b4b5b6b7b8b9bbbcbdbebfc0c1c2c3c4c5c6c7#c8c9cacbcccdcecfd0d1d3d4d5d6d7d8d9dadbdddfe1e5e7e8e9eaebecedf0f1f2#92$f3f5f8f9fafbfcfdfe,75:0001020305060708090a0b0c0e1012141516171b1d1e202122232426272a2e3436393c3d3f414243444647494a4d5051525355565758#5d5e5f60616263646768696b6c6d6e6f7071737576777a7b7c7d7e808182848587#92$88898a8c8d8e909395989b9c9ea2a6a7a8a9aaadb6b7babbbfc0c1c6cbcccecfd0d1d3d7d9dadcdddfe0e1e5e9ecedeeeff2f3f5f6f7f8fafbfdfe,76:02040607#08090b0d0e0f11121314161a1c1d1e212327282c2e2f31323637393a3b3d414244#92$45464748494a4b4e4f50515253555758595a5b5d5f6061626465666768696a6c6d6e7071727374757677797a7c7f80818385898a8c8d8f9092949597989a9b#9c9d9e9fa0a1a2a3a5a6a7a8a9aaabacadafb0b3b5b6b7b8b9babbbcbdbec0c1c3,554a963f57c3632854ce550954c076:914c,853c77ee827e788d72319698978d6c285b894ffa630966975cb880fa684880ae660276ce51f9655671ac7ff1888450b2596561ca6fb382ad634c625253ed54277b06516b75a45df462d48dcb9776628a8019575d97387f627238767d67cf767e64464f708d2562dc7a17659173ed642c6273822c9881677f724862:6ecc,4f3474e3534a529e7eca90a65e2e6886699c81807ed168d278c5868c9551508d8c2482de80de53058912526576:c4c7c9cbccd3d5d9dadcdddee0e1e2e3e4e6e7e8e9eaebecedf0f3f5f6f7fafbfdff,77:00020305060a0c0e0f1011121314151617181b1c1d1e21232425272a2b#2c2e3031323334393b3d3e3f4244454648494a4b4c4d4e4f52535455565758595c,858496f94fdd582199715b9d62:b1a5,66b48c799c8d7206676f789160b253:5117,8f8880cc8d1d94a1500d72c8590760eb711988ab595482ef672c7b285d297ef7752d6cf58e668ff8903c9f3b6bd491197b145f7c78a784d6853d6b:d5d9d6,5e:0187,75f995ed655d5f:0ac5,8f9f58c181c2907f965b97ad8fb97f168d2c62414fbf53:d85e,8f:a8a9ab,904d68075f6a819888689cd6618b522b762a5f6c658c6fd26ee85bbe644851:75b0,67c44e1979c9997c70b377:5d5e5f606467696a6d6e6f7071727374757677787a7b7c818283868788898a8b8f90939495969798999a9b9c9d9ea1a3a4a6a8abadaeafb1b2b4b6b7b8b9ba#bcbec0c1c2c3c4c5c6c7c8c9cacbcccecfd0d1d2d3d4d5d6d8d9dadddedfe0e1e4,75c55e7673bb83e064ad62e894b56ce2535a52c3640f94c27b944f2f5e1b823681:168a,6e246cca9a736355535c54fa886557e04e0d5e036b657c3f90e8601664e6731c88c16750624d8d22776c8e2991c75f6983dc8521991053c286956b8b60:ede8,707f82:cd31,4ed36ca785cf64cd7cd969fd66f9834953957b564fa7518c6d4b5c428e6d63d253c983:2c36,67e578b4643d5bdf5c945dee8be762c667f48c7a640063ba8749998b8c177f2094f24ea7961098a4660c731677:e6e8eaeff0f1f2f4f5f7f9fafbfc,78:0304050607080a0b0e0f101315191b1e20212224282a2b2e2f31323335363d3f414243444648494a4b4d4f51535458595a#5b5c5e5f606162636465666768696f7071727374757678797a7b7d7e7f80818283,573a5c1d5e38957f507f80a05382655e7545553150218d856284949e671d56326f6e5de2543570928f66626f64a463a35f7b6f8890f481e38fb05c1866685ff16c8996488d81886c649179f057ce6a59621054484e587a0b60e96f848bda627f901e9a8b79e4540375f4630153196c608fdf5f1b9a70803b9f7f4f885c3a8d647fc565a570bd51:45b2,866b5d075ba062bd916c75748e0c7a2061017b794ec77ef877854e1181ed521d51fa6a7153a88e87950496cf6ec19664695a78:848586888a8b8f9092949596999d9ea0a2a4a6a8a9aaabacadaeafb5b6b7b8babbbcbdbfc0c2c3c4c6c7c8cccdcecfd1d2d3d6d7d8dadbdcdddedfe0e1e2e3#e4e5e6e7e9eaebedeeeff0f1f3f5f6f8f9fbfcfdfeff,79:00020304060708090a0b0c,784050a877d7641089e6590463e35ddd7a7f693d4f20823955984e3275ae7a975e:628a,95ef521b5439708a6376952457826625693f918755076df37eaf882262337ef075b5832878c196cc8f9e614874f78bcd6b64523a8d506b21806a847156f153064e:ce1b,51d17c97918b7c074fc38e7f7be17a9c64675d1450ac810676017cb96dec7fe067515b:58f8,78cb64:ae13,63:aa2b,9519642d8fbe7b5476296253592754466b7950a362345e266b864ee38d37888b5f85902e79:0d0e0f1011121415161718191a1b1c1d1f2021222325262728292a2b2c2d2e2f3031323335363738393d3f42434445474a4b4c4d4e4f505152545558596163#6466696a6b6c6e70717273747576797b7c7d7e7f8283868788898b8c8d8e909192,6020803d62c54e39535590f863b880c665e66c2e4f4660ee6de18bde5f3986cb5f536321515a83616863520063638e4850125c9b79775bfc52307a3b60bc905376d75f:b797,76848e6c706f767b7b4977aa51f3909358244f4e6ef48fea654c7b1b72c46da47fdf5ae162b55e95573084827b2c5e1d5f1f90127f1498a063826ec7789870b95178975b57ab75354f4375385e9760e659606dc06bbf788953fc96d551cb52016389540a94938c038dcc7239789f87768fed8c0d53e079:939495969798999b9c9d9e9fa0a1a2a3a4a5a6a8a9aaabacadaeafb0b1b2b4b5b6b7b8bcbfc2c4c5c7c8cacccecfd0d3d4d6d7d9dadbdcdddee0e1e2e5e8ea#eceef1f2f3f4f5f6f7f9fafcfeff,7a:0104050708090a0c0f10111213151618191b1c,4e0176ef53ee948998769f0e952d5b9a8ba24e:221c,51ac846361c252a8680b4f97606b51bb6d1e515c6296659796618c46901775d890fd77636bd272:8aec,8bfb583577798d4c675c9540809a5ea66e2159927aef77ed953b6bb565ad7f0e58065151961f5bf958a954288e726566987f56e4949d76fe9041638754c659:1a3a,579b8eb267358dfa8235524160f0581586fe5ce89e454fc4989d8bb95a2560765384627c904f9102997f6069800c513f80335c1499756d314e8c7a:1d1f21222425262728292a2b2c2d2e2f303132343536383a3e4041424344454748494a4b4c4d4e4f50525354555658595a5b5c5d5e5f606162636465666768#696a6b6c6d6e6f717273757b7c7d7e828587898a8b8c8e8f909394999a9b9ea1a2,8d3053d17f5a7b4f4f104e4f96006cd573d085e95e06756a7ffb6a0a77fe94927e4151e170e653cd8fd483038d2972af996d6cdb574a82b365b980aa623f963259a84eff8bbf7eba653e83f2975e556198de80a5532a8bfd542080ba5e9f6cb88d3982ac915a54296c1b52067eb7575f711a6c7e7c89594b4efd5fff61247caa4e305c0167ab87025cf0950b98ce75af70fd902251af7f1d8bbd594951e44f5b5426592b657780a45b7562:76c2,8f905e456c1f7b264f:0fd8,670d7a:a3a4a7a9aaabaeafb0b1b2b4b5b6b7b8b9babbbcbdbec0c1c2c3c4c5c6c7c8c9cacccdcecfd0d1d2d3d4d5d7d8dadbdcdde1e2e4e7e8e9eaebeceef0f1f2f3#f4f5f6f7f8fbfcfe,7b:0001020507090c0d0e1012131617181a1c1d1f21222327292d,6d:6eaa,798f88b15f17752b629a8f854fef91dc65a781:2f51,5e9c81508d74526f89868d4b590d50854ed8961c723681798d1f5bcc8ba3964459877f1a549056:760e,8be565396982949976d66e895e72751867:46d1,7aff809d8d76611f79c665628d635188521a94a27f38809b7eb25c976e2f67607bd9768b9ad8818f7f947cd5641e95507a3f54:4ae5,6b4c640162089e3d80f3759952729769845b683c86e496:0194,94ec4e2a54047ed968398ddf801566f45e9a7fb97b:2f303234353637393b3d3f404142434446484a4d4e535557595c5e5f61636465666768696a6b6c6d6f70737476787a7c7d7f81828384868788898a8b8c8e8f#9192939698999a9b9e9fa0a3a4a5aeafb0b2b3b5b6b7b9babbbcbdbebfc0c2c3c4,57c2803f68975de5653b529f606d9f9a4f9b8eac516c5bab5f135de96c5e62f18d21517194a952fe6c9f82df72d757a267848d2d591f8f9c83c754957b8d4f306cbd5b6459d19f1353e486ca9aa88c3780a16545987e56fa96c7522e74dc52505be1630289024e5662d0602a68fa51735b9851a089c27ba199867f5060ef704c8d2f51495e7f901b747089c4572d78455f529f9f95fa8f689b3c8be17678684267dc8d:ea35,523d8f8a6eda68cd950590ed56fd679c88f98fc754c87b:c5c8c9cacbcdcecfd0d2d4d5d6d7d8dbdcdedfe0e2e3e4e7e8e9ebecedeff0f2f3f4f5f6f8f9fafbfdff,7c:0001020304050608090a0d0e101112131415171819#1a1b1c1d1e20212223242528292b2c2d2e2f3031323334353637393a3b3c3d3e42,9ab85b696d776c264ea55bb39a87916361a890af97e9542b6db55bd251fd558a7f:55f0,64bc634d65f161be608d710a6c:5749,592f676d822a58d5568e8c6a6beb90dd597d801753f76d695475559d83:77cf,683879be548c4f55540876d28c8996026cb36db88d6b89109e648d3a563f9ed175d55f8872e0606854fc4ea86a2a886160528f7054c470d886799e3f6d2a5b8f5f187ea255894faf7334543c539a501954:0e7c,4e4e5ffd745a58f6846b80e1877472d07cca6e567c:434445464748494a4b4c4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f70717275767778797a7e7f8081828384858687#888a8b8c8d8e8f90939496999a9ba0a1a3a6a7a8a9abacadafb0b4b5b6b7b8babb,5f27864e552c62a44e926caa623782b154d7534e733e6ed1753b521253168bdd69d05f8a60006dee574f6b2273af68538fd87f13636260a3552475ea8c6271156da35ba65e7b8352614c9ec478fa87577c27768751f060f6714c66435e4c604d8c0e707063258f895fbd606286d456de6bc160946167534960e066668d3f79fd4f1a70e96c478b:b3f2,7ed88364660f5a5a9b426d:51f7,8c416d3b4f19706b83b7621660d1970d8d27797851fb57:3efa,673a75787a3d79ef7b957c:bfc0c2c3c4c6c9cbcecfd0d1d2d3d4d8dadbdddee1e2e3e4e5e6e7e9eaebecedeef0f1f2f3f4f5f6f7f9fafcfdfeff,7d:000102030405060708090b0c0d0e0f10#1112131415161718191a1b1c1d1e1f212324252628292a2c2d2e30313233343536,808c99658ff96fc08ba59e2159ec7ee97f095409678168d88f917c4d96c653ca602575be6c7253735ac97ea7632451e0810a5df184df628051805b634f0e796d524260b86d4e5b:c4c2,8b:a1b0,65e25fcc964559937e:e7aa,560967b759394f735bb652a0835a988a8d3e753294be50477a3c4ef767b69a7e5ac16b7c76d1575a5c167b3a95f4714e517c80a9827059787f04832768c067ec78:b177,62e363617b804fed526a51cf835069db92748d:f531,89c1952e7bad4ef67d:3738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6f70717273747576#78797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798,506582305251996f6e:1085,6da75efa50f559dc5c066d466c5f7586848b686859568bb253209171964d854969127901712680f64ea490ca6d479a845a0756bc640594f077eb4fa5811a72e189d2997a7f347ede527f655991758f:7f83,53eb7a9663:eda5,768679f888579636622a52ab8282685467706377776b7aed6d017ed389e359d0621285c982a5754c501f4ecb75a58beb5c4a5dfe7b4b65a491d14eca6d25895f7d2795264ec58c288fdb9773664b79818fd170ec6d787d:999a9b9c9d9e9fa0a1a2a3a4a5a7a8a9aaabacadafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9#dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa,5c3d52b283465162830e775b66769cb84eac60ca7c:beb3,7ecf4e958b66666f988897595883656c955c5f8475c997567a:dfde,51c070af7a9863ea7a767ea0739697ed4e4570784e5d915253a965:51e7,81fc8205548e5c31759a97a062d872d975bd5c459a7983ca5c40548077e94e3e6cae805a62d2636e5de851778ddd8e1e952f4ff153e560e770ac526763509e435a1f5026773753777ee26485652b628963985014723589c951b38bc07edd574783cc94a7519b541b5cfb7d:fbfcfdfeff,7e:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233343536373839#3a3c3d3e3f40424344454648494a4b4c4d4e4f505152535455565758595a5b5c5d,4fca7ae36d5a90e19a8f55805496536154af5f0063e9697751ef6168520a582a52d8574e780d770b5eb761777ce062:5b97,4ea27095800362f770e49760577782db67ef68f578d5989779d158f354b353ef6e34514b523b5ba28bfe80af554357a660735751542d7a7a60505b5463a762a053e362635bc767af54ed7a9f82e691775e9388e4593857ae630e8de880ef57577b774fa95feb5bbd6b3e53217b5072c2684677:ff36,65f751b54e8f76d45cbf7aa58475594e9b4150807e:5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081838485868788898a8b8c8d8e8f909192939495969798999a9c9d9e#aeb4bbbcd6e4ecf9,7f:0a101e37393b3c3d3e3f404143464748494a4b4c4d4e4f5253,998861276e8357646606634656f062:ec69,5ed39614578362c955878721814a8fa3556683b167658d5684dd5a6a680f62e67bee961151706f9c8c3063fd89c861d27f0670c26ee57405699472fc5eca90ce67176d6a635e52b3726280014f6c59e5916a70d96d9d52d24e5096f7956d857e78ca7d2f5121579264c2808b7c7b6cea68f1695e51b7539868a872819ece7bf172f879bb6f137406674e91cc9ca4793c83:8954,540f68174e3d538952b1783e5386522950884f:8bd0,7f:56595b5c5d5e6063646566676b6c6d6f7073757677787a7b7c7d7f8082838485868788898b8d8f9091929395969798999b9ca0a2a3a5a6a8a9aaabacadaeb1#b3b4b5b6b7babbbec0c2c3c4c6c7c8c9cbcdcfd0d1d2d3d6d7d9dadbdcdddee2e3,75e27acb7c926ca596b6529b748354e94fe9805483b28fde95705ec9601c6d9f5e18655b813894fe604b70bc7ec37cae51c968817cb1826f4e248f8691cf667e4eae8c0564a9804a50da759771ce5be58fbd6f664e86648295635ed66599521788c270c852a3730e7433679778f797164e3490bb9cde6dcb51db8d41541d62ce73b283f196f69f8494c34f367f9a51cc707596755cad988653e64ee46e9c740969b4786b998f7559521876246d4167f3516d9f99804b54997b3c7abf7f:e4e7e8eaebecedeff2f4f5f6f7f8f9fafdfeff,80:020708090a0e0f11131a1b1d1e1f2123242b2c2d2e2f303234393a3c3e404144454748494e4f505153555657#595b5c5d5e5f6061626364656667686b6c6d6e6f7072737475767778797a7b7c7d,9686578462e29647697c5a0464027bd36f0f964b82a6536298855e90708963b35364864f9c819e93788c97328d:ef42,9e7f6f5e79845f559646622e9a74541594dd4fa365c55c:6561,7f1586516c2f5f8b73876ee47eff5ce6631b5b6a6ee653754e7163a0756562a18f6e4f264ed16ca67eb68bba841d87ba7f57903b95237ba99aa188f8843d6d1b9a867edc59889ebb739b780186829a:6c82,561b541757cb4e709ea653568fc881097792999286ee6ee1851366fc61626f2b80:7e818285888a8d8e8f909192949597999ea3a6a7a8acb0b3b5b6b8b9bbc5c7c8c9cacbcfd0d1d2d3d4d5d8dfe0e2e3e6eef5f7f9fbfeff,81:000103040507080b#0c1517191b1c1d1f202122232425262728292a2b2d2e3033343537393a3b3c3d3f,8c298292832b76f26c135fd983bd732b8305951a6bdb77db94c6536f830251925e3d8c8c8d384e4873ab679a68859176970971646ca177095a9295416bcf7f8e66275bd059b95a9a95:e8f7,4eec84:0c99,6aac76df9530731b68a65b5f772f919a97617cdc8ff78c1c5f257c7379d889c56ccc871c5bc65e4268c977207ef551:954d,52c95a297f05976282d763cf778485d079d26e3a5e9959998511706d6c1162bf76bf654f60af95fd660e879f9e2394ed54:0d7d,8c2c647881:40414243444547494d4e4f525657585b5c5d5e5f6162636466686a6b6c6f727375767778818384858687898b8c8d8e90929394959697999a9e9fa0a1a2a4a5#a7a9abacadaeafb0b1b2b4b5b6b7b8b9bcbdbebfc4c5c7c8c9cbcdcecfd0d1d2d3,647986116a21819c78e864699b5462b9672b83ab58a89ed86cab6f205bde964c8c0b725f67d062c772614ea959c66bcd589366ae5e5552df6155672876ee776672677a4662ff54:ea50,94a090a35a1c7eb36c164e435976801059485357753796be56ca63208111607c95f96dd65462998151855ae980fd59ae9713502a6ce55c3c62df4f60533f817b90066eba852b62c85e7478be64b5637b5ff55a18917f9e1f5c3f634f80425b7d556e95:4a4d,6d8560a867e072de51dd5b8181:d4d5d6d7d8d9dadbdcdddedfe0e1e2e4e5e6e8e9ebeeeff0f1f2f5f6f7f8f9fafdff,82:030708090a0b0e0f111315161718191a1d2024252627292e323a3c3d3f#404142434546484a4c4d4e5051525354555657595b5c5d5e606162636465666769,62e76cde725b626d94ae7ebd81136d53519c5f04597452aa6012597366968650759f632a61e67cef8bfa54e66b279e256bb485d5545550766ca4556a8db4722c5e156015743662cd6392724c5f986e436d3e65006f5876d878d076fc7554522453db4e535e9e65c180:2ad6,629b5486522870ae888d8dd16ce1547880da57f988f48d54966a914d4f696c9b55b776c6783062a870f96f8e5f6d84ec68da787c7bf781a8670b9e4f636778b0576f7812973962:79ab,528874356bd782:6a6b6c6d71757677787b7c808183858687898c90939495969a9b9ea0a2a3a7b2b5b6babbbcbfc0c2c3c5c6c9d0d6d9dadde2e7e8e9eaecedeef0f2f3f5f6f8#fafcfdfeff,83:000a0b0d1012131618191d1e1f20212223242526292a2e3032373b3d,5564813e75b276ae533975de50fb5c418b6c7bc7504f72479a9798d86f0274e27968648777a562fc98918d2b54c180584e52576a82f9840d5e7351ed74f68bc45c4f57616cfc98875a4678349b448feb7c955256625194fa4ec68386846183e984b257d467345703666e6d668c3166dd7011671f6b3a6816621a59bb4e0351c46f0667d26c8f517668cb59476b6775665d0e81109f5065d779:4841,9a918d775c824e5e4f01542f5951780c56686c148fc45f036c:7de3,8bab639083:3e3f41424445484a4b4c4d4e5355565758595d6270717273747576797a7e7f808182838487888a8b8c8d8f909194959697999a9d9fa1a2a3a4a5a6a7acadae#afb5bbbebfc2c3c4c6c8c9cbcdced0d1d2d3d5d7d9dadbdee2e3e4e6e7e8ebeced,60706d3d7275626694:8ec5,53438fc17b7e4edf8c264e7e9ed494:b1b3,524d6f5c90636d458c3458115d4c6b:2049,67aa545b81547f8c589985375f3a62a26a47953965726084686577a74e544fa85de7979864ac7fd85ced4fcf7a8d520783044e14602f7a8394a64fb54eb279e6743452e482b964d279bd5bdd6c8197528f7b6c22503e537f6e0564ce66746c3060c598778bf75e86743c7a7779cb4e1890b174036c4256da914b6cc58d8b533a86c666f28eaf5c489a716e2083:eeeff3f4f5f6f7fafbfcfeff,84:0002050708090a10121314151617191a1b1e1f20212223292a2b2c2d2e2f30323334353637393a3b3e3f404142434445474849#4a4b4c4d4e4f505253545556585d5e5f606264656667686a6e6f70727477797b7c,53d65a369f8b8da353bb570898a76743919b6cc9516875ca62f372ac52:389d,7f3a7094763853749e4a69b7786e96c088d97fa471:36c3,518967d374e458e4651856b78ba9997662707ed560f970ed58ec4e:c1ba,5fcd97e74efb8ba45203598a7eab62544ecd65e5620e833884c98363878d71946eb65bb97ed2519763c967d480898339881551125b7a59828fb14e736c5d516589258f6f962e854a745e95:10f0,6da682e55f3164926d128428816e9cc3585e8d5b4e0953c184:7d7e7f8081838485868a8d8f90919293949596989a9b9d9e9fa0a2a3a4a5a6a7a8a9aaabacadaeb0b1b3b5b6b7bbbcbec0c2c3c5c6c7c8cbcccecfd2d4d5d7#d8d9dadbdcdee1e2e4e7e8e9eaebedeeeff1f2f3f4f5f6f7f8f9fafbfdfe,85:000102,4f1e6563685155d34e2764149a9a626b5ac2745f82726da968ee50e7838e7802674052396c997eb150bb5565715e7b5b665273ca82eb67495c715220717d886b95ea965564c58d6181b355846c5562477f2e58924f2455468d4f664c4e0a5c1a88f368a2634e7a0d70e7828d52fa97f65c1154e890b57ecd59628d4a86c782:0c0d,8d6664445c0461516d89793e8bbe78377533547b4f388eab6df15a207ec5795e6c885ba15a76751a80be614e6e1758f075:1f25,727253477ef385:030405060708090a0b0d0e0f101214151618191b1c1d1e2022232425262728292a2d2e2f303132333435363e3f404142444546474b4c4d4e4f505152535455#57585a5b5c5d5f60616263656667696a6b6c6d6e6f707173757677787c7d7f8081,770176db526980dc57235e08593172ee65bd6e7f8bd75c388671534177f362fe65f64ec098df86805b9e8bc653f277e24f7f5c4e9a7659cb5f0f793a58eb4e1667ff4e8b62ed8a93901d52bf662f55dc566c90024ed54f8d91ca99706c0f5e0260435ba489c68bd56536624b99965b:88ff,6388552e53d77626517d852c67a268b36b8a62928f9353d482126dd1758f4e668d4e5b70719f85af66:91d9,7f7287009ecd9f205c5e672f8ff06811675f620d7ad658855eb665706f3185:82838688898a8b8c8d8e909192939495969798999a9d9e9fa0a1a2a3a5a6a7a9abacadb1b2b3b4b5b6b8babbbcbdbebfc0c2c3c4c5c6c7c8cacbcccdced1d2#d4d6d7d8d9dadbdddedfe0e1e2e3e5e6e7e8eaebecedeeeff0f1f2f3f4f5f6f7f8,60555237800d6454887075295e05681362f4971c53cc723d8c016c3477617a0e542e77ac987a821c8bf47855671470c165af64955636601d79c153f84e1d6b7b80865bfa55e356db4f:3a3c,99725df3677e80386002988290015b8b8b:bcf5,641c825864de55fd82cf91654fd77d20901f7c9f50f358516eaf5bbf8bc980839178849c7b97867d96:8b8f,7ee59ad3788e5c817a57904296a7795f5b59635f7b0b84d168ad55067f2974107d2295016240584c4ed65b835979585485:f9fafcfdfe,86:0001020304060708090a0b0c0d0e0f10121314151718191a1b1c1d1e1f20212223242526282a2b2c2d2e2f3031323334353637393a3b3d3e3f40#4142434445464748494a4b4c525355565758595b5c5d5f6061636465666768696a,736d631e8e:4b0f,80ce82d462ac53f06cf0915e592a60016c70574d644a8d2a762b6ee9575b6a8075f06f6d8c:2d08,57666bef889278b363a253f970ad6c645858642a580268e0819b55107cd650188eba6dcc8d9f70eb638f6d9b6ed47ee68404684390036dd896768ba85957727985e4817e75bc8a8a68af52548e22951163d098988e44557c4f5366ff568f60d56d9552435c4959296dfb586b75:301c,606c82148146631167618fe2773a8d:f334,94c15e165385542c70c386:6d6f7072737475767778838485868788898e8f90919294969798999a9b9e9fa0a1a2a5a6abadaeb2b3b7b8b9bbbcbdbebfc1c2c3c5c8cccdd2d3d5d6d7dadc#dde0e1e2e3e5e6e7e8eaebeceff5f6f7fafbfcfdff,87:010405060b0c0e0f10111416,6c405ef7505c4ead5ead633a8247901a6850916e77b3540c94dc5f647ae5687663457b527edf75db507762955934900f51f879c37a8156fe5f9290146d825c60571f541051546e4d56e263a89893817f8715892a9000541e5c6f81c062:d658,81319e3596409a:6e7c,692d59a562d3553e631654c786d96d3c5a0374e6889c6b6a59168c4c5f2f6e7e73a9987d4e3870f75b8c7897633d665a769660cb5b9b5a494e0781556c6a738b4ea167897f515f8065fa671b5fd859845a0187:191b1d1f20242627282a2b2c2d2f303233353638393a3c3d404142434445464a4b4d4f505152545556585a5b5c5d5e5f6162666768696a6b6c6d6f71727375#7778797a7f8081848687898a8c8e8f90919294959698999a9b9c9d9ea0a1a2a3a4,5dcd5fae537197e68fdd684556f4552f60df4e3a6f4d7ef482c7840e59d44f:1f2a,5c3e7eac672a851a5473754f80c355829b4f4f4d6e2d8c135c096170536b761f6e29868a658795fb7eb9543b7a337d0a95ee55e17fc174ee631d87176da17a9d621165a1536763e16c835deb545c94a84e4c6c618bec5c4b65e0829c68a754:3e34,6b:cb66,4e9463425348821e4f:0dae,575e620a96fe6664726952:ffa1,609f8bef661471996790897f785277fd6670563b54389521727a87:a5a6a7a9aaaeb0b1b2b4b6b7b8b9bbbcbebfc1c2c3c4c5c7c8c9cccdcecfd0d4d5d6d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedeff0f1f2f3f4f5f6f7f8#fafbfcfdff,88:0001020405060708090b0c0d0e0f101112141718191a1c1d1e1f2023,7a00606f5e0c6089819d591560dc718470ef6eaa6c5072806a8488ad5e2d4e605ab3559c94e36d177cfb9699620f7ec6778e867e5323971e8f9666875ce14fa072ed4e0b53a6590f54136380952851484ed99c9c7ea454b88d248854823795f26d8e5f265acc663e966973:b02e,53bf817a99857fa15baa96:7750,7ebf76f853a2957699997bb189446e584e617fd479658be660f354cd4eab98795df76a6150cf54118c618427785d9704524a54ee56a395006d885bb56dc6665388:2425262728292a2b2c2d2e2f30313334353637383a3b3d3e3f414243464748494a4b4e4f505152535556585a5b5c5d5e5f6066676a6d6f717374757678797a#7b7c80838687898a8c8e8f90919394959798999a9b9d9e9fa0a1a3a5a6a7a8a9aa,5c0f5b5d6821809655787b11654869544e9b6b47874e978b534f631f643a90aa659c80c18c10519968b0537887f961c86c:c4fb,8c225c5185aa82af950c6b238f9b65b05f:fbc3,4fe18845661f8165732960fa51745211578b5f6290a2884c91925e78674f602759d351:44f6,80f853086c7996c4718a4f:11ee,7f9e673d55c5950879c088967ee3589f620c9700865a5618987b5f908bb884c4915753d965ed5e8f755c60647d6e5a7f7e:eaed,8f6955a75ba360ac65cb738488:acaeafb0b2b3b4b5b6b8b9babbbdbebfc0c3c4c7c8cacbcccdcfd0d1d3d6d7dadbdcdddee0e1e6e7e9eaebecedeeeff2f5f6f7fafbfdff,89:0001030405060708#090b0c0d0e0f1114151617181c1d1e1f20222324262728292c2d2e2f3132333537,9009766377297eda9774859b5b667a7496ea884052cb718f5faa65ec8be25bfb9a6f5de16b896c5b8b:adaf,900a8fc5538b62bc9e:262d,54404e2b82bd7259869c5d1688596daf96c554d14e9a8bb6710954bd960970df6df976d04e25781487125ca95ef68a00989c960e708e6cbf594463a9773c884d6f148273583071d5538c781a96c155015f6671305bb48c1a9a8c6b83592e9e2f79e76768626c4f6f75a17f8a6d0b96336c274ef075d2517b68376f3e908081705996747689:38393a3b3c3d3e3f40424345464748494a4b4c4d4e4f505152535455565758595a5b5c5d6061626364656768696a6b6c6d6e6f707172737475767778797a7c#7d7e808284858788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1,64475c2790657a918c2359da54ac8200836f898180006930564e8036723791ce51b64e5f987563964e1a53f666f3814b591c6db24e0058f9533b63d694f14f:9d0a,886398905937905779fb4eea80f075916c825b9c59e85f5d69058681501a5df24e5977e34ee5827a6291661390915c794ebf5f7981c69038808475ab4ea688d4610f6bc55fc64e4976ca6ea28b:e3ae,8c0a8bd15f027f:fccc,7ece83:356b,56e06bb797f3963459fb541f94f66deb5bc5996e5c395f15969089:a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c3cdd3d4d5d7d8d9dbdddfe0e1e2e4e7e8e9eaecedeef0f1f2f4f5f6f7f8f9fa#fbfcfdfeff,8a:01020304050608090a0b0c0d0e0f101112131415161718191a1b1c1d,537082f16a315a749e705e947f2883b984:2425,836787478fce8d6276c85f719896786c662054df62e54f6381c375c85eb896cd8e0a86f9548f6cf36d8c6c38607f52c775285e7d4f1860a05fe75c24753190ae94c072b96cb96e389149670953:cbf3,4f5191c98bf153c85e7c8fc26de44e8e76c26986865e611a82064f:59de,903e9c7c61096e:1d14,96854e885a3196e84e0e5c7f79b95b878bed7fbd738957df828b90c15401904755bb5cea5fa161086b3272f180b28a:891e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3f4041424344454647494a4b4c4d4e4f505152535455565758595a5b5c5d5e#5f606162636465666768696a6b6c6d6e6f7071727374757677787a7b7c7d7e7f80,6d745bd388d598848c6b9a6d9e336e0a51:a443,57a38881539f63f48f9556ed54585706733f6e907f188fdc82d1613f6028966266f07ea68d:8ac3,94a55cb37ca4670860a6960580184e9190e75300966851418fd08574915d665597f55b55531d78386742683d54c9707e5bb08f7d518d572854b1651266828d:5e43,810f846c906d7cdf51ff85fb67a365e96fa186a48e81566a90207682707671e58d2362e952196cfd8d3c600e589e618e66fe8d60624e55b36e23672d8f678a:81828384858687888b8c8d8e8f9091929495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2#c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3,94e195f87728680569a8548b4e4d70b88bc86458658b5b857a84503a5be877bb6be18a797c986cbe76cf65a98f975d2d5c5586386808536062187ad96e5b7efd6a1f7ae05f706f335f20638c6da867564e085e108d264ed780c07634969c62db662d627e6cbc8d7571677f695146808753ec906e629854f286f08f998005951785178fd96d5973cd659f771f7504782781fb8d1e94884fa6679575b98bca9707632f9547963584b8632377415f8172f04e896014657462ef6b63653f8a:e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8b:0001020304050608090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223#24252728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445,5e2775c790d18bc1829d679d652f5431871877e580a281026c414e4b7ec7804c76f4690d6b966267503c4f84574063076b628dbe53ea65e87eb85fd763:1ab7,81:f3f4,7f6e5e1c5cd95236667a79e97a1a8d28709975d46ede6cbb7a924e2d76c55fe0949f88777ec879cd80bf91cd4ef24f17821f54685dde6d328bcc7ca58f7480985e1a549276b15b99663c9aa473e0682a86db6731732a8b:f8db,90107af970db716e62c477a956314e3b845767f152a986c08d2e94f87b518b:464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656768696a6b6d6e6f707172737475767778797a7b7c7d7e7f80818283848586#8788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9facb1bbc7d0ea,8c:091e,4f4f6ce8795d9a7b6293722a62fd4e1378168f6c64b08d5a7bc668695e8488c55986649e58ee72b6690e95258ffd8d5857607f008c0651c6634962d95353684c74228301914c55447740707c6d4a517954a88d4459ff6ecb6dc45b5c7d2b4ed47c7d6ed35b5081ea6e0d5b579b0368d58e2a5b977efc603b7eb590b98d70594f63cd79df8db3535265cf79568bc5963b7ec494bb7e825634918967007f6a5c0a907566285de64f5067de505a4f5c57505e:a7#3$,8c:38393a3b3c3d3e3f4042434445484a4b4d4e4f5051525354565758595b5c5d5e5f60636465666768696c6d6e6f707172747576777b7c7d7e7f808183848687#888b8d8e8f90919293959697999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacad,4e:8d0c,51404e105eff53454e:15981e,9b325b6c56694e2879ba4e3f53154e47592d723b536e6c1056df80e499976bd3777e9f174e:369f,9f104e:5c6993,82885b5b556c560f4ec453:8d9da3a5ae,97658d5d53:1af5262e3e,8d5c53:6663,52:02080e2d333f404c5e615c,84af52:7d82819093,51827f544e:bbc3c9c2e8e1ebde,4f1b4ef34f:2264,4ef54f:2527092b5e67,65384f:5a5d,8c:aeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebec#edeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8d:000102030405060708090a0b0c0d,4f:5f57323d76749189838f7e7baa7cac94e6e8eac5dae3dcd1dff8,50:294c,4ff350:2c0f2e2d,4ffe50:1c0c25287e4355484e6c7ba5a7a9bad6,510650:edece6ee,51:070b,4edd6c3d4f:5865ce,9fa06c467c74516e5dfd9ec999985181591452f9530d8a07531051eb591951554ea051564eb388:6ea4,4eb5811488d279805b3488037fb851:abb1bdbc,8d:0e0f101112131415161718191a1b1c205152575f6568696a6c6e6f717278797a7b7c7d7e7f808283868788898c8d8e8f90929395969798999a9b9c9d9ea0a1#a2a4a5a6a7a8a9aaabacadaeafb0b2b6b7b9bbbdc0c1c2c5c7c8c9cacdd0d2d3d4,51:c796a2a5,8b:a0a6a7aab4b5b7c2c3cbcfced2d3d4d6d8d9dcdfe0e4e8e9eef0f3f6f9fcff,8c:000204070c0f1112141516191b181d1f202125272a2b2e2f32333536,53:697a,96:1d2221312a3d3c4249545f676c7274888d97b0,90:979b9d99aca1b4b3b6ba,8d:d5d8d9dce0e1e2e5e6e7e9edeef0f1f2f4f6fcfeff,8e:00010203040607080b0d0e1011121315161718191a1b1c202124252627282b2d303233343637383b3c3e#3f4345464c4d4e4f505354555657585a5b5c5d5e5f60616263646567686a6b6e71,90:b8b0cfc5bed0c4c7d3e6e2dcd7dbebeffe,91:04221e23312f394346,520d594252:a2acadbe,54ff52:d0d6f0,53df71ee77cd5ef451:f5fc,9b2f53b65f01755a5def57:4ca9a1,58:7ebcc5d1,57:292c2a33392e2f5c3b4269856b867c7b686d7673ada48cb2cfa7b493a0d5d8dad9d2b8f4eff8e4dd,8e:73757778797a7b7d7e808283848688898a8b8c8d8e91929395969798999a9b9d9fa0a1a2a3a4a5a6a7a8a9aaadaeb0b1b3b4b5b6b7b8b9bbbcbdbebfc0c1c2#c3c4c5c6c7c8c9cacbcccdcfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4,58:0b0d,57:fded,58:001e194420656c81899a80,99a89f1961ff82:797d7f8f8aa8848e919799abb8beb0c8cae398b7aecbccc1a9b4a1aa9fc4cea4e1,830982:f7e4,83:0f07,82:dcf4d2d8,830c82:fbd3,83:111a061415,82:e0d5,83:1c515b5c08923c34319b5e2f4f47435f4017602d3a336665,8e:e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8f:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223#2425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041424344,83:681b696c6a6d6eb078b3b4a0aa939c857cb6a97db87b989ea8babcc1,840183:e5d8,580784:180b,83:ddfdd6,84:1c381106,83:d4df,84:0f03,83:f8f9eac5c0,842683:f0e1,84:5c515a597387887a89783c4669768c8e316dc1cdd0e6bdd3cabfbae0a1b9b497e5e3,850c750d853884f085:391f3a,8f:45464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656a808c929da0a1a2a4a5a6a7aaacadaeafb2b3b4b5b7b8babbbcbfc0c3c6#c9cacbcccdcfd2d6d7dae0e1e3e7eceff1f2f4f5f6fafbfcfeff,90:07080c0e131518,85:563b,84:fffc,85:594868645e7a,77a285:43727ba4a8878f79ae9c85b9b7b0d3c1dcff,86:270529163c,5efe5f0859:3c41,803759:555a58,530f5c:22252c34,62:4c6a9fbbcadad7ee,632262f663:394b43adf6717a8eb46dac8a69aebcf2f8e0ffc4dece,645263:c6be,64:45410b1b200c26215e846d96,90:191c2324252728292a2b2c303132333437393a3d3f4043454648494a4b4c4e545556595a5c5d5e5f6061646667696a6b6c6f70717273767778797a7b7c7e81#84858687898a8c8d8e8f90929496989a9c9e9fa0a4a5a7a8a9abadb2b7bcbdbfc0,64:7ab7b899bac0d0d7e4e2,65:09252e,5f:0bd2,75195f1153:5ff1fde9e8fb,54:1216064b5253545643215759233282947771649a9b8476669dd0adc2b4d2a7a6d3d472a3d5bbbfccd9dadca9aaa4ddcfde,551b54e7552054fd551454f355:22230f11272a678fb5496d41553f503c,90:c2c3c6c8c9cbcccdd2d4d5d6d8d9dadedfe0e3e4e5e9eaeceef0f1f2f3f5f6f7f9fafbfcff,91:00010305060708090a0b0c0d0e0f1011121314151617181a1b1c#1d1f20212425262728292a2b2c2d2e30323334353637383a3b3c3d3e3f40414244,55:375675767733305c8bd283b1b988819f7ed6917bdfbdbe9499eaf7c9,561f55:d1ebecd4e6ddc4efe5f2f3cccde8f5e4,8f9456:1e080c012423,55fe56:00272d5839572c4d62595c4c548664716b7b7c8593afd4d7dde1f5ebf9ff,57:040a091c,5e:0f191411313b3c,91:454748515354555658595b5c5f606667686b6d737a7b7c808182838486888a8e8f939495969798999c9d9e9fa0a1a4a5a6a7a8a9abacb0b1b2b3b6b7b8b9bb#bcbdbebfc0c1c2c3c4c5c6c8cbd0d2d3d4d5d6d7d8d9dadbdddedfe0e1e2e3e4e5,5e:3744545b5e61,5c:8c7a8d9096889899919a9cb5a2bdacabb1a3c1b7c4d2e4cbe5,5d:020327262e241e061b583e343d6c5b6f5d6b4b4a697482999d,8c735d:b7c5,5f:73778287898c95999ca8adb5bc,88625f6172:adb0b4b7b8c3c1cecdd2e8efe9f2f4f7,730172f3730372fa91:e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,92:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324#25262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445,72fb73:1713210a1e1d152239252c3831504d57606c6f7e,821b592598e759:2402,99:636768696a6b6c74777d8084878a8d9091939495,5e:80918b96a5a0b9b5beb3,8d535e:d2d1dbe8ea,81ba5f:c4c9d6cf,60035fee60045f:e1e4fe,60:0506,5f:eaedf8,60:1935261b0f0d292b0a3f2178797b7a42,92:464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727375767778797a7b7c7d7e7f808182838485#868788898a8b8c8d8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7,60:6a7d969aad9d83928c9becbbb1ddd8c6dab4,61:20261523,60f461:000e2b4a75ac94a7b7d4f5,5fdd96b395:e9ebf1f3f5f6fcfe,96:030406080a0b0c0d0f12151617191a,4e2c723f62156c:35545c4aa38590948c6869747686a9d0d4adf7f8f1d7b2e0d6faebeeb1d3effe,92:a8a9aaabacadafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8#e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,93:00010203040506070809,6d:39270c43480704190e2b4d2e351a4f525433916f9ea05e93945c607c63,6e1a6d:c7c5de,6e0e6d:bfe0,6e116d:e6ddd9,6e166dab6e0c6dae6e:2b6e4e6bb25f865354322544dfb198e0,6f2d6e:e2a5a7bdbbb7d7b4cf8fc29f,6f:6246472415,6ef96f:2f364b742a0929898d8c78727c7ad1,93:0a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3f40414243444546474849#4a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696b,6f:c9a7b9b6c2e1eedee0ef,70:1a231b39354f5e,5b:80849593a5b8,752f9a9e64345b:e4ee,89305bf08e478b078f:b6d3d5e5eee4e9e6f3e8,90:05040b26110d162135362d2f445152506858625b,66b990:747d8288838b,5f:50575658,5c3b54ab5c:5059,5b715c:6366,7fbc5f:2a292d,82745f3c9b3b5c6e59:81838da9aaa3,93:6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaab#acadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cbcccd,59:97caab9ea4d2b2afd7be,5a:0506,59dd5a0859:e3d8f9,5a:0c09323411231340674a553c6275,80ec5a:aa9b777abeebb2d2d4b8e0e3f1d6e6d8dc,5b:091716323740,5c:151c,5b:5a6573515362,9a:7577787a7f7d808185888a90929396989b9c9d9fa0a2a3a5a7,7e:9fa1a3a5a8a9,93:cecfd0d1d2d3d4d5d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,94:000102030405060708090a0b0c0d#0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e,7e:adb0bec0c1c2c9cbccd0d4d7dbe0e1e8ebeeeff1f2,7f0d7e:f6fafbfe,7f:01020307080b0c0f111217191c1b1f212223242526272a2b2c2d2f3031323335,5e7a757f5ddb753e909573:8e91aea29fcfc2d1b7b3c0c9c8e5d9,987c740a73:e9e7debaf2,74:0f2a5b262528302e2c,94:2f303132333435363738393a3b3c3d3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6c6d6e6f#707172737475767778797a7b7c7d7e7f8081828384919698c7cfd3d4dae6fb,95:1c20,74:1b1a415c575559776d7e9c8e8081878b9ea8a990a7d2ba,97:eaebec,67:4c535e4869a5876a7398a775a89ead8b777cf0,680967d8680a67:e9b0,680c67:d9b5dab3dd,680067:c3b8e2,680e67:c1fd,68:323360614e624464831d55664167403e4a4929b58f7477936bc2,696e68fc69:1f20,68f995:27333d43484b555a606e74757778797a7b7c7d7e808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aa#abacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacb,692468f069:0b0157,68e369:10713960425d846b80987834cc8788ce896663799ba7bbabadd4b1c1cadf95e08dff,6a2f69ed6a:171865,69f26a:443ea0505b358e793d28587c9190a997ab,73:3752,6b:8182878492938d9a9ba1aa,8f:6b6d71727375767877797a7c7e818284878b,95:cccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7ecff,96:0713181b1e20232425262728292b2c2d2f303738393a3e41434a4e4f5152535657#58595a5c5d5e606365666b6d6e6f70717378797a7b7c7d7e7f808182838487898a,8f:8d8e8f989a,8ece62:0b171b1f222125242c,81e774:eff4ff,75:0f1113,65:34eeeff0,66:0a19,677266:031500,708566:f71d34313635,800666:5f54414f56615777848ca79dbedbdce6e9,8d:3233363b3d4045464849474d5559,89:c7cacbcccecfd0d1,72:6e9f5d666f7e7f848b8d8f92,63:0832b0,96:8c8e91929395969a9b9d9e9fa0a1a2a3a4a5a6a8a9aaabacadaeafb1b2b4b5b7b8babbbfc2c3c8cacbd0d1d3d4d6d7d8d9dadbdcdddedfe1e2e3e4e5e6e7eb#ecedeef0f1f2f4f5f8fafbfcfdff,97:0203050a0b0c10111214151718191a1b1d1f20,64:3fd8,80046b:eaf3fdf5f9,6c:0507060d1518191a2129242a32,65:35556b,72:4d525630,8662521680:9f9c93bc,670a80:bdb1abadb4b7e7e8e9eadbc2c4d9cdd7,671080:ddebf1f4ed,81:0d0e,80:f2fc,671581128c5a81:361e2c1832484c5374595a7160697c7d6d67,584d5ab581:888291,6ed581:a3aacc,672681:cabb,97:2122232425262728292b2c2e2f3133343536373a3b3c3d3f404142434445464748494a4b4c4d4e4f5051545557585a5c5d5f63646667686a6b6c6d6e6f7071#72757778797a7b7d7e7f8081828384868788898a8c8e8f9093959697999a9b9c9d,81:c1a6,6b:243739434659,98:d1d2d3d5d9da,6bb35f406bc289f365909f5165:93bcc6c4c3ccced2d6,70:809c969dbbc0b7abb1e8ca,71:1013162f31735c6845724a787a98b3b5a8a0e0d4e7f9,72:1d28,706c71:1866b9,62:3e3d434849,79:3b4046495b5c535a6257606f677a858a9aa7b3,5f:d1d0,97:9e9fa1a2a4a5a6a7a8a9aaacaeb0b1b3b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3#e4e5e8eeeff0f1f2f4f7f8f9fafbfcfdfeff,98:000102030405060708090a0b0c0d0e,60:3c5d5a67415963ab,61:060d5da99dcbd1,620680:807f,6c:93f6,6dfc77:f6f8,78:0009171811,65ab78:2d1c1d393a3b1f3c252c23294e6d56572650474c6a9b939a879ca1a3b2b9a5d4d9c9ecf2,790578f479:13241e34,9f9b9e:f9fbfc,76f177:040d,76f977:07081a22192d263538505147435a68,98:0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d#4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e,77:62657f8d7d808c919fa0b0b5bd,75:3a404e4b485b727983,7f:58615f,8a487f:68747179817e,76:cde5,883294:8586878b8a8c8d8f909497959a9b9ca3a4abaaadacafb0b2b4b6b7b8b9babcbdbfc4c8c9cacbcccdced0d1d2d5d6d7d9d8dbdedfe0e2e4e5e7e8ea,98:6f70717273748b8e929599a3a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcfd0d4d6d7dbdcdde0e1e2e3e4#e5e6e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,99:0001020304050607,94:e9ebeeeff3f4f5f7f9fcfdff,95:03020607090a0d0e0f1213141516181b1d1e1f222a2b292c3132343637383c3e3f4235444546494c4e4f525354565758595b5e5f5d61626465666768696a6b6c6f7172733a,77:e7ec,96c979:d5ede3eb,7a065d477a:03021e14,99:08090a0b0c0e0f1112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2f303132333435363738393a3b3c3d3e3f40414243444546474849#4a4b4c4d4e4f50515253565758595a5b5c5d5e5f60616264667378797b7e828389,7a:393751,9ecf99a57a7076:888e9399a4,74:dee0,752c9e:202228292a2b2c3231363837393a3e414244464748494b4c4e5155575a5b5c5e63666768696a6b6c716d73,75:929496a09daca3b3b4b8c4b1b0c3c2d6cde3e8e6e4ebe7,760375:f1fcff,76:1000050c170a25181519,99:8c8e9a9b9c9d9e9fa0a1a2a3a4a6a7a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8#d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9,76:1b3c2220402d303f35433e334d5e545c566b6f,7fca7a:e6787980868895a6a0aca8adb3,88:6469727d7f82a2c6b7bcc9e2cee3e5f1,891a88:fce8fef0,89:2119131b0a342b3641667b,758b80e576:b2b4,77dc80:1214161c20222526272928310b3543464d526971,898398:788083,99:fafbfcfdfeff,9a:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738#393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f50515253545556575859,98:898c8d8f949a9b9e9fa1a2a5a6,86:4d546c6e7f7a7c7ba88d8bac9da7a3aa93a9b6c4b5ceb0bab1afc9cfb4e9f1f2edf3d0,871386:def4dfd8d1,87:0307,86f887:080a0d09233b1e252e1a3e48343129373f82227d7e7b60704c6e8b53637c64596593afa8d2,9a:5a5b5c5d5e5f606162636465666768696a6b7283898d8e949599a6a9aaabacadaeafb2b3b4b5b9bbbdbebfc3c4c6c7c8c9cacdcecfd0d2d4d5d6d7d9dadbdc#dddee0e2e3e4e5e7e8e9eaeceef0f1f2f3f4f5f6f7f8fafcfdfeff,9b:000102040506,87:c68885ad9783abe5acb5b3cbd3bdd1c0cadbeae0ee,88:1613,87fe88:0a1b21393c,7f:36424445,82107a:fafd,7b:080304150a2b0f47382a192e31202524333e1e585a45754c5d606e7b62727190a6a7b8ac9da885aa9ca2abb4d1c1ccdddae5e6ea,7c0c7b:fefc,7c:0f160b,9b:07090a0b0c0d0e1011121415161718191a1b1c1d1e2021222425262728292a2b2c2d2e3031333435363738393a3d3e3f40464a4b4c4e50525355565758595a#5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b,7c:1f2a26384140,81fe82:010204,81ec884482:2122232d2f282b383b33343e44494b4f5a5f68,88:7e8588d8df,895e7f:9d9fa7afb0b2,7c7c65497c:919d9c9ea2b2bcbdc1c7cccdc8c5d7e8,826e66a87f:bfced5e5e1e6e9eef3,7cf87d:77a6ae,7e:479b,9e:b8b4,8d:73849491b1676d,8c:4749,91:4a504e4f64,9b:7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9ba#bbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadb,91:626170696f7d7e7274798c85908d91a2a3aaadaeafb5b4ba,8c559e7e8d:b8eb,8e:055969,8d:b5bfbcbac4d6d7dadececfdbc6ecf7f8e3f9fbe4,8e098dfd8e:141d1f2c2e232f3a4039353d3149414251524a70767c6f74858f94909c9e,8c:78828a859894,659b89:d6dedadc,9b:dcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9c:000102030405060708090a0b0c0d0e0f101112131415161718191a#1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b,89:e5ebef,8a3e8b26975396:e9f3ef,97:0601080f0e2a2d303e,9f:808385868788898a8c,9efe9f:0b0d,96:b9bcbdced2,77bf96e092:8eaec8,93:3e6aca8f,94:3e6b,9c:7f8285868788,7a239c:8b8e90919294959a9b9e9fa0a1a2a3a5a6a7a8a9abadaeb0b1b2b3b4b5b6b7babbbcbdc4c5c6c7cacb3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a#7b7d7e808384898a8c8f93969798999daaacafb9bebfc0c1c2c8c9d1d2dadbe0e1cccdcecfd0d3d4d5d7d8d9dcdddfe2,97:7c85919294afaba3b2b4,9a:b1b0b7,9e589a:b6babcc1c0c5c2cbccd1,9b:45434749484d51,98e899:0d2e5554,9a:dfe1e6efebfbedf9,9b:080f131f23,9e:bdbe,7e3b9e:8287888b92,93d69e:9d9fdbdcdde0dfe2e9e7e5eaef,9f:222c2f39373d3e44,9c:e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9d:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021#22232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142#92$434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081#82838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2#92$a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1#e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9e:000102#92$030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e24272e30343b3c404d5052535456595d5f606162656e6f727475767778797a7b7c7d80#8183848586898a8c8d8e8f90919495969798999a9b9c9ea0a1a2a3a4a5a7a8a9aa#92$abacadaeafb0b1b2b3b5b6b7b9babcbfc0c1c2c3c5c6c7c8cacbccd0d2d3d5d6d7d9dadee1e3e4e6e8ebecedeef0f1f2f3f4f5f6f7f8fafdff,9f:000102030405#060708090a0c0f1112141516181a1b1c1d1e1f21232425262728292a2b2d2e3031#92$3233343536383a3c3f4041424345464748494a4b4c4d4e4f52535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778#797a7b7c7d7e81828d8e8f9091929394959697989c9d9ea1a2a3a4a5,f9:2c7995e7f1#92$,fa:0c0d0e0f111314181f20212324272829,e8:15161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40414243#4445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364");
|
|
110
|
+
const dataText = this.handleText("4e:020405060f12171f20212326292e2f313335373c40414244464a5155575a5b6263646567686a6b6c6d6e6f727475767778797a7b7c7d7f808182838485878a#909697999c9d9ea3aaafb0b1b4b6b7b8b9bcbdbec8cccfd0d2dadbdce0e2e6e7e9edeeeff1f4f8f9fafcfe,4f:00020304050607080b0c12131415161c1d212328292c2d2e31333537393b3e3f40414244454748494a4b4c525456616266686a6b6d6e7172757778797a7d8081828586878a8c8e909293959698999a9c9e9fa1a2a4abadb0b1b2b3b4b6b7b8b9babbbcbdbec0c1c2c6c7c8c9cbcccdd2d3d4d5d6d9dbe0e2e4e5e7ebecf0f2f4f5f6f7f9fbfcfdff,50:000102030405060708090a#0b0e1011131516171b1d1e20222324272b2f303132333435363738393b3d3f404142444546494a4b4d5051525354565758595b5d5e5f6061626364666768696a6b6d6e6f70717273747578797a7c7d818283848687898a8b8c8e8f909192939495969798999a9b9c9d9e9fa0a1a2a4a6aaabadaeafb0b1b3b4b5b6b7b8b9bcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdced0d1d2d3d4d5d7d8d9dbdcdddedfe0e1e2e3e4e5e8e9eaebeff0f1f2f4f6f7f8f9fafcfdfeff,51:00010203040508#090a0c0d0e0f1011131415161718191a1b1c1d1e1f2022232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e42474a4c4e4f5052535758595b5d5e5f606163646667696a6f727a7e7f838486878a8b8e8f90919394989a9d9e9fa1a3a6a7a8a9aaadaeb4b8b9babebfc1c2c3c5c8cacdced0d2d3d4d5d6d7d8d9dadcdedfe2e3e5e6e7e8e9eaeceef1f2f4f7fe,52:0405090b0c0f101314151c1e1f2122232526272a2c2f313234353c3e4445464748494b4e4f5253555758#595a5b5d5f6062636466686b6c6d6e7071737475767778797a7b7c7e808384858687898a8b8c8d8e8f91929495969798999a9ca4a5a6a7aeafb0b4b5b6b7b8b9babbbcbdc0c1c2c4c5c6c8cacccdcecfd1d3d4d5d7d9dadbdcdddee0e1e2e3e5e6e7e8e9eaebecedeeeff1f2f3f4f5f6f7f8fbfcfd,53:0102030407090a0b0c0e11121314181b1c1e1f2224252728292b2c2d2f3031323334353637383c3d404244464b4c4d505458595b5d65686a6c6d7276797b7c7d7e80818387888a8e8f#90919293949697999b9c9ea0a1a4a7aaabacadafb0b1b2b3b4b5b7b8b9babcbdbec0c3c4c5c6c7cecfd0d2d3d5dadcdddee1e2e7f4fafeff,54:000205070b1418191a1c2224252a303336373a3d3f4142444547494c4d4e4f515a5d5e5f6061636567696a6b6c6d6e6f7074797a7e7f8183858788898a8d919397989c9e9fa0a1a2a5aeb0b2b5b6b7b9babcbec3c5cacbd6d8dbe0e1e2e3e4ebeceff0f1f4f5f6f7f8f9fbfe,55:0002030405080a0b0c0d0e121315161718191a1c1d1e1f212526#28292b2d3234353638393a3b3d40424547484b4c4d4e4f515253545758595a5b5d5e5f60626368696b6f7071727374797a7d7f85868c8d8e9092939596979a9b9ea0a1a2a3a4a5a6a8a9aaabacadaeafb0b2b4b6b8babcbfc0c1c2c3c6c7c8cacbcecfd0d5d7d8d9dadbdee0e2e7e9edeef0f1f4f6f8f9fafbfcff,56:0203040506070a0b0d1011121314151617191a1c1d202122252628292a2b2e2f30333537383a3c3d3e404142434445464748494a4b4f5051525355565a5b5d5e5f6061#636566676d6e6f70727374757778797a7d7e7f80818283848788898a8b8c8d9091929495969798999a9b9c9d9e9fa0a1a2a4a5a6a7a8a9aaabacadaeb0b1b2b3b4b5b6b8b9babbbdbebfc0c1c2c3c4c5c6c7c8c9cbcccdcecfd0d1d2d3d5d6d8d9dce3e5e6e7e8e9eaeceeeff2f3f6f7f8fbfc,57:00010205070b0c0d0e0f101112131415161718191a1b1d1e202122242526272b313234353637383c3d3f414344454648494b52535455565859626365676c6e707172747578797a7d7e7f80#818788898a8d8e8f90919495969798999a9c9d9e9fa5a8aaacafb0b1b3b5b6b7b9babbbcbdbebfc0c1c4c5c6c7c8c9cacccdd0d1d3d6d7dbdcdee1e2e3e5e6e7e8e9eaebeceef0f1f2f3f5f6f7fbfcfeff,58:0103040508090a0c0e0f101213141617181a1b1c1d1f222325262728292b2c2d2e2f31323334363738393a3b3c3d3e3f4041424345464748494a4b4e4f505253555657595a5b5c5d5f6061626364666768696a6d6e6f707172737475767778797a7b7c7d7f82848687888a8b8c#8d8e8f909194959697989b9c9da0a1a2a3a4a5a6a7aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbdbebfc0c2c3c4c6c7c8c9cacbcccdcecfd0d2d3d4d6d7d8d9dadbdcdddedfe0e1e2e3e5e6e7e8e9eaedeff1f2f4f5f7f8fafbfcfdfeff,59:000103050608090a0b0c0e1011121317181b1d1e2021222326282c30323335363b3d3e3f404345464a4c4d505253595b5c5d5e5f616364666768696a6b6c6d6e6f70717275777a7b7c7e7f8085898b8c8e8f90919495989a9b9c9d9fa0a1a2a6#a7acadb0b1b3b4b5b6b7b8babcbdbfc0c1c2c3c4c5c7c8c9cccdcecfd5d6d9dbdedfe0e1e2e4e6e7e9eaebedeeeff0f1f2f3f4f5f6f7f8fafcfdfe,5a:00020a0b0d0e0f101214151617191a1b1d1e2122242627282a2b2c2d2e2f3033353738393a3b3d3e3f414243444547484b4c4d4e4f5051525354565758595b5c5d5e5f60616364656668696b6c6d6e6f7071727378797b7c7d7e808182838485868788898a8b8c8d8e8f9091939495969798999c9d9e9fa0a1a2a3a4a5a6a7a8a9abac#adaeafb0b1b4b6b7b9babbbcbdbfc0c3c4c5c6c7c8cacbcdcecfd0d1d3d5d7d9dadbdddedfe2e4e5e7e8eaecedeeeff0f2f3f4f5f6f7f8f9fafbfcfdfeff,5b:0001020304050607080a0b0c0d0e0f10111213141518191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303133353638393a3b3c3d3e3f4142434445464748494a4b4c4d4e4f52565e606167686b6d6e6f7274767778797b7c7e7f82868a8d8e90919294969fa7a8a9acadaeafb1b2b7babbbcc0c1c3c8c9cacbcdcecf#d1d4d5d6d7d8d9dadbdce0e2e3e6e7e9eaebecedeff1f2f3f4f5f6f7fdfe,5c:0002030507080b0c0d0e10121317191b1e1f2021232628292a2b2d2e2f303233353637434446474c4d5253545657585a5b5c5d5f62646768696a6b6c6d70727374757677787b7c7d7e808384858687898a8b8e8f9293959d9e9fa0a1a4a5a6a7a8aaaeafb0b2b4b6b9babbbcbec0c2c3c5c6c7c8c9cacccdcecfd0d1d3d4d5d6d7d8dadbdcdddedfe0e2e3e7e9ebeceeeff1f2f3f4f5f6f7f8f9fafcfdfeff,5d:00#01040508090a0b0c0d0f10111213151718191a1c1d1f2021222325282a2b2c2f3031323335363738393a3b3c3f4041424344454648494d4e4f5051525354555657595a5c5e5f6061626364656667686a6d6e7071727375767778797a7b7c7d7e7f8081838485868788898a8b8c8d8e8f9091929394959697989a9b9c9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b8b9babbbcbdbebfc0c1c2c3c4c6c7c8c9cacbcccecfd0d1d2d3d4d5d6d7d8d9dadcdfe0e3e4eaeced#f0f5f6f8f9fafbfcff,5e:000407090a0b0d0e1213171e1f20212223242528292a2b2c2f303233343536393a3e3f404143464748494a4b4d4e4f50515253565758595a5c5d5f60636465666768696a6b6c6d6e6f70717577797e8182838588898c8d8e92989b9da1a2a3a4a8a9aaabacaeafb0b1b2b4babbbcbdbfc0c1c2c3c4c5c6c7c8cbcccdcecfd0d4d5d7d8d9dadcdddedfe0e1e2e3e4e5e6e7e9ebecedeeeff0f1f2f3f5f8f9fbfcfd,5f:050607090c0d0e10121416191a1c1d1e21222324#282b2c2e30323334353637383b3d3e3f4142434445464748494a4b4c4d4e4f5154595a5b5c5e5f60636567686b6e6f72747576787a7d7e7f83868d8e8f919394969a9b9d9e9fa0a2a3a4a5a6a7a9abacafb0b1b2b3b4b6b8b9babbbebfc0c1c2c7c8cacbced3d4d5dadbdcdedfe2e3e5e6e8e9eceff0f2f3f4f6f7f9fafc,60:0708090b0c10111317181a1e1f2223242c2d2e3031323334363738393a3d3e404445464748494a4c4e4f5153545657585b5c5e5f606165666e71727475777e80#8182858687888a8b8e8f909193959798999c9ea1a2a4a5a7a9aaaeb0b3b5b6b7b9babdbebfc0c1c2c3c4c7c8c9cccdcecfd0d2d3d4d6d7d9dbdee1e2e3e4e5eaf1f2f5f7f8fbfcfdfeff,61:02030405070a0b0c1011121314161718191b1c1d1e21222528292a2c2d2e2f303132333435363738393a3b3c3d3e4041424344454647494b4d4f50525354565758595a5b5c5e5f606163646566696a6b6c6d6e6f717273747678797a7b7c7d7e7f808182838485868788898a8c8d8f9091929395#969798999a9b9c9e9fa0a1a2a3a4a5a6aaabadaeafb0b1b2b3b4b5b6b8b9babbbcbdbfc0c1c3c4c5c6c7c9cccdcecfd0d3d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e7e8e9eaebecedeeeff0f1f2f3f4f6f7f8f9fafbfcfdfe,62:00010203040507091314191c1d1e2023262728292b2d2f303132353638393a3b3c424445464a4f50555657595a5c5d5e5f6061626465687172747577787a7b7d818283858687888b8c8d8e8f9094999c9d9ea3a6a7a9aaadaeafb0b2b3b4b6b7b8babec0c1#c3cbcfd1d5dddee0e1e4eaebf0f2f5f8f9fafb,63:00030405060a0b0c0d0f10121314151718191c2627292c2d2e30313334353637383b3c3e3f40414447484a51525354565758595a5b5c5d60646566686a6b6c6f707273747578797c7d7e7f81838485868b8d9193949597999a9b9c9d9e9fa1a4a6abafb1b2b5b6b9bbbdbfc0c1c2c3c5c7c8cacbccd1d3d4d5d7d8d9dadbdcdddfe2e4e5e6e7e8ebeceeeff0f1f3f5f7f9fafbfcfe,64:0304060708090a0d0e111215161718191a1d1f222324#252728292b2e2f3031323335363738393b3c3e404243494b4c4d4e4f505153555657595a5b5c5d5f60616263646566686a6b6c6e6f70717273747576777b7c7d7e7f8081838688898a8b8c8d8e8f90939497989a9b9c9d9fa0a1a2a3a5a6a7a8aaabafb1b2b3b4b6b9bbbdbebfc1c3c4c6c7c8c9cacbcccfd1d3d4d5d6d9dadbdcdddfe0e1e3e5e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,65:01020304050607080a0b0c0d0e0f10111314151617191a1b1c1d1e1f2021#222324262728292a2c2d30313233373a3c3d404142434446474a4b4d4e5052535457585a5c5f606164656768696a6d6e6f7173757678797a7b7c7d7e7f8081828384858688898a8d8e8f92949596989a9d9ea0a2a3a6a8aaacaeb1b2b3b4b5b6b7b8babbbebfc0c2c7c8c9cacdd0d1d3d4d5d8d9dadbdcdddedfe1e3e4eaebf2f3f4f5f8f9fbfcfdfeff,66:0104050708090b0d1011121617181a1b1c1e2122232426292a2b2c2e3032333738393a3b3d3f40424445464748494a4d4e505158#595b5c5d5e6062636567696a6b6c6d7172737578797b7c7d7f808183858688898a8b8d8e8f909293949598999a9b9c9e9fa0a1a2a3a4a5a6a9aaabacadafb0b1b2b3b5b6b7b8babbbcbdbfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8dadedfe0e1e2e3e4e5e7e8eaebecedeeeff1f5f6f8fafbfd,67:010203040506070c0e0f1112131618191a1c1e20212223242527292e303233363738393b3c3e3f414445474a4b4d5254555758595a5b5d62636466676b6c6e717476#78797a7b7d8082838586888a8c8d8e8f9192939496999b9fa0a1a4a6a9acaeb1b2b4b9babbbcbdbebfc0c2c5c6c7c8c9cacbcccdced5d6d7dbdfe1e3e4e6e7e8eaebedeef2f5f6f7f8f9fafbfcfe,68:01020304060d1012141518191a1b1c1e1f20222324252627282b2c2d2e2f30313435363a3b3f474b4d4f52565758595a5b5c5d5e5f6a6c6d6e6f707172737578797a7b7c7d7e7f8082848788898a8b8c8d8e90919294959698999a9b9c9d9e9fa0a1a3a4a5a9aaabacaeb1b2b4b6b7b8#b9babbbcbdbebfc1c3c4c5c6c7c8cacccecfd0d1d3d4d6d7d9dbdcdddedfe1e2e4e5e6e7e8e9eaebecedeff2f3f4f6f7f8fbfdfeff,69:00020304060708090a0c0f11131415161718191a1b1c1d1e21222325262728292a2b2c2e2f313233353637383a3b3c3e4041434445464748494a4b4c4d4e4f50515253555658595b5c5f616264656768696a6c6d6f7072737475767a7b7d7e7f8183858a8b8c8e8f909192939697999a9d9e9fa0a1a2a3a4a5a6a9aaacaeafb0b2b3b5b6b8b9babcbd#bebfc0c2c3c4c5c6c7c8c9cbcdcfd1d2d3d5d6d7d8d9dadcdddee1e2e3e4e5e6e7e8e9eaebeceeeff0f1f3f4f5f6f7f8f9fafbfcfe,6a:000102030405060708090b0c0d0e0f10111213141516191a1b1c1d1e20222324252627292b2c2d2e30323334363738393a3b3c3f40414243454648494a4b4c4d4e4f515253545556575a5c5d5e5f60626364666768696a6b6c6d6e6f70727374757677787a7b7d7e7f81828385868788898a8b8c8d8f929394959698999a9b9c9d9e9fa1a2a3a4a5a6#a7a8aaadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,6b:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f252628292a2b2c2d2e2f303133343536383b3c3d3f4041424445484a4b4d4e4f5051525354555657585a5b5c5d5e5f606168696b6c6d6e6f7071727374757677787a7d7e7f808588#8c8e8f909194959798999c9d9e9fa0a2a3a4a5a6a7a8a9abacadaeafb0b1b2b6b8b9babbbcbdbec0c3c4c6c7c8c9caccced0d1d8dadcdddedfe0e2e3e4e5e6e7e8e9ecedeef0f1f2f4f6f7f8fafbfcfeff,6c:000102030408090a0b0c0e12171c1d1e2023252b2c2d31333637393a3b3c3e3f434445484b4c4d4e4f5152535658595a62636566676b6c6d6e6f71737577787a7b7c7f8084878a8b8d8e9192959697989a9c9d9ea0a2a8acafb0b4b5b6b7bac0c1c2c3c6c7c8cbcdcecfd1d2d8#d9dadcdddfe4e6e7e9ecedf2f4f9ff,6d:000203050608090a0d0f101113141516181c1d1f20212223242628292c2d2f30343637383a3f404244494c50555657585b5d5f6162646567686b6c6d707172737576797a7b7d7e7f8081838486878a8b8d8f9092969798999a9ca2a5acadb0b1b3b4b6b7b9babbbcbdbec1c2c3c8c9cacdcecfd0d2d3d4d5d7dadbdcdfe2e3e5e7e8e9eaedeff0f2f4f5f6f8fafdfeff,6e:0001020304060708090b0f12131518191b1c1e1f222627282a2c2e30313335#3637393b3c3d3e3f40414245464748494a4b4c4f5051525557595a5c5d5e606162636465666768696a6c6d6f707172737475767778797a7b7c7d8081828487888a8b8c8d8e91929394959697999a9b9d9ea0a1a3a4a6a8a9abacadaeb0b3b5b8b9bcbebfc0c3c4c5c6c8c9cacccdced0d2d6d8d9dbdcdde3e7eaebecedeeeff0f1f2f3f5f6f7f8fafbfcfdfeff,6f:000103040507080a0b0c0d0e101112161718191a1b1c1d1e1f212223252627282c2e303234353738393a3b3c3d3f404142#43444548494a4c4e4f5051525354555657595a5b5d5f60616364656768696a6b6c6f707173757677797b7d7e7f808182838586878a8b8f909192939495969798999a9b9d9e9fa0a2a3a4a5a6a8a9aaabacadaeafb0b1b2b4b5b7b8babbbcbdbebfc1c3c4c5c6c7c8cacbcccdcecfd0d3d4d5d6d7d8d9dadbdcdddfe2e3e4e5e6e7e8e9eaebecedf0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,70:000102030405060708090a0b0c0d0e0f1012131415161718191c1d1e1f2021222425262728292a#2b2c2d2e2f30313233343637383a3b3c3d3e3f404142434445464748494a4b4d4e505152535455565758595a5b5c5d5f606162636465666768696a6e7172737477797a7b7d818283848687888b8c8d8f90919397989a9b9e9fa0a1a2a3a4a5a6a7a8a9aab0b2b4b5b6babebfc4c5c6c7c9cbcccdcecfd0d1d2d3d4d5d6d7dadcdddee0e1e2e3e5eaeef0f1f2f3f4f5f6f8fafbfcfeff,71:0001020304050607080b0c0d0e0f111214171b1c1d1e1f2021222324252728292a2b2c2d2e323334#353738393a3b3c3d3e3f4041424344464748494b4d4f505152535455565758595a5b5d5f6061626365696a6b6c6d6f707174757677797b7c7e7f8081828385868788898b8c8d8e909192939596979a9b9c9d9ea1a2a3a4a5a6a7a9aaabadaeafb0b1b2b4b6b7b8babbbcbdbebfc0c1c2c4c5c6c7c8c9cacbcccdcfd0d1d2d3d6d7d8d9dadbdcdddedfe1e2e3e4e6e8e9eaebecedeff0f1f2f3f4f5f6f7f8fafbfcfdfeff,72:0001020304050708090a0b0c0d0e0f101112131415161718191a#1b1c1e1f2021222324252627292b2d2e2f3233343a3c3e40414243444546494a4b4e4f505153545557585a5c5e60636465686a6b6c6d707173747677787b7c7d828385868788898c8e9091939495969798999a9b9c9d9ea0a1a2a3a4a5a6a7a8a9aaabaeb1b2b3b5babbbcbdbebfc0c5c6c7c9cacbcccfd1d3d4d5d6d8dadb#95$,30:000102,00b702:c9c7,00a830:0305,2014ff5e20:162618191c1d,30:141508090a0b0c0d0e0f16171011,00:b1d7f7,22:362728110f2a2908371aa52520,231222:992b2e614c483d1d606e6f64651e3534,26:4240,00b020:3233,2103ff0400a4ff:e0e1,203000a7211626:0605,25:cbcfcec7c6a1a0b3b2,203b21:92909193,30:13#95$,21:70717273747576777879#4$,24:88898a8b8c8d8e8f909192939495969798999a9b7475767778797a7b7c7d7e7f808182838485868760616263646566676869##,32:20212223242526272829##,21:606162636465666768696a6b#97$,ff:010203e505060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5de3#95$,30:4142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f90919293#106$a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6#103$,03:9192939495969798999a9b9c9d9e9fa0a1a3a4a5a6a7a8a9#6$b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c3c4c5c6c7c8c9#5$,fe:3536393a3f403d3e41424344##3b3c373831#3334#104$,04:10111213141501161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f#13$30313233343551363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f#11$,02:cacbd9,20:13152535,21:050996979899,22:151f23526667bf,25:505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727381828384858687#88898a8b8c8d8e8f939495bcbde2e3e4e5,2609229530:121d1e#9$,010100e101ce00e0011300e9011b00e8012b00ed01d000ec014d00f301d200f2016b00fa01d400f901:d6d8dadc,00:fcea,0251e7c701:4448,e7c802:61#2$,31:05060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223242526272829#19$,30:212223242526272829,32a333:8e8f9c9d9ea1c4ced1d2d5,fe30ff:e2e4#,212132:31#,20:10#1$,30:fc9b9cfdfe069d9e,fe:494a4b4c4d4e4f50515254555657595a5b5c5d5e5f6061#626364656668696a6b,e7:e7e8e9eaebecedeeeff0f1f2f3,30:07#11$,25:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b#13$,72:dcdddfe2e3e4e5e6e7eaebf5f6f9fdfeff,73:00020405060708090b0c0d0f1011121418191a1f2023242627282d2f30323335363a3b3c3d404142434445464748#494a4b4c4e4f515354555658595a5b5c5d5e5f6162636465666768696a6b6e7071#92$72737475767778797a7b7c7d7f808182838586888a8c8d8f90929394959798999a9c9d9ea0a1a3a4a5a6a7a8aaacadb1b4b5b6b8b9bcbdbebfc1c3c4c5c6c7#cbccced2d3d4d5d6d7d8dadbdcdddfe1e2e3e4e6e8eaebeceeeff0f1f3f4f5f6f7#92$f8f9fafbfcfdfeff,74:0001020407080b0c0d0e1112131415161718191c1d1e1f2021232427292b2d2f31323738393a3b3d3e3f4042434445464748494a4b4c4d#4e4f505152535456585d606162636465666768696a6b6c6e6f717273747578797a#92$7b7c7d7f8284858688898a8c8d8f9192939495969798999a9b9d9fa0a1a2a3a4a5a6aaabacadaeafb0b1b2b3b4b5b6b7b8b9bbbcbdbebfc0c1c2c3c4c5c6c7#c8c9cacbcccdcecfd0d1d3d4d5d6d7d8d9dadbdddfe1e5e7e8e9eaebecedf0f1f2#92$f3f5f8f9fafbfcfdfe,75:0001020305060708090a0b0c0e1012141516171b1d1e202122232426272a2e3436393c3d3f414243444647494a4d5051525355565758#5d5e5f60616263646768696b6c6d6e6f7071737576777a7b7c7d7e808182848587#92$88898a8c8d8e909395989b9c9ea2a6a7a8a9aaadb6b7babbbfc0c1c6cbcccecfd0d1d3d7d9dadcdddfe0e1e5e9ecedeeeff2f3f5f6f7f8fafbfdfe,76:02040607#08090b0d0e0f11121314161a1c1d1e212327282c2e2f31323637393a3b3d414244#92$45464748494a4b4e4f50515253555758595a5b5d5f6061626465666768696a6c6d6e7071727374757677797a7c7f80818385898a8c8d8f9092949597989a9b#9c9d9e9fa0a1a2a3a5a6a7a8a9aaabacadafb0b3b5b6b7b8b9babbbcbdbec0c1c3,554a963f57c3632854ce550954c076:914c,853c77ee827e788d72319698978d6c285b894ffa630966975cb880fa684880ae660276ce51f9655671ac7ff1888450b2596561ca6fb382ad634c625253ed54277b06516b75a45df462d48dcb9776628a8019575d97387f627238767d67cf767e64464f708d2562dc7a17659173ed642c6273822c9881677f724862:6ecc,4f3474e3534a529e7eca90a65e2e6886699c81807ed168d278c5868c9551508d8c2482de80de53058912526576:c4c7c9cbccd3d5d9dadcdddee0e1e2e3e4e6e7e8e9eaebecedf0f3f5f6f7fafbfdff,77:00020305060a0c0e0f1011121314151617181b1c1d1e21232425272a2b#2c2e3031323334393b3d3e3f4244454648494a4b4c4d4e4f52535455565758595c,858496f94fdd582199715b9d62:b1a5,66b48c799c8d7206676f789160b253:5117,8f8880cc8d1d94a1500d72c8590760eb711988ab595482ef672c7b285d297ef7752d6cf58e668ff8903c9f3b6bd491197b145f7c78a784d6853d6b:d5d9d6,5e:0187,75f995ed655d5f:0ac5,8f9f58c181c2907f965b97ad8fb97f168d2c62414fbf53:d85e,8f:a8a9ab,904d68075f6a819888689cd6618b522b762a5f6c658c6fd26ee85bbe644851:75b0,67c44e1979c9997c70b377:5d5e5f606467696a6d6e6f7071727374757677787a7b7c818283868788898a8b8f90939495969798999a9b9c9d9ea1a3a4a6a8abadaeafb1b2b4b6b7b8b9ba#bcbec0c1c2c3c4c5c6c7c8c9cacbcccecfd0d1d2d3d4d5d6d8d9dadddedfe0e1e4,75c55e7673bb83e064ad62e894b56ce2535a52c3640f94c27b944f2f5e1b823681:168a,6e246cca9a736355535c54fa886557e04e0d5e036b657c3f90e8601664e6731c88c16750624d8d22776c8e2991c75f6983dc8521991053c286956b8b60:ede8,707f82:cd31,4ed36ca785cf64cd7cd969fd66f9834953957b564fa7518c6d4b5c428e6d63d253c983:2c36,67e578b4643d5bdf5c945dee8be762c667f48c7a640063ba8749998b8c177f2094f24ea7961098a4660c731677:e6e8eaeff0f1f2f4f5f7f9fafbfc,78:0304050607080a0b0e0f101315191b1e20212224282a2b2e2f31323335363d3f414243444648494a4b4d4f51535458595a#5b5c5e5f606162636465666768696f7071727374757678797a7b7d7e7f80818283,573a5c1d5e38957f507f80a05382655e7545553150218d856284949e671d56326f6e5de2543570928f66626f64a463a35f7b6f8890f481e38fb05c1866685ff16c8996488d81886c649179f057ce6a59621054484e587a0b60e96f848bda627f901e9a8b79e4540375f4630153196c608fdf5f1b9a70803b9f7f4f885c3a8d647fc565a570bd51:45b2,866b5d075ba062bd916c75748e0c7a2061017b794ec77ef877854e1181ed521d51fa6a7153a88e87950496cf6ec19664695a78:848586888a8b8f9092949596999d9ea0a2a4a6a8a9aaabacadaeafb5b6b7b8babbbcbdbfc0c2c3c4c6c7c8cccdcecfd1d2d3d6d7d8dadbdcdddedfe0e1e2e3#e4e5e6e7e9eaebedeeeff0f1f3f5f6f8f9fbfcfdfeff,79:00020304060708090a0b0c,784050a877d7641089e6590463e35ddd7a7f693d4f20823955984e3275ae7a975e:628a,95ef521b5439708a6376952457826625693f918755076df37eaf882262337ef075b5832878c196cc8f9e614874f78bcd6b64523a8d506b21806a847156f153064e:ce1b,51d17c97918b7c074fc38e7f7be17a9c64675d1450ac810676017cb96dec7fe067515b:58f8,78cb64:ae13,63:aa2b,9519642d8fbe7b5476296253592754466b7950a362345e266b864ee38d37888b5f85902e79:0d0e0f1011121415161718191a1b1c1d1f2021222325262728292a2b2c2d2e2f3031323335363738393d3f42434445474a4b4c4d4e4f505152545558596163#6466696a6b6c6e70717273747576797b7c7d7e7f8283868788898b8c8d8e909192,6020803d62c54e39535590f863b880c665e66c2e4f4660ee6de18bde5f3986cb5f536321515a83616863520063638e4850125c9b79775bfc52307a3b60bc905376d75f:b797,76848e6c706f767b7b4977aa51f3909358244f4e6ef48fea654c7b1b72c46da47fdf5ae162b55e95573084827b2c5e1d5f1f90127f1498a063826ec7789870b95178975b57ab75354f4375385e9760e659606dc06bbf788953fc96d551cb52016389540a94938c038dcc7239789f87768fed8c0d53e079:939495969798999b9c9d9e9fa0a1a2a3a4a5a6a8a9aaabacadaeafb0b1b2b4b5b6b7b8bcbfc2c4c5c7c8cacccecfd0d3d4d6d7d9dadbdcdddee0e1e2e5e8ea#eceef1f2f3f4f5f6f7f9fafcfeff,7a:0104050708090a0c0f10111213151618191b1c,4e0176ef53ee948998769f0e952d5b9a8ba24e:221c,51ac846361c252a8680b4f97606b51bb6d1e515c6296659796618c46901775d890fd77636bd272:8aec,8bfb583577798d4c675c9540809a5ea66e2159927aef77ed953b6bb565ad7f0e58065151961f5bf958a954288e726566987f56e4949d76fe9041638754c659:1a3a,579b8eb267358dfa8235524160f0581586fe5ce89e454fc4989d8bb95a2560765384627c904f9102997f6069800c513f80335c1499756d314e8c7a:1d1f21222425262728292a2b2c2d2e2f303132343536383a3e4041424344454748494a4b4c4d4e4f50525354555658595a5b5c5d5e5f606162636465666768#696a6b6c6d6e6f717273757b7c7d7e828587898a8b8c8e8f909394999a9b9ea1a2,8d3053d17f5a7b4f4f104e4f96006cd573d085e95e06756a7ffb6a0a77fe94927e4151e170e653cd8fd483038d2972af996d6cdb574a82b365b980aa623f963259a84eff8bbf7eba653e83f2975e556198de80a5532a8bfd542080ba5e9f6cb88d3982ac915a54296c1b52067eb7575f711a6c7e7c89594b4efd5fff61247caa4e305c0167ab87025cf0950b98ce75af70fd902251af7f1d8bbd594951e44f5b5426592b657780a45b7562:76c2,8f905e456c1f7b264f:0fd8,670d7a:a3a4a7a9aaabaeafb0b1b2b4b5b6b7b8b9babbbcbdbec0c1c2c3c4c5c6c7c8c9cacccdcecfd0d1d2d3d4d5d7d8dadbdcdde1e2e4e7e8e9eaebeceef0f1f2f3#f4f5f6f7f8fbfcfe,7b:0001020507090c0d0e1012131617181a1c1d1f21222327292d,6d:6eaa,798f88b15f17752b629a8f854fef91dc65a781:2f51,5e9c81508d74526f89868d4b590d50854ed8961c723681798d1f5bcc8ba3964459877f1a549056:760e,8be565396982949976d66e895e72751867:46d1,7aff809d8d76611f79c665628d635188521a94a27f38809b7eb25c976e2f67607bd9768b9ad8818f7f947cd5641e95507a3f54:4ae5,6b4c640162089e3d80f3759952729769845b683c86e496:0194,94ec4e2a54047ed968398ddf801566f45e9a7fb97b:2f303234353637393b3d3f404142434446484a4d4e535557595c5e5f61636465666768696a6b6c6d6f70737476787a7c7d7f81828384868788898a8b8c8e8f#9192939698999a9b9e9fa0a3a4a5aeafb0b2b3b5b6b7b9babbbcbdbebfc0c2c3c4,57c2803f68975de5653b529f606d9f9a4f9b8eac516c5bab5f135de96c5e62f18d21517194a952fe6c9f82df72d757a267848d2d591f8f9c83c754957b8d4f306cbd5b6459d19f1353e486ca9aa88c3780a16545987e56fa96c7522e74dc52505be1630289024e5662d0602a68fa51735b9851a089c27ba199867f5060ef704c8d2f51495e7f901b747089c4572d78455f529f9f95fa8f689b3c8be17678684267dc8d:ea35,523d8f8a6eda68cd950590ed56fd679c88f98fc754c87b:c5c8c9cacbcdcecfd0d2d4d5d6d7d8dbdcdedfe0e2e3e4e7e8e9ebecedeff0f2f3f4f5f6f8f9fafbfdff,7c:0001020304050608090a0d0e101112131415171819#1a1b1c1d1e20212223242528292b2c2d2e2f3031323334353637393a3b3c3d3e42,9ab85b696d776c264ea55bb39a87916361a890af97e9542b6db55bd251fd558a7f:55f0,64bc634d65f161be608d710a6c:5749,592f676d822a58d5568e8c6a6beb90dd597d801753f76d695475559d83:77cf,683879be548c4f55540876d28c8996026cb36db88d6b89109e648d3a563f9ed175d55f8872e0606854fc4ea86a2a886160528f7054c470d886799e3f6d2a5b8f5f187ea255894faf7334543c539a501954:0e7c,4e4e5ffd745a58f6846b80e1877472d07cca6e567c:434445464748494a4b4c4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f70717275767778797a7e7f8081828384858687#888a8b8c8d8e8f90939496999a9ba0a1a3a6a7a8a9abacadafb0b4b5b6b7b8babb,5f27864e552c62a44e926caa623782b154d7534e733e6ed1753b521253168bdd69d05f8a60006dee574f6b2273af68538fd87f13636260a3552475ea8c6271156da35ba65e7b8352614c9ec478fa87577c27768751f060f6714c66435e4c604d8c0e707063258f895fbd606286d456de6bc160946167534960e066668d3f79fd4f1a70e96c478b:b3f2,7ed88364660f5a5a9b426d:51f7,8c416d3b4f19706b83b7621660d1970d8d27797851fb57:3efa,673a75787a3d79ef7b957c:bfc0c2c3c4c6c9cbcecfd0d1d2d3d4d8dadbdddee1e2e3e4e5e6e7e9eaebecedeef0f1f2f3f4f5f6f7f9fafcfdfeff,7d:000102030405060708090b0c0d0e0f10#1112131415161718191a1b1c1d1e1f212324252628292a2c2d2e30313233343536,808c99658ff96fc08ba59e2159ec7ee97f095409678168d88f917c4d96c653ca602575be6c7253735ac97ea7632451e0810a5df184df628051805b634f0e796d524260b86d4e5b:c4c2,8b:a1b0,65e25fcc964559937e:e7aa,560967b759394f735bb652a0835a988a8d3e753294be50477a3c4ef767b69a7e5ac16b7c76d1575a5c167b3a95f4714e517c80a9827059787f04832768c067ec78:b177,62e363617b804fed526a51cf835069db92748d:f531,89c1952e7bad4ef67d:3738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6f70717273747576#78797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798,506582305251996f6e:1085,6da75efa50f559dc5c066d466c5f7586848b686859568bb253209171964d854969127901712680f64ea490ca6d479a845a0756bc640594f077eb4fa5811a72e189d2997a7f347ede527f655991758f:7f83,53eb7a9663:eda5,768679f888579636622a52ab8282685467706377776b7aed6d017ed389e359d0621285c982a5754c501f4ecb75a58beb5c4a5dfe7b4b65a491d14eca6d25895f7d2795264ec58c288fdb9773664b79818fd170ec6d787d:999a9b9c9d9e9fa0a1a2a3a4a5a7a8a9aaabacadafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9#dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fa,5c3d52b283465162830e775b66769cb84eac60ca7c:beb3,7ecf4e958b66666f988897595883656c955c5f8475c997567a:dfde,51c070af7a9863ea7a767ea0739697ed4e4570784e5d915253a965:51e7,81fc8205548e5c31759a97a062d872d975bd5c459a7983ca5c40548077e94e3e6cae805a62d2636e5de851778ddd8e1e952f4ff153e560e770ac526763509e435a1f5026773753777ee26485652b628963985014723589c951b38bc07edd574783cc94a7519b541b5cfb7d:fbfcfdfeff,7e:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233343536373839#3a3c3d3e3f40424344454648494a4b4c4d4e4f505152535455565758595a5b5c5d,4fca7ae36d5a90e19a8f55805496536154af5f0063e9697751ef6168520a582a52d8574e780d770b5eb761777ce062:5b97,4ea27095800362f770e49760577782db67ef68f578d5989779d158f354b353ef6e34514b523b5ba28bfe80af554357a660735751542d7a7a60505b5463a762a053e362635bc767af54ed7a9f82e691775e9388e4593857ae630e8de880ef57577b774fa95feb5bbd6b3e53217b5072c2684677:ff36,65f751b54e8f76d45cbf7aa58475594e9b4150807e:5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081838485868788898a8b8c8d8e8f909192939495969798999a9c9d9e#aeb4bbbcd6e4ecf9,7f:0a101e37393b3c3d3e3f404143464748494a4b4c4d4e4f5253,998861276e8357646606634656f062:ec69,5ed39614578362c955878721814a8fa3556683b167658d5684dd5a6a680f62e67bee961151706f9c8c3063fd89c861d27f0670c26ee57405699472fc5eca90ce67176d6a635e52b3726280014f6c59e5916a70d96d9d52d24e5096f7956d857e78ca7d2f5121579264c2808b7c7b6cea68f1695e51b7539868a872819ece7bf172f879bb6f137406674e91cc9ca4793c83:8954,540f68174e3d538952b1783e5386522950884f:8bd0,7f:56595b5c5d5e6063646566676b6c6d6f7073757677787a7b7c7d7f8082838485868788898b8d8f9091929395969798999b9ca0a2a3a5a6a8a9aaabacadaeb1#b3b4b5b6b7babbbec0c2c3c4c6c7c8c9cbcdcfd0d1d2d3d6d7d9dadbdcdddee2e3,75e27acb7c926ca596b6529b748354e94fe9805483b28fde95705ec9601c6d9f5e18655b813894fe604b70bc7ec37cae51c968817cb1826f4e248f8691cf667e4eae8c0564a9804a50da759771ce5be58fbd6f664e86648295635ed66599521788c270c852a3730e7433679778f797164e3490bb9cde6dcb51db8d41541d62ce73b283f196f69f8494c34f367f9a51cc707596755cad988653e64ee46e9c740969b4786b998f7559521876246d4167f3516d9f99804b54997b3c7abf7f:e4e7e8eaebecedeff2f4f5f6f7f8f9fafdfeff,80:020708090a0e0f11131a1b1d1e1f2123242b2c2d2e2f303234393a3c3e404144454748494e4f505153555657#595b5c5d5e5f6061626364656667686b6c6d6e6f7072737475767778797a7b7c7d,9686578462e29647697c5a0464027bd36f0f964b82a6536298855e90708963b35364864f9c819e93788c97328d:ef42,9e7f6f5e79845f559646622e9a74541594dd4fa365c55c:6561,7f1586516c2f5f8b73876ee47eff5ce6631b5b6a6ee653754e7163a0756562a18f6e4f264ed16ca67eb68bba841d87ba7f57903b95237ba99aa188f8843d6d1b9a867edc59889ebb739b780186829a:6c82,561b541757cb4e709ea653568fc881097792999286ee6ee1851366fc61626f2b80:7e818285888a8d8e8f909192949597999ea3a6a7a8acb0b3b5b6b8b9bbc5c7c8c9cacbcfd0d1d2d3d4d5d8dfe0e2e3e6eef5f7f9fbfeff,81:000103040507080b#0c1517191b1c1d1f202122232425262728292a2b2d2e3033343537393a3b3c3d3f,8c298292832b76f26c135fd983bd732b8305951a6bdb77db94c6536f830251925e3d8c8c8d384e4873ab679a68859176970971646ca177095a9295416bcf7f8e66275bd059b95a9a95:e8f7,4eec84:0c99,6aac76df9530731b68a65b5f772f919a97617cdc8ff78c1c5f257c7379d889c56ccc871c5bc65e4268c977207ef551:954d,52c95a297f05976282d763cf778485d079d26e3a5e9959998511706d6c1162bf76bf654f60af95fd660e879f9e2394ed54:0d7d,8c2c647881:40414243444547494d4e4f525657585b5c5d5e5f6162636466686a6b6c6f727375767778818384858687898b8c8d8e90929394959697999a9e9fa0a1a2a4a5#a7a9abacadaeafb0b1b2b4b5b6b7b8b9bcbdbebfc4c5c7c8c9cbcdcecfd0d1d2d3,647986116a21819c78e864699b5462b9672b83ab58a89ed86cab6f205bde964c8c0b725f67d062c772614ea959c66bcd589366ae5e5552df6155672876ee776672677a4662ff54:ea50,94a090a35a1c7eb36c164e435976801059485357753796be56ca63208111607c95f96dd65462998151855ae980fd59ae9713502a6ce55c3c62df4f60533f817b90066eba852b62c85e7478be64b5637b5ff55a18917f9e1f5c3f634f80425b7d556e95:4a4d,6d8560a867e072de51dd5b8181:d4d5d6d7d8d9dadbdcdddedfe0e1e2e4e5e6e8e9ebeeeff0f1f2f5f6f7f8f9fafdff,82:030708090a0b0e0f111315161718191a1d2024252627292e323a3c3d3f#404142434546484a4c4d4e5051525354555657595b5c5d5e606162636465666769,62e76cde725b626d94ae7ebd81136d53519c5f04597452aa6012597366968650759f632a61e67cef8bfa54e66b279e256bb485d5545550766ca4556a8db4722c5e156015743662cd6392724c5f986e436d3e65006f5876d878d076fc7554522453db4e535e9e65c180:2ad6,629b5486522870ae888d8dd16ce1547880da57f988f48d54966a914d4f696c9b55b776c6783062a870f96f8e5f6d84ec68da787c7bf781a8670b9e4f636778b0576f7812973962:79ab,528874356bd782:6a6b6c6d71757677787b7c808183858687898c90939495969a9b9ea0a2a3a7b2b5b6babbbcbfc0c2c3c5c6c9d0d6d9dadde2e7e8e9eaecedeef0f2f3f5f6f8#fafcfdfeff,83:000a0b0d1012131618191d1e1f20212223242526292a2e3032373b3d,5564813e75b276ae533975de50fb5c418b6c7bc7504f72479a9798d86f0274e27968648777a562fc98918d2b54c180584e52576a82f9840d5e7351ed74f68bc45c4f57616cfc98875a4678349b448feb7c955256625194fa4ec68386846183e984b257d467345703666e6d668c3166dd7011671f6b3a6816621a59bb4e0351c46f0667d26c8f517668cb59476b6775665d0e81109f5065d779:4841,9a918d775c824e5e4f01542f5951780c56686c148fc45f036c:7de3,8bab639083:3e3f41424445484a4b4c4d4e5355565758595d6270717273747576797a7e7f808182838487888a8b8c8d8f909194959697999a9d9fa1a2a3a4a5a6a7acadae#afb5bbbebfc2c3c4c6c8c9cbcdced0d1d2d3d5d7d9dadbdee2e3e4e6e7e8ebeced,60706d3d7275626694:8ec5,53438fc17b7e4edf8c264e7e9ed494:b1b3,524d6f5c90636d458c3458115d4c6b:2049,67aa545b81547f8c589985375f3a62a26a47953965726084686577a74e544fa85de7979864ac7fd85ced4fcf7a8d520783044e14602f7a8394a64fb54eb279e6743452e482b964d279bd5bdd6c8197528f7b6c22503e537f6e0564ce66746c3060c598778bf75e86743c7a7779cb4e1890b174036c4256da914b6cc58d8b533a86c666f28eaf5c489a716e2083:eeeff3f4f5f6f7fafbfcfeff,84:0002050708090a10121314151617191a1b1e1f20212223292a2b2c2d2e2f30323334353637393a3b3e3f404142434445474849#4a4b4c4d4e4f505253545556585d5e5f606264656667686a6e6f70727477797b7c,53d65a369f8b8da353bb570898a76743919b6cc9516875ca62f372ac52:389d,7f3a7094763853749e4a69b7786e96c088d97fa471:36c3,518967d374e458e4651856b78ba9997662707ed560f970ed58ec4e:c1ba,5fcd97e74efb8ba45203598a7eab62544ecd65e5620e833884c98363878d71946eb65bb97ed2519763c967d480898339881551125b7a59828fb14e736c5d516589258f6f962e854a745e95:10f0,6da682e55f3164926d128428816e9cc3585e8d5b4e0953c184:7d7e7f8081838485868a8d8f90919293949596989a9b9d9e9fa0a2a3a4a5a6a7a8a9aaabacadaeb0b1b3b5b6b7bbbcbec0c2c3c5c6c7c8cbcccecfd2d4d5d7#d8d9dadbdcdee1e2e4e7e8e9eaebedeeeff1f2f3f4f5f6f7f8f9fafbfdfe,85:000102,4f1e6563685155d34e2764149a9a626b5ac2745f82726da968ee50e7838e7802674052396c997eb150bb5565715e7b5b665273ca82eb67495c715220717d886b95ea965564c58d6181b355846c5562477f2e58924f2455468d4f664c4e0a5c1a88f368a2634e7a0d70e7828d52fa97f65c1154e890b57ecd59628d4a86c782:0c0d,8d6664445c0461516d89793e8bbe78377533547b4f388eab6df15a207ec5795e6c885ba15a76751a80be614e6e1758f075:1f25,727253477ef385:030405060708090a0b0d0e0f101214151618191b1c1d1e2022232425262728292a2d2e2f303132333435363e3f404142444546474b4c4d4e4f505152535455#57585a5b5c5d5f60616263656667696a6b6c6d6e6f707173757677787c7d7f8081,770176db526980dc57235e08593172ee65bd6e7f8bd75c388671534177f362fe65f64ec098df86805b9e8bc653f277e24f7f5c4e9a7659cb5f0f793a58eb4e1667ff4e8b62ed8a93901d52bf662f55dc566c90024ed54f8d91ca99706c0f5e0260435ba489c68bd56536624b99965b:88ff,6388552e53d77626517d852c67a268b36b8a62928f9353d482126dd1758f4e668d4e5b70719f85af66:91d9,7f7287009ecd9f205c5e672f8ff06811675f620d7ad658855eb665706f3185:82838688898a8b8c8d8e909192939495969798999a9d9e9fa0a1a2a3a5a6a7a9abacadb1b2b3b4b5b6b8babbbcbdbebfc0c2c3c4c5c6c7c8cacbcccdced1d2#d4d6d7d8d9dadbdddedfe0e1e2e3e5e6e7e8eaebecedeeeff0f1f2f3f4f5f6f7f8,60555237800d6454887075295e05681362f4971c53cc723d8c016c3477617a0e542e77ac987a821c8bf47855671470c165af64955636601d79c153f84e1d6b7b80865bfa55e356db4f:3a3c,99725df3677e80386002988290015b8b8b:bcf5,641c825864de55fd82cf91654fd77d20901f7c9f50f358516eaf5bbf8bc980839178849c7b97867d96:8b8f,7ee59ad3788e5c817a57904296a7795f5b59635f7b0b84d168ad55067f2974107d2295016240584c4ed65b835979585485:f9fafcfdfe,86:0001020304060708090a0b0c0d0e0f10121314151718191a1b1c1d1e1f20212223242526282a2b2c2d2e2f3031323334353637393a3b3d3e3f40#4142434445464748494a4b4c525355565758595b5c5d5f6061636465666768696a,736d631e8e:4b0f,80ce82d462ac53f06cf0915e592a60016c70574d644a8d2a762b6ee9575b6a8075f06f6d8c:2d08,57666bef889278b363a253f970ad6c645858642a580268e0819b55107cd650188eba6dcc8d9f70eb638f6d9b6ed47ee68404684390036dd896768ba85957727985e4817e75bc8a8a68af52548e22951163d098988e44557c4f5366ff568f60d56d9552435c4959296dfb586b75:301c,606c82148146631167618fe2773a8d:f334,94c15e165385542c70c386:6d6f7072737475767778838485868788898e8f90919294969798999a9b9e9fa0a1a2a5a6abadaeb2b3b7b8b9bbbcbdbebfc1c2c3c5c8cccdd2d3d5d6d7dadc#dde0e1e2e3e5e6e7e8eaebeceff5f6f7fafbfcfdff,87:010405060b0c0e0f10111416,6c405ef7505c4ead5ead633a8247901a6850916e77b3540c94dc5f647ae5687663457b527edf75db507762955934900f51f879c37a8156fe5f9290146d825c60571f541051546e4d56e263a89893817f8715892a9000541e5c6f81c062:d658,81319e3596409a:6e7c,692d59a562d3553e631654c786d96d3c5a0374e6889c6b6a59168c4c5f2f6e7e73a9987d4e3870f75b8c7897633d665a769660cb5b9b5a494e0781556c6a738b4ea167897f515f8065fa671b5fd859845a0187:191b1d1f20242627282a2b2c2d2f303233353638393a3c3d404142434445464a4b4d4f505152545556585a5b5c5d5e5f6162666768696a6b6c6d6f71727375#7778797a7f8081848687898a8c8e8f90919294959698999a9b9c9d9ea0a1a2a3a4,5dcd5fae537197e68fdd684556f4552f60df4e3a6f4d7ef482c7840e59d44f:1f2a,5c3e7eac672a851a5473754f80c355829b4f4f4d6e2d8c135c096170536b761f6e29868a658795fb7eb9543b7a337d0a95ee55e17fc174ee631d87176da17a9d621165a1536763e16c835deb545c94a84e4c6c618bec5c4b65e0829c68a754:3e34,6b:cb66,4e9463425348821e4f:0dae,575e620a96fe6664726952:ffa1,609f8bef661471996790897f785277fd6670563b54389521727a87:a5a6a7a9aaaeb0b1b2b4b6b7b8b9bbbcbebfc1c2c3c4c5c7c8c9cccdcecfd0d4d5d6d7d8d9dadcdddedfe1e2e3e4e6e7e8e9ebecedeff0f1f2f3f4f5f6f7f8#fafbfcfdff,88:0001020405060708090b0c0d0e0f101112141718191a1c1d1e1f2023,7a00606f5e0c6089819d591560dc718470ef6eaa6c5072806a8488ad5e2d4e605ab3559c94e36d177cfb9699620f7ec6778e867e5323971e8f9666875ce14fa072ed4e0b53a6590f54136380952851484ed99c9c7ea454b88d248854823795f26d8e5f265acc663e966973:b02e,53bf817a99857fa15baa96:7750,7ebf76f853a2957699997bb189446e584e617fd479658be660f354cd4eab98795df76a6150cf54118c618427785d9704524a54ee56a395006d885bb56dc6665388:2425262728292a2b2c2d2e2f30313334353637383a3b3d3e3f414243464748494a4b4e4f505152535556585a5b5c5d5e5f6066676a6d6f717374757678797a#7b7c80838687898a8c8e8f90919394959798999a9b9d9e9fa0a1a3a5a6a7a8a9aa,5c0f5b5d6821809655787b11654869544e9b6b47874e978b534f631f643a90aa659c80c18c10519968b0537887f961c86c:c4fb,8c225c5185aa82af950c6b238f9b65b05f:fbc3,4fe18845661f8165732960fa51745211578b5f6290a2884c91925e78674f602759d351:44f6,80f853086c7996c4718a4f:11ee,7f9e673d55c5950879c088967ee3589f620c9700865a5618987b5f908bb884c4915753d965ed5e8f755c60647d6e5a7f7e:eaed,8f6955a75ba360ac65cb738488:acaeafb0b2b3b4b5b6b8b9babbbdbebfc0c3c4c7c8cacbcccdcfd0d1d3d6d7dadbdcdddee0e1e6e7e9eaebecedeeeff2f5f6f7fafbfdff,89:0001030405060708#090b0c0d0e0f1114151617181c1d1e1f20222324262728292c2d2e2f3132333537,9009766377297eda9774859b5b667a7496ea884052cb718f5faa65ec8be25bfb9a6f5de16b896c5b8b:adaf,900a8fc5538b62bc9e:262d,54404e2b82bd7259869c5d1688596daf96c554d14e9a8bb6710954bd960970df6df976d04e25781487125ca95ef68a00989c960e708e6cbf594463a9773c884d6f148273583071d5538c781a96c155015f6671305bb48c1a9a8c6b83592e9e2f79e76768626c4f6f75a17f8a6d0b96336c274ef075d2517b68376f3e908081705996747689:38393a3b3c3d3e3f40424345464748494a4b4c4d4e4f505152535455565758595a5b5c5d6061626364656768696a6b6c6d6e6f707172737475767778797a7c#7d7e808284858788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1,64475c2790657a918c2359da54ac8200836f898180006930564e8036723791ce51b64e5f987563964e1a53f666f3814b591c6db24e0058f9533b63d694f14f:9d0a,886398905937905779fb4eea80f075916c825b9c59e85f5d69058681501a5df24e5977e34ee5827a6291661390915c794ebf5f7981c69038808475ab4ea688d4610f6bc55fc64e4976ca6ea28b:e3ae,8c0a8bd15f027f:fccc,7ece83:356b,56e06bb797f3963459fb541f94f66deb5bc5996e5c395f15969089:a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c3cdd3d4d5d7d8d9dbdddfe0e1e2e4e7e8e9eaecedeef0f1f2f4f5f6f7f8f9fa#fbfcfdfeff,8a:01020304050608090a0b0c0d0e0f101112131415161718191a1b1c1d,537082f16a315a749e705e947f2883b984:2425,836787478fce8d6276c85f719896786c662054df62e54f6381c375c85eb896cd8e0a86f9548f6cf36d8c6c38607f52c775285e7d4f1860a05fe75c24753190ae94c072b96cb96e389149670953:cbf3,4f5191c98bf153c85e7c8fc26de44e8e76c26986865e611a82064f:59de,903e9c7c61096e:1d14,96854e885a3196e84e0e5c7f79b95b878bed7fbd738957df828b90c15401904755bb5cea5fa161086b3272f180b28a:891e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3f4041424344454647494a4b4c4d4e4f505152535455565758595a5b5c5d5e#5f606162636465666768696a6b6c6d6e6f7071727374757677787a7b7c7d7e7f80,6d745bd388d598848c6b9a6d9e336e0a51:a443,57a38881539f63f48f9556ed54585706733f6e907f188fdc82d1613f6028966266f07ea68d:8ac3,94a55cb37ca4670860a6960580184e9190e75300966851418fd08574915d665597f55b55531d78386742683d54c9707e5bb08f7d518d572854b1651266828d:5e43,810f846c906d7cdf51ff85fb67a365e96fa186a48e81566a90207682707671e58d2362e952196cfd8d3c600e589e618e66fe8d60624e55b36e23672d8f678a:81828384858687888b8c8d8e8f9091929495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2#c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3,94e195f87728680569a8548b4e4d70b88bc86458658b5b857a84503a5be877bb6be18a797c986cbe76cf65a98f975d2d5c5586386808536062187ad96e5b7efd6a1f7ae05f706f335f20638c6da867564e085e108d264ed780c07634969c62db662d627e6cbc8d7571677f695146808753ec906e629854f286f08f998005951785178fd96d5973cd659f771f7504782781fb8d1e94884fa6679575b98bca9707632f9547963584b8632377415f8172f04e896014657462ef6b63653f8a:e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8b:0001020304050608090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223#24252728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445,5e2775c790d18bc1829d679d652f5431871877e580a281026c414e4b7ec7804c76f4690d6b966267503c4f84574063076b628dbe53ea65e87eb85fd763:1ab7,81:f3f4,7f6e5e1c5cd95236667a79e97a1a8d28709975d46ede6cbb7a924e2d76c55fe0949f88777ec879cd80bf91cd4ef24f17821f54685dde6d328bcc7ca58f7480985e1a549276b15b99663c9aa473e0682a86db6731732a8b:f8db,90107af970db716e62c477a956314e3b845767f152a986c08d2e94f87b518b:464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656768696a6b6d6e6f707172737475767778797a7b7c7d7e7f80818283848586#8788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9facb1bbc7d0ea,8c:091e,4f4f6ce8795d9a7b6293722a62fd4e1378168f6c64b08d5a7bc668695e8488c55986649e58ee72b6690e95258ffd8d5857607f008c0651c6634962d95353684c74228301914c55447740707c6d4a517954a88d4459ff6ecb6dc45b5c7d2b4ed47c7d6ed35b5081ea6e0d5b579b0368d58e2a5b977efc603b7eb590b98d70594f63cd79df8db3535265cf79568bc5963b7ec494bb7e825634918967007f6a5c0a907566285de64f5067de505a4f5c57505e:a7#3$,8c:38393a3b3c3d3e3f4042434445484a4b4d4e4f5051525354565758595b5c5d5e5f60636465666768696c6d6e6f707172747576777b7c7d7e7f808183848687#888b8d8e8f90919293959697999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacad,4e:8d0c,51404e105eff53454e:15981e,9b325b6c56694e2879ba4e3f53154e47592d723b536e6c1056df80e499976bd3777e9f174e:369f,9f104e:5c6993,82885b5b556c560f4ec453:8d9da3a5ae,97658d5d53:1af5262e3e,8d5c53:6663,52:02080e2d333f404c5e615c,84af52:7d82819093,51827f544e:bbc3c9c2e8e1ebde,4f1b4ef34f:2264,4ef54f:2527092b5e67,65384f:5a5d,8c:aeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebec#edeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8d:000102030405060708090a0b0c0d,4f:5f57323d76749189838f7e7baa7cac94e6e8eac5dae3dcd1dff8,50:294c,4ff350:2c0f2e2d,4ffe50:1c0c25287e4355484e6c7ba5a7a9bad6,510650:edece6ee,51:070b,4edd6c3d4f:5865ce,9fa06c467c74516e5dfd9ec999985181591452f9530d8a07531051eb591951554ea051564eb388:6ea4,4eb5811488d279805b3488037fb851:abb1bdbc,8d:0e0f101112131415161718191a1b1c205152575f6568696a6c6e6f717278797a7b7c7d7e7f808283868788898c8d8e8f90929395969798999a9b9c9d9ea0a1#a2a4a5a6a7a8a9aaabacadaeafb0b2b6b7b9bbbdc0c1c2c5c7c8c9cacdd0d2d3d4,51:c796a2a5,8b:a0a6a7aab4b5b7c2c3cbcfced2d3d4d6d8d9dcdfe0e4e8e9eef0f3f6f9fcff,8c:000204070c0f1112141516191b181d1f202125272a2b2e2f32333536,53:697a,96:1d2221312a3d3c4249545f676c7274888d97b0,90:979b9d99aca1b4b3b6ba,8d:d5d8d9dce0e1e2e5e6e7e9edeef0f1f2f4f6fcfeff,8e:00010203040607080b0d0e1011121315161718191a1b1c202124252627282b2d303233343637383b3c3e#3f4345464c4d4e4f505354555657585a5b5c5d5e5f60616263646567686a6b6e71,90:b8b0cfc5bed0c4c7d3e6e2dcd7dbebeffe,91:04221e23312f394346,520d594252:a2acadbe,54ff52:d0d6f0,53df71ee77cd5ef451:f5fc,9b2f53b65f01755a5def57:4ca9a1,58:7ebcc5d1,57:292c2a33392e2f5c3b4269856b867c7b686d7673ada48cb2cfa7b493a0d5d8dad9d2b8f4eff8e4dd,8e:73757778797a7b7d7e808283848688898a8b8c8d8e91929395969798999a9b9d9fa0a1a2a3a4a5a6a7a8a9aaadaeb0b1b3b4b5b6b7b8b9bbbcbdbebfc0c1c2#c3c4c5c6c7c8c9cacbcccdcfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4,58:0b0d,57:fded,58:001e194420656c81899a80,99a89f1961ff82:797d7f8f8aa8848e919799abb8beb0c8cae398b7aecbccc1a9b4a1aa9fc4cea4e1,830982:f7e4,83:0f07,82:dcf4d2d8,830c82:fbd3,83:111a061415,82:e0d5,83:1c515b5c08923c34319b5e2f4f47435f4017602d3a336665,8e:e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,8f:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223#2425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041424344,83:681b696c6a6d6eb078b3b4a0aa939c857cb6a97db87b989ea8babcc1,840183:e5d8,580784:180b,83:ddfdd6,84:1c381106,83:d4df,84:0f03,83:f8f9eac5c0,842683:f0e1,84:5c515a597387887a89783c4669768c8e316dc1cdd0e6bdd3cabfbae0a1b9b497e5e3,850c750d853884f085:391f3a,8f:45464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656a808c929da0a1a2a4a5a6a7aaacadaeafb2b3b4b5b7b8babbbcbfc0c3c6#c9cacbcccdcfd2d6d7dae0e1e3e7eceff1f2f4f5f6fafbfcfeff,90:07080c0e131518,85:563b,84:fffc,85:594868645e7a,77a285:43727ba4a8878f79ae9c85b9b7b0d3c1dcff,86:270529163c,5efe5f0859:3c41,803759:555a58,530f5c:22252c34,62:4c6a9fbbcadad7ee,632262f663:394b43adf6717a8eb46dac8a69aebcf2f8e0ffc4dece,645263:c6be,64:45410b1b200c26215e846d96,90:191c2324252728292a2b2c303132333437393a3d3f4043454648494a4b4c4e545556595a5c5d5e5f6061646667696a6b6c6f70717273767778797a7b7c7e81#84858687898a8c8d8e8f90929496989a9c9e9fa0a4a5a7a8a9abadb2b7bcbdbfc0,64:7ab7b899bac0d0d7e4e2,65:09252e,5f:0bd2,75195f1153:5ff1fde9e8fb,54:1216064b5253545643215759233282947771649a9b8476669dd0adc2b4d2a7a6d3d472a3d5bbbfccd9dadca9aaa4ddcfde,551b54e7552054fd551454f355:22230f11272a678fb5496d41553f503c,90:c2c3c6c8c9cbcccdd2d4d5d6d8d9dadedfe0e3e4e5e9eaeceef0f1f2f3f5f6f7f9fafbfcff,91:00010305060708090a0b0c0d0e0f1011121314151617181a1b1c#1d1f20212425262728292a2b2c2d2e30323334353637383a3b3c3d3e3f40414244,55:375675767733305c8bd283b1b988819f7ed6917bdfbdbe9499eaf7c9,561f55:d1ebecd4e6ddc4efe5f2f3cccde8f5e4,8f9456:1e080c012423,55fe56:00272d5839572c4d62595c4c548664716b7b7c8593afd4d7dde1f5ebf9ff,57:040a091c,5e:0f191411313b3c,91:454748515354555658595b5c5f606667686b6d737a7b7c808182838486888a8e8f939495969798999c9d9e9fa0a1a4a5a6a7a8a9abacb0b1b2b3b6b7b8b9bb#bcbdbebfc0c1c2c3c4c5c6c8cbd0d2d3d4d5d6d7d8d9dadbdddedfe0e1e2e3e4e5,5e:3744545b5e61,5c:8c7a8d9096889899919a9cb5a2bdacabb1a3c1b7c4d2e4cbe5,5d:020327262e241e061b583e343d6c5b6f5d6b4b4a697482999d,8c735d:b7c5,5f:73778287898c95999ca8adb5bc,88625f6172:adb0b4b7b8c3c1cecdd2e8efe9f2f4f7,730172f3730372fa91:e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,92:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324#25262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445,72fb73:1713210a1e1d152239252c3831504d57606c6f7e,821b592598e759:2402,99:636768696a6b6c74777d8084878a8d9091939495,5e:80918b96a5a0b9b5beb3,8d535e:d2d1dbe8ea,81ba5f:c4c9d6cf,60035fee60045f:e1e4fe,60:0506,5f:eaedf8,60:1935261b0f0d292b0a3f2178797b7a42,92:464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727375767778797a7b7c7d7e7f808182838485#868788898a8b8c8d8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7,60:6a7d969aad9d83928c9becbbb1ddd8c6dab4,61:20261523,60f461:000e2b4a75ac94a7b7d4f5,5fdd96b395:e9ebf1f3f5f6fcfe,96:030406080a0b0c0d0f12151617191a,4e2c723f62156c:35545c4aa38590948c6869747686a9d0d4adf7f8f1d7b2e0d6faebeeb1d3effe,92:a8a9aaabacadafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8#e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,93:00010203040506070809,6d:39270c43480704190e2b4d2e351a4f525433916f9ea05e93945c607c63,6e1a6d:c7c5de,6e0e6d:bfe0,6e116d:e6ddd9,6e166dab6e0c6dae6e:2b6e4e6bb25f865354322544dfb198e0,6f2d6e:e2a5a7bdbbb7d7b4cf8fc29f,6f:6246472415,6ef96f:2f364b742a0929898d8c78727c7ad1,93:0a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3f40414243444546474849#4a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696b,6f:c9a7b9b6c2e1eedee0ef,70:1a231b39354f5e,5b:80849593a5b8,752f9a9e64345b:e4ee,89305bf08e478b078f:b6d3d5e5eee4e9e6f3e8,90:05040b26110d162135362d2f445152506858625b,66b990:747d8288838b,5f:50575658,5c3b54ab5c:5059,5b715c:6366,7fbc5f:2a292d,82745f3c9b3b5c6e59:81838da9aaa3,93:6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaab#acadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cbcccd,59:97caab9ea4d2b2afd7be,5a:0506,59dd5a0859:e3d8f9,5a:0c09323411231340674a553c6275,80ec5a:aa9b777abeebb2d2d4b8e0e3f1d6e6d8dc,5b:091716323740,5c:151c,5b:5a6573515362,9a:7577787a7f7d808185888a90929396989b9c9d9fa0a2a3a5a7,7e:9fa1a3a5a8a9,93:cecfd0d1d2d3d4d5d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,94:000102030405060708090a0b0c0d#0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e,7e:adb0bec0c1c2c9cbccd0d4d7dbe0e1e8ebeeeff1f2,7f0d7e:f6fafbfe,7f:01020307080b0c0f111217191c1b1f212223242526272a2b2c2d2f3031323335,5e7a757f5ddb753e909573:8e91aea29fcfc2d1b7b3c0c9c8e5d9,987c740a73:e9e7debaf2,74:0f2a5b262528302e2c,94:2f303132333435363738393a3b3c3d3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6c6d6e6f#707172737475767778797a7b7c7d7e7f8081828384919698c7cfd3d4dae6fb,95:1c20,74:1b1a415c575559776d7e9c8e8081878b9ea8a990a7d2ba,97:eaebec,67:4c535e4869a5876a7398a775a89ead8b777cf0,680967d8680a67:e9b0,680c67:d9b5dab3dd,680067:c3b8e2,680e67:c1fd,68:323360614e624464831d55664167403e4a4929b58f7477936bc2,696e68fc69:1f20,68f995:27333d43484b555a606e74757778797a7b7c7d7e808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aa#abacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacb,692468f069:0b0157,68e369:10713960425d846b80987834cc8788ce896663799ba7bbabadd4b1c1cadf95e08dff,6a2f69ed6a:171865,69f26a:443ea0505b358e793d28587c9190a997ab,73:3752,6b:8182878492938d9a9ba1aa,8f:6b6d71727375767877797a7c7e818284878b,95:cccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7ecff,96:0713181b1e20232425262728292b2c2d2f303738393a3e41434a4e4f5152535657#58595a5c5d5e606365666b6d6e6f70717378797a7b7c7d7e7f808182838487898a,8f:8d8e8f989a,8ece62:0b171b1f222125242c,81e774:eff4ff,75:0f1113,65:34eeeff0,66:0a19,677266:031500,708566:f71d34313635,800666:5f54414f56615777848ca79dbedbdce6e9,8d:3233363b3d4045464849474d5559,89:c7cacbcccecfd0d1,72:6e9f5d666f7e7f848b8d8f92,63:0832b0,96:8c8e91929395969a9b9d9e9fa0a1a2a3a4a5a6a8a9aaabacadaeafb1b2b4b5b7b8babbbfc2c3c8cacbd0d1d3d4d6d7d8d9dadbdcdddedfe1e2e3e4e5e6e7eb#ecedeef0f1f2f4f5f8fafbfcfdff,97:0203050a0b0c10111214151718191a1b1d1f20,64:3fd8,80046b:eaf3fdf5f9,6c:0507060d1518191a2129242a32,65:35556b,72:4d525630,8662521680:9f9c93bc,670a80:bdb1abadb4b7e7e8e9eadbc2c4d9cdd7,671080:ddebf1f4ed,81:0d0e,80:f2fc,671581128c5a81:361e2c1832484c5374595a7160697c7d6d67,584d5ab581:888291,6ed581:a3aacc,672681:cabb,97:2122232425262728292b2c2e2f3133343536373a3b3c3d3f404142434445464748494a4b4c4d4e4f5051545557585a5c5d5f63646667686a6b6c6d6e6f7071#72757778797a7b7d7e7f8081828384868788898a8c8e8f9093959697999a9b9c9d,81:c1a6,6b:243739434659,98:d1d2d3d5d9da,6bb35f406bc289f365909f5165:93bcc6c4c3ccced2d6,70:809c969dbbc0b7abb1e8ca,71:1013162f31735c6845724a787a98b3b5a8a0e0d4e7f9,72:1d28,706c71:1866b9,62:3e3d434849,79:3b4046495b5c535a6257606f677a858a9aa7b3,5f:d1d0,97:9e9fa1a2a4a5a6a7a8a9aaacaeb0b1b3b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3#e4e5e8eeeff0f1f2f4f7f8f9fafbfcfdfeff,98:000102030405060708090a0b0c0d0e,60:3c5d5a67415963ab,61:060d5da99dcbd1,620680:807f,6c:93f6,6dfc77:f6f8,78:0009171811,65ab78:2d1c1d393a3b1f3c252c23294e6d56572650474c6a9b939a879ca1a3b2b9a5d4d9c9ecf2,790578f479:13241e34,9f9b9e:f9fbfc,76f177:040d,76f977:07081a22192d263538505147435a68,98:0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d#4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e,77:62657f8d7d808c919fa0b0b5bd,75:3a404e4b485b727983,7f:58615f,8a487f:68747179817e,76:cde5,883294:8586878b8a8c8d8f909497959a9b9ca3a4abaaadacafb0b2b4b6b7b8b9babcbdbfc4c8c9cacbcccdced0d1d2d5d6d7d9d8dbdedfe0e2e4e5e7e8ea,98:6f70717273748b8e929599a3a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcfd0d4d6d7dbdcdde0e1e2e3e4#e5e6e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,99:0001020304050607,94:e9ebeeeff3f4f5f7f9fcfdff,95:03020607090a0d0e0f1213141516181b1d1e1f222a2b292c3132343637383c3e3f4235444546494c4e4f525354565758595b5e5f5d61626465666768696a6b6c6f7172733a,77:e7ec,96c979:d5ede3eb,7a065d477a:03021e14,99:08090a0b0c0e0f1112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2f303132333435363738393a3b3c3d3e3f40414243444546474849#4a4b4c4d4e4f50515253565758595a5b5c5d5e5f60616264667378797b7e828389,7a:393751,9ecf99a57a7076:888e9399a4,74:dee0,752c9e:202228292a2b2c3231363837393a3e414244464748494b4c4e5155575a5b5c5e63666768696a6b6c716d73,75:929496a09daca3b3b4b8c4b1b0c3c2d6cde3e8e6e4ebe7,760375:f1fcff,76:1000050c170a25181519,99:8c8e9a9b9c9d9e9fa0a1a2a3a4a6a7a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8#d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9,76:1b3c2220402d303f35433e334d5e545c566b6f,7fca7a:e6787980868895a6a0aca8adb3,88:6469727d7f82a2c6b7bcc9e2cee3e5f1,891a88:fce8fef0,89:2119131b0a342b3641667b,758b80e576:b2b4,77dc80:1214161c20222526272928310b3543464d526971,898398:788083,99:fafbfcfdfeff,9a:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738#393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f50515253545556575859,98:898c8d8f949a9b9e9fa1a2a5a6,86:4d546c6e7f7a7c7ba88d8bac9da7a3aa93a9b6c4b5ceb0bab1afc9cfb4e9f1f2edf3d0,871386:def4dfd8d1,87:0307,86f887:080a0d09233b1e252e1a3e48343129373f82227d7e7b60704c6e8b53637c64596593afa8d2,9a:5a5b5c5d5e5f606162636465666768696a6b7283898d8e949599a6a9aaabacadaeafb2b3b4b5b9bbbdbebfc3c4c6c7c8c9cacdcecfd0d2d4d5d6d7d9dadbdc#dddee0e2e3e4e5e7e8e9eaeceef0f1f2f3f4f5f6f7f8fafcfdfeff,9b:000102040506,87:c68885ad9783abe5acb5b3cbd3bdd1c0cadbeae0ee,88:1613,87fe88:0a1b21393c,7f:36424445,82107a:fafd,7b:080304150a2b0f47382a192e31202524333e1e585a45754c5d606e7b62727190a6a7b8ac9da885aa9ca2abb4d1c1ccdddae5e6ea,7c0c7b:fefc,7c:0f160b,9b:07090a0b0c0d0e1011121415161718191a1b1c1d1e2021222425262728292a2b2c2d2e3031333435363738393a3d3e3f40464a4b4c4e50525355565758595a#5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b,7c:1f2a26384140,81fe82:010204,81ec884482:2122232d2f282b383b33343e44494b4f5a5f68,88:7e8588d8df,895e7f:9d9fa7afb0b2,7c7c65497c:919d9c9ea2b2bcbdc1c7cccdc8c5d7e8,826e66a87f:bfced5e5e1e6e9eef3,7cf87d:77a6ae,7e:479b,9e:b8b4,8d:73849491b1676d,8c:4749,91:4a504e4f64,9b:7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9ba#bbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadb,91:626170696f7d7e7274798c85908d91a2a3aaadaeafb5b4ba,8c559e7e8d:b8eb,8e:055969,8d:b5bfbcbac4d6d7dadececfdbc6ecf7f8e3f9fbe4,8e098dfd8e:141d1f2c2e232f3a4039353d3149414251524a70767c6f74858f94909c9e,8c:78828a859894,659b89:d6dedadc,9b:dcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9c:000102030405060708090a0b0c0d0e0f101112131415161718191a#1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b,89:e5ebef,8a3e8b26975396:e9f3ef,97:0601080f0e2a2d303e,9f:808385868788898a8c,9efe9f:0b0d,96:b9bcbdced2,77bf96e092:8eaec8,93:3e6aca8f,94:3e6b,9c:7f8285868788,7a239c:8b8e90919294959a9b9e9fa0a1a2a3a5a6a7a8a9abadaeb0b1b2b3b4b5b6b7babbbcbdc4c5c6c7cacb3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a#7b7d7e808384898a8c8f93969798999daaacafb9bebfc0c1c2c8c9d1d2dadbe0e1cccdcecfd0d3d4d5d7d8d9dcdddfe2,97:7c85919294afaba3b2b4,9a:b1b0b7,9e589a:b6babcc1c0c5c2cbccd1,9b:45434749484d51,98e899:0d2e5554,9a:dfe1e6efebfbedf9,9b:080f131f23,9e:bdbe,7e3b9e:8287888b92,93d69e:9d9fdbdcdde0dfe2e9e7e5eaef,9f:222c2f39373d3e44,9c:e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9d:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021#22232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142#92$434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081#82838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2#92$a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1#e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff,9e:000102#92$030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e24272e30343b3c404d5052535456595d5f606162656e6f727475767778797a7b7c7d80#8183848586898a8c8d8e8f90919495969798999a9b9c9ea0a1a2a3a4a5a7a8a9aa#92$abacadaeafb0b1b2b3b5b6b7b9babcbfc0c1c2c3c5c6c7c8cacbccd0d2d3d5d6d7d9dadee1e3e4e6e8ebecedeef0f1f2f3f4f5f6f7f8fafdff,9f:000102030405#060708090a0c0f1112141516181a1b1c1d1e1f21232425262728292a2b2d2e3031#92$3233343536383a3c3f4041424345464748494a4b4c4d4e4f52535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778#797a7b7c7d7e81828d8e8f9091929394959697989c9d9ea1a2a3a4a5,f9:2c7995e7f1#92$,fa:0c0d0e0f111314181f20212324272829,e8:15161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40414243#4445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364");
|
|
114
111
|
let index = 0;
|
|
115
112
|
this.#data = dataText.match(/..../g);
|
|
116
113
|
for (let i = 0x81; i <= 0xfe; i++) {
|
|
117
114
|
for (let j = 0x40; j <= 0xfe; j++) {
|
|
118
|
-
this.#U2Ghash[this.#data[index++]] =
|
|
115
|
+
this.#U2Ghash[this.#data[index++]] = `%${i.toString(16)}%${j.toString(16)}`.toUpperCase();
|
|
119
116
|
}
|
|
120
117
|
}
|
|
121
|
-
for (
|
|
122
|
-
this.#
|
|
118
|
+
for (const key in this.#U2Ghash) {
|
|
119
|
+
const u2ghashValue = Reflect.get(this.#U2Ghash, key);
|
|
120
|
+
Reflect.set(this.#G2Uhash, u2ghashValue, key);
|
|
123
121
|
}
|
|
124
122
|
}
|
|
125
123
|
handleText(text) {
|
|
126
124
|
text = text
|
|
127
|
-
.replace(/#(\d+)\$/g, function (
|
|
125
|
+
.replace(/#(\d+)\$/g, function (_, b) {
|
|
128
126
|
return Array(+b + 3).join("#");
|
|
129
127
|
})
|
|
130
128
|
.replace(/#/g, "####")
|
|
131
|
-
.replace(/(\w\w):([\w#]+)(?:,|$)/g, function (
|
|
129
|
+
.replace(/(\w\w):([\w#]+)(?:,|$)/g, function (_, hd, dt) {
|
|
132
130
|
return dt.replace(/../g, function (a) {
|
|
133
131
|
if (a != "##") {
|
|
134
132
|
return hd + a;
|
|
@@ -148,8 +146,8 @@ class GBKEncoder {
|
|
|
148
146
|
* @param str
|
|
149
147
|
*/
|
|
150
148
|
encode(str) {
|
|
151
|
-
|
|
152
|
-
return [...str].reduce((result, val
|
|
149
|
+
const that = this;
|
|
150
|
+
return [...str].reduce((result, val) => {
|
|
153
151
|
return result + toGBK(val);
|
|
154
152
|
}, "");
|
|
155
153
|
function toGBK(val) {
|
|
@@ -158,7 +156,7 @@ class GBKEncoder {
|
|
|
158
156
|
const codePoint = val.codePointAt(i);
|
|
159
157
|
const code = String.fromCodePoint(codePoint);
|
|
160
158
|
let key = codePoint.toString(16);
|
|
161
|
-
key.length != 4 && (key =
|
|
159
|
+
key.length != 4 && (key = `000${key}`.match(/....$/)?.[0]);
|
|
162
160
|
/* Add up i by code.length */
|
|
163
161
|
i += code.length - 1;
|
|
164
162
|
/* If code is in ascii range */
|
|
@@ -172,9 +170,9 @@ class GBKEncoder {
|
|
|
172
170
|
continue;
|
|
173
171
|
}
|
|
174
172
|
/*
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
173
|
+
If 2 or more char combines to one visible code,
|
|
174
|
+
or just this code is not in GBK
|
|
175
|
+
*/
|
|
178
176
|
result += toGBK(`&#${codePoint};`);
|
|
179
177
|
}
|
|
180
178
|
return result;
|
|
@@ -185,18 +183,18 @@ class GBKEncoder {
|
|
|
185
183
|
* @param str
|
|
186
184
|
*/
|
|
187
185
|
decode(str) {
|
|
188
|
-
|
|
189
|
-
|
|
186
|
+
const GBKMatcher = /%[0-9A-F]{2}%[0-9A-F]{2}/;
|
|
187
|
+
const UTFMatcher = /%[0-9A-F]{2}/;
|
|
190
188
|
// let gbk = true;
|
|
191
189
|
let utf = true;
|
|
192
190
|
const that = this;
|
|
193
191
|
while (utf) {
|
|
194
|
-
|
|
195
|
-
|
|
192
|
+
const gbkMatch = str.match(GBKMatcher);
|
|
193
|
+
const utfMatch = str.match(UTFMatcher);
|
|
196
194
|
// gbk = Boolean(gbkMatch);
|
|
197
195
|
utf = Boolean(utfMatch);
|
|
198
196
|
if (gbkMatch && gbkMatch in that.#G2Uhash) {
|
|
199
|
-
str = str.replace(gbkMatch, String.fromCharCode(
|
|
197
|
+
str = str.replace(gbkMatch, String.fromCharCode(`0x${that.#G2Uhash[gbkMatch]}`));
|
|
200
198
|
}
|
|
201
199
|
else {
|
|
202
200
|
str = str.replace(utfMatch, decodeURIComponent(utfMatch));
|
|
@@ -210,7 +208,7 @@ const TryCatch = function (...args) {
|
|
|
210
208
|
/* 定义变量和函数 */
|
|
211
209
|
let callbackFunction = null;
|
|
212
210
|
let context = null;
|
|
213
|
-
let handleError = (
|
|
211
|
+
let handleError = () => { };
|
|
214
212
|
let defaultDetails = {
|
|
215
213
|
log: true,
|
|
216
214
|
};
|
|
@@ -242,7 +240,7 @@ const TryCatch = function (...args) {
|
|
|
242
240
|
run(callback, __context__) {
|
|
243
241
|
callbackFunction = callback;
|
|
244
242
|
context = __context__ || this;
|
|
245
|
-
|
|
243
|
+
const result = executeTryCatch(callbackFunction, handleError, context);
|
|
246
244
|
return result !== void 0 ? result : TryCatchCore;
|
|
247
245
|
},
|
|
248
246
|
};
|
|
@@ -266,8 +264,8 @@ const TryCatch = function (...args) {
|
|
|
266
264
|
catch (error) {
|
|
267
265
|
if (defaultDetails.log) {
|
|
268
266
|
callback = callback;
|
|
269
|
-
console.log(`%c ${callback?.name ? callback?.name : callback
|
|
270
|
-
console.log(`%c
|
|
267
|
+
console.log(`%c ${callback?.name ? callback?.name : `${callback}`} `, "color: #f20000");
|
|
268
|
+
console.log(`%c ${error}`, "color: #f20000");
|
|
271
269
|
console.trace(callback);
|
|
272
270
|
}
|
|
273
271
|
if (handleErrorFunc) {
|
|
@@ -286,9 +284,9 @@ const TryCatch = function (...args) {
|
|
|
286
284
|
|
|
287
285
|
class CommonUtil {
|
|
288
286
|
assign(target = {}, source = {}, isAdd = false) {
|
|
289
|
-
|
|
287
|
+
const UtilsContext = this;
|
|
290
288
|
if (Array.isArray(source)) {
|
|
291
|
-
|
|
289
|
+
const canTraverse = source.filter((item) => {
|
|
292
290
|
return typeof item === "object";
|
|
293
291
|
});
|
|
294
292
|
if (!canTraverse.length) {
|
|
@@ -304,34 +302,34 @@ class CommonUtil {
|
|
|
304
302
|
if (isAdd) {
|
|
305
303
|
for (const sourceKeyName in source) {
|
|
306
304
|
const targetKeyName = sourceKeyName;
|
|
307
|
-
|
|
308
|
-
|
|
305
|
+
const targetValue = Reflect.get(target, targetKeyName);
|
|
306
|
+
const sourceValue = Reflect.get(source, sourceKeyName);
|
|
309
307
|
if (typeof sourceValue === "object" &&
|
|
310
308
|
sourceValue != null &&
|
|
311
309
|
sourceKeyName in target &&
|
|
312
310
|
!UtilsContext.isDOM(sourceValue)) {
|
|
313
311
|
/* 源端的值是object类型,且不是元素节点 */
|
|
314
|
-
target
|
|
312
|
+
Reflect.set(target, sourceKeyName, UtilsContext.assign(targetValue, sourceValue, isAdd));
|
|
315
313
|
continue;
|
|
316
314
|
}
|
|
317
|
-
target
|
|
315
|
+
Reflect.set(target, sourceKeyName, sourceValue);
|
|
318
316
|
}
|
|
319
317
|
}
|
|
320
318
|
else {
|
|
321
319
|
for (const targetKeyName in target) {
|
|
322
320
|
if (targetKeyName in source) {
|
|
323
|
-
|
|
324
|
-
|
|
321
|
+
const targetValue = Reflect.get(target, targetKeyName);
|
|
322
|
+
const sourceValue = Reflect.get(source, targetKeyName);
|
|
325
323
|
if (typeof sourceValue === "object" &&
|
|
326
324
|
sourceValue != null &&
|
|
327
325
|
!UtilsContext.isDOM(sourceValue) &&
|
|
328
326
|
Object.keys(sourceValue).length) {
|
|
329
327
|
/* 源端的值是object类型,且不是元素节点 */
|
|
330
|
-
target
|
|
328
|
+
Reflect.set(target, targetKeyName, UtilsContext.assign(targetValue, sourceValue, isAdd));
|
|
331
329
|
continue;
|
|
332
330
|
}
|
|
333
331
|
/* 直接赋值 */
|
|
334
|
-
target
|
|
332
|
+
Reflect.set(target, targetKeyName, sourceValue);
|
|
335
333
|
}
|
|
336
334
|
}
|
|
337
335
|
}
|
|
@@ -339,7 +337,7 @@ class CommonUtil {
|
|
|
339
337
|
}
|
|
340
338
|
isNull(...args) {
|
|
341
339
|
let result = true;
|
|
342
|
-
|
|
340
|
+
const checkList = [...args];
|
|
343
341
|
for (const objItem of checkList) {
|
|
344
342
|
let itemResult = false;
|
|
345
343
|
if (objItem === null || objItem === undefined) {
|
|
@@ -365,11 +363,12 @@ class CommonUtil {
|
|
|
365
363
|
case "boolean":
|
|
366
364
|
itemResult = !objItem;
|
|
367
365
|
break;
|
|
368
|
-
case "function":
|
|
369
|
-
|
|
366
|
+
case "function": {
|
|
367
|
+
const funcStr = objItem.toString().replace(/\s/g, "");
|
|
370
368
|
/* 排除()=>{}、(xxx="")=>{}、function(){}、function(xxx=""){} */
|
|
371
369
|
itemResult = Boolean(funcStr.match(/^\(.*?\)=>\{\}$|^function.*?\(.*?\)\{\}$/));
|
|
372
370
|
break;
|
|
371
|
+
}
|
|
373
372
|
}
|
|
374
373
|
}
|
|
375
374
|
result = result && itemResult;
|
|
@@ -390,18 +389,23 @@ class CommonUtil {
|
|
|
390
389
|
return target instanceof Node;
|
|
391
390
|
}
|
|
392
391
|
isNotNull(...args) {
|
|
393
|
-
|
|
392
|
+
const UtilsContext = this;
|
|
394
393
|
return !UtilsContext.isNull.apply(this, args);
|
|
395
394
|
}
|
|
396
395
|
deepClone(obj) {
|
|
397
|
-
|
|
396
|
+
const UtilsContext = this;
|
|
398
397
|
if (obj === void 0)
|
|
399
398
|
return void 0;
|
|
400
399
|
if (obj === null)
|
|
401
400
|
return null;
|
|
402
|
-
|
|
401
|
+
const clone = obj instanceof Array ? [] : {};
|
|
403
402
|
for (const [key, value] of Object.entries(obj)) {
|
|
404
|
-
|
|
403
|
+
if (typeof value === "object") {
|
|
404
|
+
Reflect.set(clone, key, UtilsContext.deepClone(value));
|
|
405
|
+
}
|
|
406
|
+
else {
|
|
407
|
+
Reflect.set(clone, key, value);
|
|
408
|
+
}
|
|
405
409
|
}
|
|
406
410
|
return clone;
|
|
407
411
|
}
|
|
@@ -428,11 +432,11 @@ class CommonUtil {
|
|
|
428
432
|
}
|
|
429
433
|
TryCatch()
|
|
430
434
|
.config({ log: false })
|
|
431
|
-
.error((
|
|
435
|
+
.error(() => {
|
|
432
436
|
TryCatch()
|
|
433
437
|
.error(() => {
|
|
434
438
|
try {
|
|
435
|
-
result = new Function(
|
|
439
|
+
result = new Function(`return ${data}`)();
|
|
436
440
|
}
|
|
437
441
|
catch (error2) {
|
|
438
442
|
if (typeof errorCallBack === "function") {
|
|
@@ -443,14 +447,14 @@ class CommonUtil {
|
|
|
443
447
|
.run(() => {
|
|
444
448
|
if (data &&
|
|
445
449
|
/^[\],:{}\s]*$/.test(data
|
|
446
|
-
.replace(/\\(?:["
|
|
447
|
-
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][
|
|
450
|
+
.replace(/\\(?:["\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@")
|
|
451
|
+
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+-]?\d+)?/g, "]")
|
|
448
452
|
.replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) {
|
|
449
|
-
result = new Function(
|
|
453
|
+
result = new Function(`return ${data}`)();
|
|
450
454
|
}
|
|
451
455
|
else {
|
|
452
456
|
if (typeof errorCallBack === "function") {
|
|
453
|
-
errorCallBack(new Error("target is not
|
|
457
|
+
errorCallBack(new Error("target is not JSON object"));
|
|
454
458
|
}
|
|
455
459
|
}
|
|
456
460
|
});
|
|
@@ -462,7 +466,7 @@ class CommonUtil {
|
|
|
462
466
|
return result;
|
|
463
467
|
}
|
|
464
468
|
}
|
|
465
|
-
|
|
469
|
+
const commonUtil = new CommonUtil();
|
|
466
470
|
|
|
467
471
|
class UtilsGMCookie {
|
|
468
472
|
windowApi = {
|
|
@@ -491,14 +495,14 @@ class UtilsGMCookie {
|
|
|
491
495
|
if (typeof cookieName !== "string") {
|
|
492
496
|
throw new TypeError("Utils.GMCookie.get 参数cookieName 必须为字符串");
|
|
493
497
|
}
|
|
494
|
-
|
|
498
|
+
const cookies = this.getCookiesList();
|
|
495
499
|
let findValue = void 0;
|
|
496
500
|
for (const cookieItem of cookies) {
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
501
|
+
const item = cookieItem.trim();
|
|
502
|
+
const itemSplit = item.split("=");
|
|
503
|
+
const itemName = itemSplit[0];
|
|
500
504
|
itemSplit.splice(0, 1);
|
|
501
|
-
|
|
505
|
+
const itemValue = decodeURIComponent(itemSplit.join(""));
|
|
502
506
|
if (itemName === cookieName) {
|
|
503
507
|
findValue = {
|
|
504
508
|
domain: this.windowApi.window.location.hostname,
|
|
@@ -528,7 +532,7 @@ class UtilsGMCookie {
|
|
|
528
532
|
if (option == null) {
|
|
529
533
|
throw new Error("Utils.GMCookie.list 参数不能为空");
|
|
530
534
|
}
|
|
531
|
-
|
|
535
|
+
const resultData = [];
|
|
532
536
|
try {
|
|
533
537
|
let defaultOption = {
|
|
534
538
|
url: this.windowApi.window.location.href,
|
|
@@ -537,16 +541,16 @@ class UtilsGMCookie {
|
|
|
537
541
|
path: "/",
|
|
538
542
|
};
|
|
539
543
|
defaultOption = commonUtil.assign(defaultOption, option);
|
|
540
|
-
|
|
544
|
+
const cookies = this.getCookiesList();
|
|
541
545
|
cookies.forEach((item) => {
|
|
542
546
|
item = item.trim();
|
|
543
|
-
|
|
544
|
-
|
|
547
|
+
const itemSplit = item.split("=");
|
|
548
|
+
const itemName = itemSplit[0];
|
|
545
549
|
itemSplit.splice(0, 1);
|
|
546
|
-
|
|
547
|
-
|
|
550
|
+
const itemValue = decodeURIComponent(itemSplit.join(""));
|
|
551
|
+
const nameRegexp = defaultOption.name instanceof RegExp
|
|
548
552
|
? defaultOption.name
|
|
549
|
-
: new RegExp(
|
|
553
|
+
: new RegExp(`^${defaultOption.name}`, "g");
|
|
550
554
|
if (itemName.match(nameRegexp)) {
|
|
551
555
|
resultData.push({
|
|
552
556
|
domain: this.windowApi.window.location.hostname,
|
|
@@ -580,7 +584,7 @@ class UtilsGMCookie {
|
|
|
580
584
|
if (option == null) {
|
|
581
585
|
throw new Error("Utils.GMCookie.list 参数不能为空");
|
|
582
586
|
}
|
|
583
|
-
|
|
587
|
+
const resultData = [];
|
|
584
588
|
let defaultOption = {
|
|
585
589
|
url: this.windowApi.window.location.href,
|
|
586
590
|
domain: this.windowApi.window.location.hostname,
|
|
@@ -588,16 +592,16 @@ class UtilsGMCookie {
|
|
|
588
592
|
path: "/",
|
|
589
593
|
};
|
|
590
594
|
defaultOption = commonUtil.assign(defaultOption, option);
|
|
591
|
-
|
|
595
|
+
const cookies = this.getCookiesList();
|
|
592
596
|
cookies.forEach((item) => {
|
|
593
597
|
item = item.trim();
|
|
594
|
-
|
|
595
|
-
|
|
598
|
+
const itemSplit = item.split("=");
|
|
599
|
+
const itemName = itemSplit[0];
|
|
596
600
|
itemSplit.splice(0, 1);
|
|
597
|
-
|
|
598
|
-
|
|
601
|
+
const itemValue = decodeURIComponent(itemSplit.join(""));
|
|
602
|
+
const nameRegexp = defaultOption.name instanceof RegExp
|
|
599
603
|
? defaultOption.name
|
|
600
|
-
: new RegExp(
|
|
604
|
+
: new RegExp(`^${defaultOption.name}`, "g");
|
|
601
605
|
if (itemName.match(nameRegexp)) {
|
|
602
606
|
resultData.push({
|
|
603
607
|
domain: this.windowApi.window.location.hostname,
|
|
@@ -637,17 +641,12 @@ class UtilsGMCookie {
|
|
|
637
641
|
expirationDate: Math.floor(Date.now()) + 60 * 60 * 24 * 30,
|
|
638
642
|
};
|
|
639
643
|
defaultOption = commonUtil.assign(defaultOption, option);
|
|
640
|
-
|
|
644
|
+
const life = defaultOption.expirationDate
|
|
641
645
|
? defaultOption.expirationDate
|
|
642
646
|
: Math.floor(Date.now()) + 60 * 60 * 24 * 30;
|
|
643
|
-
let cookieStr = defaultOption.name
|
|
644
|
-
"=" +
|
|
645
|
-
decodeURIComponent(defaultOption.value) +
|
|
646
|
-
";expires=" +
|
|
647
|
-
new Date(life).toGMTString() +
|
|
648
|
-
"; path=/";
|
|
647
|
+
let cookieStr = `${defaultOption.name}=${decodeURIComponent(defaultOption.value)};expires=${new Date(life).toGMTString()}; path=/`;
|
|
649
648
|
if (commonUtil.isNull(defaultOption.domain)) {
|
|
650
|
-
cookieStr +=
|
|
649
|
+
cookieStr += `; domain=${defaultOption.domain}`;
|
|
651
650
|
}
|
|
652
651
|
this.windowApi.document.cookie = cookieStr;
|
|
653
652
|
}
|
|
@@ -699,14 +698,14 @@ class UtilsGMCookie {
|
|
|
699
698
|
if (cookieStr.trim() === "") {
|
|
700
699
|
return [];
|
|
701
700
|
}
|
|
702
|
-
|
|
703
|
-
|
|
701
|
+
const cookies = cookieStr.split(";");
|
|
702
|
+
const result = [];
|
|
704
703
|
for (const cookieItem of cookies) {
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
704
|
+
const item = cookieItem.trim();
|
|
705
|
+
const itemSplit = item.split("=");
|
|
706
|
+
const itemName = itemSplit[0];
|
|
708
707
|
itemSplit.splice(0, 1);
|
|
709
|
-
|
|
708
|
+
const itemValue = decodeURIComponent(itemSplit.join(""));
|
|
710
709
|
result.push({
|
|
711
710
|
key: itemName,
|
|
712
711
|
value: itemValue,
|
|
@@ -716,6 +715,7 @@ class UtilsGMCookie {
|
|
|
716
715
|
}
|
|
717
716
|
}
|
|
718
717
|
|
|
718
|
+
/* eslint-disable */
|
|
719
719
|
// ==UserScript==
|
|
720
720
|
// @name ajaxHooker
|
|
721
721
|
// @author cxxjackie
|
|
@@ -1766,15 +1766,15 @@ class GMMenu {
|
|
|
1766
1766
|
*/
|
|
1767
1767
|
init() {
|
|
1768
1768
|
for (let index = 0; index < this.$data.data.length; index++) {
|
|
1769
|
-
|
|
1769
|
+
const menuOption = this.$data.data[index]["data"];
|
|
1770
1770
|
menuOption.enable = Boolean(this.getLocalMenuData(menuOption.key, menuOption.enable));
|
|
1771
1771
|
if (typeof menuOption.showText !== "function") {
|
|
1772
1772
|
menuOption.showText = (menuText, menuEnable) => {
|
|
1773
1773
|
if (menuEnable) {
|
|
1774
|
-
return this.$emoji.success
|
|
1774
|
+
return `${this.$emoji.success} ${menuText}`;
|
|
1775
1775
|
}
|
|
1776
1776
|
else {
|
|
1777
|
-
return this.$emoji.error
|
|
1777
|
+
return `${this.$emoji.error} ${menuText}`;
|
|
1778
1778
|
}
|
|
1779
1779
|
};
|
|
1780
1780
|
}
|
|
@@ -1785,7 +1785,7 @@ class GMMenu {
|
|
|
1785
1785
|
* @param menuOptions 如果存在,使用它
|
|
1786
1786
|
*/
|
|
1787
1787
|
register(menuOptions) {
|
|
1788
|
-
|
|
1788
|
+
const that = this;
|
|
1789
1789
|
if (menuOptions == null) {
|
|
1790
1790
|
throw new TypeError("register菜单数据不能为空");
|
|
1791
1791
|
}
|
|
@@ -1793,9 +1793,9 @@ class GMMenu {
|
|
|
1793
1793
|
menuOptions = [menuOptions];
|
|
1794
1794
|
}
|
|
1795
1795
|
for (let index = 0; index < menuOptions.length; index++) {
|
|
1796
|
-
|
|
1796
|
+
const cloneMenuOptionData = commonUtil.deepClone(menuOptions[index].data);
|
|
1797
1797
|
const { showText, clickCallBack } = this.handleMenuData(cloneMenuOptionData);
|
|
1798
|
-
|
|
1798
|
+
const menuId = that.context.GM_Api.registerMenuCommand(showText, clickCallBack);
|
|
1799
1799
|
menuOptions[index].id = menuId;
|
|
1800
1800
|
cloneMenuOptionData.deleteMenu = function () {
|
|
1801
1801
|
that.context.GM_Api.unregisterMenuCommand(menuId);
|
|
@@ -1809,7 +1809,7 @@ class GMMenu {
|
|
|
1809
1809
|
* @param {string} key 键
|
|
1810
1810
|
*/
|
|
1811
1811
|
getLocalMenuData(key, defaultValue) {
|
|
1812
|
-
|
|
1812
|
+
const localData = this.context.GM_Api.getValue(this.$data.key, {});
|
|
1813
1813
|
if (key in localData) {
|
|
1814
1814
|
return localData[key];
|
|
1815
1815
|
}
|
|
@@ -1823,7 +1823,7 @@ class GMMenu {
|
|
|
1823
1823
|
* @param value 值
|
|
1824
1824
|
*/
|
|
1825
1825
|
setLocalMenuData(key, value) {
|
|
1826
|
-
|
|
1826
|
+
const localData = this.context.GM_Api.getValue(this.$data.key, {});
|
|
1827
1827
|
localData[key] = value;
|
|
1828
1828
|
this.context.GM_Api.setValue(this.$data.key, localData);
|
|
1829
1829
|
},
|
|
@@ -1836,10 +1836,10 @@ class GMMenu {
|
|
|
1836
1836
|
if (typeof menuOption.showText !== "function") {
|
|
1837
1837
|
menuOption.showText = (menuText, menuEnable) => {
|
|
1838
1838
|
if (menuEnable) {
|
|
1839
|
-
return this.$emoji.success
|
|
1839
|
+
return `${this.$emoji.success} ${menuText}`;
|
|
1840
1840
|
}
|
|
1841
1841
|
else {
|
|
1842
|
-
return this.$emoji.error
|
|
1842
|
+
return `${this.$emoji.error} ${menuText}`;
|
|
1843
1843
|
}
|
|
1844
1844
|
};
|
|
1845
1845
|
}
|
|
@@ -1850,12 +1850,12 @@ class GMMenu {
|
|
|
1850
1850
|
* @param menuOption
|
|
1851
1851
|
*/
|
|
1852
1852
|
handleMenuData(menuOption) {
|
|
1853
|
-
|
|
1854
|
-
|
|
1853
|
+
const that = this;
|
|
1854
|
+
const menuLocalDataItemKey = menuOption.key;
|
|
1855
1855
|
/* 菜单默认开启的状态 */
|
|
1856
|
-
|
|
1856
|
+
const defaultEnable = Boolean(this.getLocalMenuData(menuLocalDataItemKey, menuOption.enable));
|
|
1857
1857
|
/** 油猴菜单上显示的文本 */
|
|
1858
|
-
|
|
1858
|
+
const showText = menuOption.showText(menuOption.text, defaultEnable);
|
|
1859
1859
|
// const GMMenuOptions = {
|
|
1860
1860
|
// /**
|
|
1861
1861
|
// * 菜单的id
|
|
@@ -1885,7 +1885,7 @@ class GMMenu {
|
|
|
1885
1885
|
* @param event
|
|
1886
1886
|
*/
|
|
1887
1887
|
function clickCallBack(event) {
|
|
1888
|
-
|
|
1888
|
+
const localEnable = Boolean(that.getLocalMenuData(menuLocalDataItemKey, defaultEnable));
|
|
1889
1889
|
if (menuOption.isStoreValue) {
|
|
1890
1890
|
that.setLocalMenuData(menuLocalDataItemKey, !localEnable);
|
|
1891
1891
|
}
|
|
@@ -1998,7 +1998,7 @@ class GMMenu {
|
|
|
1998
1998
|
menuOptionList = [...menuOptionList, options];
|
|
1999
1999
|
}
|
|
2000
2000
|
menuOptionList.forEach((menuOption) => {
|
|
2001
|
-
|
|
2001
|
+
const oldMenuOption = this.MenuHandle.getMenuOption(menuOption.key);
|
|
2002
2002
|
if (oldMenuOption) {
|
|
2003
2003
|
// 覆盖
|
|
2004
2004
|
Object.assign(oldMenuOption, menuOption);
|
|
@@ -2166,42 +2166,42 @@ class Hooks {
|
|
|
2166
2166
|
* 在Function原型上添加自定义方法.hook和.unhook
|
|
2167
2167
|
*/
|
|
2168
2168
|
initEnv() {
|
|
2169
|
-
Function.prototype.hook = function (
|
|
2169
|
+
Function.prototype.hook = function (_, hookFunc, context) {
|
|
2170
2170
|
let _context = null; //函数上下文
|
|
2171
2171
|
let _funcName = null; //函数名
|
|
2172
2172
|
_context = context || window;
|
|
2173
2173
|
_funcName = getFuncName(this);
|
|
2174
|
-
_context[
|
|
2174
|
+
_context[`realFunc_${_funcName}`] = this;
|
|
2175
2175
|
if (_context[_funcName].prototype && _context[_funcName].prototype.isHooked) {
|
|
2176
2176
|
console.log("Already has been hooked,unhook first");
|
|
2177
2177
|
return false;
|
|
2178
2178
|
}
|
|
2179
2179
|
function getFuncName(fn) {
|
|
2180
2180
|
// 获取函数名
|
|
2181
|
-
|
|
2182
|
-
|
|
2183
|
-
|
|
2181
|
+
const strFunc = fn.toString();
|
|
2182
|
+
const _regex = /function\s+(\w+)\s*\(/;
|
|
2183
|
+
const patten = strFunc.match(_regex);
|
|
2184
2184
|
if (patten) {
|
|
2185
2185
|
return patten[1];
|
|
2186
2186
|
}
|
|
2187
2187
|
return "";
|
|
2188
2188
|
}
|
|
2189
2189
|
try {
|
|
2190
|
-
new Function("_context", "_funcName", "hookFunc", `_context[_funcName] = function ${_funcName}() {
|
|
2191
|
-
let args = Array.prototype.slice.call(arguments, 0);
|
|
2192
|
-
let obj = this;
|
|
2193
|
-
hookFunc.apply(obj, args);
|
|
2194
|
-
return _context['realFunc_${_funcName}'].apply(obj, args);
|
|
2190
|
+
new Function("_context", "_funcName", "hookFunc", `_context[_funcName] = function ${_funcName}() {
|
|
2191
|
+
let args = Array.prototype.slice.call(arguments, 0);
|
|
2192
|
+
let obj = this;
|
|
2193
|
+
hookFunc.apply(obj, args);
|
|
2194
|
+
return _context['realFunc_${_funcName}'].apply(obj, args);
|
|
2195
2195
|
};`)(_context, _funcName, hookFunc);
|
|
2196
2196
|
_context[_funcName].prototype.isHooked = true;
|
|
2197
2197
|
return true;
|
|
2198
2198
|
}
|
|
2199
2199
|
catch (e) {
|
|
2200
|
-
console.log("Hook failed,check the params.");
|
|
2200
|
+
console.log("Hook failed,check the params.", e);
|
|
2201
2201
|
return false;
|
|
2202
2202
|
}
|
|
2203
2203
|
};
|
|
2204
|
-
Function.prototype.unhook = function (
|
|
2204
|
+
Function.prototype.unhook = function (_, funcName, context) {
|
|
2205
2205
|
let _context = null;
|
|
2206
2206
|
let _funcName = null;
|
|
2207
2207
|
_context = context || window;
|
|
@@ -2210,8 +2210,8 @@ class Hooks {
|
|
|
2210
2210
|
console.log("No function is hooked on");
|
|
2211
2211
|
return false;
|
|
2212
2212
|
}
|
|
2213
|
-
_context[_funcName] = _context[
|
|
2214
|
-
Reflect.deleteProperty(_context,
|
|
2213
|
+
_context[_funcName] = _context[`realFunc${_funcName}`];
|
|
2214
|
+
Reflect.deleteProperty(_context, `realFunc_${_funcName}`);
|
|
2215
2215
|
return true;
|
|
2216
2216
|
};
|
|
2217
2217
|
}
|
|
@@ -2219,10 +2219,10 @@ class Hooks {
|
|
|
2219
2219
|
* 删除在Function原型上添加的自定义方法.hook和.unhook
|
|
2220
2220
|
*/
|
|
2221
2221
|
cleanEnv() {
|
|
2222
|
-
if (
|
|
2222
|
+
if (Object.prototype.hasOwnProperty.call(Function.prototype, "hook")) {
|
|
2223
2223
|
Reflect.deleteProperty(Function.prototype, "hook");
|
|
2224
2224
|
}
|
|
2225
|
-
if (
|
|
2225
|
+
if (Object.prototype.hasOwnProperty.call(Function.prototype, "unhook")) {
|
|
2226
2226
|
Reflect.deleteProperty(Function.prototype, "unhook");
|
|
2227
2227
|
}
|
|
2228
2228
|
return true;
|
|
@@ -2238,7 +2238,7 @@ const GenerateUUID = function () {
|
|
|
2238
2238
|
}
|
|
2239
2239
|
else {
|
|
2240
2240
|
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (charStr) {
|
|
2241
|
-
|
|
2241
|
+
const randomValue = (Math.random() * 16) | 0, randomCharValue = charStr === "x" ? randomValue : (randomValue & 0x3) | 0x8;
|
|
2242
2242
|
return randomCharValue.toString(16);
|
|
2243
2243
|
});
|
|
2244
2244
|
}
|
|
@@ -2280,9 +2280,9 @@ class Httpx {
|
|
|
2280
2280
|
}
|
|
2281
2281
|
}
|
|
2282
2282
|
for (let index = 0; index < this.$config.configList.length; index++) {
|
|
2283
|
-
|
|
2283
|
+
const item = this.$config.configList[index];
|
|
2284
2284
|
if (typeof item.fn === "function") {
|
|
2285
|
-
|
|
2285
|
+
const result = await item.fn(details);
|
|
2286
2286
|
if (result == null) {
|
|
2287
2287
|
return;
|
|
2288
2288
|
}
|
|
@@ -2295,7 +2295,7 @@ class Httpx {
|
|
|
2295
2295
|
*/
|
|
2296
2296
|
add(fn) {
|
|
2297
2297
|
if (typeof fn === "function") {
|
|
2298
|
-
|
|
2298
|
+
const uuid = GenerateUUID();
|
|
2299
2299
|
this.$config.configList.push({
|
|
2300
2300
|
id: uuid,
|
|
2301
2301
|
fn: fn,
|
|
@@ -2312,7 +2312,7 @@ class Httpx {
|
|
|
2312
2312
|
*/
|
|
2313
2313
|
delete(id) {
|
|
2314
2314
|
if (typeof id === "string") {
|
|
2315
|
-
|
|
2315
|
+
const findIndex = this.$config.configList.findIndex((item) => item.id === id);
|
|
2316
2316
|
if (findIndex !== -1) {
|
|
2317
2317
|
this.$config.configList.splice(findIndex, 1);
|
|
2318
2318
|
return true;
|
|
@@ -2358,9 +2358,9 @@ class Httpx {
|
|
|
2358
2358
|
}
|
|
2359
2359
|
}
|
|
2360
2360
|
for (let index = 0; index < this.$config.configList.length; index++) {
|
|
2361
|
-
|
|
2361
|
+
const item = this.$config.configList[index];
|
|
2362
2362
|
if (typeof item.successFn === "function") {
|
|
2363
|
-
|
|
2363
|
+
const result = await item.successFn(response, details);
|
|
2364
2364
|
if (result == null) {
|
|
2365
2365
|
return;
|
|
2366
2366
|
}
|
|
@@ -2393,9 +2393,9 @@ class Httpx {
|
|
|
2393
2393
|
}
|
|
2394
2394
|
}
|
|
2395
2395
|
for (let index = 0; index < this.$config.configList.length; index++) {
|
|
2396
|
-
|
|
2396
|
+
const item = this.$config.configList[index];
|
|
2397
2397
|
if (typeof item.errorFn === "function") {
|
|
2398
|
-
|
|
2398
|
+
const result = await item.errorFn(data);
|
|
2399
2399
|
if (result == null) {
|
|
2400
2400
|
return;
|
|
2401
2401
|
}
|
|
@@ -2407,7 +2407,7 @@ class Httpx {
|
|
|
2407
2407
|
* 添加请求前的回调处理配置
|
|
2408
2408
|
*/
|
|
2409
2409
|
add(successFn, errorFn) {
|
|
2410
|
-
|
|
2410
|
+
const id = GenerateUUID();
|
|
2411
2411
|
this.$config.configList.push({
|
|
2412
2412
|
id: id,
|
|
2413
2413
|
successFn: successFn,
|
|
@@ -2421,7 +2421,7 @@ class Httpx {
|
|
|
2421
2421
|
*/
|
|
2422
2422
|
delete(id) {
|
|
2423
2423
|
if (typeof id === "string") {
|
|
2424
|
-
|
|
2424
|
+
const findIndex = this.$config.configList.findIndex((item) => item.id === id);
|
|
2425
2425
|
if (findIndex !== -1) {
|
|
2426
2426
|
this.$config.configList.splice(findIndex, 1);
|
|
2427
2427
|
return true;
|
|
@@ -2442,23 +2442,23 @@ class Httpx {
|
|
|
2442
2442
|
* 对请求的参数进行合并处理
|
|
2443
2443
|
*/
|
|
2444
2444
|
handleBeforeRequestOptionArgs(...args) {
|
|
2445
|
-
|
|
2445
|
+
const option = {
|
|
2446
2446
|
url: void 0,
|
|
2447
2447
|
};
|
|
2448
2448
|
if (typeof args[0] === "string") {
|
|
2449
2449
|
/* 传入的是url,转为配置 */
|
|
2450
|
-
|
|
2450
|
+
const url = args[0];
|
|
2451
2451
|
option.url = url;
|
|
2452
2452
|
if (typeof args[1] === "object") {
|
|
2453
2453
|
/* 处理第二个参数details */
|
|
2454
|
-
|
|
2454
|
+
const optionArg = args[1];
|
|
2455
2455
|
commonUtil.assign(option, optionArg, true);
|
|
2456
2456
|
option.url = url;
|
|
2457
2457
|
}
|
|
2458
2458
|
}
|
|
2459
2459
|
else {
|
|
2460
2460
|
/* 传入的是配置 */
|
|
2461
|
-
|
|
2461
|
+
const optionArg = args[0];
|
|
2462
2462
|
commonUtil.assign(option, optionArg, true);
|
|
2463
2463
|
}
|
|
2464
2464
|
return option;
|
|
@@ -2471,7 +2471,7 @@ class Httpx {
|
|
|
2471
2471
|
* @param reject promise抛出错误回调
|
|
2472
2472
|
*/
|
|
2473
2473
|
getRequestOption(method, userRequestOption, resolve, reject) {
|
|
2474
|
-
|
|
2474
|
+
const that = this;
|
|
2475
2475
|
let url = userRequestOption.url || this.context.#defaultRequestOption.url;
|
|
2476
2476
|
if (typeof url === "string") {
|
|
2477
2477
|
// 去除左右空格
|
|
@@ -2484,7 +2484,7 @@ class Httpx {
|
|
|
2484
2484
|
}
|
|
2485
2485
|
}
|
|
2486
2486
|
}
|
|
2487
|
-
|
|
2487
|
+
const requestOption = {
|
|
2488
2488
|
url: url,
|
|
2489
2489
|
method: (method || "GET").toString().toUpperCase().trim(),
|
|
2490
2490
|
timeout: userRequestOption.timeout || this.context.#defaultRequestOption.timeout,
|
|
@@ -2506,9 +2506,12 @@ class Httpx {
|
|
|
2506
2506
|
/* 对象使用深拷贝 */
|
|
2507
2507
|
fetchInit: commonUtil.deepClone(this.context.#defaultRequestOption.fetchInit),
|
|
2508
2508
|
allowInterceptConfig: {
|
|
2509
|
-
beforeRequest: this.context.#defaultRequestOption.allowInterceptConfig
|
|
2510
|
-
|
|
2511
|
-
|
|
2509
|
+
beforeRequest: this.context.#defaultRequestOption.allowInterceptConfig
|
|
2510
|
+
.beforeRequest,
|
|
2511
|
+
afterResponseSuccess: this.context.#defaultRequestOption.allowInterceptConfig
|
|
2512
|
+
.afterResponseSuccess,
|
|
2513
|
+
afterResponseError: this.context.#defaultRequestOption.allowInterceptConfig
|
|
2514
|
+
.afterResponseError,
|
|
2512
2515
|
},
|
|
2513
2516
|
user: userRequestOption.user || this.context.#defaultRequestOption.user,
|
|
2514
2517
|
password: userRequestOption.password || this.context.#defaultRequestOption.password,
|
|
@@ -2536,15 +2539,17 @@ class Httpx {
|
|
|
2536
2539
|
};
|
|
2537
2540
|
// 补全allowInterceptConfig参数
|
|
2538
2541
|
if (typeof userRequestOption.allowInterceptConfig === "boolean") {
|
|
2539
|
-
Object.keys(requestOption.allowInterceptConfig)
|
|
2542
|
+
const allowInterceptConfigKeys = Object.keys(requestOption.allowInterceptConfig);
|
|
2543
|
+
allowInterceptConfigKeys.forEach((keyName) => {
|
|
2540
2544
|
Reflect.set(requestOption.allowInterceptConfig, keyName, userRequestOption.allowInterceptConfig);
|
|
2541
2545
|
});
|
|
2542
2546
|
}
|
|
2543
2547
|
else {
|
|
2544
2548
|
if (typeof userRequestOption.allowInterceptConfig === "object" &&
|
|
2545
2549
|
userRequestOption.allowInterceptConfig != null) {
|
|
2546
|
-
Object.keys(
|
|
2547
|
-
|
|
2550
|
+
const allowInterceptConfigKeys = Object.keys(requestOption.allowInterceptConfig);
|
|
2551
|
+
allowInterceptConfigKeys.forEach((keyName) => {
|
|
2552
|
+
const value = Reflect.get(userRequestOption.allowInterceptConfig, keyName);
|
|
2548
2553
|
if (typeof value === "boolean" &&
|
|
2549
2554
|
Reflect.has(requestOption.allowInterceptConfig, keyName)) {
|
|
2550
2555
|
Reflect.set(requestOption.allowInterceptConfig, keyName, value);
|
|
@@ -2558,7 +2563,8 @@ class Httpx {
|
|
|
2558
2563
|
}
|
|
2559
2564
|
if (typeof requestOption.headers === "object") {
|
|
2560
2565
|
if (typeof userRequestOption.headers === "object") {
|
|
2561
|
-
Object.keys(
|
|
2566
|
+
const headerKeys = Object.keys(requestOption.headers);
|
|
2567
|
+
headerKeys.forEach((keyName) => {
|
|
2562
2568
|
if (keyName in requestOption.headers && userRequestOption.headers?.[keyName] == null) {
|
|
2563
2569
|
/* 在默认的header中存在,且设置它新的值为空,那么就是默认的值 */
|
|
2564
2570
|
Reflect.deleteProperty(requestOption.headers, keyName);
|
|
@@ -2576,8 +2582,9 @@ class Httpx {
|
|
|
2576
2582
|
if (typeof requestOption.fetchInit === "object") {
|
|
2577
2583
|
/* 使用assign替换且添加 */
|
|
2578
2584
|
if (typeof userRequestOption.fetchInit === "object") {
|
|
2579
|
-
Object.keys(
|
|
2580
|
-
|
|
2585
|
+
const fetchInitKeys = Object.keys(requestOption.fetchInit);
|
|
2586
|
+
fetchInitKeys.forEach((keyName) => {
|
|
2587
|
+
if (keyName in requestOption.fetchInit && Reflect.get(userRequestOption.fetchInit ?? {}, keyName) == null) {
|
|
2581
2588
|
/* 在默认的fetchInit中存在,且设置它新的值为空,那么就是默认的值 */
|
|
2582
2589
|
Reflect.deleteProperty(requestOption.fetchInit, keyName);
|
|
2583
2590
|
}
|
|
@@ -2602,7 +2609,7 @@ class Httpx {
|
|
|
2602
2609
|
try {
|
|
2603
2610
|
new URL(requestOption.url);
|
|
2604
2611
|
}
|
|
2605
|
-
catch
|
|
2612
|
+
catch {
|
|
2606
2613
|
if (requestOption.url.startsWith("//")) {
|
|
2607
2614
|
// 补充https:
|
|
2608
2615
|
requestOption.url = globalThis.location.protocol + requestOption.url;
|
|
@@ -2613,7 +2620,7 @@ class Httpx {
|
|
|
2613
2620
|
}
|
|
2614
2621
|
else {
|
|
2615
2622
|
// 补充origin+/
|
|
2616
|
-
requestOption.url = globalThis.location.origin
|
|
2623
|
+
requestOption.url = `${globalThis.location.origin}/${requestOption.url}`;
|
|
2617
2624
|
}
|
|
2618
2625
|
}
|
|
2619
2626
|
if (requestOption.fetchInit && !requestOption.fetch) {
|
|
@@ -2623,12 +2630,12 @@ class Httpx {
|
|
|
2623
2630
|
// 转换data类型
|
|
2624
2631
|
try {
|
|
2625
2632
|
/** 是否对数据进行处理 */
|
|
2626
|
-
|
|
2633
|
+
const processData = userRequestOption.processData ?? true;
|
|
2627
2634
|
if (requestOption.data != null && processData) {
|
|
2628
|
-
|
|
2635
|
+
const method = requestOption.method;
|
|
2629
2636
|
if (method === "GET" || method === "HEAD") {
|
|
2630
2637
|
// GET类型,data如果有,那么需要转为searchParams
|
|
2631
|
-
|
|
2638
|
+
const urlObj = new URL(requestOption.url);
|
|
2632
2639
|
let urlSearch = "";
|
|
2633
2640
|
let isHandler = false;
|
|
2634
2641
|
if (typeof requestOption.data === "string") {
|
|
@@ -2638,7 +2645,7 @@ class Httpx {
|
|
|
2638
2645
|
else if (typeof requestOption.data === "object") {
|
|
2639
2646
|
isHandler = true;
|
|
2640
2647
|
// URLSearchParams参数可以转普通的string:string,包括FormData
|
|
2641
|
-
|
|
2648
|
+
const searchParams = new URLSearchParams(requestOption.data);
|
|
2642
2649
|
urlSearch = searchParams.toString();
|
|
2643
2650
|
}
|
|
2644
2651
|
if (isHandler) {
|
|
@@ -2659,7 +2666,7 @@ class Httpx {
|
|
|
2659
2666
|
}
|
|
2660
2667
|
else {
|
|
2661
2668
|
// xxx=xxx&xxx=
|
|
2662
|
-
urlObj.search = urlObj.search
|
|
2669
|
+
urlObj.search = `${urlObj.search}&${urlSearch}`;
|
|
2663
2670
|
}
|
|
2664
2671
|
}
|
|
2665
2672
|
}
|
|
@@ -2667,14 +2674,14 @@ class Httpx {
|
|
|
2667
2674
|
}
|
|
2668
2675
|
else if (method === "POST" && requestOption.headers != null) {
|
|
2669
2676
|
// POST类型,data如果是FormData,那么需要转为string
|
|
2670
|
-
|
|
2671
|
-
|
|
2677
|
+
const headersKeyList = Object.keys(requestOption.headers);
|
|
2678
|
+
const ContentTypeIndex = headersKeyList.findIndex((headerKey) => {
|
|
2672
2679
|
return (headerKey.trim().toLowerCase() === "content-type" &&
|
|
2673
2680
|
typeof requestOption.headers[headerKey] === "string");
|
|
2674
2681
|
});
|
|
2675
2682
|
if (ContentTypeIndex !== -1) {
|
|
2676
|
-
|
|
2677
|
-
|
|
2683
|
+
const ContentTypeKey = headersKeyList[ContentTypeIndex];
|
|
2684
|
+
const ContentType = requestOption.headers[ContentTypeKey];
|
|
2678
2685
|
// 设置了Content-Type
|
|
2679
2686
|
if (ContentType.includes("application/json")) {
|
|
2680
2687
|
// application/json
|
|
@@ -2715,10 +2722,10 @@ class Httpx {
|
|
|
2715
2722
|
* @param option 请求配置
|
|
2716
2723
|
*/
|
|
2717
2724
|
removeRequestNullOption(option) {
|
|
2718
|
-
Object.keys(option)
|
|
2719
|
-
|
|
2720
|
-
|
|
2721
|
-
|
|
2725
|
+
const optionKeys = Object.keys(option);
|
|
2726
|
+
optionKeys.forEach((keyName) => {
|
|
2727
|
+
const optionValue = option[keyName];
|
|
2728
|
+
if (optionValue == null || (optionValue instanceof Function && commonUtil.isNull(optionValue))) {
|
|
2722
2729
|
Reflect.deleteProperty(option, keyName);
|
|
2723
2730
|
return;
|
|
2724
2731
|
}
|
|
@@ -2736,14 +2743,14 @@ class Httpx {
|
|
|
2736
2743
|
/**
|
|
2737
2744
|
* fetch的请求配置
|
|
2738
2745
|
**/
|
|
2739
|
-
|
|
2746
|
+
const fetchRequestOption = {};
|
|
2740
2747
|
if ((option.method === "GET" || option.method === "HEAD") && option.data != null) {
|
|
2741
2748
|
/* GET 或 HEAD 方法的请求不能包含 body 信息 */
|
|
2742
2749
|
Reflect.deleteProperty(option, "data");
|
|
2743
2750
|
}
|
|
2744
2751
|
/* 中止信号控制器 */
|
|
2745
|
-
|
|
2746
|
-
|
|
2752
|
+
const abortController = new AbortController();
|
|
2753
|
+
const signal = abortController.signal;
|
|
2747
2754
|
signal.onabort = () => {
|
|
2748
2755
|
option.onabort({
|
|
2749
2756
|
isFetch: true,
|
|
@@ -2788,10 +2795,10 @@ class Httpx {
|
|
|
2788
2795
|
* onabort请求被取消-触发
|
|
2789
2796
|
* @param details 配置
|
|
2790
2797
|
* @param resolve promise回调
|
|
2791
|
-
* @param
|
|
2798
|
+
* @param _reject promise抛出错误回调
|
|
2792
2799
|
* @param argsResult 返回的参数列表
|
|
2793
2800
|
*/
|
|
2794
|
-
async onAbort(details, resolve,
|
|
2801
|
+
async onAbort(details, resolve, _reject, argsResult) {
|
|
2795
2802
|
// console.log(argsResult);
|
|
2796
2803
|
if (typeof details?.onabort === "function") {
|
|
2797
2804
|
details.onabort.apply(this, argsResult);
|
|
@@ -2828,7 +2835,7 @@ class Httpx {
|
|
|
2828
2835
|
* @param reject 抛出错误
|
|
2829
2836
|
* @param argsResult 返回的参数列表
|
|
2830
2837
|
*/
|
|
2831
|
-
async onTimeout(details, resolve,
|
|
2838
|
+
async onTimeout(details, resolve, _reject, argsResult) {
|
|
2832
2839
|
// console.log(argsResult);
|
|
2833
2840
|
if (typeof details?.ontimeout === "function") {
|
|
2834
2841
|
// 执行配置中的ontime回调
|
|
@@ -2866,10 +2873,10 @@ class Httpx {
|
|
|
2866
2873
|
* onerror请求异常-触发
|
|
2867
2874
|
* @param details 配置
|
|
2868
2875
|
* @param resolve 回调
|
|
2869
|
-
* @param
|
|
2876
|
+
* @param _reject 抛出错误
|
|
2870
2877
|
* @param argsResult 返回的参数列表
|
|
2871
2878
|
*/
|
|
2872
|
-
async onError(details, resolve,
|
|
2879
|
+
async onError(details, resolve, _reject, argsResult) {
|
|
2873
2880
|
// console.log(argsResult);
|
|
2874
2881
|
if (typeof details?.onerror === "function") {
|
|
2875
2882
|
details.onerror.apply(this, argsResult);
|
|
@@ -2903,16 +2910,15 @@ class Httpx {
|
|
|
2903
2910
|
* onload加载完毕-触发
|
|
2904
2911
|
* @param details 请求的配置
|
|
2905
2912
|
* @param resolve 回调
|
|
2906
|
-
* @param
|
|
2913
|
+
* @param _reject 抛出错误
|
|
2907
2914
|
* @param argsResult 返回的参数列表
|
|
2908
2915
|
*/
|
|
2909
|
-
async onLoad(details, resolve,
|
|
2916
|
+
async onLoad(details, resolve, _reject, argsResult) {
|
|
2910
2917
|
// console.log(argsResult);
|
|
2911
2918
|
/* X浏览器会因为设置了responseType导致不返回responseText */
|
|
2912
|
-
|
|
2919
|
+
const originResponse = argsResult[0];
|
|
2913
2920
|
/* responseText为空,response不为空的情况 */
|
|
2914
|
-
if (commonUtil.isNull(originResponse["responseText"]) &&
|
|
2915
|
-
commonUtil.isNotNull(originResponse["response"])) {
|
|
2921
|
+
if (commonUtil.isNull(originResponse["responseText"]) && commonUtil.isNotNull(originResponse["response"])) {
|
|
2916
2922
|
if (typeof originResponse["response"] === "object") {
|
|
2917
2923
|
TryCatch().run(() => {
|
|
2918
2924
|
originResponse["responseText"] = JSON.stringify(originResponse["response"]);
|
|
@@ -2927,51 +2933,51 @@ class Httpx {
|
|
|
2927
2933
|
typeof originResponse["responseText"] === "string" &&
|
|
2928
2934
|
originResponse["responseText"].trim() !== "") {
|
|
2929
2935
|
/** 原始的请求text */
|
|
2930
|
-
|
|
2936
|
+
const httpxResponseText = originResponse.responseText;
|
|
2931
2937
|
// 自定义个新的response
|
|
2932
2938
|
let httpxResponse = httpxResponseText;
|
|
2933
2939
|
if (details.responseType === "json") {
|
|
2934
2940
|
httpxResponse = commonUtil.toJSON(httpxResponseText);
|
|
2935
2941
|
}
|
|
2936
2942
|
else if (details.responseType === "document") {
|
|
2937
|
-
|
|
2943
|
+
const parser = new DOMParser();
|
|
2938
2944
|
httpxResponse = parser.parseFromString(httpxResponseText, "text/html");
|
|
2939
2945
|
}
|
|
2940
2946
|
else if (details.responseType === "arraybuffer") {
|
|
2941
|
-
|
|
2942
|
-
|
|
2947
|
+
const encoder = new TextEncoder();
|
|
2948
|
+
const arrayBuffer = encoder.encode(httpxResponseText);
|
|
2943
2949
|
httpxResponse = arrayBuffer;
|
|
2944
2950
|
}
|
|
2945
2951
|
else if (details.responseType === "blob") {
|
|
2946
|
-
|
|
2947
|
-
|
|
2952
|
+
const encoder = new TextEncoder();
|
|
2953
|
+
const arrayBuffer = encoder.encode(httpxResponseText);
|
|
2948
2954
|
httpxResponse = new Blob([arrayBuffer]);
|
|
2949
2955
|
}
|
|
2950
2956
|
// 尝试覆盖原response
|
|
2951
2957
|
try {
|
|
2952
|
-
|
|
2958
|
+
const setStatus = Reflect.set(originResponse, "response", httpxResponse);
|
|
2953
2959
|
if (!setStatus) {
|
|
2954
2960
|
console.warn("[Httpx-HttpxCallBack.oonLoad] 覆盖原始 response 失败,尝试添加新的httpxResponse");
|
|
2955
2961
|
try {
|
|
2956
2962
|
Reflect.set(originResponse, "httpxResponse", httpxResponse);
|
|
2957
2963
|
}
|
|
2958
|
-
catch
|
|
2964
|
+
catch {
|
|
2959
2965
|
console.warn("[Httpx-HttpxCallBack.oonLoad] httpxResponse 无法被覆盖");
|
|
2960
2966
|
}
|
|
2961
2967
|
}
|
|
2962
2968
|
}
|
|
2963
|
-
catch
|
|
2969
|
+
catch {
|
|
2964
2970
|
console.warn("[Httpx-HttpxCallBack.oonLoad] 原始 response 无法被覆盖,尝试添加新的httpxResponse");
|
|
2965
2971
|
try {
|
|
2966
2972
|
Reflect.set(originResponse, "httpxResponse", httpxResponse);
|
|
2967
2973
|
}
|
|
2968
|
-
catch
|
|
2974
|
+
catch {
|
|
2969
2975
|
console.warn("[Httpx-HttpxCallBack.oonLoad] httpxResponse 无法被覆盖");
|
|
2970
2976
|
}
|
|
2971
2977
|
}
|
|
2972
2978
|
}
|
|
2973
2979
|
/* Stay扩展中没有finalUrl,对应的是responseURL */
|
|
2974
|
-
|
|
2980
|
+
const originResponseURL = Reflect.get(originResponse, "responseURL");
|
|
2975
2981
|
if (originResponse["finalUrl"] == null && originResponseURL != null) {
|
|
2976
2982
|
Reflect.set(originResponse, "finalUrl", originResponseURL);
|
|
2977
2983
|
}
|
|
@@ -2991,7 +2997,7 @@ class Httpx {
|
|
|
2991
2997
|
});
|
|
2992
2998
|
}
|
|
2993
2999
|
else {
|
|
2994
|
-
this.context.HttpxResponseCallBack.onError(details, resolve,
|
|
3000
|
+
this.context.HttpxResponseCallBack.onError(details, resolve, _reject, argsResult);
|
|
2995
3001
|
}
|
|
2996
3002
|
},
|
|
2997
3003
|
/**
|
|
@@ -3048,7 +3054,7 @@ class Httpx {
|
|
|
3048
3054
|
console.log("[Httpx-HttpxRequest.request] 请求前的配置👇", details);
|
|
3049
3055
|
}
|
|
3050
3056
|
if (typeof this.context.HttpxRequestHook.beforeRequestCallBack === "function") {
|
|
3051
|
-
|
|
3057
|
+
const hookResult = await this.context.HttpxRequestHook.beforeRequestCallBack(details);
|
|
3052
3058
|
if (hookResult == null) {
|
|
3053
3059
|
return;
|
|
3054
3060
|
}
|
|
@@ -3080,7 +3086,7 @@ class Httpx {
|
|
|
3080
3086
|
fetch(option.url, fetchRequestOption)
|
|
3081
3087
|
.then(async (fetchResponse) => {
|
|
3082
3088
|
/** 自定义的response */
|
|
3083
|
-
|
|
3089
|
+
const httpxResponse = {
|
|
3084
3090
|
isFetch: true,
|
|
3085
3091
|
finalUrl: fetchResponse.url,
|
|
3086
3092
|
readyState: 4,
|
|
@@ -3095,9 +3101,9 @@ class Httpx {
|
|
|
3095
3101
|
};
|
|
3096
3102
|
Object.assign(httpxResponse, option.context || {});
|
|
3097
3103
|
// 把headers转为字符串
|
|
3098
|
-
|
|
3104
|
+
fetchResponse.headers.forEach((value, key) => {
|
|
3099
3105
|
httpxResponse.responseHeaders += `${key}: ${value}\n`;
|
|
3100
|
-
}
|
|
3106
|
+
});
|
|
3101
3107
|
/** 请求返回的类型 */
|
|
3102
3108
|
const fetchResponseType = fetchResponse.headers.get("Content-Type");
|
|
3103
3109
|
/* 如果需要stream,且获取到的是stream,那直接返回 */
|
|
@@ -3118,11 +3124,11 @@ class Httpx {
|
|
|
3118
3124
|
/** 响应xml文档 */
|
|
3119
3125
|
let responseXML = "";
|
|
3120
3126
|
/** 先获取二进制数据 */
|
|
3121
|
-
|
|
3127
|
+
const arrayBuffer = await fetchResponse.arrayBuffer();
|
|
3122
3128
|
/** 数据编码 */
|
|
3123
3129
|
let encoding = "utf-8";
|
|
3124
3130
|
if (fetchResponse.headers.has("Content-Type")) {
|
|
3125
|
-
|
|
3131
|
+
const charsetMatched = fetchResponse.headers.get("Content-Type")?.match(/charset=(.+)/);
|
|
3126
3132
|
if (charsetMatched) {
|
|
3127
3133
|
encoding = charsetMatched[1];
|
|
3128
3134
|
encoding = encoding.toLowerCase();
|
|
@@ -3132,7 +3138,7 @@ class Httpx {
|
|
|
3132
3138
|
// 去除引号
|
|
3133
3139
|
encoding = encoding.replace(/('|")/gi, "");
|
|
3134
3140
|
// 编码
|
|
3135
|
-
|
|
3141
|
+
const textDecoder = new TextDecoder(encoding);
|
|
3136
3142
|
responseText = textDecoder.decode(arrayBuffer);
|
|
3137
3143
|
response = responseText;
|
|
3138
3144
|
if (option.responseType === "arraybuffer") {
|
|
@@ -3150,11 +3156,11 @@ class Httpx {
|
|
|
3150
3156
|
}
|
|
3151
3157
|
else if (option.responseType === "document" || option.responseType == null) {
|
|
3152
3158
|
// response返回格式是文档格式
|
|
3153
|
-
|
|
3159
|
+
const parser = new DOMParser();
|
|
3154
3160
|
response = parser.parseFromString(responseText, "text/html");
|
|
3155
3161
|
}
|
|
3156
3162
|
// 转为XML结构
|
|
3157
|
-
|
|
3163
|
+
const parser = new DOMParser();
|
|
3158
3164
|
responseXML = parser.parseFromString(responseText, "text/xml");
|
|
3159
3165
|
httpxResponse.response = response;
|
|
3160
3166
|
httpxResponse.responseText = responseText;
|
|
@@ -3228,6 +3234,9 @@ class Httpx {
|
|
|
3228
3234
|
onreadystatechange() { },
|
|
3229
3235
|
onprogress() { },
|
|
3230
3236
|
};
|
|
3237
|
+
/**
|
|
3238
|
+
* 实例化的默认配置
|
|
3239
|
+
*/
|
|
3231
3240
|
#defaultInitOption = {
|
|
3232
3241
|
/**
|
|
3233
3242
|
* `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
|
|
@@ -3343,7 +3352,7 @@ class Httpx {
|
|
|
3343
3352
|
* @param details 配置
|
|
3344
3353
|
*/
|
|
3345
3354
|
get(...args) {
|
|
3346
|
-
|
|
3355
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3347
3356
|
useRequestOption.method = "GET";
|
|
3348
3357
|
return this.request(useRequestOption, (option) => {
|
|
3349
3358
|
Reflect.deleteProperty(option, "onprogress");
|
|
@@ -3353,7 +3362,7 @@ class Httpx {
|
|
|
3353
3362
|
* POST 请求
|
|
3354
3363
|
*/
|
|
3355
3364
|
post(...args) {
|
|
3356
|
-
|
|
3365
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3357
3366
|
useRequestOption.method = "POST";
|
|
3358
3367
|
return this.request(useRequestOption);
|
|
3359
3368
|
}
|
|
@@ -3361,7 +3370,7 @@ class Httpx {
|
|
|
3361
3370
|
* HEAD 请求
|
|
3362
3371
|
*/
|
|
3363
3372
|
head(...args) {
|
|
3364
|
-
|
|
3373
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3365
3374
|
useRequestOption.method = "HEAD";
|
|
3366
3375
|
return this.request(useRequestOption, (option) => {
|
|
3367
3376
|
Reflect.deleteProperty(option, "onprogress");
|
|
@@ -3371,7 +3380,7 @@ class Httpx {
|
|
|
3371
3380
|
* OPTIONS 请求
|
|
3372
3381
|
*/
|
|
3373
3382
|
options(...args) {
|
|
3374
|
-
|
|
3383
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3375
3384
|
useRequestOption.method = "OPTIONS";
|
|
3376
3385
|
return this.request(useRequestOption, (option) => {
|
|
3377
3386
|
Reflect.deleteProperty(option, "onprogress");
|
|
@@ -3381,7 +3390,7 @@ class Httpx {
|
|
|
3381
3390
|
* DELETE 请求
|
|
3382
3391
|
*/
|
|
3383
3392
|
delete(...args) {
|
|
3384
|
-
|
|
3393
|
+
const useRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3385
3394
|
useRequestOption.method = "DELETE";
|
|
3386
3395
|
return this.request(useRequestOption, (option) => {
|
|
3387
3396
|
Reflect.deleteProperty(option, "onprogress");
|
|
@@ -3391,7 +3400,7 @@ class Httpx {
|
|
|
3391
3400
|
* PUT 请求
|
|
3392
3401
|
*/
|
|
3393
3402
|
put(...args) {
|
|
3394
|
-
|
|
3403
|
+
const userRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(...args);
|
|
3395
3404
|
userRequestOption.method = "PUT";
|
|
3396
3405
|
return this.request(userRequestOption);
|
|
3397
3406
|
}
|
|
@@ -3401,18 +3410,30 @@ class Httpx {
|
|
|
3401
3410
|
* @param beforeRequestOption 处理请求前的配置
|
|
3402
3411
|
*/
|
|
3403
3412
|
request(details, beforeRequestOption) {
|
|
3404
|
-
|
|
3405
|
-
|
|
3413
|
+
// 对请求的参数进行合并处理
|
|
3414
|
+
const userRequestOption = this.HttpxRequestOption.handleBeforeRequestOptionArgs(details);
|
|
3415
|
+
/**
|
|
3416
|
+
* 取消请求
|
|
3417
|
+
*/
|
|
3406
3418
|
let abortFn = null;
|
|
3407
|
-
|
|
3408
|
-
|
|
3419
|
+
const promise = new globalThis.Promise(async (resolve, reject) => {
|
|
3420
|
+
// 请求配置
|
|
3421
|
+
let requestOption = this.HttpxRequestOption.getRequestOption(userRequestOption.method, userRequestOption, (resultOption) => {
|
|
3422
|
+
resolve(resultOption);
|
|
3423
|
+
}, (...args) => {
|
|
3424
|
+
reject(...args);
|
|
3425
|
+
});
|
|
3426
|
+
requestOption = this.HttpxRequestOption.removeRequestNullOption(requestOption);
|
|
3409
3427
|
if (typeof beforeRequestOption === "function") {
|
|
3410
3428
|
beforeRequestOption(requestOption);
|
|
3411
3429
|
}
|
|
3412
|
-
|
|
3430
|
+
// 处理重试逻辑
|
|
3413
3431
|
const requestResult = await this.HttpxRequest.request(requestOption);
|
|
3414
3432
|
if (requestResult != null && typeof requestResult.abort === "function") {
|
|
3415
|
-
abortFn =
|
|
3433
|
+
abortFn = () => {
|
|
3434
|
+
// 取消请求
|
|
3435
|
+
requestResult.abort();
|
|
3436
|
+
};
|
|
3416
3437
|
}
|
|
3417
3438
|
});
|
|
3418
3439
|
promise.abort = () => {
|
|
@@ -3431,10 +3452,7 @@ class indexedDB {
|
|
|
3431
3452
|
/* websql的版本号,由于ios的问题,版本号的写法不一样 */
|
|
3432
3453
|
// #slqVersion = "1";
|
|
3433
3454
|
/* 监听IndexDB */
|
|
3434
|
-
#indexedDB =
|
|
3435
|
-
window.mozIndexedDB ||
|
|
3436
|
-
window.webkitIndexedDB ||
|
|
3437
|
-
window.msIndexedDB;
|
|
3455
|
+
#indexedDB = globalThis.indexedDB || globalThis.mozIndexedDB || globalThis.webkitIndexedDB || globalThis.msIndexedDB;
|
|
3438
3456
|
/* 缓存数据库,避免同一个页面重复创建和销毁 */
|
|
3439
3457
|
#db = {};
|
|
3440
3458
|
// #store: IDBObjectStore = null as any;
|
|
@@ -3469,7 +3487,7 @@ class indexedDB {
|
|
|
3469
3487
|
this.#storeName = storeName;
|
|
3470
3488
|
this.#dbVersion = dbVersion;
|
|
3471
3489
|
if (!this.#indexedDB) {
|
|
3472
|
-
alert("很抱歉,您的浏览器不支持indexedDB");
|
|
3490
|
+
window.alert("很抱歉,您的浏览器不支持indexedDB");
|
|
3473
3491
|
throw new TypeError("很抱歉,您的浏览器不支持indexedDB");
|
|
3474
3492
|
}
|
|
3475
3493
|
}
|
|
@@ -3478,10 +3496,9 @@ class indexedDB {
|
|
|
3478
3496
|
* @param dbName 表名
|
|
3479
3497
|
*/
|
|
3480
3498
|
createStore(dbName) {
|
|
3481
|
-
|
|
3482
|
-
txn = this.#db[dbName].transaction(this.#storeName, "readwrite");
|
|
3499
|
+
const txn = this.#db[dbName].transaction(this.#storeName, "readwrite");
|
|
3483
3500
|
/* IndexDB的读写权限 */
|
|
3484
|
-
store = txn.objectStore(this.#storeName);
|
|
3501
|
+
const store = txn.objectStore(this.#storeName);
|
|
3485
3502
|
// this.#store = store;
|
|
3486
3503
|
return store;
|
|
3487
3504
|
}
|
|
@@ -3491,12 +3508,12 @@ class indexedDB {
|
|
|
3491
3508
|
* @param dbName 数据库名
|
|
3492
3509
|
*/
|
|
3493
3510
|
open(callback, dbName) {
|
|
3494
|
-
|
|
3511
|
+
const that = this;
|
|
3495
3512
|
/* 打开数据库 */
|
|
3496
3513
|
/* 如果支持IndexDB */
|
|
3497
3514
|
if (!that.#db[dbName]) {
|
|
3498
3515
|
/* 如果缓存中没有,则进行数据库的创建或打开,提高效率 */
|
|
3499
|
-
|
|
3516
|
+
const request = that.#indexedDB.open(dbName, that.#dbVersion);
|
|
3500
3517
|
request.onerror = function (event) {
|
|
3501
3518
|
callback(null, {
|
|
3502
3519
|
code: that.#statusCode.openFailed.code,
|
|
@@ -3506,26 +3523,26 @@ class indexedDB {
|
|
|
3506
3523
|
};
|
|
3507
3524
|
request.onsuccess = function (event) {
|
|
3508
3525
|
if (!that.#db[dbName]) {
|
|
3509
|
-
|
|
3526
|
+
const target = event.target;
|
|
3510
3527
|
that.#db[dbName] = target.result;
|
|
3511
3528
|
}
|
|
3512
|
-
|
|
3529
|
+
const store = that.createStore(dbName);
|
|
3513
3530
|
callback(store);
|
|
3514
3531
|
};
|
|
3515
3532
|
request.onupgradeneeded = function (event) {
|
|
3516
|
-
|
|
3533
|
+
const target = event.target;
|
|
3517
3534
|
that.#db[dbName] = target.result;
|
|
3518
|
-
|
|
3535
|
+
const store = that.#db[dbName].createObjectStore(that.#storeName, {
|
|
3519
3536
|
keyPath: "key",
|
|
3520
3537
|
});
|
|
3521
|
-
store.transaction.oncomplete = function (
|
|
3538
|
+
store.transaction.oncomplete = function () {
|
|
3522
3539
|
callback(store);
|
|
3523
3540
|
};
|
|
3524
3541
|
};
|
|
3525
3542
|
}
|
|
3526
3543
|
else {
|
|
3527
3544
|
/* 如果缓存中已经打开了数据库,就直接使用 */
|
|
3528
|
-
|
|
3545
|
+
const store = this.createStore(dbName);
|
|
3529
3546
|
callback(store);
|
|
3530
3547
|
}
|
|
3531
3548
|
}
|
|
@@ -3535,10 +3552,10 @@ class indexedDB {
|
|
|
3535
3552
|
* @param value 数据值
|
|
3536
3553
|
*/
|
|
3537
3554
|
async save(key, value) {
|
|
3538
|
-
|
|
3555
|
+
const that = this;
|
|
3539
3556
|
return new Promise((resolve) => {
|
|
3540
|
-
|
|
3541
|
-
|
|
3557
|
+
const dbName = this.#dbName;
|
|
3558
|
+
const inData = {
|
|
3542
3559
|
key: key,
|
|
3543
3560
|
value: value,
|
|
3544
3561
|
};
|
|
@@ -3551,7 +3568,7 @@ class indexedDB {
|
|
|
3551
3568
|
});
|
|
3552
3569
|
}
|
|
3553
3570
|
else {
|
|
3554
|
-
|
|
3571
|
+
const request = idbStore.put(inData);
|
|
3555
3572
|
request.onsuccess = function (event) {
|
|
3556
3573
|
/* 保存成功有success 字段 */
|
|
3557
3574
|
resolve({
|
|
@@ -3578,9 +3595,9 @@ class indexedDB {
|
|
|
3578
3595
|
* @param key 数据key
|
|
3579
3596
|
*/
|
|
3580
3597
|
async has(key) {
|
|
3581
|
-
|
|
3598
|
+
const that = this;
|
|
3582
3599
|
return new Promise((resolve) => {
|
|
3583
|
-
|
|
3600
|
+
const dbName = this.#dbName;
|
|
3584
3601
|
this.open(function (idbStore) {
|
|
3585
3602
|
/* 判断返回的数据中是否有error字段 */
|
|
3586
3603
|
if (idbStore == null) {
|
|
@@ -3591,7 +3608,7 @@ class indexedDB {
|
|
|
3591
3608
|
});
|
|
3592
3609
|
}
|
|
3593
3610
|
else {
|
|
3594
|
-
|
|
3611
|
+
const request = idbStore.get(key);
|
|
3595
3612
|
request.onsuccess = function (event) {
|
|
3596
3613
|
/* result 返回的是 {key: string, value: any} */
|
|
3597
3614
|
/* 键值对存储 */
|
|
@@ -3619,9 +3636,9 @@ class indexedDB {
|
|
|
3619
3636
|
* @param key 数据key
|
|
3620
3637
|
*/
|
|
3621
3638
|
async get(key) {
|
|
3622
|
-
|
|
3639
|
+
const that = this;
|
|
3623
3640
|
return new Promise((resolve) => {
|
|
3624
|
-
|
|
3641
|
+
const dbName = this.#dbName;
|
|
3625
3642
|
this.open(function (idbStore) {
|
|
3626
3643
|
/* 判断返回的数据中是否有error字段 */
|
|
3627
3644
|
if (idbStore == null) {
|
|
@@ -3633,13 +3650,13 @@ class indexedDB {
|
|
|
3633
3650
|
});
|
|
3634
3651
|
}
|
|
3635
3652
|
else {
|
|
3636
|
-
|
|
3653
|
+
const request = idbStore.get(key);
|
|
3637
3654
|
request.onsuccess = function (event) {
|
|
3638
|
-
|
|
3639
|
-
|
|
3655
|
+
const target = event.target;
|
|
3656
|
+
const result = target.result;
|
|
3640
3657
|
/* result 返回的是 {key: string, value: any} */
|
|
3641
3658
|
/* 键值对存储 */
|
|
3642
|
-
|
|
3659
|
+
const data = result ? result.value : void 0;
|
|
3643
3660
|
if (data == null) {
|
|
3644
3661
|
resolve({
|
|
3645
3662
|
success: true,
|
|
@@ -3680,10 +3697,10 @@ class indexedDB {
|
|
|
3680
3697
|
*/
|
|
3681
3698
|
async regexpGet(key) {
|
|
3682
3699
|
let list = [];
|
|
3683
|
-
|
|
3700
|
+
const that = this;
|
|
3684
3701
|
return new Promise((resolve) => {
|
|
3685
3702
|
/* 正则查询 */
|
|
3686
|
-
|
|
3703
|
+
const dbName = that.#dbName;
|
|
3687
3704
|
this.open(function (idbStore) {
|
|
3688
3705
|
/* 判断返回的数据中是否有error字段 */
|
|
3689
3706
|
if (idbStore == null) {
|
|
@@ -3695,16 +3712,16 @@ class indexedDB {
|
|
|
3695
3712
|
});
|
|
3696
3713
|
}
|
|
3697
3714
|
else {
|
|
3698
|
-
|
|
3715
|
+
const request = idbStore.getAll();
|
|
3699
3716
|
request.onsuccess = function (event) {
|
|
3700
|
-
|
|
3701
|
-
|
|
3717
|
+
const target = event.target;
|
|
3718
|
+
const result = target.result;
|
|
3702
3719
|
if (result.length !== 0) {
|
|
3703
|
-
result.forEach((dataItem
|
|
3720
|
+
result.forEach((dataItem) => {
|
|
3704
3721
|
// 当前项的key
|
|
3705
|
-
|
|
3722
|
+
const __key = dataItem["key"];
|
|
3706
3723
|
// 当前项的value
|
|
3707
|
-
|
|
3724
|
+
const __value = dataItem["value"];
|
|
3708
3725
|
if (__key.match(key)) {
|
|
3709
3726
|
list = list.concat(__value);
|
|
3710
3727
|
}
|
|
@@ -3736,10 +3753,10 @@ class indexedDB {
|
|
|
3736
3753
|
* @param key 数据key
|
|
3737
3754
|
*/
|
|
3738
3755
|
async delete(key) {
|
|
3739
|
-
|
|
3756
|
+
const that = this;
|
|
3740
3757
|
return new Promise((resolve) => {
|
|
3741
3758
|
/* 根据key删除某条数据 */
|
|
3742
|
-
|
|
3759
|
+
const dbName = that.#dbName;
|
|
3743
3760
|
this.open(function (idbStore) {
|
|
3744
3761
|
if (idbStore == null) {
|
|
3745
3762
|
resolve({
|
|
@@ -3750,7 +3767,7 @@ class indexedDB {
|
|
|
3750
3767
|
}
|
|
3751
3768
|
else {
|
|
3752
3769
|
// 删除键
|
|
3753
|
-
|
|
3770
|
+
const request = idbStore.delete(key);
|
|
3754
3771
|
request.onsuccess = function (event) {
|
|
3755
3772
|
resolve({
|
|
3756
3773
|
success: true,
|
|
@@ -3775,10 +3792,10 @@ class indexedDB {
|
|
|
3775
3792
|
* 删除所有数据
|
|
3776
3793
|
*/
|
|
3777
3794
|
async deleteAll() {
|
|
3778
|
-
|
|
3795
|
+
const that = this;
|
|
3779
3796
|
return new Promise((resolve) => {
|
|
3780
3797
|
/* 清空数据库 */
|
|
3781
|
-
|
|
3798
|
+
const dbName = that.#dbName;
|
|
3782
3799
|
this.open(function (idbStore) {
|
|
3783
3800
|
if (idbStore == null) {
|
|
3784
3801
|
resolve({
|
|
@@ -3789,7 +3806,7 @@ class indexedDB {
|
|
|
3789
3806
|
}
|
|
3790
3807
|
else {
|
|
3791
3808
|
// 清空
|
|
3792
|
-
|
|
3809
|
+
const operateResult = idbStore.clear();
|
|
3793
3810
|
operateResult.onsuccess = function (event) {
|
|
3794
3811
|
resolve({
|
|
3795
3812
|
success: true,
|
|
@@ -3822,7 +3839,7 @@ class LockFunction {
|
|
|
3822
3839
|
run;
|
|
3823
3840
|
isLock;
|
|
3824
3841
|
constructor(callback, context, delayTime) {
|
|
3825
|
-
|
|
3842
|
+
const that = this;
|
|
3826
3843
|
this.#callback = callback;
|
|
3827
3844
|
if (typeof context === "number") {
|
|
3828
3845
|
this.#delayTime = context;
|
|
@@ -3912,14 +3929,14 @@ class Log {
|
|
|
3912
3929
|
* @param stack
|
|
3913
3930
|
*/
|
|
3914
3931
|
parseErrorStack(stack) {
|
|
3915
|
-
|
|
3932
|
+
const result = {
|
|
3916
3933
|
name: "",
|
|
3917
3934
|
position: "",
|
|
3918
3935
|
};
|
|
3919
3936
|
for (let stackString of stack) {
|
|
3920
3937
|
stackString = stackString.trim();
|
|
3921
|
-
|
|
3922
|
-
|
|
3938
|
+
const stackFunctionNameMatch = stackString.match(/^at[\s]+(.+?)[\s]+/i);
|
|
3939
|
+
const stackFunctionNamePositionMatch = stackString.match(/^at[\s]+.+[\s]+\((.+?)\)/i);
|
|
3923
3940
|
if (stackFunctionNameMatch == null) {
|
|
3924
3941
|
continue;
|
|
3925
3942
|
}
|
|
@@ -3927,8 +3944,8 @@ class Log {
|
|
|
3927
3944
|
continue;
|
|
3928
3945
|
}
|
|
3929
3946
|
/* 获取最后一个,因为第一个是包含了at */
|
|
3930
|
-
|
|
3931
|
-
|
|
3947
|
+
const stackFunctionName = stackFunctionNameMatch[stackFunctionNameMatch.length - 1];
|
|
3948
|
+
const stackFunctionNamePosition = stackFunctionNamePositionMatch[stackFunctionNamePositionMatch.length - 1];
|
|
3932
3949
|
if (stackFunctionName === "" ||
|
|
3933
3950
|
stackFunctionName.match(/^(Utils\.|)Log(\.|)|.<anonymous>$|^Function.each|^NodeList.forEach|^k.fn.init.each/g)) {
|
|
3934
3951
|
continue;
|
|
@@ -3940,9 +3957,9 @@ class Log {
|
|
|
3940
3957
|
}
|
|
3941
3958
|
}
|
|
3942
3959
|
if (result.position === "") {
|
|
3943
|
-
|
|
3960
|
+
const lastStackString = stack[stack.length - 1].trim();
|
|
3944
3961
|
if (lastStackString.startsWith("at chrome-extension://")) {
|
|
3945
|
-
|
|
3962
|
+
const lastStackMatch = lastStackString.match(/^at[\s]+(.+)/);
|
|
3946
3963
|
if (lastStackMatch) {
|
|
3947
3964
|
result.position = lastStackMatch[lastStackMatch.length - 1];
|
|
3948
3965
|
}
|
|
@@ -3972,16 +3989,18 @@ class Log {
|
|
|
3972
3989
|
printContent(msg, color, otherStyle) {
|
|
3973
3990
|
this.checkClearConsole();
|
|
3974
3991
|
otherStyle = otherStyle || "";
|
|
3975
|
-
|
|
3992
|
+
const stackSplit = new Error().stack.split("\n");
|
|
3976
3993
|
stackSplit.splice(0, 2);
|
|
3977
|
-
|
|
3978
|
-
|
|
3979
|
-
|
|
3994
|
+
const { name: callerName, position: callerPosition } = this.parseErrorStack(stackSplit);
|
|
3995
|
+
const tagName = this.tag;
|
|
3996
|
+
const that = this;
|
|
3980
3997
|
/** tag的html输出格式 */
|
|
3981
|
-
|
|
3998
|
+
const tagNameHTML = `%c[${tagName}%c`;
|
|
3982
3999
|
/** 调用的函数名的html输出格式 */
|
|
3983
4000
|
let callerNameHTML = `%c${callerName}%c]%c`;
|
|
3984
|
-
callerName.trim()
|
|
4001
|
+
if (callerName.trim() === "") {
|
|
4002
|
+
callerNameHTML = `-${callerNameHTML}`;
|
|
4003
|
+
}
|
|
3985
4004
|
/**
|
|
3986
4005
|
* 输出消息到控制台
|
|
3987
4006
|
* @param message
|
|
@@ -4067,14 +4086,14 @@ class Log {
|
|
|
4067
4086
|
if (this.#disable)
|
|
4068
4087
|
return;
|
|
4069
4088
|
this.checkClearConsole();
|
|
4070
|
-
|
|
4089
|
+
const stack = new Error().stack.split("\n");
|
|
4071
4090
|
stack.splice(0, 1);
|
|
4072
|
-
|
|
4091
|
+
const errorStackParse = this.parseErrorStack(stack);
|
|
4073
4092
|
/** 堆栈函数名 */
|
|
4074
|
-
|
|
4093
|
+
const stackFunctionName = errorStackParse.name;
|
|
4075
4094
|
/** 堆栈位置 */
|
|
4076
|
-
|
|
4077
|
-
|
|
4095
|
+
const stackFunctionNamePosition = errorStackParse.position;
|
|
4096
|
+
const callerName = stackFunctionName;
|
|
4078
4097
|
this.#console.log(`%c[${this.tag}%c-%c${callerName}%c]%c`, ...this.#msgColorDetails, `color: ${this.#details.infoColor};`);
|
|
4079
4098
|
this.#console.table(msg);
|
|
4080
4099
|
if (this.#details.debug) {
|
|
@@ -4137,9 +4156,9 @@ class Progress {
|
|
|
4137
4156
|
*/
|
|
4138
4157
|
circleRadius: 50,
|
|
4139
4158
|
};
|
|
4140
|
-
#ctx
|
|
4141
|
-
#width
|
|
4142
|
-
#height
|
|
4159
|
+
#ctx;
|
|
4160
|
+
#width;
|
|
4161
|
+
#height;
|
|
4143
4162
|
/**
|
|
4144
4163
|
*
|
|
4145
4164
|
* @param paramConfig 配置信息
|
|
@@ -4149,14 +4168,8 @@ class Progress {
|
|
|
4149
4168
|
if (!(this.#config.canvasNode instanceof HTMLCanvasElement)) {
|
|
4150
4169
|
throw new Error("Utils.Progress 参数 canvasNode 必须是 HTMLCanvasElement");
|
|
4151
4170
|
}
|
|
4152
|
-
this.init();
|
|
4153
|
-
}
|
|
4154
|
-
/**
|
|
4155
|
-
* 初始化
|
|
4156
|
-
*/
|
|
4157
|
-
init() {
|
|
4158
4171
|
/* 获取画笔 */
|
|
4159
|
-
|
|
4172
|
+
const ctx = this.#config.canvasNode.getContext("2d");
|
|
4160
4173
|
if (ctx == null) {
|
|
4161
4174
|
throw new Error("Utils.Progress 获取画笔失败");
|
|
4162
4175
|
}
|
|
@@ -4167,8 +4180,8 @@ class Progress {
|
|
|
4167
4180
|
this.#height = this.#config.canvasNode.height;
|
|
4168
4181
|
/* 清除锯齿 */
|
|
4169
4182
|
if (window.devicePixelRatio) {
|
|
4170
|
-
this.#config.canvasNode.style.width = this.#width
|
|
4171
|
-
this.#config.canvasNode.style.height = this.#height
|
|
4183
|
+
this.#config.canvasNode.style.width = `${this.#width}px`;
|
|
4184
|
+
this.#config.canvasNode.style.height = `${this.#height}px`;
|
|
4172
4185
|
this.#config.canvasNode.height = this.#height * window.devicePixelRatio;
|
|
4173
4186
|
this.#config.canvasNode.width = this.#width * window.devicePixelRatio;
|
|
4174
4187
|
this.#ctx.scale(window.devicePixelRatio, window.devicePixelRatio);
|
|
@@ -4180,7 +4193,7 @@ class Progress {
|
|
|
4180
4193
|
* 绘制
|
|
4181
4194
|
*/
|
|
4182
4195
|
draw() {
|
|
4183
|
-
|
|
4196
|
+
const degActive = (this.#config.progress * 360) / 100;
|
|
4184
4197
|
/* 清除画布 */
|
|
4185
4198
|
this.#ctx.clearRect(0, 0, this.#width, this.#height);
|
|
4186
4199
|
/* 开始绘制底圆 */
|
|
@@ -4194,11 +4207,11 @@ class Progress {
|
|
|
4194
4207
|
this.#ctx.strokeStyle = this.#config.lineColor;
|
|
4195
4208
|
this.#ctx.stroke();
|
|
4196
4209
|
/* 获取百分比 */
|
|
4197
|
-
|
|
4198
|
-
this.#ctx.font = this.#config.fontSize
|
|
4210
|
+
const txt = `${parseInt(this.#config.progress.toString())}%`;
|
|
4211
|
+
this.#ctx.font = `${this.#config.fontSize}px SimHei`;
|
|
4199
4212
|
/* 获取文本宽度 */
|
|
4200
|
-
|
|
4201
|
-
|
|
4213
|
+
const w = this.#ctx.measureText(txt).width;
|
|
4214
|
+
const h = this.#config.fontSize / 2;
|
|
4202
4215
|
this.#ctx.fillStyle = this.#config.textColor;
|
|
4203
4216
|
this.#ctx.fillText(txt, this.#width / 2 - w / 2, this.#height / 2 + h / 2);
|
|
4204
4217
|
}
|
|
@@ -4222,9 +4235,9 @@ class UtilsDictionary {
|
|
|
4222
4235
|
* 迭代器
|
|
4223
4236
|
*/
|
|
4224
4237
|
get entries() {
|
|
4225
|
-
|
|
4238
|
+
const that = this;
|
|
4226
4239
|
return function* () {
|
|
4227
|
-
|
|
4240
|
+
const itemKeys = Object.keys(that.getItems());
|
|
4228
4241
|
for (const keyName of itemKeys) {
|
|
4229
4242
|
yield [keyName, that.get(keyName)];
|
|
4230
4243
|
}
|
|
@@ -4234,9 +4247,8 @@ class UtilsDictionary {
|
|
|
4234
4247
|
* 是否可遍历
|
|
4235
4248
|
*/
|
|
4236
4249
|
get [Symbol.iterator]() {
|
|
4237
|
-
|
|
4238
|
-
|
|
4239
|
-
return that.entries();
|
|
4250
|
+
return () => {
|
|
4251
|
+
return this.entries();
|
|
4240
4252
|
};
|
|
4241
4253
|
}
|
|
4242
4254
|
/**
|
|
@@ -4323,7 +4335,7 @@ class UtilsDictionary {
|
|
|
4323
4335
|
* @param callbackfn 回调函数
|
|
4324
4336
|
*/
|
|
4325
4337
|
forEach(callbackfn) {
|
|
4326
|
-
this.items.forEach((value, key
|
|
4338
|
+
this.items.forEach((value, key) => {
|
|
4327
4339
|
callbackfn(value, key, this);
|
|
4328
4340
|
});
|
|
4329
4341
|
}
|
|
@@ -4415,6 +4427,7 @@ class WindowApi {
|
|
|
4415
4427
|
}
|
|
4416
4428
|
}
|
|
4417
4429
|
|
|
4430
|
+
// @ts-nocheck
|
|
4418
4431
|
const VueUtils = {
|
|
4419
4432
|
/** 标签 */
|
|
4420
4433
|
ReactiveFlags: {
|
|
@@ -4453,10 +4466,10 @@ class ReactiveEffect {
|
|
|
4453
4466
|
deps = [];
|
|
4454
4467
|
active = true;
|
|
4455
4468
|
fn;
|
|
4456
|
-
|
|
4469
|
+
scheduler;
|
|
4457
4470
|
constructor(fn, scheduler) {
|
|
4458
4471
|
this.fn = fn;
|
|
4459
|
-
|
|
4472
|
+
this.scheduler = scheduler;
|
|
4460
4473
|
}
|
|
4461
4474
|
run(cb) {
|
|
4462
4475
|
if (!this.active) {
|
|
@@ -4528,7 +4541,7 @@ class Vue {
|
|
|
4528
4541
|
if (VueUtils.isReactive(target)) {
|
|
4529
4542
|
return target;
|
|
4530
4543
|
}
|
|
4531
|
-
|
|
4544
|
+
const exisProxy = this.reactMap.get(target);
|
|
4532
4545
|
if (exisProxy) {
|
|
4533
4546
|
return exisProxy;
|
|
4534
4547
|
}
|
|
@@ -4541,8 +4554,8 @@ class Vue {
|
|
|
4541
4554
|
return Reflect.get(target, key, receiver);
|
|
4542
4555
|
},
|
|
4543
4556
|
set(target, key, value, receiver) {
|
|
4544
|
-
|
|
4545
|
-
|
|
4557
|
+
const oldValue = target[key];
|
|
4558
|
+
const result = Reflect.set(target, key, value, receiver);
|
|
4546
4559
|
if (oldValue !== value) {
|
|
4547
4560
|
that.trigger(target, "set", key, oldValue, value);
|
|
4548
4561
|
}
|
|
@@ -4592,11 +4605,12 @@ class Vue {
|
|
|
4592
4605
|
}
|
|
4593
4606
|
toRefs(object) {
|
|
4594
4607
|
const result = VueUtils.isArray(object) ? new Array(object.length) : {};
|
|
4595
|
-
for (
|
|
4608
|
+
for (const key in object) {
|
|
4596
4609
|
result[key] = this.toRef(object, key);
|
|
4597
4610
|
}
|
|
4598
4611
|
return result;
|
|
4599
4612
|
}
|
|
4613
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
4600
4614
|
trigger(target, type, key, oldValue, value) {
|
|
4601
4615
|
const depsMap = this.targetMap.get(target);
|
|
4602
4616
|
if (!depsMap)
|
|
@@ -4604,8 +4618,9 @@ class Vue {
|
|
|
4604
4618
|
const effects = depsMap.get(key);
|
|
4605
4619
|
this.triggerEffect(effects, "effects");
|
|
4606
4620
|
}
|
|
4621
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
4607
4622
|
triggerEffect(effects, name) {
|
|
4608
|
-
effects
|
|
4623
|
+
if (effects) {
|
|
4609
4624
|
effects.forEach((effect) => {
|
|
4610
4625
|
if (effect.scheduler) {
|
|
4611
4626
|
effect.scheduler();
|
|
@@ -4614,6 +4629,7 @@ class Vue {
|
|
|
4614
4629
|
effect.run();
|
|
4615
4630
|
}
|
|
4616
4631
|
});
|
|
4632
|
+
}
|
|
4617
4633
|
}
|
|
4618
4634
|
track(target, type, key) {
|
|
4619
4635
|
if (!this.activeEffect)
|
|
@@ -4630,7 +4646,7 @@ class Vue {
|
|
|
4630
4646
|
}
|
|
4631
4647
|
trackEffect(dep) {
|
|
4632
4648
|
if (this.activeEffect) {
|
|
4633
|
-
|
|
4649
|
+
const shouldTrack = !dep.has(this.activeEffect);
|
|
4634
4650
|
if (shouldTrack) {
|
|
4635
4651
|
dep.add(this.activeEffect);
|
|
4636
4652
|
this.activeEffect.deps.push(dep);
|
|
@@ -4644,7 +4660,7 @@ class Vue {
|
|
|
4644
4660
|
return value;
|
|
4645
4661
|
}
|
|
4646
4662
|
set.add(value);
|
|
4647
|
-
for (
|
|
4663
|
+
for (const key in value) {
|
|
4648
4664
|
this.traversal(value[key], set);
|
|
4649
4665
|
}
|
|
4650
4666
|
return value;
|
|
@@ -4896,6 +4912,7 @@ const clearTimeout$1 = (timerId) => loadOrReturnBroker().clearTimeout(timerId);
|
|
|
4896
4912
|
const setInterval = (...args) => loadOrReturnBroker().setInterval(...args);
|
|
4897
4913
|
const setTimeout$1 = (...args) => loadOrReturnBroker().setTimeout(...args);
|
|
4898
4914
|
|
|
4915
|
+
/* eslint-disable */
|
|
4899
4916
|
// ==UserScript==
|
|
4900
4917
|
// @name ModuleRaid.js
|
|
4901
4918
|
// @namespace http://tampermonkey.net/
|
|
@@ -5313,28 +5330,26 @@ class DOMUtils {
|
|
|
5313
5330
|
return $ele?.innerHTML?.trim() === "";
|
|
5314
5331
|
});
|
|
5315
5332
|
}
|
|
5316
|
-
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) ||
|
|
5317
|
-
selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5333
|
+
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5318
5334
|
// contains 语法
|
|
5319
|
-
|
|
5320
|
-
|
|
5335
|
+
const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
|
|
5336
|
+
const text = textMatch[2];
|
|
5321
5337
|
selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
|
|
5322
5338
|
return Array.from(parent.querySelectorAll(selector)).filter(($ele) => {
|
|
5323
5339
|
return ($ele?.textContent || $ele?.innerText)?.includes(text);
|
|
5324
5340
|
});
|
|
5325
5341
|
}
|
|
5326
|
-
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) ||
|
|
5327
|
-
selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5342
|
+
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5328
5343
|
// regexp 语法
|
|
5329
|
-
|
|
5344
|
+
const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
|
|
5330
5345
|
let pattern = textMatch[2];
|
|
5331
|
-
|
|
5346
|
+
const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
|
|
5332
5347
|
let flags = "";
|
|
5333
5348
|
if (flagMatch) {
|
|
5334
5349
|
pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
|
|
5335
5350
|
flags = flagMatch[3];
|
|
5336
5351
|
}
|
|
5337
|
-
|
|
5352
|
+
const regexp = new RegExp(pattern, flags);
|
|
5338
5353
|
selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
|
|
5339
5354
|
return Array.from(parent.querySelectorAll(selector)).filter(($ele) => {
|
|
5340
5355
|
return Boolean(($ele?.textContent || $ele?.innerText)?.match(regexp));
|
|
@@ -5376,11 +5391,10 @@ class DOMUtils {
|
|
|
5376
5391
|
selector = selector.replace(/:empty$/gi, "");
|
|
5377
5392
|
return $el.matches(selector) && $el?.innerHTML?.trim() === "";
|
|
5378
5393
|
}
|
|
5379
|
-
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) ||
|
|
5380
|
-
selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5394
|
+
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5381
5395
|
// contains 语法
|
|
5382
|
-
|
|
5383
|
-
|
|
5396
|
+
const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
|
|
5397
|
+
const text = textMatch[2];
|
|
5384
5398
|
selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
|
|
5385
5399
|
let content = $el?.textContent || $el?.innerText;
|
|
5386
5400
|
if (typeof content !== "string") {
|
|
@@ -5388,18 +5402,17 @@ class DOMUtils {
|
|
|
5388
5402
|
}
|
|
5389
5403
|
return $el.matches(selector) && content?.includes(text);
|
|
5390
5404
|
}
|
|
5391
|
-
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) ||
|
|
5392
|
-
selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5405
|
+
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5393
5406
|
// regexp 语法
|
|
5394
|
-
|
|
5407
|
+
const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
|
|
5395
5408
|
let pattern = textMatch[2];
|
|
5396
|
-
|
|
5409
|
+
const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
|
|
5397
5410
|
let flags = "";
|
|
5398
5411
|
if (flagMatch) {
|
|
5399
5412
|
pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
|
|
5400
5413
|
flags = flagMatch[3];
|
|
5401
5414
|
}
|
|
5402
|
-
|
|
5415
|
+
const regexp = new RegExp(pattern, flags);
|
|
5403
5416
|
selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
|
|
5404
5417
|
let content = $el?.textContent || $el?.innerText;
|
|
5405
5418
|
if (typeof content !== "string") {
|
|
@@ -5417,43 +5430,41 @@ class DOMUtils {
|
|
|
5417
5430
|
if (selector.match(/[^\s]{1}:empty$/gi)) {
|
|
5418
5431
|
// empty 语法
|
|
5419
5432
|
selector = selector.replace(/:empty$/gi, "");
|
|
5420
|
-
|
|
5433
|
+
const $closest = $el?.closest(selector);
|
|
5421
5434
|
if ($closest && $closest?.innerHTML?.trim() === "") {
|
|
5422
5435
|
return $closest;
|
|
5423
5436
|
}
|
|
5424
5437
|
return null;
|
|
5425
5438
|
}
|
|
5426
|
-
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) ||
|
|
5427
|
-
selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5439
|
+
else if (selector.match(/[^\s]{1}:contains\("(.*)"\)$/i) || selector.match(/[^\s]{1}:contains\('(.*)'\)$/i)) {
|
|
5428
5440
|
// contains 语法
|
|
5429
|
-
|
|
5430
|
-
|
|
5441
|
+
const textMatch = selector.match(/:contains\(("|')(.*)("|')\)$/i);
|
|
5442
|
+
const text = textMatch[2];
|
|
5431
5443
|
selector = selector.replace(/:contains\(("|')(.*)("|')\)$/gi, "");
|
|
5432
|
-
|
|
5444
|
+
const $closest = $el?.closest(selector);
|
|
5433
5445
|
if ($closest) {
|
|
5434
|
-
|
|
5446
|
+
const content = $el?.textContent || $el?.innerText;
|
|
5435
5447
|
if (typeof content === "string" && content.includes(text)) {
|
|
5436
5448
|
return $closest;
|
|
5437
5449
|
}
|
|
5438
5450
|
}
|
|
5439
5451
|
return null;
|
|
5440
5452
|
}
|
|
5441
|
-
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) ||
|
|
5442
|
-
selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5453
|
+
else if (selector.match(/[^\s]{1}:regexp\("(.*)"\)$/i) || selector.match(/[^\s]{1}:regexp\('(.*)'\)$/i)) {
|
|
5443
5454
|
// regexp 语法
|
|
5444
|
-
|
|
5455
|
+
const textMatch = selector.match(/:regexp\(("|')(.*)("|')\)$/i);
|
|
5445
5456
|
let pattern = textMatch[2];
|
|
5446
|
-
|
|
5457
|
+
const flagMatch = pattern.match(/("|'),[\s]*("|')([igm]{0,3})$/i);
|
|
5447
5458
|
let flags = "";
|
|
5448
5459
|
if (flagMatch) {
|
|
5449
5460
|
pattern = pattern.replace(/("|'),[\s]*("|')([igm]{0,3})$/gi, "");
|
|
5450
5461
|
flags = flagMatch[3];
|
|
5451
5462
|
}
|
|
5452
|
-
|
|
5463
|
+
const regexp = new RegExp(pattern, flags);
|
|
5453
5464
|
selector = selector.replace(/:regexp\(("|')(.*)("|')\)$/gi, "");
|
|
5454
|
-
|
|
5465
|
+
const $closest = $el?.closest(selector);
|
|
5455
5466
|
if ($closest) {
|
|
5456
|
-
|
|
5467
|
+
const content = $el?.textContent || $el?.innerText;
|
|
5457
5468
|
if (typeof content === "string" && content.match(regexp)) {
|
|
5458
5469
|
return $closest;
|
|
5459
5470
|
}
|
|
@@ -5462,12 +5473,14 @@ class DOMUtils {
|
|
|
5462
5473
|
}
|
|
5463
5474
|
else {
|
|
5464
5475
|
// 普通语法
|
|
5465
|
-
|
|
5476
|
+
const $closest = $el?.closest(selector);
|
|
5466
5477
|
return $closest;
|
|
5467
5478
|
}
|
|
5468
5479
|
}
|
|
5469
5480
|
}
|
|
5470
|
-
|
|
5481
|
+
const domUtils = new DOMUtils();
|
|
5482
|
+
|
|
5483
|
+
const version = "2.8.2";
|
|
5471
5484
|
|
|
5472
5485
|
class Utils {
|
|
5473
5486
|
windowApi;
|
|
@@ -5475,12 +5488,12 @@ class Utils {
|
|
|
5475
5488
|
this.windowApi = new WindowApi(option);
|
|
5476
5489
|
}
|
|
5477
5490
|
/** 版本号 */
|
|
5478
|
-
version =
|
|
5491
|
+
version = version;
|
|
5479
5492
|
addStyle(cssText) {
|
|
5480
5493
|
if (typeof cssText !== "string") {
|
|
5481
5494
|
throw new Error("Utils.addStyle 参数cssText 必须为String类型");
|
|
5482
5495
|
}
|
|
5483
|
-
|
|
5496
|
+
const cssNode = this.windowApi.document.createElement("style");
|
|
5484
5497
|
cssNode.setAttribute("type", "text/css");
|
|
5485
5498
|
cssNode.innerHTML = cssText;
|
|
5486
5499
|
if (this.windowApi.document.head) {
|
|
@@ -5502,23 +5515,23 @@ class Utils {
|
|
|
5502
5515
|
return cssNode;
|
|
5503
5516
|
}
|
|
5504
5517
|
/**
|
|
5505
|
-
|
|
5506
|
-
|
|
5507
|
-
|
|
5508
|
-
|
|
5509
|
-
|
|
5510
|
-
|
|
5511
|
-
|
|
5512
|
-
|
|
5513
|
-
|
|
5514
|
-
|
|
5515
|
-
|
|
5516
|
-
|
|
5517
|
-
|
|
5518
|
-
|
|
5518
|
+
* JSON数据从源端替换到目标端中,如果目标端存在该数据则替换,不添加,返回结果为目标端替换完毕的结果
|
|
5519
|
+
* @param target 目标数据
|
|
5520
|
+
* @param source 源数据
|
|
5521
|
+
* @param isAdd 是否可以追加键,默认false
|
|
5522
|
+
* @example
|
|
5523
|
+
* Utils.assign({"1":1,"2":{"3":3}}, {"2":{"3":4}});
|
|
5524
|
+
* >
|
|
5525
|
+
* {
|
|
5526
|
+
"1": 1,
|
|
5527
|
+
"2": {
|
|
5528
|
+
"3": 4
|
|
5529
|
+
}
|
|
5530
|
+
}
|
|
5531
|
+
*/
|
|
5519
5532
|
assign = commonUtil.assign.bind(commonUtil);
|
|
5520
5533
|
async asyncReplaceAll(string, pattern, asyncFn) {
|
|
5521
|
-
|
|
5534
|
+
const UtilsContext = this;
|
|
5522
5535
|
if (typeof string !== "string") {
|
|
5523
5536
|
throw new TypeError("string必须是字符串");
|
|
5524
5537
|
}
|
|
@@ -5590,18 +5603,18 @@ class Utils {
|
|
|
5590
5603
|
canvasElement.dispatchEvent(new MouseEvent("mouseup", eventInit));
|
|
5591
5604
|
}
|
|
5592
5605
|
checkUserClickInNode(element) {
|
|
5593
|
-
|
|
5606
|
+
const UtilsContext = this;
|
|
5594
5607
|
if (!UtilsContext.isDOM(element)) {
|
|
5595
5608
|
throw new Error("Utils.checkUserClickInNode 参数 targetNode 必须为 Element|Node 类型");
|
|
5596
5609
|
}
|
|
5597
|
-
|
|
5598
|
-
|
|
5599
|
-
|
|
5610
|
+
const clickEvent = UtilsContext.windowApi.window.event;
|
|
5611
|
+
const touchEvent = UtilsContext.windowApi.window.event;
|
|
5612
|
+
const $click = clickEvent?.composedPath()?.[0];
|
|
5600
5613
|
// 点击的x坐标
|
|
5601
|
-
|
|
5614
|
+
const clickPosX = clickEvent?.clientX != null ? clickEvent.clientX : touchEvent.touches[0].clientX;
|
|
5602
5615
|
// 点击的y坐标
|
|
5603
|
-
|
|
5604
|
-
|
|
5616
|
+
const clickPosY = clickEvent?.clientY != null ? clickEvent.clientY : touchEvent.touches[0].clientY;
|
|
5617
|
+
const {
|
|
5605
5618
|
/* 要检测的元素的相对屏幕的横坐标最左边 */
|
|
5606
5619
|
left: elementPosXLeft,
|
|
5607
5620
|
/* 要检测的元素的相对屏幕的横坐标最右边 */
|
|
@@ -5629,32 +5642,32 @@ class Utils {
|
|
|
5629
5642
|
* @param formData 需要clone的数据
|
|
5630
5643
|
*/
|
|
5631
5644
|
cloneFormData(formData, filterFn) {
|
|
5632
|
-
|
|
5633
|
-
|
|
5634
|
-
|
|
5645
|
+
const clonedFormData = new FormData();
|
|
5646
|
+
formData.forEach((value, key) => {
|
|
5647
|
+
const isFilter = typeof filterFn === "function" ? filterFn(key, value) : false;
|
|
5635
5648
|
if (typeof isFilter === "boolean" && isFilter) {
|
|
5636
|
-
|
|
5649
|
+
return;
|
|
5637
5650
|
}
|
|
5638
5651
|
clonedFormData.append(key, value);
|
|
5639
|
-
}
|
|
5652
|
+
});
|
|
5640
5653
|
return clonedFormData;
|
|
5641
5654
|
}
|
|
5642
5655
|
createOverload() {
|
|
5643
|
-
|
|
5656
|
+
const fnMap = new Map();
|
|
5644
5657
|
function overload(...args) {
|
|
5645
|
-
|
|
5646
|
-
|
|
5658
|
+
const key = args.map((it) => typeof it).join(",");
|
|
5659
|
+
const fn = fnMap.get(key);
|
|
5647
5660
|
if (!fn) {
|
|
5648
5661
|
throw new TypeError("没有找到对应的实现");
|
|
5649
5662
|
}
|
|
5650
5663
|
return fn.apply(this, args);
|
|
5651
5664
|
}
|
|
5652
5665
|
overload.addImpl = function (...args) {
|
|
5653
|
-
|
|
5666
|
+
const fn = args.pop();
|
|
5654
5667
|
if (typeof fn !== "function") {
|
|
5655
5668
|
throw new TypeError("最后一个参数必须是函数");
|
|
5656
5669
|
}
|
|
5657
|
-
|
|
5670
|
+
const key = args.join(",");
|
|
5658
5671
|
fnMap.set(key, fn);
|
|
5659
5672
|
};
|
|
5660
5673
|
return overload;
|
|
@@ -5671,7 +5684,7 @@ class Utils {
|
|
|
5671
5684
|
deepClone = commonUtil.deepClone.bind(commonUtil);
|
|
5672
5685
|
debounce(fn, delay = 0) {
|
|
5673
5686
|
let timer = null;
|
|
5674
|
-
|
|
5687
|
+
const UtilsContext = this;
|
|
5675
5688
|
return function (...args) {
|
|
5676
5689
|
UtilsContext.workerClearTimeout(timer);
|
|
5677
5690
|
timer = UtilsContext.workerSetTimeout(function () {
|
|
@@ -5680,7 +5693,7 @@ class Utils {
|
|
|
5680
5693
|
};
|
|
5681
5694
|
}
|
|
5682
5695
|
deleteParentNode(element, targetSelector) {
|
|
5683
|
-
|
|
5696
|
+
const UtilsContext = this;
|
|
5684
5697
|
if (element == null) {
|
|
5685
5698
|
return;
|
|
5686
5699
|
}
|
|
@@ -5691,7 +5704,7 @@ class Utils {
|
|
|
5691
5704
|
throw new Error("Utils.deleteParentNode 参数 targetSelector 必须为 string 类型");
|
|
5692
5705
|
}
|
|
5693
5706
|
let result = false;
|
|
5694
|
-
|
|
5707
|
+
const needRemoveDOM = domUtils.closest(element, targetSelector);
|
|
5695
5708
|
if (needRemoveDOM) {
|
|
5696
5709
|
needRemoveDOM.remove();
|
|
5697
5710
|
result = true;
|
|
@@ -5721,7 +5734,7 @@ class Utils {
|
|
|
5721
5734
|
eventNameList = [...eventName];
|
|
5722
5735
|
}
|
|
5723
5736
|
eventNameList.forEach((_eventName_) => {
|
|
5724
|
-
|
|
5737
|
+
const event = new Event(_eventName_);
|
|
5725
5738
|
if (details) {
|
|
5726
5739
|
Object.assign(event, details);
|
|
5727
5740
|
}
|
|
@@ -5729,7 +5742,7 @@ class Utils {
|
|
|
5729
5742
|
});
|
|
5730
5743
|
}
|
|
5731
5744
|
downloadBase64(base64Data, fileName, isIFrame = false) {
|
|
5732
|
-
|
|
5745
|
+
const UtilsContext = this;
|
|
5733
5746
|
if (typeof base64Data !== "string") {
|
|
5734
5747
|
throw new Error("Utils.downloadBase64 参数 base64Data 必须为 string 类型");
|
|
5735
5748
|
}
|
|
@@ -5761,7 +5774,7 @@ class Utils {
|
|
|
5761
5774
|
let strFound;
|
|
5762
5775
|
if (this.windowApi.globalThis.find) {
|
|
5763
5776
|
/* CODE FOR BROWSERS THAT SUPPORT window.find */
|
|
5764
|
-
|
|
5777
|
+
const windowFind = this.windowApi.self.find;
|
|
5765
5778
|
strFound = windowFind(str, caseSensitive, true, true, false);
|
|
5766
5779
|
if (strFound && this.windowApi.self.getSelection && !this.windowApi.self.getSelection().anchorNode) {
|
|
5767
5780
|
strFound = windowFind(str, caseSensitive, true, true, false);
|
|
@@ -5795,19 +5808,19 @@ class Utils {
|
|
|
5795
5808
|
return strFound ? true : false;
|
|
5796
5809
|
}
|
|
5797
5810
|
*findElementsWithText(element, text, filter) {
|
|
5798
|
-
|
|
5811
|
+
const that = this;
|
|
5799
5812
|
if (element.outerHTML.includes(text)) {
|
|
5800
5813
|
if (element.children.length === 0) {
|
|
5801
|
-
|
|
5814
|
+
const filterResult = typeof filter === "function" ? filter(element) : false;
|
|
5802
5815
|
if (!filterResult) {
|
|
5803
5816
|
yield element;
|
|
5804
5817
|
}
|
|
5805
5818
|
}
|
|
5806
5819
|
else {
|
|
5807
|
-
|
|
5808
|
-
for (
|
|
5820
|
+
const textElement = Array.from(element.childNodes).filter((ele) => ele.nodeType === Node.TEXT_NODE);
|
|
5821
|
+
for (const $child of textElement) {
|
|
5809
5822
|
if ($child.textContent.includes(text)) {
|
|
5810
|
-
|
|
5823
|
+
const filterResult = typeof filter === "function" ? filter(element) : false;
|
|
5811
5824
|
if (!filterResult) {
|
|
5812
5825
|
yield $child;
|
|
5813
5826
|
}
|
|
@@ -5816,7 +5829,7 @@ class Utils {
|
|
|
5816
5829
|
}
|
|
5817
5830
|
}
|
|
5818
5831
|
for (let index = 0; index < element.children.length; index++) {
|
|
5819
|
-
|
|
5832
|
+
const $child = element.children[index];
|
|
5820
5833
|
yield* that.findElementsWithText($child, text, filter);
|
|
5821
5834
|
}
|
|
5822
5835
|
}
|
|
@@ -5830,8 +5843,8 @@ class Utils {
|
|
|
5830
5843
|
findVisibleElement(element) {
|
|
5831
5844
|
let currentElement = element;
|
|
5832
5845
|
while (currentElement) {
|
|
5833
|
-
|
|
5834
|
-
if (
|
|
5846
|
+
const elementRect = currentElement.getBoundingClientRect();
|
|
5847
|
+
if (elementRect.length) {
|
|
5835
5848
|
return currentElement;
|
|
5836
5849
|
}
|
|
5837
5850
|
currentElement = currentElement.parentElement;
|
|
@@ -5845,7 +5858,7 @@ class Utils {
|
|
|
5845
5858
|
}
|
|
5846
5859
|
let result = 0;
|
|
5847
5860
|
let resultType = "KB";
|
|
5848
|
-
|
|
5861
|
+
const sizeData = {};
|
|
5849
5862
|
sizeData.B = 1;
|
|
5850
5863
|
sizeData.KB = 1024;
|
|
5851
5864
|
sizeData.MB = sizeData.KB * sizeData.KB;
|
|
@@ -5858,7 +5871,7 @@ class Utils {
|
|
|
5858
5871
|
sizeData.BB = sizeData.YB * sizeData.KB;
|
|
5859
5872
|
sizeData.NB = sizeData.BB * sizeData.KB;
|
|
5860
5873
|
sizeData.DB = sizeData.NB * sizeData.KB;
|
|
5861
|
-
for (
|
|
5874
|
+
for (const key in sizeData) {
|
|
5862
5875
|
result = byteSize / sizeData[key];
|
|
5863
5876
|
resultType = key;
|
|
5864
5877
|
if (sizeData.KB >= result) {
|
|
@@ -5871,7 +5884,7 @@ class Utils {
|
|
|
5871
5884
|
}
|
|
5872
5885
|
getNodeListValue(...args) {
|
|
5873
5886
|
let resultArray = [];
|
|
5874
|
-
for (
|
|
5887
|
+
for (const arg of args) {
|
|
5875
5888
|
let value = arg;
|
|
5876
5889
|
if (typeof arg === "function") {
|
|
5877
5890
|
/* 方法 */
|
|
@@ -5886,7 +5899,7 @@ class Utils {
|
|
|
5886
5899
|
}
|
|
5887
5900
|
getNonNullValue(...args) {
|
|
5888
5901
|
let resultValue = args[args.length - 1];
|
|
5889
|
-
|
|
5902
|
+
const UtilsContext = this;
|
|
5890
5903
|
for (const argValue of args) {
|
|
5891
5904
|
if (UtilsContext.isNotNull(argValue)) {
|
|
5892
5905
|
resultValue = argValue;
|
|
@@ -5896,7 +5909,7 @@ class Utils {
|
|
|
5896
5909
|
return resultValue;
|
|
5897
5910
|
}
|
|
5898
5911
|
formatTime(text = new Date(), formatType = "yyyy-MM-dd HH:mm:ss") {
|
|
5899
|
-
|
|
5912
|
+
const time = text == null ? new Date() : new Date(text);
|
|
5900
5913
|
/**
|
|
5901
5914
|
* 校验时间补0
|
|
5902
5915
|
* @param timeNum
|
|
@@ -5904,7 +5917,7 @@ class Utils {
|
|
|
5904
5917
|
*/
|
|
5905
5918
|
function checkTime(timeNum) {
|
|
5906
5919
|
if (timeNum < 10)
|
|
5907
|
-
return
|
|
5920
|
+
return `0${timeNum}`;
|
|
5908
5921
|
return timeNum;
|
|
5909
5922
|
}
|
|
5910
5923
|
/**
|
|
@@ -5915,7 +5928,7 @@ class Utils {
|
|
|
5915
5928
|
function timeSystemChange(hourNum) {
|
|
5916
5929
|
return hourNum > 12 ? hourNum - 12 : hourNum;
|
|
5917
5930
|
}
|
|
5918
|
-
|
|
5931
|
+
const timeRegexp = {
|
|
5919
5932
|
yyyy: time.getFullYear(),
|
|
5920
5933
|
/* 年 */
|
|
5921
5934
|
MM: checkTime(time.getMonth() + 1),
|
|
@@ -5932,7 +5945,7 @@ class Utils {
|
|
|
5932
5945
|
/* 秒 */
|
|
5933
5946
|
};
|
|
5934
5947
|
Object.keys(timeRegexp).forEach(function (key) {
|
|
5935
|
-
|
|
5948
|
+
const replaecRegexp = new RegExp(key, "g");
|
|
5936
5949
|
formatType = formatType.replace(replaecRegexp, timeRegexp[key]);
|
|
5937
5950
|
});
|
|
5938
5951
|
return formatType;
|
|
@@ -5944,12 +5957,12 @@ class Utils {
|
|
|
5944
5957
|
}
|
|
5945
5958
|
if (text.length === 8) {
|
|
5946
5959
|
/* 该字符串只有时分秒 */
|
|
5947
|
-
|
|
5948
|
-
text = today.getFullYear()
|
|
5960
|
+
const today = new Date();
|
|
5961
|
+
text = `${today.getFullYear()}-${today.getMonth() + 1}-${today.getDate()} ${text}`;
|
|
5949
5962
|
}
|
|
5950
5963
|
text = text.substring(0, 19);
|
|
5951
5964
|
text = text.replace(/-/g, "/");
|
|
5952
|
-
|
|
5965
|
+
const timestamp = new Date(text).getTime();
|
|
5953
5966
|
return timestamp;
|
|
5954
5967
|
}
|
|
5955
5968
|
/**
|
|
@@ -5999,16 +6012,16 @@ class Utils {
|
|
|
5999
6012
|
if (timestamp2.toString().length === 10) {
|
|
6000
6013
|
timestamp2 = timestamp2 * 1000;
|
|
6001
6014
|
}
|
|
6002
|
-
|
|
6003
|
-
|
|
6004
|
-
|
|
6005
|
-
|
|
6006
|
-
|
|
6007
|
-
|
|
6008
|
-
|
|
6009
|
-
|
|
6010
|
-
|
|
6011
|
-
|
|
6015
|
+
const smallTimeStamp = timestamp1 > timestamp2 ? timestamp2 : timestamp1;
|
|
6016
|
+
const bigTimeStamp = timestamp1 > timestamp2 ? timestamp1 : timestamp2;
|
|
6017
|
+
const oneSecond = 1000; /* 一秒的毫秒数 */
|
|
6018
|
+
const oneMinute = 60 * oneSecond; /* 一分钟的毫秒数 */
|
|
6019
|
+
const oneHour = 60 * oneMinute; /* 一小时的毫秒数 */
|
|
6020
|
+
const oneDay = 24 * oneHour; /* 一天的毫秒数 */
|
|
6021
|
+
const oneMonth = 30 * oneDay; /* 一个月的毫秒数(30天) */
|
|
6022
|
+
const oneYear = 12 * oneMonth; /* 一年的毫秒数 */
|
|
6023
|
+
const bigDate = new Date(bigTimeStamp);
|
|
6024
|
+
const smallDate = new Date(smallTimeStamp);
|
|
6012
6025
|
let remainderValue = 1;
|
|
6013
6026
|
if (type === "年") {
|
|
6014
6027
|
remainderValue = oneYear;
|
|
@@ -6030,30 +6043,30 @@ class Utils {
|
|
|
6030
6043
|
}
|
|
6031
6044
|
let diffValue = Math.round(Math.abs((bigDate - smallDate) / remainderValue));
|
|
6032
6045
|
if (type === "auto") {
|
|
6033
|
-
|
|
6046
|
+
const timeDifference = bigTimeStamp - smallTimeStamp;
|
|
6034
6047
|
diffValue = Math.floor(timeDifference / (24 * 3600 * 1000));
|
|
6035
6048
|
if (diffValue > 0) {
|
|
6036
|
-
diffValue = diffValue
|
|
6049
|
+
diffValue = `${diffValue}天`;
|
|
6037
6050
|
}
|
|
6038
6051
|
else {
|
|
6039
6052
|
/* 计算出小时数 */
|
|
6040
|
-
|
|
6041
|
-
|
|
6053
|
+
const leave1 = timeDifference % (24 * 3600 * 1000); /* 计算天数后剩余的毫秒数 */
|
|
6054
|
+
const hours = Math.floor(leave1 / (3600 * 1000));
|
|
6042
6055
|
if (hours > 0) {
|
|
6043
|
-
diffValue = hours
|
|
6056
|
+
diffValue = `${hours}小时`;
|
|
6044
6057
|
}
|
|
6045
6058
|
else {
|
|
6046
6059
|
/* 计算相差分钟数 */
|
|
6047
|
-
|
|
6048
|
-
|
|
6060
|
+
const leave2 = leave1 % (3600 * 1000); /* 计算小时数后剩余的毫秒数 */
|
|
6061
|
+
const minutes = Math.floor(leave2 / (60 * 1000));
|
|
6049
6062
|
if (minutes > 0) {
|
|
6050
|
-
diffValue = minutes
|
|
6063
|
+
diffValue = `${minutes}分钟`;
|
|
6051
6064
|
}
|
|
6052
6065
|
else {
|
|
6053
6066
|
/* 计算相差秒数 */
|
|
6054
|
-
|
|
6055
|
-
|
|
6056
|
-
diffValue = seconds
|
|
6067
|
+
const leave3 = leave2 % (60 * 1000); /* 计算分钟数后剩余的毫秒数 */
|
|
6068
|
+
const seconds = Math.round(leave3 / 1000);
|
|
6069
|
+
diffValue = `${seconds}秒`;
|
|
6057
6070
|
}
|
|
6058
6071
|
}
|
|
6059
6072
|
}
|
|
@@ -6061,14 +6074,14 @@ class Utils {
|
|
|
6061
6074
|
return diffValue;
|
|
6062
6075
|
}
|
|
6063
6076
|
getElementSelector(element) {
|
|
6064
|
-
|
|
6077
|
+
const UtilsContext = this;
|
|
6065
6078
|
if (!element)
|
|
6066
6079
|
return void 0;
|
|
6067
6080
|
if (!element.parentElement)
|
|
6068
6081
|
return void 0;
|
|
6069
6082
|
/* 如果元素有id属性,则直接返回id选择器 */
|
|
6070
6083
|
if (element.id)
|
|
6071
|
-
return
|
|
6084
|
+
return `#${element.id}`;
|
|
6072
6085
|
/* 递归地获取父元素的选择器 */
|
|
6073
6086
|
let selector = UtilsContext.getElementSelector(element.parentElement);
|
|
6074
6087
|
if (!selector) {
|
|
@@ -6076,11 +6089,11 @@ class Utils {
|
|
|
6076
6089
|
}
|
|
6077
6090
|
/* 如果有多个相同类型的兄弟元素,则需要添加索引 */
|
|
6078
6091
|
if (element.parentElement.querySelectorAll(element.tagName).length > 1) {
|
|
6079
|
-
|
|
6080
|
-
selector +=
|
|
6092
|
+
const index = Array.prototype.indexOf.call(element.parentElement.children, element) + 1;
|
|
6093
|
+
selector += ` > ${element.tagName.toLowerCase()}:nth-child(${index})`;
|
|
6081
6094
|
}
|
|
6082
6095
|
else {
|
|
6083
|
-
selector +=
|
|
6096
|
+
selector += ` > ${element.tagName.toLowerCase()}`;
|
|
6084
6097
|
}
|
|
6085
6098
|
return selector;
|
|
6086
6099
|
}
|
|
@@ -6091,15 +6104,15 @@ class Utils {
|
|
|
6091
6104
|
* > 2
|
|
6092
6105
|
*/
|
|
6093
6106
|
getMaxValue(...args) {
|
|
6094
|
-
|
|
6107
|
+
const result = [...args];
|
|
6095
6108
|
let newResult = [];
|
|
6096
6109
|
if (result.length === 0) {
|
|
6097
6110
|
return void 0;
|
|
6098
6111
|
}
|
|
6099
6112
|
if (result.length > 1) {
|
|
6100
6113
|
if (result.length === 2 && typeof result[0] === "object" && typeof result[1] === "function") {
|
|
6101
|
-
|
|
6102
|
-
|
|
6114
|
+
const data = result[0];
|
|
6115
|
+
const handleDataFunc = result[1];
|
|
6103
6116
|
Object.keys(data).forEach((keyName) => {
|
|
6104
6117
|
newResult = [...newResult, handleDataFunc(keyName, data[keyName])];
|
|
6105
6118
|
});
|
|
@@ -6147,7 +6160,7 @@ class Utils {
|
|
|
6147
6160
|
*/
|
|
6148
6161
|
function queryMaxZIndex($ele) {
|
|
6149
6162
|
if (typeof ignoreCallBack === "function") {
|
|
6150
|
-
|
|
6163
|
+
const ignoreResult = ignoreCallBack($ele);
|
|
6151
6164
|
if (typeof ignoreResult === "boolean" && !ignoreResult) {
|
|
6152
6165
|
return;
|
|
6153
6166
|
}
|
|
@@ -6156,7 +6169,7 @@ class Utils {
|
|
|
6156
6169
|
const nodeStyle = UtilsContext.windowApi.window.getComputedStyle($ele);
|
|
6157
6170
|
/* 不对position为static和display为none的元素进行获取它们的z-index */
|
|
6158
6171
|
if (isVisibleNode(nodeStyle)) {
|
|
6159
|
-
|
|
6172
|
+
const nodeZIndex = parseInt(nodeStyle.zIndex);
|
|
6160
6173
|
if (!isNaN(nodeZIndex)) {
|
|
6161
6174
|
if (nodeZIndex > zIndex) {
|
|
6162
6175
|
// 赋值到全局
|
|
@@ -6172,7 +6185,7 @@ class Utils {
|
|
|
6172
6185
|
}
|
|
6173
6186
|
}
|
|
6174
6187
|
}
|
|
6175
|
-
target.querySelectorAll("*").forEach(($ele
|
|
6188
|
+
target.querySelectorAll("*").forEach(($ele) => {
|
|
6176
6189
|
queryMaxZIndex($ele);
|
|
6177
6190
|
});
|
|
6178
6191
|
zIndex += deviation;
|
|
@@ -6189,15 +6202,15 @@ class Utils {
|
|
|
6189
6202
|
return this.getMaxZIndexNodeInfo(deviation, target, ignoreCallBack).zIndex;
|
|
6190
6203
|
}
|
|
6191
6204
|
getMinValue(...args) {
|
|
6192
|
-
|
|
6205
|
+
const result = [...args];
|
|
6193
6206
|
let newResult = [];
|
|
6194
6207
|
if (result.length === 0) {
|
|
6195
6208
|
return void 0;
|
|
6196
6209
|
}
|
|
6197
6210
|
if (result.length > 1) {
|
|
6198
6211
|
if (result.length === 2 && typeof result[0] === "object" && typeof result[1] === "function") {
|
|
6199
|
-
|
|
6200
|
-
|
|
6212
|
+
const data = result[0];
|
|
6213
|
+
const handleDataFunc = result[1];
|
|
6201
6214
|
Object.keys(data).forEach((keyName) => {
|
|
6202
6215
|
newResult = [...newResult, handleDataFunc(keyName, data[keyName])];
|
|
6203
6216
|
});
|
|
@@ -6227,8 +6240,8 @@ class Utils {
|
|
|
6227
6240
|
* > 'Mozilla/5.0 (Linux; Android 10; MI 13 Build/OPR1.170623.027; wv) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.3490.40 Mobile Safari/537.36'
|
|
6228
6241
|
**/
|
|
6229
6242
|
getRandomAndroidUA() {
|
|
6230
|
-
|
|
6231
|
-
|
|
6243
|
+
const UtilsContext = this;
|
|
6244
|
+
const mobileNameList = [
|
|
6232
6245
|
"LDN-LX3",
|
|
6233
6246
|
"RNE-L03",
|
|
6234
6247
|
"ASUS_X00ID Build/NMF26F",
|
|
@@ -6245,14 +6258,14 @@ class Utils {
|
|
|
6245
6258
|
"MI 13 Build/OPR1.170623.027; wv",
|
|
6246
6259
|
];
|
|
6247
6260
|
/* 安卓版本 */
|
|
6248
|
-
|
|
6261
|
+
const androidVersion = UtilsContext.getRandomValue(12, 14);
|
|
6249
6262
|
/* 手机型号 */
|
|
6250
|
-
|
|
6263
|
+
const randomMobile = UtilsContext.getRandomValue(mobileNameList);
|
|
6251
6264
|
/* chrome大版本号 */
|
|
6252
|
-
|
|
6253
|
-
|
|
6254
|
-
|
|
6255
|
-
|
|
6265
|
+
const chromeVersion1 = UtilsContext.getRandomValue(120, 132);
|
|
6266
|
+
const chromeVersion2 = UtilsContext.getRandomValue(0, 0);
|
|
6267
|
+
const chromeVersion3 = UtilsContext.getRandomValue(2272, 6099);
|
|
6268
|
+
const chromeVersion4 = UtilsContext.getRandomValue(1, 218);
|
|
6256
6269
|
return `Mozilla/5.0 (Linux; Android ${androidVersion}; ${randomMobile}) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${chromeVersion1}.${chromeVersion2}.${chromeVersion3}.${chromeVersion4} Mobile Safari/537.36`;
|
|
6257
6270
|
}
|
|
6258
6271
|
/**
|
|
@@ -6274,20 +6287,20 @@ class Utils {
|
|
|
6274
6287
|
* > 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.5068.19 Safari/537.36'
|
|
6275
6288
|
**/
|
|
6276
6289
|
getRandomPCUA() {
|
|
6277
|
-
|
|
6290
|
+
const UtilsContext = this;
|
|
6278
6291
|
/* chrome大版本号 */
|
|
6279
|
-
|
|
6280
|
-
|
|
6281
|
-
|
|
6282
|
-
|
|
6292
|
+
const chromeVersion1 = UtilsContext.getRandomValue(120, 132);
|
|
6293
|
+
const chromeVersion2 = UtilsContext.getRandomValue(0, 0);
|
|
6294
|
+
const chromeVersion3 = UtilsContext.getRandomValue(2272, 6099);
|
|
6295
|
+
const chromeVersion4 = UtilsContext.getRandomValue(1, 218);
|
|
6283
6296
|
return `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${chromeVersion1}.${chromeVersion2}.${chromeVersion3}.${chromeVersion4} Safari/537.36`;
|
|
6284
6297
|
}
|
|
6285
6298
|
getRandomValue(...args) {
|
|
6286
|
-
|
|
6299
|
+
const result = [...args];
|
|
6287
6300
|
if (result.length > 1) {
|
|
6288
6301
|
if (result.length === 2 && typeof result[0] === "number" && typeof result[1] === "number") {
|
|
6289
|
-
|
|
6290
|
-
|
|
6302
|
+
const leftNumber = result[0] > result[1] ? result[1] : result[0];
|
|
6303
|
+
const rightNumber = result[0] > result[1] ? result[0] : result[1];
|
|
6291
6304
|
return Math.round(Math.random() * (rightNumber - leftNumber)) + leftNumber;
|
|
6292
6305
|
}
|
|
6293
6306
|
else {
|
|
@@ -6295,12 +6308,12 @@ class Utils {
|
|
|
6295
6308
|
}
|
|
6296
6309
|
}
|
|
6297
6310
|
else if (result.length === 1) {
|
|
6298
|
-
|
|
6311
|
+
const paramData = result[0];
|
|
6299
6312
|
if (Array.isArray(paramData)) {
|
|
6300
6313
|
return paramData[Math.floor(Math.random() * paramData.length)];
|
|
6301
6314
|
}
|
|
6302
6315
|
else if (typeof paramData === "object" && Object.keys(paramData).length > 0) {
|
|
6303
|
-
|
|
6316
|
+
const paramObjDataKey = Object.keys(paramData)[Math.floor(Math.random() * Object.keys(paramData).length)];
|
|
6304
6317
|
return paramData[paramObjDataKey];
|
|
6305
6318
|
}
|
|
6306
6319
|
else {
|
|
@@ -6316,7 +6329,7 @@ class Utils {
|
|
|
6316
6329
|
* Utils.getReactObj(document.querySelector("input"))?.reactProps?.onChange({target:{value:"123"}});
|
|
6317
6330
|
*/
|
|
6318
6331
|
getReactObj(element) {
|
|
6319
|
-
|
|
6332
|
+
const result = {};
|
|
6320
6333
|
if (element == null) {
|
|
6321
6334
|
return result;
|
|
6322
6335
|
}
|
|
@@ -6342,9 +6355,9 @@ class Utils {
|
|
|
6342
6355
|
if (typeof target !== "object") {
|
|
6343
6356
|
throw new TypeError("target不是一个对象");
|
|
6344
6357
|
}
|
|
6345
|
-
|
|
6358
|
+
const objectsSymbols = Object.getOwnPropertySymbols(target);
|
|
6346
6359
|
if (typeof keyName === "string") {
|
|
6347
|
-
|
|
6360
|
+
const findSymbol = objectsSymbols.find((key) => {
|
|
6348
6361
|
return key.toString() === keyName;
|
|
6349
6362
|
});
|
|
6350
6363
|
if (findSymbol) {
|
|
@@ -6352,7 +6365,7 @@ class Utils {
|
|
|
6352
6365
|
}
|
|
6353
6366
|
}
|
|
6354
6367
|
else if (typeof keyName === "symbol") {
|
|
6355
|
-
|
|
6368
|
+
const findSymbol = objectsSymbols.find((key) => {
|
|
6356
6369
|
return key === keyName;
|
|
6357
6370
|
});
|
|
6358
6371
|
if (findSymbol) {
|
|
@@ -6360,7 +6373,7 @@ class Utils {
|
|
|
6360
6373
|
}
|
|
6361
6374
|
}
|
|
6362
6375
|
else {
|
|
6363
|
-
|
|
6376
|
+
const result = {};
|
|
6364
6377
|
objectsSymbols.forEach((item) => {
|
|
6365
6378
|
result[item] = target[item];
|
|
6366
6379
|
});
|
|
@@ -6375,12 +6388,12 @@ class Utils {
|
|
|
6375
6388
|
* > 12
|
|
6376
6389
|
*/
|
|
6377
6390
|
getTextLength(text) {
|
|
6378
|
-
|
|
6379
|
-
|
|
6391
|
+
const encoder = new TextEncoder();
|
|
6392
|
+
const bytes = encoder.encode(text);
|
|
6380
6393
|
return bytes.length;
|
|
6381
6394
|
}
|
|
6382
6395
|
getTextStorageSize(text, addType = true) {
|
|
6383
|
-
|
|
6396
|
+
const UtilsContext = this;
|
|
6384
6397
|
return UtilsContext.formatByteToSize(UtilsContext.getTextLength(text), addType);
|
|
6385
6398
|
}
|
|
6386
6399
|
getThunderUrl(url) {
|
|
@@ -6393,88 +6406,75 @@ class Utils {
|
|
|
6393
6406
|
if (url.trim() === "") {
|
|
6394
6407
|
throw new TypeError("url不能为空字符串或纯空格");
|
|
6395
6408
|
}
|
|
6396
|
-
return `thunder://${this.windowApi.globalThis.btoa(
|
|
6409
|
+
return `thunder://${this.windowApi.globalThis.btoa(`AA${url}ZZ`)}`;
|
|
6397
6410
|
}
|
|
6398
6411
|
/**
|
|
6399
|
-
|
|
6400
|
-
|
|
6401
|
-
|
|
6402
|
-
|
|
6403
|
-
|
|
6404
|
-
|
|
6405
|
-
|
|
6406
|
-
|
|
6407
|
-
|
|
6408
|
-
|
|
6409
|
-
|
|
6410
|
-
|
|
6411
|
-
|
|
6412
|
-
|
|
6413
|
-
|
|
6414
|
-
|
|
6415
|
-
|
|
6416
|
-
|
|
6417
|
-
|
|
6418
|
-
|
|
6419
|
-
|
|
6420
|
-
|
|
6421
|
-
|
|
6422
|
-
|
|
6423
|
-
|
|
6424
|
-
|
|
6412
|
+
* 对于GM_cookie的兼容写法,当无法使用GM_cookie时可以使用这个,但是并不完全兼容,有些写不出来且限制了httponly是无法访问的
|
|
6413
|
+
* @example
|
|
6414
|
+
let GM_cookie = new Utils.GM_Cookie();
|
|
6415
|
+
GM_cookie.list({name:"xxx_cookie_xxx"},function(cookies,error){
|
|
6416
|
+
if (!error) {
|
|
6417
|
+
console.log(cookies);
|
|
6418
|
+
console.log(cookies.value);
|
|
6419
|
+
} else {
|
|
6420
|
+
console.error(error);
|
|
6421
|
+
}
|
|
6422
|
+
});
|
|
6423
|
+
GM_cookie.set({name:"xxx_cookie_test_xxx",value:"这是Cookie测试值"},function(error){
|
|
6424
|
+
if (error) {
|
|
6425
|
+
console.error(error);
|
|
6426
|
+
} else {
|
|
6427
|
+
console.log('Cookie set successfully.');
|
|
6428
|
+
}
|
|
6429
|
+
})
|
|
6430
|
+
GM_cookie.delete({name:"xxx_cookie_test_xxx"},function(error){
|
|
6431
|
+
if (error) {
|
|
6432
|
+
console.error(error);
|
|
6433
|
+
} else {
|
|
6434
|
+
console.log('Cookie set successfully.');
|
|
6435
|
+
}
|
|
6436
|
+
})
|
|
6437
|
+
**/
|
|
6425
6438
|
GM_Cookie = UtilsGMCookie;
|
|
6426
6439
|
/**
|
|
6427
|
-
|
|
6428
|
-
|
|
6429
|
-
|
|
6430
|
-
|
|
6431
|
-
|
|
6432
|
-
|
|
6433
|
-
|
|
6434
|
-
|
|
6435
|
-
|
|
6436
|
-
|
|
6437
|
-
|
|
6438
|
-
|
|
6440
|
+
* 注册油猴菜单,要求本地存储的键名不能存在其它键名`GM_Menu_Local_Map`会冲突/覆盖
|
|
6441
|
+
* @example
|
|
6442
|
+
let GM_Menu = new Utils.GM_Menu({
|
|
6443
|
+
data: [
|
|
6444
|
+
{
|
|
6445
|
+
menu_key: "menu_key",
|
|
6446
|
+
text: "测试按钮",
|
|
6447
|
+
enable: true,
|
|
6448
|
+
accessKey: "a",
|
|
6449
|
+
autoClose: false,
|
|
6450
|
+
showText(text, enable) {
|
|
6451
|
+
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6452
|
+
},
|
|
6453
|
+
callback(data) {
|
|
6454
|
+
console.log("点击菜单,值修改为", data.enable);
|
|
6455
|
+
},
|
|
6439
6456
|
},
|
|
6440
|
-
|
|
6441
|
-
|
|
6442
|
-
|
|
6443
|
-
|
|
6444
|
-
|
|
6445
|
-
|
|
6446
|
-
|
|
6447
|
-
|
|
6448
|
-
|
|
6449
|
-
|
|
6450
|
-
|
|
6451
|
-
|
|
6452
|
-
|
|
6453
|
-
|
|
6454
|
-
|
|
6455
|
-
|
|
6456
|
-
|
|
6457
|
-
|
|
6458
|
-
|
|
6459
|
-
|
|
6460
|
-
|
|
6461
|
-
// 添加键为menu_key2的菜单项
|
|
6462
|
-
GM_Menu.add({
|
|
6463
|
-
key:"menu_key2",
|
|
6464
|
-
text: "测试按钮2",
|
|
6465
|
-
enable: false,
|
|
6466
|
-
showText(text,enable){
|
|
6467
|
-
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6468
|
-
},
|
|
6469
|
-
callback(data){
|
|
6470
|
-
console.log("点击菜单,值修改为",data.enable);
|
|
6471
|
-
}
|
|
6472
|
-
});
|
|
6473
|
-
// 使用数组的方式添加多个菜单,如menu_key3、menu_key4
|
|
6474
|
-
GM_Menu.add([
|
|
6475
|
-
{
|
|
6476
|
-
key:"menu_key3",
|
|
6477
|
-
text: "测试按钮3",
|
|
6457
|
+
],
|
|
6458
|
+
autoReload: false,
|
|
6459
|
+
GM_getValue,
|
|
6460
|
+
GM_setValue,
|
|
6461
|
+
GM_registerMenuCommand,
|
|
6462
|
+
GM_unregisterMenuCommand,
|
|
6463
|
+
});
|
|
6464
|
+
|
|
6465
|
+
|
|
6466
|
+
// 获取某个菜单项的值
|
|
6467
|
+
GM_Menu.get("menu_key");
|
|
6468
|
+
> true
|
|
6469
|
+
|
|
6470
|
+
// 获取某个菜单项的开启/关闭后显示的文本
|
|
6471
|
+
GM_Menu.getShowTextValue("menu_key");
|
|
6472
|
+
> √测试按钮
|
|
6473
|
+
|
|
6474
|
+
// 添加键为menu_key2的菜单项
|
|
6475
|
+
GM_Menu.add({
|
|
6476
|
+
key:"menu_key2",
|
|
6477
|
+
text: "测试按钮2",
|
|
6478
6478
|
enable: false,
|
|
6479
6479
|
showText(text,enable){
|
|
6480
6480
|
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
@@ -6482,152 +6482,165 @@ class Utils {
|
|
|
6482
6482
|
callback(data){
|
|
6483
6483
|
console.log("点击菜单,值修改为",data.enable);
|
|
6484
6484
|
}
|
|
6485
|
-
}
|
|
6486
|
-
|
|
6487
|
-
|
|
6488
|
-
|
|
6489
|
-
|
|
6490
|
-
|
|
6491
|
-
|
|
6485
|
+
});
|
|
6486
|
+
// 使用数组的方式添加多个菜单,如menu_key3、menu_key4
|
|
6487
|
+
GM_Menu.add([
|
|
6488
|
+
{
|
|
6489
|
+
key:"menu_key3",
|
|
6490
|
+
text: "测试按钮3",
|
|
6491
|
+
enable: false,
|
|
6492
|
+
showText(text,enable){
|
|
6493
|
+
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6494
|
+
},
|
|
6495
|
+
callback(data){
|
|
6496
|
+
console.log("点击菜单,值修改为",data.enable);
|
|
6497
|
+
}
|
|
6492
6498
|
},
|
|
6493
|
-
|
|
6494
|
-
|
|
6499
|
+
{
|
|
6500
|
+
key:"menu_key4",
|
|
6501
|
+
text: "测试按钮4",
|
|
6502
|
+
enable: false,
|
|
6503
|
+
showText(text,enable){
|
|
6504
|
+
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6505
|
+
},
|
|
6506
|
+
callback(data){
|
|
6507
|
+
console.log("点击菜单,值修改为",data.enable);
|
|
6508
|
+
}
|
|
6495
6509
|
}
|
|
6496
|
-
|
|
6497
|
-
|
|
6498
|
-
|
|
6499
|
-
|
|
6500
|
-
|
|
6501
|
-
|
|
6502
|
-
|
|
6503
|
-
|
|
6504
|
-
|
|
6505
|
-
|
|
6506
|
-
|
|
6507
|
-
|
|
6508
|
-
|
|
6510
|
+
]);
|
|
6511
|
+
|
|
6512
|
+
// 更新键为menu_key的显示文字和点击回调
|
|
6513
|
+
GM_Menu.update({
|
|
6514
|
+
menu_key:{
|
|
6515
|
+
text: "更新后的测试按钮",
|
|
6516
|
+
enable: true,
|
|
6517
|
+
showText(text,enable){
|
|
6518
|
+
return "[" + (enable ? "√" : "×") + "]" + text;
|
|
6519
|
+
},
|
|
6520
|
+
callback(data){
|
|
6521
|
+
console.log("点击菜单更新后的测试按钮,新值修改为",data.enable);
|
|
6522
|
+
}
|
|
6509
6523
|
}
|
|
6510
|
-
}
|
|
6511
|
-
|
|
6512
|
-
|
|
6513
|
-
|
|
6514
|
-
|
|
6515
|
-
**/
|
|
6524
|
+
});
|
|
6525
|
+
|
|
6526
|
+
// 删除键为menu_key的菜单
|
|
6527
|
+
GM_Menu.delete("menu_key");
|
|
6528
|
+
**/
|
|
6516
6529
|
GM_Menu = GMMenu;
|
|
6517
6530
|
/**
|
|
6518
|
-
|
|
6519
|
-
|
|
6520
|
-
|
|
6521
|
-
|
|
6522
|
-
|
|
6523
|
-
|
|
6524
|
-
|
|
6525
|
-
|
|
6526
|
-
|
|
6527
|
-
|
|
6528
|
-
|
|
6529
|
-
|
|
6530
|
-
|
|
6531
|
-
|
|
6532
|
-
|
|
6533
|
-
|
|
6534
|
-
|
|
6535
|
-
|
|
6536
|
-
|
|
6537
|
-
|
|
6538
|
-
|
|
6539
|
-
|
|
6540
|
-
|
|
6531
|
+
* 基于Function prototype,能够勾住和释放任何函数
|
|
6532
|
+
*
|
|
6533
|
+
* .hook
|
|
6534
|
+
* + realFunc {string} 用于保存原始函数的函数名称,用于unHook
|
|
6535
|
+
* + hookFunc {string} 替换的hook函数
|
|
6536
|
+
* + context {object} 目标函数所在对象,用于hook非window对象下的函数,如String.protype.slice,carInstance1
|
|
6537
|
+
* + methodName {string} 匿名函数需显式传入目标函数名eg:this.Begin = function(){....};}
|
|
6538
|
+
*
|
|
6539
|
+
* .unhook
|
|
6540
|
+
* + realFunc {string} 用于保存原始函数的函数名称,用于unHook
|
|
6541
|
+
* + funcName {string} 被Hook的函数名称
|
|
6542
|
+
* + context {object} 目标函数所在对象,用于hook非window对象下的函数,如String.protype.slice,carInstance1
|
|
6543
|
+
* @example
|
|
6544
|
+
let hook = new Utils.Hooks();
|
|
6545
|
+
hook.initEnv();
|
|
6546
|
+
function myFunction(){
|
|
6547
|
+
console.log("我自己需要执行的函数");
|
|
6548
|
+
}
|
|
6549
|
+
function testFunction(){
|
|
6550
|
+
console.log("正常执行的函数");
|
|
6551
|
+
}
|
|
6552
|
+
testFunction.hook(testFunction,myFunction,window);
|
|
6553
|
+
**/
|
|
6541
6554
|
Hooks = Hooks;
|
|
6542
6555
|
/**
|
|
6543
|
-
|
|
6544
|
-
|
|
6545
|
-
|
|
6546
|
-
|
|
6547
|
-
|
|
6548
|
-
|
|
6549
|
-
|
|
6550
|
-
|
|
6551
|
-
|
|
6552
|
-
|
|
6553
|
-
|
|
6554
|
-
|
|
6555
|
-
|
|
6556
|
-
|
|
6557
|
-
|
|
6558
|
-
|
|
6559
|
-
|
|
6560
|
-
|
|
6561
|
-
|
|
6562
|
-
|
|
6563
|
-
|
|
6564
|
-
|
|
6565
|
-
|
|
6566
|
-
|
|
6567
|
-
|
|
6568
|
-
|
|
6569
|
-
|
|
6570
|
-
|
|
6571
|
-
|
|
6572
|
-
|
|
6573
|
-
|
|
6574
|
-
|
|
6575
|
-
|
|
6576
|
-
|
|
6577
|
-
|
|
6578
|
-
|
|
6579
|
-
|
|
6556
|
+
* 为减少代码量和回调,把GM_xmlhttpRequest封装
|
|
6557
|
+
* 文档地址: https://www.tampermonkey.net/documentation.php?ext=iikm
|
|
6558
|
+
* 其中onloadstart、onprogress、onreadystatechange是回调形式,onabort、ontimeout、onerror可以设置全局回调函数
|
|
6559
|
+
* @param _GM_xmlHttpRequest_ 油猴中的GM_xmlhttpRequest
|
|
6560
|
+
* @example
|
|
6561
|
+
let httpx = new Utils.Httpx(GM_xmlhttpRequest);
|
|
6562
|
+
let postResp = await httpx.post({
|
|
6563
|
+
url:url,
|
|
6564
|
+
data:JSON.stringify({
|
|
6565
|
+
test:1
|
|
6566
|
+
}),
|
|
6567
|
+
timeout: 5000
|
|
6568
|
+
});
|
|
6569
|
+
console.log(postResp);
|
|
6570
|
+
> {
|
|
6571
|
+
status: true,
|
|
6572
|
+
data: {responseText: "...", response: xxx,...},
|
|
6573
|
+
msg: "请求完毕",
|
|
6574
|
+
type: "onload",
|
|
6575
|
+
}
|
|
6576
|
+
|
|
6577
|
+
if(postResp === "onload" && postResp.status){
|
|
6578
|
+
// onload
|
|
6579
|
+
}else if(postResp === "ontimeout"){
|
|
6580
|
+
// ontimeout
|
|
6581
|
+
}
|
|
6582
|
+
* @example
|
|
6583
|
+
// 也可以先配置全局参数
|
|
6584
|
+
let httpx = new Utils.Httpx(GM_xmlhttpRequest);
|
|
6585
|
+
httpx.config({
|
|
6586
|
+
timeout: 5000,
|
|
6587
|
+
async: false,
|
|
6588
|
+
responseType: "html",
|
|
6589
|
+
redirect: "follow",
|
|
6590
|
+
})
|
|
6591
|
+
// 优先级为 默认details < 全局details < 单独的details
|
|
6592
|
+
*/
|
|
6580
6593
|
Httpx = Httpx;
|
|
6581
6594
|
/**
|
|
6582
|
-
|
|
6583
|
-
|
|
6584
|
-
|
|
6585
|
-
|
|
6586
|
-
|
|
6587
|
-
|
|
6588
|
-
|
|
6589
|
-
|
|
6590
|
-
|
|
6591
|
-
|
|
6592
|
-
|
|
6593
|
-
|
|
6594
|
-
|
|
6595
|
-
|
|
6596
|
-
|
|
6597
|
-
|
|
6598
|
-
|
|
6599
|
-
|
|
6600
|
-
|
|
6601
|
-
|
|
6602
|
-
|
|
6603
|
-
|
|
6604
|
-
|
|
6605
|
-
|
|
6595
|
+
* 浏览器端的indexedDB操作封装
|
|
6596
|
+
* @example
|
|
6597
|
+
let db = new Utils.indexedDB('web_DB', 'nav_text')
|
|
6598
|
+
let data = {name:'管理员', roleId: 1, type: 1};
|
|
6599
|
+
db.save('list',data).then((resolve)=>{
|
|
6600
|
+
console.log(resolve,'存储成功')
|
|
6601
|
+
})
|
|
6602
|
+
|
|
6603
|
+
db.get('list').then((resolve)=>{
|
|
6604
|
+
console.log(resolve,'查询成功')
|
|
6605
|
+
})
|
|
6606
|
+
|
|
6607
|
+
db.getPaging('list',20,10).then((resolve)=>{
|
|
6608
|
+
console.log(resolve,'查询分页偏移第20,一共10行成功');
|
|
6609
|
+
})
|
|
6610
|
+
|
|
6611
|
+
db.delete('list').then(resolve=>{
|
|
6612
|
+
console.log(resolve,'删除成功---->>>>>>name')
|
|
6613
|
+
})
|
|
6614
|
+
|
|
6615
|
+
db.deleteAll().then(resolve=>{
|
|
6616
|
+
console.log(resolve,'清除数据库---->>>>>>name')
|
|
6617
|
+
})
|
|
6618
|
+
**/
|
|
6606
6619
|
indexedDB = indexedDB;
|
|
6607
6620
|
isNativeFunc(target) {
|
|
6608
6621
|
return Boolean(target.toString().match(/^function .*\(\) { \[native code\] }$/));
|
|
6609
6622
|
}
|
|
6610
6623
|
isNearBottom(...args) {
|
|
6611
6624
|
let nearBottomHeight = 50;
|
|
6612
|
-
|
|
6625
|
+
const checkWindow = () => {
|
|
6613
6626
|
// 已滚动的距离
|
|
6614
|
-
|
|
6627
|
+
const scrollTop = this.windowApi.window.pageYOffset || this.windowApi.document.documentElement.scrollTop;
|
|
6615
6628
|
// 视窗高度
|
|
6616
|
-
|
|
6629
|
+
const viewportHeight = this.windowApi.window.innerHeight || this.windowApi.document.documentElement.clientHeight;
|
|
6617
6630
|
// 最大滚动距离
|
|
6618
|
-
|
|
6631
|
+
const maxScrollHeight = this.windowApi.document.documentElement.scrollHeight - nearBottomHeight;
|
|
6619
6632
|
return scrollTop + viewportHeight >= maxScrollHeight;
|
|
6620
6633
|
};
|
|
6621
|
-
|
|
6634
|
+
const checkNode = ($ele) => {
|
|
6622
6635
|
// 已滚动的距离
|
|
6623
|
-
|
|
6636
|
+
const scrollTop = $ele.scrollTop;
|
|
6624
6637
|
// 视窗高度
|
|
6625
|
-
|
|
6638
|
+
const viewportHeight = $ele.clientHeight;
|
|
6626
6639
|
// 最大滚动距离
|
|
6627
|
-
|
|
6640
|
+
const maxScrollHeight = $ele.scrollHeight - viewportHeight - nearBottomHeight;
|
|
6628
6641
|
return scrollTop >= maxScrollHeight;
|
|
6629
6642
|
};
|
|
6630
|
-
|
|
6643
|
+
const firstArg = args[0];
|
|
6631
6644
|
if (args.length === 0 || typeof args[0] === "number") {
|
|
6632
6645
|
// nearBottomHeight
|
|
6633
6646
|
//
|
|
@@ -6642,7 +6655,7 @@ class Utils {
|
|
|
6642
6655
|
return checkNode(args[0]);
|
|
6643
6656
|
}
|
|
6644
6657
|
else {
|
|
6645
|
-
throw new TypeError(
|
|
6658
|
+
throw new TypeError(`参数1类型错误${typeof firstArg}`);
|
|
6646
6659
|
}
|
|
6647
6660
|
}
|
|
6648
6661
|
/**
|
|
@@ -6672,7 +6685,7 @@ class Utils {
|
|
|
6672
6685
|
}
|
|
6673
6686
|
if (typeof target === "object") {
|
|
6674
6687
|
/* 也有种可能,这个jQuery对象是1.8.3版本的,页面中的jQuery是3.4.1版本的 */
|
|
6675
|
-
|
|
6688
|
+
const jQueryProps = [
|
|
6676
6689
|
"add",
|
|
6677
6690
|
"addBack",
|
|
6678
6691
|
"addClass",
|
|
@@ -6856,50 +6869,50 @@ class Utils {
|
|
|
6856
6869
|
*/
|
|
6857
6870
|
isNotNull = commonUtil.isNotNull.bind(commonUtil);
|
|
6858
6871
|
/**
|
|
6859
|
-
|
|
6860
|
-
|
|
6861
|
-
|
|
6862
|
-
|
|
6863
|
-
|
|
6864
|
-
|
|
6865
|
-
|
|
6866
|
-
|
|
6867
|
-
|
|
6868
|
-
|
|
6869
|
-
|
|
6870
|
-
|
|
6871
|
-
|
|
6872
|
-
|
|
6873
|
-
|
|
6874
|
-
|
|
6875
|
-
|
|
6876
|
-
|
|
6877
|
-
|
|
6878
|
-
|
|
6879
|
-
|
|
6880
|
-
|
|
6881
|
-
|
|
6882
|
-
|
|
6883
|
-
|
|
6884
|
-
|
|
6885
|
-
|
|
6886
|
-
|
|
6887
|
-
|
|
6888
|
-
|
|
6889
|
-
|
|
6890
|
-
|
|
6891
|
-
|
|
6892
|
-
|
|
6893
|
-
|
|
6894
|
-
|
|
6895
|
-
|
|
6896
|
-
|
|
6897
|
-
|
|
6898
|
-
|
|
6899
|
-
|
|
6900
|
-
|
|
6901
|
-
|
|
6902
|
-
|
|
6872
|
+
* 判断对象或数据是否为空
|
|
6873
|
+
* + `String`判空的值,如 ""、"null"、"undefined"、" "
|
|
6874
|
+
* + `Number`判空的值,如 0
|
|
6875
|
+
* + `Object`判空的值,如 {}、null、undefined
|
|
6876
|
+
* + `Array`(存在属性Symbol.iterator)判空的值,如 []
|
|
6877
|
+
* + `Boolean`判空的值,如false
|
|
6878
|
+
* + `Function`判空的值,如()=>{}、(xxx="")=>{}、function(){}、function(xxx=""){}
|
|
6879
|
+
* @returns
|
|
6880
|
+
* + true 为空
|
|
6881
|
+
* + false 不为空
|
|
6882
|
+
* @example
|
|
6883
|
+
Utils.isNull({});
|
|
6884
|
+
> true
|
|
6885
|
+
* @example
|
|
6886
|
+
Utils.isNull([]);
|
|
6887
|
+
> true
|
|
6888
|
+
* @example
|
|
6889
|
+
Utils.isNull(" ");
|
|
6890
|
+
> true
|
|
6891
|
+
* @example
|
|
6892
|
+
Utils.isNull(function(){});
|
|
6893
|
+
> true
|
|
6894
|
+
* @example
|
|
6895
|
+
Utils.isNull(()=>{}));
|
|
6896
|
+
> true
|
|
6897
|
+
* @example
|
|
6898
|
+
Utils.isNull("undefined");
|
|
6899
|
+
> true
|
|
6900
|
+
* @example
|
|
6901
|
+
Utils.isNull("null");
|
|
6902
|
+
> true
|
|
6903
|
+
* @example
|
|
6904
|
+
Utils.isNull(" ", false);
|
|
6905
|
+
> true
|
|
6906
|
+
* @example
|
|
6907
|
+
Utils.isNull([1],[]);
|
|
6908
|
+
> false
|
|
6909
|
+
* @example
|
|
6910
|
+
Utils.isNull([],[1]);
|
|
6911
|
+
> false
|
|
6912
|
+
* @example
|
|
6913
|
+
Utils.isNull(false,[123]);
|
|
6914
|
+
> false
|
|
6915
|
+
**/
|
|
6903
6916
|
isNull = commonUtil.isNull.bind(commonUtil);
|
|
6904
6917
|
isThemeDark() {
|
|
6905
6918
|
return this.windowApi.globalThis.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
@@ -6928,15 +6941,15 @@ class Utils {
|
|
|
6928
6941
|
}
|
|
6929
6942
|
let result = true;
|
|
6930
6943
|
for (const domItem of needCheckDomList) {
|
|
6931
|
-
|
|
6944
|
+
const domDisplay = this.windowApi.window.getComputedStyle(domItem);
|
|
6932
6945
|
if (domDisplay.display === "none") {
|
|
6933
6946
|
result = false;
|
|
6934
6947
|
}
|
|
6935
6948
|
else {
|
|
6936
|
-
|
|
6949
|
+
const domClientRect = domItem.getBoundingClientRect();
|
|
6937
6950
|
if (inView) {
|
|
6938
|
-
|
|
6939
|
-
|
|
6951
|
+
const viewportWidth = this.windowApi.window.innerWidth || this.windowApi.document.documentElement.clientWidth;
|
|
6952
|
+
const viewportHeight = this.windowApi.window.innerHeight || this.windowApi.document.documentElement.clientHeight;
|
|
6940
6953
|
result = !(domClientRect.right < 0 ||
|
|
6941
6954
|
domClientRect.left > viewportWidth ||
|
|
6942
6955
|
domClientRect.bottom < 0 ||
|
|
@@ -6955,11 +6968,11 @@ class Utils {
|
|
|
6955
6968
|
}
|
|
6956
6969
|
isWebView_Via() {
|
|
6957
6970
|
let result = true;
|
|
6958
|
-
|
|
6971
|
+
const UtilsContext = this;
|
|
6959
6972
|
if (typeof this.windowApi.top.window.via === "object") {
|
|
6960
6973
|
for (const key in Object.values(this.windowApi.top.window.via)) {
|
|
6961
6974
|
if (Reflect.has(this.windowApi.top.window.via, key)) {
|
|
6962
|
-
|
|
6975
|
+
const objValueFunc = this.windowApi.top.window.via[key];
|
|
6963
6976
|
if (typeof objValueFunc === "function" && UtilsContext.isNativeFunc(objValueFunc)) {
|
|
6964
6977
|
result = true;
|
|
6965
6978
|
}
|
|
@@ -6977,11 +6990,11 @@ class Utils {
|
|
|
6977
6990
|
}
|
|
6978
6991
|
isWebView_X() {
|
|
6979
6992
|
let result = true;
|
|
6980
|
-
|
|
6993
|
+
const UtilsContext = this;
|
|
6981
6994
|
if (typeof this.windowApi.top.window.mbrowser === "object") {
|
|
6982
6995
|
for (const key in Object.values(this.windowApi.top.window.mbrowser)) {
|
|
6983
6996
|
if (Reflect.has(this.windowApi.top.window.mbrowser, key)) {
|
|
6984
|
-
|
|
6997
|
+
const objValueFunc = this.windowApi.top.window.mbrowser[key];
|
|
6985
6998
|
if (typeof objValueFunc === "function" && UtilsContext.isNativeFunc(objValueFunc)) {
|
|
6986
6999
|
result = true;
|
|
6987
7000
|
}
|
|
@@ -7008,46 +7021,46 @@ class Utils {
|
|
|
7008
7021
|
return result;
|
|
7009
7022
|
}
|
|
7010
7023
|
/**
|
|
7011
|
-
|
|
7012
|
-
|
|
7013
|
-
|
|
7014
|
-
|
|
7015
|
-
|
|
7016
|
-
|
|
7017
|
-
|
|
7018
|
-
|
|
7019
|
-
|
|
7020
|
-
|
|
7024
|
+
* 自动锁对象,用于循环判断运行的函数,在循环外new后使用,注意,如果函数内部存在异步操作,需要使用await
|
|
7025
|
+
* @example
|
|
7026
|
+
let lock = new Utils.LockFunction(()=>{console.log(1)}))
|
|
7027
|
+
lock.run();
|
|
7028
|
+
> 1
|
|
7029
|
+
* @example
|
|
7030
|
+
let lock = new Utils.LockFunction(()=>{console.log(1)}),true) -- 异步操作
|
|
7031
|
+
await lock.run();
|
|
7032
|
+
> 1
|
|
7033
|
+
**/
|
|
7021
7034
|
LockFunction = LockFunction;
|
|
7022
7035
|
/**
|
|
7023
|
-
|
|
7024
|
-
|
|
7025
|
-
|
|
7026
|
-
|
|
7027
|
-
|
|
7028
|
-
|
|
7029
|
-
|
|
7030
|
-
|
|
7031
|
-
|
|
7032
|
-
|
|
7033
|
-
|
|
7034
|
-
|
|
7035
|
-
|
|
7036
|
-
|
|
7037
|
-
|
|
7038
|
-
|
|
7039
|
-
|
|
7040
|
-
|
|
7041
|
-
|
|
7042
|
-
|
|
7043
|
-
|
|
7044
|
-
|
|
7045
|
-
|
|
7046
|
-
|
|
7047
|
-
|
|
7048
|
-
|
|
7049
|
-
|
|
7050
|
-
|
|
7036
|
+
* 日志对象
|
|
7037
|
+
* @param _GM_info_ 油猴管理器的API GM_info,或者是一个对象,如{"script":{name:"Utils.Log"}}
|
|
7038
|
+
* @example
|
|
7039
|
+
let log = new Utils.Log(GM_info);
|
|
7040
|
+
log.info("普通输出");
|
|
7041
|
+
> 普通输出
|
|
7042
|
+
|
|
7043
|
+
log.success("成功输出");
|
|
7044
|
+
> 成功输出
|
|
7045
|
+
|
|
7046
|
+
log.error("错误输出");
|
|
7047
|
+
> 错误输出
|
|
7048
|
+
|
|
7049
|
+
log.warn("警告输出");
|
|
7050
|
+
> 警告输出
|
|
7051
|
+
|
|
7052
|
+
log.tag = "自定义tag信息";
|
|
7053
|
+
log.info("自定义info的颜色","#e0e0e0");
|
|
7054
|
+
> 自定义info的颜色
|
|
7055
|
+
|
|
7056
|
+
log.config({
|
|
7057
|
+
successColor: "#31dc02",
|
|
7058
|
+
errorColor: "#e02d2d",
|
|
7059
|
+
infoColor: "black",
|
|
7060
|
+
})
|
|
7061
|
+
log.success("颜色为#31dc02");
|
|
7062
|
+
> 颜色为#31dc02
|
|
7063
|
+
*/
|
|
7051
7064
|
Log = Log;
|
|
7052
7065
|
mergeArrayToString(data, handleFunc) {
|
|
7053
7066
|
if (!(data instanceof Array)) {
|
|
@@ -7076,8 +7089,8 @@ class Utils {
|
|
|
7076
7089
|
return content;
|
|
7077
7090
|
}
|
|
7078
7091
|
mutationObserver(target, observer_config) {
|
|
7079
|
-
|
|
7080
|
-
|
|
7092
|
+
const UtilsContext = this;
|
|
7093
|
+
const default_obverser_config = {
|
|
7081
7094
|
/* 监听到元素有反馈,需执行的函数 */
|
|
7082
7095
|
callback: () => { },
|
|
7083
7096
|
config: {
|
|
@@ -7119,11 +7132,11 @@ class Utils {
|
|
|
7119
7132
|
immediate: false,
|
|
7120
7133
|
};
|
|
7121
7134
|
observer_config = UtilsContext.assign(default_obverser_config, observer_config);
|
|
7122
|
-
|
|
7135
|
+
const windowMutationObserver = this.windowApi.window.MutationObserver ||
|
|
7123
7136
|
this.windowApi.window.webkitMutationObserver ||
|
|
7124
7137
|
this.windowApi.window.MozMutationObserver;
|
|
7125
7138
|
// 观察者对象
|
|
7126
|
-
|
|
7139
|
+
const mutationObserver = new windowMutationObserver(function (mutations, observer) {
|
|
7127
7140
|
if (typeof observer_config.callback === "function") {
|
|
7128
7141
|
observer_config.callback(mutations, observer);
|
|
7129
7142
|
}
|
|
@@ -7136,7 +7149,7 @@ class Utils {
|
|
|
7136
7149
|
}
|
|
7137
7150
|
else if (UtilsContext.isJQuery(target)) {
|
|
7138
7151
|
/* 传入的参数是jQuery对象 */
|
|
7139
|
-
target.each((
|
|
7152
|
+
target.each((_, item) => {
|
|
7140
7153
|
mutationObserver.observe(item, observer_config.config);
|
|
7141
7154
|
});
|
|
7142
7155
|
}
|
|
@@ -7174,7 +7187,7 @@ class Utils {
|
|
|
7174
7187
|
threshold: [0.01, 0.99],
|
|
7175
7188
|
};
|
|
7176
7189
|
defaultOptions = this.assign(defaultOptions, options || {});
|
|
7177
|
-
|
|
7190
|
+
const intersectionObserver = new IntersectionObserver((entries, observer) => {
|
|
7178
7191
|
if (entries[0].isIntersecting) {
|
|
7179
7192
|
if (typeof callback === "function") {
|
|
7180
7193
|
callback(entries, observer);
|
|
@@ -7204,7 +7217,7 @@ class Utils {
|
|
|
7204
7217
|
return utils;
|
|
7205
7218
|
}
|
|
7206
7219
|
noConflictFunc(needReleaseObject, needReleaseName, functionNameList = [], release = true) {
|
|
7207
|
-
|
|
7220
|
+
const UtilsContext = this;
|
|
7208
7221
|
if (typeof needReleaseObject !== "object") {
|
|
7209
7222
|
throw new Error("Utils.noConflictFunc 参数 needReleaseObject 必须为 object 类型");
|
|
7210
7223
|
}
|
|
@@ -7214,7 +7227,7 @@ class Utils {
|
|
|
7214
7227
|
if (!Array.isArray(functionNameList)) {
|
|
7215
7228
|
throw new Error("Utils.noConflictFunc 参数 functionNameList 必须为 Array 类型");
|
|
7216
7229
|
}
|
|
7217
|
-
|
|
7230
|
+
const needReleaseKey = `__${needReleaseName}`;
|
|
7218
7231
|
/**
|
|
7219
7232
|
* 释放所有
|
|
7220
7233
|
*/
|
|
@@ -7302,7 +7315,9 @@ class Utils {
|
|
|
7302
7315
|
if (typeof dataUri !== "string") {
|
|
7303
7316
|
throw new Error("Utils.parseBase64ToBlob 参数 dataUri 必须为 string 类型");
|
|
7304
7317
|
}
|
|
7305
|
-
|
|
7318
|
+
const dataUriSplit = dataUri.split(","), dataUriMime = dataUriSplit[0].match(/:(.*?);/)[1], dataUriBase64Str = atob(dataUriSplit[1]);
|
|
7319
|
+
let dataUriLength = dataUriBase64Str.length;
|
|
7320
|
+
const u8arr = new Uint8Array(dataUriLength);
|
|
7306
7321
|
while (dataUriLength--) {
|
|
7307
7322
|
u8arr[dataUriLength] = dataUriBase64Str.charCodeAt(dataUriLength);
|
|
7308
7323
|
}
|
|
@@ -7317,7 +7332,9 @@ class Utils {
|
|
|
7317
7332
|
if (typeof fileName !== "string") {
|
|
7318
7333
|
throw new Error("Utils.parseBase64ToFile 参数 fileName 必须为 string 类型");
|
|
7319
7334
|
}
|
|
7320
|
-
|
|
7335
|
+
const dataUriSplit = dataUri.split(","), dataUriMime = dataUriSplit[0].match(/:(.*?);/)[1], dataUriBase64Str = atob(dataUriSplit[1]);
|
|
7336
|
+
let dataUriLength = dataUriBase64Str.length;
|
|
7337
|
+
const u8arr = new Uint8Array(dataUriLength);
|
|
7321
7338
|
while (dataUriLength--) {
|
|
7322
7339
|
u8arr[dataUriLength] = dataUriBase64Str.charCodeAt(dataUriLength);
|
|
7323
7340
|
}
|
|
@@ -7351,15 +7368,15 @@ class Utils {
|
|
|
7351
7368
|
}
|
|
7352
7369
|
parseCDATA(text = "") {
|
|
7353
7370
|
let result = "";
|
|
7354
|
-
|
|
7355
|
-
|
|
7371
|
+
const cdataRegexp = /<!\[CDATA\[([\s\S]*)\]\]>/;
|
|
7372
|
+
const cdataMatch = cdataRegexp.exec(text.trim());
|
|
7356
7373
|
if (cdataMatch && cdataMatch.length > 1) {
|
|
7357
7374
|
result = cdataMatch[cdataMatch.length - 1];
|
|
7358
7375
|
}
|
|
7359
7376
|
return result;
|
|
7360
7377
|
}
|
|
7361
7378
|
async parseFileToBase64(fileObj) {
|
|
7362
|
-
|
|
7379
|
+
const reader = new FileReader();
|
|
7363
7380
|
reader.readAsDataURL(fileObj);
|
|
7364
7381
|
return new Promise((resolve) => {
|
|
7365
7382
|
reader.onload = function (event) {
|
|
@@ -7368,14 +7385,14 @@ class Utils {
|
|
|
7368
7385
|
});
|
|
7369
7386
|
}
|
|
7370
7387
|
parseFromString(text, mimeType = "text/html") {
|
|
7371
|
-
|
|
7388
|
+
const parser = new DOMParser();
|
|
7372
7389
|
return parser.parseFromString(text, mimeType);
|
|
7373
7390
|
}
|
|
7374
7391
|
parseStringToRegExpString(text) {
|
|
7375
7392
|
if (typeof text !== "string") {
|
|
7376
7393
|
throw new TypeError("string必须是字符串");
|
|
7377
7394
|
}
|
|
7378
|
-
|
|
7395
|
+
const regString = text.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&");
|
|
7379
7396
|
return regString;
|
|
7380
7397
|
}
|
|
7381
7398
|
preventEvent(element, eventNameList = [], capture) {
|
|
@@ -7390,6 +7407,7 @@ class Utils {
|
|
|
7390
7407
|
}
|
|
7391
7408
|
if (arguments.length === 1) {
|
|
7392
7409
|
/* 直接阻止事件 */
|
|
7410
|
+
// eslint-disable-next-line prefer-rest-params
|
|
7393
7411
|
return stopEvent(arguments[0]);
|
|
7394
7412
|
}
|
|
7395
7413
|
else {
|
|
@@ -7405,11 +7423,11 @@ class Utils {
|
|
|
7405
7423
|
}
|
|
7406
7424
|
}
|
|
7407
7425
|
/**
|
|
7408
|
-
|
|
7409
|
-
|
|
7410
|
-
|
|
7411
|
-
|
|
7412
|
-
|
|
7426
|
+
* 在canvas元素节点上绘制进度圆圈
|
|
7427
|
+
* @example
|
|
7428
|
+
let progress = new Utils.Process({canvasNode:document.querySelector("canvas")});
|
|
7429
|
+
progress.draw();
|
|
7430
|
+
* **/
|
|
7413
7431
|
Progress = Progress;
|
|
7414
7432
|
registerTrustClickEvent(isTrustValue = true, filter) {
|
|
7415
7433
|
function trustEvent(event) {
|
|
@@ -7431,8 +7449,8 @@ class Utils {
|
|
|
7431
7449
|
}
|
|
7432
7450
|
const originalListener = EventTarget.prototype.addEventListener;
|
|
7433
7451
|
EventTarget.prototype.addEventListener = function (...args) {
|
|
7434
|
-
|
|
7435
|
-
|
|
7452
|
+
const type = args[0];
|
|
7453
|
+
const callback = args[1];
|
|
7436
7454
|
// let options = args[2];
|
|
7437
7455
|
if (filter(type)) {
|
|
7438
7456
|
if (typeof callback === "function") {
|
|
@@ -7441,7 +7459,7 @@ class Utils {
|
|
|
7441
7459
|
};
|
|
7442
7460
|
}
|
|
7443
7461
|
else if (typeof callback === "object" && "handleEvent" in callback) {
|
|
7444
|
-
|
|
7462
|
+
const oldHandleEvent = callback["handleEvent"];
|
|
7445
7463
|
args[1]["handleEvent"] = function (event) {
|
|
7446
7464
|
if (event == null) {
|
|
7447
7465
|
return;
|
|
@@ -7452,7 +7470,7 @@ class Utils {
|
|
|
7452
7470
|
event instanceof Proxy;
|
|
7453
7471
|
oldHandleEvent.call(this, trustEvent(event));
|
|
7454
7472
|
}
|
|
7455
|
-
catch
|
|
7473
|
+
catch {
|
|
7456
7474
|
Reflect.set(event, "isTrusted", isTrustValue);
|
|
7457
7475
|
}
|
|
7458
7476
|
};
|
|
@@ -7475,7 +7493,7 @@ class Utils {
|
|
|
7475
7493
|
return isNegative ? -reversedNum : reversedNum;
|
|
7476
7494
|
}
|
|
7477
7495
|
selectElementText(element, childTextNode, startIndex, endIndex) {
|
|
7478
|
-
|
|
7496
|
+
const range = this.windowApi.document.createRange();
|
|
7479
7497
|
range.selectNodeContents(element);
|
|
7480
7498
|
if (childTextNode) {
|
|
7481
7499
|
if (childTextNode.nodeType !== Node.TEXT_NODE) {
|
|
@@ -7486,7 +7504,7 @@ class Utils {
|
|
|
7486
7504
|
range.setEnd(childTextNode, endIndex);
|
|
7487
7505
|
}
|
|
7488
7506
|
}
|
|
7489
|
-
|
|
7507
|
+
const selection = this.windowApi.globalThis.getSelection();
|
|
7490
7508
|
if (selection) {
|
|
7491
7509
|
selection.removeAllRanges();
|
|
7492
7510
|
selection.addRange(range);
|
|
@@ -7514,7 +7532,7 @@ class Utils {
|
|
|
7514
7532
|
else {
|
|
7515
7533
|
textType = "text/plain";
|
|
7516
7534
|
}
|
|
7517
|
-
|
|
7535
|
+
const UtilsContext = this;
|
|
7518
7536
|
class UtilsClipboard {
|
|
7519
7537
|
#resolve;
|
|
7520
7538
|
#copyData;
|
|
@@ -7526,7 +7544,7 @@ class Utils {
|
|
|
7526
7544
|
}
|
|
7527
7545
|
async init() {
|
|
7528
7546
|
let copyStatus = false;
|
|
7529
|
-
|
|
7547
|
+
const requestPermissionStatus = await this.requestClipboardPermission();
|
|
7530
7548
|
console.log(requestPermissionStatus);
|
|
7531
7549
|
if (this.hasClipboard() && (this.hasClipboardWrite() || this.hasClipboardWriteText())) {
|
|
7532
7550
|
try {
|
|
@@ -7565,7 +7583,7 @@ class Utils {
|
|
|
7565
7583
|
*/
|
|
7566
7584
|
copyTextByTextArea() {
|
|
7567
7585
|
try {
|
|
7568
|
-
|
|
7586
|
+
const copyElement = UtilsContext.windowApi.document.createElement("textarea");
|
|
7569
7587
|
copyElement.value = this.#copyData;
|
|
7570
7588
|
copyElement.setAttribute("type", "text");
|
|
7571
7589
|
copyElement.setAttribute("style", "opacity:0;position:absolute;");
|
|
@@ -7585,20 +7603,17 @@ class Utils {
|
|
|
7585
7603
|
* 申请剪贴板权限
|
|
7586
7604
|
*/
|
|
7587
7605
|
requestClipboardPermission() {
|
|
7588
|
-
return new Promise((resolve
|
|
7606
|
+
return new Promise((resolve) => {
|
|
7589
7607
|
if (navigator.permissions && navigator.permissions.query) {
|
|
7590
7608
|
navigator.permissions
|
|
7591
7609
|
.query({
|
|
7592
7610
|
name: "clipboard-write",
|
|
7593
7611
|
})
|
|
7594
|
-
.then((
|
|
7612
|
+
.then(() => {
|
|
7595
7613
|
resolve(true);
|
|
7596
7614
|
})
|
|
7597
7615
|
.catch((error) => {
|
|
7598
|
-
console.error([
|
|
7599
|
-
"申请剪贴板权限失败,尝试直接写入👉",
|
|
7600
|
-
error.message ?? error.name ?? error.stack,
|
|
7601
|
-
]);
|
|
7616
|
+
console.error(["申请剪贴板权限失败,尝试直接写入👉", error.message ?? error.name ?? error.stack]);
|
|
7602
7617
|
resolve(false);
|
|
7603
7618
|
});
|
|
7604
7619
|
}
|
|
@@ -7625,7 +7640,7 @@ class Utils {
|
|
|
7625
7640
|
}
|
|
7626
7641
|
else {
|
|
7627
7642
|
/* 可复制对象 */
|
|
7628
|
-
|
|
7643
|
+
const textBlob = new Blob([this.#copyData], {
|
|
7629
7644
|
type: this.#copyDataType,
|
|
7630
7645
|
});
|
|
7631
7646
|
navigator.clipboard
|
|
@@ -7657,7 +7672,7 @@ class Utils {
|
|
|
7657
7672
|
});
|
|
7658
7673
|
}
|
|
7659
7674
|
setTimeout(callback, delayTime = 0) {
|
|
7660
|
-
|
|
7675
|
+
const UtilsContext = this;
|
|
7661
7676
|
if (typeof callback !== "function" && typeof callback !== "string") {
|
|
7662
7677
|
throw new TypeError("Utils.setTimeout 参数 callback 必须为 function|string 类型");
|
|
7663
7678
|
}
|
|
@@ -7671,7 +7686,7 @@ class Utils {
|
|
|
7671
7686
|
});
|
|
7672
7687
|
}
|
|
7673
7688
|
sleep(delayTime = 0) {
|
|
7674
|
-
|
|
7689
|
+
const UtilsContext = this;
|
|
7675
7690
|
if (typeof delayTime !== "number") {
|
|
7676
7691
|
throw new Error("Utils.sleep 参数 delayTime 必须为 number 类型");
|
|
7677
7692
|
}
|
|
@@ -7682,18 +7697,18 @@ class Utils {
|
|
|
7682
7697
|
});
|
|
7683
7698
|
}
|
|
7684
7699
|
dragSlider(selector, offsetX = this.windowApi.window.innerWidth) {
|
|
7685
|
-
|
|
7700
|
+
const UtilsContext = this;
|
|
7686
7701
|
function initMouseEvent(eventName, offSetX, offSetY) {
|
|
7687
|
-
|
|
7688
|
-
|
|
7702
|
+
const win = typeof unsafeWindow === "undefined" ? globalThis : unsafeWindow;
|
|
7703
|
+
const mouseEvent = UtilsContext.windowApi.document.createEvent("MouseEvents");
|
|
7689
7704
|
mouseEvent.initMouseEvent(eventName, true, true, win, 0, offSetX, offSetY, offSetX, offSetY, false, false, false, false, 0, null);
|
|
7690
7705
|
return mouseEvent;
|
|
7691
7706
|
}
|
|
7692
|
-
|
|
7707
|
+
const sliderElement = typeof selector === "string" ? domUtils.selector(selector) : selector;
|
|
7693
7708
|
if (!(sliderElement instanceof Node) || !(sliderElement instanceof Element)) {
|
|
7694
7709
|
throw new Error("Utils.dragSlider 参数selector 必须为Node/Element类型");
|
|
7695
7710
|
}
|
|
7696
|
-
|
|
7711
|
+
const rect = sliderElement.getBoundingClientRect(), x0 = rect.x || rect.left, y0 = rect.y || rect.top, x1 = x0 + offsetX, y1 = y0;
|
|
7697
7712
|
sliderElement.dispatchEvent(initMouseEvent("mousedown", x0, y0));
|
|
7698
7713
|
sliderElement.dispatchEvent(initMouseEvent("mousemove", x1, y1));
|
|
7699
7714
|
sliderElement.dispatchEvent(initMouseEvent("mouseleave", x1, y1));
|
|
@@ -7721,34 +7736,34 @@ class Utils {
|
|
|
7721
7736
|
console.error(err);
|
|
7722
7737
|
}
|
|
7723
7738
|
}
|
|
7724
|
-
exitFullScreen(
|
|
7725
|
-
if (
|
|
7726
|
-
return
|
|
7739
|
+
exitFullScreen($el = this.windowApi.document.documentElement) {
|
|
7740
|
+
if ($el.exitFullscreen) {
|
|
7741
|
+
return $el.exitFullscreen();
|
|
7727
7742
|
}
|
|
7728
|
-
else if (
|
|
7729
|
-
return
|
|
7743
|
+
else if ($el.msExitFullscreen) {
|
|
7744
|
+
return $el.msExitFullscreen();
|
|
7730
7745
|
}
|
|
7731
|
-
else if (
|
|
7732
|
-
return
|
|
7746
|
+
else if ($el.mozCancelFullScreen) {
|
|
7747
|
+
return $el.mozCancelFullScreen();
|
|
7733
7748
|
}
|
|
7734
|
-
else if (
|
|
7735
|
-
return
|
|
7749
|
+
else if ($el.webkitCancelFullScreen) {
|
|
7750
|
+
return $el.webkitCancelFullScreen();
|
|
7736
7751
|
}
|
|
7737
7752
|
else {
|
|
7738
|
-
return new Promise((
|
|
7753
|
+
return new Promise((_, reject) => {
|
|
7739
7754
|
reject(new TypeError("该浏览器不支持全屏API"));
|
|
7740
7755
|
});
|
|
7741
7756
|
}
|
|
7742
7757
|
}
|
|
7743
7758
|
sortListByProperty(data, getPropertyValueFunc, sortByDesc = true) {
|
|
7744
|
-
|
|
7759
|
+
const UtilsContext = this;
|
|
7745
7760
|
if (typeof getPropertyValueFunc !== "function" && typeof getPropertyValueFunc !== "string") {
|
|
7746
7761
|
throw new Error("Utils.sortListByProperty 参数 getPropertyValueFunc 必须为 function|string 类型");
|
|
7747
7762
|
}
|
|
7748
7763
|
if (typeof sortByDesc !== "boolean") {
|
|
7749
7764
|
throw new Error("Utils.sortListByProperty 参数 sortByDesc 必须为 boolean 类型");
|
|
7750
7765
|
}
|
|
7751
|
-
|
|
7766
|
+
const getObjValue = function (obj) {
|
|
7752
7767
|
return typeof getPropertyValueFunc === "string" ? obj[getPropertyValueFunc] : getPropertyValueFunc(obj);
|
|
7753
7768
|
};
|
|
7754
7769
|
/**
|
|
@@ -7757,9 +7772,9 @@ class Utils {
|
|
|
7757
7772
|
* @param {any} before_obj
|
|
7758
7773
|
* @returns
|
|
7759
7774
|
*/
|
|
7760
|
-
|
|
7761
|
-
|
|
7762
|
-
|
|
7775
|
+
const sortFunc = function (after_obj, before_obj) {
|
|
7776
|
+
const beforeValue = getObjValue(before_obj); /* 前 */
|
|
7777
|
+
const afterValue = getObjValue(after_obj); /* 后 */
|
|
7763
7778
|
if (sortByDesc) {
|
|
7764
7779
|
if (afterValue > beforeValue) {
|
|
7765
7780
|
return -1;
|
|
@@ -7788,19 +7803,18 @@ class Utils {
|
|
|
7788
7803
|
* @param nodeList 元素列表
|
|
7789
7804
|
* @param getNodeListFunc 获取元素列表的函数
|
|
7790
7805
|
*/
|
|
7791
|
-
|
|
7792
|
-
|
|
7806
|
+
const sortNodeFunc = function (nodeList, getNodeListFunc) {
|
|
7807
|
+
const nodeListLength = nodeList.length;
|
|
7793
7808
|
for (let i = 0; i < nodeListLength - 1; i++) {
|
|
7794
7809
|
for (let j = 0; j < nodeListLength - 1 - i; j++) {
|
|
7795
|
-
|
|
7796
|
-
|
|
7797
|
-
|
|
7798
|
-
|
|
7799
|
-
if ((sortByDesc == true && beforeValue < afterValue) ||
|
|
7800
|
-
(sortByDesc == false && beforeValue > afterValue)) {
|
|
7810
|
+
const beforeNode = nodeList[j];
|
|
7811
|
+
const afterNode = nodeList[j + 1];
|
|
7812
|
+
const beforeValue = getObjValue(beforeNode); /* 前 */
|
|
7813
|
+
const afterValue = getObjValue(afterNode); /* 后 */
|
|
7814
|
+
if ((sortByDesc == true && beforeValue < afterValue) || (sortByDesc == false && beforeValue > afterValue)) {
|
|
7801
7815
|
/* 升序/降序 */
|
|
7802
7816
|
/* 相邻元素两两对比 */
|
|
7803
|
-
|
|
7817
|
+
const temp = beforeNode.nextElementSibling;
|
|
7804
7818
|
afterNode.after(beforeNode);
|
|
7805
7819
|
if (temp == null) {
|
|
7806
7820
|
/* 如果为空,那么是最后一个元素,使用append */
|
|
@@ -7858,7 +7872,7 @@ class Utils {
|
|
|
7858
7872
|
return newTargetString;
|
|
7859
7873
|
}
|
|
7860
7874
|
startsWith(target, searchString, position = 0) {
|
|
7861
|
-
|
|
7875
|
+
const UtilsContext = this;
|
|
7862
7876
|
if (position > target.length) {
|
|
7863
7877
|
/* 超出目标字符串的长度 */
|
|
7864
7878
|
return false;
|
|
@@ -7902,7 +7916,7 @@ class Utils {
|
|
|
7902
7916
|
*/
|
|
7903
7917
|
toJSON = commonUtil.toJSON.bind(commonUtil);
|
|
7904
7918
|
toSearchParamsStr(obj, addPrefix) {
|
|
7905
|
-
|
|
7919
|
+
const UtilsContext = this;
|
|
7906
7920
|
let searhParamsStr = "";
|
|
7907
7921
|
if (Array.isArray(obj)) {
|
|
7908
7922
|
obj.forEach((item) => {
|
|
@@ -7910,7 +7924,7 @@ class Utils {
|
|
|
7910
7924
|
searhParamsStr += UtilsContext.toSearchParamsStr(item);
|
|
7911
7925
|
}
|
|
7912
7926
|
else {
|
|
7913
|
-
searhParamsStr +=
|
|
7927
|
+
searhParamsStr += `&${UtilsContext.toSearchParamsStr(item)}`;
|
|
7914
7928
|
}
|
|
7915
7929
|
});
|
|
7916
7930
|
}
|
|
@@ -7918,7 +7932,7 @@ class Utils {
|
|
|
7918
7932
|
searhParamsStr = new URLSearchParams(Object.entries(obj)).toString();
|
|
7919
7933
|
}
|
|
7920
7934
|
if (addPrefix && !searhParamsStr.startsWith("?")) {
|
|
7921
|
-
searhParamsStr =
|
|
7935
|
+
searhParamsStr = `?${searhParamsStr}`;
|
|
7922
7936
|
}
|
|
7923
7937
|
return searhParamsStr;
|
|
7924
7938
|
}
|
|
@@ -7966,7 +7980,7 @@ class Utils {
|
|
|
7966
7980
|
}
|
|
7967
7981
|
}
|
|
7968
7982
|
waitArrayLoopToEnd(data, handleFunc) {
|
|
7969
|
-
|
|
7983
|
+
const UtilsContext = this;
|
|
7970
7984
|
if (typeof handleFunc !== "function" && typeof handleFunc !== "string") {
|
|
7971
7985
|
throw new Error("Utils.waitArrayLoopToEnd 参数 handleDataFunction 必须为 function|string 类型");
|
|
7972
7986
|
}
|
|
@@ -7976,17 +7990,17 @@ class Utils {
|
|
|
7976
7990
|
}
|
|
7977
7991
|
wait(checkFn, timeout, parent) {
|
|
7978
7992
|
const UtilsContext = this;
|
|
7979
|
-
|
|
7993
|
+
const __timeout__ = typeof timeout === "number" ? timeout : 0;
|
|
7980
7994
|
return new Promise((resolve) => {
|
|
7981
|
-
|
|
7995
|
+
const observer = UtilsContext.mutationObserver(parent || UtilsContext.windowApi.document, {
|
|
7982
7996
|
config: {
|
|
7983
7997
|
subtree: true,
|
|
7984
7998
|
childList: true,
|
|
7985
7999
|
attributes: true,
|
|
7986
8000
|
},
|
|
7987
8001
|
immediate: true,
|
|
7988
|
-
callback(
|
|
7989
|
-
|
|
8002
|
+
callback(_, __observer__) {
|
|
8003
|
+
const result = checkFn();
|
|
7990
8004
|
if (result.success) {
|
|
7991
8005
|
// 取消观察器
|
|
7992
8006
|
if (typeof __observer__?.disconnect === "function") {
|
|
@@ -8010,9 +8024,9 @@ class Utils {
|
|
|
8010
8024
|
waitNode(...args) {
|
|
8011
8025
|
// 过滤掉undefined
|
|
8012
8026
|
args = args.filter((arg) => arg !== void 0);
|
|
8013
|
-
|
|
8027
|
+
const UtilsContext = this;
|
|
8014
8028
|
// 选择器
|
|
8015
|
-
|
|
8029
|
+
const selector = args[0];
|
|
8016
8030
|
// 父元素(监听的元素)
|
|
8017
8031
|
let parent = UtilsContext.windowApi.document;
|
|
8018
8032
|
// 超时时间
|
|
@@ -8022,7 +8036,7 @@ class Utils {
|
|
|
8022
8036
|
}
|
|
8023
8037
|
if (args.length === 1) ;
|
|
8024
8038
|
else if (args.length === 2) {
|
|
8025
|
-
|
|
8039
|
+
const secondParam = args[1];
|
|
8026
8040
|
if (typeof secondParam === "number") {
|
|
8027
8041
|
// "div",10000
|
|
8028
8042
|
timeout = secondParam;
|
|
@@ -8038,9 +8052,9 @@ class Utils {
|
|
|
8038
8052
|
else if (args.length === 3) {
|
|
8039
8053
|
// "div",document,10000
|
|
8040
8054
|
// 第二个参数,parent
|
|
8041
|
-
|
|
8055
|
+
const secondParam = args[1];
|
|
8042
8056
|
// 第三个参数,timeout
|
|
8043
|
-
|
|
8057
|
+
const thirdParam = args[2];
|
|
8044
8058
|
if (typeof secondParam === "object" && secondParam instanceof Node) {
|
|
8045
8059
|
parent = secondParam;
|
|
8046
8060
|
if (typeof thirdParam === "number") {
|
|
@@ -8059,9 +8073,9 @@ class Utils {
|
|
|
8059
8073
|
}
|
|
8060
8074
|
function getNode() {
|
|
8061
8075
|
if (Array.isArray(selector)) {
|
|
8062
|
-
|
|
8076
|
+
const result = [];
|
|
8063
8077
|
for (let index = 0; index < selector.length; index++) {
|
|
8064
|
-
|
|
8078
|
+
const node = domUtils.selector(selector[index]);
|
|
8065
8079
|
if (node) {
|
|
8066
8080
|
result.push(node);
|
|
8067
8081
|
}
|
|
@@ -8078,7 +8092,7 @@ class Utils {
|
|
|
8078
8092
|
}
|
|
8079
8093
|
}
|
|
8080
8094
|
return UtilsContext.wait(() => {
|
|
8081
|
-
|
|
8095
|
+
const node = getNode();
|
|
8082
8096
|
if (node) {
|
|
8083
8097
|
return {
|
|
8084
8098
|
success: true,
|
|
@@ -8096,9 +8110,9 @@ class Utils {
|
|
|
8096
8110
|
waitAnyNode(...args) {
|
|
8097
8111
|
// 过滤掉undefined
|
|
8098
8112
|
args = args.filter((arg) => arg !== void 0);
|
|
8099
|
-
|
|
8113
|
+
const UtilsContext = this;
|
|
8100
8114
|
// 选择器
|
|
8101
|
-
|
|
8115
|
+
const selectorList = args[0];
|
|
8102
8116
|
// 父元素(监听的元素)
|
|
8103
8117
|
let parent = UtilsContext.windowApi.document;
|
|
8104
8118
|
// 超时时间
|
|
@@ -8108,7 +8122,7 @@ class Utils {
|
|
|
8108
8122
|
}
|
|
8109
8123
|
if (args.length === 1) ;
|
|
8110
8124
|
else if (args.length === 2) {
|
|
8111
|
-
|
|
8125
|
+
const secondParam = args[1];
|
|
8112
8126
|
if (typeof secondParam === "number") {
|
|
8113
8127
|
// "div",10000
|
|
8114
8128
|
timeout = secondParam;
|
|
@@ -8124,9 +8138,9 @@ class Utils {
|
|
|
8124
8138
|
else if (args.length === 3) {
|
|
8125
8139
|
// "div",document,10000
|
|
8126
8140
|
// 第二个参数,parent
|
|
8127
|
-
|
|
8141
|
+
const secondParam = args[1];
|
|
8128
8142
|
// 第三个参数,timeout
|
|
8129
|
-
|
|
8143
|
+
const thirdParam = args[2];
|
|
8130
8144
|
if (typeof secondParam === "object" && secondParam instanceof Node) {
|
|
8131
8145
|
parent = secondParam;
|
|
8132
8146
|
if (typeof thirdParam === "number") {
|
|
@@ -8143,7 +8157,7 @@ class Utils {
|
|
|
8143
8157
|
else {
|
|
8144
8158
|
throw new TypeError("Utils.waitAnyNode 参数个数错误");
|
|
8145
8159
|
}
|
|
8146
|
-
|
|
8160
|
+
const promiseList = selectorList.map((selector) => {
|
|
8147
8161
|
return UtilsContext.waitNode(selector, parent, timeout);
|
|
8148
8162
|
});
|
|
8149
8163
|
return Promise.any(promiseList);
|
|
@@ -8151,9 +8165,9 @@ class Utils {
|
|
|
8151
8165
|
waitNodeList(...args) {
|
|
8152
8166
|
// 过滤掉undefined
|
|
8153
8167
|
args = args.filter((arg) => arg !== void 0);
|
|
8154
|
-
|
|
8168
|
+
const UtilsContext = this;
|
|
8155
8169
|
// 选择器数组
|
|
8156
|
-
|
|
8170
|
+
const selector = args[0];
|
|
8157
8171
|
// 父元素(监听的元素)
|
|
8158
8172
|
let parent = UtilsContext.windowApi.document;
|
|
8159
8173
|
// 超时时间
|
|
@@ -8163,7 +8177,7 @@ class Utils {
|
|
|
8163
8177
|
}
|
|
8164
8178
|
if (args.length === 1) ;
|
|
8165
8179
|
else if (args.length === 2) {
|
|
8166
|
-
|
|
8180
|
+
const secondParam = args[1];
|
|
8167
8181
|
if (typeof secondParam === "number") {
|
|
8168
8182
|
// "div",10000
|
|
8169
8183
|
timeout = secondParam;
|
|
@@ -8179,9 +8193,9 @@ class Utils {
|
|
|
8179
8193
|
else if (args.length === 3) {
|
|
8180
8194
|
// "div",document,10000
|
|
8181
8195
|
// 第二个参数,parent
|
|
8182
|
-
|
|
8196
|
+
const secondParam = args[1];
|
|
8183
8197
|
// 第三个参数,timeout
|
|
8184
|
-
|
|
8198
|
+
const thirdParam = args[2];
|
|
8185
8199
|
if (typeof secondParam === "object" && secondParam instanceof Node) {
|
|
8186
8200
|
parent = secondParam;
|
|
8187
8201
|
if (typeof thirdParam === "number") {
|
|
@@ -8200,9 +8214,9 @@ class Utils {
|
|
|
8200
8214
|
}
|
|
8201
8215
|
function getNodeList() {
|
|
8202
8216
|
if (Array.isArray(selector)) {
|
|
8203
|
-
|
|
8217
|
+
const result = [];
|
|
8204
8218
|
for (let index = 0; index < selector.length; index++) {
|
|
8205
|
-
|
|
8219
|
+
const nodeList = domUtils.selectorAll(selector[index], parent);
|
|
8206
8220
|
if (nodeList.length) {
|
|
8207
8221
|
result.push(nodeList);
|
|
8208
8222
|
}
|
|
@@ -8212,14 +8226,14 @@ class Utils {
|
|
|
8212
8226
|
}
|
|
8213
8227
|
}
|
|
8214
8228
|
else {
|
|
8215
|
-
|
|
8229
|
+
const nodeList = domUtils.selectorAll(selector, parent);
|
|
8216
8230
|
if (nodeList.length) {
|
|
8217
8231
|
return nodeList;
|
|
8218
8232
|
}
|
|
8219
8233
|
}
|
|
8220
8234
|
}
|
|
8221
8235
|
return UtilsContext.wait(() => {
|
|
8222
|
-
|
|
8236
|
+
const node = getNodeList();
|
|
8223
8237
|
if (node) {
|
|
8224
8238
|
return {
|
|
8225
8239
|
success: true,
|
|
@@ -8237,9 +8251,9 @@ class Utils {
|
|
|
8237
8251
|
waitAnyNodeList(...args) {
|
|
8238
8252
|
// 过滤掉undefined
|
|
8239
8253
|
args = args.filter((arg) => arg !== void 0);
|
|
8240
|
-
|
|
8254
|
+
const UtilsContext = this;
|
|
8241
8255
|
// 选择器数组
|
|
8242
|
-
|
|
8256
|
+
const selectorList = args[0];
|
|
8243
8257
|
// 父元素(监听的元素)
|
|
8244
8258
|
let parent = UtilsContext.windowApi.document;
|
|
8245
8259
|
// 超时时间
|
|
@@ -8249,7 +8263,7 @@ class Utils {
|
|
|
8249
8263
|
}
|
|
8250
8264
|
if (args.length === 1) ;
|
|
8251
8265
|
else if (args.length === 2) {
|
|
8252
|
-
|
|
8266
|
+
const secondParam = args[1];
|
|
8253
8267
|
if (typeof secondParam === "number") {
|
|
8254
8268
|
// "div",10000
|
|
8255
8269
|
timeout = secondParam;
|
|
@@ -8265,9 +8279,9 @@ class Utils {
|
|
|
8265
8279
|
else if (args.length === 3) {
|
|
8266
8280
|
// "div",document,10000
|
|
8267
8281
|
// 第二个参数,parent
|
|
8268
|
-
|
|
8282
|
+
const secondParam = args[1];
|
|
8269
8283
|
// 第三个参数,timeout
|
|
8270
|
-
|
|
8284
|
+
const thirdParam = args[2];
|
|
8271
8285
|
if (typeof secondParam === "object" && secondParam instanceof Node) {
|
|
8272
8286
|
parent = secondParam;
|
|
8273
8287
|
if (typeof thirdParam === "number") {
|
|
@@ -8284,7 +8298,7 @@ class Utils {
|
|
|
8284
8298
|
else {
|
|
8285
8299
|
throw new TypeError("Utils.waitAnyNodeList 参数个数错误");
|
|
8286
8300
|
}
|
|
8287
|
-
|
|
8301
|
+
const promiseList = selectorList.map((selector) => {
|
|
8288
8302
|
return UtilsContext.waitNodeList(selector, parent, timeout);
|
|
8289
8303
|
});
|
|
8290
8304
|
return Promise.any(promiseList);
|
|
@@ -8313,13 +8327,13 @@ class Utils {
|
|
|
8313
8327
|
});
|
|
8314
8328
|
}
|
|
8315
8329
|
waitPropertyByInterval(checkObj, checkPropertyName, intervalTimer = 250, maxTime = -1) {
|
|
8316
|
-
|
|
8330
|
+
const UtilsContext = this;
|
|
8317
8331
|
if (checkObj == null) {
|
|
8318
8332
|
throw new TypeError("checkObj 不能为空对象 ");
|
|
8319
8333
|
}
|
|
8320
8334
|
let isResolve = false;
|
|
8321
8335
|
return new Promise((resolve, reject) => {
|
|
8322
|
-
|
|
8336
|
+
const interval = UtilsContext.workerSetInterval(() => {
|
|
8323
8337
|
let obj = checkObj;
|
|
8324
8338
|
if (typeof checkObj === "function") {
|
|
8325
8339
|
obj = checkObj();
|
|
@@ -8352,7 +8366,7 @@ class Utils {
|
|
|
8352
8366
|
throw new Error("Utils.waitVueByInterval 参数element 不能为空");
|
|
8353
8367
|
}
|
|
8354
8368
|
let flag = false;
|
|
8355
|
-
|
|
8369
|
+
const UtilsContext = this;
|
|
8356
8370
|
try {
|
|
8357
8371
|
await UtilsContext.waitPropertyByInterval(element, function (targetElement) {
|
|
8358
8372
|
if (targetElement == null) {
|
|
@@ -8364,7 +8378,7 @@ class Utils {
|
|
|
8364
8378
|
if (propertyName == null) {
|
|
8365
8379
|
return true;
|
|
8366
8380
|
}
|
|
8367
|
-
|
|
8381
|
+
const vueObject = targetElement[vueName];
|
|
8368
8382
|
if (typeof propertyName === "string") {
|
|
8369
8383
|
if (propertyName in vueObject) {
|
|
8370
8384
|
flag = true;
|
|
@@ -8380,6 +8394,7 @@ class Utils {
|
|
|
8380
8394
|
}
|
|
8381
8395
|
return false;
|
|
8382
8396
|
}, timer, maxTime);
|
|
8397
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8383
8398
|
}
|
|
8384
8399
|
catch (error) {
|
|
8385
8400
|
return flag;
|
|
@@ -8438,7 +8453,7 @@ class Utils {
|
|
|
8438
8453
|
if (target == null) {
|
|
8439
8454
|
return;
|
|
8440
8455
|
}
|
|
8441
|
-
|
|
8456
|
+
const handleResult = handler(target);
|
|
8442
8457
|
if (handleResult && typeof handleResult.isFind === "boolean" && handleResult.isFind) {
|
|
8443
8458
|
return handleResult.data;
|
|
8444
8459
|
}
|
|
@@ -8451,10 +8466,10 @@ class Utils {
|
|
|
8451
8466
|
*/
|
|
8452
8467
|
async asyncQueryProperty(target, handler) {
|
|
8453
8468
|
if (target == null) {
|
|
8454
|
-
// @ts-
|
|
8469
|
+
// @ts-expect-error 空返回
|
|
8455
8470
|
return;
|
|
8456
8471
|
}
|
|
8457
|
-
|
|
8472
|
+
const handleResult = await handler(target);
|
|
8458
8473
|
if (handleResult && typeof handleResult.isFind === "boolean" && handleResult.isFind) {
|
|
8459
8474
|
return handleResult.data;
|
|
8460
8475
|
}
|
|
@@ -8562,6 +8577,7 @@ class Utils {
|
|
|
8562
8577
|
workerSetTimeout(callback, timeout = 0) {
|
|
8563
8578
|
try {
|
|
8564
8579
|
return setTimeout$1(callback, timeout);
|
|
8580
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8565
8581
|
}
|
|
8566
8582
|
catch (error) {
|
|
8567
8583
|
return this.windowApi.setTimeout(callback, timeout);
|
|
@@ -8576,8 +8592,10 @@ class Utils {
|
|
|
8576
8592
|
if (timeId != null) {
|
|
8577
8593
|
clearTimeout$1(timeId);
|
|
8578
8594
|
}
|
|
8595
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8579
8596
|
}
|
|
8580
8597
|
catch (error) {
|
|
8598
|
+
// console.log(error);
|
|
8581
8599
|
}
|
|
8582
8600
|
finally {
|
|
8583
8601
|
this.windowApi.clearTimeout(timeId);
|
|
@@ -8591,6 +8609,7 @@ class Utils {
|
|
|
8591
8609
|
workerSetInterval(callback, timeout = 0) {
|
|
8592
8610
|
try {
|
|
8593
8611
|
return setInterval(callback, timeout);
|
|
8612
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8594
8613
|
}
|
|
8595
8614
|
catch (error) {
|
|
8596
8615
|
return this.windowApi.setInterval(callback, timeout);
|
|
@@ -8605,8 +8624,10 @@ class Utils {
|
|
|
8605
8624
|
if (timeId != null) {
|
|
8606
8625
|
clearInterval(timeId);
|
|
8607
8626
|
}
|
|
8627
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
8608
8628
|
}
|
|
8609
8629
|
catch (error) {
|
|
8630
|
+
// console.log(error);
|
|
8610
8631
|
}
|
|
8611
8632
|
finally {
|
|
8612
8633
|
this.windowApi.clearInterval(timeId);
|
|
@@ -8640,10 +8661,10 @@ class Utils {
|
|
|
8640
8661
|
.query({
|
|
8641
8662
|
name: "clipboard-read",
|
|
8642
8663
|
})
|
|
8643
|
-
.then((
|
|
8664
|
+
.then(() => {
|
|
8644
8665
|
readClipboardText();
|
|
8645
8666
|
})
|
|
8646
|
-
.catch((
|
|
8667
|
+
.catch(() => {
|
|
8647
8668
|
/* 该权限申请Api可能在该环境下不生效,尝试直接读取剪贴板 */
|
|
8648
8669
|
readClipboardText();
|
|
8649
8670
|
});
|
|
@@ -8680,7 +8701,7 @@ class Utils {
|
|
|
8680
8701
|
});
|
|
8681
8702
|
}
|
|
8682
8703
|
}
|
|
8683
|
-
|
|
8704
|
+
const utils = new Utils();
|
|
8684
8705
|
|
|
8685
8706
|
module.exports = utils;
|
|
8686
8707
|
//# sourceMappingURL=index.cjs.js.map
|