@gjzq/sdk 1.4.0-beta.2 → 1.4.0-beta.4
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/dist/{index-Clzjdhbd.js → index-CvWGodSd.js} +49 -39
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/pure.js +1 -1
- package/es/checkLoginForWeb/index.mjs +6 -0
- package/es/utils/const.mjs +17 -3
- package/es/utils/funcs.mjs +21 -30
- package/package.json +1 -1
|
@@ -184,6 +184,7 @@ var Env;
|
|
|
184
184
|
Env["FZ"] = "fz";
|
|
185
185
|
Env["PRE"] = "pre";
|
|
186
186
|
Env["PROD"] = "prod";
|
|
187
|
+
Env["LOCAL"] = "local";
|
|
187
188
|
})(Env || (Env = {}));
|
|
188
189
|
/**
|
|
189
190
|
* appId枚举
|
|
@@ -270,9 +271,10 @@ var LinkParamsEnvEnum;
|
|
|
270
271
|
LinkParamsEnvEnum[LinkParamsEnvEnum["REDIRECT"] = 2] = "REDIRECT";
|
|
271
272
|
LinkParamsEnvEnum[LinkParamsEnvEnum["OPEN_APP"] = 3] = "OPEN_APP";
|
|
272
273
|
})(LinkParamsEnvEnum || (LinkParamsEnvEnum = {}));
|
|
273
|
-
var WEBAPPS_HOST = (_a = {}, _a[Env.DEV] = 'https://devwebapps.yjbtest.com', _a[Env.FZ] = 'https://fzwebapps.yjbtest.com', _a[Env.PRE] = 'https://prewebapps.yongjinbao.com.cn', _a[Env.PROD] = 'https://webapps.yongjinbao.com.cn', _a);
|
|
274
|
-
var PAYMENT_DOMAIN = (_b = {}, _b[Env.DEV] = 'https://devpayment.yjbtest.com', _b[Env.FZ] = 'https://fzpayment.yjbtest.com', _b[Env.PRE] = 'https://prepayment.yongjinbao.com.cn', _b[Env.PROD] = 'https://payment.yongjinbao.com.cn', _b);
|
|
274
|
+
var WEBAPPS_HOST = (_a = {}, _a[Env.LOCAL] = location.origin, _a[Env.DEV] = 'https://devwebapps.yjbtest.com', _a[Env.FZ] = 'https://fzwebapps.yjbtest.com', _a[Env.PRE] = 'https://prewebapps.yongjinbao.com.cn', _a[Env.PROD] = 'https://webapps.yongjinbao.com.cn', _a);
|
|
275
|
+
var PAYMENT_DOMAIN = (_b = {}, _b[Env.LOCAL] = location.origin, _b[Env.DEV] = 'https://devpayment.yjbtest.com', _b[Env.FZ] = 'https://fzpayment.yjbtest.com', _b[Env.PRE] = 'https://prepayment.yongjinbao.com.cn', _b[Env.PROD] = 'https://payment.yongjinbao.com.cn', _b);
|
|
275
276
|
var envRules = {
|
|
277
|
+
local: [],
|
|
276
278
|
dev: [/^https?:\/\/dev.*\.yjbtest\.com$/,
|
|
277
279
|
// dev*.yjbtest.com
|
|
278
280
|
/^https?:\/\/localhost(:\d+)?$/,
|
|
@@ -284,6 +286,18 @@ var envRules = {
|
|
|
284
286
|
prod: [/^https?:\/\/(?!pre).*\.yongjinbao\.com\.cn$/ // *.yongjinbao.com.cn,但排除 pre
|
|
285
287
|
]
|
|
286
288
|
};
|
|
289
|
+
var envRulesUseLocal = {
|
|
290
|
+
local: [/^https?:\/\/localhost(:\d+)?$/,
|
|
291
|
+
// localhost,支持端口号
|
|
292
|
+
/^https?:\/\/172\.28\.\d+\.\d+(:\d+)?$/ // 172.28.*.*,支持端口号
|
|
293
|
+
],
|
|
294
|
+
dev: [/^https?:\/\/dev.*\.yjbtest\.com$/ // dev*.yjbtest.com
|
|
295
|
+
],
|
|
296
|
+
fz: [/^https?:\/\/fz.*\.yjbtest\.com$/],
|
|
297
|
+
pre: [/^https?:\/\/pre.*\.yongjinbao\.com\.cn$/],
|
|
298
|
+
prod: [/^https?:\/\/(?!pre).*\.yongjinbao\.com\.cn$/ // *.yongjinbao.com.cn,但排除 pre
|
|
299
|
+
]
|
|
300
|
+
};
|
|
287
301
|
|
|
288
302
|
/**
|
|
289
303
|
* 判断一个值是否是函数
|
|
@@ -323,11 +337,11 @@ function isWKWebView() {
|
|
|
323
337
|
* @returns true 如果已就绪,否则 false
|
|
324
338
|
*/
|
|
325
339
|
function isBridgeReady() {
|
|
326
|
-
// Android
|
|
340
|
+
// Android
|
|
327
341
|
if (window.yjbInterface && isFunction$2(window.yjbInterface.execute)) {
|
|
328
342
|
return true;
|
|
329
343
|
}
|
|
330
|
-
// iOS
|
|
344
|
+
// iOS
|
|
331
345
|
if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.yjbInterface && isFunction$2(window.webkit.messageHandlers.yjbInterface.postMessage)) {
|
|
332
346
|
return true;
|
|
333
347
|
}
|
|
@@ -400,49 +414,39 @@ function decrypt(value, key) {
|
|
|
400
414
|
}
|
|
401
415
|
// web登录设置
|
|
402
416
|
var getWebappsPath = function getWebappsPath() {
|
|
403
|
-
var
|
|
404
|
-
var
|
|
405
|
-
// 兼容不带dev,fz 的host
|
|
406
|
-
var matchRes = reg.exec(location.origin);
|
|
407
|
-
var mKey = matchRes ? matchRes[1] : null;
|
|
408
|
-
if (location.origin.includes('yongjinbao.com')) {
|
|
409
|
-
hostStr = WEBAPPS_HOST['prod'];
|
|
410
|
-
} else {
|
|
411
|
-
if (mKey) {
|
|
412
|
-
hostStr = WEBAPPS_HOST[mKey];
|
|
413
|
-
} else if (location.origin.includes('yjbtest.com')) {
|
|
414
|
-
hostStr = WEBAPPS_HOST['fz'];
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
+
var env = getEnv(true).env;
|
|
418
|
+
var hostStr = WEBAPPS_HOST[env];
|
|
417
419
|
return "".concat(hostStr, "/yjbwebservice/core");
|
|
418
420
|
};
|
|
419
421
|
var getApiUrlPath = function getApiUrlPath() {
|
|
420
422
|
if (window.Login_API_URL) return window.Login_API_URL;
|
|
421
|
-
|
|
422
|
-
var env = window.envConfig.env || Env.PROD;
|
|
423
|
-
var hostStr = WEBAPPS_HOST[env];
|
|
424
|
-
return "".concat(hostStr, "/yjbwebservice/core");
|
|
425
|
-
}
|
|
426
|
-
return "".concat(location.origin, "/yjbwebservice/core");
|
|
423
|
+
return getWebappsPath();
|
|
427
424
|
};
|
|
428
|
-
function getWebappsEnv(origin, fallback) {
|
|
425
|
+
function getWebappsEnv(origin, fallback, useLocal) {
|
|
429
426
|
if (fallback === void 0) {
|
|
430
427
|
fallback = Env.PROD;
|
|
431
428
|
}
|
|
432
|
-
|
|
429
|
+
if (useLocal === void 0) {
|
|
430
|
+
useLocal = false;
|
|
431
|
+
}
|
|
432
|
+
var envRule = useLocal ? envRulesUseLocal : envRules;
|
|
433
|
+
for (var _i = 0, _a = Object.entries(envRule); _i < _a.length; _i++) {
|
|
433
434
|
var _b = _a[_i],
|
|
434
435
|
env = _b[0],
|
|
435
436
|
rules = _b[1];
|
|
436
|
-
for (var _c = 0,
|
|
437
|
-
var rule =
|
|
438
|
-
if (rule.test(origin)) {
|
|
437
|
+
for (var _c = 0, _d = rules; _c < _d.length; _c++) {
|
|
438
|
+
var rule = _d[_c];
|
|
439
|
+
if (rule.test(origin) && origin) {
|
|
439
440
|
return env;
|
|
440
441
|
}
|
|
441
442
|
}
|
|
442
443
|
}
|
|
443
444
|
return fallback;
|
|
444
445
|
}
|
|
445
|
-
function getEnv() {
|
|
446
|
+
function getEnv(useLocal) {
|
|
447
|
+
if (useLocal === void 0) {
|
|
448
|
+
useLocal = false;
|
|
449
|
+
}
|
|
446
450
|
// 默认webapps环境
|
|
447
451
|
var host = WEBAPPS;
|
|
448
452
|
var defaultEnv = {
|
|
@@ -463,7 +467,8 @@ function getEnv() {
|
|
|
463
467
|
}
|
|
464
468
|
} else {
|
|
465
469
|
var ORI = location.origin;
|
|
466
|
-
defaultEnv.env = getWebappsEnv(ORI);
|
|
470
|
+
defaultEnv.env = getWebappsEnv(ORI, Env.PROD, useLocal);
|
|
471
|
+
console.log(1111, defaultEnv);
|
|
467
472
|
}
|
|
468
473
|
return defaultEnv;
|
|
469
474
|
}
|
|
@@ -6354,6 +6359,14 @@ function loginWithTokenForWeb(loginType) {
|
|
|
6354
6359
|
});
|
|
6355
6360
|
}
|
|
6356
6361
|
|
|
6362
|
+
/**
|
|
6363
|
+
* 注销用户号登录 4016
|
|
6364
|
+
* @function userLogOut
|
|
6365
|
+
*/
|
|
6366
|
+
var userLogOut = function userLogOut() {
|
|
6367
|
+
nativeIOOperation(4016, {});
|
|
6368
|
+
};
|
|
6369
|
+
|
|
6357
6370
|
/**
|
|
6358
6371
|
* 检查登录状态
|
|
6359
6372
|
* @function checkLogin
|
|
@@ -6383,6 +6396,11 @@ function checkLoginForWeb(loginType) {
|
|
|
6383
6396
|
case 3:
|
|
6384
6397
|
loginResult = _a.sent();
|
|
6385
6398
|
console.log('loginResult: ', loginResult);
|
|
6399
|
+
// 1113 新增用户注销判断,需退登客户端
|
|
6400
|
+
if (loginResult.code === -4) {
|
|
6401
|
+
userLogOut();
|
|
6402
|
+
return [2 /*return*/, 0];
|
|
6403
|
+
}
|
|
6386
6404
|
if (loginResult.code !== 0) {
|
|
6387
6405
|
// 2025.01.02 经讨论 退登不解绑!!
|
|
6388
6406
|
// 解绑userId
|
|
@@ -9285,14 +9303,6 @@ var userLoginModal = function userLoginModal(json) {
|
|
|
9285
9303
|
return nativeIOOperation(4028, params);
|
|
9286
9304
|
};
|
|
9287
9305
|
|
|
9288
|
-
/**
|
|
9289
|
-
* 注销用户号登录 4016
|
|
9290
|
-
* @function userLogOut
|
|
9291
|
-
*/
|
|
9292
|
-
var userLogOut = function userLogOut() {
|
|
9293
|
-
nativeIOOperation(4016, {});
|
|
9294
|
-
};
|
|
9295
|
-
|
|
9296
9306
|
/**
|
|
9297
9307
|
* 活体检测 3018
|
|
9298
9308
|
* @function VivoDetectionParams
|
package/dist/index.d.ts
CHANGED
|
@@ -245,7 +245,7 @@ declare const checkLogin: (loginType: string, channelId: string) => Promise<any>
|
|
|
245
245
|
* @param {string} loginType 登录类型
|
|
246
246
|
* @returns {Promise<boolean>}
|
|
247
247
|
*/
|
|
248
|
-
declare function checkLoginForWeb(loginType: string): Promise<boolean>;
|
|
248
|
+
declare function checkLoginForWeb(loginType: string): Promise<boolean | Number>;
|
|
249
249
|
|
|
250
250
|
/**
|
|
251
251
|
* marginAccount登录状态检查
|
package/dist/index.js
CHANGED
package/dist/pure.js
CHANGED
|
@@ -12,6 +12,7 @@ import { loginWithToken } from '../loginWithToken/index.mjs';
|
|
|
12
12
|
import { loginWithTokenForWeb } from '../loginWithTokenForWeb/index.mjs';
|
|
13
13
|
import { LoginType, useHybridLogin, CHANNELID } from '../utils/const.mjs';
|
|
14
14
|
import { getQueryString } from '../utils/urlFuncs.mjs';
|
|
15
|
+
import { userLogOut } from '../userLogOut/index.mjs';
|
|
15
16
|
|
|
16
17
|
/**
|
|
17
18
|
* 检查登录状态
|
|
@@ -42,6 +43,11 @@ function checkLoginForWeb(loginType) {
|
|
|
42
43
|
case 3:
|
|
43
44
|
loginResult = _a.sent();
|
|
44
45
|
console.log('loginResult: ', loginResult);
|
|
46
|
+
// 1113 新增用户注销判断,需退登客户端
|
|
47
|
+
if (loginResult.code === -4) {
|
|
48
|
+
userLogOut();
|
|
49
|
+
return [2 /*return*/, 0];
|
|
50
|
+
}
|
|
45
51
|
if (loginResult.code !== 0) {
|
|
46
52
|
// 2025.01.02 经讨论 退登不解绑!!
|
|
47
53
|
// 解绑userId
|
package/es/utils/const.mjs
CHANGED
|
@@ -30,6 +30,7 @@ var Env;
|
|
|
30
30
|
Env["FZ"] = "fz";
|
|
31
31
|
Env["PRE"] = "pre";
|
|
32
32
|
Env["PROD"] = "prod";
|
|
33
|
+
Env["LOCAL"] = "local";
|
|
33
34
|
})(Env || (Env = {}));
|
|
34
35
|
/**
|
|
35
36
|
* appId枚举
|
|
@@ -116,9 +117,10 @@ var LinkParamsEnvEnum;
|
|
|
116
117
|
LinkParamsEnvEnum[LinkParamsEnvEnum["REDIRECT"] = 2] = "REDIRECT";
|
|
117
118
|
LinkParamsEnvEnum[LinkParamsEnvEnum["OPEN_APP"] = 3] = "OPEN_APP";
|
|
118
119
|
})(LinkParamsEnvEnum || (LinkParamsEnvEnum = {}));
|
|
119
|
-
var WEBAPPS_HOST = (_a = {}, _a[Env.DEV] = 'https://devwebapps.yjbtest.com', _a[Env.FZ] = 'https://fzwebapps.yjbtest.com', _a[Env.PRE] = 'https://prewebapps.yongjinbao.com.cn', _a[Env.PROD] = 'https://webapps.yongjinbao.com.cn', _a);
|
|
120
|
-
var PAYMENT_DOMAIN = (_b = {}, _b[Env.DEV] = 'https://devpayment.yjbtest.com', _b[Env.FZ] = 'https://fzpayment.yjbtest.com', _b[Env.PRE] = 'https://prepayment.yongjinbao.com.cn', _b[Env.PROD] = 'https://payment.yongjinbao.com.cn', _b);
|
|
120
|
+
var WEBAPPS_HOST = (_a = {}, _a[Env.LOCAL] = location.origin, _a[Env.DEV] = 'https://devwebapps.yjbtest.com', _a[Env.FZ] = 'https://fzwebapps.yjbtest.com', _a[Env.PRE] = 'https://prewebapps.yongjinbao.com.cn', _a[Env.PROD] = 'https://webapps.yongjinbao.com.cn', _a);
|
|
121
|
+
var PAYMENT_DOMAIN = (_b = {}, _b[Env.LOCAL] = location.origin, _b[Env.DEV] = 'https://devpayment.yjbtest.com', _b[Env.FZ] = 'https://fzpayment.yjbtest.com', _b[Env.PRE] = 'https://prepayment.yongjinbao.com.cn', _b[Env.PROD] = 'https://payment.yongjinbao.com.cn', _b);
|
|
121
122
|
var envRules = {
|
|
123
|
+
local: [],
|
|
122
124
|
dev: [/^https?:\/\/dev.*\.yjbtest\.com$/,
|
|
123
125
|
// dev*.yjbtest.com
|
|
124
126
|
/^https?:\/\/localhost(:\d+)?$/,
|
|
@@ -130,5 +132,17 @@ var envRules = {
|
|
|
130
132
|
prod: [/^https?:\/\/(?!pre).*\.yongjinbao\.com\.cn$/ // *.yongjinbao.com.cn,但排除 pre
|
|
131
133
|
]
|
|
132
134
|
};
|
|
135
|
+
var envRulesUseLocal = {
|
|
136
|
+
local: [/^https?:\/\/localhost(:\d+)?$/,
|
|
137
|
+
// localhost,支持端口号
|
|
138
|
+
/^https?:\/\/172\.28\.\d+\.\d+(:\d+)?$/ // 172.28.*.*,支持端口号
|
|
139
|
+
],
|
|
140
|
+
dev: [/^https?:\/\/dev.*\.yjbtest\.com$/ // dev*.yjbtest.com
|
|
141
|
+
],
|
|
142
|
+
fz: [/^https?:\/\/fz.*\.yjbtest\.com$/],
|
|
143
|
+
pre: [/^https?:\/\/pre.*\.yongjinbao\.com\.cn$/],
|
|
144
|
+
prod: [/^https?:\/\/(?!pre).*\.yongjinbao\.com\.cn$/ // *.yongjinbao.com.cn,但排除 pre
|
|
145
|
+
]
|
|
146
|
+
};
|
|
133
147
|
|
|
134
|
-
export { ALL_NO_SYSTEM_PARAM_KEYS, AccountType, AppId, CHANNELID, DEFAULT_RESPONSE, Env, HYBRID, LOGOUT_TYPE, LinkPageEnvEnum, LinkParamsEnvEnum, LinkTypeEnum, LoginPlaceholderEnum, LoginResult, LoginType, LoginTypeEnum, MESSAGE, NO_TOKEN, PAYMENT_DOMAIN, ReadFileType, WEBAPPS, WEBAPPS_HOST, envRules, isAndroid, isIos, isMini, useHybridLogin };
|
|
148
|
+
export { ALL_NO_SYSTEM_PARAM_KEYS, AccountType, AppId, CHANNELID, DEFAULT_RESPONSE, Env, HYBRID, LOGOUT_TYPE, LinkPageEnvEnum, LinkParamsEnvEnum, LinkTypeEnum, LoginPlaceholderEnum, LoginResult, LoginType, LoginTypeEnum, MESSAGE, NO_TOKEN, PAYMENT_DOMAIN, ReadFileType, WEBAPPS, WEBAPPS_HOST, envRules, envRulesUseLocal, isAndroid, isIos, isMini, useHybridLogin };
|
package/es/utils/funcs.mjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import AES from 'crypto-js/aes.js';
|
|
2
2
|
import Utf8 from 'crypto-js/enc-utf8.js';
|
|
3
3
|
import ECB from 'crypto-js/mode-ecb.js';
|
|
4
|
-
import {
|
|
4
|
+
import { PAYMENT_DOMAIN, WEBAPPS_HOST, Env, HYBRID, WEBAPPS, envRulesUseLocal, envRules } from './const.mjs';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* 判断一个值是否是函数
|
|
@@ -41,11 +41,11 @@ function isWKWebView() {
|
|
|
41
41
|
* @returns true 如果已就绪,否则 false
|
|
42
42
|
*/
|
|
43
43
|
function isBridgeReady() {
|
|
44
|
-
// Android
|
|
44
|
+
// Android
|
|
45
45
|
if (window.yjbInterface && isFunction$2(window.yjbInterface.execute)) {
|
|
46
46
|
return true;
|
|
47
47
|
}
|
|
48
|
-
// iOS
|
|
48
|
+
// iOS
|
|
49
49
|
if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.yjbInterface && isFunction$2(window.webkit.messageHandlers.yjbInterface.postMessage)) {
|
|
50
50
|
return true;
|
|
51
51
|
}
|
|
@@ -118,49 +118,39 @@ function decrypt(value, key) {
|
|
|
118
118
|
}
|
|
119
119
|
// web登录设置
|
|
120
120
|
var getWebappsPath = function getWebappsPath() {
|
|
121
|
-
var
|
|
122
|
-
var
|
|
123
|
-
// 兼容不带dev,fz 的host
|
|
124
|
-
var matchRes = reg.exec(location.origin);
|
|
125
|
-
var mKey = matchRes ? matchRes[1] : null;
|
|
126
|
-
if (location.origin.includes('yongjinbao.com')) {
|
|
127
|
-
hostStr = WEBAPPS_HOST['prod'];
|
|
128
|
-
} else {
|
|
129
|
-
if (mKey) {
|
|
130
|
-
hostStr = WEBAPPS_HOST[mKey];
|
|
131
|
-
} else if (location.origin.includes('yjbtest.com')) {
|
|
132
|
-
hostStr = WEBAPPS_HOST['fz'];
|
|
133
|
-
}
|
|
134
|
-
}
|
|
121
|
+
var env = getEnv(true).env;
|
|
122
|
+
var hostStr = WEBAPPS_HOST[env];
|
|
135
123
|
return "".concat(hostStr, "/yjbwebservice/core");
|
|
136
124
|
};
|
|
137
125
|
var getApiUrlPath = function getApiUrlPath() {
|
|
138
126
|
if (window.Login_API_URL) return window.Login_API_URL;
|
|
139
|
-
|
|
140
|
-
var env = window.envConfig.env || Env.PROD;
|
|
141
|
-
var hostStr = WEBAPPS_HOST[env];
|
|
142
|
-
return "".concat(hostStr, "/yjbwebservice/core");
|
|
143
|
-
}
|
|
144
|
-
return "".concat(location.origin, "/yjbwebservice/core");
|
|
127
|
+
return getWebappsPath();
|
|
145
128
|
};
|
|
146
|
-
function getWebappsEnv(origin, fallback) {
|
|
129
|
+
function getWebappsEnv(origin, fallback, useLocal) {
|
|
147
130
|
if (fallback === void 0) {
|
|
148
131
|
fallback = Env.PROD;
|
|
149
132
|
}
|
|
150
|
-
|
|
133
|
+
if (useLocal === void 0) {
|
|
134
|
+
useLocal = false;
|
|
135
|
+
}
|
|
136
|
+
var envRule = useLocal ? envRulesUseLocal : envRules;
|
|
137
|
+
for (var _i = 0, _a = Object.entries(envRule); _i < _a.length; _i++) {
|
|
151
138
|
var _b = _a[_i],
|
|
152
139
|
env = _b[0],
|
|
153
140
|
rules = _b[1];
|
|
154
|
-
for (var _c = 0,
|
|
155
|
-
var rule =
|
|
156
|
-
if (rule.test(origin)) {
|
|
141
|
+
for (var _c = 0, _d = rules; _c < _d.length; _c++) {
|
|
142
|
+
var rule = _d[_c];
|
|
143
|
+
if (rule.test(origin) && origin) {
|
|
157
144
|
return env;
|
|
158
145
|
}
|
|
159
146
|
}
|
|
160
147
|
}
|
|
161
148
|
return fallback;
|
|
162
149
|
}
|
|
163
|
-
function getEnv() {
|
|
150
|
+
function getEnv(useLocal) {
|
|
151
|
+
if (useLocal === void 0) {
|
|
152
|
+
useLocal = false;
|
|
153
|
+
}
|
|
164
154
|
// 默认webapps环境
|
|
165
155
|
var host = WEBAPPS;
|
|
166
156
|
var defaultEnv = {
|
|
@@ -181,7 +171,8 @@ function getEnv() {
|
|
|
181
171
|
}
|
|
182
172
|
} else {
|
|
183
173
|
var ORI = location.origin;
|
|
184
|
-
defaultEnv.env = getWebappsEnv(ORI);
|
|
174
|
+
defaultEnv.env = getWebappsEnv(ORI, Env.PROD, useLocal);
|
|
175
|
+
console.log(1111, defaultEnv);
|
|
185
176
|
}
|
|
186
177
|
return defaultEnv;
|
|
187
178
|
}
|