@akanjs/next 0.0.54 → 0.0.55
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/bootCsr.js +52 -28
- package/bootCsr.mjs +138 -0
- package/createNextMiddleware.js +42 -13
- package/createNextMiddleware.mjs +49 -0
- package/createRobotPage.js +22 -3
- package/createRobotPage.mjs +15 -0
- package/createSitemapPage.js +22 -3
- package/createSitemapPage.mjs +7 -0
- package/index.js +59 -40
- package/index.mjs +41 -0
- package/lazy.js +34 -5
- package/lazy.mjs +6 -0
- package/makePageProto.js +32 -13
- package/makePageProto.mjs +114 -0
- package/package.json +27 -3
- package/types.js +15 -0
- package/types.mjs +0 -0
- package/useCamera.js +36 -17
- package/useCamera.mjs +77 -0
- package/useCodepush.js +54 -25
- package/useCodepush.mjs +74 -0
- package/useContact.js +31 -12
- package/useContact.mjs +36 -0
- package/useCsrValues.js +74 -59
- package/useCsrValues.mjs +596 -0
- package/useDebounce.js +24 -5
- package/useDebounce.mjs +18 -0
- package/useFetch.js +25 -6
- package/useFetch.mjs +23 -0
- package/useGeoLocation.js +25 -6
- package/useGeoLocation.mjs +21 -0
- package/useHistory.js +29 -10
- package/useHistory.mjs +46 -0
- package/useInterval.js +26 -7
- package/useInterval.mjs +21 -0
- package/useLocation.js +24 -5
- package/useLocation.mjs +59 -0
- package/usePurchase.js +29 -10
- package/usePurchase.mjs +120 -0
- package/usePushNoti.js +35 -16
- package/usePushNoti.mjs +42 -0
- package/useThrottle.js +25 -6
- package/useThrottle.mjs +20 -0
package/useContact.js
CHANGED
|
@@ -1,13 +1,35 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var useContact_exports = {};
|
|
20
|
+
__export(useContact_exports, {
|
|
21
|
+
useContact: () => useContact
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(useContact_exports);
|
|
24
|
+
var import_client = require("@akanjs/client");
|
|
25
|
+
var import_contacts = require("@capacitor-community/contacts");
|
|
26
|
+
var import_react = require("react");
|
|
5
27
|
const useContact = () => {
|
|
6
|
-
const [permissions, setPermissions] = useState({ contacts: "prompt" });
|
|
28
|
+
const [permissions, setPermissions] = (0, import_react.useState)({ contacts: "prompt" });
|
|
7
29
|
const checkPermission = async () => {
|
|
8
30
|
try {
|
|
9
31
|
if (permissions.contacts === "prompt") {
|
|
10
|
-
const { contacts } = await Contacts.requestPermissions();
|
|
32
|
+
const { contacts } = await import_contacts.Contacts.requestPermissions();
|
|
11
33
|
setPermissions((prev) => ({ ...prev, contacts }));
|
|
12
34
|
} else if (permissions.contacts === "denied") {
|
|
13
35
|
location.assign("app-settings:");
|
|
@@ -18,19 +40,16 @@ const useContact = () => {
|
|
|
18
40
|
};
|
|
19
41
|
const getContacts = async () => {
|
|
20
42
|
await checkPermission();
|
|
21
|
-
const { contacts } = await Contacts.getContacts({ projection: { name: true, phones: true } });
|
|
43
|
+
const { contacts } = await import_contacts.Contacts.getContacts({ projection: { name: true, phones: true } });
|
|
22
44
|
return contacts;
|
|
23
45
|
};
|
|
24
|
-
useEffect(() => {
|
|
46
|
+
(0, import_react.useEffect)(() => {
|
|
25
47
|
void (async () => {
|
|
26
|
-
if (device.info.platform === "web")
|
|
48
|
+
if (import_client.device.info.platform === "web")
|
|
27
49
|
return;
|
|
28
|
-
const permissions2 = await Contacts.checkPermissions();
|
|
50
|
+
const permissions2 = await import_contacts.Contacts.checkPermissions();
|
|
29
51
|
setPermissions(permissions2);
|
|
30
52
|
})();
|
|
31
53
|
}, []);
|
|
32
54
|
return { permissions, getContacts, checkPermission };
|
|
33
55
|
};
|
|
34
|
-
export {
|
|
35
|
-
useContact
|
|
36
|
-
};
|
package/useContact.mjs
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { device } from "@akanjs/client";
|
|
3
|
+
import { Contacts } from "@capacitor-community/contacts";
|
|
4
|
+
import { useEffect, useState } from "react";
|
|
5
|
+
const useContact = () => {
|
|
6
|
+
const [permissions, setPermissions] = useState({ contacts: "prompt" });
|
|
7
|
+
const checkPermission = async () => {
|
|
8
|
+
try {
|
|
9
|
+
if (permissions.contacts === "prompt") {
|
|
10
|
+
const { contacts } = await Contacts.requestPermissions();
|
|
11
|
+
setPermissions((prev) => ({ ...prev, contacts }));
|
|
12
|
+
} else if (permissions.contacts === "denied") {
|
|
13
|
+
location.assign("app-settings:");
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
} catch (e) {
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const getContacts = async () => {
|
|
20
|
+
await checkPermission();
|
|
21
|
+
const { contacts } = await Contacts.getContacts({ projection: { name: true, phones: true } });
|
|
22
|
+
return contacts;
|
|
23
|
+
};
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
void (async () => {
|
|
26
|
+
if (device.info.platform === "web")
|
|
27
|
+
return;
|
|
28
|
+
const permissions2 = await Contacts.checkPermissions();
|
|
29
|
+
setPermissions(permissions2);
|
|
30
|
+
})();
|
|
31
|
+
}, []);
|
|
32
|
+
return { permissions, getContacts, checkPermission };
|
|
33
|
+
};
|
|
34
|
+
export {
|
|
35
|
+
useContact
|
|
36
|
+
};
|
package/useCsrValues.js
CHANGED
|
@@ -1,23 +1,41 @@
|
|
|
1
1
|
"use client";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var useCsrValues_exports = {};
|
|
20
|
+
__export(useCsrValues_exports, {
|
|
21
|
+
useCsrValues: () => useCsrValues
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(useCsrValues_exports);
|
|
24
|
+
var import_client = require("@akanjs/client");
|
|
25
|
+
var import_app = require("@capacitor/app");
|
|
26
|
+
var import_web = require("@react-spring/web");
|
|
27
|
+
var import_react = require("@use-gesture/react");
|
|
28
|
+
var import_react2 = require("react");
|
|
29
|
+
var import_useHistory = require("./useHistory");
|
|
30
|
+
var import_useLocation = require("./useLocation");
|
|
13
31
|
const useNoneTrans = ({ clientHeight, location, prevLocation }) => {
|
|
14
32
|
const transDirection = "none";
|
|
15
|
-
const transUnit = useSpringValue(0, { config: { clamp: true } });
|
|
16
|
-
const transUnitRange = useMemo(() => [0, 0], []);
|
|
33
|
+
const transUnit = (0, import_web.useSpringValue)(0, { config: { clamp: true } });
|
|
34
|
+
const transUnitRange = (0, import_react2.useMemo)(() => [0, 0], []);
|
|
17
35
|
const transProgress = transUnit.to((unit) => 1);
|
|
18
36
|
const transPercent = transUnit.to((unit) => 100);
|
|
19
37
|
const pageState = location.pathRoute.pageState;
|
|
20
|
-
const prevPageState = prevLocation?.pathRoute.pageState ?? defaultPageState;
|
|
38
|
+
const prevPageState = prevLocation?.pathRoute.pageState ?? import_client.defaultPageState;
|
|
21
39
|
const csrTranstionStyles = {
|
|
22
40
|
topSafeArea: {
|
|
23
41
|
containerStyle: {
|
|
@@ -83,18 +101,18 @@ const useNoneTrans = ({ clientHeight, location, prevLocation }) => {
|
|
|
83
101
|
};
|
|
84
102
|
const useFadeTrans = ({ clientHeight, location, prevLocation, onBack, history }) => {
|
|
85
103
|
const transDirection = "none";
|
|
86
|
-
const transUnit = useSpringValue(1, { config: { clamp: true } });
|
|
87
|
-
const transUnitRange = useMemo(() => [0, 1], []);
|
|
104
|
+
const transUnit = (0, import_web.useSpringValue)(1, { config: { clamp: true } });
|
|
105
|
+
const transUnitRange = (0, import_react2.useMemo)(() => [0, 1], []);
|
|
88
106
|
const transProgress = transUnit.to((unit) => unit);
|
|
89
107
|
const transPercent = transUnit.to([0, 1], [0, 100], "clamp");
|
|
90
108
|
const pageState = location.pathRoute.pageState;
|
|
91
|
-
const prevPageState = prevLocation?.pathRoute.pageState ?? defaultPageState;
|
|
92
|
-
useEffect(() => {
|
|
109
|
+
const prevPageState = prevLocation?.pathRoute.pageState ?? import_client.defaultPageState;
|
|
110
|
+
(0, import_react2.useEffect)(() => {
|
|
93
111
|
onBack.current.fade = async () => {
|
|
94
112
|
await transUnit.start(transUnitRange[0]);
|
|
95
113
|
};
|
|
96
114
|
}, []);
|
|
97
|
-
useEffect(() => {
|
|
115
|
+
(0, import_react2.useEffect)(() => {
|
|
98
116
|
if (history.current.type === "forward") {
|
|
99
117
|
void transUnit.start(transUnitRange[0], { immediate: true });
|
|
100
118
|
void transUnit.start(transUnitRange[1], { config: { duration: 150 } });
|
|
@@ -200,23 +218,23 @@ const useStackTrans = ({
|
|
|
200
218
|
onBack
|
|
201
219
|
}) => {
|
|
202
220
|
const transDirection = "horizontal";
|
|
203
|
-
const transUnit = useSpringValue(0, { config: { clamp: true } });
|
|
204
|
-
const transUnitRange = useMemo(() => [clientWidth, 0], []);
|
|
221
|
+
const transUnit = (0, import_web.useSpringValue)(0, { config: { clamp: true } });
|
|
222
|
+
const transUnitRange = (0, import_react2.useMemo)(() => [clientWidth, 0], []);
|
|
205
223
|
const transUnitReversed = transUnit.to((unit) => transUnitRange[0] - unit);
|
|
206
|
-
const transUnitRangeReversed = useMemo(() => [0, clientWidth], []);
|
|
224
|
+
const transUnitRangeReversed = (0, import_react2.useMemo)(() => [0, clientWidth], []);
|
|
207
225
|
const transProgress = transUnitReversed.to(transUnitRangeReversed, [0, 1], "clamp");
|
|
208
226
|
const transPercent = transUnitReversed.to(transUnitRangeReversed, [0, 100], "clamp");
|
|
209
|
-
const initThreshold = useMemo(() => Math.floor(clientWidth), []);
|
|
210
|
-
const threshold = useMemo(() => Math.floor(clientWidth / 3), []);
|
|
227
|
+
const initThreshold = (0, import_react2.useMemo)(() => Math.floor(clientWidth), []);
|
|
228
|
+
const threshold = (0, import_react2.useMemo)(() => Math.floor(clientWidth / 3), []);
|
|
211
229
|
const pageState = location.pathRoute.pageState;
|
|
212
|
-
const prevPageState = prevLocation?.pathRoute.pageState ?? defaultPageState;
|
|
230
|
+
const prevPageState = prevLocation?.pathRoute.pageState ?? import_client.defaultPageState;
|
|
213
231
|
const pageClassName = "touch-pan-y";
|
|
214
|
-
useEffect(() => {
|
|
232
|
+
(0, import_react2.useEffect)(() => {
|
|
215
233
|
onBack.current.stack = async () => {
|
|
216
234
|
await transUnit.start(transUnitRange[0]);
|
|
217
235
|
};
|
|
218
236
|
}, []);
|
|
219
|
-
useEffect(() => {
|
|
237
|
+
(0, import_react2.useEffect)(() => {
|
|
220
238
|
if (history.current.type === "forward") {
|
|
221
239
|
void transUnit.start(transUnitRange[0], { immediate: true });
|
|
222
240
|
void transUnit.start(transUnitRange[1], { config: { duration: 150 } });
|
|
@@ -225,10 +243,10 @@ const useStackTrans = ({
|
|
|
225
243
|
return;
|
|
226
244
|
}
|
|
227
245
|
}, [location.pathname]);
|
|
228
|
-
const pageBind = useDrag(
|
|
246
|
+
const pageBind = (0, import_react.useDrag)(
|
|
229
247
|
({ first, down, last, movement: [mx], initial: [ix], cancel }) => {
|
|
230
248
|
if (first)
|
|
231
|
-
void device.hideKeyboard();
|
|
249
|
+
void import_client.device.hideKeyboard();
|
|
232
250
|
if (ix > initThreshold) {
|
|
233
251
|
cancel();
|
|
234
252
|
return;
|
|
@@ -242,7 +260,7 @@ const useStackTrans = ({
|
|
|
242
260
|
else if (mx < threshold)
|
|
243
261
|
void transUnit.start(transUnitRange[1]);
|
|
244
262
|
if (last && mx > threshold)
|
|
245
|
-
router.back();
|
|
263
|
+
import_client.router.back();
|
|
246
264
|
},
|
|
247
265
|
{ axis: "x", filterTaps: true }
|
|
248
266
|
);
|
|
@@ -348,22 +366,22 @@ const useBottomUpTrans = ({
|
|
|
348
366
|
onBack
|
|
349
367
|
}) => {
|
|
350
368
|
const transDirection = "vertical";
|
|
351
|
-
const transUnit = useSpringValue(0, { config: { clamp: true } });
|
|
352
|
-
const transUnitRange = useMemo(() => [clientHeight, 0], []);
|
|
369
|
+
const transUnit = (0, import_web.useSpringValue)(0, { config: { clamp: true } });
|
|
370
|
+
const transUnitRange = (0, import_react2.useMemo)(() => [clientHeight, 0], []);
|
|
353
371
|
const transUnitReversed = transUnit.to((unit) => transUnitRange[0] - unit);
|
|
354
|
-
const transUnitRangeReversed = useMemo(() => [0, clientWidth], []);
|
|
372
|
+
const transUnitRangeReversed = (0, import_react2.useMemo)(() => [0, clientWidth], []);
|
|
355
373
|
const transProgress = transUnitReversed.to(transUnitRangeReversed, [0, 1], "clamp");
|
|
356
374
|
const transPercent = transUnitReversed.to(transUnitRangeReversed, [0, 100], "clamp");
|
|
357
|
-
const initThreshold = useMemo(() => Math.floor(clientWidth / 3), []);
|
|
358
|
-
const threshold = useMemo(() => Math.floor(clientWidth / 2), []);
|
|
375
|
+
const initThreshold = (0, import_react2.useMemo)(() => Math.floor(clientWidth / 3), []);
|
|
376
|
+
const threshold = (0, import_react2.useMemo)(() => Math.floor(clientWidth / 2), []);
|
|
359
377
|
const pageState = location.pathRoute.pageState;
|
|
360
|
-
const prevPageState = prevLocation?.pathRoute.pageState ?? defaultPageState;
|
|
361
|
-
useEffect(() => {
|
|
378
|
+
const prevPageState = prevLocation?.pathRoute.pageState ?? import_client.defaultPageState;
|
|
379
|
+
(0, import_react2.useEffect)(() => {
|
|
362
380
|
onBack.current.bottomUp = async () => {
|
|
363
381
|
await transUnit.start(transUnitRange[0]);
|
|
364
382
|
};
|
|
365
383
|
}, []);
|
|
366
|
-
useEffect(() => {
|
|
384
|
+
(0, import_react2.useEffect)(() => {
|
|
367
385
|
if (history.current.type === "forward") {
|
|
368
386
|
void transUnit.start(transUnitRange[0], { immediate: true });
|
|
369
387
|
void transUnit.start(transUnitRange[1], { config: { duration: 150 } });
|
|
@@ -372,10 +390,10 @@ const useBottomUpTrans = ({
|
|
|
372
390
|
return;
|
|
373
391
|
}
|
|
374
392
|
}, [location.pathname]);
|
|
375
|
-
const pageBind = useDrag(
|
|
393
|
+
const pageBind = (0, import_react.useDrag)(
|
|
376
394
|
({ first, last, movement: [, my], initial: [, iy], cancel }) => {
|
|
377
395
|
if (first)
|
|
378
|
-
void device.hideKeyboard();
|
|
396
|
+
void import_client.device.hideKeyboard();
|
|
379
397
|
if (iy > initThreshold) {
|
|
380
398
|
cancel();
|
|
381
399
|
return;
|
|
@@ -389,7 +407,7 @@ const useBottomUpTrans = ({
|
|
|
389
407
|
else if (my < threshold)
|
|
390
408
|
void transUnit.start(transUnitRange[1]);
|
|
391
409
|
if (last && my > threshold)
|
|
392
|
-
router.back();
|
|
410
|
+
import_client.router.back();
|
|
393
411
|
},
|
|
394
412
|
{ axis: "y", filterTaps: true, threshold: 10 }
|
|
395
413
|
);
|
|
@@ -486,23 +504,23 @@ const useBottomUpTrans = ({
|
|
|
486
504
|
return useCsrTransition;
|
|
487
505
|
};
|
|
488
506
|
const useCsrValues = (rootRouteGuide, pathRoutes) => {
|
|
489
|
-
const clientWidth = useRef(window.innerWidth);
|
|
490
|
-
const clientHeight = useRef(window.innerHeight);
|
|
491
|
-
const topSafeAreaRef = useRef(null);
|
|
492
|
-
const bottomSafeAreaRef = useRef(null);
|
|
493
|
-
const pageContentRef = useRef(null);
|
|
494
|
-
const prevPageContentRef = useRef(null);
|
|
495
|
-
const onBack = useRef({});
|
|
496
|
-
const frameRootRef = useRef(null);
|
|
497
|
-
const { getLocation } = useLocation({ rootRouteGuide });
|
|
498
|
-
const { history, setHistoryForward, setHistoryBack, getCurrentLocation, getPrevLocation, getScrollTop } = useHistory([
|
|
507
|
+
const clientWidth = (0, import_react2.useRef)(window.innerWidth);
|
|
508
|
+
const clientHeight = (0, import_react2.useRef)(window.innerHeight);
|
|
509
|
+
const topSafeAreaRef = (0, import_react2.useRef)(null);
|
|
510
|
+
const bottomSafeAreaRef = (0, import_react2.useRef)(null);
|
|
511
|
+
const pageContentRef = (0, import_react2.useRef)(null);
|
|
512
|
+
const prevPageContentRef = (0, import_react2.useRef)(null);
|
|
513
|
+
const onBack = (0, import_react2.useRef)({});
|
|
514
|
+
const frameRootRef = (0, import_react2.useRef)(null);
|
|
515
|
+
const { getLocation } = (0, import_useLocation.useLocation)({ rootRouteGuide });
|
|
516
|
+
const { history, setHistoryForward, setHistoryBack, getCurrentLocation, getPrevLocation, getScrollTop } = (0, import_useHistory.useHistory)([
|
|
499
517
|
getLocation(window.location.pathname)
|
|
500
518
|
]);
|
|
501
|
-
const [{ location, prevLocation }, setLocationState] = useState({
|
|
519
|
+
const [{ location, prevLocation }, setLocationState] = (0, import_react2.useState)({
|
|
502
520
|
location: getCurrentLocation(),
|
|
503
521
|
prevLocation: getPrevLocation()
|
|
504
522
|
});
|
|
505
|
-
const getRouter = useCallback(() => {
|
|
523
|
+
const getRouter = (0, import_react2.useCallback)(() => {
|
|
506
524
|
const router3 = {
|
|
507
525
|
push: (href) => {
|
|
508
526
|
const location2 = getCurrentLocation();
|
|
@@ -574,16 +592,16 @@ const useCsrValues = (rootRouteGuide, pathRoutes) => {
|
|
|
574
592
|
bottomUp: useBottomUpTransition,
|
|
575
593
|
scaleOut: useNonTransition
|
|
576
594
|
};
|
|
577
|
-
useEffect(() => {
|
|
595
|
+
(0, import_react2.useEffect)(() => {
|
|
578
596
|
if (pageContentRef.current)
|
|
579
597
|
pageContentRef.current.scrollTop = getScrollTop(location.pathname);
|
|
580
598
|
if (prevPageContentRef.current)
|
|
581
599
|
prevPageContentRef.current.scrollTop = prevLocation ? getScrollTop(prevLocation.pathname) : 0;
|
|
582
|
-
void App.addListener("backButton", () => {
|
|
600
|
+
void import_app.App.addListener("backButton", () => {
|
|
583
601
|
router2.back();
|
|
584
602
|
});
|
|
585
603
|
return () => {
|
|
586
|
-
void App.removeAllListeners();
|
|
604
|
+
void import_app.App.removeAllListeners();
|
|
587
605
|
};
|
|
588
606
|
}, [location.pathname]);
|
|
589
607
|
return {
|
|
@@ -591,6 +609,3 @@ const useCsrValues = (rootRouteGuide, pathRoutes) => {
|
|
|
591
609
|
...useCsrTransitionMap[location.pathRoute.pageState.transition]
|
|
592
610
|
};
|
|
593
611
|
};
|
|
594
|
-
export {
|
|
595
|
-
useCsrValues
|
|
596
|
-
};
|