| const PERMANENT_MARKER = 2 | 
| const TEMPORARY_MARKER = 1 | 
|   | 
| function createError(node, graph) { | 
|   const er = new Error("Nondeterministic import's order") | 
|   | 
|   const related = graph[node] | 
|   const relatedNode = related.find( | 
|     relatedNode => graph[relatedNode].indexOf(node) > -1 | 
|   ) | 
|   | 
|   er.nodes = [node, relatedNode] | 
|   | 
|   return er | 
| } | 
|   | 
| function walkGraph(node, graph, state, result, strict) { | 
|   if (state[node] === PERMANENT_MARKER) return | 
|   if (state[node] === TEMPORARY_MARKER) { | 
|     if (strict) return createError(node, graph) | 
|     return | 
|   } | 
|   | 
|   state[node] = TEMPORARY_MARKER | 
|   | 
|   const children = graph[node] | 
|   const length = children.length | 
|   | 
|   for (let i = 0; i < length; ++i) { | 
|     const er = walkGraph(children[i], graph, state, result, strict) | 
|     if (er instanceof Error) return er | 
|   } | 
|   | 
|   state[node] = PERMANENT_MARKER | 
|   | 
|   result.push(node) | 
| } | 
|   | 
| function topologicalSort(graph, strict) { | 
|   const result = [] | 
|   const state = {} | 
|   | 
|   const nodes = Object.keys(graph) | 
|   const length = nodes.length | 
|   | 
|   for (let i = 0; i < length; ++i) { | 
|     const er = walkGraph(nodes[i], graph, state, result, strict) | 
|     if (er instanceof Error) return er | 
|   } | 
|   | 
|   return result | 
| } | 
|   | 
| module.exports = topologicalSort |