@openfin/remote-adapter 38.82.63 → 38.82.65
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/out/remote-adapter.js +81 -26
- package/package.json +2 -2
package/out/remote-adapter.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var require$$
|
|
4
|
-
var require$$
|
|
3
|
+
var require$$0 = require('lodash/cloneDeep');
|
|
4
|
+
var require$$3 = require('lodash/isEqual');
|
|
5
|
+
var require$$0$1 = require('events');
|
|
5
6
|
var bridge = require('./bridge-ef11968f.js');
|
|
6
7
|
var crypto = require('crypto');
|
|
7
8
|
var backchannel = require('./backchannel.js');
|
|
@@ -528,9 +529,32 @@ var utils$2 = {};
|
|
|
528
529
|
|
|
529
530
|
var PrivateChannelClient$1 = {};
|
|
530
531
|
|
|
532
|
+
var __createBinding = (commonjsGlobal && commonjsGlobal.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
533
|
+
if (k2 === undefined) k2 = k;
|
|
534
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
535
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
536
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
537
|
+
}
|
|
538
|
+
Object.defineProperty(o, k2, desc);
|
|
539
|
+
}) : (function(o, m, k, k2) {
|
|
540
|
+
if (k2 === undefined) k2 = k;
|
|
541
|
+
o[k2] = m[k];
|
|
542
|
+
}));
|
|
543
|
+
var __setModuleDefault = (commonjsGlobal && commonjsGlobal.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
544
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
545
|
+
}) : function(o, v) {
|
|
546
|
+
o["default"] = v;
|
|
547
|
+
});
|
|
548
|
+
var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) {
|
|
549
|
+
if (mod && mod.__esModule) return mod;
|
|
550
|
+
var result = {};
|
|
551
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
552
|
+
__setModuleDefault(result, mod);
|
|
553
|
+
return result;
|
|
554
|
+
};
|
|
531
555
|
Object.defineProperty(PrivateChannelClient$1, "__esModule", { value: true });
|
|
532
556
|
PrivateChannelClient$1.PrivateChannelClient = void 0;
|
|
533
|
-
const utils$1 = utils$3;
|
|
557
|
+
const utils$1 = __importStar(utils$3);
|
|
534
558
|
class PrivateChannelClient {
|
|
535
559
|
constructor(client, id) {
|
|
536
560
|
this.id = id;
|
|
@@ -619,11 +643,14 @@ class PrivateChannelClient {
|
|
|
619
643
|
PrivateChannelClient$1.PrivateChannelClient = PrivateChannelClient;
|
|
620
644
|
|
|
621
645
|
(function (exports) {
|
|
646
|
+
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
647
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
648
|
+
};
|
|
622
649
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
623
650
|
exports.getIntentResolution = exports.isChannel = exports.isContext = exports.connectPrivateChannel = exports.buildAppChannelObject = exports.buildPrivateChannelObject = exports.ChannelError = exports.ResultError = exports.UnsupportedChannelApiError = exports.getUnsupportedChannelApis = void 0;
|
|
624
651
|
const utils_1 = utils$3;
|
|
625
652
|
const PrivateChannelClient_1 = PrivateChannelClient$1;
|
|
626
|
-
const
|
|
653
|
+
const isEqual_1 = __importDefault(require$$3);
|
|
627
654
|
const getUnsupportedChannelApis = (channelType) => {
|
|
628
655
|
return {
|
|
629
656
|
addContextListener: () => {
|
|
@@ -751,7 +778,7 @@ PrivateChannelClient$1.PrivateChannelClient = PrivateChannelClient;
|
|
|
751
778
|
const wrappedHandler = (context, contextMetadata) => {
|
|
752
779
|
if (first) {
|
|
753
780
|
first = false;
|
|
754
|
-
if ((0,
|
|
781
|
+
if ((0, isEqual_1.default)(currentContext, context)) {
|
|
755
782
|
return;
|
|
756
783
|
}
|
|
757
784
|
}
|
|
@@ -873,13 +900,16 @@ function requireFdc3Common () {
|
|
|
873
900
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
874
901
|
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
875
902
|
};
|
|
903
|
+
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
904
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
905
|
+
};
|
|
876
906
|
var _FDC3ModuleBase_producer;
|
|
877
907
|
Object.defineProperty(fdc3Common, "__esModule", { value: true });
|
|
878
908
|
fdc3Common.FDC3ModuleBase = void 0;
|
|
879
909
|
const utils_1 = utils$2;
|
|
880
910
|
const utils_2 = utils$3;
|
|
881
911
|
const InteropClient_1 = requireInteropClient();
|
|
882
|
-
const
|
|
912
|
+
const isEqual_1 = __importDefault(require$$3);
|
|
883
913
|
class FDC3ModuleBase {
|
|
884
914
|
get client() {
|
|
885
915
|
return __classPrivateFieldGet(this, _FDC3ModuleBase_producer, "f").call(this);
|
|
@@ -1068,7 +1098,7 @@ function requireFdc3Common () {
|
|
|
1068
1098
|
const wrappedHandler = (context, contextMetadata) => {
|
|
1069
1099
|
if (first) {
|
|
1070
1100
|
first = false;
|
|
1071
|
-
if ((0,
|
|
1101
|
+
if ((0, isEqual_1.default)(currentContext, context)) {
|
|
1072
1102
|
return;
|
|
1073
1103
|
}
|
|
1074
1104
|
}
|
|
@@ -1681,11 +1711,14 @@ function requireInteropClient () {
|
|
|
1681
1711
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
1682
1712
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
1683
1713
|
};
|
|
1714
|
+
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
1715
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
1716
|
+
};
|
|
1684
1717
|
var _InteropClient_clientPromise, _InteropClient_sessionContextGroups;
|
|
1685
1718
|
Object.defineProperty(InteropClient, "__esModule", { value: true });
|
|
1686
1719
|
InteropClient.InteropClient = void 0;
|
|
1687
1720
|
const base_1 = base;
|
|
1688
|
-
const SessionContextGroupClient_1 = SessionContextGroupClient$1;
|
|
1721
|
+
const SessionContextGroupClient_1 = __importDefault(SessionContextGroupClient$1);
|
|
1689
1722
|
const fdc3_1_2_1 = requireFdc31_2();
|
|
1690
1723
|
const fdc3_2_0_1 = requireFdc32_0();
|
|
1691
1724
|
const utils_1 = utils$3;
|
|
@@ -2303,9 +2336,12 @@ var hasRequiredFactory$3;
|
|
|
2303
2336
|
function requireFactory$3 () {
|
|
2304
2337
|
if (hasRequiredFactory$3) return Factory$8;
|
|
2305
2338
|
hasRequiredFactory$3 = 1;
|
|
2339
|
+
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
2340
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
2341
|
+
};
|
|
2306
2342
|
Object.defineProperty(Factory$8, "__esModule", { value: true });
|
|
2307
2343
|
Factory$8.InteropModule = void 0;
|
|
2308
|
-
const
|
|
2344
|
+
const cloneDeep_1 = __importDefault(require$$0);
|
|
2309
2345
|
const inaccessibleObject_1 = inaccessibleObject;
|
|
2310
2346
|
const base_1 = base;
|
|
2311
2347
|
const InteropBroker_1 = requireInteropBroker();
|
|
@@ -2342,7 +2378,7 @@ function requireFactory$3 () {
|
|
|
2342
2378
|
// Allows for manifest-level configuration, without having to override. (e.g. specifying custom context groups)
|
|
2343
2379
|
const options = await this.wire.environment.getInteropInfo(this.wire.getFin());
|
|
2344
2380
|
const objectThatThrows = (0, inaccessibleObject_1.createUnusableObject)(BrokerParamAccessError);
|
|
2345
|
-
const warningOptsClone = (0, inaccessibleObject_1.createWarningObject)(BrokerParamAccessError, (0,
|
|
2381
|
+
const warningOptsClone = (0, inaccessibleObject_1.createWarningObject)(BrokerParamAccessError, (0, cloneDeep_1.default)(options));
|
|
2346
2382
|
const getProvider = () => {
|
|
2347
2383
|
return this.fin.InterApplicationBus.Channel.create(`interop-broker-${name}`);
|
|
2348
2384
|
};
|
|
@@ -2908,13 +2944,16 @@ function requireInteropBroker () {
|
|
|
2908
2944
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
2909
2945
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
2910
2946
|
};
|
|
2947
|
+
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
2948
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
2949
|
+
};
|
|
2911
2950
|
var _InteropBroker_fdc3Info, _InteropBroker_contextGroups, _InteropBroker_providerPromise;
|
|
2912
2951
|
Object.defineProperty(InteropBroker, "__esModule", { value: true });
|
|
2913
2952
|
InteropBroker.InteropBroker = void 0;
|
|
2914
2953
|
const base_1 = base;
|
|
2915
|
-
const SessionContextGroupBroker_1 = requireSessionContextGroupBroker();
|
|
2954
|
+
const SessionContextGroupBroker_1 = __importDefault(requireSessionContextGroupBroker());
|
|
2916
2955
|
const utils_1 = utils$3;
|
|
2917
|
-
const
|
|
2956
|
+
const isEqual_1 = __importDefault(require$$3);
|
|
2918
2957
|
const PrivateChannelProvider_1 = requirePrivateChannelProvider();
|
|
2919
2958
|
const lazy_1 = lazy;
|
|
2920
2959
|
const defaultContextGroups = [
|
|
@@ -3112,7 +3151,7 @@ function requireInteropBroker () {
|
|
|
3112
3151
|
constructor(...unused) {
|
|
3113
3152
|
if (unused.length) {
|
|
3114
3153
|
const [_ignore1, ignore2, opts] = unused;
|
|
3115
|
-
if (opts && typeof opts === 'object' && !(0,
|
|
3154
|
+
if (opts && typeof opts === 'object' && !(0, isEqual_1.default)(opts, args[2])) {
|
|
3116
3155
|
// eslint-disable-next-line no-console
|
|
3117
3156
|
console.warn('You have modified the parameters of the InteropOverride constructor. This behavior is deprecated and will be removed in a future version. You can modify these options in your manifest. Please consult our Interop docs for guidance on migrating to the new override scheme.');
|
|
3118
3157
|
super(args[0], args[1], opts);
|
|
@@ -4467,7 +4506,7 @@ var emitterMap = {};
|
|
|
4467
4506
|
|
|
4468
4507
|
Object.defineProperty(emitterMap, "__esModule", { value: true });
|
|
4469
4508
|
emitterMap.EmitterMap = void 0;
|
|
4470
|
-
const events_1$6 = require$$0;
|
|
4509
|
+
const events_1$6 = require$$0$1;
|
|
4471
4510
|
class EmitterMap {
|
|
4472
4511
|
constructor() {
|
|
4473
4512
|
this.storage = new Map();
|
|
@@ -4644,7 +4683,9 @@ function requireFactory$2 () {
|
|
|
4644
4683
|
* @experimental
|
|
4645
4684
|
*/
|
|
4646
4685
|
async wrap(identity) {
|
|
4647
|
-
this.wire.sendAction('view-wrap')
|
|
4686
|
+
this.wire.sendAction('view-wrap').catch((e) => {
|
|
4687
|
+
// we do not want to expose this error, just continue if this analytics-only call fails
|
|
4688
|
+
});
|
|
4648
4689
|
const errorMsg = (0, validate_1.validateIdentity)(identity);
|
|
4649
4690
|
if (errorMsg) {
|
|
4650
4691
|
throw new Error(errorMsg);
|
|
@@ -9438,9 +9479,14 @@ function requireInstance () {
|
|
|
9438
9479
|
// don't expose
|
|
9439
9480
|
});
|
|
9440
9481
|
const layoutWindow = await this.getCurrentWindow();
|
|
9482
|
+
let layoutWindowIdentity = layoutWindow.identity;
|
|
9483
|
+
// TODO: CORE-1857 - when we tearout active layout or drag a view out of a window, the above identity includes the whole window info.
|
|
9484
|
+
if (layoutWindowIdentity.identity) {
|
|
9485
|
+
layoutWindowIdentity = layoutWindowIdentity.identity;
|
|
9486
|
+
}
|
|
9441
9487
|
try {
|
|
9442
9488
|
const providerChannelClient = await __classPrivateFieldGet(this, _View_providerChannelClient, "f").getValue();
|
|
9443
|
-
const client = await layout_entities_1.LayoutNode.newLayoutEntitiesClient(providerChannelClient, layout_constants_1.LAYOUT_CONTROLLER_ID,
|
|
9489
|
+
const client = await layout_entities_1.LayoutNode.newLayoutEntitiesClient(providerChannelClient, layout_constants_1.LAYOUT_CONTROLLER_ID, layoutWindowIdentity);
|
|
9444
9490
|
const layoutIdentity = await client.getLayoutIdentityForViewOrThrow(this.identity);
|
|
9445
9491
|
return this.fin.Platform.Layout.wrap(layoutIdentity);
|
|
9446
9492
|
}
|
|
@@ -9453,7 +9499,7 @@ function requireInstance () {
|
|
|
9453
9499
|
throw e;
|
|
9454
9500
|
}
|
|
9455
9501
|
// fallback logic for missing endpoint
|
|
9456
|
-
return this.fin.Platform.Layout.wrap(
|
|
9502
|
+
return this.fin.Platform.Layout.wrap(layoutWindowIdentity);
|
|
9457
9503
|
}
|
|
9458
9504
|
};
|
|
9459
9505
|
/**
|
|
@@ -10191,13 +10237,16 @@ var __classPrivateFieldGet$b = (commonjsGlobal && commonjsGlobal.__classPrivateF
|
|
|
10191
10237
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10192
10238
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
10193
10239
|
};
|
|
10240
|
+
var __importDefault$2 = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
10241
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10242
|
+
};
|
|
10194
10243
|
var _Transport_wire, _Transport_fin;
|
|
10195
10244
|
Object.defineProperty(transport, "__esModule", { value: true });
|
|
10196
10245
|
var Transport_1 = transport.Transport = void 0;
|
|
10197
|
-
const events_1$5 = require$$0;
|
|
10246
|
+
const events_1$5 = require$$0$1;
|
|
10198
10247
|
const wire_1 = wire;
|
|
10199
10248
|
const transport_errors_1$2 = transportErrors;
|
|
10200
|
-
const eventAggregator_1 = eventAggregator;
|
|
10249
|
+
const eventAggregator_1 = __importDefault$2(eventAggregator);
|
|
10201
10250
|
const me_1$1 = me;
|
|
10202
10251
|
const errors_1$1 = errors;
|
|
10203
10252
|
class Transport extends events_1$5.EventEmitter {
|
|
@@ -10411,7 +10460,7 @@ _Transport_wire = new WeakMap(), _Transport_fin = new WeakMap();
|
|
|
10411
10460
|
var websocket = {};
|
|
10412
10461
|
|
|
10413
10462
|
Object.defineProperty(websocket, "__esModule", { value: true });
|
|
10414
|
-
const events_1$4 = require$$0;
|
|
10463
|
+
const events_1$4 = require$$0$1;
|
|
10415
10464
|
const transport_errors_1$1 = transportErrors;
|
|
10416
10465
|
const messageReceiver_1 = bridge.messageReceiver;
|
|
10417
10466
|
/* `READY_STATE` is an instance var set by `constructor` to reference the `WebTransportSocket.READY_STATE` enum.
|
|
@@ -10488,7 +10537,7 @@ system.System = void 0;
|
|
|
10488
10537
|
const base_1$d = base;
|
|
10489
10538
|
const transport_errors_1 = transportErrors;
|
|
10490
10539
|
const window_1 = requireWindow();
|
|
10491
|
-
const events_1$3 = require$$0;
|
|
10540
|
+
const events_1$3 = require$$0$1;
|
|
10492
10541
|
/**
|
|
10493
10542
|
* An object representing the core of OpenFin Runtime. Allows the developer
|
|
10494
10543
|
* to perform system-level actions, such as accessing logs, viewing processes,
|
|
@@ -13981,6 +14030,9 @@ var __classPrivateFieldGet$5 = (commonjsGlobal && commonjsGlobal.__classPrivateF
|
|
|
13981
14030
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
13982
14031
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
13983
14032
|
};
|
|
14033
|
+
var __importDefault$1 = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
14034
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
14035
|
+
};
|
|
13984
14036
|
var _ConnectionManager_messageReceiver, _ConnectionManager_rtcConnectionManager;
|
|
13985
14037
|
Object.defineProperty(connectionManager, "__esModule", { value: true });
|
|
13986
14038
|
connectionManager.ConnectionManager = void 0;
|
|
@@ -13992,7 +14044,7 @@ const ice_manager_1 = iceManager;
|
|
|
13992
14044
|
const provider_1$1 = provider;
|
|
13993
14045
|
const message_receiver_1 = messageReceiver;
|
|
13994
14046
|
const protocol_manager_1 = protocolManager;
|
|
13995
|
-
const strategy_3 = strategy;
|
|
14047
|
+
const strategy_3 = __importDefault$1(strategy);
|
|
13996
14048
|
class ConnectionManager extends base_1$a.Base {
|
|
13997
14049
|
static getProtocolOptionsFromStrings(protocols) {
|
|
13998
14050
|
return protocols.map((protocol) => {
|
|
@@ -14239,7 +14291,7 @@ var _Channel_connectionManager, _Channel_internalEmitter, _Channel_readyToConnec
|
|
|
14239
14291
|
Object.defineProperty(channel$1, "__esModule", { value: true });
|
|
14240
14292
|
channel$1.Channel = void 0;
|
|
14241
14293
|
/* eslint-disable no-console */
|
|
14242
|
-
const events_1$2 = require$$0;
|
|
14294
|
+
const events_1$2 = require$$0$1;
|
|
14243
14295
|
const lazy_1$1 = lazy;
|
|
14244
14296
|
const base_1$9 = base;
|
|
14245
14297
|
const client_1 = client;
|
|
@@ -14566,7 +14618,7 @@ interappbus.InterAppPayload = interappbus.InterApplicationBus = void 0;
|
|
|
14566
14618
|
*
|
|
14567
14619
|
* @packageDocumentation
|
|
14568
14620
|
*/
|
|
14569
|
-
const events_1$1 = require$$0;
|
|
14621
|
+
const events_1$1 = require$$0$1;
|
|
14570
14622
|
const base_1$8 = base;
|
|
14571
14623
|
const ref_counter_1 = refCounter;
|
|
14572
14624
|
const index_1$2 = channel$1;
|
|
@@ -17133,7 +17185,7 @@ Factory.SnapshotSourceModule = SnapshotSourceModule;
|
|
|
17133
17185
|
|
|
17134
17186
|
Object.defineProperty(fin$1, "__esModule", { value: true });
|
|
17135
17187
|
var Fin_1 = fin$1.Fin = void 0;
|
|
17136
|
-
const events_1 = require$$0;
|
|
17188
|
+
const events_1 = require$$0$1;
|
|
17137
17189
|
// Import from the file rather than the directory in case someone consuming types is using module resolution other than "node"
|
|
17138
17190
|
const index_1 = system;
|
|
17139
17191
|
const index_2 = requireWindow();
|
|
@@ -17182,12 +17234,15 @@ Fin_1 = fin$1.Fin = Fin;
|
|
|
17182
17234
|
|
|
17183
17235
|
var browser = {};
|
|
17184
17236
|
|
|
17237
|
+
var __importDefault = (commonjsGlobal && commonjsGlobal.__importDefault) || function (mod) {
|
|
17238
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
17239
|
+
};
|
|
17185
17240
|
Object.defineProperty(browser, "__esModule", { value: true });
|
|
17186
17241
|
browser.remoteConnectInterop = browser.remoteConnect = getRemoteConnectionPayload_1 = browser.getRemoteConnectionPayload = void 0;
|
|
17187
17242
|
const fin_1 = fin$1;
|
|
17188
17243
|
const browser_1 = browser$1;
|
|
17189
17244
|
const transport_1 = transport;
|
|
17190
|
-
const websocket_1 = websocket;
|
|
17245
|
+
const websocket_1 = __importDefault(websocket);
|
|
17191
17246
|
async function getRemoteConnectionPayload(fin, uuid = `browser-connection-${Math.random().toString().slice(2)}`, interopProviderId = fin.me.uuid) {
|
|
17192
17247
|
const { token } = await fin.System.registerExternalConnection(uuid);
|
|
17193
17248
|
const { port } = await fin.System.getRuntimeInfo();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openfin/remote-adapter",
|
|
3
|
-
"version": "38.82.
|
|
3
|
+
"version": "38.82.65",
|
|
4
4
|
"description": "Establish intermachine runtime connections using webRTC.",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE.md",
|
|
6
6
|
"private": false,
|
|
@@ -19,6 +19,6 @@
|
|
|
19
19
|
"author": "OpenFin",
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"lodash": "^4.17.21",
|
|
22
|
-
"@openfin/core": "38.82.
|
|
22
|
+
"@openfin/core": "38.82.65"
|
|
23
23
|
}
|
|
24
24
|
}
|