react-native-screens 3.13.0 → 3.14.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/README.md +2 -2
- package/RNScreens.podspec +5 -4
- package/android/build.gradle +18 -1
- package/android/src/main/java/com/swmansion/rnscreens/ScreenStack.kt +8 -4
- package/android/src/main/java/com/swmansion/rnscreens/ScreenViewManager.kt +24 -6
- package/android/src/main/java/com/swmansion/rnscreens/ScreenWindowTraits.kt +14 -18
- package/android/src/main/jni/Android.mk +1 -2
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerDelegate.java +39 -14
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenManagerInterface.java +15 -6
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerDelegate.java +3 -3
- package/android/src/paper/java/com/facebook/react/viewmanagers/RNSScreenStackHeaderConfigManagerInterface.java +1 -1
- package/common/cpp/Android.mk +1 -2
- package/createNativeStackNavigator/README.md +4 -0
- package/ios/RNSConvert.h +30 -0
- package/ios/RNSConvert.mm +120 -0
- package/ios/RNSEnums.h +59 -0
- package/ios/RNSFullWindowOverlay.h +17 -2
- package/ios/RNSFullWindowOverlay.mm +199 -0
- package/ios/RNSScreen.h +70 -79
- package/ios/{RNSScreen.m → RNSScreen.mm} +679 -302
- package/ios/RNSScreenContainer.h +15 -1
- package/ios/{RNSScreenContainer.m → RNSScreenContainer.mm} +99 -8
- package/ios/{RNSScreenNavigationContainer.m → RNSScreenNavigationContainer.mm} +22 -0
- package/ios/RNSScreenStack.h +19 -3
- package/ios/{RNSScreenStack.m → RNSScreenStack.mm} +377 -126
- package/ios/{RNSScreenStackAnimator.m → RNSScreenStackAnimator.mm} +19 -14
- package/ios/RNSScreenStackHeaderConfig.h +20 -21
- package/ios/{RNSScreenStackHeaderConfig.m → RNSScreenStackHeaderConfig.mm} +232 -117
- package/ios/RNSScreenStackHeaderSubview.h +45 -0
- package/ios/RNSScreenStackHeaderSubview.mm +137 -0
- package/ios/RNSScreenViewEvent.h +12 -0
- package/ios/RNSScreenViewEvent.mm +59 -0
- package/ios/{RNSScreenWindowTraits.m → RNSScreenWindowTraits.mm} +3 -2
- package/ios/RNSSearchBar.h +14 -1
- package/ios/RNSSearchBar.mm +351 -0
- package/ios/{UIViewController+RNScreens.m → UIViewController+RNScreens.mm} +0 -0
- package/ios/{UIWindow+RNScreens.m → UIWindow+RNScreens.mm} +0 -0
- package/lib/commonjs/fabric/FullWindowOverlay.js +26 -0
- package/lib/commonjs/fabric/FullWindowOverlay.js.map +1 -0
- package/lib/commonjs/fabric/FullWindowOverlayNativeComponent.js +21 -0
- package/lib/commonjs/fabric/FullWindowOverlayNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/Screen.js +10 -8
- package/lib/commonjs/fabric/Screen.js.map +1 -1
- package/lib/commonjs/fabric/ScreenContainer.js +28 -0
- package/lib/commonjs/fabric/ScreenContainer.js.map +1 -0
- package/lib/commonjs/fabric/ScreenContainerNativeComponent.js +21 -0
- package/lib/commonjs/fabric/ScreenContainerNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/ScreenNativeComponent.js.map +1 -1
- package/lib/commonjs/fabric/ScreenNavigationContainer.js +28 -0
- package/lib/commonjs/fabric/ScreenNavigationContainer.js.map +1 -0
- package/lib/commonjs/fabric/ScreenNavigationContainerNativeComponent.js +21 -0
- package/lib/commonjs/fabric/ScreenNavigationContainerNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/ScreenStack.js +6 -7
- package/lib/commonjs/fabric/ScreenStack.js.map +1 -1
- package/lib/commonjs/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
- package/lib/commonjs/fabric/ScreenStackHeaderSubview.js +4 -1
- package/lib/commonjs/fabric/ScreenStackHeaderSubview.js.map +1 -1
- package/lib/commonjs/fabric/ScreenStackNativeComponent.js.map +1 -1
- package/lib/commonjs/fabric/SearchBar.js +37 -0
- package/lib/commonjs/fabric/SearchBar.js.map +1 -0
- package/lib/commonjs/fabric/SearchBarNativeComponent.js +25 -0
- package/lib/commonjs/fabric/SearchBarNativeComponent.js.map +1 -0
- package/lib/commonjs/fabric/index.js +32 -0
- package/lib/commonjs/fabric/index.js.map +1 -1
- package/lib/commonjs/index.native.js +14 -18
- package/lib/commonjs/index.native.js.map +1 -1
- package/lib/commonjs/native-stack/views/NativeStackView.js +4 -0
- package/lib/commonjs/native-stack/views/NativeStackView.js.map +1 -1
- package/lib/commonjs/reanimated/ReanimatedNativeStackScreen.js +8 -2
- package/lib/commonjs/reanimated/ReanimatedNativeStackScreen.js.map +1 -1
- package/lib/module/fabric/FullWindowOverlay.js +15 -0
- package/lib/module/fabric/FullWindowOverlay.js.map +1 -0
- package/lib/module/fabric/FullWindowOverlayNativeComponent.js +9 -0
- package/lib/module/fabric/FullWindowOverlayNativeComponent.js.map +1 -0
- package/lib/module/fabric/Screen.js +8 -3
- package/lib/module/fabric/Screen.js.map +1 -1
- package/lib/module/fabric/ScreenContainer.js +17 -0
- package/lib/module/fabric/ScreenContainer.js.map +1 -0
- package/lib/module/fabric/ScreenContainerNativeComponent.js +9 -0
- package/lib/module/fabric/ScreenContainerNativeComponent.js.map +1 -0
- package/lib/module/fabric/ScreenNativeComponent.js.map +1 -1
- package/lib/module/fabric/ScreenNavigationContainer.js +17 -0
- package/lib/module/fabric/ScreenNavigationContainer.js.map +1 -0
- package/lib/module/fabric/ScreenNavigationContainerNativeComponent.js +9 -0
- package/lib/module/fabric/ScreenNavigationContainerNativeComponent.js.map +1 -0
- package/lib/module/fabric/ScreenStack.js +5 -2
- package/lib/module/fabric/ScreenStack.js.map +1 -1
- package/lib/module/fabric/ScreenStackHeaderConfigNativeComponent.js.map +1 -1
- package/lib/module/fabric/ScreenStackHeaderSubview.js +4 -1
- package/lib/module/fabric/ScreenStackHeaderSubview.js.map +1 -1
- package/lib/module/fabric/ScreenStackNativeComponent.js.map +1 -1
- package/lib/module/fabric/SearchBar.js +24 -0
- package/lib/module/fabric/SearchBar.js.map +1 -0
- package/lib/module/fabric/SearchBarNativeComponent.js +11 -0
- package/lib/module/fabric/SearchBarNativeComponent.js.map +1 -0
- package/lib/module/fabric/index.js +5 -1
- package/lib/module/fabric/index.js.map +1 -1
- package/lib/module/index.native.js +15 -20
- package/lib/module/index.native.js.map +1 -1
- package/lib/module/native-stack/views/NativeStackView.js +4 -0
- package/lib/module/native-stack/views/NativeStackView.js.map +1 -1
- package/lib/module/reanimated/ReanimatedNativeStackScreen.js +7 -2
- package/lib/module/reanimated/ReanimatedNativeStackScreen.js.map +1 -1
- package/lib/typescript/native-stack/types.d.ts +12 -0
- package/lib/typescript/reanimated/ReanimatedNativeStackScreen.d.ts +1 -1
- package/lib/typescript/reanimated/ReanimatedScreen.d.ts +1 -1
- package/lib/typescript/types.d.ts +24 -0
- package/native-stack/README.md +21 -0
- package/package.json +2 -2
- package/src/fabric/FullWindowOverlay.js +13 -0
- package/src/fabric/FullWindowOverlayNativeComponent.js +19 -0
- package/src/fabric/Screen.js +5 -2
- package/src/fabric/ScreenContainer.js +16 -0
- package/src/fabric/ScreenContainerNativeComponent.js +19 -0
- package/src/fabric/ScreenNativeComponent.js +41 -8
- package/src/fabric/ScreenNavigationContainer.js +16 -0
- package/src/fabric/ScreenNavigationContainerNativeComponent.js +19 -0
- package/src/fabric/ScreenStack.js +4 -2
- package/src/fabric/ScreenStackHeaderConfigNativeComponent.js +1 -1
- package/src/fabric/ScreenStackHeaderSubview.js +3 -1
- package/src/fabric/ScreenStackNativeComponent.js +4 -0
- package/src/fabric/SearchBar.js +20 -0
- package/src/fabric/SearchBarNativeComponent.js +62 -0
- package/src/fabric/index.js +8 -0
- package/src/index.native.tsx +20 -19
- package/src/native-stack/types.tsx +12 -0
- package/src/native-stack/views/NativeStackView.tsx +4 -0
- package/src/reanimated/ReanimatedNativeStackScreen.tsx +6 -0
- package/src/types.tsx +25 -0
- package/ios/RNSFullWindowOverlay.m +0 -105
- package/ios/RNSScreenComponentView.h +0 -23
- package/ios/RNSScreenComponentView.mm +0 -159
- package/ios/RNSScreenController.h +0 -10
- package/ios/RNSScreenController.mm +0 -79
- package/ios/RNSScreenStackComponentView.h +0 -15
- package/ios/RNSScreenStackComponentView.mm +0 -295
- package/ios/RNSScreenStackHeaderConfigComponentView.h +0 -42
- package/ios/RNSScreenStackHeaderConfigComponentView.mm +0 -662
- package/ios/RNSScreenStackHeaderSubviewComponentView.h +0 -14
- package/ios/RNSScreenStackHeaderSubviewComponentView.mm +0 -77
- package/ios/RNSSearchBar.m +0 -198
package/ios/RNSScreenContainer.h
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
|
+
#ifdef RN_FABRIC_ENABLED
|
|
2
|
+
#import <React/RCTViewComponentView.h>
|
|
3
|
+
#else
|
|
4
|
+
#endif
|
|
5
|
+
|
|
1
6
|
#import <React/RCTViewManager.h>
|
|
2
7
|
|
|
8
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
9
|
+
|
|
3
10
|
@protocol RNSScreenContainerDelegate
|
|
4
11
|
|
|
5
12
|
- (void)markChildUpdated;
|
|
@@ -21,7 +28,12 @@
|
|
|
21
28
|
|
|
22
29
|
@end
|
|
23
30
|
|
|
24
|
-
@interface RNSScreenContainerView :
|
|
31
|
+
@interface RNSScreenContainerView :
|
|
32
|
+
#ifdef RN_FABRIC_ENABLED
|
|
33
|
+
RCTViewComponentView <RNSScreenContainerDelegate>
|
|
34
|
+
#else
|
|
35
|
+
UIView <RNSScreenContainerDelegate, RCTInvalidating>
|
|
36
|
+
#endif
|
|
25
37
|
|
|
26
38
|
@property (nonatomic, retain) UIViewController *controller;
|
|
27
39
|
@property (nonatomic, retain) NSMutableArray *reactSubviews;
|
|
@@ -29,3 +41,5 @@
|
|
|
29
41
|
- (void)maybeDismissVC;
|
|
30
42
|
|
|
31
43
|
@end
|
|
44
|
+
|
|
45
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
#import "RNSScreenContainer.h"
|
|
2
2
|
#import "RNSScreen.h"
|
|
3
3
|
|
|
4
|
+
#ifdef RN_FABRIC_ENABLED
|
|
5
|
+
#import <React/RCTConversions.h>
|
|
6
|
+
#import <react/renderer/components/rnscreens/ComponentDescriptors.h>
|
|
7
|
+
#import <react/renderer/components/rnscreens/Props.h>
|
|
8
|
+
#import "RCTFabricComponentsPlugins.h"
|
|
9
|
+
#endif
|
|
10
|
+
|
|
4
11
|
@implementation RNScreensViewController
|
|
5
12
|
|
|
6
13
|
#if !TARGET_OS_TV
|
|
@@ -34,7 +41,7 @@
|
|
|
34
41
|
{
|
|
35
42
|
for (UIViewController *childVC in self.childViewControllers) {
|
|
36
43
|
if ([childVC isKindOfClass:[RNSScreen class]] &&
|
|
37
|
-
((
|
|
44
|
+
((RNSScreen *)childVC).screenView.activityState == RNSActivityStateOnTop) {
|
|
38
45
|
return childVC;
|
|
39
46
|
}
|
|
40
47
|
}
|
|
@@ -51,6 +58,10 @@
|
|
|
51
58
|
- (instancetype)init
|
|
52
59
|
{
|
|
53
60
|
if (self = [super init]) {
|
|
61
|
+
#ifdef RN_FABRIC_ENABLED
|
|
62
|
+
static const auto defaultProps = std::make_shared<const facebook::react::RNSScreenContainerProps>();
|
|
63
|
+
_props = defaultProps;
|
|
64
|
+
#endif
|
|
54
65
|
_activeScreens = [NSMutableSet new];
|
|
55
66
|
_reactSubviews = [NSMutableArray new];
|
|
56
67
|
[self setupController];
|
|
@@ -218,25 +229,105 @@
|
|
|
218
229
|
}
|
|
219
230
|
}
|
|
220
231
|
|
|
221
|
-
- (void)invalidate
|
|
222
|
-
{
|
|
223
|
-
_invalidated = YES;
|
|
224
|
-
[_controller willMoveToParentViewController:nil];
|
|
225
|
-
[_controller removeFromParentViewController];
|
|
226
|
-
}
|
|
227
|
-
|
|
228
232
|
- (void)layoutSubviews
|
|
229
233
|
{
|
|
230
234
|
[super layoutSubviews];
|
|
231
235
|
_controller.view.frame = self.bounds;
|
|
232
236
|
for (RNSScreenView *subview in _reactSubviews) {
|
|
237
|
+
#ifdef RN_FABRIC_ENABLED
|
|
238
|
+
facebook::react::LayoutMetrics screenLayoutMetrics = subview.newLayoutMetrics;
|
|
239
|
+
screenLayoutMetrics.frame = RCTRectFromCGRect(CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height));
|
|
240
|
+
[subview updateLayoutMetrics:screenLayoutMetrics oldLayoutMetrics:subview.oldLayoutMetrics];
|
|
241
|
+
#else
|
|
233
242
|
[subview reactSetFrame:CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height)];
|
|
243
|
+
#endif
|
|
234
244
|
[subview setNeedsLayout];
|
|
235
245
|
}
|
|
236
246
|
}
|
|
237
247
|
|
|
248
|
+
#pragma mark-- Fabric specific
|
|
249
|
+
#ifdef RN_FABRIC_ENABLED
|
|
250
|
+
|
|
251
|
+
- (void)mountChildComponentView:(UIView<RCTComponentViewProtocol> *)childComponentView index:(NSInteger)index
|
|
252
|
+
{
|
|
253
|
+
if (![childComponentView isKindOfClass:[RNSScreenView class]]) {
|
|
254
|
+
RCTLogError(@"ScreenContainer only accepts children of type Screen");
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
RNSScreenView *screenView = (RNSScreenView *)childComponentView;
|
|
259
|
+
|
|
260
|
+
RCTAssert(
|
|
261
|
+
childComponentView.reactSuperview == nil,
|
|
262
|
+
@"Attempt to mount already mounted component view. (parent: %@, child: %@, index: %@, existing parent: %@)",
|
|
263
|
+
self,
|
|
264
|
+
childComponentView,
|
|
265
|
+
@(index),
|
|
266
|
+
@([childComponentView.superview tag]));
|
|
267
|
+
|
|
268
|
+
[_reactSubviews insertObject:screenView atIndex:index];
|
|
269
|
+
screenView.reactSuperview = self;
|
|
270
|
+
facebook::react::LayoutMetrics screenLayoutMetrics = screenView.newLayoutMetrics;
|
|
271
|
+
screenLayoutMetrics.frame = RCTRectFromCGRect(CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height));
|
|
272
|
+
[screenView updateLayoutMetrics:screenLayoutMetrics oldLayoutMetrics:screenView.oldLayoutMetrics];
|
|
273
|
+
[self markChildUpdated];
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
- (void)unmountChildComponentView:(UIView<RCTComponentViewProtocol> *)childComponentView index:(NSInteger)index
|
|
277
|
+
{
|
|
278
|
+
RCTAssert(
|
|
279
|
+
childComponentView.reactSuperview == self,
|
|
280
|
+
@"Attempt to unmount a view which is mounted inside different view. (parent: %@, child: %@, index: %@)",
|
|
281
|
+
self,
|
|
282
|
+
childComponentView,
|
|
283
|
+
@(index));
|
|
284
|
+
RCTAssert(
|
|
285
|
+
(_reactSubviews.count > index) && [_reactSubviews objectAtIndex:index] == childComponentView,
|
|
286
|
+
@"Attempt to unmount a view which has a different index. (parent: %@, child: %@, index: %@, actual index: %@, tag at index: %@)",
|
|
287
|
+
self,
|
|
288
|
+
childComponentView,
|
|
289
|
+
@(index),
|
|
290
|
+
@([_reactSubviews indexOfObject:childComponentView]),
|
|
291
|
+
@([[_reactSubviews objectAtIndex:index] tag]));
|
|
292
|
+
((RNSScreenView *)childComponentView).reactSuperview = nil;
|
|
293
|
+
[_reactSubviews removeObject:childComponentView];
|
|
294
|
+
[childComponentView removeFromSuperview];
|
|
295
|
+
[self markChildUpdated];
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
+ (facebook::react::ComponentDescriptorProvider)componentDescriptorProvider
|
|
299
|
+
{
|
|
300
|
+
return facebook::react::concreteComponentDescriptorProvider<facebook::react::RNSScreenContainerComponentDescriptor>();
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
- (void)prepareForRecycle
|
|
304
|
+
{
|
|
305
|
+
[super prepareForRecycle];
|
|
306
|
+
[_controller willMoveToParentViewController:nil];
|
|
307
|
+
[_controller removeFromParentViewController];
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
#pragma mark-- Paper specific
|
|
311
|
+
#else
|
|
312
|
+
|
|
313
|
+
- (void)invalidate
|
|
314
|
+
{
|
|
315
|
+
_invalidated = YES;
|
|
316
|
+
[_controller willMoveToParentViewController:nil];
|
|
317
|
+
[_controller removeFromParentViewController];
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
#endif
|
|
321
|
+
|
|
238
322
|
@end
|
|
239
323
|
|
|
324
|
+
#ifdef RN_FABRIC_ENABLED
|
|
325
|
+
Class<RCTComponentViewProtocol> RNSScreenContainerCls(void)
|
|
326
|
+
{
|
|
327
|
+
return RNSScreenContainerView.class;
|
|
328
|
+
}
|
|
329
|
+
#endif
|
|
330
|
+
|
|
240
331
|
@implementation RNSScreenContainerManager
|
|
241
332
|
|
|
242
333
|
RCT_EXPORT_MODULE()
|
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
#import "RNSScreen.h"
|
|
3
3
|
#import "RNSScreenContainer.h"
|
|
4
4
|
|
|
5
|
+
#ifdef RN_FABRIC_ENABLED
|
|
6
|
+
#import <react/renderer/components/rnscreens/ComponentDescriptors.h>
|
|
7
|
+
#import <react/renderer/components/rnscreens/Props.h>
|
|
8
|
+
#import "RCTFabricComponentsPlugins.h"
|
|
9
|
+
#endif
|
|
10
|
+
|
|
5
11
|
@implementation RNScreensContainerNavigationController
|
|
6
12
|
|
|
7
13
|
@end
|
|
@@ -29,8 +35,24 @@
|
|
|
29
35
|
[self maybeDismissVC];
|
|
30
36
|
}
|
|
31
37
|
|
|
38
|
+
#pragma mark-- Fabric specific
|
|
39
|
+
#ifdef RN_FABRIC_ENABLED
|
|
40
|
+
+ (facebook::react::ComponentDescriptorProvider)componentDescriptorProvider
|
|
41
|
+
{
|
|
42
|
+
return facebook::react::concreteComponentDescriptorProvider<
|
|
43
|
+
facebook::react::RNSScreenNavigationContainerComponentDescriptor>();
|
|
44
|
+
}
|
|
45
|
+
#endif
|
|
46
|
+
|
|
32
47
|
@end
|
|
33
48
|
|
|
49
|
+
#ifdef RN_FABRIC_ENABLED
|
|
50
|
+
Class<RCTComponentViewProtocol> RNSScreenNavigationContainerCls(void)
|
|
51
|
+
{
|
|
52
|
+
return RNSScreenNavigationContainerView.class;
|
|
53
|
+
}
|
|
54
|
+
#endif
|
|
55
|
+
|
|
34
56
|
@implementation RNSScreenNavigationContainerManager
|
|
35
57
|
|
|
36
58
|
RCT_EXPORT_MODULE()
|
package/ios/RNSScreenStack.h
CHANGED
|
@@ -1,21 +1,37 @@
|
|
|
1
|
+
#ifdef RN_FABRIC_ENABLED
|
|
2
|
+
#import <React/RCTViewComponentView.h>
|
|
3
|
+
#else
|
|
1
4
|
#import <React/RCTUIManagerObserverCoordinator.h>
|
|
2
5
|
#import <React/RCTViewManager.h>
|
|
6
|
+
#endif
|
|
3
7
|
|
|
4
8
|
#import "RNSScreenContainer.h"
|
|
5
9
|
|
|
10
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
11
|
+
|
|
6
12
|
@interface RNScreensNavigationController : UINavigationController <RNScreensViewControllerDelegate>
|
|
7
13
|
|
|
8
14
|
@end
|
|
9
15
|
|
|
10
|
-
@interface RNSScreenStackView :
|
|
11
|
-
|
|
12
|
-
|
|
16
|
+
@interface RNSScreenStackView :
|
|
17
|
+
#ifdef RN_FABRIC_ENABLED
|
|
18
|
+
RCTViewComponentView <RNSScreenContainerDelegate>
|
|
19
|
+
#else
|
|
20
|
+
UIView <RNSScreenContainerDelegate, RCTInvalidating>
|
|
21
|
+
#endif
|
|
13
22
|
|
|
14
23
|
- (void)markChildUpdated;
|
|
15
24
|
- (void)didUpdateChildren;
|
|
16
25
|
|
|
26
|
+
#ifdef RN_FABRIC_ENABLED
|
|
27
|
+
#else
|
|
28
|
+
@property (nonatomic, copy) RCTDirectEventBlock onFinishTransitioning;
|
|
29
|
+
#endif // RN_FABRIC_ENABLED
|
|
30
|
+
|
|
17
31
|
@end
|
|
18
32
|
|
|
19
33
|
@interface RNSScreenStackManager : RCTViewManager <RCTInvalidating>
|
|
20
34
|
|
|
21
35
|
@end
|
|
36
|
+
|
|
37
|
+
NS_ASSUME_NONNULL_END
|