diff options
Diffstat (limited to 'layout/generic')
-rw-r--r-- | layout/generic/BlockReflowInput.cpp | 2 | ||||
-rw-r--r-- | layout/generic/StickyScrollContainer.cpp | 10 | ||||
-rw-r--r-- | layout/generic/crashtests/crashtests.list | 2 | ||||
-rw-r--r-- | layout/generic/nsColumnSetFrame.cpp | 19 | ||||
-rw-r--r-- | layout/generic/nsFrame.cpp | 101 | ||||
-rw-r--r-- | layout/generic/nsFrame.h | 3 | ||||
-rw-r--r-- | layout/generic/nsGridContainerFrame.cpp | 851 | ||||
-rw-r--r-- | layout/generic/nsIFrame.h | 31 | ||||
-rw-r--r-- | layout/generic/nsInlineFrame.cpp | 55 | ||||
-rw-r--r-- | layout/generic/nsInlineFrame.h | 7 | ||||
-rw-r--r-- | layout/generic/nsTextFrame.cpp | 3 | ||||
-rw-r--r-- | layout/generic/test/mochitest.ini | 4 | ||||
-rw-r--r-- | layout/generic/test/test_grid_track_sizing_algo_001.html | 1641 | ||||
-rw-r--r-- | layout/generic/test/test_grid_track_sizing_algo_002.html | 1641 |
14 files changed, 3796 insertions, 574 deletions
diff --git a/layout/generic/BlockReflowInput.cpp b/layout/generic/BlockReflowInput.cpp index 10084fd8b..86248ac14 100644 --- a/layout/generic/BlockReflowInput.cpp +++ b/layout/generic/BlockReflowInput.cpp @@ -716,6 +716,8 @@ FloatMarginISize(const ReflowInput& aCBReflowInput, bool BlockReflowInput::FlowAndPlaceFloat(nsIFrame* aFloat) { + MOZ_ASSERT(aFloat->GetParent() == mBlock); + WritingMode wm = mReflowInput.GetWritingMode(); // Save away the Y coordinate before placing the float. We will // restore mBCoord at the end after placing the float. This is diff --git a/layout/generic/StickyScrollContainer.cpp b/layout/generic/StickyScrollContainer.cpp index ca68992c3..c5ed44e92 100644 --- a/layout/generic/StickyScrollContainer.cpp +++ b/layout/generic/StickyScrollContainer.cpp @@ -45,7 +45,7 @@ StickyScrollContainer::GetStickyScrollContainerForFrame(nsIFrame* aFrame) // <html style="position: fixed"> return nullptr; } - auto frame = static_cast<nsIFrame*>(do_QueryFrame(scrollFrame)); + nsIFrame* frame = do_QueryFrame(scrollFrame); StickyScrollContainer* s = frame->GetProperty(StickyScrollContainerProperty()); if (!s) { @@ -176,6 +176,14 @@ StickyScrollContainer::ComputeStickyLimits(nsIFrame* aFrame, nsRect* aStick, nsRect rect = nsLayoutUtils::GetAllInFlowRectsUnion(aFrame, aFrame->GetParent()); + // Note: Table row groups aren't supposed to be containing blocks, but we treat + // them as such anyway. + // Not having this basically disables position:sticky on table cells, which + // would be really unfortunate, and doesn't match what other browsers do. + if (cbFrame != scrolledFrame && cbFrame->GetType() == nsGkAtoms::tableRowGroupFrame) { + cbFrame = cbFrame->GetContainingBlock(); + } + // Containing block limits for the position of aFrame relative to its parent. // The margin box of the sticky element stays within the content box of the // contaning-block element. diff --git a/layout/generic/crashtests/crashtests.list b/layout/generic/crashtests/crashtests.list index e36a4742f..183556ab9 100644 --- a/layout/generic/crashtests/crashtests.list +++ b/layout/generic/crashtests/crashtests.list @@ -25,7 +25,7 @@ load 321224.xul load 322780-1.xul load 323381-1.html load 323381-2.html -asserts-if(gtkWidget,1) asserts-if(Android&&asyncPan,1) load 323386-1.html # Bug 718883 +asserts-if(gtkWidget,1) asserts-if(Android&&asyncPan,1) asserts-if(winWidget,1) load 323386-1.html # Bug 718883 load 323389-1.html load 323389-2.html load 323493-1.html diff --git a/layout/generic/nsColumnSetFrame.cpp b/layout/generic/nsColumnSetFrame.cpp index ad36ba1a8..6ea15d4d2 100644 --- a/layout/generic/nsColumnSetFrame.cpp +++ b/layout/generic/nsColumnSetFrame.cpp @@ -183,18 +183,15 @@ nsColumnSetFrame::GetAvailableContentBSize(const ReflowInput& aReflowInput) static nscoord GetColumnGap(nsColumnSetFrame* aFrame, - const nsStyleColumn* aColStyle) + const nsStyleColumn* aColStyle, + nscoord aPercentageBasis) { - if (eStyleUnit_Normal == aColStyle->mColumnGap.GetUnit()) + const auto& columnGap = aColStyle->mColumnGap; + if (columnGap.GetUnit() == eStyleUnit_Normal) { return aFrame->StyleFont()->mFont.size; - if (eStyleUnit_Coord == aColStyle->mColumnGap.GetUnit()) { - nscoord colGap = aColStyle->mColumnGap.GetCoordValue(); - NS_ASSERTION(colGap >= 0, "negative column gap"); - return colGap; } - NS_NOTREACHED("Unknown gap type"); - return 0; + return nsLayoutUtils::ResolveGapToLength(columnGap, aPercentageBasis); } nsColumnSetFrame::ReflowConfig @@ -227,7 +224,7 @@ nsColumnSetFrame::ChooseColumnStrategy(const ReflowInput& aReflowInput, colBSize = std::min(colBSize, aReflowInput.ComputedMaxBSize()); } - nscoord colGap = GetColumnGap(this, colStyle); + nscoord colGap = GetColumnGap(this, colStyle, aReflowInput.ComputedISize()); int32_t numColumns = colStyle->mColumnCount; // If column-fill is set to 'balance', then we want to balance the columns. @@ -403,7 +400,7 @@ nsColumnSetFrame::GetMinISize(nsRenderingContext *aRenderingContext) // include n-1 column gaps. colISize = iSize; iSize *= colStyle->mColumnCount; - nscoord colGap = GetColumnGap(this, colStyle); + nscoord colGap = GetColumnGap(this, colStyle, NS_UNCONSTRAINEDSIZE); iSize += colGap * (colStyle->mColumnCount - 1); // The multiplication above can make 'width' negative (integer overflow), // so use std::max to protect against that. @@ -424,7 +421,7 @@ nsColumnSetFrame::GetPrefISize(nsRenderingContext *aRenderingContext) nscoord result = 0; DISPLAY_PREF_WIDTH(this, result); const nsStyleColumn* colStyle = StyleColumn(); - nscoord colGap = GetColumnGap(this, colStyle); + nscoord colGap = GetColumnGap(this, colStyle, NS_UNCONSTRAINEDSIZE); nscoord colISize; if (colStyle->mColumnWidth.GetUnit() == eStyleUnit_Coord) { diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index bd96f213b..bbbb5c332 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -562,15 +562,12 @@ nsFrame::Init(nsIContent* aContent, } if (disp->mPosition == NS_STYLE_POSITION_STICKY && !aPrevInFlow && - !(mState & NS_FRAME_IS_NONDISPLAY) && - !disp->IsInnerTableStyle()) { + !(mState & NS_FRAME_IS_NONDISPLAY)) { // Note that we only add first continuations, but we really only // want to add first continuation-or-ib-split-siblings. But since we // don't yet know if we're a later part of a block-in-inline split, // we'll just add later members of a block-in-inline split here, and // then StickyScrollContainer will remove them later. - // We don't currently support relative positioning of inner table - // elements (bug 35168), so exclude them from sticky positioning too. StickyScrollContainer* ssc = StickyScrollContainer::GetStickyScrollContainerForFrame(this); if (ssc) { @@ -4515,68 +4512,44 @@ nsIFrame::InlinePrefISizeData::ForceBreak() mSkipWhitespace = true; } -static void -AddCoord(const nsStyleCoord& aStyle, - nsIFrame* aFrame, - nscoord* aCoord, float* aPercent, - bool aClampNegativeToZero) -{ - switch (aStyle.GetUnit()) { - case eStyleUnit_Coord: { - NS_ASSERTION(!aClampNegativeToZero || aStyle.GetCoordValue() >= 0, - "unexpected negative value"); - *aCoord += aStyle.GetCoordValue(); - return; - } - case eStyleUnit_Percent: { - NS_ASSERTION(!aClampNegativeToZero || aStyle.GetPercentValue() >= 0.0f, - "unexpected negative value"); - *aPercent += aStyle.GetPercentValue(); - return; - } - case eStyleUnit_Calc: { - const nsStyleCoord::Calc *calc = aStyle.GetCalcValue(); - if (aClampNegativeToZero) { - // This is far from ideal when one is negative and one is positive. - *aCoord += std::max(calc->mLength, 0); - *aPercent += std::max(calc->mPercent, 0.0f); - } else { - *aCoord += calc->mLength; - *aPercent += calc->mPercent; - } - return; - } - default: { - return; - } +static nscoord +ResolveMargin(const nsStyleCoord& aStyle, nscoord aPercentageBasis) +{ + if (aStyle.GetUnit() == eStyleUnit_Auto) { + return nscoord(0); } + return nsLayoutUtils::ResolveToLength<false>(aStyle, aPercentageBasis); +} + +static nscoord +ResolvePadding(const nsStyleCoord& aStyle, nscoord aPercentageBasis) +{ + return nsLayoutUtils::ResolveToLength<true>(aStyle, aPercentageBasis); } static nsIFrame::IntrinsicISizeOffsetData -IntrinsicSizeOffsets(nsIFrame* aFrame, bool aForISize) +IntrinsicSizeOffsets(nsIFrame* aFrame, nscoord aPercentageBasis, bool aForISize) { nsIFrame::IntrinsicISizeOffsetData result; WritingMode wm = aFrame->GetWritingMode(); - const nsStyleMargin* styleMargin = aFrame->StyleMargin(); + const auto& margin = aFrame->StyleMargin()->mMargin; bool verticalAxis = aForISize == wm.IsVertical(); - AddCoord(verticalAxis ? styleMargin->mMargin.GetTop() - : styleMargin->mMargin.GetLeft(), - aFrame, &result.hMargin, &result.hPctMargin, - false); - AddCoord(verticalAxis ? styleMargin->mMargin.GetBottom() - : styleMargin->mMargin.GetRight(), - aFrame, &result.hMargin, &result.hPctMargin, - false); - - const nsStylePadding* stylePadding = aFrame->StylePadding(); - AddCoord(verticalAxis ? stylePadding->mPadding.GetTop() - : stylePadding->mPadding.GetLeft(), - aFrame, &result.hPadding, &result.hPctPadding, - true); - AddCoord(verticalAxis ? stylePadding->mPadding.GetBottom() - : stylePadding->mPadding.GetRight(), - aFrame, &result.hPadding, &result.hPctPadding, - true); + if (verticalAxis) { + result.hMargin += ResolveMargin(margin.GetTop(), aPercentageBasis); + result.hMargin += ResolveMargin(margin.GetBottom(), aPercentageBasis); + } else { + result.hMargin += ResolveMargin(margin.GetLeft(), aPercentageBasis); + result.hMargin += ResolveMargin(margin.GetRight(), aPercentageBasis); + } + + const auto& padding = aFrame->StylePadding()->mPadding; + if (verticalAxis) { + result.hPadding += ResolvePadding(padding.GetTop(), aPercentageBasis); + result.hPadding += ResolvePadding(padding.GetBottom(), aPercentageBasis); + } else { + result.hPadding += ResolvePadding(padding.GetLeft(), aPercentageBasis); + result.hPadding += ResolvePadding(padding.GetRight(), aPercentageBasis); + } const nsStyleBorder* styleBorder = aFrame->StyleBorder(); if (verticalAxis) { @@ -4606,22 +4579,21 @@ IntrinsicSizeOffsets(nsIFrame* aFrame, bool aForISize) result.hPadding = presContext->DevPixelsToAppUnits(verticalAxis ? padding.TopBottom() : padding.LeftRight()); - result.hPctPadding = 0; } } return result; } /* virtual */ nsIFrame::IntrinsicISizeOffsetData -nsFrame::IntrinsicISizeOffsets() +nsFrame::IntrinsicISizeOffsets(nscoord aPercentageBasis) { - return IntrinsicSizeOffsets(this, true); + return IntrinsicSizeOffsets(this, aPercentageBasis, true); } nsIFrame::IntrinsicISizeOffsetData -nsIFrame::IntrinsicBSizeOffsets() +nsIFrame::IntrinsicBSizeOffsets(nscoord aPercentageBasis) { - return IntrinsicSizeOffsets(this, false); + return IntrinsicSizeOffsets(this, aPercentageBasis, false); } /* virtual */ IntrinsicSize @@ -6654,6 +6626,9 @@ GetNearestBlockContainer(nsIFrame* frame) // Since the parent of such a block is either a normal block or // another such pseudo, this shouldn't cause anything bad to happen. // Also the anonymous blocks inside table cells are not containing blocks. + // + // If we ever start skipping table row groups from being containing blocks, + // we need to remove the containing block assignment in StickyScrollContainer . while (frame->IsFrameOfType(nsIFrame::eLineParticipant) || frame->IsBlockWrapper() || // Table rows are not containing blocks either diff --git a/layout/generic/nsFrame.h b/layout/generic/nsFrame.h index af1c95ef2..439e39856 100644 --- a/layout/generic/nsFrame.h +++ b/layout/generic/nsFrame.h @@ -261,7 +261,8 @@ public: InlineMinISizeData *aData) override; virtual void AddInlinePrefISize(nsRenderingContext *aRenderingContext, InlinePrefISizeData *aData) override; - virtual IntrinsicISizeOffsetData IntrinsicISizeOffsets() override; + IntrinsicISizeOffsetData + IntrinsicISizeOffsets(nscoord aPercentageBasis = NS_UNCONSTRAINEDSIZE) override; virtual mozilla::IntrinsicSize GetIntrinsicSize() override; virtual nsSize GetIntrinsicRatio() override; diff --git a/layout/generic/nsGridContainerFrame.cpp b/layout/generic/nsGridContainerFrame.cpp index 3a2d5ad1d..959061e33 100644 --- a/layout/generic/nsGridContainerFrame.cpp +++ b/layout/generic/nsGridContainerFrame.cpp @@ -8,8 +8,8 @@ #include "nsGridContainerFrame.h" -#include <algorithm> // for std::stable_sort #include <limits> +#include <stdlib.h> // for div() #include "mozilla/CSSAlignUtils.h" #include "mozilla/dom/GridBinding.h" #include "mozilla/Function.h" @@ -127,43 +127,6 @@ ResolveToDefiniteSize(const nsStyleCoord& aCoord, nscoord aPercentBasis) nsRuleNode::ComputeCoordPercentCalc(aCoord, aPercentBasis)); } -static bool -GetPercentSizeParts(const nsStyleCoord& aCoord, nscoord* aLength, float* aPercent) -{ - switch (aCoord.GetUnit()) { - case eStyleUnit_Percent: - *aLength = 0; - *aPercent = aCoord.GetPercentValue(); - return true; - case eStyleUnit_Calc: { - nsStyleCoord::Calc* calc = aCoord.GetCalcValue(); - *aLength = calc->mLength; - *aPercent = calc->mPercent; - return true; - } - default: - return false; - } -} - -static void -ResolvePercentSizeParts(const nsStyleCoord& aCoord, nscoord aPercentBasis, - nscoord* aLength, float* aPercent) -{ - MOZ_ASSERT(aCoord.IsCoordPercentCalcUnit()); - if (aPercentBasis != NS_UNCONSTRAINEDSIZE) { - *aLength = std::max(nscoord(0), - nsRuleNode::ComputeCoordPercentCalc(aCoord, - aPercentBasis)); - *aPercent = 0.0f; - return; - } - if (!GetPercentSizeParts(aCoord, aLength, aPercent)) { - *aLength = aCoord.ToLength(); - *aPercent = 0.0f; - } -} - // Synthesize a baseline from a border box. For an alphabetical baseline // this is the end edge of the border box. For a central baseline it's // the center of the border box. @@ -198,7 +161,7 @@ struct nsGridContainerFrame::TrackSize eMaxContentMinSizing = 0x4, eMinOrMaxContentMinSizing = eMinContentMinSizing | eMaxContentMinSizing, eIntrinsicMinSizing = eMinOrMaxContentMinSizing | eAutoMinSizing, - // 0x8 is unused, feel free to take it! + eModified = 0x8, eAutoMaxSizing = 0x10, eMinContentMaxSizing = 0x20, eMaxContentMaxSizing = 0x40, @@ -211,6 +174,7 @@ struct nsGridContainerFrame::TrackSize eSkipGrowUnlimited = eSkipGrowUnlimited1 | eSkipGrowUnlimited2, eBreakBefore = 0x800, eFitContent = 0x1000, + eInfinitelyGrowable = 0x2000, }; StateBits Initialize(nscoord aPercentageBasis, @@ -724,9 +688,6 @@ struct nsGridContainerFrame::LineRange mEnd > mStart, "invalid line range"); mEnd -= aNumRemovedTracks[mEnd]; } - if (mStart == mEnd) { - mEnd = nsGridContainerFrame::kAutoLine; - } } /** * Return the contribution of this line range for step 2 in @@ -856,6 +817,8 @@ struct nsGridContainerFrame::GridItemInfo // Return true if we should apply Automatic Minimum Size to this item. // https://drafts.csswg.org/css-grid/#min-size-auto + // @note the caller should also check that the item spans at least one track + // that has a min track sizing function that is 'auto' before applying it. bool ShouldApplyAutoMinSize(WritingMode aContainerWM, LogicalAxis aContainerAxis, nscoord aPercentageBasis) const @@ -915,6 +878,12 @@ nsGridContainerFrame::GridItemInfo::Dump() const if (state & ItemState::eIsFlexing) { printf("flexing "); } + if (state & ItemState::eApplyAutoMinSize) { + printf("auto-min-size "); + } + if (state & ItemState::eClampMarginBoxMinSize) { + printf("clamp "); + } if (state & ItemState::eFirstBaseline) { printf("first baseline %s-alignment ", (state & ItemState::eSelfBaseline) ? "self" : "content"); @@ -1091,6 +1060,7 @@ private: const nsTArray<nsString>& mRepeatAutoLineNameListBefore; const nsTArray<nsString>& mRepeatAutoLineNameListAfter; // The index of the repeat(auto-fill/fit) track, or zero if there is none. + // Relative to mExplicitGridOffset (repeat tracks are explicit by definition). const uint32_t mRepeatAutoStart; // The (hypothetical) index of the last such repeat() track. const uint32_t mRepeatAutoEnd; @@ -1101,6 +1071,7 @@ private: // generates one track (making mRepeatEndDelta == 0). const uint32_t mTemplateLinesEnd; // True if there is a specified repeat(auto-fill/fit) track. + // Indexed relative to mExplicitGridOffset + mRepeatAutoStart. const bool mHasRepeatAuto; }; @@ -1164,7 +1135,7 @@ struct nsGridContainerFrame::TrackSizingFunctions return 1; } nscoord repeatTrackSize = 0; - // Note that the repeat() track size is included in |sum| in this loop. + // Note that one repeat() track size is included in |sum| in this loop. nscoord sum = 0; const nscoord percentBasis = aSize; for (uint32_t i = 0; i < numTracks; ++i) { @@ -1181,54 +1152,31 @@ struct nsGridContainerFrame::TrackSizingFunctions } nscoord trackSize = ::ResolveToDefiniteSize(*coord, percentBasis); if (i == mRepeatAutoStart) { - if (percentBasis != NS_UNCONSTRAINEDSIZE) { - // Use a minimum 1px for the repeat() track-size. - if (trackSize < AppUnitsPerCSSPixel()) { - trackSize = AppUnitsPerCSSPixel(); - } + // Use a minimum 1px for the repeat() track-size. + if (trackSize < AppUnitsPerCSSPixel()) { + trackSize = AppUnitsPerCSSPixel(); } repeatTrackSize = trackSize; } sum += trackSize; } - nscoord gridGap; - float percentSum = 0.0f; - float gridGapPercent; - ResolvePercentSizeParts(aGridGap, percentBasis, &gridGap, &gridGapPercent); + nscoord gridGap = nsLayoutUtils::ResolveGapToLength(aGridGap, aSize); if (numTracks > 1) { // Add grid-gaps for all the tracks including the repeat() track. sum += gridGap * (numTracks - 1); - percentSum = gridGapPercent * (numTracks - 1); } // Calculate the max number of tracks that fits without overflow. nscoord available = maxFill != NS_UNCONSTRAINEDSIZE ? maxFill : aMinSize; - nscoord size = nsLayoutUtils::AddPercents(sum, percentSum); - if (available - size < 0) { + nscoord spaceToFill = available - sum; + if (spaceToFill <= 0) { // "if any number of repetitions would overflow, then 1 repetition" return 1; } - uint32_t numRepeatTracks = 1; - bool exactFit = false; - while (true) { - sum += gridGap + repeatTrackSize; - percentSum += gridGapPercent; - nscoord newSize = nsLayoutUtils::AddPercents(sum, percentSum); - if (newSize <= size) { - // Adding more repeat-tracks won't make forward progress. - return numRepeatTracks; - } - size = newSize; - nscoord remaining = available - size; - exactFit = remaining == 0; - if (remaining >= 0) { - ++numRepeatTracks; - } - if (remaining <= 0) { - break; - } - } - - if (!exactFit && maxFill == NS_UNCONSTRAINEDSIZE) { + // Calculate the max number of tracks that fits without overflow. + div_t q = div(spaceToFill, repeatTrackSize + gridGap); + // The +1 here is for the one repeat track we already accounted for above. + uint32_t numRepeatTracks = q.quot + 1; + if (q.rem != 0 && maxFill == NS_UNCONSTRAINEDSIZE) { // "Otherwise, if the grid container has a definite min size in // the relevant axis, the number of repetitions is the largest possible // positive integer that fulfills that minimum requirement." @@ -1340,15 +1288,9 @@ struct nsGridContainerFrame::Tracks nscoord aContentBoxSize); /** - * Return true if aRange spans at least one track with an intrinsic sizing - * function and does not span any tracks with a <flex> max-sizing function. - * @param aRange the span of tracks to check - * @param aState will be set to the union of the state bits of all the spanned - * tracks, unless a flex track is found - then it only contains - * the union of the tracks up to and including the flex track. + * Return the union of the state bits for the tracks in aRange. */ - bool HasIntrinsicButNoFlexSizingInRange(const LineRange& aRange, - TrackSize::StateBits* aState) const; + TrackSize::StateBits StateBitsForRange(const LineRange& aRange) const; // Some data we collect for aligning baseline-aligned items. struct ItemBaselineData @@ -1383,6 +1325,62 @@ struct nsGridContainerFrame::Tracks */ void AlignBaselineSubtree(const GridItemInfo& aGridItem) const; + enum class TrackSizingPhase + { + eIntrinsicMinimums, + eContentBasedMinimums, + eMaxContentMinimums, + eIntrinsicMaximums, + eMaxContentMaximums, + }; + + // Some data we collect on each item for Step 2 of the Track Sizing Algorithm + // in ResolveIntrinsicSize below. + struct Step2ItemData final + { + uint32_t mSpan; + TrackSize::StateBits mState; + LineRange mLineRange; + nscoord mMinSize; + nscoord mMinContentContribution; + nscoord mMaxContentContribution; + nsIFrame* mFrame; + static bool IsSpanLessThan(const Step2ItemData& a, const Step2ItemData& b) + { + return a.mSpan < b.mSpan; + } + + template<TrackSizingPhase phase> + nscoord SizeContributionForPhase() const + { + switch (phase) { + case TrackSizingPhase::eIntrinsicMinimums: + case TrackSizingPhase::eIntrinsicMaximums: + return mMinSize; + case TrackSizingPhase::eContentBasedMinimums: + return mMinContentContribution; + case TrackSizingPhase::eMaxContentMinimums: + case TrackSizingPhase::eMaxContentMaximums: + return mMaxContentContribution; + } + MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE("Unexpected phase"); + } + }; + + using FitContentClamper = + function<bool(uint32_t aTrack, nscoord aMinSize, nscoord* aSize)>; + + // Helper method for ResolveIntrinsicSize. + template<TrackSizingPhase phase> + bool GrowSizeForSpanningItems(nsTArray<Step2ItemData>::iterator aIter, + const nsTArray<Step2ItemData>::iterator aEnd, + nsTArray<uint32_t>& aTracks, + nsTArray<TrackSize>& aPlan, + nsTArray<TrackSize>& aItemPlan, + TrackSize::StateBits aSelector, + const FitContentClamper& aClamper = nullptr, + bool aNeedInfinitelyGrowableFlag = false); + /** * Resolve Intrinsic Track Sizes. * http://dev.w3.org/csswg/css-grid/#algo-content @@ -1405,66 +1403,117 @@ struct nsGridContainerFrame::Tracks SizingConstraint aConstraint, const LineRange& aRange, const GridItemInfo& aGridItem); + + // Helper method that returns the track size to use in §11.5.1.2 + // https://drafts.csswg.org/css-grid/#extra-space + template<TrackSizingPhase phase> static + nscoord StartSizeInDistribution(const TrackSize& aSize) + { + switch (phase) { + case TrackSizingPhase::eIntrinsicMinimums: + case TrackSizingPhase::eContentBasedMinimums: + case TrackSizingPhase::eMaxContentMinimums: + return aSize.mBase; + case TrackSizingPhase::eIntrinsicMaximums: + case TrackSizingPhase::eMaxContentMaximums: + if (aSize.mLimit == NS_UNCONSTRAINEDSIZE) { + return aSize.mBase; + } + return aSize.mLimit; + } + MOZ_MAKE_COMPILER_ASSUME_IS_UNREACHABLE("Unexpected phase"); + } + /** * Collect the tracks which are growable (matching aSelector) into * aGrowableTracks, and return the amount of space that can be used - * to grow those tracks. Specifically, we return aAvailableSpace minus - * the sum of mBase's (and corresponding grid gaps) in aPlan (clamped to 0) - * for the tracks in aRange, or zero when there are no growable tracks. - * @note aPlan[*].mBase represents a planned new base or limit. + * to grow those tracks. This method implements CSS Grid §11.5.1.2. + * https://drafts.csswg.org/css-grid/#extra-space */ - nscoord CollectGrowable(nscoord aAvailableSpace, - const nsTArray<TrackSize>& aPlan, - const LineRange& aRange, - TrackSize::StateBits aSelector, - nsTArray<uint32_t>& aGrowableTracks) const + template<TrackSizingPhase phase> + nscoord CollectGrowable(nscoord aAvailableSpace, + const LineRange& aRange, + TrackSize::StateBits aSelector, + nsTArray<uint32_t>& aGrowableTracks) const { MOZ_ASSERT(aAvailableSpace > 0, "why call me?"); nscoord space = aAvailableSpace - mGridGap * (aRange.Extent() - 1); const uint32_t start = aRange.mStart; const uint32_t end = aRange.mEnd; for (uint32_t i = start; i < end; ++i) { - const TrackSize& sz = aPlan[i]; - space -= sz.mBase; + const TrackSize& sz = mSizes[i]; + space -= StartSizeInDistribution<phase>(sz); if (space <= 0) { return 0; } - if ((sz.mState & aSelector) && !sz.IsFrozen()) { + if (sz.mState & aSelector) { aGrowableTracks.AppendElement(i); } } return aGrowableTracks.IsEmpty() ? 0 : space; } - void SetupGrowthPlan(nsTArray<TrackSize>& aPlan, - const nsTArray<uint32_t>& aTracks) const + template<TrackSizingPhase phase> + void InitializeItemPlan(nsTArray<TrackSize>& aItemPlan, + const nsTArray<uint32_t>& aTracks) const { for (uint32_t track : aTracks) { - aPlan[track] = mSizes[track]; + auto& plan = aItemPlan[track]; + const TrackSize& sz = mSizes[track]; + plan.mBase = StartSizeInDistribution<phase>(sz); + bool unlimited = sz.mState & TrackSize::eInfinitelyGrowable; + plan.mLimit = unlimited ? NS_UNCONSTRAINEDSIZE : sz.mLimit; + plan.mState = sz.mState; } } - void CopyPlanToBase(const nsTArray<TrackSize>& aPlan, - const nsTArray<uint32_t>& aTracks) + template<TrackSizingPhase phase> + void InitializePlan(nsTArray<TrackSize>& aPlan) const { - for (uint32_t track : aTracks) { - MOZ_ASSERT(mSizes[track].mBase <= aPlan[track].mBase); - mSizes[track].mBase = aPlan[track].mBase; + for (size_t i = 0, len = aPlan.Length(); i < len; ++i) { + auto& plan = aPlan[i]; + const auto& sz = mSizes[i]; + plan.mBase = StartSizeInDistribution<phase>(sz); + MOZ_ASSERT(phase == TrackSizingPhase::eMaxContentMaximums || + !(sz.mState & TrackSize::eInfinitelyGrowable), + "forgot to reset the eInfinitelyGrowable bit?"); + plan.mState = sz.mState; } } - void CopyPlanToLimit(const nsTArray<TrackSize>& aPlan, - const nsTArray<uint32_t>& aTracks) + template<TrackSizingPhase phase> + void CopyPlanToSize(const nsTArray<TrackSize>& aPlan, + bool aNeedInfinitelyGrowableFlag = false) { - for (uint32_t track : aTracks) { - MOZ_ASSERT(mSizes[track].mLimit == NS_UNCONSTRAINEDSIZE || - mSizes[track].mLimit <= aPlan[track].mBase); - mSizes[track].mLimit = aPlan[track].mBase; + for (size_t i = 0, len = mSizes.Length(); i < len; ++i) { + const auto& plan = aPlan[i]; + MOZ_ASSERT(plan.mBase >= 0); + auto& sz = mSizes[i]; + switch (phase) { + case TrackSizingPhase::eIntrinsicMinimums: + case TrackSizingPhase::eContentBasedMinimums: + case TrackSizingPhase::eMaxContentMinimums: + sz.mBase = plan.mBase; + break; + case TrackSizingPhase::eIntrinsicMaximums: + if (plan.mState & TrackSize::eModified) { + if (sz.mLimit == NS_UNCONSTRAINEDSIZE && + aNeedInfinitelyGrowableFlag) { + sz.mState |= TrackSize::eInfinitelyGrowable; + } + sz.mLimit = plan.mBase; + } + break; + case TrackSizingPhase::eMaxContentMaximums: + if (plan.mState & TrackSize::eModified) { + sz.mLimit = plan.mBase; + } + sz.mState &= ~TrackSize::eInfinitelyGrowable; + break; + } } } - using FitContentClamper = - function<bool(uint32_t aTrack, nscoord aMinSize, nscoord* aSize)>; /** * Grow the planned size for tracks in aGrowableTracks up to their limit * and then freeze them (all aGrowableTracks must be unfrozen on entry). @@ -1524,12 +1573,13 @@ struct nsGridContainerFrame::Tracks * assumed that aPlan have no aSkipFlag set for tracks in aGrowableTracks * on entry to this method. */ - uint32_t MarkExcludedTracks(nsTArray<TrackSize>& aPlan, - uint32_t aNumGrowable, - const nsTArray<uint32_t>& aGrowableTracks, - TrackSize::StateBits aMinSizingSelector, - TrackSize::StateBits aMaxSizingSelector, - TrackSize::StateBits aSkipFlag) const + static uint32_t + MarkExcludedTracks(nsTArray<TrackSize>& aPlan, + uint32_t aNumGrowable, + const nsTArray<uint32_t>& aGrowableTracks, + TrackSize::StateBits aMinSizingSelector, + TrackSize::StateBits aMaxSizingSelector, + TrackSize::StateBits aSkipFlag) { bool foundOneSelected = false; bool foundOneGrowable = false; @@ -1559,41 +1609,60 @@ struct nsGridContainerFrame::Tracks } /** - * Increase the planned size for tracks in aGrowableTracks that match - * aSelector (or all tracks if aSelector is zero) beyond their limit. + * Mark all tracks in aGrowableTracks with an eSkipGrowUnlimited bit if + * they *shouldn't* grow unlimited in §11.5.1.2.3 "Distribute space beyond + * growth limits" https://drafts.csswg.org/css-grid/#extra-space + * Return the number of tracks that are still growable. + */ + template<TrackSizingPhase phase> + static uint32_t + MarkExcludedTracks(nsTArray<TrackSize>& aPlan, + const nsTArray<uint32_t>& aGrowableTracks, + TrackSize::StateBits aSelector) + { + uint32_t numGrowable = aGrowableTracks.Length(); + if (phase == TrackSizingPhase::eIntrinsicMaximums || + phase == TrackSizingPhase::eMaxContentMaximums) { + // "when handling any intrinsic growth limit: all affected tracks" + return numGrowable; + } + MOZ_ASSERT(aSelector == (aSelector & TrackSize::eIntrinsicMinSizing) && + (aSelector & TrackSize::eMaxContentMinSizing), + "Should only get here for track sizing steps 2.1 to 2.3"); + // Note that eMaxContentMinSizing is always included. We do those first: + numGrowable = MarkExcludedTracks(aPlan, numGrowable, aGrowableTracks, + TrackSize::eMaxContentMinSizing, + TrackSize::eMaxContentMaxSizing, + TrackSize::eSkipGrowUnlimited1); + // Now mark min-content/auto min-sizing tracks if requested. + auto minOrAutoSelector = aSelector & ~TrackSize::eMaxContentMinSizing; + if (minOrAutoSelector) { + numGrowable = MarkExcludedTracks(aPlan, numGrowable, aGrowableTracks, + minOrAutoSelector, + TrackSize::eIntrinsicMaxSizing, + TrackSize::eSkipGrowUnlimited2); + } + return numGrowable; + } + + /** + * Increase the planned size for tracks in aGrowableTracks that aren't + * marked with a eSkipGrowUnlimited flag beyond their limit. * This implements the "Distribute space beyond growth limits" step in * https://drafts.csswg.org/css-grid/#distribute-extra-space */ void GrowSelectedTracksUnlimited(nscoord aAvailableSpace, nsTArray<TrackSize>& aPlan, const nsTArray<uint32_t>& aGrowableTracks, - TrackSize::StateBits aSelector, + uint32_t aNumGrowable, FitContentClamper aFitContentClamper) const { - MOZ_ASSERT(aAvailableSpace > 0 && aGrowableTracks.Length() > 0); - uint32_t numGrowable = aGrowableTracks.Length(); - if (aSelector) { - MOZ_ASSERT(aSelector == (aSelector & TrackSize::eIntrinsicMinSizing) && - (aSelector & TrackSize::eMaxContentMinSizing), - "Should only get here for track sizing steps 2.1 to 2.3"); - // Note that eMaxContentMinSizing is always included. We do those first: - numGrowable = MarkExcludedTracks(aPlan, numGrowable, aGrowableTracks, - TrackSize::eMaxContentMinSizing, - TrackSize::eMaxContentMaxSizing, - TrackSize::eSkipGrowUnlimited1); - // Now mark min-content/auto min-sizing tracks if requested. - auto minOrAutoSelector = aSelector & ~TrackSize::eMaxContentMinSizing; - if (minOrAutoSelector) { - numGrowable = MarkExcludedTracks(aPlan, numGrowable, aGrowableTracks, - minOrAutoSelector, - TrackSize::eIntrinsicMaxSizing, - TrackSize::eSkipGrowUnlimited2); - } - } + MOZ_ASSERT(aAvailableSpace > 0 && aGrowableTracks.Length() > 0 && + aNumGrowable <= aGrowableTracks.Length()); nscoord space = aAvailableSpace; DebugOnly<bool> didClamp = false; - while (numGrowable) { - nscoord spacePerTrack = std::max<nscoord>(space / numGrowable, 1); + while (aNumGrowable) { + nscoord spacePerTrack = std::max<nscoord>(space / aNumGrowable, 1); for (uint32_t track : aGrowableTracks) { TrackSize& sz = aPlan[track]; if (sz.mState & TrackSize::eSkipGrowUnlimited) { @@ -1609,7 +1678,7 @@ struct nsGridContainerFrame::Tracks delta = newBase - sz.mBase; MOZ_ASSERT(delta >= 0, "track size shouldn't shrink"); sz.mState |= TrackSize::eSkipGrowUnlimited1; - --numGrowable; + --aNumGrowable; } } sz.mBase = newBase; @@ -1628,46 +1697,30 @@ struct nsGridContainerFrame::Tracks * Distribute aAvailableSpace to the planned base size for aGrowableTracks * up to their limits, then distribute the remaining space beyond the limits. */ - void DistributeToTrackBases(nscoord aAvailableSpace, + template<TrackSizingPhase phase> + void DistributeToTrackSizes(nscoord aAvailableSpace, nsTArray<TrackSize>& aPlan, + nsTArray<TrackSize>& aItemPlan, nsTArray<uint32_t>& aGrowableTracks, - TrackSize::StateBits aSelector) + TrackSize::StateBits aSelector, + const FitContentClamper& aFitContentClamper) { - SetupGrowthPlan(aPlan, aGrowableTracks); - nscoord space = GrowTracksToLimit(aAvailableSpace, aPlan, aGrowableTracks, nullptr); + InitializeItemPlan<phase>(aItemPlan, aGrowableTracks); + nscoord space = GrowTracksToLimit(aAvailableSpace, aItemPlan, aGrowableTracks, + aFitContentClamper); if (space > 0) { - GrowSelectedTracksUnlimited(space, aPlan, aGrowableTracks, aSelector, nullptr); + uint32_t numGrowable = + MarkExcludedTracks<phase>(aItemPlan, aGrowableTracks, aSelector); + GrowSelectedTracksUnlimited(space, aItemPlan, aGrowableTracks, + numGrowable, aFitContentClamper); } - CopyPlanToBase(aPlan, aGrowableTracks); - } - - /** - * Distribute aAvailableSpace to the planned limits for aGrowableTracks. - */ - void DistributeToTrackLimits(nscoord aAvailableSpace, - nsTArray<TrackSize>& aPlan, - nsTArray<uint32_t>& aGrowableTracks, - const TrackSizingFunctions& aFunctions, - nscoord aPercentageBasis) - { - auto fitContentClamper = [&aFunctions, aPercentageBasis] (uint32_t aTrack, - nscoord aMinSize, - nscoord* aSize) { - nscoord fitContentLimit = - ::ResolveToDefiniteSize(aFunctions.MaxSizingFor(aTrack), aPercentageBasis); - if (*aSize > fitContentLimit) { - *aSize = std::max(aMinSize, fitContentLimit); - return true; + for (uint32_t track : aGrowableTracks) { + nscoord& plannedSize = aPlan[track].mBase; + nscoord itemIncurredSize = aItemPlan[track].mBase; + if (plannedSize < itemIncurredSize) { + plannedSize = itemIncurredSize; } - return false; - }; - nscoord space = GrowTracksToLimit(aAvailableSpace, aPlan, aGrowableTracks, - fitContentClamper); - if (space > 0) { - GrowSelectedTracksUnlimited(aAvailableSpace, aPlan, aGrowableTracks, - TrackSize::StateBits(0), fitContentClamper); } - CopyPlanToLimit(aPlan, aGrowableTracks); } /** @@ -1769,13 +1822,6 @@ struct nsGridContainerFrame::Tracks WritingMode aWM, const LogicalSize& aContainerSize); - /** - * Return the intrinsic size by back-computing percentages as: - * IntrinsicSize = SumOfCoordSizes / (1 - SumOfPercentages). - */ - nscoord BackComputedIntrinsicSize(const TrackSizingFunctions& aFunctions, - const nsStyleCoord& aGridGap) const; - nscoord GridLineEdge(uint32_t aLine, GridLineSide aSide) const { if (MOZ_UNLIKELY(mSizes.IsEmpty())) { @@ -2085,11 +2131,10 @@ struct MOZ_STACK_CLASS nsGridContainerFrame::GridReflowInput } /** - * Calculate our track sizes. If the given aContentBox block-axis size is - * unconstrained, it is assigned to the resulting intrinsic block-axis size. + * Calculate our track sizes. */ void CalculateTrackSizes(const Grid& aGrid, - LogicalSize& aContentBox, + const LogicalSize& aContentBox, SizingConstraint aConstraint); /** @@ -2575,7 +2620,7 @@ struct MOZ_STACK_CLASS nsGridContainerFrame::Grid void nsGridContainerFrame::GridReflowInput::CalculateTrackSizes( const Grid& aGrid, - LogicalSize& aContentBox, + const LogicalSize& aContentBox, SizingConstraint aConstraint) { mCols.Initialize(mColFunctions, mGridStyle->mGridColumnGap, @@ -2593,12 +2638,6 @@ nsGridContainerFrame::GridReflowInput::CalculateTrackSizes( mRows.CalculateSizes(*this, mGridItems, mRowFunctions, aContentBox.BSize(mWM), &GridArea::mRows, aConstraint); - if (aContentBox.BSize(mWM) == NS_AUTOHEIGHT) { - aContentBox.BSize(mWM) = - mRows.BackComputedIntrinsicSize(mRowFunctions, mGridStyle->mGridRowGap); - mRows.mGridGap = - ::ResolveToDefiniteSize(mGridStyle->mGridRowGap, aContentBox.BSize(mWM)); - } } /** @@ -3545,19 +3584,27 @@ nsGridContainerFrame::Grid::PlaceGridItems(GridReflowInput& aState, // Count empty 'auto-fit' tracks in the repeat() range. // |colAdjust| will have a count for each line in the grid of how many // tracks were empty between the start of the grid and that line. + + // Since this loop is concerned with just the repeat tracks, we + // iterate from 0..NumRepeatTracks() which is the natural range of + // mRemoveRepeatTracks. This means we have to add + // (mExplicitGridOffset + mRepeatAutoStart) to get a zero-based + // index for arrays like mCellMap and colAdjust. We'll then fill out + // the colAdjust array for all the remaining lines. Maybe<nsTArray<uint32_t>> colAdjust; uint32_t numEmptyCols = 0; if (aState.mColFunctions.mHasRepeatAuto && !gridStyle->mGridTemplateColumns.mIsAutoFill && aState.mColFunctions.NumRepeatTracks() > 0) { - for (uint32_t col = aState.mColFunctions.mRepeatAutoStart, - endRepeat = aState.mColFunctions.mRepeatAutoEnd, - numColLines = mGridColEnd + 1; - col < numColLines; ++col) { + const uint32_t repeatStart = (aState.mColFunctions.mExplicitGridOffset + + aState.mColFunctions.mRepeatAutoStart); + const uint32_t numRepeats = aState.mColFunctions.NumRepeatTracks(); + const uint32_t numColLines = mGridColEnd + 1; + for (uint32_t i = 0; i < numRepeats; ++i) { if (numEmptyCols) { - (*colAdjust)[col] = numEmptyCols; + (*colAdjust)[repeatStart + i] = numEmptyCols; } - if (col < endRepeat && mCellMap.IsEmptyCol(col)) { + if (mCellMap.IsEmptyCol(repeatStart + i)) { ++numEmptyCols; if (colAdjust.isNothing()) { colAdjust.emplace(numColLines); @@ -3565,26 +3612,34 @@ nsGridContainerFrame::Grid::PlaceGridItems(GridReflowInput& aState, PodZero(colAdjust->Elements(), colAdjust->Length()); } - uint32_t repeatIndex = col - aState.mColFunctions.mRepeatAutoStart; - MOZ_ASSERT(aState.mColFunctions.mRemovedRepeatTracks.Length() > - repeatIndex); - aState.mColFunctions.mRemovedRepeatTracks[repeatIndex] = true; + aState.mColFunctions.mRemovedRepeatTracks[i] = true; + } + } + // Fill out the colAdjust array for all the columns after the + // repeats. + if (numEmptyCols) { + for (uint32_t col = repeatStart + numRepeats; + col < numColLines; ++col) { + (*colAdjust)[col] = numEmptyCols; } } } + + // Do similar work for the row tracks, with the same logic. Maybe<nsTArray<uint32_t>> rowAdjust; uint32_t numEmptyRows = 0; if (aState.mRowFunctions.mHasRepeatAuto && !gridStyle->mGridTemplateRows.mIsAutoFill && aState.mRowFunctions.NumRepeatTracks() > 0) { - for (uint32_t row = aState.mRowFunctions.mRepeatAutoStart, - endRepeat = aState.mRowFunctions.mRepeatAutoEnd, - numRowLines = mGridRowEnd + 1; - row < numRowLines; ++row) { + const uint32_t repeatStart = (aState.mRowFunctions.mExplicitGridOffset + + aState.mRowFunctions.mRepeatAutoStart); + const uint32_t numRepeats = aState.mRowFunctions.NumRepeatTracks(); + const uint32_t numRowLines = mGridRowEnd + 1; + for (uint32_t i = 0; i < numRepeats; ++i) { if (numEmptyRows) { - (*rowAdjust)[row] = numEmptyRows; + (*rowAdjust)[repeatStart + i] = numEmptyRows; } - if (row < endRepeat && mCellMap.IsEmptyRow(row)) { + if (mCellMap.IsEmptyRow(repeatStart + i)) { ++numEmptyRows; if (rowAdjust.isNothing()) { rowAdjust.emplace(numRowLines); @@ -3592,10 +3647,13 @@ nsGridContainerFrame::Grid::PlaceGridItems(GridReflowInput& aState, PodZero(rowAdjust->Elements(), rowAdjust->Length()); } - uint32_t repeatIndex = row - aState.mRowFunctions.mRepeatAutoStart; - MOZ_ASSERT(aState.mRowFunctions.mRemovedRepeatTracks.Length() > - repeatIndex); - aState.mRowFunctions.mRemovedRepeatTracks[repeatIndex] = true; + aState.mRowFunctions.mRemovedRepeatTracks[i] = true; + } + } + if (numEmptyRows) { + for (uint32_t row = repeatStart + numRepeats; + row < numRowLines; ++row) { + (*rowAdjust)[row] = numEmptyRows; } } } @@ -3681,7 +3739,7 @@ nsGridContainerFrame::Tracks::Initialize( aFunctions.MinSizingFor(i), aFunctions.MaxSizingFor(i)); } - mGridGap = ::ResolveToDefiniteSize(aGridGap, aContentBoxSize); + mGridGap = nsLayoutUtils::ResolveGapToLength(aGridGap, aContentBoxSize); mContentBoxSize = aContentBoxSize; } @@ -3762,8 +3820,7 @@ ContentContribution(const GridItemInfo& aGridItem, PhysicalAxis axis(aCBWM.PhysicalAxis(aAxis)); nscoord size = nsLayoutUtils::IntrinsicForAxis(axis, aRC, child, aConstraint, aPercentageBasis, - aFlags | nsLayoutUtils::BAIL_IF_REFLOW_NEEDED | - nsLayoutUtils::ADD_PERCENTS, + aFlags | nsLayoutUtils::BAIL_IF_REFLOW_NEEDED, aMinSizeClamp); if (size == NS_INTRINSIC_WIDTH_UNKNOWN) { // We need to reflow the child to find its BSize contribution. @@ -3800,15 +3857,7 @@ ContentContribution(const GridItemInfo& aGridItem, LogicalSize availableSize(childWM, availISize, availBSize); size = ::MeasuringReflow(child, aState.mReflowInput, aRC, availableSize, cbSize, iMinSizeClamp, bMinSizeClamp); - nsIFrame::IntrinsicISizeOffsetData offsets = child->IntrinsicBSizeOffsets(); - size += offsets.hMargin; - auto percent = offsets.hPctMargin; - if (availBSize == NS_UNCONSTRAINEDSIZE) { - // We always want to add in percent padding too, unless we already did so - // using a resolved column size above. - percent += offsets.hPctPadding; - } - size = nsLayoutUtils::AddPercents(size, percent); + size += child->GetLogicalUsedMargin(childWM).BStartEnd(childWM); nscoord overflow = size - aMinSizeClamp; if (MOZ_UNLIKELY(overflow > 0)) { nscoord contentSize = child->ContentBSize(childWM); @@ -3913,6 +3962,10 @@ MinSize(const GridItemInfo& aGridItem, return s; } + if (aCache->mPercentageBasis.isNothing()) { + aCache->mPercentageBasis.emplace(aState.PercentageBasisFor(aAxis, aGridItem)); + } + // https://drafts.csswg.org/css-grid/#min-size-auto // This calculates the min-content contribution from either a definite // min-width (or min-height depending on aAxis), or the "specified / @@ -3926,7 +3979,8 @@ MinSize(const GridItemInfo& aGridItem, "baseline offset should be zero when not baseline-aligned"); nscoord sz = aGridItem.mBaselineOffset[aAxis] + nsLayoutUtils::MinSizeContributionForAxis(axis, aRC, child, - nsLayoutUtils::MIN_ISIZE); + nsLayoutUtils::MIN_ISIZE, + *aCache->mPercentageBasis); const nsStyleCoord& style = axis == eAxisHorizontal ? stylePos->mMinWidth : stylePos->mMinHeight; auto unit = style.GetUnit(); @@ -3935,9 +3989,6 @@ MinSize(const GridItemInfo& aGridItem, child->StyleDisplay()->mOverflowX == NS_STYLE_OVERFLOW_VISIBLE)) { // Now calculate the "content size" part and return whichever is smaller. MOZ_ASSERT(unit != eStyleUnit_Enumerated || sz == NS_UNCONSTRAINEDSIZE); - if (aCache->mPercentageBasis.isNothing()) { - aCache->mPercentageBasis.emplace(aState.PercentageBasisFor(aAxis, aGridItem)); - } sz = std::min(sz, ContentContribution(aGridItem, aState, aRC, aCBWM, aAxis, aCache->mPercentageBasis, nsLayoutUtils::MIN_ISIZE, @@ -3974,28 +4025,16 @@ nsGridContainerFrame::Tracks::CalculateSizes( } } -bool -nsGridContainerFrame::Tracks::HasIntrinsicButNoFlexSizingInRange( - const LineRange& aRange, - TrackSize::StateBits* aState) const +TrackSize::StateBits +nsGridContainerFrame::Tracks::StateBitsForRange(const LineRange& aRange) const { - MOZ_ASSERT(!aRange.IsAuto(), "must have a definite range"); + TrackSize::StateBits state = TrackSize::StateBits(0); const uint32_t start = aRange.mStart; const uint32_t end = aRange.mEnd; - const TrackSize::StateBits selector = - TrackSize::eIntrinsicMinSizing | TrackSize::eIntrinsicMaxSizing; - bool foundIntrinsic = false; for (uint32_t i = start; i < end; ++i) { - TrackSize::StateBits state = mSizes[i].mState; - *aState |= state; - if (state & TrackSize::eFlexMaxSizing) { - return false; - } - if (state & selector) { - foundIntrinsic = true; - } + state |= mSizes[i].mState; } - return foundIntrinsic; + return state; } bool @@ -4010,6 +4049,13 @@ nsGridContainerFrame::Tracks::ResolveIntrinsicSizeStep1( CachedIntrinsicSizes cache; TrackSize& sz = mSizes[aRange.mStart]; WritingMode wm = aState.mWM; + + // Check if we need to apply "Automatic Minimum Size" and cache it. + if ((sz.mState & TrackSize::eAutoMinSizing) && + aGridItem.ShouldApplyAutoMinSize(wm, mAxis, aPercentageBasis)) { + aGridItem.mState[mAxis] |= ItemState::eApplyAutoMinSize; + } + // Calculate data for "Automatic Minimum Size" clamping, if needed. bool needed = ((sz.mState & TrackSize::eIntrinsicMinSizing) || aConstraint == SizingConstraint::eNoConstraint) && @@ -4370,6 +4416,55 @@ nsGridContainerFrame::Tracks::AlignBaselineSubtree( } } +template<nsGridContainerFrame::Tracks::TrackSizingPhase phase> +bool +nsGridContainerFrame::Tracks::GrowSizeForSpanningItems( + nsTArray<Step2ItemData>::iterator aIter, + const nsTArray<Step2ItemData>::iterator aIterEnd, + nsTArray<uint32_t>& aTracks, + nsTArray<TrackSize>& aPlan, + nsTArray<TrackSize>& aItemPlan, + TrackSize::StateBits aSelector, + const FitContentClamper& aFitContentClamper, + bool aNeedInfinitelyGrowableFlag) +{ + constexpr bool isMaxSizingPhase = + phase == TrackSizingPhase::eIntrinsicMaximums || + phase == TrackSizingPhase::eMaxContentMaximums; + bool needToUpdateSizes = false; + InitializePlan<phase>(aPlan); + for (; aIter != aIterEnd; ++aIter) { + const Step2ItemData& item = *aIter; + if (!(item.mState & aSelector)) { + continue; + } + if (isMaxSizingPhase) { + for (auto j = item.mLineRange.mStart, end = item.mLineRange.mEnd; j < end; ++j) { + aPlan[j].mState |= TrackSize::eModified; + } + } + nscoord space = item.SizeContributionForPhase<phase>(); + if (space <= 0) { + continue; + } + aTracks.ClearAndRetainStorage(); + space = CollectGrowable<phase>(space, item.mLineRange, aSelector, + aTracks); + if (space > 0) { + DistributeToTrackSizes<phase>(space, aPlan, aItemPlan, aTracks, aSelector, + aFitContentClamper); + needToUpdateSizes = true; + } + } + if (isMaxSizingPhase) { + needToUpdateSizes = true; + } + if (needToUpdateSizes) { + CopyPlanToSize<phase>(aPlan, aNeedInfinitelyGrowableFlag); + } + return needToUpdateSizes; +} + void nsGridContainerFrame::Tracks::ResolveIntrinsicSize( GridReflowInput& aState, @@ -4379,21 +4474,6 @@ nsGridContainerFrame::Tracks::ResolveIntrinsicSize( nscoord aPercentageBasis, SizingConstraint aConstraint) { - // Some data we collect on each item for Step 2 of the algorithm below. - struct Step2ItemData - { - uint32_t mSpan; - TrackSize::StateBits mState; - LineRange mLineRange; - nscoord mMinSize; - nscoord mMinContentContribution; - nscoord mMaxContentContribution; - nsIFrame* mFrame; - static bool IsSpanLessThan(const Step2ItemData& a, const Step2ItemData& b) - { - return a.mSpan < b.mSpan; - } - }; // Resolve Intrinsic Track Sizes // http://dev.w3.org/csswg/css-grid/#algo-content @@ -4418,12 +4498,10 @@ nsGridContainerFrame::Tracks::ResolveIntrinsicSize( for (; !iter.AtEnd(); iter.Next()) { auto& gridItem = aGridItems[iter.GridItemIndex()]; - // Check if we need to apply "Automatic Minimum Size" and cache it. - MOZ_ASSERT(!(gridItem.mState[mAxis] & ItemState::eApplyAutoMinSize), - "Why is eApplyAutoMinSize set already?"); - if (gridItem.ShouldApplyAutoMinSize(wm, mAxis, aPercentageBasis)) { - gridItem.mState[mAxis] |= ItemState::eApplyAutoMinSize; - } + MOZ_ASSERT(!(gridItem.mState[mAxis] & + (ItemState::eApplyAutoMinSize | ItemState::eIsFlexing | + ItemState::eClampMarginBoxMinSize)), + "Why are any of these bits set already?"); const GridArea& area = gridItem.mArea; const LineRange& lineRange = area.*aRange; @@ -4435,8 +4513,17 @@ nsGridContainerFrame::Tracks::ResolveIntrinsicSize( gridItem.mState[mAxis] |= ItemState::eIsFlexing; } } else { - TrackSize::StateBits state = TrackSize::StateBits(0); - if (HasIntrinsicButNoFlexSizingInRange(lineRange, &state)) { + TrackSize::StateBits state = StateBitsForRange(lineRange); + + // Check if we need to apply "Automatic Minimum Size" and cache it. + if ((state & TrackSize::eAutoMinSizing) && + gridItem.ShouldApplyAutoMinSize(wm, mAxis, aPercentageBasis)) { + gridItem.mState[mAxis] |= ItemState::eApplyAutoMinSize; + } + + if ((state & (TrackSize::eIntrinsicMinSizing | + TrackSize::eIntrinsicMaxSizing)) && + !(state & TrackSize::eFlexMaxSizing)) { // Collect data for Step 2. maxSpan = std::max(maxSpan, span); if (span >= stateBitsPerSpan.Length()) { @@ -4500,6 +4587,18 @@ nsGridContainerFrame::Tracks::ResolveIntrinsicSize( // Step 2. if (maxSpan) { + auto fitContentClamper = [&aFunctions, aPercentageBasis] (uint32_t aTrack, + nscoord aMinSize, + nscoord* aSize) + { + nscoord fitContentLimit = + ::ResolveToDefiniteSize(aFunctions.MaxSizingFor(aTrack), aPercentageBasis); + if (*aSize > fitContentLimit) { + *aSize = std::max(aMinSize, fitContentLimit); + return true; + } + return false; + }; // Sort the collected items on span length, shortest first. std::stable_sort(step2Items.begin(), step2Items.end(), Step2ItemData::IsSpanLessThan); @@ -4507,85 +4606,44 @@ nsGridContainerFrame::Tracks::ResolveIntrinsicSize( nsTArray<uint32_t> tracks(maxSpan); nsTArray<TrackSize> plan(mSizes.Length()); plan.SetLength(mSizes.Length()); - for (uint32_t i = 0, len = step2Items.Length(); i < len; ) { - // Start / end index for items of the same span length: - const uint32_t spanGroupStartIndex = i; - uint32_t spanGroupEndIndex = len; - const uint32_t span = step2Items[i].mSpan; - for (++i; i < len; ++i) { - if (step2Items[i].mSpan != span) { - spanGroupEndIndex = i; - break; - } - } - + nsTArray<TrackSize> itemPlan(mSizes.Length()); + itemPlan.SetLength(mSizes.Length()); + // Start / end iterator for items of the same span length: + auto spanGroupStart = step2Items.begin(); + auto spanGroupEnd = spanGroupStart; + const auto end = step2Items.end(); + for (; spanGroupStart != end; spanGroupStart = spanGroupEnd) { + while (spanGroupEnd != end && + !Step2ItemData::IsSpanLessThan(*spanGroupStart, *spanGroupEnd)) { + ++spanGroupEnd; + } + + const uint32_t span = spanGroupStart->mSpan; bool updatedBase = false; // Did we update any mBase in step 2.1 - 2.3? TrackSize::StateBits selector(TrackSize::eIntrinsicMinSizing); if (stateBitsPerSpan[span] & selector) { // Step 2.1 MinSize to intrinsic min-sizing. - for (i = spanGroupStartIndex; i < spanGroupEndIndex; ++i) { - Step2ItemData& item = step2Items[i]; - if (!(item.mState & selector)) { - continue; - } - nscoord space = item.mMinSize; - if (space <= 0) { - continue; - } - tracks.ClearAndRetainStorage(); - space = CollectGrowable(space, mSizes, item.mLineRange, selector, - tracks); - if (space > 0) { - DistributeToTrackBases(space, plan, tracks, selector); - updatedBase = true; - } - } + updatedBase = + GrowSizeForSpanningItems<TrackSizingPhase::eIntrinsicMinimums>( + spanGroupStart, spanGroupEnd, tracks, plan, itemPlan, selector); } selector = contentBasedMinSelector; if (stateBitsPerSpan[span] & selector) { // Step 2.2 MinContentContribution to min-/max-content (and 'auto' when // sizing under a min-content constraint) min-sizing. - for (i = spanGroupStartIndex; i < spanGroupEndIndex; ++i) { - Step2ItemData& item = step2Items[i]; - if (!(item.mState & selector)) { - continue; - } - nscoord space = item.mMinContentContribution; - if (space <= 0) { - continue; - } - tracks.ClearAndRetainStorage(); - space = CollectGrowable(space, mSizes, item.mLineRange, selector, - tracks); - if (space > 0) { - DistributeToTrackBases(space, plan, tracks, selector); - updatedBase = true; - } - } + updatedBase |= + GrowSizeForSpanningItems<TrackSizingPhase::eContentBasedMinimums>( + spanGroupStart, spanGroupEnd, tracks, plan, itemPlan, selector); } selector = maxContentMinSelector; if (stateBitsPerSpan[span] & selector) { // Step 2.3 MaxContentContribution to max-content (and 'auto' when // sizing under a max-content constraint) min-sizing. - for (i = spanGroupStartIndex; i < spanGroupEndIndex; ++i) { - Step2ItemData& item = step2Items[i]; - if (!(item.mState & selector)) { - continue; - } - nscoord space = item.mMaxContentContribution; - if (space <= 0) { - continue; - } - tracks.ClearAndRetainStorage(); - space = CollectGrowable(space, mSizes, item.mLineRange, selector, - tracks); - if (space > 0) { - DistributeToTrackBases(space, plan, tracks, selector); - updatedBase = true; - } - } + updatedBase |= + GrowSizeForSpanningItems<TrackSizingPhase::eMaxContentMinimums>( + spanGroupStart, spanGroupEnd, tracks, plan, itemPlan, selector); } if (updatedBase) { @@ -4596,63 +4654,22 @@ nsGridContainerFrame::Tracks::ResolveIntrinsicSize( } } } - if (stateBitsPerSpan[span] & TrackSize::eIntrinsicMaxSizing) { - plan = mSizes; - for (TrackSize& sz : plan) { - if (sz.mLimit == NS_UNCONSTRAINEDSIZE) { - // use mBase as the planned limit - } else { - sz.mBase = sz.mLimit; - } - } + selector = TrackSize::eIntrinsicMaxSizing; + if (stateBitsPerSpan[span] & selector) { + const bool willRunStep2_6 = + stateBitsPerSpan[span] & TrackSize::eAutoOrMaxContentMaxSizing; // Step 2.5 MinSize to intrinsic max-sizing. - for (i = spanGroupStartIndex; i < spanGroupEndIndex; ++i) { - Step2ItemData& item = step2Items[i]; - if (!(item.mState & TrackSize::eIntrinsicMaxSizing)) { - continue; - } - nscoord space = item.mMinSize; - if (space <= 0) { - continue; - } - tracks.ClearAndRetainStorage(); - space = CollectGrowable(space, plan, item.mLineRange, - TrackSize::eIntrinsicMaxSizing, - tracks); - if (space > 0) { - DistributeToTrackLimits(space, plan, tracks, aFunctions, - aPercentageBasis); - } - } - for (size_t j = 0, len = mSizes.Length(); j < len; ++j) { - TrackSize& sz = plan[j]; - sz.mState &= ~(TrackSize::eFrozen | TrackSize::eSkipGrowUnlimited); - if (sz.mLimit != NS_UNCONSTRAINEDSIZE) { - sz.mLimit = sz.mBase; // collect the results from 2.5 - } - } + GrowSizeForSpanningItems<TrackSizingPhase::eIntrinsicMaximums>( + spanGroupStart, spanGroupEnd, tracks, plan, itemPlan, selector, + fitContentClamper, willRunStep2_6); - if (stateBitsPerSpan[span] & TrackSize::eAutoOrMaxContentMaxSizing) { + if (willRunStep2_6) { // Step 2.6 MaxContentContribution to max-content max-sizing. - for (i = spanGroupStartIndex; i < spanGroupEndIndex; ++i) { - Step2ItemData& item = step2Items[i]; - if (!(item.mState & TrackSize::eAutoOrMaxContentMaxSizing)) { - continue; - } - nscoord space = item.mMaxContentContribution; - if (space <= 0) { - continue; - } - tracks.ClearAndRetainStorage(); - space = CollectGrowable(space, plan, item.mLineRange, - TrackSize::eAutoOrMaxContentMaxSizing, - tracks); - if (space > 0) { - DistributeToTrackLimits(space, plan, tracks, aFunctions, - aPercentageBasis); - } - } + selector = TrackSize::eAutoOrMaxContentMaxSizing; + GrowSizeForSpanningItems<TrackSizingPhase::eMaxContentMaximums>( + spanGroupStart, spanGroupEnd, tracks, plan, itemPlan, selector, + fitContentClamper); } } } @@ -4984,6 +5001,7 @@ nsGridContainerFrame::Tracks::AlignJustifyContent( default: MOZ_ASSERT_UNREACHABLE("unknown align-/justify-content value"); between = 0; // just to avoid a compiler warning + roundingError = 0; // just to avoid a compiler warning } between += mGridGap; for (TrackSize& sz : mSizes) { @@ -4998,36 +5016,6 @@ nsGridContainerFrame::Tracks::AlignJustifyContent( MOZ_ASSERT(!roundingError, "we didn't distribute all rounding error?"); } -nscoord -nsGridContainerFrame::Tracks::BackComputedIntrinsicSize( - const TrackSizingFunctions& aFunctions, - const nsStyleCoord& aGridGap) const -{ - // Sum up the current sizes (where percentage tracks were treated as 'auto') - // in 'size'. - nscoord size = 0; - for (size_t i = 0, len = mSizes.Length(); i < len; ++i) { - size += mSizes[i].mBase; - } - - // Add grid-gap contributions to 'size' and calculate a 'percent' sum. - float percent = 0.0f; - size_t numTracks = mSizes.Length(); - if (numTracks > 1) { - const size_t gridGapCount = numTracks - 1; - nscoord gridGapLength; - float gridGapPercent; - if (::GetPercentSizeParts(aGridGap, &gridGapLength, &gridGapPercent)) { - percent = gridGapCount * gridGapPercent; - } else { - gridGapLength = aGridGap.ToLength(); - } - size += gridGapCount * gridGapLength; - } - - return std::max(0, nsLayoutUtils::AddPercents(size, percent)); -} - void nsGridContainerFrame::LineRange::ToPositionAndLength( const nsTArray<TrackSize>& aTrackSizes, nscoord* aPos, nscoord* aLength) const @@ -5077,10 +5065,15 @@ nsGridContainerFrame::LineRange::ToPositionAndLengthForAbsPos( : GridLineSide::eBeforeGridGap; nscoord endPos = aTracks.GridLineEdge(mEnd, side); *aLength = std::max(aGridOrigin + endPos, 0); - } else { + } else if (MOZ_LIKELY(mStart != mEnd)) { nscoord pos; ToPositionAndLength(aTracks.mSizes, &pos, aLength); *aPos = aGridOrigin + pos; + } else { + // The grid area only covers removed 'auto-fit' tracks. + nscoord pos = aTracks.GridLineEdge(mStart, GridLineSide::eBeforeGridGap); + *aPos = aGridOrigin + pos; + *aLength = nscoord(0); } } } @@ -6188,7 +6181,7 @@ nsGridContainerFrame::Reflow(nsPresContext* aPresContext, LogicalSize computedSize(wm, computedISize, computedBSize); nscoord consumedBSize = 0; - nscoord bSize; + nscoord bSize = 0; if (!prevInFlow) { Grid grid; grid.PlaceGridItems(gridReflowInput, aReflowInput.ComputedMinSize(), @@ -6196,7 +6189,12 @@ nsGridContainerFrame::Reflow(nsPresContext* aPresContext, gridReflowInput.CalculateTrackSizes(grid, computedSize, SizingConstraint::eNoConstraint); - bSize = computedSize.BSize(wm); + // Note: we can't use GridLineEdge here since we haven't calculated + // the rows' mPosition yet (happens in AlignJustifyContent below). + for (const auto& sz : gridReflowInput.mRows.mSizes) { + bSize += sz.mBase; + } + bSize += gridReflowInput.mRows.SumOfGridGaps(); } else { consumedBSize = GetConsumedBSize(); gridReflowInput.InitializeForContinuation(this, consumedBSize); @@ -6595,8 +6593,14 @@ nsGridContainerFrame::IntrinsicISize(nsRenderingContext* aRenderingContext, state.mCols.CalculateSizes(state, state.mGridItems, state.mColFunctions, NS_UNCONSTRAINEDSIZE, &GridArea::mCols, constraint); - return state.mCols.BackComputedIntrinsicSize(state.mColFunctions, - state.mGridStyle->mGridColumnGap); + state.mCols.mGridGap = + nsLayoutUtils::ResolveGapToLength(state.mGridStyle->mGridColumnGap, + NS_UNCONSTRAINEDSIZE); + nscoord length = 0; + for (const TrackSize& sz : state.mCols.mSizes) { + length += sz.mBase; + } + return length + state.mCols.SumOfGridGaps(); } nscoord @@ -7113,6 +7117,9 @@ nsGridContainerFrame::TrackSize::Dump() const if (mState & eFrozen) { printf("frozen "); } + if (mState & eModified) { + printf("modified "); + } if (mState & eBreakBefore) { printf("break-before "); } diff --git a/layout/generic/nsIFrame.h b/layout/generic/nsIFrame.h index ec3568483..57f5c460c 100644 --- a/layout/generic/nsIFrame.h +++ b/layout/generic/nsIFrame.h @@ -25,6 +25,7 @@ #include "CaretAssociationHint.h" #include "FrameProperties.h" +#include "LayoutConstants.h" #include "mozilla/layout/FrameChildList.h" #include "mozilla/Maybe.h" #include "mozilla/WritingModes.h" @@ -130,30 +131,12 @@ typedef uint32_t nsSplittableType; #define NS_FRAME_IS_NOT_SPLITTABLE(type)\ (0 == ((type) & NS_FRAME_SPLITTABLE)) -#define NS_INTRINSIC_WIDTH_UNKNOWN nscoord_MIN - //---------------------------------------------------------------------- #define NS_SUBTREE_DIRTY(_frame) \ (((_frame)->GetStateBits() & \ (NS_FRAME_IS_DIRTY | NS_FRAME_HAS_DIRTY_CHILDREN)) != 0) -/** - * Constant used to indicate an unconstrained size. - * - * @see #Reflow() - */ -#define NS_UNCONSTRAINEDSIZE NS_MAXSIZE - -#define NS_INTRINSICSIZE NS_UNCONSTRAINEDSIZE -#define NS_AUTOHEIGHT NS_UNCONSTRAINEDSIZE -// +1 is to avoid clamped huge margin values being processed as auto margins -#define NS_AUTOMARGIN (NS_UNCONSTRAINEDSIZE + 1) -#define NS_AUTOOFFSET NS_UNCONSTRAINEDSIZE -// NOTE: there are assumptions all over that these have the same value, namely NS_UNCONSTRAINEDSIZE -// if any are changed to be a value other than NS_UNCONSTRAINEDSIZE -// at least update AdjustComputedHeight/Width and test ad nauseum - // 1 million CSS pixels less than our max app unit measure. // For reflowing with an "infinite" available inline space per [css-sizing]. // (reflowing with an NS_UNCONSTRAINEDSIZE available inline size isn't allowed @@ -2050,23 +2033,27 @@ public: /** * Return the horizontal components of padding, border, and margin * that contribute to the intrinsic width that applies to the parent. + * @param aPercentageBasis the percentage basis to use for padding/margin - + * i.e. the Containing Block's inline-size */ struct IntrinsicISizeOffsetData { nscoord hPadding, hBorder, hMargin; - float hPctPadding, hPctMargin; IntrinsicISizeOffsetData() : hPadding(0), hBorder(0), hMargin(0) - , hPctPadding(0.0f), hPctMargin(0.0f) {} }; - virtual IntrinsicISizeOffsetData IntrinsicISizeOffsets() = 0; + virtual IntrinsicISizeOffsetData + IntrinsicISizeOffsets(nscoord aPercentageBasis = NS_UNCONSTRAINEDSIZE) = 0; /** * Return the bsize components of padding, border, and margin * that contribute to the intrinsic width that applies to the parent. + * @param aPercentageBasis the percentage basis to use for padding/margin - + * i.e. the Containing Block's inline-size */ - IntrinsicISizeOffsetData IntrinsicBSizeOffsets(); + IntrinsicISizeOffsetData + IntrinsicBSizeOffsets(nscoord aPercentageBasis = NS_UNCONSTRAINEDSIZE); virtual mozilla::IntrinsicSize GetIntrinsicSize() = 0; diff --git a/layout/generic/nsInlineFrame.cpp b/layout/generic/nsInlineFrame.cpp index 54d93c85a..7e188c247 100644 --- a/layout/generic/nsInlineFrame.cpp +++ b/layout/generic/nsInlineFrame.cpp @@ -199,8 +199,7 @@ nsInlineFrame::DestroyFrom(nsIFrame* aDestructRoot) // Fixup the parent pointers for any child frames on the OverflowList. // nsIFrame::DestroyFrom depends on that to find the sticky scroll // container (an ancestor). - nsIFrame* lineContainer = nsLayoutUtils::FindNearestBlockAncestor(this); - DrainSelfOverflowListInternal(eForDestroy, lineContainer); + overflowFrames->ApplySetParent(this); } nsContainerFrame::DestroyFrom(aDestructRoot); } @@ -377,8 +376,6 @@ nsInlineFrame::Reflow(nsPresContext* aPresContext, bool lazilySetParentPointer = false; - nsIFrame* lineContainer = aReflowInput.mLineLayout->LineContainerFrame(); - // Check for an overflow list with our prev-in-flow nsInlineFrame* prevInFlow = (nsInlineFrame*)GetPrevInFlow(); if (prevInFlow) { @@ -404,12 +401,6 @@ nsInlineFrame::Reflow(nsPresContext* aPresContext, mFrames.SetFrames(*prevOverflowFrames); lazilySetParentPointer = true; } else { - // Assign all floats to our block if necessary - if (lineContainer && lineContainer->GetPrevContinuation()) { - ReparentFloatsForInlineChild(lineContainer, - prevOverflowFrames->FirstChild(), - true); - } // Insert the new frames at the beginning of the child list // and set their parent pointer const nsFrameList::Slice& newFrames = @@ -443,14 +434,13 @@ nsInlineFrame::Reflow(nsPresContext* aPresContext, if (aReflowInput.mLineLayout->GetInFirstLine()) { flags = DrainFlags(flags | eInFirstLine); } - DrainSelfOverflowListInternal(flags, lineContainer); + DrainSelfOverflowListInternal(flags); } - // Set our own reflow state (additional state above and beyond - // aReflowInput) + // Set our own reflow state (additional state above and beyond aReflowInput) InlineReflowInput irs; irs.mPrevFrame = nullptr; - irs.mLineContainer = lineContainer; + irs.mLineContainer = aReflowInput.mLineLayout->LineContainerFrame(); irs.mLineLayout = aReflowInput.mLineLayout; irs.mNextInFlow = (nsInlineFrame*) GetNextInFlow(); irs.mSetParentPointer = lazilySetParentPointer; @@ -495,8 +485,7 @@ nsInlineFrame::AttributeChanged(int32_t aNameSpaceID, } bool -nsInlineFrame::DrainSelfOverflowListInternal(DrainFlags aFlags, - nsIFrame* aLineContainer) +nsInlineFrame::DrainSelfOverflowListInternal(DrainFlags aFlags) { AutoFrameListPtr overflowFrames(PresContext(), StealOverflowFrames()); if (overflowFrames) { @@ -505,11 +494,7 @@ nsInlineFrame::DrainSelfOverflowListInternal(DrainFlags aFlags, // correct parent pointer. This is sometimes skipped by Reflow. if (!(aFlags & eDontReparentFrames)) { nsIFrame* firstChild = overflowFrames->FirstChild(); - if (aLineContainer && aLineContainer->GetPrevContinuation()) { - ReparentFloatsForInlineChild(aLineContainer, firstChild, true); - } - const bool doReparentSC = - (aFlags & eInFirstLine) && !(aFlags & eForDestroy); + const bool doReparentSC = (aFlags & eInFirstLine); RestyleManagerHandle restyleManager = PresContext()->RestyleManager(); for (nsIFrame* f = firstChild; f; f = f->GetNextSibling()) { f->SetParent(this); @@ -539,7 +524,7 @@ nsInlineFrame::DrainSelfOverflowList() break; } } - return DrainSelfOverflowListInternal(flags, lineContainer); + return DrainSelfOverflowListInternal(flags); } /* virtual */ bool @@ -608,23 +593,8 @@ nsInlineFrame::ReflowFrames(nsPresContext* aPresContext, while (frame) { // Check if we should lazily set the child frame's parent pointer. if (irs.mSetParentPointer) { - bool havePrevBlock = - irs.mLineContainer && irs.mLineContainer->GetPrevContinuation(); nsIFrame* child = frame; do { - // If our block is the first in flow, then any floats under the pulled - // frame must already belong to our block. - if (havePrevBlock) { - // This has to happen before we update frame's parent; we need to - // know frame's ancestry under its old block. - // The blockChildren.ContainsFrame check performed by - // ReparentFloatsForInlineChild here may be slow, but we can't - // easily avoid it because we don't know where 'frame' originally - // came from. If we really really have to optimize this we could - // cache whether frame->GetParent() is under its containing blocks - // overflowList or not. - ReparentFloatsForInlineChild(irs.mLineContainer, child, false); - } child->SetParent(this); if (inFirstLine) { restyleManager->ReparentStyleContext(child); @@ -1100,20 +1070,13 @@ nsFirstLineFrame::Reflow(nsPresContext* aPresContext, return; // XXX does this happen? why? } - nsIFrame* lineContainer = aReflowInput.mLineLayout->LineContainerFrame(); - // Check for an overflow list with our prev-in-flow nsFirstLineFrame* prevInFlow = (nsFirstLineFrame*)GetPrevInFlow(); if (prevInFlow) { AutoFrameListPtr prevOverflowFrames(aPresContext, prevInFlow->StealOverflowFrames()); if (prevOverflowFrames) { - // Assign all floats to our block if necessary - if (lineContainer && lineContainer->GetPrevContinuation()) { - ReparentFloatsForInlineChild(lineContainer, - prevOverflowFrames->FirstChild(), - true); - } + // Reparent the new frames and their style contexts. const nsFrameList::Slice& newFrames = mFrames.InsertFrames(this, nullptr, *prevOverflowFrames); ReparentChildListStyle(aPresContext, newFrames, this); @@ -1127,7 +1090,7 @@ nsFirstLineFrame::Reflow(nsPresContext* aPresContext, // aReflowInput) InlineReflowInput irs; irs.mPrevFrame = nullptr; - irs.mLineContainer = lineContainer; + irs.mLineContainer = aReflowInput.mLineLayout->LineContainerFrame(); irs.mLineLayout = aReflowInput.mLineLayout; irs.mNextInFlow = (nsInlineFrame*) GetNextInFlow(); diff --git a/layout/generic/nsInlineFrame.h b/layout/generic/nsInlineFrame.h index 00f89065c..36df6be93 100644 --- a/layout/generic/nsInlineFrame.h +++ b/layout/generic/nsInlineFrame.h @@ -175,18 +175,13 @@ private: enum DrainFlags { eDontReparentFrames = 1, // skip reparenting the overflow list frames eInFirstLine = 2, // the request is for an inline descendant of a nsFirstLineFrame - eForDestroy = 4, // the request is from DestroyFrom; in this case we do the - // minimal work required since the frame is about to be - // destroyed (just fixup parent pointers) }; /** * Move any frames on our overflow list to the end of our principal list. * @param aFlags one or more of the above DrainFlags - * @param aLineContainer the nearest line container ancestor * @return true if there were any overflow frames */ - bool DrainSelfOverflowListInternal(DrainFlags aFlags, - nsIFrame* aLineContainer); + bool DrainSelfOverflowListInternal(DrainFlags aFlags); protected: nscoord mBaseline; }; diff --git a/layout/generic/nsTextFrame.cpp b/layout/generic/nsTextFrame.cpp index 0641c7439..59ef020ce 100644 --- a/layout/generic/nsTextFrame.cpp +++ b/layout/generic/nsTextFrame.cpp @@ -7525,7 +7525,8 @@ nsTextFrame::GetCharacterRectsInRange(int32_t aInOffset, gfxSkipCharsIterator nextIter(iter); nextIter.AdvanceOriginal(1); if (!nextIter.IsOriginalCharSkipped() && - !mTextRun->IsClusterStart(nextIter.GetSkippedOffset())) { + !mTextRun->IsClusterStart(nextIter.GetSkippedOffset()) && + nextIter.GetOriginalOffset() < kContentEnd) { FindClusterEnd(mTextRun, kContentEnd, &nextIter); } diff --git a/layout/generic/test/mochitest.ini b/layout/generic/test/mochitest.ini index 934ffc8a4..33dacddab 100644 --- a/layout/generic/test/mochitest.ini +++ b/layout/generic/test/mochitest.ini @@ -138,3 +138,7 @@ support-files = file_taintedfilters_feDisplacementMap-tainted-1.svg file_tainted support-files = file_scroll_position_restore.html [test_scroll_animation_restore.html] [test_scroll_position_iframe.html] +[test_grid_track_sizing_algo_001.html] +skip-if = debug == true # the test is slow +[test_grid_track_sizing_algo_002.html] +skip-if = debug == true # the test is slow diff --git a/layout/generic/test/test_grid_track_sizing_algo_001.html b/layout/generic/test/test_grid_track_sizing_algo_001.html new file mode 100644 index 000000000..68956c2df --- /dev/null +++ b/layout/generic/test/test_grid_track_sizing_algo_001.html @@ -0,0 +1,1641 @@ +<!DOCTYPE HTML> +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<html><head> + <meta charset="utf-8"> + <title>CSS Grid Test: intrinsic track sizing with spanning items</title> + <link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1425599"> + <link rel="help" href="https://drafts.csswg.org/css-grid/#algo-content"> + <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> + <style type="text/css"> +body,html { color:black; background:white; font-family:monospace; font-size:16px; padding:0; margin:0; } +* { vertical-align: top; line-height: 1px; } + +.grid { + display: inline-grid; + grid-template-rows: 1px; + grid-auto-rows: 10px; + border: 1px solid; + place-content: start; + place-items: start; +} + +x { + grid-row: 1; + height: 1px; + background: grey; +} + +x:nth-child(1) { background: lime; width: 3px; grid-column: 1/span 2; } +x:nth-child(2) { background: silver; width: 6px; grid-column: 2/span 4; } +x:nth-child(3) { background: blue; width: 12px; grid-column: 2/span 2; } + </style> +</head> +<body> + +<script> +let min1 = [ + "0", "4px" +]; +let min2 = [ + "auto", "min-content", "max-content" +]; +let max1 = [ + "8px" +]; +let max2 = [ + "auto", "min-content", "max-content" +]; + +var track = []; +min1.forEach((min) => { max2.forEach((max) => { + track.push("minmax(" + min + "," + max + ")"); +})}); +min2.forEach((min) => { max2.forEach((max) => { + track.push("minmax(" + min + "," + max + ")"); +})}); +min2.forEach((min) => { max1.forEach((max) => { + track.push("minmax(" + min + "," + max + ")"); +})}); +min2.forEach((min) => { max2.forEach((max) => { + track.push("minmax(" + min + "," + max + ")"); +})}); +track.push("fit-content(8px)"); + +var cols = []; +track.forEach((c1) => { + cols.push(c1 + " " + c1 + " " + c1 + " " + c1 + " " + c1); + track.forEach((c2) => { + if (c1 != c2) { + cols.push(c1 + " " + c2 + " " + c2 + " " + c2 + " " + c2); + cols.push(c2 + " " + c1 + " " + c1 + " " + c2 + " " + c2); + } +})}); + +document.body.style.display = 'none'; +cols.forEach((col) => { + let grid = document.createElement('div'); + grid.className = "grid"; + grid.style.gridTemplateColumns = col; + grid.appendChild(document.createElement('x')) + grid.appendChild(document.createElement('x')) + grid.appendChild(document.createElement('x')) + document.body.appendChild(grid); +}); +document.body.style.display = ''; +</script> + +<script> +var actual = []; +[...document.querySelectorAll('.grid')].forEach(function(e) { + let cs = window.getComputedStyle(e); + actual.push([cs.gridTemplateColumns, cs.width]); +}); + +function dumpResult() { + var s = ""; + actual.forEach(v => { + s += '["' + v[0] + '","' + v[1] + '"],\n'; + }); + let pre = document.createElement("pre"); + pre.innerHTML = s; + document.body.appendChild(pre); +} + +let expected = [ +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 8px 8px 8px 8px","32px"], +["8px 6px 6px 8px 8px","36px"], +["0px 8px 8px 8px 8px","32px"], +["8px 6px 6px 8px 8px","36px"], +["0px 8px 8px 8px 8px","32px"], +["8px 6px 6px 8px 8px","36px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 8px 8px 8px 8px","32px"], +["8px 6px 6px 8px 8px","36px"], +["0px 8px 8px 8px 8px","32px"], +["8px 6px 6px 8px 8px","36px"], +["0px 8px 8px 8px 8px","32px"], +["8px 6px 6px 8px 8px","36px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 8px 8px 8px 8px","32px"], +["8px 6px 6px 8px 8px","36px"], +["0px 8px 8px 8px 8px","32px"], +["8px 6px 6px 8px 8px","36px"], +["0px 8px 8px 8px 8px","32px"], +["8px 6px 6px 8px 8px","36px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 3px 3px","21px"], +["4px 6px 6px 4px 4px","24px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 4px 4px","24px"], +["4px 6px 6px 4px 4px","24px"], +["4px 6px 6px 4px 4px","24px"], +["4px 6px 6px 4px 4px","24px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 8px 8px 8px 8px","36px"], +["8px 6px 6px 8px 8px","36px"], +["4px 8px 8px 8px 8px","36px"], +["8px 6px 6px 8px 8px","36px"], +["4px 8px 8px 8px 8px","36px"], +["8px 6px 6px 8px 8px","36px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 4px 4px","24px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 4px 4px","24px"], +["4px 6px 6px 4px 4px","24px"], +["4px 6px 6px 4px 4px","24px"], +["4px 6px 6px 4px 4px","24px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 8px 8px 8px 8px","36px"], +["8px 6px 6px 8px 8px","36px"], +["4px 8px 8px 8px 8px","36px"], +["8px 6px 6px 8px 8px","36px"], +["4px 8px 8px 8px 8px","36px"], +["8px 6px 6px 8px 8px","36px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 4px 4px","24px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 4px 4px","24px"], +["4px 6px 6px 4px 4px","24px"], +["4px 6px 6px 4px 4px","24px"], +["4px 6px 6px 4px 4px","24px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 8px 8px 8px 8px","36px"], +["8px 6px 6px 8px 8px","36px"], +["4px 8px 8px 8px 8px","36px"], +["8px 6px 6px 8px 8px","36px"], +["4px 8px 8px 8px 8px","36px"], +["8px 6px 6px 8px 8px","36px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["4px 6px 6px 0px 0px","16px"], +["0px 6px 6px 0px 0px","12px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["8px 8px 8px 8px 8px","40px"], +["8px 6px 6px 0px 0px","20px"], +["0px 8px 8px 0px 0px","16px"], +["8px 6px 6px 0px 0px","20px"], +["0px 8px 8px 0px 0px","16px"], +["8px 6px 6px 0px 0px","20px"], +["0px 8px 8px 0px 0px","16px"], +["8px 6px 6px 4px 4px","28px"], +["4px 8px 8px 4px 4px","28px"], +["8px 6px 6px 4px 4px","28px"], +["4px 8px 8px 4px 4px","28px"], +["8px 6px 6px 4px 4px","28px"], +["4px 8px 8px 4px 4px","28px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 8px 8px 8px 8px","40px"], +["8px 8px 8px 8px 8px","40px"], +["8px 8px 8px 8px 8px","40px"], +["8px 8px 8px 8px 8px","40px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 8px 8px 8px 8px","40px"], +["8px 6px 6px 0px 0px","20px"], +["0px 8px 8px 0px 0px","16px"], +["8px 6px 6px 0px 0px","20px"], +["0px 8px 8px 0px 0px","16px"], +["8px 6px 6px 0px 0px","20px"], +["0px 8px 8px 0px 0px","16px"], +["8px 6px 6px 4px 4px","28px"], +["4px 8px 8px 4px 4px","28px"], +["8px 6px 6px 4px 4px","28px"], +["4px 8px 8px 4px 4px","28px"], +["8px 6px 6px 4px 4px","28px"], +["4px 8px 8px 4px 4px","28px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 8px 8px 8px 8px","40px"], +["8px 8px 8px 8px 8px","40px"], +["8px 8px 8px 8px 8px","40px"], +["8px 8px 8px 8px 8px","40px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 8px 8px 8px 8px","40px"], +["8px 6px 6px 0px 0px","20px"], +["0px 8px 8px 0px 0px","16px"], +["8px 6px 6px 0px 0px","20px"], +["0px 8px 8px 0px 0px","16px"], +["8px 6px 6px 0px 0px","20px"], +["0px 8px 8px 0px 0px","16px"], +["8px 6px 6px 4px 4px","28px"], +["4px 8px 8px 4px 4px","28px"], +["8px 6px 6px 4px 4px","28px"], +["4px 8px 8px 4px 4px","28px"], +["8px 6px 6px 4px 4px","28px"], +["4px 8px 8px 4px 4px","28px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 8px 8px 8px 8px","40px"], +["8px 8px 8px 8px 8px","40px"], +["8px 8px 8px 8px 8px","40px"], +["8px 8px 8px 8px 8px","40px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["8px 6px 6px 0px 0px","20px"], +["1.5px 8px 8px 0px 0px","17.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["3px 6px 6px 0px 0px","15px"], +["0px 6px 6px 0px 0px","12px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["0px 6px 6px 4px 4px","20px"], +["4px 6px 6px 4px 4px","24px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 8px 8px 8px 8px","33.5px"], +["8px 6px 6px 8px 8px","36px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +["1.5px 6px 6px 0px 0px","13.5px"], +]; + +function test() { + ok(expected.length > 0, "sanity check"); + for (i = 0; i < expected.length; ++i) { + var msg = ""; + if (actual[i][0] != expected[i][0]) { + msg = "'grid-template-columns' for grid index " + i + ":\n" + [...document.querySelectorAll('.grid')][i].outerHTML; + is(actual[i][0], expected[i][0], msg); + } + if (actual[i][1] != expected[i][1]) { + msg = "'width' for grid index " + i + ":\n" + [...document.querySelectorAll('.grid')][i].outerHTML; + is(actual[i][1], expected[i][1], msg); + } + if (msg != "") { + i = expected.length; // stop after first failed grid by default + } + } + SimpleTest.finish(); +} + +</script> + +<script> +window.onload = function() { setTimeout(test, 0); }; +SimpleTest.waitForExplicitFinish(); +</script> + +</body> +</html> diff --git a/layout/generic/test/test_grid_track_sizing_algo_002.html b/layout/generic/test/test_grid_track_sizing_algo_002.html new file mode 100644 index 000000000..40f50e20f --- /dev/null +++ b/layout/generic/test/test_grid_track_sizing_algo_002.html @@ -0,0 +1,1641 @@ +<!DOCTYPE HTML> +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<html><head> + <meta charset="utf-8"> + <title>CSS Grid Test: intrinsic track sizing with spanning items</title> + <link rel="author" title="Mats Palmgren" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1425599"> + <link rel="help" href="https://drafts.csswg.org/css-grid/#algo-content"> + <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> + <style type="text/css"> +body,html { color:black; background:white; font-family:monospace; font-size:16px; padding:0; margin:0; } +* { vertical-align: top; line-height: 1px; } + +.grid { + display: inline-grid; + grid-template-rows: 1px; + grid-auto-rows: 10px; + border: 1px solid; + place-content: start; + place-items: start; +} + +x { + grid-row: 1; + height: 1px; + background: grey; +} + +x:nth-child(1) { background: lime; width: 3px; grid-column: 1/span 2; } +x:nth-child(2) { background: silver; width: 6px; grid-column: 2/span 3; } +x:nth-child(3) { background: blue; width: 12px; grid-column: 1/span 2; } + </style> +</head> +<body> + +<script> +let min1 = [ + "0", "4px" +]; +let min2 = [ + "auto", "min-content", "max-content" +]; +let max1 = [ + "8px" +]; +let max2 = [ + "auto", "min-content", "max-content" +]; + +var track = []; +min1.forEach((min) => { max2.forEach((max) => { + track.push("minmax(" + min + "," + max + ")"); +})}); +min2.forEach((min) => { max2.forEach((max) => { + track.push("minmax(" + min + "," + max + ")"); +})}); +min2.forEach((min) => { max1.forEach((max) => { + track.push("minmax(" + min + "," + max + ")"); +})}); +min2.forEach((min) => { max2.forEach((max) => { + track.push("minmax(" + min + "," + max + ")"); +})}); +track.push("fit-content(8px)"); + +var cols = []; +track.forEach((c1) => { + cols.push(c1 + " " + c1 + " " + c1 + " " + c1 + " " + c1); + track.forEach((c2) => { + if (c1 != c2) { + cols.push(c1 + " " + c2 + " " + c2 + " " + c2 + " " + c2); + cols.push(c2 + " " + c1 + " " + c1 + " " + c2 + " " + c2); + } +})}); + +document.body.style.display = 'none'; +cols.forEach((col) => { + let grid = document.createElement('div'); + grid.className = "grid"; + grid.style.gridTemplateColumns = col; + grid.appendChild(document.createElement('x')) + grid.appendChild(document.createElement('x')) + grid.appendChild(document.createElement('x')) + document.body.appendChild(grid); +}); +document.body.style.display = ''; +</script> + +<script> +var actual = []; +[...document.querySelectorAll('.grid')].forEach(function(e) { + let cs = window.getComputedStyle(e); + actual.push([cs.gridTemplateColumns, cs.width]); +}); + +function dumpResult() { + var s = ""; + actual.forEach(v => { + s += '["' + v[0] + '","' + v[1] + '"],\n'; + }); + let pre = document.createElement("pre"); + pre.innerHTML = s; + document.body.appendChild(pre); +} + +let expected = [ +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["4px 8px 4px 4px 4px","24px"], +["8px 4px 0px 4px 4px","20px"], +["4px 8px 4px 4px 4px","24px"], +["8px 4px 0px 4px 4px","20px"], +["4px 8px 4px 4px 4px","24px"], +["8px 4px 0px 4px 4px","20px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 8px 8px 8px","36px"], +["12px 0px 0px 8px 8px","28px"], +["0px 12px 8px 8px 8px","36px"], +["12px 0px 0px 8px 8px","28px"], +["0px 12px 8px 8px 8px","36px"], +["12px 0px 0px 8px 8px","28px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["4px 8px 4px 4px 4px","24px"], +["8px 4px 0px 4px 4px","20px"], +["4px 8px 4px 4px 4px","24px"], +["8px 4px 0px 4px 4px","20px"], +["4px 8px 4px 4px 4px","24px"], +["8px 4px 0px 4px 4px","20px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 8px 8px 8px","36px"], +["12px 0px 0px 8px 8px","28px"], +["0px 12px 8px 8px 8px","36px"], +["12px 0px 0px 8px 8px","28px"], +["0px 12px 8px 8px 8px","36px"], +["12px 0px 0px 8px 8px","28px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["4px 8px 4px 4px 4px","24px"], +["8px 4px 0px 4px 4px","20px"], +["4px 8px 4px 4px 4px","24px"], +["8px 4px 0px 4px 4px","20px"], +["4px 8px 4px 4px 4px","24px"], +["8px 4px 0px 4px 4px","20px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 8px 8px 8px","36px"], +["12px 0px 0px 8px 8px","28px"], +["0px 12px 8px 8px 8px","36px"], +["12px 0px 0px 8px 8px","28px"], +["0px 12px 8px 8px 8px","36px"], +["12px 0px 0px 8px 8px","28px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 0px 6px 0px","18px"], +["6px 6px 4px 4px 4px","24px"], +["8px 4px 1px 1px 0px","14px"], +["4px 8px 4px 0px 0px","16px"], +["8px 4px 1px 1px 0px","14px"], +["4px 8px 4px 0px 0px","16px"], +["8px 4px 1px 1px 0px","14px"], +["4px 8px 4px 0px 0px","16px"], +["6px 6px 4px 4px 4px","24px"], +["6px 6px 4px 4px 4px","24px"], +["6px 6px 4px 4px 4px","24px"], +["6px 6px 4px 4px 4px","24px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 8px 8px 8px","36px"], +["8px 4px 4px 8px 8px","32px"], +["4px 8px 8px 8px 8px","36px"], +["8px 4px 4px 8px 8px","32px"], +["4px 8px 8px 8px 8px","36px"], +["8px 4px 4px 8px 8px","32px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["6px 6px 4px 4px 4px","24px"], +["8px 4px 1px 1px 0px","14px"], +["4px 8px 4px 0px 0px","16px"], +["8px 4px 1px 1px 0px","14px"], +["4px 8px 4px 0px 0px","16px"], +["8px 4px 1px 1px 0px","14px"], +["4px 8px 4px 0px 0px","16px"], +["6px 6px 4px 4px 4px","24px"], +["6px 6px 4px 4px 4px","24px"], +["6px 6px 4px 4px 4px","24px"], +["6px 6px 4px 4px 4px","24px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 8px 8px 8px","36px"], +["8px 4px 4px 8px 8px","32px"], +["4px 8px 8px 8px 8px","36px"], +["8px 4px 4px 8px 8px","32px"], +["4px 8px 8px 8px 8px","36px"], +["8px 4px 4px 8px 8px","32px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["6px 6px 4px 4px 4px","24px"], +["8px 4px 1px 1px 0px","14px"], +["4px 8px 4px 0px 0px","16px"], +["8px 4px 1px 1px 0px","14px"], +["4px 8px 4px 0px 0px","16px"], +["8px 4px 1px 1px 0px","14px"], +["4px 8px 4px 0px 0px","16px"], +["6px 6px 4px 4px 4px","24px"], +["6px 6px 4px 4px 4px","24px"], +["6px 6px 4px 4px 4px","24px"], +["6px 6px 4px 4px 4px","24px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 8px 8px 8px","36px"], +["8px 4px 4px 8px 8px","32px"], +["4px 8px 8px 8px 8px","36px"], +["8px 4px 4px 8px 8px","32px"], +["4px 8px 8px 8px 8px","36px"], +["8px 4px 4px 8px 8px","32px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["4px 8px 0px 0px 0px","12px"], +["8px 4px 4px 0px 0px","16px"], +["6px 6px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["8px 8px 8px 8px 8px","40px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 8px 0px 0px","20px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 8px 0px 0px","20px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 8px 0px 0px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 8px 4px 4px","28px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 8px 4px 4px","28px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 8px 4px 4px","28px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 8px 8px 8px 8px","40px"], +["8px 8px 8px 8px 8px","40px"], +["8px 8px 8px 8px 8px","40px"], +["8px 8px 8px 8px 8px","40px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 8px 8px 8px 8px","40px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 8px 0px 0px","20px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 8px 0px 0px","20px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 8px 0px 0px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 8px 4px 4px","28px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 8px 4px 4px","28px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 8px 4px 4px","28px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 8px 8px 8px 8px","40px"], +["8px 8px 8px 8px 8px","40px"], +["8px 8px 8px 8px 8px","40px"], +["8px 8px 8px 8px 8px","40px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 8px 8px 8px 8px","40px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 8px 0px 0px","20px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 8px 0px 0px","20px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 8px 0px 0px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 8px 4px 4px","28px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 8px 4px 4px","28px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 8px 4px 4px","28px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 8px 8px 8px 8px","40px"], +["8px 8px 8px 8px 8px","40px"], +["8px 8px 8px 8px 8px","40px"], +["8px 8px 8px 8px 8px","40px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["8px 6px 0px 0px 0px","14px"], +["6px 8px 8px 0px 0px","22px"], +["6px 6px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["12px 0px 3px 3px 0px","18px"], +["0px 12px 0px 0px 0px","12px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["8px 4px 4px 4px 4px","24px"], +["4px 8px 0px 4px 4px","20px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 8px 8px 8px 8px","38px"], +["8px 6px 0px 8px 8px","30px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +["6px 6px 0px 0px 0px","12px"], +]; + +function test() { + ok(expected.length > 0, "sanity check"); + for (i = 0; i < expected.length; ++i) { + var msg = ""; + if (actual[i][0] != expected[i][0]) { + msg = "'grid-template-columns' for grid index " + i + ":\n" + [...document.querySelectorAll('.grid')][i].outerHTML; + is(actual[i][0], expected[i][0], msg); + } + if (actual[i][1] != expected[i][1]) { + msg = "'width' for grid index " + i + ":\n" + [...document.querySelectorAll('.grid')][i].outerHTML; + is(actual[i][1], expected[i][1], msg); + } + if (msg != "") { + i = expected.length; // stop after first failed grid by default + } + } + SimpleTest.finish(); +} + +</script> + +<script> +window.onload = function() { setTimeout(test, 0); }; +SimpleTest.waitForExplicitFinish(); +</script> + +</body> +</html> |