fetch-xhr-shim 1.0.0 → 1.0.1
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/cjs/encoding/TextDecoderP.js +2 -0
- package/dist/cjs/event-system/AbortSignalP.js +16 -13
- package/dist/cjs/fetch-api/BodyImpl.js +2 -0
- package/dist/cjs/fetch-api/HeadersP.js +3 -1
- package/dist/cjs/fetch-api/RequestP.js +2 -0
- package/dist/cjs/file-system/BlobP.js +2 -0
- package/dist/cjs/network/FormDataP.js +3 -1
- package/dist/cjs/network/URLSearchParamsP.js +1 -1
- package/dist/cjs/polyfill.js +1 -0
- package/dist/esm/encoding/TextDecoderP.js +2 -0
- package/dist/esm/event-system/AbortSignalP.js +16 -13
- package/dist/esm/fetch-api/BodyImpl.js +2 -0
- package/dist/esm/fetch-api/HeadersP.js +3 -1
- package/dist/esm/fetch-api/RequestP.js +2 -0
- package/dist/esm/file-system/BlobP.js +2 -0
- package/dist/esm/network/FormDataP.js +3 -1
- package/dist/esm/network/URLSearchParamsP.js +1 -1
- package/dist/esm/polyfill.js +1 -0
- package/dist/fetch-xhr-shim.cjs.js +31 -16
- package/dist/fetch-xhr-shim.cjs.min.js +1 -1
- package/dist/fetch-xhr-shim.esm.js +31 -16
- package/dist/fetch-xhr-shim.esm.min.js +1 -1
- package/dist/fetch-xhr-shim.polyfill.iife.js +1495 -914
- package/dist/fetch-xhr-shim.polyfill.iife.min.js +1 -1
- package/dist/index.d.ts +3 -3
- package/package.json +4 -3
- package/polyfill.js +3382 -0
|
@@ -166,6 +166,8 @@ function concatString(val) {
|
|
|
166
166
|
// Mini Program
|
|
167
167
|
function isOtherArrayBuffer(value) {
|
|
168
168
|
return (utils.isObjectType("ArrayBuffer", value) || String(value) === "[object ArrayBuffer]")
|
|
169
|
+
&& !!value
|
|
170
|
+
&& typeof value === "object"
|
|
169
171
|
&& "byteLength" in value
|
|
170
172
|
&& typeof value.byteLength === "number";
|
|
171
173
|
}
|
|
@@ -24,21 +24,11 @@ class AbortSignalP extends EventTargetP.EventTargetP {
|
|
|
24
24
|
if (sig.aborted)
|
|
25
25
|
return sig;
|
|
26
26
|
} })();
|
|
27
|
-
if (abortedSignal) {
|
|
28
|
-
|
|
27
|
+
if (!abortedSignal) {
|
|
28
|
+
followSignals(signal, _signals);
|
|
29
29
|
}
|
|
30
30
|
else {
|
|
31
|
-
|
|
32
|
-
for (let i = 0; i < _signals.length; ++i) {
|
|
33
|
-
let sig = _signals[i];
|
|
34
|
-
sig.removeEventListener("abort", abortFn);
|
|
35
|
-
}
|
|
36
|
-
AbortSignal_abort(signal, true, this.reason);
|
|
37
|
-
}
|
|
38
|
-
for (let i = 0; i < _signals.length; ++i) {
|
|
39
|
-
let sig = _signals[i];
|
|
40
|
-
sig.addEventListener("abort", abortFn);
|
|
41
|
-
}
|
|
31
|
+
AbortSignal_abort(signal, false, abortedSignal.reason);
|
|
42
32
|
}
|
|
43
33
|
return signal;
|
|
44
34
|
}
|
|
@@ -90,6 +80,19 @@ function getHandlers(t) {
|
|
|
90
80
|
function state(target) {
|
|
91
81
|
return target.__AbortSignal__;
|
|
92
82
|
}
|
|
83
|
+
function followSignals(signal, signals) {
|
|
84
|
+
function abortFn() {
|
|
85
|
+
for (let i = 0; i < signals.length; ++i) {
|
|
86
|
+
let sig = signals[i];
|
|
87
|
+
sig.removeEventListener("abort", abortFn);
|
|
88
|
+
}
|
|
89
|
+
AbortSignal_abort(signal, true, this.reason);
|
|
90
|
+
}
|
|
91
|
+
for (let i = 0; i < signals.length; ++i) {
|
|
92
|
+
let sig = signals[i];
|
|
93
|
+
sig.addEventListener("abort", abortFn);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
93
96
|
function createAbortSignal() {
|
|
94
97
|
let signal = Object.create(AbortSignalP.prototype);
|
|
95
98
|
utils.setState(signal, "__EventTarget__", { executors: [] });
|
|
@@ -167,6 +167,8 @@ function isGlobalReadableStream(value) {
|
|
|
167
167
|
}
|
|
168
168
|
function isOtherReadableStream(value) {
|
|
169
169
|
return (utils.isObjectType("ReadableStream", value) || String(value) === "[object ReadableStream]")
|
|
170
|
+
&& !!value
|
|
171
|
+
&& typeof value === "object"
|
|
170
172
|
&& "getReader" in value
|
|
171
173
|
&& typeof value.getReader === "function";
|
|
172
174
|
}
|
|
@@ -41,7 +41,7 @@ class HeadersP {
|
|
|
41
41
|
checkArgsFn(arguments.length, 2, "append");
|
|
42
42
|
Headers_append(this, name, value, "append");
|
|
43
43
|
}
|
|
44
|
-
delete(name) {
|
|
44
|
+
["delete"](name) {
|
|
45
45
|
checkArgsFn(arguments.length, 1, "delete");
|
|
46
46
|
delete state(this).dict[normalizeName(name, throwsFn("delete"))];
|
|
47
47
|
}
|
|
@@ -127,6 +127,8 @@ function isHeaders(value) {
|
|
|
127
127
|
function isExternalHeaders(value) {
|
|
128
128
|
let expect = "[object Headers]";
|
|
129
129
|
return (Object.prototype.toString.call(value) === expect || String(value) === expect)
|
|
130
|
+
&& !!value
|
|
131
|
+
&& typeof value === "object"
|
|
130
132
|
&& "forEach" in value
|
|
131
133
|
&& typeof value.forEach === "function";
|
|
132
134
|
}
|
|
@@ -133,6 +133,8 @@ function isRequest(value) {
|
|
|
133
133
|
function isExternalRequest(value) {
|
|
134
134
|
let expect = "[object Request]";
|
|
135
135
|
return (Object.prototype.toString.call(value) === expect || String(value) === expect)
|
|
136
|
+
&& !!value
|
|
137
|
+
&& typeof value === "object"
|
|
136
138
|
&& "arrayBuffer" in value
|
|
137
139
|
&& typeof value.arrayBuffer === "function";
|
|
138
140
|
}
|
|
@@ -151,6 +151,8 @@ function isExternalBlob(value, strict = false) {
|
|
|
151
151
|
if (!strict)
|
|
152
152
|
expects.push("[object File]");
|
|
153
153
|
return (expects.indexOf(Object.prototype.toString.call(value)) > -1 || expects.indexOf(String(value)) > -1)
|
|
154
|
+
&& !!value
|
|
155
|
+
&& typeof value === "object"
|
|
154
156
|
&& "size" in value
|
|
155
157
|
&& typeof value.size === "number"
|
|
156
158
|
&& "arrayBuffer" in value
|
|
@@ -50,7 +50,7 @@ class FormDataP {
|
|
|
50
50
|
checkArgsFn(arguments.length, 2, "append");
|
|
51
51
|
state(this).array.push(normalizeArgs(name, blobValue, filename));
|
|
52
52
|
}
|
|
53
|
-
delete(name) {
|
|
53
|
+
["delete"](name) {
|
|
54
54
|
checkArgsFn(arguments.length, 1, "delete");
|
|
55
55
|
let _name = "" + name;
|
|
56
56
|
let index = -1;
|
|
@@ -189,6 +189,8 @@ function isFormData(value) {
|
|
|
189
189
|
function isExternalFormData(value) {
|
|
190
190
|
let expect = "[object FormData]";
|
|
191
191
|
return (Object.prototype.toString.call(value) === expect || String(value) === expect)
|
|
192
|
+
&& !!value
|
|
193
|
+
&& typeof value === "object"
|
|
192
194
|
&& "forEach" in value
|
|
193
195
|
&& typeof value.forEach === "function";
|
|
194
196
|
}
|
|
@@ -57,7 +57,7 @@ class URLSearchParamsP {
|
|
|
57
57
|
checkArgsFn(arguments.length, 2, "append");
|
|
58
58
|
state(this).array.push(["" + name, normalizeValue(value)]);
|
|
59
59
|
}
|
|
60
|
-
delete(name, value) {
|
|
60
|
+
["delete"](name, value) {
|
|
61
61
|
checkArgsFn(arguments.length, 1, "delete");
|
|
62
62
|
let _name = "" + name;
|
|
63
63
|
let index = -1;
|
package/dist/cjs/polyfill.js
CHANGED
|
@@ -20,6 +20,7 @@ var fixes = require('./fixes.js');
|
|
|
20
20
|
|
|
21
21
|
/* eslint-disable no-prototype-builtins */
|
|
22
22
|
const g = (typeof globalThis !== "undefined" && globalThis) ||
|
|
23
|
+
(typeof window !== "undefined" && window) ||
|
|
23
24
|
(typeof self !== "undefined" && self) ||
|
|
24
25
|
// @ts-ignore eslint-disable-next-line no-undef
|
|
25
26
|
(typeof global !== "undefined" && global) ||
|
|
@@ -164,6 +164,8 @@ function concatString(val) {
|
|
|
164
164
|
// Mini Program
|
|
165
165
|
function isOtherArrayBuffer(value) {
|
|
166
166
|
return (isObjectType("ArrayBuffer", value) || String(value) === "[object ArrayBuffer]")
|
|
167
|
+
&& !!value
|
|
168
|
+
&& typeof value === "object"
|
|
167
169
|
&& "byteLength" in value
|
|
168
170
|
&& typeof value.byteLength === "number";
|
|
169
171
|
}
|
|
@@ -22,21 +22,11 @@ class AbortSignalP extends EventTargetP {
|
|
|
22
22
|
if (sig.aborted)
|
|
23
23
|
return sig;
|
|
24
24
|
} })();
|
|
25
|
-
if (abortedSignal) {
|
|
26
|
-
|
|
25
|
+
if (!abortedSignal) {
|
|
26
|
+
followSignals(signal, _signals);
|
|
27
27
|
}
|
|
28
28
|
else {
|
|
29
|
-
|
|
30
|
-
for (let i = 0; i < _signals.length; ++i) {
|
|
31
|
-
let sig = _signals[i];
|
|
32
|
-
sig.removeEventListener("abort", abortFn);
|
|
33
|
-
}
|
|
34
|
-
AbortSignal_abort(signal, true, this.reason);
|
|
35
|
-
}
|
|
36
|
-
for (let i = 0; i < _signals.length; ++i) {
|
|
37
|
-
let sig = _signals[i];
|
|
38
|
-
sig.addEventListener("abort", abortFn);
|
|
39
|
-
}
|
|
29
|
+
AbortSignal_abort(signal, false, abortedSignal.reason);
|
|
40
30
|
}
|
|
41
31
|
return signal;
|
|
42
32
|
}
|
|
@@ -88,6 +78,19 @@ function getHandlers(t) {
|
|
|
88
78
|
function state(target) {
|
|
89
79
|
return target.__AbortSignal__;
|
|
90
80
|
}
|
|
81
|
+
function followSignals(signal, signals) {
|
|
82
|
+
function abortFn() {
|
|
83
|
+
for (let i = 0; i < signals.length; ++i) {
|
|
84
|
+
let sig = signals[i];
|
|
85
|
+
sig.removeEventListener("abort", abortFn);
|
|
86
|
+
}
|
|
87
|
+
AbortSignal_abort(signal, true, this.reason);
|
|
88
|
+
}
|
|
89
|
+
for (let i = 0; i < signals.length; ++i) {
|
|
90
|
+
let sig = signals[i];
|
|
91
|
+
sig.addEventListener("abort", abortFn);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
91
94
|
function createAbortSignal() {
|
|
92
95
|
let signal = Object.create(AbortSignalP.prototype);
|
|
93
96
|
setState(signal, "__EventTarget__", { executors: [] });
|
|
@@ -165,6 +165,8 @@ function isGlobalReadableStream(value) {
|
|
|
165
165
|
}
|
|
166
166
|
function isOtherReadableStream(value) {
|
|
167
167
|
return (isObjectType("ReadableStream", value) || String(value) === "[object ReadableStream]")
|
|
168
|
+
&& !!value
|
|
169
|
+
&& typeof value === "object"
|
|
168
170
|
&& "getReader" in value
|
|
169
171
|
&& typeof value.getReader === "function";
|
|
170
172
|
}
|
|
@@ -39,7 +39,7 @@ class HeadersP {
|
|
|
39
39
|
checkArgsFn(arguments.length, 2, "append");
|
|
40
40
|
Headers_append(this, name, value, "append");
|
|
41
41
|
}
|
|
42
|
-
delete(name) {
|
|
42
|
+
["delete"](name) {
|
|
43
43
|
checkArgsFn(arguments.length, 1, "delete");
|
|
44
44
|
delete state(this).dict[normalizeName(name, throwsFn("delete"))];
|
|
45
45
|
}
|
|
@@ -125,6 +125,8 @@ function isHeaders(value) {
|
|
|
125
125
|
function isExternalHeaders(value) {
|
|
126
126
|
let expect = "[object Headers]";
|
|
127
127
|
return (Object.prototype.toString.call(value) === expect || String(value) === expect)
|
|
128
|
+
&& !!value
|
|
129
|
+
&& typeof value === "object"
|
|
128
130
|
&& "forEach" in value
|
|
129
131
|
&& typeof value.forEach === "function";
|
|
130
132
|
}
|
|
@@ -131,6 +131,8 @@ function isRequest(value) {
|
|
|
131
131
|
function isExternalRequest(value) {
|
|
132
132
|
let expect = "[object Request]";
|
|
133
133
|
return (Object.prototype.toString.call(value) === expect || String(value) === expect)
|
|
134
|
+
&& !!value
|
|
135
|
+
&& typeof value === "object"
|
|
134
136
|
&& "arrayBuffer" in value
|
|
135
137
|
&& typeof value.arrayBuffer === "function";
|
|
136
138
|
}
|
|
@@ -149,6 +149,8 @@ function isExternalBlob(value, strict = false) {
|
|
|
149
149
|
if (!strict)
|
|
150
150
|
expects.push("[object File]");
|
|
151
151
|
return (expects.indexOf(Object.prototype.toString.call(value)) > -1 || expects.indexOf(String(value)) > -1)
|
|
152
|
+
&& !!value
|
|
153
|
+
&& typeof value === "object"
|
|
152
154
|
&& "size" in value
|
|
153
155
|
&& typeof value.size === "number"
|
|
154
156
|
&& "arrayBuffer" in value
|
|
@@ -48,7 +48,7 @@ class FormDataP {
|
|
|
48
48
|
checkArgsFn(arguments.length, 2, "append");
|
|
49
49
|
state(this).array.push(normalizeArgs(name, blobValue, filename));
|
|
50
50
|
}
|
|
51
|
-
delete(name) {
|
|
51
|
+
["delete"](name) {
|
|
52
52
|
checkArgsFn(arguments.length, 1, "delete");
|
|
53
53
|
let _name = "" + name;
|
|
54
54
|
let index = -1;
|
|
@@ -187,6 +187,8 @@ function isFormData(value) {
|
|
|
187
187
|
function isExternalFormData(value) {
|
|
188
188
|
let expect = "[object FormData]";
|
|
189
189
|
return (Object.prototype.toString.call(value) === expect || String(value) === expect)
|
|
190
|
+
&& !!value
|
|
191
|
+
&& typeof value === "object"
|
|
190
192
|
&& "forEach" in value
|
|
191
193
|
&& typeof value.forEach === "function";
|
|
192
194
|
}
|
|
@@ -55,7 +55,7 @@ class URLSearchParamsP {
|
|
|
55
55
|
checkArgsFn(arguments.length, 2, "append");
|
|
56
56
|
state(this).array.push(["" + name, normalizeValue(value)]);
|
|
57
57
|
}
|
|
58
|
-
delete(name, value) {
|
|
58
|
+
["delete"](name, value) {
|
|
59
59
|
checkArgsFn(arguments.length, 1, "delete");
|
|
60
60
|
let _name = "" + name;
|
|
61
61
|
let index = -1;
|
package/dist/esm/polyfill.js
CHANGED
|
@@ -18,6 +18,7 @@ import { fixFetch, fixXMLHttpRequest, fixWebSocket } from './fixes.js';
|
|
|
18
18
|
|
|
19
19
|
/* eslint-disable no-prototype-builtins */
|
|
20
20
|
const g = (typeof globalThis !== "undefined" && globalThis) ||
|
|
21
|
+
(typeof window !== "undefined" && window) ||
|
|
21
22
|
(typeof self !== "undefined" && self) ||
|
|
22
23
|
// @ts-ignore eslint-disable-next-line no-undef
|
|
23
24
|
(typeof global !== "undefined" && global) ||
|
|
@@ -338,6 +338,8 @@ function concatString(val) {
|
|
|
338
338
|
// Mini Program
|
|
339
339
|
function isOtherArrayBuffer(value) {
|
|
340
340
|
return (isObjectType("ArrayBuffer", value) || String(value) === "[object ArrayBuffer]")
|
|
341
|
+
&& !!value
|
|
342
|
+
&& typeof value === "object"
|
|
341
343
|
&& "byteLength" in value
|
|
342
344
|
&& typeof value.byteLength === "number";
|
|
343
345
|
}
|
|
@@ -682,21 +684,11 @@ class AbortSignalP extends EventTargetP {
|
|
|
682
684
|
if (sig.aborted)
|
|
683
685
|
return sig;
|
|
684
686
|
} })();
|
|
685
|
-
if (abortedSignal) {
|
|
686
|
-
|
|
687
|
+
if (!abortedSignal) {
|
|
688
|
+
followSignals(signal, _signals);
|
|
687
689
|
}
|
|
688
690
|
else {
|
|
689
|
-
|
|
690
|
-
for (let i = 0; i < _signals.length; ++i) {
|
|
691
|
-
let sig = _signals[i];
|
|
692
|
-
sig.removeEventListener("abort", abortFn);
|
|
693
|
-
}
|
|
694
|
-
AbortSignal_abort(signal, true, this.reason);
|
|
695
|
-
}
|
|
696
|
-
for (let i = 0; i < _signals.length; ++i) {
|
|
697
|
-
let sig = _signals[i];
|
|
698
|
-
sig.addEventListener("abort", abortFn);
|
|
699
|
-
}
|
|
691
|
+
AbortSignal_abort(signal, false, abortedSignal.reason);
|
|
700
692
|
}
|
|
701
693
|
return signal;
|
|
702
694
|
}
|
|
@@ -748,6 +740,19 @@ function getHandlers$1(t) {
|
|
|
748
740
|
function state$b(target) {
|
|
749
741
|
return target.__AbortSignal__;
|
|
750
742
|
}
|
|
743
|
+
function followSignals(signal, signals) {
|
|
744
|
+
function abortFn() {
|
|
745
|
+
for (let i = 0; i < signals.length; ++i) {
|
|
746
|
+
let sig = signals[i];
|
|
747
|
+
sig.removeEventListener("abort", abortFn);
|
|
748
|
+
}
|
|
749
|
+
AbortSignal_abort(signal, true, this.reason);
|
|
750
|
+
}
|
|
751
|
+
for (let i = 0; i < signals.length; ++i) {
|
|
752
|
+
let sig = signals[i];
|
|
753
|
+
sig.addEventListener("abort", abortFn);
|
|
754
|
+
}
|
|
755
|
+
}
|
|
751
756
|
function createAbortSignal() {
|
|
752
757
|
let signal = Object.create(AbortSignalP.prototype);
|
|
753
758
|
setState(signal, "__EventTarget__", { executors: [] });
|
|
@@ -937,6 +942,8 @@ function isExternalBlob(value, strict = false) {
|
|
|
937
942
|
if (!strict)
|
|
938
943
|
expects.push("[object File]");
|
|
939
944
|
return (expects.indexOf(Object.prototype.toString.call(value)) > -1 || expects.indexOf(String(value)) > -1)
|
|
945
|
+
&& !!value
|
|
946
|
+
&& typeof value === "object"
|
|
940
947
|
&& "size" in value
|
|
941
948
|
&& typeof value.size === "number"
|
|
942
949
|
&& "arrayBuffer" in value
|
|
@@ -1291,7 +1298,7 @@ class URLSearchParamsP {
|
|
|
1291
1298
|
checkArgsFn$2(arguments.length, 2, "append");
|
|
1292
1299
|
state$5(this).array.push(["" + name, normalizeValue$1(value)]);
|
|
1293
1300
|
}
|
|
1294
|
-
delete(name, value) {
|
|
1301
|
+
["delete"](name, value) {
|
|
1295
1302
|
checkArgsFn$2(arguments.length, 1, "delete");
|
|
1296
1303
|
let _name = "" + name;
|
|
1297
1304
|
let index = -1;
|
|
@@ -1510,7 +1517,7 @@ class FormDataP {
|
|
|
1510
1517
|
checkArgsFn$1(arguments.length, 2, "append");
|
|
1511
1518
|
state$4(this).array.push(normalizeArgs(name, blobValue, filename));
|
|
1512
1519
|
}
|
|
1513
|
-
delete(name) {
|
|
1520
|
+
["delete"](name) {
|
|
1514
1521
|
checkArgsFn$1(arguments.length, 1, "delete");
|
|
1515
1522
|
let _name = "" + name;
|
|
1516
1523
|
let index = -1;
|
|
@@ -1649,6 +1656,8 @@ function isFormData(value) {
|
|
|
1649
1656
|
function isExternalFormData(value) {
|
|
1650
1657
|
let expect = "[object FormData]";
|
|
1651
1658
|
return (Object.prototype.toString.call(value) === expect || String(value) === expect)
|
|
1659
|
+
&& !!value
|
|
1660
|
+
&& typeof value === "object"
|
|
1652
1661
|
&& "forEach" in value
|
|
1653
1662
|
&& typeof value.forEach === "function";
|
|
1654
1663
|
}
|
|
@@ -1921,6 +1930,8 @@ function isGlobalReadableStream(value) {
|
|
|
1921
1930
|
}
|
|
1922
1931
|
function isOtherReadableStream(value) {
|
|
1923
1932
|
return (isObjectType("ReadableStream", value) || String(value) === "[object ReadableStream]")
|
|
1933
|
+
&& !!value
|
|
1934
|
+
&& typeof value === "object"
|
|
1924
1935
|
&& "getReader" in value
|
|
1925
1936
|
&& typeof value.getReader === "function";
|
|
1926
1937
|
}
|
|
@@ -1964,7 +1975,7 @@ class HeadersP {
|
|
|
1964
1975
|
checkArgsFn(arguments.length, 2, "append");
|
|
1965
1976
|
Headers_append(this, name, value, "append");
|
|
1966
1977
|
}
|
|
1967
|
-
delete(name) {
|
|
1978
|
+
["delete"](name) {
|
|
1968
1979
|
checkArgsFn(arguments.length, 1, "delete");
|
|
1969
1980
|
delete state$2(this).dict[normalizeName(name, throwsFn("delete"))];
|
|
1970
1981
|
}
|
|
@@ -2050,6 +2061,8 @@ function isHeaders(value) {
|
|
|
2050
2061
|
function isExternalHeaders(value) {
|
|
2051
2062
|
let expect = "[object Headers]";
|
|
2052
2063
|
return (Object.prototype.toString.call(value) === expect || String(value) === expect)
|
|
2064
|
+
&& !!value
|
|
2065
|
+
&& typeof value === "object"
|
|
2053
2066
|
&& "forEach" in value
|
|
2054
2067
|
&& typeof value.forEach === "function";
|
|
2055
2068
|
}
|
|
@@ -2225,6 +2238,8 @@ function isRequest(value) {
|
|
|
2225
2238
|
function isExternalRequest(value) {
|
|
2226
2239
|
let expect = "[object Request]";
|
|
2227
2240
|
return (Object.prototype.toString.call(value) === expect || String(value) === expect)
|
|
2241
|
+
&& !!value
|
|
2242
|
+
&& typeof value === "object"
|
|
2228
2243
|
&& "arrayBuffer" in value
|
|
2229
2244
|
&& typeof value.arrayBuffer === "function";
|
|
2230
2245
|
}
|