package dagro

import gosort 

func sortOrderEntries( []orderEntry,  bool) orderResult {
	return sortOrderEntriesWithReversedPairs(, nil, )
}

type reversedOrderPair struct {
	key   string
	entry orderEntry
}

func sortOrderEntriesWithReversedPairs( []orderEntry,  []reversedOrderPair,  bool) orderResult {
	 := make([]orderEntry, 0, len())
	 := make([]orderEntry, 0, len())
	for ,  := range  {
		if .HasBarycenter {
			 = append(, )
		} else {
			 = append(, )
		}
	}
	gosort.SliceStable(, func(,  int) bool { return -[].I < -[].I })
	gosort.SliceStable(, func(,  int) bool {
		 := []
		 := []
		if .Barycenter < .Barycenter {
			return true
		}
		if .Barycenter > .Barycenter {
			return false
		}
		if ! {
			return .I < .I
		}
		return .I > .I
	})

	// Keep a reversed edge dummy immediately after its parallel counterpart.
	// The pair slice preserves encounter order, including multiple reversed
	// dummies paired with the same forward dummy. Upstream's single object value
	// silently overwrites all but the last partner in that case.
	 := map[string]int{}
	for ,  := range  {
		 := -1
		for  := range  {
			if len([].VS) != 0 && [].VS[0] == .key {
				 = 
				break
			}
		}
		 :=  + 1 + [.key]
		 = append(, orderEntry{})
		copy([+1:], [:])
		[] = .entry
		[.key]++
	}

	 := make([]string, 0)
	 := 0.0
	 := 0.0
	 := 0
	 = consumeUnsortable(&, &, )
	for ,  := range  {
		 += len(.VS)
		 = append(, .VS...)
		 += .Barycenter * .Weight
		 += .Weight
		 = consumeUnsortable(&, &, )
	}

	 := orderResult{VS: }
	if jsTruthyNumber() {
		.Barycenter =  / 
		.Weight = 
		.HasBarycenter = true
	}
	return 
}

func consumeUnsortable( *[]string,  *[]orderEntry,  int) int {
	for len(*) != 0 {
		 := (*)[len(*)-1]
		if .I >  {
			break
		}
		* = (*)[:len(*)-1]
		* = append(*, .VS...)
		++
	}
	return 
}