@swiftbrowser/swift 0.0.0-stage → 0.2.0
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/Package.swift +214 -0
- package/README.md +10 -2
- package/Sources/AVFoundation/AVFoundation.swift +131 -0
- package/Sources/AVFoundation/Asset.swift +487 -0
- package/Sources/AVFoundation/AudioSession.swift +144 -0
- package/Sources/AVFoundation/CMTime.swift +303 -0
- package/Sources/AVFoundation/Capture.swift +688 -0
- package/Sources/AVFoundation/Player.swift +749 -0
- package/Sources/AVFoundation/PlayerView.swift +117 -0
- package/Sources/AVKit/AVKit.swift +132 -0
- package/Sources/Accelerate/Accelerate.swift +122 -0
- package/Sources/AppIntents/AppIntents.swift +144 -0
- package/Sources/AppIntents/Parameters.swift +220 -0
- package/Sources/AppIntents/Shortcuts.swift +159 -0
- package/Sources/AudioToolbox/AudioToolbox.swift +55 -0
- package/Sources/AuthenticationServices/AuthenticationServices.swift +257 -0
- package/Sources/AuthenticationServices/Authorization.swift +251 -0
- package/Sources/Charts/Charts.swift +61 -0
- package/Sources/Combine/AnyCancellable.swift +65 -0
- package/Sources/Combine/AnyPublisher.swift +148 -0
- package/Sources/Combine/AnySubscriber.swift +230 -0
- package/Sources/Combine/Cancellable.swift +35 -0
- package/Sources/Combine/Codable.swift +29 -0
- package/Sources/Combine/CombineIdentifier.swift +45 -0
- package/Sources/Combine/Concurrency/ConcurrencyHelpers.swift +24 -0
- package/Sources/Combine/Concurrency/Future+Concurrency.swift +136 -0
- package/Sources/Combine/Concurrency/GENERATED-Publisher+Concurrency.swift +397 -0
- package/Sources/Combine/CurrentValueSubject.swift +252 -0
- package/Sources/Combine/CustomCombineIdentifierConvertible.swift +28 -0
- package/Sources/Combine/Future.swift +228 -0
- package/Sources/Combine/GENERATED-RootProtocols.swift +426 -0
- package/Sources/Combine/Helpers/ConduitBase.swift +40 -0
- package/Sources/Combine/Helpers/ConduitList.swift +59 -0
- package/Sources/Combine/Helpers/DebugHook.swift +177 -0
- package/Sources/Combine/Helpers/FilterProducer.swift +174 -0
- package/Sources/Combine/Helpers/Locking.swift +30 -0
- package/Sources/Combine/Helpers/PartialCompletion.swift +26 -0
- package/Sources/Combine/Helpers/ReduceProducer.swift +249 -0
- package/Sources/Combine/Helpers/SubjectSubscriber.swift +96 -0
- package/Sources/Combine/Helpers/SubscriberTap.swift +69 -0
- package/Sources/Combine/Helpers/SubscriptionStatus.swift +33 -0
- package/Sources/Combine/Helpers/SubscriptionTap.swift +33 -0
- package/Sources/Combine/Helpers/Utils.swift +30 -0
- package/Sources/Combine/Helpers/Violations.swift +33 -0
- package/Sources/Combine/ImmediateScheduler.swift +178 -0
- package/Sources/Combine/LICENSE +21 -0
- package/Sources/Combine/NotificationPublisher.swift +48 -0
- package/Sources/Combine/ObjectWillChange.swift +46 -0
- package/Sources/Combine/PassthroughSubject.swift +222 -0
- package/Sources/Combine/Publisher+Subscribe.swift +53 -0
- package/Sources/Combine/Publishers/Deferred.swift +48 -0
- package/Sources/Combine/Publishers/Empty.swift +54 -0
- package/Sources/Combine/Publishers/Fail.swift +42 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Catch.swift +673 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.Encode.swift +388 -0
- package/Sources/Combine/Publishers/GENERATED-Publishers.MapKeyPath.swift +384 -0
- package/Sources/Combine/Publishers/Just.swift +313 -0
- package/Sources/Combine/Publishers/Optional.Publisher.swift +315 -0
- package/Sources/Combine/Publishers/Publishers.AllSatisfy.swift +217 -0
- package/Sources/Combine/Publishers/Publishers.AssertNoFailure.swift +158 -0
- package/Sources/Combine/Publishers/Publishers.Autoconnect.swift +193 -0
- package/Sources/Combine/Publishers/Publishers.Breakpoint.swift +231 -0
- package/Sources/Combine/Publishers/Publishers.Buffer.swift +356 -0
- package/Sources/Combine/Publishers/Publishers.Collect.swift +102 -0
- package/Sources/Combine/Publishers/Publishers.CollectByCount.swift +195 -0
- package/Sources/Combine/Publishers/Publishers.CompactMap.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.Comparison.swift +371 -0
- package/Sources/Combine/Publishers/Publishers.Concatenate.swift +474 -0
- package/Sources/Combine/Publishers/Publishers.Contains.swift +293 -0
- package/Sources/Combine/Publishers/Publishers.Count.swift +87 -0
- package/Sources/Combine/Publishers/Publishers.Debounce.swift +332 -0
- package/Sources/Combine/Publishers/Publishers.Delay.swift +269 -0
- package/Sources/Combine/Publishers/Publishers.Drop.swift +155 -0
- package/Sources/Combine/Publishers/Publishers.DropUntilOutput.swift +283 -0
- package/Sources/Combine/Publishers/Publishers.DropWhile.swift +378 -0
- package/Sources/Combine/Publishers/Publishers.Filter.swift +248 -0
- package/Sources/Combine/Publishers/Publishers.First.swift +261 -0
- package/Sources/Combine/Publishers/Publishers.FlatMap.swift +533 -0
- package/Sources/Combine/Publishers/Publishers.HandleEvents.swift +260 -0
- package/Sources/Combine/Publishers/Publishers.IgnoreOutput.swift +109 -0
- package/Sources/Combine/Publishers/Publishers.Last.swift +252 -0
- package/Sources/Combine/Publishers/Publishers.MakeConnectable.swift +82 -0
- package/Sources/Combine/Publishers/Publishers.Map.swift +351 -0
- package/Sources/Combine/Publishers/Publishers.MapError.swift +140 -0
- package/Sources/Combine/Publishers/Publishers.MeasureInterval.swift +187 -0
- package/Sources/Combine/Publishers/Publishers.Multicast.swift +284 -0
- package/Sources/Combine/Publishers/Publishers.Output.swift +241 -0
- package/Sources/Combine/Publishers/Publishers.PrefixUntilOutput.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.PrefixWhile.swift +176 -0
- package/Sources/Combine/Publishers/Publishers.Print.swift +206 -0
- package/Sources/Combine/Publishers/Publishers.ReceiveOn.swift +227 -0
- package/Sources/Combine/Publishers/Publishers.Reduce.swift +204 -0
- package/Sources/Combine/Publishers/Publishers.RemoveDuplicates.swift +264 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceEmpty.swift +201 -0
- package/Sources/Combine/Publishers/Publishers.ReplaceError.swift +211 -0
- package/Sources/Combine/Publishers/Publishers.Retry.swift +274 -0
- package/Sources/Combine/Publishers/Publishers.Scan.swift +331 -0
- package/Sources/Combine/Publishers/Publishers.Sequence.swift +437 -0
- package/Sources/Combine/Publishers/Publishers.SetFailureType.swift +120 -0
- package/Sources/Combine/Publishers/Publishers.Share.swift +104 -0
- package/Sources/Combine/Publishers/Publishers.SubscribeOn.swift +197 -0
- package/Sources/Combine/Publishers/Publishers.SwitchToLatest.swift +444 -0
- package/Sources/Combine/Publishers/Publishers.Throttle.swift +359 -0
- package/Sources/Combine/Publishers/Publishers.Timeout.swift +301 -0
- package/Sources/Combine/Publishers/Publishers.Zip.swift +720 -0
- package/Sources/Combine/Publishers/Publishers.swift +13 -0
- package/Sources/Combine/Publishers/Record.swift +237 -0
- package/Sources/Combine/Publishers/Result.Publisher.swift +337 -0
- package/Sources/Combine/Result.swift +46 -0
- package/Sources/Combine/Scheduler.swift +89 -0
- package/Sources/Combine/Schedulers.swift +211 -0
- package/Sources/Combine/Subject+Void.swift +17 -0
- package/Sources/Combine/Subscriber+Void.swift +20 -0
- package/Sources/Combine/Subscribers/Subscribers.Assign.swift +175 -0
- package/Sources/Combine/Subscribers/Subscribers.Completion.swift +90 -0
- package/Sources/Combine/Subscribers/Subscribers.Demand.swift +476 -0
- package/Sources/Combine/Subscribers/Subscribers.Sink.swift +206 -0
- package/Sources/Combine/Subscribers/Subscribers.swift +9 -0
- package/Sources/Combine/Subscription.swift +22 -0
- package/Sources/Combine/Subscriptions.swift +42 -0
- package/Sources/Combine/SwiftUIObservation.swift +10 -0
- package/Sources/Combine/_Introspection.swift +107 -0
- package/Sources/CommonCrypto/CommonCrypto.swift +80 -0
- package/Sources/Compression/Compression.swift +365 -0
- package/Sources/Compression/Deflate.swift +407 -0
- package/Sources/Compression/Zlib.swift +179 -0
- package/Sources/CoreFoundationTypes/CoreFoundationTypes.swift +101 -0
- package/Sources/CoreGraphics/CoreGraphics.swift +411 -0
- package/Sources/CoreGraphics/ProjectionTransforms.swift +28 -0
- package/Sources/CoreHaptics/CoreHaptics.swift +399 -0
- package/Sources/CoreImage/CIColor.swift +41 -0
- package/Sources/CoreImage/CIContext.swift +31 -0
- package/Sources/CoreImage/CIDetector.swift +57 -0
- package/Sources/CoreImage/CIFilter.swift +243 -0
- package/Sources/CoreImage/CIFilterBuiltins.swift +136 -0
- package/Sources/CoreImage/CIImage.swift +162 -0
- package/Sources/CoreImage/QRCode.swift +393 -0
- package/Sources/CoreLocation/Coordinate.swift +30 -0
- package/Sources/CoreLocation/Location.swift +65 -0
- package/Sources/CoreML/Evaluation.swift +414 -0
- package/Sources/CoreML/FeatureValue.swift +266 -0
- package/Sources/CoreML/Model.swift +269 -0
- package/Sources/CoreML/MultiArray.swift +92 -0
- package/Sources/CoreML/Specification.swift +233 -0
- package/Sources/CoreText/CoreText.swift +64 -0
- package/Sources/CoreTransferable/CoreTransferable.swift +606 -0
- package/Sources/CryptoKit/ChaChaPoly.swift +258 -0
- package/Sources/CryptoKit/CryptoKit.swift +375 -0
- package/Sources/CryptoKit/Curve25519.swift +317 -0
- package/Sources/CryptoKit/P256.swift +321 -0
- package/Sources/FoundationBridge/AppStorage.swift +165 -0
- package/Sources/FoundationBridge/AssetResources.swift +90 -0
- package/Sources/FoundationBridge/AsyncBytes.swift +128 -0
- package/Sources/FoundationBridge/AsyncImage.swift +116 -0
- package/Sources/FoundationBridge/AttributedStrings.swift +16 -0
- package/Sources/FoundationBridge/Bundle.swift +119 -0
- package/Sources/FoundationBridge/CombineExports.swift +8 -0
- package/Sources/FoundationBridge/CoreFoundation.swift +77 -0
- package/Sources/FoundationBridge/Dispatch.swift +458 -0
- package/Sources/FoundationBridge/EnvironmentFoundation.swift +41 -0
- package/Sources/FoundationBridge/FileImporter.swift +128 -0
- package/Sources/FoundationBridge/FileSystem.swift +68 -0
- package/Sources/FoundationBridge/FoundationBridge.swift +29 -0
- package/Sources/FoundationBridge/HostResolution.swift +31 -0
- package/Sources/FoundationBridge/ItemProvider.swift +655 -0
- package/Sources/FoundationBridge/KeyValueObserving.swift +138 -0
- package/Sources/FoundationBridge/Links.swift +127 -0
- package/Sources/FoundationBridge/ListFormatter.swift +32 -0
- package/Sources/FoundationBridge/Locale.swift +86 -0
- package/Sources/FoundationBridge/Localization.swift +149 -0
- package/Sources/FoundationBridge/Locks.swift +50 -0
- package/Sources/FoundationBridge/Markdown.swift +527 -0
- package/Sources/FoundationBridge/MeasurementFormat.swift +95 -0
- package/Sources/FoundationBridge/NotificationCenter.swift +154 -0
- package/Sources/FoundationBridge/OpenURLHandlers.swift +60 -0
- package/Sources/FoundationBridge/Operation.swift +195 -0
- package/Sources/FoundationBridge/ProcessInfo.swift +32 -0
- package/Sources/FoundationBridge/RelativeDateTimeFormatter.swift +136 -0
- package/Sources/FoundationBridge/SceneStorage.swift +78 -0
- package/Sources/FoundationBridge/SecurityExports.swift +8 -0
- package/Sources/FoundationBridge/Selector.swift +226 -0
- package/Sources/FoundationBridge/StringComparators.swift +17 -0
- package/Sources/FoundationBridge/Table.swift +211 -0
- package/Sources/FoundationBridge/TextAttributes.swift +42 -0
- package/Sources/FoundationBridge/Timer.swift +53 -0
- package/Sources/FoundationBridge/UITextChecker.swift +30 -0
- package/Sources/FoundationBridge/URLSession.swift +718 -0
- package/Sources/FoundationBridge/UserDefaults.swift +183 -0
- package/Sources/FoundationBridge/WebAuthRedirects.swift +227 -0
- package/Sources/FoundationBridge/WebSocket.swift +187 -0
- package/Sources/FoundationModels/FoundationModels.swift +1098 -0
- package/Sources/ImageIO/GIF.swift +72 -0
- package/Sources/ImageIO/ImageIO.swift +248 -0
- package/Sources/ImageIO/ImageTypes.swift +28 -0
- package/Sources/LinkPresentation/LinkPresentation.swift +249 -0
- package/Sources/LocalAuthentication/LAContext.swift +86 -0
- package/Sources/MapKit/Geometry.swift +223 -0
- package/Sources/MapKit/Map.swift +638 -0
- package/Sources/MapKit/MapView.swift +229 -0
- package/Sources/MobileCoreServices/MobileCoreServices.swift +28 -0
- package/Sources/NaturalLanguage/LanguageIdentifier.swift +317 -0
- package/Sources/NaturalLanguage/NaturalLanguage.swift +135 -0
- package/Sources/OSLog/OSLog.swift +6 -0
- package/Sources/Photos/Photos.swift +572 -0
- package/Sources/PhotosUI/PhotosPicker.swift +248 -0
- package/Sources/PhotosUI/PhotosPickerItem.swift +261 -0
- package/Sources/QuickLook/QuickLook.swift +168 -0
- package/Sources/SafariServices/SafariServices.swift +106 -0
- package/Sources/Security/Security.swift +332 -0
- package/Sources/StoreKit/AppStore.swift +207 -0
- package/Sources/StoreKit/Products.swift +280 -0
- package/Sources/StoreKit/RequestReview.swift +28 -0
- package/Sources/StoreKit/StoreKit1.swift +486 -0
- package/Sources/StoreKit/StoreViews.swift +428 -0
- package/Sources/StoreKit/Transactions.swift +197 -0
- package/Sources/SwiftData/Macros.swift +58 -0
- package/Sources/SwiftData/ModelActor.swift +38 -0
- package/Sources/SwiftData/ModelContainer.swift +129 -0
- package/Sources/SwiftData/ModelContext.swift +451 -0
- package/Sources/SwiftData/PersistentModel.swift +238 -0
- package/Sources/SwiftData/Properties.swift +261 -0
- package/Sources/SwiftData/Query.swift +256 -0
- package/Sources/SwiftData/Schema.swift +192 -0
- package/Sources/SwiftData/Store.swift +146 -0
- package/Sources/SwiftData/StringPredicates.swift +125 -0
- package/Sources/SwiftDataMacros/EntryMacro.swift +82 -0
- package/Sources/SwiftDataMacros/GenerableMacro.swift +183 -0
- package/Sources/SwiftDataMacros/ModelActorMacro.swift +46 -0
- package/Sources/SwiftDataMacros/ModelMacro.swift +260 -0
- package/Sources/SwiftDataMacros/Plugin.swift +18 -0
- package/Sources/SwiftDataMacros/PredicateMacro.swift +1244 -0
- package/Sources/SwiftUI/API/Accessibility.swift +181 -0
- package/Sources/SwiftUI/API/AccessibilityExtras.swift +33 -0
- package/Sources/SwiftUI/API/AccessibilityFocus.swift +63 -0
- package/Sources/SwiftUI/API/Alert.swift +221 -0
- package/Sources/SwiftUI/API/AlignmentGuides.swift +65 -0
- package/Sources/SwiftUI/API/Animation.swift +285 -0
- package/Sources/SwiftUI/API/App.swift +87 -0
- package/Sources/SwiftUI/API/BindingCollections.swift +35 -0
- package/Sources/SwiftUI/API/BindingForEach.swift +27 -0
- package/Sources/SwiftUI/API/Bitmaps.swift +254 -0
- package/Sources/SwiftUI/API/ButtonStyles.swift +96 -0
- package/Sources/SwiftUI/API/Canvas.swift +337 -0
- package/Sources/SwiftUI/API/Color.swift +237 -0
- package/Sources/SwiftUI/API/ColorEffects.swift +52 -0
- package/Sources/SwiftUI/API/ColorPickerAndLabeledContent.swift +138 -0
- package/Sources/SwiftUI/API/ColorSpaces.swift +161 -0
- package/Sources/SwiftUI/API/Commands.swift +106 -0
- package/Sources/SwiftUI/API/ContainerBackground.swift +28 -0
- package/Sources/SwiftUI/API/ContentShape.swift +33 -0
- package/Sources/SwiftUI/API/ContentSizeCategory.swift +35 -0
- package/Sources/SwiftUI/API/ContentUnavailable.swift +101 -0
- package/Sources/SwiftUI/API/Controls.swift +300 -0
- package/Sources/SwiftUI/API/CustomLayout.swift +442 -0
- package/Sources/SwiftUI/API/CustomToolbarContent.swift +46 -0
- package/Sources/SwiftUI/API/Decorations.swift +92 -0
- package/Sources/SwiftUI/API/EditMode.swift +212 -0
- package/Sources/SwiftUI/API/Effects.swift +388 -0
- package/Sources/SwiftUI/API/Entry.swift +8 -0
- package/Sources/SwiftUI/API/Environment.swift +439 -0
- package/Sources/SwiftUI/API/EnvironmentSendable.swift +6 -0
- package/Sources/SwiftUI/API/Focus.swift +137 -0
- package/Sources/SwiftUI/API/Font.swift +131 -0
- package/Sources/SwiftUI/API/Gauge.swift +290 -0
- package/Sources/SwiftUI/API/Geometry.swift +89 -0
- package/Sources/SwiftUI/API/GeometryEffects.swift +232 -0
- package/Sources/SwiftUI/API/GeometryReader.swift +135 -0
- package/Sources/SwiftUI/API/GestureState.swift +65 -0
- package/Sources/SwiftUI/API/Gestures.swift +342 -0
- package/Sources/SwiftUI/API/Glass.swift +127 -0
- package/Sources/SwiftUI/API/Grid.swift +188 -0
- package/Sources/SwiftUI/API/GroupBoxAndControlGroup.swift +130 -0
- package/Sources/SwiftUI/API/KeyPress.swift +54 -0
- package/Sources/SwiftUI/API/LabelStyle.swift +124 -0
- package/Sources/SwiftUI/API/Layout.swift +220 -0
- package/Sources/SwiftUI/API/LazyStacks.swift +49 -0
- package/Sources/SwiftUI/API/LegacyAlert.swift +97 -0
- package/Sources/SwiftUI/API/Lists.swift +331 -0
- package/Sources/SwiftUI/API/Menu.swift +58 -0
- package/Sources/SwiftUI/API/Modifiers.swift +313 -0
- package/Sources/SwiftUI/API/MoreModifiers.swift +100 -0
- package/Sources/SwiftUI/API/Namespace.swift +44 -0
- package/Sources/SwiftUI/API/Navigation.swift +386 -0
- package/Sources/SwiftUI/API/NavigationDestinationBindings.swift +55 -0
- package/Sources/SwiftUI/API/ObservableObject.swift +293 -0
- package/Sources/SwiftUI/API/OnChange.swift +48 -0
- package/Sources/SwiftUI/API/Path.swift +543 -0
- package/Sources/SwiftUI/API/Phase8Controls.swift +411 -0
- package/Sources/SwiftUI/API/PhaseAnimator.swift +130 -0
- package/Sources/SwiftUI/API/Picker.swift +185 -0
- package/Sources/SwiftUI/API/PointerAndKeyboard.swift +77 -0
- package/Sources/SwiftUI/API/Popover.swift +41 -0
- package/Sources/SwiftUI/API/Preferences.swift +262 -0
- package/Sources/SwiftUI/API/Presentation.swift +122 -0
- package/Sources/SwiftUI/API/PresentationExtras.swift +60 -0
- package/Sources/SwiftUI/API/Primitives.swift +517 -0
- package/Sources/SwiftUI/API/Publishers.swift +107 -0
- package/Sources/SwiftUI/API/Redaction.swift +75 -0
- package/Sources/SwiftUI/API/RowActions.swift +84 -0
- package/Sources/SwiftUI/API/Scenes.swift +131 -0
- package/Sources/SwiftUI/API/ScrollModifiers.swift +132 -0
- package/Sources/SwiftUI/API/ScrollTargets.swift +104 -0
- package/Sources/SwiftUI/API/ScrollViewReader.swift +144 -0
- package/Sources/SwiftUI/API/SectionSupplements.swift +96 -0
- package/Sources/SwiftUI/API/Shape.swift +214 -0
- package/Sources/SwiftUI/API/ShapeStyle.swift +409 -0
- package/Sources/SwiftUI/API/ShapeTrim.swift +78 -0
- package/Sources/SwiftUI/API/Sharing.swift +193 -0
- package/Sources/SwiftUI/API/StackLayouts.swift +199 -0
- package/Sources/SwiftUI/API/State.swift +144 -0
- package/Sources/SwiftUI/API/StatusGaps.swift +121 -0
- package/Sources/SwiftUI/API/StrokeStyle.swift +30 -0
- package/Sources/SwiftUI/API/SymbolEffects.swift +203 -0
- package/Sources/SwiftUI/API/TabContent.swift +841 -0
- package/Sources/SwiftUI/API/Table.swift +382 -0
- package/Sources/SwiftUI/API/Tabs.swift +263 -0
- package/Sources/SwiftUI/API/Tasks.swift +35 -0
- package/Sources/SwiftUI/API/Text.swift +386 -0
- package/Sources/SwiftUI/API/TextDates.swift +61 -0
- package/Sources/SwiftUI/API/TextDecorations.swift +52 -0
- package/Sources/SwiftUI/API/TextFieldAxis.swift +103 -0
- package/Sources/SwiftUI/API/TextFieldCommit.swift +52 -0
- package/Sources/SwiftUI/API/Timeline.swift +212 -0
- package/Sources/SwiftUI/API/Toolbar.swift +251 -0
- package/Sources/SwiftUI/API/Transfer.swift +145 -0
- package/Sources/SwiftUI/API/UnevenRoundedRectangle.swift +66 -0
- package/Sources/SwiftUI/API/Video.swift +64 -0
- package/Sources/SwiftUI/API/View.swift +215 -0
- package/Sources/SwiftUI/API/ViewModifier.swift +43 -0
- package/Sources/SwiftUI/API/VisualEffect.swift +155 -0
- package/Sources/SwiftUI/API/Windows.swift +25 -0
- package/Sources/SwiftUI/Charts/Axis.swift +325 -0
- package/Sources/SwiftUI/Charts/AxisFormatsAndRanges.swift +68 -0
- package/Sources/SwiftUI/Charts/Chart.swift +660 -0
- package/Sources/SwiftUI/Charts/ChartContent.swift +376 -0
- package/Sources/SwiftUI/Charts/ChartProxy.swift +57 -0
- package/Sources/SwiftUI/Charts/Marks.swift +204 -0
- package/Sources/SwiftUI/Charts/Plottable.swift +99 -0
- package/Sources/SwiftUI/Charts/Scales.swift +326 -0
- package/Sources/SwiftUI/Localization/Localization.swift +498 -0
- package/Sources/SwiftUI/Localization/PluralRules.swift +127 -0
- package/Sources/SwiftUI/Runtime/Executor.swift +85 -0
- package/Sources/SwiftUI/Runtime/Exports.swift +101 -0
- package/Sources/SwiftUI/Runtime/ImageSource.swift +310 -0
- package/Sources/SwiftUI/Runtime/JSON.swift +143 -0
- package/Sources/SwiftUI/Runtime/JSONParser.swift +443 -0
- package/Sources/SwiftUI/Runtime/LazyRows.swift +99 -0
- package/Sources/SwiftUI/Runtime/Measurements.swift +140 -0
- package/Sources/SwiftUI/Runtime/Ops.swift +152 -0
- package/Sources/SwiftUI/Runtime/Reconciler.swift +219 -0
- package/Sources/SwiftUI/Runtime/Replay.swift +382 -0
- package/Sources/SwiftUI/Runtime/Runtime.swift +2146 -0
- package/Sources/SwiftUI/Runtime/Sameness.swift +152 -0
- package/Sources/SwiftUI/Runtime/ViewPath.swift +89 -0
- package/Sources/SwiftUI/Runtime/ViewTraits.swift +175 -0
- package/Sources/SwiftUI/Runtime/WebAuthHeadless.swift +49 -0
- package/Sources/Symbols/Symbols.swift +25 -0
- package/Sources/Translation/Translation.swift +423 -0
- package/Sources/UIKit/Activity.swift +213 -0
- package/Sources/UIKit/Alerts.swift +69 -0
- package/Sources/UIKit/AppDelegate.swift +222 -0
- package/Sources/UIKit/Appearance.swift +84 -0
- package/Sources/UIKit/ColorConversions.swift +70 -0
- package/Sources/UIKit/Controls.swift +225 -0
- package/Sources/UIKit/Device.swift +200 -0
- package/Sources/UIKit/Feedback.swift +65 -0
- package/Sources/UIKit/Font.swift +307 -0
- package/Sources/UIKit/Graphics.swift +204 -0
- package/Sources/UIKit/HostingController.swift +185 -0
- package/Sources/UIKit/Identity.swift +24 -0
- package/Sources/UIKit/Introspectable.swift +510 -0
- package/Sources/UIKit/Pasteboard.swift +363 -0
- package/Sources/UIKit/PhotoAlbum.swift +81 -0
- package/Sources/UIKit/RemoteNotifications.swift +15 -0
- package/Sources/UIKit/Representable.swift +288 -0
- package/Sources/UIKit/SafeArea.swift +12 -0
- package/Sources/UIKit/SceneDelegates.swift +132 -0
- package/Sources/UIKit/Scenes.swift +40 -0
- package/Sources/UIKit/ScrollView.swift +157 -0
- package/Sources/UIKit/ShortcutItems.swift +67 -0
- package/Sources/UIKit/SymbolConfiguration.swift +124 -0
- package/Sources/UIKit/TargetAction.swift +123 -0
- package/Sources/UIKit/TextPaste.swift +161 -0
- package/Sources/UIKit/TextView.swift +538 -0
- package/Sources/UIKit/UIKit.swift +292 -0
- package/Sources/UIKit/UIView.swift +855 -0
- package/Sources/UIKit/ViewTranslation.swift +311 -0
- package/Sources/UniformTypeIdentifiers/UTType.swift +196 -0
- package/Sources/UserNotifications/Content.swift +370 -0
- package/Sources/UserNotifications/NotificationCenter.swift +309 -0
- package/Sources/WeatherKit/WeatherKit.swift +228 -0
- package/Sources/WebKit/WebKit.swift +245 -0
- package/Sources/os/os.swift +376 -0
- package/Sources/zlib/zlib.swift +6 -0
- package/index.d.ts +2 -0
- package/index.mjs +16 -0
- package/manifest.d.mts +2 -0
- package/manifest.mjs +39 -0
- package/package.json +30 -4
- package/sync-sources.mjs +33 -0
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
// Headless event scripts (SB_EVENTS, Examples/*/__snapshots__/events.txt).
|
|
2
|
+
//
|
|
3
|
+
// An event names its target by element id (`tap:12`) or by a selector
|
|
4
|
+
// resolved against what is on screen when the event is replayed:
|
|
5
|
+
//
|
|
6
|
+
// tap:"Add Samples 2" the tappable element showing that text
|
|
7
|
+
// tap:"Edit"#2 the second of several matches
|
|
8
|
+
// tap:@save `.accessibilityIdentifier("save")`
|
|
9
|
+
// select:[tabview]:"Settings" an element of that kind (here by a tab title)
|
|
10
|
+
// text:"Name":Paul a field by its placeholder
|
|
11
|
+
// back, dismiss the visible screen's back button, the top sheet or alert
|
|
12
|
+
//
|
|
13
|
+
// A selector that matches nothing, or several elements without `#n`, stops
|
|
14
|
+
// the replay with an error op, so a script never taps the wrong element.
|
|
15
|
+
|
|
16
|
+
/// A replay target written as a selector.
|
|
17
|
+
struct _Selector: CustomStringConvertible {
|
|
18
|
+
var kind: String?
|
|
19
|
+
var text: String?
|
|
20
|
+
var identifier: String?
|
|
21
|
+
/// 1-based, from `#n`.
|
|
22
|
+
var index: Int?
|
|
23
|
+
|
|
24
|
+
var description: String {
|
|
25
|
+
var out = ""
|
|
26
|
+
if let kind { out += "[\(kind)]" }
|
|
27
|
+
if let text { out += _quoted(text) }
|
|
28
|
+
if let identifier { out += "@\(identifier)" }
|
|
29
|
+
if let index { out += "#\(index)" }
|
|
30
|
+
return out
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
enum _ScriptTarget {
|
|
35
|
+
case id(Int)
|
|
36
|
+
case selector(_Selector)
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/// One event of a script, parsed but not yet resolved.
|
|
40
|
+
struct _ScriptEvent {
|
|
41
|
+
var type: String
|
|
42
|
+
var target: _ScriptTarget?
|
|
43
|
+
/// What follows the target (`Paul` in `text:"Name":Paul`), unquoted.
|
|
44
|
+
var value: String?
|
|
45
|
+
/// Whether `value` was written in quotes (`select:"Sort":"Title"` names an option).
|
|
46
|
+
var valueQuoted = false
|
|
47
|
+
var raw: String
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
struct _ScriptError: Error {
|
|
51
|
+
let message: String
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
private func _quoted(_ text: String) -> String {
|
|
55
|
+
"\"" + text.replacingAll("\\", with: "\\\\").replacingAll("\"", with: "\\\"") + "\""
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
extension String {
|
|
59
|
+
func trimmingSpaces() -> String {
|
|
60
|
+
String(drop(while: { $0 == " " }).reversed().drop(while: { $0 == " " }).reversed())
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
fileprivate func replacingAll(_ target: Character, with replacement: String) -> String {
|
|
64
|
+
var out = ""
|
|
65
|
+
for character in self {
|
|
66
|
+
if character == target { out += replacement } else { out.append(character) }
|
|
67
|
+
}
|
|
68
|
+
return out
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/// The event types whose first field is a target.
|
|
73
|
+
private let _targetedEvents: Set<String> = [
|
|
74
|
+
"tap", "text", "toggle", "select", "step", "slide", "date", "geometry",
|
|
75
|
+
"drag", "longpress", "delete", "refresh",
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
/// The element kinds a selector picks for each event type, unless it names
|
|
79
|
+
/// a kind itself (`[navscreen]`). A selector resolves to the nearest element
|
|
80
|
+
/// at or above a match that has a handler and is one of these, as a tap on
|
|
81
|
+
/// a button's text reaches the button.
|
|
82
|
+
private let _targetKinds: [String: Set<String>] = [
|
|
83
|
+
"tap": ["button", "navlink", "listrow", "tapgesture"],
|
|
84
|
+
"longpress": ["gesture"],
|
|
85
|
+
"drag": ["gesture"],
|
|
86
|
+
"delete": ["listrow"],
|
|
87
|
+
"text": ["textfield", "searchfield", "texteditor"],
|
|
88
|
+
"toggle": ["toggle"],
|
|
89
|
+
"select": ["picker", "tabview"],
|
|
90
|
+
"step": ["stepper"],
|
|
91
|
+
"slide": ["slider"],
|
|
92
|
+
"date": ["datepicker"],
|
|
93
|
+
"geometry": ["geometry"],
|
|
94
|
+
]
|
|
95
|
+
|
|
96
|
+
enum _EventScript {
|
|
97
|
+
/// Splits a script into events at commas and line breaks outside quotes.
|
|
98
|
+
/// A line whose first non-blank character is `#` is a comment.
|
|
99
|
+
static func split(_ script: String) -> [String] {
|
|
100
|
+
var events: [String] = []
|
|
101
|
+
var current = ""
|
|
102
|
+
var inQuotes = false
|
|
103
|
+
var escaped = false
|
|
104
|
+
var inComment = false
|
|
105
|
+
func flush() {
|
|
106
|
+
let trimmed = current.trimmingSpaces()
|
|
107
|
+
if !trimmed.isEmpty { events.append(trimmed) }
|
|
108
|
+
current = ""
|
|
109
|
+
}
|
|
110
|
+
for character in script {
|
|
111
|
+
if inComment {
|
|
112
|
+
if character == "\n" { inComment = false }
|
|
113
|
+
continue
|
|
114
|
+
}
|
|
115
|
+
if inQuotes {
|
|
116
|
+
current.append(character)
|
|
117
|
+
if escaped {
|
|
118
|
+
escaped = false
|
|
119
|
+
} else if character == "\\" {
|
|
120
|
+
escaped = true
|
|
121
|
+
} else if character == "\"" {
|
|
122
|
+
inQuotes = false
|
|
123
|
+
}
|
|
124
|
+
continue
|
|
125
|
+
}
|
|
126
|
+
switch character {
|
|
127
|
+
case "\"":
|
|
128
|
+
inQuotes = true
|
|
129
|
+
current.append(character)
|
|
130
|
+
case ",", "\n", "\r":
|
|
131
|
+
flush()
|
|
132
|
+
case "#" where current.trimmingSpaces().isEmpty:
|
|
133
|
+
inComment = true
|
|
134
|
+
default:
|
|
135
|
+
current.append(character)
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
flush()
|
|
139
|
+
return events
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
static func parse(_ raw: String) throws(_ScriptError) -> _ScriptEvent {
|
|
143
|
+
var scanner = _Scanner(raw)
|
|
144
|
+
let type = scanner.read(until: ":").trimmingSpaces()
|
|
145
|
+
var event = _ScriptEvent(type: type, raw: raw)
|
|
146
|
+
guard scanner.skip(":") else { return event }
|
|
147
|
+
if _targetedEvents.contains(type) {
|
|
148
|
+
event.target = try scanner.readTarget(in: raw)
|
|
149
|
+
guard scanner.skip(":") else {
|
|
150
|
+
guard scanner.atEnd else { throw _ScriptError(message: "unexpected text after the target in \(raw)") }
|
|
151
|
+
return event
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if scanner.peek == "\"" {
|
|
155
|
+
event.value = try scanner.readQuoted(in: raw)
|
|
156
|
+
event.valueQuoted = true
|
|
157
|
+
guard scanner.atEnd else { throw _ScriptError(message: "unexpected text after the value in \(raw)") }
|
|
158
|
+
} else {
|
|
159
|
+
event.value = scanner.rest.trimmingSpaces()
|
|
160
|
+
}
|
|
161
|
+
return event
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
private struct _Scanner {
|
|
166
|
+
let characters: [Character]
|
|
167
|
+
var position = 0
|
|
168
|
+
|
|
169
|
+
init(_ text: String) { characters = Array(text) }
|
|
170
|
+
|
|
171
|
+
var atEnd: Bool { position >= characters.count }
|
|
172
|
+
var peek: Character? { atEnd ? nil : characters[position] }
|
|
173
|
+
var rest: String { String(characters[position...]) }
|
|
174
|
+
|
|
175
|
+
mutating func skip(_ character: Character) -> Bool {
|
|
176
|
+
guard peek == character else { return false }
|
|
177
|
+
position += 1
|
|
178
|
+
return true
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
mutating func read(until stop: Character) -> String {
|
|
182
|
+
var out = ""
|
|
183
|
+
while let next = peek, next != stop {
|
|
184
|
+
out.append(next)
|
|
185
|
+
position += 1
|
|
186
|
+
}
|
|
187
|
+
return out
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
mutating func skipSpaces() {
|
|
191
|
+
while peek == " " { position += 1 }
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
mutating func readQuoted(in raw: String) throws(_ScriptError) -> String {
|
|
195
|
+
guard skip("\"") else { throw _ScriptError(message: "expected a quoted string in \(raw)") }
|
|
196
|
+
var out = ""
|
|
197
|
+
while let next = peek {
|
|
198
|
+
position += 1
|
|
199
|
+
if next == "\"" { return out }
|
|
200
|
+
if next == "\\", let escaped = peek {
|
|
201
|
+
position += 1
|
|
202
|
+
out.append(escaped)
|
|
203
|
+
} else {
|
|
204
|
+
out.append(next)
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
throw _ScriptError(message: "unterminated string in \(raw)")
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/// An element id, or a selector: `[kind]`, then `"text"` or `@identifier`, then `#n`.
|
|
211
|
+
mutating func readTarget(in raw: String) throws(_ScriptError) -> _ScriptTarget {
|
|
212
|
+
skipSpaces()
|
|
213
|
+
if let first = peek, first.isNumber || first == "-" {
|
|
214
|
+
let text = read(until: ":").trimmingSpaces()
|
|
215
|
+
guard let id = Int(text) else { throw _ScriptError(message: "bad element id \(text) in \(raw)") }
|
|
216
|
+
return .id(id)
|
|
217
|
+
}
|
|
218
|
+
var selector = _Selector()
|
|
219
|
+
if skip("[") {
|
|
220
|
+
selector.kind = read(until: "]")
|
|
221
|
+
guard skip("]"), !(selector.kind ?? "").isEmpty else {
|
|
222
|
+
throw _ScriptError(message: "expected [kind] in \(raw)")
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
if peek == "\"" {
|
|
226
|
+
selector.text = try readQuoted(in: raw)
|
|
227
|
+
} else if skip("@") {
|
|
228
|
+
var identifier = ""
|
|
229
|
+
while let next = peek, next != ":", next != "#" {
|
|
230
|
+
identifier.append(next)
|
|
231
|
+
position += 1
|
|
232
|
+
}
|
|
233
|
+
selector.identifier = identifier.trimmingSpaces()
|
|
234
|
+
guard !(selector.identifier ?? "").isEmpty else { throw _ScriptError(message: "expected an identifier after @ in \(raw)") }
|
|
235
|
+
}
|
|
236
|
+
if skip("#") {
|
|
237
|
+
let digits = read(until: ":").trimmingSpaces()
|
|
238
|
+
guard let index = Int(digits), index > 0 else { throw _ScriptError(message: "bad match number #\(digits) in \(raw)") }
|
|
239
|
+
selector.index = index
|
|
240
|
+
}
|
|
241
|
+
skipSpaces()
|
|
242
|
+
guard selector.kind != nil || selector.text != nil || selector.identifier != nil else {
|
|
243
|
+
throw _ScriptError(message: "expected an element id or a selector in \(raw)")
|
|
244
|
+
}
|
|
245
|
+
return .selector(selector)
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
// MARK: - Resolving selectors
|
|
250
|
+
|
|
251
|
+
extension _Reconciler.Rendered {
|
|
252
|
+
func string(_ key: String) -> String? {
|
|
253
|
+
if case .object(let fields) = props, case .string(let value)? = fields[key] { return value }
|
|
254
|
+
return nil
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
func number(_ key: String) -> Double? {
|
|
258
|
+
if case .object(let fields) = props, case .number(let value)? = fields[key] { return value }
|
|
259
|
+
return nil
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/// Whether `text` is what this element shows or is labelled with: a
|
|
263
|
+
/// `text`, an image's name, a screen title, a control's label or
|
|
264
|
+
/// placeholder, or its `accessibilityLabel`.
|
|
265
|
+
func shows(_ text: String) -> Bool {
|
|
266
|
+
if accessibility?.label == text { return true }
|
|
267
|
+
switch kind {
|
|
268
|
+
case "text": return string("text") == text
|
|
269
|
+
case "image": return string("systemName") == text || string("name") == text
|
|
270
|
+
default:
|
|
271
|
+
return string("title") == text || string("label") == text || string("placeholder") == text
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
@MainActor
|
|
277
|
+
extension _Reconciler {
|
|
278
|
+
/// The elements on screen: the top sheet or alert if one is presented,
|
|
279
|
+
/// else everything, without the screens a stack has pushed over and
|
|
280
|
+
/// the unselected tabs.
|
|
281
|
+
private var visibleRoots: [Rendered] {
|
|
282
|
+
if let modal = roots.last(where: { $0.kind == "sheet" || $0.kind == "alert" }) { return [modal] }
|
|
283
|
+
return roots
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
private func visibleChildren(of element: Rendered) -> [Rendered] {
|
|
287
|
+
switch element.kind {
|
|
288
|
+
case "navstack":
|
|
289
|
+
guard let top = element.children.lastIndex(where: { $0.kind == "navscreen" }) else { return element.children }
|
|
290
|
+
return element.children.enumerated().filter { index, child in
|
|
291
|
+
child.kind != "navscreen" || index == top
|
|
292
|
+
}.map(\.1)
|
|
293
|
+
case "tabview":
|
|
294
|
+
guard let selected = element.number("selected").map(Int.init),
|
|
295
|
+
element.children.indices.contains(selected) else { return element.children }
|
|
296
|
+
return [element.children[selected]]
|
|
297
|
+
default:
|
|
298
|
+
return element.children
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/// The element a selector names for an event of this type.
|
|
303
|
+
func resolve(_ selector: _Selector, for type: String) throws(_ScriptError) -> Rendered {
|
|
304
|
+
let kinds = selector.kind.map { Set([$0]) } ?? _targetKinds[type]
|
|
305
|
+
func isTarget(_ element: Rendered) -> Bool {
|
|
306
|
+
handlers[element.id] != nil && (kinds?.contains(element.kind) ?? true)
|
|
307
|
+
}
|
|
308
|
+
func isMatch(_ element: Rendered) -> Bool {
|
|
309
|
+
if let identifier = selector.identifier { return element.accessibility?.identifier == identifier }
|
|
310
|
+
if let text = selector.text { return element.shows(text) }
|
|
311
|
+
return element.kind == selector.kind
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
var found: [Rendered] = []
|
|
315
|
+
func visit(_ element: Rendered, path: inout [Rendered]) {
|
|
316
|
+
path.append(element)
|
|
317
|
+
if isMatch(element), let target = path.last(where: isTarget), !found.contains(where: { $0.id == target.id }) {
|
|
318
|
+
found.append(target)
|
|
319
|
+
}
|
|
320
|
+
for child in visibleChildren(of: element) { visit(child, path: &path) }
|
|
321
|
+
path.removeLast()
|
|
322
|
+
}
|
|
323
|
+
var path: [Rendered] = []
|
|
324
|
+
for root in visibleRoots { visit(root, path: &path) }
|
|
325
|
+
|
|
326
|
+
let event = "\(type):\(selector)"
|
|
327
|
+
guard !found.isEmpty else { throw _ScriptError(message: "\(event) matches nothing on screen") }
|
|
328
|
+
if let index = selector.index {
|
|
329
|
+
guard index <= found.count else {
|
|
330
|
+
throw _ScriptError(message: "\(event): only \(found.count) element\(found.count == 1 ? "" : "s") match")
|
|
331
|
+
}
|
|
332
|
+
return found[index - 1]
|
|
333
|
+
}
|
|
334
|
+
guard found.count == 1 else {
|
|
335
|
+
let ids = found.map { "\($0.kind) \($0.id)" }.joined(separator: ", ")
|
|
336
|
+
throw _ScriptError(message: "\(event) matches \(found.count) elements (\(ids)); pick one with #1…#\(found.count)")
|
|
337
|
+
}
|
|
338
|
+
return found[0]
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/// The rendered element with this id, if it is on the tree.
|
|
342
|
+
func element(id: Int) -> Rendered? {
|
|
343
|
+
func find(in elements: [Rendered]) -> Rendered? {
|
|
344
|
+
for element in elements {
|
|
345
|
+
if element.id == id { return element }
|
|
346
|
+
if let found = find(in: element.children) { return found }
|
|
347
|
+
}
|
|
348
|
+
return nil
|
|
349
|
+
}
|
|
350
|
+
return find(in: roots)
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
/// `back`: the visible screen's back button.
|
|
354
|
+
func backTarget() throws(_ScriptError) -> Rendered {
|
|
355
|
+
try resolve(_Selector(kind: "navscreen"), for: "tap")
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
/// `dismiss`: the top sheet or alert.
|
|
359
|
+
func dismissTarget() throws(_ScriptError) -> Rendered {
|
|
360
|
+
guard let modal = roots.last(where: { $0.kind == "sheet" || $0.kind == "alert" }), handlers[modal.id] != nil else {
|
|
361
|
+
throw _ScriptError(message: "dismiss: no sheet or alert is presented")
|
|
362
|
+
}
|
|
363
|
+
return modal
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/// The index `select:…:"Option"` names: a picker option or a tab title.
|
|
367
|
+
func optionIndex(_ option: String, of element: Rendered) throws(_ScriptError) -> Int {
|
|
368
|
+
let names: [String?]
|
|
369
|
+
if element.kind == "tabview" {
|
|
370
|
+
names = element.children.map { $0.string("title") }
|
|
371
|
+
} else if case .object(let fields) = element.props, case .array(let options)? = fields["options"] {
|
|
372
|
+
names = options.map { if case .string(let name) = $0 { name } else { nil } }
|
|
373
|
+
} else {
|
|
374
|
+
names = []
|
|
375
|
+
}
|
|
376
|
+
guard let index = names.firstIndex(of: option) else {
|
|
377
|
+
let known = names.compactMap { $0 }.map(_quoted).joined(separator: ", ")
|
|
378
|
+
throw _ScriptError(message: "\(element.kind) \(element.id) has no option \(_quoted(option)) (options: \(known))")
|
|
379
|
+
}
|
|
380
|
+
return index
|
|
381
|
+
}
|
|
382
|
+
}
|