@tamagui/web 3.0.0-beta.1133.1 → 3.0.0-beta.1141.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tamagui/web",
3
- "version": "3.0.0-beta.1133.1",
3
+ "version": "3.0.0-beta.1141.1",
4
4
  "license": "MIT",
5
5
  "author": {
6
6
  "name": "Nate Wienert"
@@ -100,24 +100,24 @@
100
100
  "test:web": "vitest --typecheck --run"
101
101
  },
102
102
  "dependencies": {
103
- "@tamagui/animation-helpers": "3.0.0-beta.1133.1",
104
- "@tamagui/compose-refs": "3.0.0-beta.1133.1",
105
- "@tamagui/constants": "3.0.0-beta.1133.1",
106
- "@tamagui/dom": "3.0.0-beta.1133.1",
107
- "@tamagui/helpers": "3.0.0-beta.1133.1",
108
- "@tamagui/is-equal-shallow": "3.0.0-beta.1133.1",
109
- "@tamagui/native": "3.0.0-beta.1133.1",
110
- "@tamagui/normalize-css-color": "3.0.0-beta.1133.1",
111
- "@tamagui/react-native-types": "3.0.0-beta.1133.1",
112
- "@tamagui/style-grammar": "3.0.0-beta.1133.1",
113
- "@tamagui/timer": "3.0.0-beta.1133.1",
114
- "@tamagui/types": "3.0.0-beta.1133.1",
115
- "@tamagui/use-did-finish-ssr": "3.0.0-beta.1133.1",
116
- "@tamagui/use-event": "3.0.0-beta.1133.1",
117
- "@tamagui/use-force-update": "3.0.0-beta.1133.1"
103
+ "@tamagui/animation-helpers": "3.0.0-beta.1141.1",
104
+ "@tamagui/compose-refs": "3.0.0-beta.1141.1",
105
+ "@tamagui/constants": "3.0.0-beta.1141.1",
106
+ "@tamagui/dom": "3.0.0-beta.1141.1",
107
+ "@tamagui/helpers": "3.0.0-beta.1141.1",
108
+ "@tamagui/is-equal-shallow": "3.0.0-beta.1141.1",
109
+ "@tamagui/native": "3.0.0-beta.1141.1",
110
+ "@tamagui/normalize-css-color": "3.0.0-beta.1141.1",
111
+ "@tamagui/react-native-types": "3.0.0-beta.1141.1",
112
+ "@tamagui/style-grammar": "3.0.0-beta.1141.1",
113
+ "@tamagui/timer": "3.0.0-beta.1141.1",
114
+ "@tamagui/types": "3.0.0-beta.1141.1",
115
+ "@tamagui/use-did-finish-ssr": "3.0.0-beta.1141.1",
116
+ "@tamagui/use-event": "3.0.0-beta.1141.1",
117
+ "@tamagui/use-force-update": "3.0.0-beta.1141.1"
118
118
  },
119
119
  "devDependencies": {
120
- "@tamagui/build": "3.0.0-beta.1133.1",
120
+ "@tamagui/build": "3.0.0-beta.1141.1",
121
121
  "@testing-library/react": "^16.1.0",
122
122
  "csstype": "^3.0.10",
123
123
  "react": "19.2.3",
@@ -757,15 +757,44 @@ function contributeProp(
757
757
  ? styleOriginalValues.get(style)
758
758
  : undefined
759
759
  for (const key in style) {
760
- if (style[key] == null) continue
760
+ const value = style[key]
761
+ if (value == null) continue
762
+ // the style prop is the inline style attribute, as in react: a plain
763
+ // value never becomes an atomic class, so element.style reads it back
764
+ // and it can change every frame without inserting a rule. a value that
765
+ // carries conditions can only exist as css, so those still compile
766
+ let inline = !styleState.styleProps.stylePieceEntries
761
767
  if (process.env.TAMAGUI_TARGET === 'web') {
762
768
  if (key === 'containerName') {
763
- pass[passContainerName] = style[key]
769
+ pass[passContainerName] = value
770
+ inline = false
764
771
  } else if (key === 'containerType') {
765
- pass[passContainerType] = style[key]
772
+ pass[passContainerType] = value
773
+ inline = false
766
774
  }
767
775
  }
768
- contributeValue(styleState, key, style[key], styleOriginals?.[key])
776
+ if (inline) {
777
+ if (typeof value === 'string') {
778
+ const [segments] = getConfigRevisionState(conf).parseFlatValue(value)
779
+ for (let index = 4; index < segments.length; index += 5) {
780
+ if (!(segments[index] & 1)) {
781
+ inline = false
782
+ break
783
+ }
784
+ }
785
+ } else if (
786
+ value &&
787
+ typeof value === 'object' &&
788
+ !Array.isArray(value) &&
789
+ !isVariable(value) &&
790
+ classifyConditionalObject(value, styleState) !== 0
791
+ ) {
792
+ inline = false
793
+ }
794
+ }
795
+ ;(styleState as DirectState).flatInlineStyleProp = inline
796
+ contributeValue(styleState, key, value, styleOriginals?.[key])
797
+ ;(styleState as DirectState).flatInlineStyleProp = false
769
798
  }
770
799
  }
771
800
  pass[passSourceLayer] = layerBeforeStyle
@@ -1926,6 +1955,16 @@ function writeCapturedStyleRecord(
1926
1955
  (entryFlags & (recordInline | recordCSS)) !==
1927
1956
  (flags & (recordInline | recordCSS))
1928
1957
  ) {
1958
+ // a piece landing after a plain style value replaces its inline record
1959
+ if (
1960
+ sourceLayer === sourceLayerStyle &&
1961
+ entry[7]! >> 5 === sourceLayerStyle &&
1962
+ entry[0] === source[0] &&
1963
+ !condition &&
1964
+ !entry[2]
1965
+ ) {
1966
+ list.splice(index--, 1)
1967
+ }
1929
1968
  continue
1930
1969
  }
1931
1970
  if (entry[0] !== source[0]) continue
@@ -2100,6 +2139,8 @@ type HOCClassNames = [
2100
2139
  ]
2101
2140
 
2102
2141
  type DirectState = GetStyleState & {
2142
+ // set while a plain style prop value contributes, so its record stays inline
2143
+ flatInlineStyleProp?: boolean
2103
2144
  flatValueScope?: ValueScopeCache
2104
2145
  flatConditions?: Map<string, Condition>
2105
2146
  flatConditionsClassed?: boolean
@@ -2224,7 +2265,12 @@ function writeStyleRecord(
2224
2265
  const identity = cursor ? cursor[conditionKey] : ''
2225
2266
  const direct = state as DirectState
2226
2267
  const slots = (direct.flatSlots ||= new Map())
2227
- const slot =
2268
+ const sourceLayer = direct.flatPass?.[passSourceLayer] || 0
2269
+ if (direct.flatInlineStyleProp) flags |= recordInline
2270
+ // css records share a slot per shorthand group so one class covers the
2271
+ // group; an inline record keeps its own property slot because the emitter
2272
+ // merges exactly one inline winner per slot
2273
+ const cssSlot =
2228
2274
  process.env.TAMAGUI_TARGET === 'web' &&
2229
2275
  canGenerateCSS &&
2230
2276
  (state.flatShouldDoClasses || flags & recordCSS)
@@ -2232,8 +2278,30 @@ function writeStyleRecord(
2232
2278
  : property.startsWith('transition')
2233
2279
  ? 'transition'
2234
2280
  : property
2281
+ const slot = flags & recordInline && cssSlot !== property ? property : cssSlot
2235
2282
  let list = slots.get(slot)
2236
2283
  if (!list) slots.set(slot, (list = []))
2284
+ // a style array is last-wins per property even across a piece (a class) and
2285
+ // a plain value (inline), which otherwise never meet
2286
+ if (sourceLayer === sourceLayerStyle && !condition) {
2287
+ const other =
2288
+ slot === cssSlot ? list : slots.get(flags & recordInline ? cssSlot : property)
2289
+ if (other) {
2290
+ for (let index = 0; index < other.length; index++) {
2291
+ const entry = other[index]
2292
+ const entryFlags = entry[7]!
2293
+ if (
2294
+ entry[0] === property &&
2295
+ !entry[2] &&
2296
+ entryFlags >> 5 === sourceLayerStyle &&
2297
+ (entryFlags & (recordInline | recordCSS)) !==
2298
+ (flags & (recordInline | recordCSS))
2299
+ ) {
2300
+ other.splice(index--, 1)
2301
+ }
2302
+ }
2303
+ }
2304
+ }
2237
2305
  for (let index = 0; index < list.length; index++) {
2238
2306
  const entry = list[index]
2239
2307
  const entryFlags = entry[7]!
@@ -2263,7 +2331,7 @@ function writeStyleRecord(
2263
2331
  cursor ? cursor[conditionSelector] : '',
2264
2332
  cursor ? cursor[conditionWrappers] : undefined,
2265
2333
  original,
2266
- flags | (((state as DirectState).flatPass?.[passSourceLayer] || 0) << 5),
2334
+ flags | (sourceLayer << 5),
2267
2335
  ])
2268
2336
  }
2269
2337
 
@@ -2526,7 +2594,8 @@ function configuredValue(
2526
2594
  state: GetStyleState,
2527
2595
  property: string,
2528
2596
  raw: string,
2529
- embedded = false
2597
+ embedded = false,
2598
+ nativeColors?: Map<string, unknown>
2530
2599
  ): any {
2531
2600
  const grammar = getConfigRevisionState(state.conf)
2532
2601
  let name = raw
@@ -2552,7 +2621,7 @@ function configuredValue(
2552
2621
  property === 'letterSpacing'
2553
2622
  const resolveValues = state.styleProps.resolveValues
2554
2623
  let byRaw: Map<string, any> | undefined
2555
- if (!fontProperty) {
2624
+ if (!fontProperty && !nativeColors) {
2556
2625
  const revision = grammar.revision
2557
2626
  if (state.conf !== valueCacheConf || revision !== valueCacheRevision) {
2558
2627
  valueCacheConf = state.conf
@@ -2746,7 +2815,7 @@ function configuredValue(
2746
2815
  out =
2747
2816
  resolveValues === 'except-theme' && fromTheme
2748
2817
  ? `${THEME_REF_PREFIX}${lookupName}${opacity !== undefined ? `/${opacity}` : ''}`
2749
- : resolveVariableValue(property, value, resolveValues)
2818
+ : resolveVariableValue(nativeColors ? 'color' : property, value, resolveValues)
2750
2819
  if (opacity !== undefined) {
2751
2820
  out =
2752
2821
  process.env.TAMAGUI_TARGET === 'web'
@@ -2754,13 +2823,20 @@ function configuredValue(
2754
2823
  : (normalizeColor(out, opacity / 100) ?? out)
2755
2824
  }
2756
2825
  }
2826
+ if (nativeColors && out && typeof out === 'object') {
2827
+ const reference = `__tamagui_native_color_${nativeColors.size}`
2828
+ nativeColors.set(reference, out)
2829
+ out = reference
2830
+ }
2757
2831
  if (embedded && out === raw) {
2758
2832
  const usedSafeArea = state.flatUsesSafeArea
2759
- out = grammar.embeddedTokens(raw, (word) => configuredValue(state, property, word))
2833
+ out = grammar.embeddedTokens(raw, (word) =>
2834
+ configuredValue(state, property, word, false, nativeColors)
2835
+ )
2760
2836
  // a safe-area token flips state as it resolves, so a cached hit would lose it
2761
2837
  if (!usedSafeArea && state.flatUsesSafeArea) return out
2762
2838
  }
2763
- if (!fontProperty && !fromTheme) {
2839
+ if (!fontProperty && !fromTheme && !nativeColors) {
2764
2840
  if (valueCacheEntries > 8192) {
2765
2841
  valueCaches = new WeakMap()
2766
2842
  valueCacheEntries = 0
@@ -3028,8 +3104,16 @@ function emitResolved(
3028
3104
  )
3029
3105
  }
3030
3106
 
3031
- function resolveValue(state: GetStyleState, property: string, raw: any) {
3032
- let value = typeof raw === 'string' ? configuredValue(state, property, raw, true) : raw
3107
+ function resolveValue(
3108
+ state: GetStyleState,
3109
+ property: string,
3110
+ raw: any,
3111
+ nativeColors?: Map<string, unknown>
3112
+ ) {
3113
+ let value =
3114
+ typeof raw === 'string'
3115
+ ? configuredValue(state, property, raw, true, nativeColors)
3116
+ : raw
3033
3117
  if (
3034
3118
  (process.env.TAMAGUI_TARGET === 'native' || !state.flatShouldDoClasses) &&
3035
3119
  typeof value === 'string' &&
@@ -3293,7 +3377,15 @@ function emitValue(
3293
3377
  return
3294
3378
  }
3295
3379
 
3296
- let value: any = resolveValue(state, property, raw)
3380
+ const nativeColors =
3381
+ process.env.TAMAGUI_TARGET === 'native' &&
3382
+ typeof raw === 'string' &&
3383
+ (property === 'backgroundImage' ||
3384
+ property === 'boxShadow' ||
3385
+ property === 'textShadow')
3386
+ ? new Map<string, unknown>()
3387
+ : undefined
3388
+ let value: any = resolveValue(state, property, raw, nativeColors)
3297
3389
  if (
3298
3390
  canGenerateCSS &&
3299
3391
  state.flatShouldDoClasses &&
@@ -3311,7 +3403,7 @@ function emitValue(
3311
3403
  property === 'boxShadow' ||
3312
3404
  property === 'textShadow')
3313
3405
  ) {
3314
- const parsed = parseNativeStyle(property, value)
3406
+ const parsed = parseNativeStyle(property, value, nativeColors)
3315
3407
  if (parsed) {
3316
3408
  if (property === 'textShadow') {
3317
3409
  for (const [key, parsedValue] of parsed) {
@@ -3756,6 +3848,7 @@ function contributeValue(
3756
3848
 
3757
3849
  function clearDirectStyle(state: GetStyleState, property: string) {
3758
3850
  const direct = state as DirectState
3851
+ if (direct.flatDynamicColors) delete direct.flatDynamicColors[property]
3759
3852
  if (process.env.TAMAGUI_TARGET === 'web') property = webStyleProperty(property)
3760
3853
  const propertyKind = getConfigRevisionState(state.conf).propertyKind(property)
3761
3854
  const atomicKey = property.startsWith('transition')
@@ -3770,15 +3863,20 @@ function clearDirectStyle(state: GetStyleState, property: string) {
3770
3863
  const slot = process.env.TAMAGUI_TARGET === 'web' ? styleSlot(atomicKey) : atomicKey
3771
3864
  direct.flatAtomics?.delete(slot)
3772
3865
  if (direct.flatSlots) {
3773
- if (slot !== atomicKey) {
3866
+ // a slot groups related properties under one atomic class. clearing a
3867
+ // longhand removes only its records, and so does clearing `flex`, which
3868
+ // shares its slot with flexDirection and flexWrap: <XStack flex={undefined} />
3869
+ // keeps the styled row
3870
+ if (slot !== atomicKey || atomicKey === 'flex') {
3774
3871
  const entries = direct.flatSlots.get(slot)
3775
3872
  if (entries) {
3776
3873
  for (let index = entries.length; index--; ) {
3777
3874
  if (entries[index][0] === atomicKey) entries.splice(index, 1)
3778
3875
  }
3876
+ if (!entries.length) direct.flatSlots.delete(slot)
3779
3877
  }
3780
3878
  }
3781
- direct.flatSlots.delete(atomicKey)
3879
+ if (atomicKey !== 'flex') direct.flatSlots.delete(atomicKey)
3782
3880
  }
3783
3881
  if (atomicKey === 'transform') state.transformAccumulator = undefined
3784
3882
  if (state.style) delete state.style[atomicKey]
@@ -1 +1 @@
1
- {"version":3,"file":"getSplitStyles.d.ts","sourceRoot":"","sources":["../../src/helpers/getSplitStyles.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EACV,gBAAgB,EAEhB,mBAAmB,EAEnB,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,aAAa,EAEb,eAAe,EACf,YAAY,EAGZ,qBAAqB,EACrB,qBAAqB,EAErB,WAAW,EAGZ,MAAM,UAAU,CAAA;AAkBjB,OAAO,EAAE,oBAAoB,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAKlF,OAAO,EAAE,oBAAoB,EAAE,CAAA;AAmB/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAe3D,OAAO,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AACvF,YAAY,EACV,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,mBAAmB,EAAE,CAAA;AAE9B,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAA;AAK3D,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAA;AAMhE,MAAM,MAAM,aAAa,GAAG,CAC1B,KAAK,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,EAC7B,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,qBAAqB,EACrC,UAAU,EAAE,eAAe,EAC3B,iBAAiB,CAAC,EAAE,cAAc,GAAG,IAAI,EACzC,OAAO,CAAC,EAAE,iBAAiB,EAC3B,YAAY,CAAC,EAAE,gBAAgB,GAAG,IAAI,EAEtC,WAAW,CAAC,EAAE,MAAM,EACpB,iBAAiB,CAAC,EAAE,OAAO,EAC3B,KAAK,CAAC,EAAE,SAAS,EAEjB,eAAe,CAAC,EAAE,mBAAmB,GAAG,IAAI,EAC5C,iBAAiB,CAAC,EAAE,iBAAiB,KAClC,IAAI,GAAG,cAAc,CAAA;AA4U1B,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAEhF;AA6nBD,eAAO,MAAM,cAAc,EAAE,aA0mB5B,CAAA;AAuWD,MAAM,MAAM,UAAU,GAAG,CACvB,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,GAAG,EACV,gBAAgB,CAAC,EAAE,OAAO,EAC1B,aAAa,CAAC,EAAE,GAAG,KAChB,IAAI,CAAA;AAyyCT,KAAK,oBAAoB,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,CAAA;AAgCnF,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,oBAAoB,GAAG,IAAI,EACjC,QAAQ,SAAI,EACZ,WAAW,UAAQ,WAyNpB;AAqHD,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,GAAG,EACV,QAAQ,EAAE,GAAG,EACb,SAAS,EAAE,OAAO,EAClB,QAAQ,EAAE,OAAO,QAsBlB;AAID,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,qBAAqB,sBAgBtF;AAMD,cAAc,mBAAmB,CAAA"}
1
+ {"version":3,"file":"getSplitStyles.d.ts","sourceRoot":"","sources":["../../src/helpers/getSplitStyles.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EACV,gBAAgB,EAEhB,mBAAmB,EAEnB,iBAAiB,EACjB,SAAS,EACT,cAAc,EACd,aAAa,EAEb,eAAe,EACf,YAAY,EAGZ,qBAAqB,EACrB,qBAAqB,EAErB,WAAW,EAGZ,MAAM,UAAU,CAAA;AAkBjB,OAAO,EAAE,oBAAoB,EAAE,KAAK,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AAKlF,OAAO,EAAE,oBAAoB,EAAE,CAAA;AAmB/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAe3D,OAAO,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AACvF,YAAY,EACV,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,mBAAmB,EAAE,CAAA;AAE9B,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAA;AAK3D,MAAM,MAAM,gBAAgB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAA;AAMhE,MAAM,MAAM,aAAa,GAAG,CAC1B,KAAK,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CAAE,EAC7B,YAAY,EAAE,YAAY,EAC1B,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,qBAAqB,EACrC,UAAU,EAAE,eAAe,EAC3B,iBAAiB,CAAC,EAAE,cAAc,GAAG,IAAI,EACzC,OAAO,CAAC,EAAE,iBAAiB,EAC3B,YAAY,CAAC,EAAE,gBAAgB,GAAG,IAAI,EAEtC,WAAW,CAAC,EAAE,MAAM,EACpB,iBAAiB,CAAC,EAAE,OAAO,EAC3B,KAAK,CAAC,EAAE,SAAS,EAEjB,eAAe,CAAC,EAAE,mBAAmB,GAAG,IAAI,EAC5C,iBAAiB,CAAC,EAAE,iBAAiB,KAClC,IAAI,GAAG,cAAc,CAAA;AA4U1B,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WAEhF;AA0pBD,eAAO,MAAM,cAAc,EAAE,aA0mB5B,CAAA;AAiXD,MAAM,MAAM,UAAU,GAAG,CACvB,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,GAAG,EACV,gBAAgB,CAAC,EAAE,OAAO,EAC1B,aAAa,CAAC,EAAE,GAAG,KAChB,IAAI,CAAA;AA81CT,KAAK,oBAAoB,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,CAAA;AAgCnF,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,OAAO,EACf,IAAI,EAAE,oBAAoB,GAAG,IAAI,EACjC,QAAQ,SAAI,EACZ,WAAW,UAAQ,WAyNpB;AA2HD,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,GAAG,EACV,QAAQ,EAAE,GAAG,EACb,SAAS,EAAE,OAAO,EAClB,QAAQ,EAAE,OAAO,QAsBlB;AAID,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,qBAAqB,sBAgBtF;AAMD,cAAc,mBAAmB,CAAA"}