[
  {
    "path": ".fourmolu.yaml",
    "content": "indentation: 2\ncolumn-limit: none\nfunction-arrows: trailing\ncomma-style: leading\nimport-export-style: diff-friendly\nindent-wheres: false\nrecord-brace-space: false\nnewlines-between-decls: 1\nhaddock-style: multi-line\nlet-style: auto\nin-style: right-align\nsingle-constraint-parens: auto\nunicode: never\nrespectful: true\n"
  },
  {
    "path": ".github/dependabot.yml",
    "content": "version: 2\nupdates:\n\n  # Maintain dependencies for GitHub Actions\n  - package-ecosystem: \"github-actions\"\n    directory: \"/\"\n    schedule:\n      interval: \"daily\"\n"
  },
  {
    "path": ".github/workflows/Cabal-Linux.yml",
    "content": "name: \"Hackage, Cabal, Linux\"\n\non:\n  pull_request:\n  push:\n    branches:\n      - master\n  schedule:\n    - cron: \"45 02 * * *\"\n\nenv:\n  cabalConfig: --enable-tests --enable-benchmarks --disable-optimization --enable-deterministic\n\njobs:\n\n  build10:\n    name: \"GHC\"\n    runs-on: ubuntu-latest\n    strategy:\n      fail-fast: false\n      matrix:\n        ghc:\n          [ \"9.10\" ]\n    steps:\n\n      - name: \"Git checkout\"\n        uses: actions/checkout@v4\n        with:\n          submodules: recursive\n\n      - name: \"Haskell env setup\"\n        id: HaskEnvSetup\n        uses: haskell-actions/setup@v2\n        with:\n          ghc-version: ${{ matrix.ghc }}\n\n      - name: \"Install additional system packages\"\n        run: sudo apt install libsodium-dev\n\n      #  2020-08-01: NOTE: Nix instantiate still needed for HNix tests\n      - name: \"Install Nix\"\n        uses: cachix/install-nix-action@v25\n\n      - name: \"Repository update\"\n        run: cabal v2-update\n\n      # Freeze is for the caching\n      - name: \"Configuration freeze\"\n        run: cabal v2-freeze $cabalConfig --minimize-conflict-set\n\n      - name: \"Configuring GitHub cache\"\n        uses: actions/cache@v3\n        with:\n          path: |\n            ${{ steps.HaskEnvSetup.outputs.cabal-store }}\n            dist-newstyle\n          key: ${{ runner.os }}-Cabal-${{ matrix.ghc }}-${{ hashFiles('cabal.project.freeze') }}\n          # 2022-04-22: `v2-` added to invalidate corrupted caches, can be removed after one week\n          restore-keys: ${{ runner.os }}-Cabal-${{ matrix.ghc }}-v2-\n\n      - name: \"Build\"\n        run: cabal v2-build $cabalConfig\n\n      - name: \"Tests\"\n        run: cabal v2-test $cabalConfig\n\n      - name: \"Haddock\"\n        if: ${{ matrix.ghc == '9.0' }}\n        run: cabal v2-haddock $cabalConfig\n\n      - name: \"Source distribution file\"\n        if: ${{ matrix.ghc == '9.0' }}\n        run: cabal v2-sdist\n"
  },
  {
    "path": ".github/workflows/HLint.yml",
    "content": "name: \"Checking code\"\n\non:\n  pull_request:\n  push:\n    branches:\n      - master\n\njobs:\n  build10:\n    name: \"HLint\"\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n\n    - name: 'Installing'\n      uses: haskell-actions/hlint-setup@v2\n      with:\n        version: '3.5'\n\n    - name: 'Checking code'\n      uses: haskell-actions/hlint-run@v2\n      with:\n        path: .\n        fail-on: warning\n"
  },
  {
    "path": ".github/workflows/On-Release-Cabal-Linux.yml",
    "content": "name: \"Release testing, Hackage, Cabal, Linux\"\n\non:\n  release:\n    # created: a draft is saved, or a release or pre-release is published without previously being saved as a draft\n    types: [ created ]\n\nenv:\n  cabalConfig: --enable-tests --enable-benchmarks --disable-optimization --enable-deterministic\n\njobs:\n\n  build10:\n    name: \"GHC\"\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        ghc: [ \"9.10\" ]\n    steps:\n      - name: \"Git checkout\"\n        uses: actions/checkout@v4\n        with:\n          submodules: recursive\n      - name: \"Haskell env setup\"\n        id: HaskEnvSetup\n        uses: haskell-actions/setup@v2\n        with:\n          ghc-version: ${{ matrix.ghc }}\n      - name: \"Install additional system packages\"\n        run: sudo apt install libsodium-dev\n      #  2020-08-01: NOTE: Nix instantiate still needed for HNix tests\n      - name: \"Install Nix\"\n        uses: cachix/install-nix-action@v25\n      - name: \"Repository update\"\n        run: cabal v2-update\n      # NOTE: Freeze is for the caching\n      - name: \"Configuration freeze\"\n        run: cabal v2-freeze $cabalConfig\n      - name: \"Configuring GitHub cache\"\n        uses: actions/cache@v3\n        with:\n          path: |\n            ${{ steps.HaskEnvSetup.outputs.cabal-store }}\n            dist-newstyle\n          key: ${{ runner.os }}-Cabal-${{ matrix.ghc }}-${{ hashFiles('cabal.project.freeze') }}\n          # 2022-04-22: `v2-` added to invalidate corrupted caches, can be removed after one week\n          restore-keys: ${{ runner.os }}-Cabal-${{ matrix.ghc }}-v2-\n      - name: \"Build\"\n        run: cabal v2-build $cabalConfig\n      - name: \"Tests\"\n        run: cabal v2-test $cabalConfig\n"
  },
  {
    "path": ".github/workflows/On-Release-Nixpkgs-integration.yml",
    "content": "name: \"Direct import & build inside Nixpkgs\"\n\non:\n  release:\n    # created: a draft is saved, or a release or pre-release is published without previously being saved as a draft\n    types: [ created ]\n\njobs:\n\n  build10:\n    name: \"Clean integration test\"\n    runs-on: ubuntu-latest\n    steps:\n    - name: \"Git checkout\"\n      uses: actions/checkout@v4\n    - name: \"Local cache\"\n      uses: actions/cache@v3\n      with:\n        path: |\n          /nix/store\n        key: ${{ runner.os }}-Nixpkgs-integration-test\n    - name: \"Install Nix\"\n      uses: cachix/install-nix-action@v25\n      with:\n        nix_path: \"nixpkgs=channel:nixos-unstable\"\n    - name: \"Run Nixpkgs integration test\"\n      uses: Anton-Latukha/test-haskell-nixpkgs-integration-action@v1\n"
  },
  {
    "path": ".github/workflows/Quality.yml",
    "content": "name: \"Quality checks\"\n\non:\n  pull_request:\n  push:\n    branches:\n      - master\n\njobs:\n  formatting:\n    name: \"Formatting (fourmolu)\"\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: cachix/install-nix-action@v25\n        with:\n          extra_nix_config: |\n            accept-flake-config = true\n      - name: \"Check Haskell formatting\"\n        run: nix build .#checks.x86_64-linux.formatting --print-build-logs\n      - name: \"Check shell script formatting\"\n        run: nix build .#checks.x86_64-linux.shell-formatting --print-build-logs\n\n  shellcheck:\n    name: \"ShellCheck\"\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: cachix/install-nix-action@v25\n        with:\n          extra_nix_config: |\n            accept-flake-config = true\n      - name: \"Lint shell scripts\"\n        run: nix build .#checks.x86_64-linux.shellcheck --print-build-logs\n\n  warnings:\n    name: \"Build (warnings as errors)\"\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          submodules: recursive\n      - uses: haskell-actions/setup@v2\n        with:\n          ghc-version: \"9.10\"\n      - uses: cachix/install-nix-action@v25\n      - run: sudo apt install libsodium-dev\n      - run: cabal v2-update\n      - name: \"Build with -Werror\"\n        run: >\n          cabal v2-build\n          --enable-tests --enable-benchmarks\n          --disable-optimization --enable-deterministic\n          --ghc-options=-Werror\n\n  haddock:\n    name: \"Documentation (Haddock)\"\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          submodules: recursive\n      - uses: haskell-actions/setup@v2\n        with:\n          ghc-version: \"9.10\"\n      - uses: cachix/install-nix-action@v25\n      - run: sudo apt install libsodium-dev\n      - run: cabal v2-update\n      - name: \"Build documentation\"\n        run: >\n          cabal v2-haddock\n          --disable-optimization --enable-deterministic\n      - name: \"Upload documentation\"\n        uses: actions/upload-artifact@v4\n        with:\n          name: haddock-docs\n          path: dist-newstyle/build/**/doc/\n\n  coverage:\n    name: \"Code coverage\"\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          submodules: recursive\n      - uses: haskell-actions/setup@v2\n        with:\n          ghc-version: \"9.10\"\n      - uses: cachix/install-nix-action@v25\n      - run: sudo apt install libsodium-dev\n      - run: cabal v2-update\n      - name: \"Build and test with coverage\"\n        run: |\n          cabal v2-configure --enable-tests --enable-coverage --disable-optimization\n          cabal v2-build\n          cabal v2-test\n      - name: \"Upload coverage report\"\n        uses: actions/upload-artifact@v4\n        with:\n          name: coverage-report\n          path: dist-newstyle/build/**/hpc/\n\n  benchmarks:\n    name: \"Benchmarks\"\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n        with:\n          submodules: recursive\n      - uses: haskell-actions/setup@v2\n        with:\n          ghc-version: \"9.10\"\n      - uses: cachix/install-nix-action@v25\n      - run: sudo apt install libsodium-dev\n      - run: cabal v2-update\n      - name: \"Run benchmarks\"\n        run: |\n          cabal v2-build --enable-benchmarks --disable-optimization\n          cabal v2-bench 2>&1 | tee benchmark-results.txt\n      - name: \"Upload benchmark results\"\n        uses: actions/upload-artifact@v4\n        with:\n          name: benchmark-results\n          path: benchmark-results.txt\n\n  nix-build:\n    name: \"Nix build\"\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v4\n      - uses: cachix/install-nix-action@v25\n        with:\n          extra_nix_config: |\n            accept-flake-config = true\n      - name: \"Build with Nix\"\n        run: nix build --print-build-logs\n"
  },
  {
    "path": ".gitignore",
    "content": "**/#*\n**/*~\n**/.#*\n/.history\n/Setup\n/dist/\n/nix-test-eval*\n/nix/\nTAGS\ncabal.project.local\nctags\ndist-newstyle\nresult*\n.ghc.environment.*\n.hnixrc\n"
  },
  {
    "path": ".gitmodules",
    "content": ""
  },
  {
    "path": ".hlint.yaml",
    "content": "- group: {name: generalise, enabled: true}\n- group: {name: future, enabled: true}\n- group: {name: attoparsec, enabled: true}\n- group: {name: use-lens, enabled: true}\n- arguments:\n  - \"-XConstraintKinds\"\n  - \"-XDeriveGeneric\"\n  - \"-XGeneralizedNewtypeDeriving\"\n  - \"-XLambdaCase\"\n  - \"-XOverloadedStrings\"\n  - \"-XRecordWildCards\"\n  - \"-XScopedTypeVariables\"\n  - \"-XStandaloneDeriving\"\n  - \"-XTupleSections\"\n  - \"-XTypeApplications\"\n  - \"-XViewPatterns\"\n- ignore:\n    name: Use unless\n- ignore:\n    name: Use head\n- ignore:\n    name: Use Foldable.forM_\n- hint:\n    lhs: \"pure mempty\"\n    note: \"Use 'stub'\"\n    rhs: stub\n\n- hint:\n    lhs: \"[]\"\n    note: \"Use `mempty`\"\n    rhs: mempty\n\n- hint:\n    lhs: \"(: mempty)\"\n    note: \"Use `one`\"\n    rhs: one\n- hint:\n    lhs: \"(:| mempty)\"\n    note: \"Use `one`\"\n    rhs: one\n\n- hint:\n    lhs: Data.Sequence.singleton\n    note: \"Use `one`\"\n    rhs: one\n- hint:\n    lhs: Data.Text.singleton\n    note: \"Use `one`\"\n    rhs: one\n- hint:\n    lhs: Data.Text.Lazy.singleton\n    note: \"Use `one`\"\n    rhs: one\n- hint:\n    lhs: Data.ByteString.singleton\n    note: \"Use `one`\"\n    rhs: one\n- hint:\n    lhs: Data.ByteString.Lazy.singleton\n    note: \"Use `one`\"\n    rhs: one\n- hint:\n    lhs: Data.Map.singleton\n    note: \"Use `one`\"\n    rhs: one\n- hint:\n    lhs: Data.Map.Strict.singleton\n    note: \"Use `one`\"\n    rhs: one\n- hint:\n    lhs: Data.HashMap.Strict.singleton\n    note: \"Use `one`\"\n    rhs: one\n- hint:\n    lhs: Data.HashMap.Lazy.singleton\n    note: \"Use `one`\"\n    rhs: one\n- hint:\n    lhs: Data.IntMap.singleton\n    note: \"Use `one`\"\n    rhs: one\n- hint:\n    lhs: Data.IntMap.Strict.singleton\n    note: \"Use `one`\"\n    rhs: one\n- hint:\n    lhs: Data.Set.singleton\n    note: \"Use `one`\"\n    rhs: one\n- hint:\n    lhs: Data.HashSet.singleton\n    note: \"Use `one`\"\n    rhs: one\n- hint:\n    lhs: Data.IntSet.singleton\n    note: \"Use `one`\"\n    rhs: one\n- warn:\n    lhs: \"Control.Exception.evaluate (x `deepseq` mempty)\"\n    rhs: evaluateNF_ x\n- warn:\n    lhs: \"void (evaluateWHNF x)\"\n    rhs: evaluateWHNF_ x\n- warn:\n    lhs: \"void (evaluateNF x)\"\n    rhs: evaluateNF_ x\n- warn:\n    lhs: \"foldl' (+) 0\"\n    rhs: sum\n- warn:\n    lhs: \"foldl' (*) 1\"\n    rhs: product\n- hint:\n    lhs: \"fmap and (sequenceA s)\"\n    note: Applying this hint would mean that some actions that were being executed previously would no longer be executed.\n    rhs: andM s\n- hint:\n    lhs: \"and <$> sequenceA s\"\n    note: Applying this hint would mean that some actions that were being executed previously would no longer be executed.\n    rhs: andM s\n- hint:\n    lhs: \"fmap or (sequenceA s)\"\n    note: Applying this hint would mean that some actions that were being executed previously would no longer be executed.\n    rhs: orM s\n- hint:\n    lhs: \"or <$> sequenceA s\"\n    note: Applying this hint would mean that some actions that were being executed previously would no longer be executed.\n    rhs: orM s\n- hint:\n    lhs: \"fmap and (traversable f s)\"\n    note: Applying this hint would mean that some actions that were being executed previously would no longer be executed.\n    rhs: allM f s\n- hint:\n    lhs: \"and <$> traversable f s\"\n    note: Applying this hint would mean that some actions that were being executed previously would no longer be executed.\n    rhs: allM f s\n- hint:\n    lhs: \"fmap or (traversable f s)\"\n    note: Applying this hint would mean that some actions that were being executed previously would no longer be executed.\n    rhs: anyM f s\n- hint:\n    lhs: \"or <$> traversable f s\"\n    note: Applying this hint would mean that some actions that were being executed previously would no longer be executed.\n    rhs: anyM f s\n- warn:\n    lhs: \"getAlt (foldMap (Alt . f) xs)\"\n    rhs: asumMap xs\n- warn:\n    lhs: \"getAlt . foldMap (Alt . f)\"\n    rhs: asumMap\n- hint:\n    lhs: \"foldr (\\\\x acc -> f x <|> acc) empty\"\n    note: \"Use 'asumMap'\"\n    rhs: asumMap f\n- hint:\n    lhs: \"asum (fmap f xs)\"\n    note: \"Use 'asumMap'\"\n    rhs: asumMap f xs\n- warn:\n    lhs: \"fmap fst &&& fmap snd\"\n    rhs: unzip\n- hint:\n    lhs: \"fmap (fmap f) x\"\n    note: \"Use '(<<$>>)'\"\n    rhs: \"f <<$>> x\"\n- warn:\n    lhs: \"fmap f (nonEmpty x)\"\n    rhs: viaNonEmpty f x\n- warn:\n    lhs: fmap f . nonEmpty\n    rhs: viaNonEmpty f\n- warn:\n    lhs: \"f <$> nonEmpty x\"\n    rhs: viaNonEmpty f x\n- warn:\n    lhs: partitionEithers . fmap f\n    rhs: partitionWith f\n- warn:\n    lhs: partitionEithers $ fmap f x\n    rhs: partitionWith f x\n- warn:\n    lhs: forever\n    note: \"'forever' is loosely typed and may hide errors\"\n    rhs: infinitely\n- warn:\n    lhs: \"unlessM (not <$> x)\"\n    rhs: whenM x\n- warn:\n    lhs: \"either (const True) (const False)\"\n    rhs: isLeft\n- warn:\n    lhs: \"either (const False) (const True)\"\n    rhs: isRight\n- warn:\n    lhs: \"either id (const a)\"\n    rhs: fromLeft a\n- warn:\n    lhs: \"either (const b) id\"\n    rhs: fromRight b\n- warn:\n    lhs: \"either Just (const Nothing)\"\n    rhs: leftToMaybe\n- warn:\n    lhs: \"either (const Nothing) Just\"\n    rhs: rightToMaybe\n- warn:\n    lhs: \"maybe (Left l) Right\"\n    rhs: maybeToRight l\n- warn:\n    lhs: \"maybe (Right r) Left\"\n    rhs: maybeToLeft r\n- warn:\n    lhs: \"case m of [] -> stub ; (x:xs) -> f (x :| xs)\"\n    rhs: whenNotNull m f\n- warn:\n    lhs: \"case m of (x:xs) -> f (x :| xs); [] -> stub\"\n    rhs: whenNotNull m f\n- warn:\n    lhs: \"m >>= \\\\case [] -> stub ; (x:xs) -> f (x :| xs)\"\n    rhs: whenNotNullM m f\n- warn:\n    lhs: \"m >>= \\\\case (x:xs) -> f (x :| xs); [] -> stub\"\n    rhs: whenNotNullM m f\n- warn:\n    lhs: mapMaybe leftToMaybe\n    rhs: lefts\n- warn:\n    lhs: mapMaybe rightToMaybe\n    rhs: rights\n- warn:\n    lhs: flip runReaderT\n    rhs: usingReaderT\n- warn:\n    lhs: flip runReader\n    rhs: usingReader\n- warn:\n    lhs: flip runStateT\n    rhs: usingStateT\n- warn:\n    lhs: flip runState\n    rhs: usingState\n- warn:\n    lhs: \"fst <$> usingStateT s st\"\n    rhs: evaluatingStateT s st\n- warn:\n    lhs: \"fst (usingState s st)\"\n    rhs: evaluatingState s st\n- warn:\n    lhs: \"snd <$> usingStateT s st\"\n    rhs: executingStateT s st\n- warn:\n    lhs: \"snd (usingState s st)\"\n    rhs: executingState s st\n- warn:\n    lhs: \"MaybeT (pure m)\"\n    rhs: hoistMaybe m\n- warn:\n    lhs: MaybeT . pure\n    rhs: hoistMaybe\n- warn:\n    lhs: \"ExceptT (pure m)\"\n    rhs: hoistEither m\n- warn:\n    lhs: ExceptT . pure\n    rhs: hoistEither\n- warn:\n    lhs: fromMaybe mempty\n    rhs: maybeToMonoid\n- warn:\n    lhs: \"m ?: mempty\"\n    rhs: maybeToMonoid m\n- warn:\n    lhs: \"Data.Map.toAscList (Data.Map.fromList x)\"\n    rhs: sortWith fst x\n- warn:\n    lhs: \"Data.Map.toDescList (Data.Map.fromList x)\"\n    rhs: \"sortWith (Down . fst) x\"\n- warn:\n    lhs: \"Data.Set.toList (Data.Set.fromList l)\"\n    rhs: sortNub l\n- warn:\n    lhs: \"Data.Set.assocs (Data.Set.fromList l)\"\n    rhs: sortNub l\n- warn:\n    lhs: \"Data.Set.toAscList (Data.Set.fromList l)\"\n    rhs: sortNub l\n- warn:\n    lhs: \"Data.HashSet.toList (Data.HashSet.fromList l)\"\n    rhs: unstableNub l\n- warn:\n    lhs: nub\n    note: \"'nub' is O(n^2), 'ordNub' is O(n log n)\"\n    rhs: ordNub\n- warn:\n    lhs: \"sortBy (comparing f)\"\n    note: \"If the function you are using for 'comparing' is slow, use 'sortOn' instead of 'sortWith', because 'sortOn' caches applications the function and 'sortWith' doesn't.\"\n    rhs: sortWith f\n- warn:\n    lhs: sortOn fst\n    note: \"'sortWith' will be faster here because it doesn't do caching\"\n    rhs: sortWith fst\n- warn:\n    lhs: sortOn snd\n    note: \"'sortWith' will be faster here because it doesn't do caching\"\n    rhs: sortWith snd\n- warn:\n    lhs: \"sortOn (Down . fst)\"\n    note: \"'sortWith' will be faster here because it doesn't do caching\"\n    rhs: \"sortWith (Down . fst)\"\n- warn:\n    lhs: \"sortOn (Down . snd)\"\n    note: \"'sortWith' will be faster here because it doesn't do caching\"\n    rhs: \"sortWith (Down . snd)\"\n- warn:\n    lhs: Data.Text.Lazy.IO.putStr\n    rhs: putLText\n- warn:\n    lhs: Data.Text.Lazy.IO.putStrLn\n    rhs: putLTextLn\n- warn:\n    lhs: Data.ByteString.Char8.putStr\n    rhs: putBS\n- warn:\n    lhs: Data.ByteString.Char8.putStrLn\n    rhs: putBSLn\n- warn:\n    lhs: Data.ByteString.Lazy.Char8.putStr\n    rhs: putLBS\n- warn:\n    lhs: Data.ByteString.Lazy.Char8.putStrLn\n    rhs: putLBSLn\n- warn:\n    lhs: Data.Text.Lazy.Text\n    rhs: LText\n- warn:\n    lhs: Data.ByteString.Lazy.ByteString\n    rhs: LByteString\n- warn:\n    lhs: Data.ByteString.UTF8.fromString\n    rhs: encodeUtf8\n- warn:\n    lhs: Data.ByteString.UTF8.toString\n    rhs: decodeUtf8\n- warn:\n    lhs: Data.Text.Encoding.encodeUtf8\n    rhs: encodeUtf8\n- warn:\n    lhs: Data.Text.Encoding.decodeUtf8\n    rhs: decodeUtf8\n- warn:\n    lhs: \"Data.ByteString.Lazy.toStrict (encodeUtf8 x)\"\n    rhs: encodeUtf8 x\n- warn:\n    lhs: \"toStrict (encodeUtf8 x)\"\n    rhs: encodeUtf8 x\n- warn:\n    lhs: \"decodeUtf8 (Data.ByteString.Lazy.fromStrict x)\"\n    rhs: decodeUtf8 x\n- warn:\n    lhs: \"decodeUtf8 (fromStrict x)\"\n    rhs: decodeUtf8 x\n- warn:\n    lhs: Data.ByteString.Lazy.UTF8.fromString\n    rhs: encodeUtf8\n- warn:\n    lhs: Data.ByteString.Lazy.UTF8.toString\n    rhs: decodeUtf8\n- warn:\n    lhs: \"Data.ByteString.Lazy.fromStrict (Data.Text.Encoding.encodeUtf8 x)\"\n    rhs: encodeUtf8 x\n- warn:\n    lhs: \"Data.ByteString.Lazy.fromStrict (encodeUtf8 x)\"\n    rhs: encodeUtf8 x\n- warn:\n    lhs: \"Data.Text.Encoding.decodeUtf8 (Data.ByteString.Lazy.toStrict x)\"\n    rhs: decodeUtf8 x\n- warn:\n    lhs: \"Data.Text.Encoding.decodeUtf8 (toStrict x)\"\n    rhs: decodeUtf8 x\n- warn:\n    lhs: \"decodeUtf8 (Data.ByteString.Lazy.toStrict x)\"\n    rhs: decodeUtf8 x\n- warn:\n    lhs: \"decodeUtf8 (toStrict x)\"\n    rhs: decodeUtf8 x\n- warn:\n    lhs: Data.Text.pack\n    rhs: toText\n- warn:\n    lhs: Data.Text.unpack\n    rhs: toString\n- warn:\n    lhs: Data.Text.Lazy.pack\n    rhs: toLText\n- warn:\n    lhs: Data.Text.Lazy.unpack\n    rhs: toString\n- warn:\n    lhs: Data.Text.Lazy.toStrict\n    rhs: toText\n- warn:\n    lhs: Data.Text.Lazy.fromStrict\n    rhs: toLText\n- warn:\n    lhs: \"Data.Text.pack (show x)\"\n    rhs: show x\n- warn:\n    lhs: \"Data.Text.Lazy.pack (show x)\"\n    rhs: show x\n- warn:\n    lhs: Data.ByteString.Lazy.fromStrict\n    rhs: fromStrict\n- warn:\n    lhs: Data.ByteString.Lazy.toStrict\n    rhs: toStrict\n- warn:\n    lhs: Data.Text.Lazy.fromStrict\n    rhs: fromStrict\n- warn:\n    lhs: Data.Text.Lazy.toStrict\n    rhs: toStrict\n- warn:\n    lhs: Control.Applicative.Alternative\n    name: \"Use 'Alternative' from Relude\"\n    note: \"'Alternative' is already exported from Relude\"\n    rhs: Alternative\n- warn:\n    lhs: Control.Applicative.empty\n    name: \"Use 'empty' from Relude\"\n    note: \"'empty' is already exported from Relude\"\n    rhs: empty\n- warn:\n    lhs: \"(Control.Applicative.<|>)\"\n    name: \"Use '<|>' from Relude\"\n    note: \"Operator '(<|>)' is already exported from Relude\"\n    rhs: \"(<|>)\"\n- warn:\n    lhs: Control.Applicative.some\n    name: \"Use 'some' from Relude\"\n    note: \"'some' is already exported from Relude\"\n    rhs: some\n- warn:\n    lhs: Control.Applicative.many\n    name: \"Use 'many' from Relude\"\n    note: \"'many' is already exported from Relude\"\n    rhs: many\n- warn:\n    lhs: Control.Applicative.Const\n    name: \"Use 'Const' from Relude\"\n    note: \"'Const' is already exported from Relude\"\n    rhs: Const\n- warn:\n    lhs: Control.Applicative.getConst\n    name: \"Use 'getConst' from Relude\"\n    note: \"'getConst' is already exported from Relude\"\n    rhs: getConst\n- warn:\n    lhs: Control.Applicative.ZipList\n    name: \"Use 'ZipList' from Relude\"\n    note: \"'ZipList' is already exported from Relude\"\n    rhs: ZipList\n- warn:\n    lhs: Control.Applicative.getZipList\n    name: \"Use 'getZipList' from Relude\"\n    note: \"'getZipList' is already exported from Relude\"\n    rhs: getZipList\n- warn:\n    lhs: Control.Applicative.liftA2\n    name: \"Use 'liftA2' from Relude\"\n    note: \"'liftA2' is already exported from Relude\"\n    rhs: liftA2\n- warn:\n    lhs: Control.Applicative.liftA3\n    name: \"Use 'liftA3' from Relude\"\n    note: \"'liftA3' is already exported from Relude\"\n    rhs: liftA3\n- warn:\n    lhs: Control.Applicative.optional\n    name: \"Use 'optional' from Relude\"\n    note: \"'optional' is already exported from Relude\"\n    rhs: optional\n- warn:\n    lhs: \"(Control.Applicative.<**>)\"\n    name: \"Use '<**>' from Relude\"\n    note: \"Operator '(<**>)' is already exported from Relude\"\n    rhs: \"(<**>)\"\n- warn:\n    lhs: Data.Char.chr\n    name: \"Use 'chr' from Relude\"\n    note: \"'chr' is already exported from Relude\"\n    rhs: chr\n- warn:\n    lhs: Data.Int.Int8\n    name: \"Use 'Int8' from Relude\"\n    note: \"'Int8' is already exported from Relude\"\n    rhs: Int8\n- warn:\n    lhs: Data.Int.Int16\n    name: \"Use 'Int16' from Relude\"\n    note: \"'Int16' is already exported from Relude\"\n    rhs: Int16\n- warn:\n    lhs: Data.Int.Int32\n    name: \"Use 'Int32' from Relude\"\n    note: \"'Int32' is already exported from Relude\"\n    rhs: Int32\n- warn:\n    lhs: Data.Int.Int64\n    name: \"Use 'Int64' from Relude\"\n    note: \"'Int64' is already exported from Relude\"\n    rhs: Int64\n- warn:\n    lhs: Data.Word.Word8\n    name: \"Use 'Word8' from Relude\"\n    note: \"'Word8' is already exported from Relude\"\n    rhs: Word8\n- warn:\n    lhs: Data.Word.Word16\n    name: \"Use 'Word16' from Relude\"\n    note: \"'Word16' is already exported from Relude\"\n    rhs: Word16\n- warn:\n    lhs: Data.Word.Word32\n    name: \"Use 'Word32' from Relude\"\n    note: \"'Word32' is already exported from Relude\"\n    rhs: Word32\n- warn:\n    lhs: Data.Word.Word64\n    name: \"Use 'Word64' from Relude\"\n    note: \"'Word64' is already exported from Relude\"\n    rhs: Word64\n- warn:\n    lhs: Data.Word.byteSwap16\n    name: \"Use 'byteSwap16' from Relude\"\n    note: \"'byteSwap16' is already exported from Relude\"\n    rhs: byteSwap16\n- warn:\n    lhs: Data.Word.byteSwap32\n    name: \"Use 'byteSwap32' from Relude\"\n    note: \"'byteSwap32' is already exported from Relude\"\n    rhs: byteSwap32\n- warn:\n    lhs: Data.Word.byteSwap64\n    name: \"Use 'byteSwap64' from Relude\"\n    note: \"'byteSwap64' is already exported from Relude\"\n    rhs: byteSwap64\n- warn:\n    lhs: Numeric.Natural.Natural\n    name: \"Use 'Natural' from Relude\"\n    note: \"'Natural' is already exported from Relude\"\n    rhs: Natural\n- warn:\n    lhs: System.IO.IOMode\n    name: \"Use 'IOMode' from Relude\"\n    note: \"'IOMode' is already exported from Relude\"\n    rhs: IOMode\n- warn:\n    lhs: System.IO.ReadMode\n    name: \"Use 'ReadMode' from Relude\"\n    note: \"'ReadMode' is already exported from Relude\"\n    rhs: ReadMode\n- warn:\n    lhs: System.IO.WriteMode\n    name: \"Use 'WriteMode' from Relude\"\n    note: \"'WriteMode' is already exported from Relude\"\n    rhs: WriteMode\n- warn:\n    lhs: System.IO.AppendMode\n    name: \"Use 'AppendMode' from Relude\"\n    note: \"'AppendMode' is already exported from Relude\"\n    rhs: AppendMode\n- warn:\n    lhs: System.IO.ReadWriteMode\n    name: \"Use 'ReadWriteMode' from Relude\"\n    note: \"'ReadWriteMode' is already exported from Relude\"\n    rhs: ReadWriteMode\n- warn:\n    lhs: Data.Ord.Down\n    name: \"Use 'Down' from Relude\"\n    note: \"'Down' is already exported from Relude\"\n    rhs: Down\n- warn:\n    lhs: Data.Ord.comparing\n    name: \"Use 'comparing' from Relude\"\n    note: \"'comparing' is already exported from Relude\"\n    rhs: comparing\n- warn:\n    lhs: Data.Coerce.Coercible\n    name: \"Use 'Coercible' from Relude\"\n    note: \"'Coercible' is already exported from Relude\"\n    rhs: Coercible\n- warn:\n    lhs: Data.Coerce.coerce\n    name: \"Use 'coerce' from Relude\"\n    note: \"'coerce' is already exported from Relude\"\n    rhs: coerce\n- warn:\n    lhs: Data.Kind.Constraint\n    name: \"Use 'Constraint' from Relude\"\n    note: \"'Constraint' is already exported from Relude\"\n    rhs: Constraint\n- warn:\n    lhs: Data.Kind.Type\n    name: \"Use 'Type' from Relude\"\n    note: \"'Type' is already exported from Relude\"\n    rhs: Type\n- warn:\n    lhs: Data.Typeable.Typeable\n    name: \"Use 'Typeable' from Relude\"\n    note: \"'Typeable' is already exported from Relude\"\n    rhs: Typeable\n- warn:\n    lhs: Data.Proxy.Proxy\n    name: \"Use 'Proxy' from Relude\"\n    note: \"'Proxy' is already exported from Relude\"\n    rhs: Proxy\n- warn:\n    lhs: Data.Typeable.Typeable\n    name: \"Use 'Typeable' from Relude\"\n    note: \"'Typeable' is already exported from Relude\"\n    rhs: Typeable\n- warn:\n    lhs: Data.Void.Void\n    name: \"Use 'Void' from Relude\"\n    note: \"'Void' is already exported from Relude\"\n    rhs: Void\n- warn:\n    lhs: Data.Void.absurd\n    name: \"Use 'absurd' from Relude\"\n    note: \"'absurd' is already exported from Relude\"\n    rhs: absurd\n- warn:\n    lhs: Data.Void.vacuous\n    name: \"Use 'vacuous' from Relude\"\n    note: \"'vacuous' is already exported from Relude\"\n    rhs: vacuous\n- warn:\n    lhs: Data.Base.maxInt\n    name: \"Use 'maxInt' from Relude\"\n    note: \"'maxInt' is already exported from Relude\"\n    rhs: maxInt\n- warn:\n    lhs: Data.Base.minInt\n    name: \"Use 'minInt' from Relude\"\n    note: \"'minInt' is already exported from Relude\"\n    rhs: minInt\n- warn:\n    lhs: Data.Base.ord\n    name: \"Use 'ord' from Relude\"\n    note: \"'ord' is already exported from Relude\"\n    rhs: ord\n- warn:\n    lhs: GHC.Enum.boundedEnumFrom\n    name: \"Use 'boundedEnumFrom' from Relude\"\n    note: \"'boundedEnumFrom' is already exported from Relude\"\n    rhs: boundedEnumFrom\n- warn:\n    lhs: GHC.Enum.boundedEnumFromThen\n    name: \"Use 'boundedEnumFromThen' from Relude\"\n    note: \"'boundedEnumFromThen' is already exported from Relude\"\n    rhs: boundedEnumFromThen\n- warn:\n    lhs: GHC.Generics.Generic\n    name: \"Use 'Generic' from Relude\"\n    note: \"'Generic' is already exported from Relude\"\n    rhs: Generic\n- warn:\n    lhs: GHC.Real.Ratio\n    name: \"Use 'Ratio' from Relude\"\n    note: \"'Ratio' is already exported from Relude\"\n    rhs: Ratio\n- warn:\n    lhs: GHC.Real.Rational\n    name: \"Use 'Rational' from Relude\"\n    note: \"'Rational' is already exported from Relude\"\n    rhs: Rational\n- warn:\n    lhs: GHC.Real.denominator\n    name: \"Use 'denominator' from Relude\"\n    note: \"'denominator' is already exported from Relude\"\n    rhs: denominator\n- warn:\n    lhs: GHC.Real.numerator\n    name: \"Use 'numerator' from Relude\"\n    note: \"'numerator' is already exported from Relude\"\n    rhs: numerator\n- warn:\n    lhs: GHC.TypeNats.CmpNat\n    name: \"Use 'CmpNat' from Relude\"\n    note: \"'CmpNat' is already exported from Relude\"\n    rhs: CmpNat\n- warn:\n    lhs: GHC.TypeNats.KnownNat\n    name: \"Use 'KnownNat' from Relude\"\n    note: \"'KnownNat' is already exported from Relude\"\n    rhs: KnownNat\n- warn:\n    lhs: GHC.TypeNats.Nat\n    name: \"Use 'Nat' from Relude\"\n    note: \"'Nat' is already exported from Relude\"\n    rhs: Nat\n- warn:\n    lhs: GHC.TypeNats.SomeNat\n    name: \"Use 'SomeNat' from Relude\"\n    note: \"'SomeNat' is already exported from Relude\"\n    rhs: SomeNat\n- warn:\n    lhs: GHC.TypeNats.natVal\n    name: \"Use 'natVal' from Relude\"\n    note: \"'natVal' is already exported from Relude\"\n    rhs: natVal\n- warn:\n    lhs: GHC.TypeNats.someNatVal\n    name: \"Use 'someNatVal' from Relude\"\n    note: \"'someNatVal' is already exported from Relude\"\n    rhs: someNatVal\n- warn:\n    lhs: GHC.TypeLits.CmpNat\n    name: \"Use 'CmpNat' from Relude\"\n    note: \"'CmpNat' is already exported from Relude\"\n    rhs: CmpNat\n- warn:\n    lhs: GHC.TypeLits.KnownNat\n    name: \"Use 'KnownNat' from Relude\"\n    note: \"'KnownNat' is already exported from Relude\"\n    rhs: KnownNat\n- warn:\n    lhs: GHC.TypeLits.Nat\n    name: \"Use 'Nat' from Relude\"\n    note: \"'Nat' is already exported from Relude\"\n    rhs: Nat\n- warn:\n    lhs: GHC.TypeLits.SomeNat\n    name: \"Use 'SomeNat' from Relude\"\n    note: \"'SomeNat' is already exported from Relude\"\n    rhs: SomeNat\n- warn:\n    lhs: GHC.TypeLits.natVal\n    name: \"Use 'natVal' from Relude\"\n    note: \"'natVal' is already exported from Relude\"\n    rhs: natVal\n- warn:\n    lhs: GHC.TypeLits.someNatVal\n    name: \"Use 'someNatVal' from Relude\"\n    note: \"'someNatVal' is already exported from Relude\"\n    rhs: someNatVal\n- warn:\n    lhs: GHC.ExecutionStack.getStackTrace\n    name: \"Use 'getStackTrace' from Relude\"\n    note: \"'getStackTrace' is already exported from Relude\"\n    rhs: getStackTrace\n- warn:\n    lhs: GHC.ExecutionStack.showStackTrace\n    name: \"Use 'showStackTrace' from Relude\"\n    note: \"'showStackTrace' is already exported from Relude\"\n    rhs: showStackTrace\n- warn:\n    lhs: GHC.OverloadedLabels.IsLabel\n    name: \"Use 'IsLabel' from Relude\"\n    note: \"'IsLabel' is already exported from Relude\"\n    rhs: IsLabel\n- warn:\n    lhs: GHC.OverloadedLabels.fromLabel\n    name: \"Use 'fromLabel' from Relude\"\n    note: \"'fromLabel' is already exported from Relude\"\n    rhs: fromLabel\n- warn:\n    lhs: GHC.Stack.CallStack\n    name: \"Use 'CallStack' from Relude\"\n    note: \"'CallStack' is already exported from Relude\"\n    rhs: CallStack\n- warn:\n    lhs: GHC.Stack.HasCallStack\n    name: \"Use 'HasCallStack' from Relude\"\n    note: \"'HasCallStack' is already exported from Relude\"\n    rhs: HasCallStack\n- warn:\n    lhs: GHC.Stack.callStack\n    name: \"Use 'callStack' from Relude\"\n    note: \"'callStack' is already exported from Relude\"\n    rhs: callStack\n- warn:\n    lhs: GHC.Stack.currentCallStack\n    name: \"Use 'currentCallStack' from Relude\"\n    note: \"'currentCallStack' is already exported from Relude\"\n    rhs: currentCallStack\n- warn:\n    lhs: GHC.Stack.getCallStack\n    name: \"Use 'getCallStack' from Relude\"\n    note: \"'getCallStack' is already exported from Relude\"\n    rhs: getCallStack\n- warn:\n    lhs: GHC.Stack.prettyCallStack\n    name: \"Use 'prettyCallStack' from Relude\"\n    note: \"'prettyCallStack' is already exported from Relude\"\n    rhs: prettyCallStack\n- warn:\n    lhs: GHC.Stack.prettySrcLoc\n    name: \"Use 'prettySrcLoc' from Relude\"\n    note: \"'prettySrcLoc' is already exported from Relude\"\n    rhs: prettySrcLoc\n- warn:\n    lhs: GHC.Stack.withFrozenCallStack\n    name: \"Use 'withFrozenCallStack' from Relude\"\n    note: \"'withFrozenCallStack' is already exported from Relude\"\n    rhs: withFrozenCallStack\n- warn:\n    lhs: Data.Bifoldable.Bifoldable\n    name: \"Use 'Bifoldable' from Relude\"\n    note: \"'Bifoldable' is already exported from Relude\"\n    rhs: Bifoldable\n- warn:\n    lhs: Data.Bifoldable.bifold\n    name: \"Use 'bifold' from Relude\"\n    note: \"'bifold' is already exported from Relude\"\n    rhs: bifold\n- warn:\n    lhs: Data.Bifoldable.bifoldMap\n    name: \"Use 'bifoldMap' from Relude\"\n    note: \"'bifoldMap' is already exported from Relude\"\n    rhs: bifoldMap\n- warn:\n    lhs: Data.Bifoldable.bifoldr\n    name: \"Use 'bifoldr' from Relude\"\n    note: \"'bifoldr' is already exported from Relude\"\n    rhs: bifoldr\n- warn:\n    lhs: Data.Bifoldable.bifoldl\n    name: \"Use 'bifoldl' from Relude\"\n    note: \"'bifoldl' is already exported from Relude\"\n    rhs: bifoldl\n- warn:\n    lhs: \"Data.Bifoldable.bifoldl'\"\n    name: \"Use 'bifoldl'' from Relude\"\n    note: \"'bifoldl'' is already exported from Relude\"\n    rhs: \"bifoldl'\"\n- warn:\n    lhs: Data.Bifoldable.bifoldlM\n    name: \"Use 'bifoldlM' from Relude\"\n    note: \"'bifoldlM' is already exported from Relude\"\n    rhs: bifoldlM\n- warn:\n    lhs: \"Data.Bifoldable.bifoldr'\"\n    name: \"Use 'bifoldr'' from Relude\"\n    note: \"'bifoldr'' is already exported from Relude\"\n    rhs: \"bifoldr'\"\n- warn:\n    lhs: Data.Bifoldable.bifoldrM\n    name: \"Use 'bifoldrM' from Relude\"\n    note: \"'bifoldrM' is already exported from Relude\"\n    rhs: bifoldrM\n- warn:\n    lhs: Data.Bifoldable.bitraverse_\n    name: \"Use 'bitraverse_' from Relude\"\n    note: \"'bitraverse_' is already exported from Relude\"\n    rhs: bitraverse_\n- warn:\n    lhs: Data.Bifoldable.bifor_\n    name: \"Use 'bifor_' from Relude\"\n    note: \"'bifor_' is already exported from Relude\"\n    rhs: bifor_\n- warn:\n    lhs: Data.Bifoldable.biasum\n    name: \"Use 'biasum' from Relude\"\n    note: \"'biasum' is already exported from Relude\"\n    rhs: biasum\n- warn:\n    lhs: Data.Bifoldable.bisequence_\n    name: \"Use 'bisequence_' from Relude\"\n    note: \"'bisequence_' is already exported from Relude\"\n    rhs: bisequence_\n- warn:\n    lhs: Data.Bifoldable.biList\n    name: \"Use 'biList' from Relude\"\n    note: \"'biList' is already exported from Relude\"\n    rhs: biList\n- warn:\n    lhs: Data.Bifoldable.binull\n    name: \"Use 'binull' from Relude\"\n    note: \"'binull' is already exported from Relude\"\n    rhs: binull\n- warn:\n    lhs: Data.Bifoldable.bilength\n    name: \"Use 'bilength' from Relude\"\n    note: \"'bilength' is already exported from Relude\"\n    rhs: bilength\n- warn:\n    lhs: Data.Bifoldable.bielem\n    name: \"Use 'bielem' from Relude\"\n    note: \"'bielem' is already exported from Relude\"\n    rhs: bielem\n- warn:\n    lhs: Data.Bifoldable.biand\n    name: \"Use 'biand' from Relude\"\n    note: \"'biand' is already exported from Relude\"\n    rhs: biand\n- warn:\n    lhs: Data.Bifoldable.bior\n    name: \"Use 'bior' from Relude\"\n    note: \"'bior' is already exported from Relude\"\n    rhs: bior\n- warn:\n    lhs: Data.Bifoldable.biany\n    name: \"Use 'biany' from Relude\"\n    note: \"'biany' is already exported from Relude\"\n    rhs: biany\n- warn:\n    lhs: Data.Bifoldable.biall\n    name: \"Use 'biall' from Relude\"\n    note: \"'biall' is already exported from Relude\"\n    rhs: biall\n- warn:\n    lhs: Data.Bifoldable.bifind\n    name: \"Use 'bifind' from Relude\"\n    note: \"'bifind' is already exported from Relude\"\n    rhs: bifind\n- warn:\n    lhs: Data.Bitraversable.Bitraversable\n    name: \"Use 'Bitraversable' from Relude\"\n    note: \"'Bitraversable' is already exported from Relude\"\n    rhs: Bitraversable\n- warn:\n    lhs: Data.Bitraversable.bitraverse\n    name: \"Use 'bitraverse' from Relude\"\n    note: \"'bitraverse' is already exported from Relude\"\n    rhs: bitraverse\n- warn:\n    lhs: Data.Bitraversable.bisequence\n    name: \"Use 'bisequence' from Relude\"\n    note: \"'bisequence' is already exported from Relude\"\n    rhs: bisequence\n- warn:\n    lhs: Data.Bitraversable.bifor\n    name: \"Use 'bifor' from Relude\"\n    note: \"'bifor' is already exported from Relude\"\n    rhs: bifor\n- warn:\n    lhs: Data.Bitraversable.bimapDefault\n    name: \"Use 'bimapDefault' from Relude\"\n    note: \"'bimapDefault' is already exported from Relude\"\n    rhs: bimapDefault\n- warn:\n    lhs: Data.Bitraversable.bifoldMapDefault\n    name: \"Use 'bifoldMapDefault' from Relude\"\n    note: \"'bifoldMapDefault' is already exported from Relude\"\n    rhs: bifoldMapDefault\n- warn:\n    lhs: Control.Monad.guard\n    name: \"Use 'guard' from Relude\"\n    note: \"'guard' is already exported from Relude\"\n    rhs: guard\n- warn:\n    lhs: Control.Monad.when\n    name: \"Use 'when' from Relude\"\n    note: \"'when' is already exported from Relude\"\n    rhs: when\n- warn:\n    lhs: Data.Bool.bool\n    name: \"Use 'bool' from Relude\"\n    note: \"'bool' is already exported from Relude\"\n    rhs: bool\n- warn:\n    lhs: Data.Hashable.Hashable\n    name: \"Use 'Hashable' from Relude\"\n    note: \"'Hashable' is already exported from Relude\"\n    rhs: Hashable\n- warn:\n    lhs: Data.Hashable.hashWithSalt\n    name: \"Use 'hashWithSalt' from Relude\"\n    note: \"'hashWithSalt' is already exported from Relude\"\n    rhs: hashWithSalt\n- warn:\n    lhs: Data.HashMap.Strict.HashMap\n    name: \"Use 'HashMap' from Relude\"\n    note: \"'HashMap' is already exported from Relude\"\n    rhs: HashMap\n- warn:\n    lhs: Data.HashSet.HashSet\n    name: \"Use 'HashSet' from Relude\"\n    note: \"'HashSet' is already exported from Relude\"\n    rhs: HashSet\n- warn:\n    lhs: Data.IntMap.Strict.IntMap\n    name: \"Use 'IntMap' from Relude\"\n    note: \"'IntMap' is already exported from Relude\"\n    rhs: IntMap\n- warn:\n    lhs: Data.IntSet.IntSet\n    name: \"Use 'IntSet' from Relude\"\n    note: \"'IntSet' is already exported from Relude\"\n    rhs: IntSet\n- warn:\n    lhs: Data.Map.Strict.Map\n    name: \"Use 'Map' from Relude\"\n    note: \"'Map' is already exported from Relude\"\n    rhs: Map\n- warn:\n    lhs: Data.Sequence.Sequence\n    name: \"Use 'Sequence' from Relude\"\n    note: \"'Sequence' is already exported from Relude\"\n    rhs: Sequence\n- warn:\n    lhs: Data.Set.Set\n    name: \"Use 'Set' from Relude\"\n    note: \"'Set' is already exported from Relude\"\n    rhs: Set\n- warn:\n    lhs: Data.Tuple.swap\n    name: \"Use 'swap' from Relude\"\n    note: \"'swap' is already exported from Relude\"\n    rhs: swap\n- warn:\n    lhs: Data.Vector.Vector\n    name: \"Use 'Vector' from Relude\"\n    note: \"'Vector' is already exported from Relude\"\n    rhs: Vector\n- warn:\n    lhs: GHC.Exts.IsList\n    name: \"Use 'IsList' from Relude\"\n    note: \"'IsList' is already exported from Relude\"\n    rhs: IsList\n- warn:\n    lhs: GHC.Exts.fromList\n    name: \"Use 'fromList' from Relude\"\n    note: \"'fromList' is already exported from Relude\"\n    rhs: fromList\n- warn:\n    lhs: GHC.Exts.fromListN\n    name: \"Use 'fromListN' from Relude\"\n    note: \"'fromListN' is already exported from Relude\"\n    rhs: fromListN\n- warn:\n    lhs: Debug.Trace.trace\n    name: \"Use 'trace' from Relude\"\n    note: \"'trace' is already exported from Relude\"\n    rhs: trace\n- warn:\n    lhs: Debug.Trace.traceShow\n    name: \"Use 'traceShow' from Relude\"\n    note: \"'traceShow' is already exported from Relude\"\n    rhs: traceShow\n- warn:\n    lhs: Debug.Trace.traceShowId\n    name: \"Use 'traceShowId' from Relude\"\n    note: \"'traceShowId' is already exported from Relude\"\n    rhs: traceShowId\n- warn:\n    lhs: Debug.Trace.traceShowM\n    name: \"Use 'traceShowM' from Relude\"\n    note: \"'traceShowM' is already exported from Relude\"\n    rhs: traceShowM\n- warn:\n    lhs: Debug.Trace.traceM\n    name: \"Use 'traceM' from Relude\"\n    note: \"'traceM' is already exported from Relude\"\n    rhs: traceM\n- warn:\n    lhs: Debug.Trace.traceId\n    name: \"Use 'traceId' from Relude\"\n    note: \"'traceId' is already exported from Relude\"\n    rhs: traceId\n- warn:\n    lhs: Control.DeepSeq.NFData\n    name: \"Use 'NFData' from Relude\"\n    note: \"'NFData' is already exported from Relude\"\n    rhs: NFData\n- warn:\n    lhs: Control.DeepSeq.rnf\n    name: \"Use 'rnf' from Relude\"\n    note: \"'rnf' is already exported from Relude\"\n    rhs: rnf\n- warn:\n    lhs: Control.DeepSeq.deepseq\n    name: \"Use 'deepseq' from Relude\"\n    note: \"'deepseq' is already exported from Relude\"\n    rhs: deepseq\n- warn:\n    lhs: Control.DeepSeq.force\n    name: \"Use 'force' from Relude\"\n    note: \"'force' is already exported from Relude\"\n    rhs: force\n- warn:\n    lhs: \"(Control.DeepSeq.$!!)\"\n    name: \"Use '$!!' from Relude\"\n    note: \"Operator '($!!)' is already exported from Relude\"\n    rhs: \"($!!)\"\n- warn:\n    lhs: Control.Exception.Exception\n    name: \"Use 'Exception' from Relude\"\n    note: \"'Exception' is already exported from Relude\"\n    rhs: Exception\n- warn:\n    lhs: Control.Exception.SomeException\n    name: \"Use 'SomeException' from Relude\"\n    note: \"'SomeException' is already exported from Relude\"\n    rhs: SomeException\n- warn:\n    lhs: Control.Exception.toException\n    name: \"Use 'toException' from Relude\"\n    note: \"'toException' is already exported from Relude\"\n    rhs: toException\n- warn:\n    lhs: Control.Exception.fromException\n    name: \"Use 'fromException' from Relude\"\n    note: \"'fromException' is already exported from Relude\"\n    rhs: fromException\n- warn:\n    lhs: Control.Exception.displayException\n    name: \"Use 'displayException' from Relude\"\n    note: \"'displayException' is already exported from Relude\"\n    rhs: displayException\n- warn:\n    lhs: Data.Foldable.asum\n    name: \"Use 'asum' from Relude\"\n    note: \"'asum' is already exported from Relude\"\n    rhs: asum\n- warn:\n    lhs: Data.Foldable.find\n    name: \"Use 'find' from Relude\"\n    note: \"'find' is already exported from Relude\"\n    rhs: find\n- warn:\n    lhs: Data.Foldable.find\n    name: \"Use 'find' from Relude\"\n    note: \"'find' is already exported from Relude\"\n    rhs: find\n- warn:\n    lhs: Data.Foldable.fold\n    name: \"Use 'fold' from Relude\"\n    note: \"'fold' is already exported from Relude\"\n    rhs: fold\n- warn:\n    lhs: \"Data.Foldable.foldl'\"\n    name: \"Use 'foldl'' from Relude\"\n    note: \"'foldl'' is already exported from Relude\"\n    rhs: \"foldl'\"\n- warn:\n    lhs: forM_ b a\n    name: \"Use 'traverse_'\"\n    rhs: traverse_ a b\n- warn:\n    lhs: for_ b a\n    name: \"Use 'traverse_'\"\n    note: \"'for_' is already exported from Relude\"\n    rhs: traverse a b\n- warn:\n    lhs: Data.Foldable.sequenceA_\n    name: \"Use 'sequenceA_' from Relude\"\n    note: \"'sequenceA_' is already exported from Relude\"\n    rhs: sequenceA_\n- warn:\n    lhs: Data.Foldable.toList\n    name: \"Use 'toList' from Relude\"\n    note: \"'toList' is already exported from Relude\"\n    rhs: toList\n- warn:\n    lhs: forM b a\n    name: \"Use 'traverse'\"\n    rhs: traverse a b\n- warn:\n    lhs: Data.Traversable.mapAccumL\n    name: \"Use 'mapAccumL' from Relude\"\n    note: \"'mapAccumL' is already exported from Relude\"\n    rhs: mapAccumL\n- warn:\n    lhs: Data.Traversable.mapAccumR\n    name: \"Use 'mapAccumR' from Relude\"\n    note: \"'mapAccumR' is already exported from Relude\"\n    rhs: mapAccumR\n- warn:\n    lhs: \"(Control.Arrow.&&&)\"\n    name: \"Use '&&&' from Relude\"\n    note: \"Operator '(&&&)' is already exported from Relude\"\n    rhs: \"(&&&)\"\n- warn:\n    lhs: \"(Control.Category.>>>)\"\n    name: \"Use '>>>' from Relude\"\n    note: \"Operator '(>>>)' is already exported from Relude\"\n    rhs: \"(>>>)\"\n- warn:\n    lhs: \"(Control.Category.<<<)\"\n    name: \"Use '<<<' from Relude\"\n    note: \"Operator '(<<<)' is already exported from Relude\"\n    rhs: \"(<<<)\"\n- warn:\n    lhs: Data.Function.fix\n    name: \"Use 'fix' from Relude\"\n    note: \"'fix' is already exported from Relude\"\n    rhs: fix\n- warn:\n    lhs: Data.Function.on\n    name: \"Use 'on' from Relude\"\n    note: \"'on' is already exported from Relude\"\n    rhs: 'on'\n- warn:\n    lhs: Data.Bifunctor.Bifunctor\n    name: \"Use 'Bifunctor' from Relude\"\n    note: \"'Bifunctor' is already exported from Relude\"\n    rhs: Bifunctor\n- warn:\n    lhs: Data.Bifunctor.bimap\n    name: \"Use 'bimap' from Relude\"\n    note: \"'bimap' is already exported from Relude\"\n    rhs: bimap\n- warn:\n    lhs: Data.Bifunctor.first\n    name: \"Use 'first' from Relude\"\n    note: \"'first' is already exported from Relude\"\n    rhs: first\n- warn:\n    lhs: Data.Bifunctor.second\n    name: \"Use 'second' from Relude\"\n    note: \"'second' is already exported from Relude\"\n    rhs: second\n- warn:\n    lhs: Data.Functor.void\n    name: \"Use 'void' from Relude\"\n    note: \"'void' is already exported from Relude\"\n    rhs: void\n- warn:\n    lhs: \"(Data.Functor.$>)\"\n    name: \"Use '$>' from Relude\"\n    note: \"Operator '($>)' is already exported from Relude\"\n    rhs: \"($>)\"\n- warn:\n    lhs: \"(Data.Functor.<&>)\"\n    name: \"Use '<&>' from Relude\"\n    note: \"Operator '(<&>)' is already exported from Relude\"\n    rhs: \"(<&>)\"\n- warn:\n    lhs: Data.Functor.Compose.Compose\n    name: \"Use 'Compose' from Relude\"\n    note: \"'Compose' is already exported from Relude\"\n    rhs: Compose\n- warn:\n    lhs: Data.Functor.Identity.Identity\n    name: \"Use 'Identity' from Relude\"\n    note: \"'Identity' is already exported from Relude\"\n    rhs: Identity\n- warn:\n    lhs: Data.Functor.Identity.runIdentity\n    name: \"Use 'runIdentity' from Relude\"\n    note: \"'runIdentity' is already exported from Relude\"\n    rhs: runIdentity\n- warn:\n    lhs: Control.Concurrent.MVar.MVar\n    name: \"Use 'MVar' from Relude\"\n    note: \"'MVar' is already exported from Relude\"\n    rhs: MVar\n- warn:\n    lhs: Control.Concurrent.MVar.newEmptyMVar\n    name: \"Use 'newEmptyMVar' from Relude\"\n    note: \"'newEmptyMVar' is already exported from Relude\"\n    rhs: newEmptyMVar\n- warn:\n    lhs: Control.Concurrent.MVar.newMVar\n    name: \"Use 'newMVar' from Relude\"\n    note: \"'newMVar' is already exported from Relude\"\n    rhs: newMVar\n- warn:\n    lhs: Control.Concurrent.MVar.putMVar\n    name: \"Use 'putMVar' from Relude\"\n    note: \"'putMVar' is already exported from Relude\"\n    rhs: putMVar\n- warn:\n    lhs: Control.Concurrent.MVar.readMVar\n    name: \"Use 'readMVar' from Relude\"\n    note: \"'readMVar' is already exported from Relude\"\n    rhs: readMVar\n- warn:\n    lhs: Control.Concurrent.MVar.swapMVar\n    name: \"Use 'swapMVar' from Relude\"\n    note: \"'swapMVar' is already exported from Relude\"\n    rhs: swapMVar\n- warn:\n    lhs: Control.Concurrent.MVar.takeMVar\n    name: \"Use 'takeMVar' from Relude\"\n    note: \"'takeMVar' is already exported from Relude\"\n    rhs: takeMVar\n- warn:\n    lhs: Control.Concurrent.MVar.tryPutMVar\n    name: \"Use 'tryPutMVar' from Relude\"\n    note: \"'tryPutMVar' is already exported from Relude\"\n    rhs: tryPutMVar\n- warn:\n    lhs: Control.Concurrent.MVar.tryReadMVar\n    name: \"Use 'tryReadMVar' from Relude\"\n    note: \"'tryReadMVar' is already exported from Relude\"\n    rhs: tryReadMVar\n- warn:\n    lhs: Control.Concurrent.MVar.tryTakeMVar\n    name: \"Use 'tryTakeMVar' from Relude\"\n    note: \"'tryTakeMVar' is already exported from Relude\"\n    rhs: tryTakeMVar\n- warn:\n    lhs: Control.Monad.STM.STM\n    name: \"Use 'STM' from Relude\"\n    note: \"'STM' is already exported from Relude\"\n    rhs: STM\n- warn:\n    lhs: Control.Monad.STM.atomically\n    name: \"Use 'atomically' from Relude\"\n    note: \"'atomically' is already exported from Relude\"\n    rhs: atomically\n- warn:\n    lhs: Control.Monad.STM.throwSTM\n    name: \"Use 'throwSTM' from Relude\"\n    note: \"'throwSTM' is already exported from Relude\"\n    rhs: throwSTM\n- warn:\n    lhs: Control.Monad.STM.catchSTM\n    name: \"Use 'catchSTM' from Relude\"\n    note: \"'catchSTM' is already exported from Relude\"\n    rhs: catchSTM\n- warn:\n    lhs: Control.Concurrent.STM.TVar.TVar\n    name: \"Use 'TVar' from Relude\"\n    note: \"'TVar' is already exported from Relude\"\n    rhs: TVar\n- warn:\n    lhs: Control.Concurrent.STM.TVar.newTVarIO\n    name: \"Use 'newTVarIO' from Relude\"\n    note: \"'newTVarIO' is already exported from Relude\"\n    rhs: newTVarIO\n- warn:\n    lhs: Control.Concurrent.STM.TVar.readTVarIO\n    name: \"Use 'readTVarIO' from Relude\"\n    note: \"'readTVarIO' is already exported from Relude\"\n    rhs: readTVarIO\n- warn:\n    lhs: \"Control.Concurrent.STM.TVar.modifyTVar'\"\n    name: \"Use 'modifyTVar'' from Relude\"\n    note: \"'modifyTVar'' is already exported from Relude\"\n    rhs: \"modifyTVar'\"\n- warn:\n    lhs: Control.Concurrent.STM.TVar.newTVar\n    name: \"Use 'newTVar' from Relude\"\n    note: \"'newTVar' is already exported from Relude\"\n    rhs: newTVar\n- warn:\n    lhs: Control.Concurrent.STM.TVar.readTVar\n    name: \"Use 'readTVar' from Relude\"\n    note: \"'readTVar' is already exported from Relude\"\n    rhs: readTVar\n- warn:\n    lhs: Control.Concurrent.STM.TVar.writeTVar\n    name: \"Use 'writeTVar' from Relude\"\n    note: \"'writeTVar' is already exported from Relude\"\n    rhs: writeTVar\n- warn:\n    lhs: Control.Concurrent.STM.TMVar.TMVar\n    name: \"Use 'TMVar' from Relude\"\n    note: \"'TMVar' is already exported from Relude\"\n    rhs: TMVar\n- warn:\n    lhs: Control.Concurrent.STM.TMVar.newTMVar\n    name: \"Use 'newTMVar' from Relude\"\n    note: \"'newTMVar' is already exported from Relude\"\n    rhs: newTMVar\n- warn:\n    lhs: Control.Concurrent.STM.TMVar.newEmptyTMVar\n    name: \"Use 'newEmptyTMVar' from Relude\"\n    note: \"'newEmptyTMVar' is already exported from Relude\"\n    rhs: newEmptyTMVar\n- warn:\n    lhs: Control.Concurrent.STM.TMVar.newTMVarIO\n    name: \"Use 'newTMVarIO' from Relude\"\n    note: \"'newTMVarIO' is already exported from Relude\"\n    rhs: newTMVarIO\n- warn:\n    lhs: Control.Concurrent.STM.TMVar.newEmptyTMVarIO\n    name: \"Use 'newEmptyTMVarIO' from Relude\"\n    note: \"'newEmptyTMVarIO' is already exported from Relude\"\n    rhs: newEmptyTMVarIO\n- warn:\n    lhs: Control.Concurrent.STM.TMVar.takeTMVar\n    name: \"Use 'takeTMVar' from Relude\"\n    note: \"'takeTMVar' is already exported from Relude\"\n    rhs: takeTMVar\n- warn:\n    lhs: Control.Concurrent.STM.TMVar.putTMVar\n    name: \"Use 'putTMVar' from Relude\"\n    note: \"'putTMVar' is already exported from Relude\"\n    rhs: putTMVar\n- warn:\n    lhs: Control.Concurrent.STM.TMVar.readTMVar\n    name: \"Use 'readTMVar' from Relude\"\n    note: \"'readTMVar' is already exported from Relude\"\n    rhs: readTMVar\n- warn:\n    lhs: Control.Concurrent.STM.TMVar.tryReadTMVar\n    name: \"Use 'tryReadTMVar' from Relude\"\n    note: \"'tryReadTMVar' is already exported from Relude\"\n    rhs: tryReadTMVar\n- warn:\n    lhs: Control.Concurrent.STM.TMVar.swapTMVar\n    name: \"Use 'swapTMVar' from Relude\"\n    note: \"'swapTMVar' is already exported from Relude\"\n    rhs: swapTMVar\n- warn:\n    lhs: Control.Concurrent.STM.TMVar.tryTakeTMVar\n    name: \"Use 'tryTakeTMVar' from Relude\"\n    note: \"'tryTakeTMVar' is already exported from Relude\"\n    rhs: tryTakeTMVar\n- warn:\n    lhs: Control.Concurrent.STM.TMVar.tryPutTMVar\n    name: \"Use 'tryPutTMVar' from Relude\"\n    note: \"'tryPutTMVar' is already exported from Relude\"\n    rhs: tryPutTMVar\n- warn:\n    lhs: Control.Concurrent.STM.TMVar.isEmptyTMVar\n    name: \"Use 'isEmptyTMVar' from Relude\"\n    note: \"'isEmptyTMVar' is already exported from Relude\"\n    rhs: isEmptyTMVar\n- warn:\n    lhs: Control.Concurrent.STM.TMVar.mkWeakTMVar\n    name: \"Use 'mkWeakTMVar' from Relude\"\n    note: \"'mkWeakTMVar' is already exported from Relude\"\n    rhs: mkWeakTMVar\n- warn:\n    lhs: Data.IORef.IORef\n    name: \"Use 'IORef' from Relude\"\n    note: \"'IORef' is already exported from Relude\"\n    rhs: IORef\n- warn:\n    lhs: Data.IORef.atomicModifyIORef\n    name: \"Use 'atomicModifyIORef' from Relude\"\n    note: \"'atomicModifyIORef' is already exported from Relude\"\n    rhs: atomicModifyIORef\n- warn:\n    lhs: \"Data.IORef.atomicModifyIORef'\"\n    name: \"Use 'atomicModifyIORef'' from Relude\"\n    note: \"'atomicModifyIORef'' is already exported from Relude\"\n    rhs: \"atomicModifyIORef'\"\n- warn:\n    lhs: Data.IORef.atomicWriteIORef\n    name: \"Use 'atomicWriteIORef' from Relude\"\n    note: \"'atomicWriteIORef' is already exported from Relude\"\n    rhs: atomicWriteIORef\n- warn:\n    lhs: Data.IORef.modifyIORef\n    name: \"Use 'modifyIORef' from Relude\"\n    note: \"'modifyIORef' is already exported from Relude\"\n    rhs: modifyIORef\n- warn:\n    lhs: \"Data.IORef.modifyIORef'\"\n    name: \"Use 'modifyIORef'' from Relude\"\n    note: \"'modifyIORef'' is already exported from Relude\"\n    rhs: \"modifyIORef'\"\n- warn:\n    lhs: Data.IORef.newIORef\n    name: \"Use 'newIORef' from Relude\"\n    note: \"'newIORef' is already exported from Relude\"\n    rhs: newIORef\n- warn:\n    lhs: Data.IORef.readIORef\n    name: \"Use 'readIORef' from Relude\"\n    note: \"'readIORef' is already exported from Relude\"\n    rhs: readIORef\n- warn:\n    lhs: Data.IORef.writeIORef\n    name: \"Use 'writeIORef' from Relude\"\n    note: \"'writeIORef' is already exported from Relude\"\n    rhs: writeIORef\n- warn:\n    lhs: \"atomicModifyIORef ref (\\\\a -> (f a, mempty))\"\n    rhs: atomicModifyIORef_ ref f\n- warn:\n    lhs: \"atomicModifyIORef ref $ \\\\a -> (f a, mempty)\"\n    rhs: atomicModifyIORef_ ref f\n- warn:\n    lhs: \"atomicModifyIORef' ref $ \\\\a -> (f a, mempty)\"\n    rhs: \"atomicModifyIORef'_ ref f\"\n- warn:\n    lhs: \"atomicModifyIORef' ref (\\\\a -> (f a, mempty))\"\n    rhs: \"atomicModifyIORef'_ ref f\"\n- warn:\n    lhs: Data.Text.IO.getLine\n    name: \"Use 'getLine' from Relude\"\n    note: \"'getLine' is already exported from Relude\"\n    rhs: getLine\n- warn:\n    lhs: System.IO.hFlush\n    name: \"Use 'hFlush' from Relude\"\n    note: \"'hFlush' is already exported from Relude\"\n    rhs: hFlush\n- warn:\n    lhs: System.IO.hIsEOF\n    name: \"Use 'hIsEOF' from Relude\"\n    note: \"'hIsEOF' is already exported from Relude\"\n    rhs: hIsEOF\n- warn:\n    lhs: System.IO.hSetBuffering\n    name: \"Use 'hSetBuffering' from Relude\"\n    note: \"'hSetBuffering' is already exported from Relude\"\n    rhs: hSetBuffering\n- warn:\n    lhs: System.IO.hGetBuffering\n    name: \"Use 'hGetBuffering' from Relude\"\n    note: \"'hGetBuffering' is already exported from Relude\"\n    rhs: hGetBuffering\n- warn:\n    lhs: System.IO.Handle\n    name: \"Use 'Handle' from Relude\"\n    note: \"'Handle' is already exported from Relude\"\n    rhs: Handle\n- warn:\n    lhs: System.IO.stdin\n    name: \"Use 'stdin' from Relude\"\n    note: \"'stdin' is already exported from Relude\"\n    rhs: stdin\n- warn:\n    lhs: System.IO.stdout\n    name: \"Use 'stdout' from Relude\"\n    note: \"'stdout' is already exported from Relude\"\n    rhs: stdout\n- warn:\n    lhs: System.IO.stderr\n    name: \"Use 'stderr' from Relude\"\n    note: \"'stderr' is already exported from Relude\"\n    rhs: stderr\n- warn:\n    lhs: System.IO.withFile\n    name: \"Use 'withFile' from Relude\"\n    note: \"'withFile' is already exported from Relude\"\n    rhs: withFile\n- warn:\n    lhs: System.IO.BufferMode\n    name: \"Use 'BufferMode' from Relude\"\n    note: \"'BufferMode' is already exported from Relude\"\n    rhs: BufferMode\n- warn:\n    lhs: System.Environment.getArgs\n    name: \"Use 'getArgs' from Relude\"\n    note: \"'getArgs' is already exported from Relude\"\n    rhs: getArgs\n- warn:\n    lhs: System.Environment.lookupEnv\n    name: \"Use 'lookupEnv' from Relude\"\n    note: \"'lookupEnv' is already exported from Relude\"\n    rhs: lookupEnv\n- warn:\n    lhs: Data.List.genericDrop\n    name: \"Use 'genericDrop' from Relude\"\n    note: \"'genericDrop' is already exported from Relude\"\n    rhs: genericDrop\n- warn:\n    lhs: Data.List.genericLength\n    name: \"Use 'genericLength' from Relude\"\n    note: \"'genericLength' is already exported from Relude\"\n    rhs: genericLength\n- warn:\n    lhs: Data.List.genericReplicate\n    name: \"Use 'genericReplicate' from Relude\"\n    note: \"'genericReplicate' is already exported from Relude\"\n    rhs: genericReplicate\n- warn:\n    lhs: Data.List.genericSplitAt\n    name: \"Use 'genericSplitAt' from Relude\"\n    note: \"'genericSplitAt' is already exported from Relude\"\n    rhs: genericSplitAt\n- warn:\n    lhs: Data.List.genericTake\n    name: \"Use 'genericTake' from Relude\"\n    note: \"'genericTake' is already exported from Relude\"\n    rhs: genericTake\n- warn:\n    lhs: Data.List.group\n    name: \"Use 'group' from Relude\"\n    note: \"'group' is already exported from Relude\"\n    rhs: group\n- warn:\n    lhs: Data.List.inits\n    name: \"Use 'inits' from Relude\"\n    note: \"'inits' is already exported from Relude\"\n    rhs: inits\n- warn:\n    lhs: Data.List.intercalate\n    name: \"Use 'intercalate' from Relude\"\n    note: \"'intercalate' is already exported from Relude\"\n    rhs: intercalate\n- warn:\n    lhs: Data.List.intersperse\n    name: \"Use 'intersperse' from Relude\"\n    note: \"'intersperse' is already exported from Relude\"\n    rhs: intersperse\n- warn:\n    lhs: Data.List.isPrefixOf\n    name: \"Use 'isPrefixOf' from Relude\"\n    note: \"'isPrefixOf' is already exported from Relude\"\n    rhs: isPrefixOf\n- warn:\n    lhs: Data.List.permutations\n    name: \"Use 'permutations' from Relude\"\n    note: \"'permutations' is already exported from Relude\"\n    rhs: permutations\n- warn:\n    lhs: \"Data.List.scanl'\"\n    name: \"Use 'scanl'' from Relude\"\n    note: \"'scanl'' is already exported from Relude\"\n    rhs: \"scanl'\"\n- warn:\n    lhs: Data.List.sort\n    name: \"Use 'sort' from Relude\"\n    note: \"'sort' is already exported from Relude\"\n    rhs: sort\n- warn:\n    lhs: Data.List.sortBy\n    name: \"Use 'sortBy' from Relude\"\n    note: \"'sortBy' is already exported from Relude\"\n    rhs: sortBy\n- warn:\n    lhs: Data.List.sortOn\n    name: \"Use 'sortOn' from Relude\"\n    note: \"'sortOn' is already exported from Relude\"\n    rhs: sortOn\n- warn:\n    lhs: Data.List.subsequences\n    name: \"Use 'subsequences' from Relude\"\n    note: \"'subsequences' is already exported from Relude\"\n    rhs: subsequences\n- warn:\n    lhs: Data.List.tails\n    name: \"Use 'tails' from Relude\"\n    note: \"'tails' is already exported from Relude\"\n    rhs: tails\n- warn:\n    lhs: Data.List.transpose\n    name: \"Use 'transpose' from Relude\"\n    note: \"'transpose' is already exported from Relude\"\n    rhs: transpose\n- warn:\n    lhs: Data.List.uncons\n    name: \"Use 'uncons' from Relude\"\n    note: \"'uncons' is already exported from Relude\"\n    rhs: uncons\n- warn:\n    lhs: Data.List.unfoldr\n    name: \"Use 'unfoldr' from Relude\"\n    note: \"'unfoldr' is already exported from Relude\"\n    rhs: unfoldr\n- warn:\n    lhs: Data.List.NonEmpty.NonEmpty\n    name: \"Use 'NonEmpty' from Relude\"\n    note: \"'NonEmpty' is already exported from Relude\"\n    rhs: NonEmpty\n- warn:\n    lhs: \"(Data.List.NonEmpty.:|)\"\n    name: \"Use ':|' from Relude\"\n    note: \"Operator '(:|)' is already exported from Relude\"\n    rhs: \"(:|)\"\n- warn:\n    lhs: Data.List.NonEmpty.nonEmpty\n    name: \"Use 'nonEmpty' from Relude\"\n    note: \"'nonEmpty' is already exported from Relude\"\n    rhs: nonEmpty\n- warn:\n    lhs: Data.List.NonEmpty.head\n    name: \"Use 'head' from Relude\"\n    note: \"'head' is already exported from Relude\"\n    rhs: head\n- warn:\n    lhs: Data.List.NonEmpty.init\n    name: \"Use 'init' from Relude\"\n    note: \"'init' is already exported from Relude\"\n    rhs: init\n- warn:\n    lhs: Data.List.NonEmpty.last\n    name: \"Use 'last' from Relude\"\n    note: \"'last' is already exported from Relude\"\n    rhs: last\n- warn:\n    lhs: Data.List.NonEmpty.tail\n    name: \"Use 'tail' from Relude\"\n    note: \"'tail' is already exported from Relude\"\n    rhs: tail\n- warn:\n    lhs: GHC.Exts.sortWith\n    name: \"Use 'sortWith' from Relude\"\n    note: \"'sortWith' is already exported from Relude\"\n    rhs: sortWith\n- warn:\n    lhs: Control.Monad.Except.ExceptT\n    name: \"Use 'ExceptT' from Relude\"\n    note: \"'ExceptT' is already exported from Relude\"\n    rhs: ExceptT\n- warn:\n    lhs: Control.Monad.Except.runExceptT\n    name: \"Use 'runExceptT' from Relude\"\n    note: \"'runExceptT' is already exported from Relude\"\n    rhs: runExceptT\n- warn:\n    lhs: Control.Monad.Reader.MonadReader\n    name: \"Use 'MonadReader' from Relude\"\n    note: \"'MonadReader' is already exported from Relude\"\n    rhs: MonadReader\n- warn:\n    lhs: Control.Monad.Reader.Reader\n    name: \"Use 'Reader' from Relude\"\n    note: \"'Reader' is already exported from Relude\"\n    rhs: Reader\n- warn:\n    lhs: Control.Monad.Reader.ReaderT\n    name: \"Use 'ReaderT' from Relude\"\n    note: \"'ReaderT' is already exported from Relude\"\n    rhs: ReaderT\n- warn:\n    lhs: Control.Monad.Reader.runReaderT\n    name: \"Use 'runReaderT' from Relude\"\n    note: \"'runReaderT' is already exported from Relude\"\n    rhs: runReaderT\n- warn:\n    lhs: Control.Monad.Reader.ask\n    name: \"Use 'ask' from Relude\"\n    note: \"'ask' is already exported from Relude\"\n    rhs: ask\n- warn:\n    lhs: Control.Monad.Reader.asks\n    name: \"Use 'asks' from Relude\"\n    note: \"'asks' is already exported from Relude\"\n    rhs: asks\n- warn:\n    lhs: Control.Monad.Reader.local\n    name: \"Use 'local' from Relude\"\n    note: \"'local' is already exported from Relude\"\n    rhs: local\n- warn:\n    lhs: Control.Monad.Reader.reader\n    name: \"Use 'reader' from Relude\"\n    note: \"'reader' is already exported from Relude\"\n    rhs: reader\n- warn:\n    lhs: Control.Monad.Reader.runReader\n    name: \"Use 'runReader' from Relude\"\n    note: \"'runReader' is already exported from Relude\"\n    rhs: runReader\n- warn:\n    lhs: Control.Monad.Reader.withReader\n    name: \"Use 'withReader' from Relude\"\n    note: \"'withReader' is already exported from Relude\"\n    rhs: withReader\n- warn:\n    lhs: Control.Monad.Reader.withReaderT\n    name: \"Use 'withReaderT' from Relude\"\n    note: \"'withReaderT' is already exported from Relude\"\n    rhs: withReaderT\n- warn:\n    lhs: Control.Monad.State.Strict.MonadState\n    name: \"Use 'MonadState' from Relude\"\n    note: \"'MonadState' is already exported from Relude\"\n    rhs: MonadState\n- warn:\n    lhs: Control.Monad.State.Strict.State\n    name: \"Use 'State' from Relude\"\n    note: \"'State' is already exported from Relude\"\n    rhs: State\n- warn:\n    lhs: Control.Monad.State.Strict.StateT\n    name: \"Use 'StateT' from Relude\"\n    note: \"'StateT' is already exported from Relude\"\n    rhs: StateT\n- warn:\n    lhs: Control.Monad.State.Strict.runStateT\n    name: \"Use 'runStateT' from Relude\"\n    note: \"'runStateT' is already exported from Relude\"\n    rhs: runStateT\n- warn:\n    lhs: Control.Monad.State.Strict.evalState\n    name: \"Use 'evalState' from Relude\"\n    note: \"'evalState' is already exported from Relude\"\n    rhs: evalState\n- warn:\n    lhs: Control.Monad.State.Strict.evalStateT\n    name: \"Use 'evalStateT' from Relude\"\n    note: \"'evalStateT' is already exported from Relude\"\n    rhs: evalStateT\n- warn:\n    lhs: Control.Monad.State.Strict.execState\n    name: \"Use 'execState' from Relude\"\n    note: \"'execState' is already exported from Relude\"\n    rhs: execState\n- warn:\n    lhs: Control.Monad.State.Strict.execStateT\n    name: \"Use 'execStateT' from Relude\"\n    note: \"'execStateT' is already exported from Relude\"\n    rhs: execStateT\n- warn:\n    lhs: Control.Monad.State.Strict.get\n    name: \"Use 'get' from Relude\"\n    note: \"'get' is already exported from Relude\"\n    rhs: get\n- warn:\n    lhs: Control.Monad.State.Strict.gets\n    name: \"Use 'gets' from Relude\"\n    note: \"'gets' is already exported from Relude\"\n    rhs: gets\n- warn:\n    lhs: Control.Monad.State.Strict.modify\n    name: \"Use 'modify' from Relude\"\n    note: \"'modify' is already exported from Relude\"\n    rhs: modify\n- warn:\n    lhs: \"Control.Monad.State.Strict.modify'\"\n    name: \"Use 'modify'' from Relude\"\n    note: \"'modify'' is already exported from Relude\"\n    rhs: \"modify'\"\n- warn:\n    lhs: Control.Monad.State.Strict.put\n    name: \"Use 'put' from Relude\"\n    note: \"'put' is already exported from Relude\"\n    rhs: put\n- warn:\n    lhs: Control.Monad.State.Strict.runState\n    name: \"Use 'runState' from Relude\"\n    note: \"'runState' is already exported from Relude\"\n    rhs: runState\n- warn:\n    lhs: Control.Monad.State.Strict.state\n    name: \"Use 'state' from Relude\"\n    note: \"'state' is already exported from Relude\"\n    rhs: state\n- warn:\n    lhs: Control.Monad.State.Strict.withState\n    name: \"Use 'withState' from Relude\"\n    note: \"'withState' is already exported from Relude\"\n    rhs: withState\n- warn:\n    lhs: Control.Monad.Trans.MonadIO\n    name: \"Use 'MonadIO' from Relude\"\n    note: \"'MonadIO' is already exported from Relude\"\n    rhs: MonadIO\n- warn:\n    lhs: Control.Monad.Trans.MonadTrans\n    name: \"Use 'MonadTrans' from Relude\"\n    note: \"'MonadTrans' is already exported from Relude\"\n    rhs: MonadTrans\n- warn:\n    lhs: Control.Monad.Trans.lift\n    name: \"Use 'lift' from Relude\"\n    note: \"'lift' is already exported from Relude\"\n    rhs: lift\n- warn:\n    lhs: Control.Monad.Trans.liftIO\n    name: \"Use 'liftIO' from Relude\"\n    note: \"'liftIO' is already exported from Relude\"\n    rhs: liftIO\n- warn:\n    lhs: Control.Monad.Trans.Identity.IdentityT\n    name: \"Use 'IdentityT' from Relude\"\n    note: \"'IdentityT' is already exported from Relude\"\n    rhs: IdentityT\n- warn:\n    lhs: Control.Monad.Trans.Identity.runIdentityT\n    name: \"Use 'runIdentityT' from Relude\"\n    note: \"'runIdentityT' is already exported from Relude\"\n    rhs: runIdentityT\n- warn:\n    lhs: Control.Monad.Trans.Maybe.MaybeT\n    name: \"Use 'MaybeT' from Relude\"\n    note: \"'MaybeT' is already exported from Relude\"\n    rhs: MaybeT\n- warn:\n    lhs: Control.Monad.Trans.Maybe.maybeToExceptT\n    name: \"Use 'maybeToExceptT' from Relude\"\n    note: \"'maybeToExceptT' is already exported from Relude\"\n    rhs: maybeToExceptT\n- warn:\n    lhs: Control.Monad.Trans.Maybe.exceptToMaybeT\n    name: \"Use 'exceptToMaybeT' from Relude\"\n    note: \"'exceptToMaybeT' is already exported from Relude\"\n    rhs: exceptToMaybeT\n- warn:\n    lhs: Control.Monad.MonadPlus\n    name: \"Use 'MonadPlus' from Relude\"\n    note: \"'MonadPlus' is already exported from Relude\"\n    rhs: MonadPlus\n- warn:\n    lhs: Control.Monad.mzero\n    name: \"Use 'mzero' from Relude\"\n    note: \"'mzero' is already exported from Relude\"\n    rhs: mzero\n- warn:\n    lhs: Control.Monad.mplus\n    name: \"Use 'mplus' from Relude\"\n    note: \"'mplus' is already exported from Relude\"\n    rhs: mplus\n- warn:\n    lhs: Control.Monad.filterM\n    name: \"Use 'filterM' from Relude\"\n    note: \"'filterM' is already exported from Relude\"\n    rhs: filterM\n- warn:\n    lhs: Control.Monad.forever\n    name: \"Use 'forever' from Relude\"\n    note: \"'forever' is already exported from Relude\"\n    rhs: forever\n- warn:\n    lhs: Control.Monad.join\n    name: \"Use 'join' from Relude\"\n    note: \"'join' is already exported from Relude\"\n    rhs: join\n- warn:\n    lhs: Control.Monad.mapAndUnzipM\n    name: \"Use 'mapAndUnzipM' from Relude\"\n    note: \"'mapAndUnzipM' is already exported from Relude\"\n    rhs: mapAndUnzipM\n- warn:\n    lhs: Control.Monad.mfilter\n    name: \"Use 'mfilter' from Relude\"\n    note: \"'mfilter' is already exported from Relude\"\n    rhs: mfilter\n- warn:\n    lhs: Control.Monad.replicateM\n    name: \"Use 'replicateM' from Relude\"\n    note: \"'replicateM' is already exported from Relude\"\n    rhs: replicateM\n- warn:\n    lhs: Control.Monad.replicateM_\n    name: \"Use 'replicateM_' from Relude\"\n    note: \"'replicateM_' is already exported from Relude\"\n    rhs: replicateM_\n- warn:\n    lhs: Control.Monad.zipWithM\n    name: \"Use 'zipWithM' from Relude\"\n    note: \"'zipWithM' is already exported from Relude\"\n    rhs: zipWithM\n- warn:\n    lhs: Control.Monad.zipWithM_\n    name: \"Use 'zipWithM_' from Relude\"\n    note: \"'zipWithM_' is already exported from Relude\"\n    rhs: zipWithM_\n- warn:\n    lhs: \"(Control.Monad.<$!>)\"\n    name: \"Use '<$!>' from Relude\"\n    note: \"Operator '(<$!>)' is already exported from Relude\"\n    rhs: \"(<$!>)\"\n- warn:\n    lhs: \"(Control.Monad.<=<)\"\n    name: \"Use '<=<' from Relude\"\n    note: \"Operator '(<=<)' is already exported from Relude\"\n    rhs: \"(<=<)\"\n- warn:\n    lhs: \"(Control.Monad.=<<)\"\n    name: \"Use '=<<' from Relude\"\n    note: \"Operator '(=<<)' is already exported from Relude\"\n    rhs: \"(=<<)\"\n- warn:\n    lhs: \"(Control.Monad.>=>)\"\n    name: \"Use '>=>' from Relude\"\n    note: \"Operator '(>=>)' is already exported from Relude\"\n    rhs: \"(>=>)\"\n- warn:\n    lhs: Control.Monad.Fail.MonadFail\n    name: \"Use 'MonadFail' from Relude\"\n    note: \"'MonadFail' is already exported from Relude\"\n    rhs: MonadFail\n- warn:\n    lhs: Data.Maybe.catMaybes\n    name: \"Use 'catMaybes' from Relude\"\n    note: \"'catMaybes' is already exported from Relude\"\n    rhs: catMaybes\n- warn:\n    lhs: Data.Maybe.fromMaybe\n    name: \"Use 'fromMaybe' from Relude\"\n    note: \"'fromMaybe' is already exported from Relude\"\n    rhs: fromMaybe\n- warn:\n    lhs: Data.Maybe.isJust\n    name: \"Use 'isJust' from Relude\"\n    note: \"'isJust' is already exported from Relude\"\n    rhs: isJust\n- warn:\n    lhs: Data.Maybe.isNothing\n    name: \"Use 'isNothing' from Relude\"\n    note: \"'isNothing' is already exported from Relude\"\n    rhs: isNothing\n- warn:\n    lhs: Data.Maybe.listToMaybe\n    name: \"Use 'listToMaybe' from Relude\"\n    note: \"'listToMaybe' is already exported from Relude\"\n    rhs: listToMaybe\n- warn:\n    lhs: Data.Maybe.mapMaybe\n    name: \"Use 'mapMaybe' from Relude\"\n    note: \"'mapMaybe' is already exported from Relude\"\n    rhs: mapMaybe\n- warn:\n    lhs: Data.Maybe.maybeToList\n    name: \"Use 'maybeToList' from Relude\"\n    note: \"'maybeToList' is already exported from Relude\"\n    rhs: maybeToList\n- warn:\n    lhs: Data.Either.isLeft\n    name: \"Use 'isLeft' from Relude\"\n    note: \"'isLeft' is already exported from Relude\"\n    rhs: isLeft\n- warn:\n    lhs: Data.Either.isRight\n    name: \"Use 'isRight' from Relude\"\n    note: \"'isRight' is already exported from Relude\"\n    rhs: isRight\n- warn:\n    lhs: Data.Either.lefts\n    name: \"Use 'lefts' from Relude\"\n    note: \"'lefts' is already exported from Relude\"\n    rhs: lefts\n- warn:\n    lhs: Data.Either.partitionEithers\n    name: \"Use 'partitionEithers' from Relude\"\n    note: \"'partitionEithers' is already exported from Relude\"\n    rhs: partitionEithers\n- warn:\n    lhs: Data.Either.rights\n    name: \"Use 'rights' from Relude\"\n    note: \"'rights' is already exported from Relude\"\n    rhs: rights\n- warn:\n    lhs: Data.Monoid.All\n    name: \"Use 'All' from Relude\"\n    note: \"'All' is already exported from Relude\"\n    rhs: All\n- warn:\n    lhs: Data.Monoid.getAll\n    name: \"Use 'getAll' from Relude\"\n    note: \"'getAll' is already exported from Relude\"\n    rhs: getAll\n- warn:\n    lhs: Data.Monoid.Alt\n    name: \"Use 'Alt' from Relude\"\n    note: \"'Alt' is already exported from Relude\"\n    rhs: Alt\n- warn:\n    lhs: Data.Monoid.getAlt\n    name: \"Use 'getAlt' from Relude\"\n    note: \"'getAlt' is already exported from Relude\"\n    rhs: getAlt\n- warn:\n    lhs: Data.Monoid.Any\n    name: \"Use 'Any' from Relude\"\n    note: \"'Any' is already exported from Relude\"\n    rhs: Any\n- warn:\n    lhs: Data.Monoid.getAny\n    name: \"Use 'getAny' from Relude\"\n    note: \"'getAny' is already exported from Relude\"\n    rhs: getAny\n- warn:\n    lhs: Data.Monoid.Ap\n    name: \"Use 'Ap' from Relude\"\n    note: \"'Ap' is already exported from Relude\"\n    rhs: Ap\n- warn:\n    lhs: Data.Monoid.getAp\n    name: \"Use 'getAp' from Relude\"\n    note: \"'getAp' is already exported from Relude\"\n    rhs: getAp\n- warn:\n    lhs: Data.Monoid.Dual\n    name: \"Use 'Dual' from Relude\"\n    note: \"'Dual' is already exported from Relude\"\n    rhs: Dual\n- warn:\n    lhs: Data.Monoid.getDual\n    name: \"Use 'getDual' from Relude\"\n    note: \"'getDual' is already exported from Relude\"\n    rhs: getDual\n- warn:\n    lhs: Data.Monoid.Endo\n    name: \"Use 'Endo' from Relude\"\n    note: \"'Endo' is already exported from Relude\"\n    rhs: Endo\n- warn:\n    lhs: Data.Monoid.appEndo\n    name: \"Use 'appEndo' from Relude\"\n    note: \"'appEndo' is already exported from Relude\"\n    rhs: appEndo\n- warn:\n    lhs: Data.Monoid.First\n    name: \"Use 'First' from Relude\"\n    note: \"'First' is already exported from Relude\"\n    rhs: First\n- warn:\n    lhs: Data.Monoid.getFirst\n    name: \"Use 'getFirst' from Relude\"\n    note: \"'getFirst' is already exported from Relude\"\n    rhs: getFirst\n- warn:\n    lhs: Data.Monoid.Last\n    name: \"Use 'Last' from Relude\"\n    note: \"'Last' is already exported from Relude\"\n    rhs: Last\n- warn:\n    lhs: Data.Monoid.getLast\n    name: \"Use 'getLast' from Relude\"\n    note: \"'getLast' is already exported from Relude\"\n    rhs: getLast\n- warn:\n    lhs: Data.Monoid.Product\n    name: \"Use 'Product' from Relude\"\n    note: \"'Product' is already exported from Relude\"\n    rhs: Product\n- warn:\n    lhs: Data.Monoid.getProduct\n    name: \"Use 'getProduct' from Relude\"\n    note: \"'getProduct' is already exported from Relude\"\n    rhs: getProduct\n- warn:\n    lhs: Data.Monoid.Sum\n    name: \"Use 'Sum' from Relude\"\n    note: \"'Sum' is already exported from Relude\"\n    rhs: Sum\n- warn:\n    lhs: Data.Monoid.getSum\n    name: \"Use 'getSum' from Relude\"\n    note: \"'getSum' is already exported from Relude\"\n    rhs: getSum\n- warn:\n    lhs: Data.Semigroup.Option\n    name: \"Use 'Option' from Relude\"\n    note: \"'Option' is already exported from Relude\"\n    rhs: Option\n- warn:\n    lhs: Data.Semigroup.getOption\n    name: \"Use 'getOption' from Relude\"\n    note: \"'getOption' is already exported from Relude\"\n    rhs: getOption\n- warn:\n    lhs: Data.Semigroup.Semigroup\n    name: \"Use 'Semigroup' from Relude\"\n    note: \"'Semigroup' is already exported from Relude\"\n    rhs: Semigroup\n- warn:\n    lhs: Data.Semigroup.sconcat\n    name: \"Use 'sconcat' from Relude\"\n    note: \"'sconcat' is already exported from Relude\"\n    rhs: sconcat\n- warn:\n    lhs: Data.Semigroup.stimes\n    name: \"Use 'stimes' from Relude\"\n    note: \"'stimes' is already exported from Relude\"\n    rhs: stimes\n- warn:\n    lhs: \"(Data.Semigroup.<>)\"\n    name: \"Use '<>' from Relude\"\n    note: \"Operator '(<>)' is already exported from Relude\"\n    rhs: \"(<>)\"\n- warn:\n    lhs: Data.Semigroup.WrappedMonoid\n    name: \"Use 'WrappedMonoid' from Relude\"\n    note: \"'WrappedMonoid' is already exported from Relude\"\n    rhs: WrappedMonoid\n- warn:\n    lhs: Data.Semigroup.cycle1\n    name: \"Use 'cycle1' from Relude\"\n    note: \"'cycle1' is already exported from Relude\"\n    rhs: cycle1\n- warn:\n    lhs: Data.Semigroup.mtimesDefault\n    name: \"Use 'mtimesDefault' from Relude\"\n    note: \"'mtimesDefault' is already exported from Relude\"\n    rhs: mtimesDefault\n- warn:\n    lhs: Data.Semigroup.stimesIdempotent\n    name: \"Use 'stimesIdempotent' from Relude\"\n    note: \"'stimesIdempotent' is already exported from Relude\"\n    rhs: stimesIdempotent\n- warn:\n    lhs: Data.Semigroup.stimesIdempotentMonoid\n    name: \"Use 'stimesIdempotentMonoid' from Relude\"\n    note: \"'stimesIdempotentMonoid' is already exported from Relude\"\n    rhs: stimesIdempotentMonoid\n- warn:\n    lhs: Data.Semigroup.stimesMonoid\n    name: \"Use 'stimesMonoid' from Relude\"\n    note: \"'stimesMonoid' is already exported from Relude\"\n    rhs: stimesMonoid\n- warn:\n    lhs: Data.ByteString.ByteString\n    name: \"Use 'ByteString' from Relude\"\n    note: \"'ByteString' is already exported from Relude\"\n    rhs: ByteString\n- warn:\n    lhs: Data.ByteString.Short.ShortByteString\n    name: \"Use 'ShortByteString' from Relude\"\n    note: \"'ShortByteString' is already exported from Relude\"\n    rhs: ShortByteString\n- warn:\n    lhs: Data.ByteString.Short.toShort\n    name: \"Use 'toShort' from Relude\"\n    note: \"'toShort' is already exported from Relude\"\n    rhs: toShort\n- warn:\n    lhs: Data.ByteString.Short.fromShort\n    name: \"Use 'fromShort' from Relude\"\n    note: \"'fromShort' is already exported from Relude\"\n    rhs: fromShort\n- warn:\n    lhs: Data.String.IsString\n    name: \"Use 'IsString' from Relude\"\n    note: \"'IsString' is already exported from Relude\"\n    rhs: IsString\n- warn:\n    lhs: Data.String.fromString\n    name: \"Use 'fromString' from Relude\"\n    note: \"'fromString' is already exported from Relude\"\n    rhs: fromString\n- warn:\n    lhs: Data.Text.Text\n    name: \"Use 'Text' from Relude\"\n    note: \"'Text' is already exported from Relude\"\n    rhs: Text\n- warn:\n    lhs: Data.Text.lines\n    name: \"Use 'lines' from Relude\"\n    note: \"'lines' is already exported from Relude\"\n    rhs: lines\n- warn:\n    lhs: Data.Text.unlines\n    name: \"Use 'unlines' from Relude\"\n    note: \"'unlines' is already exported from Relude\"\n    rhs: unlines\n- warn:\n    lhs: Data.Text.words\n    name: \"Use 'words' from Relude\"\n    note: \"'words' is already exported from Relude\"\n    rhs: words\n- warn:\n    lhs: Data.Text.unwords\n    name: \"Use 'unwords' from Relude\"\n    note: \"'unwords' is already exported from Relude\"\n    rhs: unwords\n- warn:\n    lhs: \"Data.Text.Encoding.decodeUtf8'\"\n    name: \"Use 'decodeUtf8'' from Relude\"\n    note: \"'decodeUtf8'' is already exported from Relude\"\n    rhs: \"decodeUtf8'\"\n- warn:\n    lhs: Data.Text.Encoding.decodeUtf8With\n    name: \"Use 'decodeUtf8With' from Relude\"\n    note: \"'decodeUtf8With' is already exported from Relude\"\n    rhs: decodeUtf8With\n- warn:\n    lhs: Data.Text.Encoding.Error.OnDecodeError\n    name: \"Use 'OnDecodeError' from Relude\"\n    note: \"'OnDecodeError' is already exported from Relude\"\n    rhs: OnDecodeError\n- warn:\n    lhs: Data.Text.Encoding.Error.OnError\n    name: \"Use 'OnError' from Relude\"\n    note: \"'OnError' is already exported from Relude\"\n    rhs: OnError\n- warn:\n    lhs: Data.Text.Encoding.Error.UnicodeException\n    name: \"Use 'UnicodeException' from Relude\"\n    note: \"'UnicodeException' is already exported from Relude\"\n    rhs: UnicodeException\n- warn:\n    lhs: Data.Text.Encoding.Error.lenientDecode\n    name: \"Use 'lenientDecode' from Relude\"\n    note: \"'lenientDecode' is already exported from Relude\"\n    rhs: lenientDecode\n- warn:\n    lhs: Data.Text.Encoding.Error.strictDecode\n    name: \"Use 'strictDecode' from Relude\"\n    note: \"'strictDecode' is already exported from Relude\"\n    rhs: strictDecode\n- warn:\n    lhs: Text.Read.Read\n    name: \"Use 'Read' from Relude\"\n    note: \"'Read' is already exported from Relude\"\n    rhs: Read\n- warn:\n    lhs: Text.Read.readMaybe\n    name: \"Use 'readMaybe' from Relude\"\n    note: \"'readMaybe' is already exported from Relude\"\n    rhs: readMaybe\n- warn:\n    lhs: \"(liftIO (newEmptyMVar ))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'newEmptyMVar' from Relude, it's already lifted\"\n    rhs: newEmptyMVar\n- warn:\n    lhs: \"(liftIO (newMVar x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'newMVar' from Relude, it's already lifted\"\n    rhs: newMVar\n- warn:\n    lhs: \"(liftIO (putMVar x y))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'putMVar' from Relude, it's already lifted\"\n    rhs: putMVar\n- warn:\n    lhs: \"(liftIO (readMVar x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'readMVar' from Relude, it's already lifted\"\n    rhs: readMVar\n- warn:\n    lhs: \"(liftIO (swapMVar x y))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'swapMVar' from Relude, it's already lifted\"\n    rhs: swapMVar\n- warn:\n    lhs: \"(liftIO (takeMVar x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'takeMVar' from Relude, it's already lifted\"\n    rhs: takeMVar\n- warn:\n    lhs: \"(liftIO (tryPutMVar x y))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'tryPutMVar' from Relude, it's already lifted\"\n    rhs: tryPutMVar\n- warn:\n    lhs: \"(liftIO (tryReadMVar x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'tryReadMVar' from Relude, it's already lifted\"\n    rhs: tryReadMVar\n- warn:\n    lhs: \"(liftIO (tryTakeMVar x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'tryTakeMVar' from Relude, it's already lifted\"\n    rhs: tryTakeMVar\n- warn:\n    lhs: \"(liftIO (atomically x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'atomically' from Relude, it's already lifted\"\n    rhs: atomically\n- warn:\n    lhs: \"(liftIO (newTVarIO x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'newTVarIO' from Relude, it's already lifted\"\n    rhs: newTVarIO\n- warn:\n    lhs: \"(liftIO (readTVarIO x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'readTVarIO' from Relude, it's already lifted\"\n    rhs: readTVarIO\n- warn:\n    lhs: \"(liftIO (newTMVarIO x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'newTMVarIO' from Relude, it's already lifted\"\n    rhs: newTMVarIO\n- warn:\n    lhs: \"(liftIO (newEmptyTMVarIO ))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'newEmptyTMVarIO' from Relude, it's already lifted\"\n    rhs: newEmptyTMVarIO\n- warn:\n    lhs: \"(liftIO (exitWith x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'exitWith' from Relude, it's already lifted\"\n    rhs: exitWith\n- warn:\n    lhs: \"(liftIO (exitFailure ))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'exitFailure' from Relude, it's already lifted\"\n    rhs: exitFailure\n- warn:\n    lhs: \"(liftIO (exitSuccess ))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'exitSuccess' from Relude, it's already lifted\"\n    rhs: exitSuccess\n- warn:\n    lhs: \"(liftIO (die x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'die' from Relude, it's already lifted\"\n    rhs: die\n- warn:\n    lhs: \"(liftIO (readFile x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'readFile' from Relude, it's already lifted\"\n    rhs: readFile\n- warn:\n    lhs: \"(liftIO (writeFile x y))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'writeFile' from Relude, it's already lifted\"\n    rhs: writeFile\n- warn:\n    lhs: \"(liftIO (appendFile x y))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'appendFile' from Relude, it's already lifted\"\n    rhs: appendFile\n- warn:\n    lhs: \"(liftIO (readFileText x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'readFileText' from Relude, it's already lifted\"\n    rhs: readFileText\n- warn:\n    lhs: \"(liftIO (writeFileText x y))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'writeFileText' from Relude, it's already lifted\"\n    rhs: writeFileText\n- warn:\n    lhs: \"(liftIO (appendFileText x y))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'appendFileText' from Relude, it's already lifted\"\n    rhs: appendFileText\n- warn:\n    lhs: \"(liftIO (readFileLText x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'readFileLText' from Relude, it's already lifted\"\n    rhs: readFileLText\n- warn:\n    lhs: \"(liftIO (writeFileLText x y))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'writeFileLText' from Relude, it's already lifted\"\n    rhs: writeFileLText\n- warn:\n    lhs: \"(liftIO (appendFileLText x y))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'appendFileLText' from Relude, it's already lifted\"\n    rhs: appendFileLText\n- warn:\n    lhs: \"(liftIO (readFileBS x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'readFileBS' from Relude, it's already lifted\"\n    rhs: readFileBS\n- warn:\n    lhs: \"(liftIO (writeFileBS x y))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'writeFileBS' from Relude, it's already lifted\"\n    rhs: writeFileBS\n- warn:\n    lhs: \"(liftIO (appendFileBS x y))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'appendFileBS' from Relude, it's already lifted\"\n    rhs: appendFileBS\n- warn:\n    lhs: \"(liftIO (readFileLBS x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'readFileLBS' from Relude, it's already lifted\"\n    rhs: readFileLBS\n- warn:\n    lhs: \"(liftIO (writeFileLBS x y))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'writeFileLBS' from Relude, it's already lifted\"\n    rhs: writeFileLBS\n- warn:\n    lhs: \"(liftIO (appendFileLBS x y))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'appendFileLBS' from Relude, it's already lifted\"\n    rhs: appendFileLBS\n- warn:\n    lhs: \"(liftIO (newIORef x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'newIORef' from Relude, it's already lifted\"\n    rhs: newIORef\n- warn:\n    lhs: \"(liftIO (readIORef x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'readIORef' from Relude, it's already lifted\"\n    rhs: readIORef\n- warn:\n    lhs: \"(liftIO (writeIORef x y))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'writeIORef' from Relude, it's already lifted\"\n    rhs: writeIORef\n- warn:\n    lhs: \"(liftIO (modifyIORef x y))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'modifyIORef' from Relude, it's already lifted\"\n    rhs: modifyIORef\n- warn:\n    lhs: \"(liftIO (modifyIORef' x y))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'modifyIORef'' from Relude, it's already lifted\"\n    rhs: \"modifyIORef'\"\n- warn:\n    lhs: \"(liftIO (atomicModifyIORef x y))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'atomicModifyIORef' from Relude, it's already lifted\"\n    rhs: atomicModifyIORef\n- warn:\n    lhs: \"(liftIO (atomicModifyIORef' x y))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'atomicModifyIORef'' from Relude, it's already lifted\"\n    rhs: \"atomicModifyIORef'\"\n- warn:\n    lhs: \"(liftIO (atomicWriteIORef x y))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'atomicWriteIORef' from Relude, it's already lifted\"\n    rhs: atomicWriteIORef\n- warn:\n    lhs: \"(liftIO (getLine ))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'getLine' from Relude, it's already lifted\"\n    rhs: getLine\n- warn:\n    lhs: \"(liftIO (print x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'print' from Relude, it's already lifted\"\n    rhs: print\n- warn:\n    lhs: \"(liftIO (putStr x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'putStr' from Relude, it's already lifted\"\n    rhs: putStr\n- warn:\n    lhs: \"(liftIO (putStrLn x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'putStrLn' from Relude, it's already lifted\"\n    rhs: putStrLn\n- warn:\n    lhs: \"(liftIO (putText x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'putText' from Relude, it's already lifted\"\n    rhs: putText\n- warn:\n    lhs: \"(liftIO (putTextLn x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'putTextLn' from Relude, it's already lifted\"\n    rhs: putTextLn\n- warn:\n    lhs: \"(liftIO (putLText x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'putLText' from Relude, it's already lifted\"\n    rhs: putLText\n- warn:\n    lhs: \"(liftIO (putLTextLn x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'putLTextLn' from Relude, it's already lifted\"\n    rhs: putLTextLn\n- warn:\n    lhs: \"(liftIO (putBS x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'putBS' from Relude, it's already lifted\"\n    rhs: putBS\n- warn:\n    lhs: \"(liftIO (putBSLn x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'putBSLn' from Relude, it's already lifted\"\n    rhs: putBSLn\n- warn:\n    lhs: \"(liftIO (putLBS x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'putLBS' from Relude, it's already lifted\"\n    rhs: putLBS\n- warn:\n    lhs: \"(liftIO (putLBSLn x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'putLBSLn' from Relude, it's already lifted\"\n    rhs: putLBSLn\n- warn:\n    lhs: \"(liftIO (hFlush x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'hFlush' from Relude, it's already lifted\"\n    rhs: hFlush\n- warn:\n    lhs: \"(liftIO (hIsEOF x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'hIsEOF' from Relude, it's already lifted\"\n    rhs: hIsEOF\n- warn:\n    lhs: \"(liftIO (hSetBuffering x y))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'hSetBuffering' from Relude, it's already lifted\"\n    rhs: hSetBuffering\n- warn:\n    lhs: \"(liftIO (hGetBuffering x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'hGetBuffering' from Relude, it's already lifted\"\n    rhs: hGetBuffering\n- warn:\n    lhs: \"(liftIO (getArgs ))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'getArgs' from Relude, it's already lifted\"\n    rhs: getArgs\n- warn:\n    lhs: \"(liftIO (lookupEnv x))\"\n    name: \"'liftIO' is not needed\"\n    note: \"If you import 'lookupEnv' from Relude, it's already lifted\"\n    rhs: lookupEnv\n- hint:\n    lhs: \"fmap (bimap f g)\"\n    note: \"Use `bimapF` from `Relude.Extra.Bifunctor`\"\n    rhs: bimapF f g\n- hint:\n    lhs: \"bimap f g <$> x\"\n    note: \"Use `bimapF` from `Relude.Extra.Bifunctor`\"\n    rhs: bimapF f g x\n- hint:\n    lhs: \"fmap (first f)\"\n    note: \"Use `firstF` from `Relude.Extra.Bifunctor`\"\n    rhs: firstF f\n- hint:\n    lhs: fmap . first\n    note: \"Use `firstF` from `Relude.Extra.Bifunctor`\"\n    rhs: firstF\n- hint:\n    lhs: \"fmap (second f)\"\n    note: \"Use `secondF` from `Relude.Extra.Bifunctor`\"\n    rhs: secondF f\n- hint:\n    lhs: fmap . second\n    note: \"Use `secondF` from `Relude.Extra.Bifunctor`\"\n    rhs: secondF\n- hint:\n    lhs: \"[minBound .. maxBound]\"\n    note: \"Use `universe` from `Relude.Extra.Enum`\"\n    rhs: universe\n- hint:\n    lhs: toEnum\n    note: \"`toEnum` from `Prelude` is a pure function but it may throw exception. Consider using `safeToEnum` from `Relude.Extra.Enum` instead.\"\n    rhs: safeToEnum\n- hint:\n    lhs: sum xs / length xs\n    note: \"Use `average` from `Relude.Extra.Foldable`\"\n    rhs: average xs\n\n- hint:\n    lhs: \"\\\\a -> (a, a)\"\n    note: \"Use `dup`\"\n    rhs: dup\n\n- warn:\n    lhs: \"() <$ a\"\n    rhs: void a\n\n- hint:\n    lhs: \"pass\"\n    note: \"Use 'stub'\"\n    rhs: stub\n\n- hint:\n    lhs: \"bool mempty a b\"\n    note: \"Use `whenTrue`\"\n    rhs: a `whenTrue` b\n\n- hint:\n    lhs: \"bool a mempty b\"\n    note: \"Use `whenFalse`\"\n    rhs: a `whenFalse` b\n\n- hint:\n    lhs: \"maybe mempty a b\"\n    note: \"Use `whenJust`\"\n    rhs: a `whenJust` b\n\n- hint:\n    lhs: \"(mempty, mempty)\"\n    note: \"Is `mempty`\"\n    rhs: mempty\n\n- hint:\n    lhs: \"concat a\"\n    note: \"Use `fold`\"\n    rhs: fold a\n\n- hint:\n    lhs: \"mconcat a\"\n    note: \"Use `fold`\"\n    rhs: fold a\n\n- hint:\n    lhs: \"concatMap a\"\n    note: \"Use `foldMap`\"\n    rhs: foldMap a\n\n- hint:\n    lhs: \"[a]\"\n    note: \"Use `one`\"\n    rhs: (one a)\n\n# Submitted upstream: https://github.com/ndmitchell/hlint/pull/1309 remove when merges\n- hint:\n    lhs: \"either Left f e\"\n    note: \"Use `=<<`\"\n    rhs: f =<< e\n\n- warn: {lhs: \"init (one x)\", rhs: \"mempty\", name: Evaluate}\n- warn: {lhs: \"null (one x)\", rhs: \"False\", name: Evaluate}\n- warn: {lhs: \"foldr1 f (one x)\", rhs: x, name: Evaluate}\n- warn: {lhs: \"scanr f z mempty\", rhs: \"one z\", name: Evaluate}\n- warn: {lhs: \"scanr1 f mempty\", rhs: \"mempty\", name: Evaluate}\n- warn: {lhs: \"scanr1 f (one x)\", rhs: \"one x\", name: Evaluate}\n- warn: {lhs: \"fold (one a)\", rhs: a, name: Evaluate}\n- warn: {lhs: \"cycle (one x)\", rhs: repeat x}\n- hint: {lhs: \"\\\\x -> one x\", rhs: \"(one x)\"}\n- hint: {lhs: \"elem x (one y)\", rhs: x == y, note: ValidInstance Eq a}\n- hint: {lhs: \"notElem x (one y)\", rhs: x /= y, note: ValidInstance Eq a}\n- warn: {lhs: \"sequenceA (one a)\", rhs: \"pure <$> a\"}\n- warn: {lhs: \"head $ x <> one y\", rhs: \"headDef y x\"}\n- warn: {lhs: \"pictures (one p)\", rhs: p, name: Evaluate}\n\n- hint:\n    lhs: \"x : mempty\"\n    note: \"Use `one`\"\n    rhs: one x\n- hint:\n    lhs: \"x :| mempty\"\n    note: \"Use `one`\"\n    rhs: one x\n\n- hint:\n    lhs: \"join . fmap join\"\n    note: \"Monad law\"\n    rhs: join . join\n\n- hint:\n    lhs: \"join . fmap pure\"\n    note: \"Monad law\"\n    rhs: id\n\n- hint:\n    lhs: \"join . pure\"\n    note: \"Monad law\"\n    rhs: id\n\n- hint:\n    lhs: \"join (f . pure)\"\n    note: \"Monad law\"\n    rhs: (f =<< pure)\n\n- hint:\n    lhs: \"join . (f <<$>>)\"\n    note: \"Monad law\"\n    rhs: fmap f . join\n\n- hint:\n    lhs: \"Data.Traversable.sequence\"\n    note: \"Modern name is `sequenceA`\"\n    rhs: sequenceA\n\n- hint:\n    lhs: \"()\"\n    note: \"Use `mempty`\"\n    rhs: mempty\n\n- hint:\n    lhs: \"return\"\n    note: \"Please, use `pure` instead. even GHC already deprecates `return` starting from `9.2`.\"\n    rhs: pure\n\n- hint:\n    lhs: \"map\"\n    note: \"Use `fmap`\"\n    rhs: fmap\n\n- hint:\n    lhs: \"mapM\"\n    note: \"Use `traverse`\"\n    rhs: traverse\n\n- hint:\n    lhs: \"unless b\"\n    note: \"Use `when not` as it reads intuitively.\"\n    rhs: when (not b)\n"
  },
  {
    "path": "CLAUDE.md",
    "content": "# HNix Codebase Guide for Claude Code\n\nThis guide provides essential context for working with HNix - a Haskell implementation of the Nix expression language using advanced functional programming techniques including recursion schemes and abstract definitional interpreters.\n\n## Quick Start Commands\n\n### Essential Development Workflow\n```bash\n# Enter development environment\nnix-shell\n\n# Build the project\ncabal v2-configure\ncabal v2-build\n\n# Run a single test\ncabal v2-test --test-options=\"--pattern '/Parser/basic literals/'\"\n\n# Interactive REPL for exploration\ncabal v2-repl\n> :load Nix.Eval\n> :type evalExprLoc\n\n# Quick evaluation test\ncabal v2-run hnix -- --eval --expr '1 + 1'\n```\n\n### Testing Commands\n```bash\n# Standard test suite\ncabal v2-test\n\n# All tests including Nixpkgs parsing (slow)\nenv ALL_TESTS=yes cabal v2-test\n\n# Only Nixpkgs compatibility tests\nenv NIXPKGS_TESTS=yes cabal v2-test\n\n# Pretty-printer round-trip tests\nenv PRETTY_TESTS=yes cabal v2-test\n\n# Test with coverage\ncabal v2-configure --enable-coverage\ncabal v2-test --enable-coverage\n```\n\n### Debugging & Profiling\n```bash\n# Memory profiling (upload .prof to speedscope.app)\ncabal v2-run --enable-profiling --flags=profiling \\\n  hnix -- --eval --expr 'builtins.length [1 2 3]' +RTS -hy -l\n\n# Stack trace on error\ncabal v2-run hnix -- --trace --eval --expr 'throw \"error\"' +RTS -xc\n\n# Heap profiling for thunk leaks\ncabal v2-run hnix -- --eval --expr 'import <nixpkgs> {}' \\\n  +RTS -h -i0.1 -RTS && hp2ps -e8in -c hnix.hp\n\n# Reduce complex expressions for minimal repro\nhnix --reduce bug.nix --eval --expr 'import ./bug.nix'\n```\n\n## Architecture: Working with Recursion Schemes\n\n### Core Expression Types\n```haskell\n-- The functor (non-recursive structure)\ndata NExprF r  -- 18 constructors: NConstant, NStr, NSym, NList, etc.\n\n-- Fixed point gives recursion\ntype NExpr = Fix NExprF\n\n-- Location annotations via composition\ntype NExprLoc = Fix (AnnF SrcSpan NExprF)\n```\n\n### Using ADI for Custom Behavior\n\nThe `adi` function (`src/Nix/Utils.hs:345`) enables behavior injection:\n\n```haskell\n-- Example: Add tracing to evaluation\ntracingEval :: NExprLoc -> m (NValue t f m)\ntracingEval = adi addTrace baseEval\n  where\n    addTrace :: Transform NExprLocF (m (NValue t f m))\n    addTrace f e = do\n      traceM $ \"Evaluating: \" ++ show (void e)\n      result <- f e\n      traceM $ \"Result: \" ++ show result\n      pure result\n```\n\nCommon ADI use cases:\n- **Error context**: `evalWithMetaInfo = adi addMetaInfo evalContent`\n- **Profiling**: Inject timing measurements at each recursion\n- **Memoization**: Cache results of sub-expressions\n- **Debugging**: Track evaluation path\n\n### Free Monad Value System\n\n```haskell\ntype NValue t f m = Free (NValue' t f m) t\n-- Pure t = thunk (unevaluated)\n-- Free v = evaluated value\n```\n\n**Memory implications**:\n- Thunks accumulate until forced\n- Use `force` explicitly to prevent buildup\n- Monitor with `+RTS -s` for thunk statistics\n\n## Working with the Effect System\n\n### Core Type Classes\n\n```haskell\nclass MonadEval v m where\n  evalExprLoc :: NExprLoc -> m v  -- Evaluate expression\n  evalError :: Doc v -> m a        -- Report error\n\nclass MonadThunk t m a | t -> m a where\n  thunk :: m a -> m t              -- Create thunk\n  force :: t -> m a                -- Force evaluation\n\nclass (MonadEval v m, MonadThunk t m v) => MonadNix e t f m\n```\n\n### Adding New Effects\n\n```haskell\n-- Define capability\nclass Monad m => MonadMyEffect m where\n  myOperation :: String -> m Int\n\n-- Add to evaluation monad\nnewtype MyNix m a = MyNix (ReaderT MyEnv m a)\n  deriving (Functor, Applicative, Monad)\n\ninstance MonadMyEffect (MyNix m) where\n  myOperation s = MyNix $ asks (lookupThing s . myEnvData)\n```\n\n## Extending HNix\n\n### Adding Built-ins\n\n1. Add to `src/Nix/Builtins.hs`:\n```haskell\nbuiltinsList :: [(Text, BuiltinType)]\nbuiltinsList =\n  [ (\"myBuiltin\", arity2 myBuiltinImpl)\n  -- ...\n  ]\n\nmyBuiltinImpl :: MonadNix e t f m => NValue t f m -> NValue t f m -> m (NValue t f m)\nmyBuiltinImpl arg1 arg2 = do\n  -- Force evaluation if needed\n  str <- fromStringNoContext =<< fromValue arg1\n  num <- fromValue arg2\n  -- Perform operation\n  pure $ nvStr $ makeNixString (str <> show num)\n```\n\n2. Test in `tests/EvalTests.hs`\n3. Document behavior matching Nix semantics\n\n### Modifying Evaluation\n\n```haskell\n-- Hook into evaluation via MonadEval instance\ninstance MonadEval (NValue t f m) MyCustomNix where\n  evalExprLoc expr = do\n    -- Pre-evaluation hook\n    logExpression expr\n    -- Delegate to standard evaluation\n    result <- standardEvalExprLoc expr\n    -- Post-evaluation hook\n    recordMetrics expr result\n    pure result\n```\n\n## Common Pitfalls & Solutions\n\n### Memory Issues\n\n**Problem**: Thunk accumulation causing memory exhaustion\n```haskell\n-- BAD: Builds huge thunk chain\nfoldl' (\\acc x -> thunk (acc + x)) 0 [1..1000000]\n\n-- GOOD: Forces evaluation incrementally\nfoldl' (\\acc x -> force acc >>= \\a -> pure (a + x)) 0 [1..1000000]\n```\n\n**Problem**: Lazy fields in strict data\n```haskell\n-- BAD: ~ makes field lazy despite ! on data\ndata MyData = MyData { ~myField :: !Int }\n\n-- GOOD: Strict field in strict data\ndata MyData = MyData { myField :: !Int }\n```\n\n### Debugging Infinite Recursion\n\n1. Enable tracing: `--trace` flag\n2. Use `--reduce` to minimize test case\n3. Add ADI transform to track recursion depth:\n```haskell\ndepthCheck :: Transform NExprLocF (ReaderT Int m (NValue t f m))\ndepthCheck f e = do\n  depth <- ask\n  when (depth > 1000) $ error \"Recursion limit\"\n  local (+1) (f e)\n```\n\n### Performance Optimization\n\n**Profile first**:\n```bash\n# Generate flamegraph\ncabal v2-run hnix -- --eval --expr 'import <nixpkgs> {}' \\\n  +RTS -p -RTS\n```\n\n**Common optimizations**:\n1. Add strictness annotations to accumulators\n2. Use `HashMap` instead of association lists\n3. Cache frequently computed values\n4. Specialize polymorphic functions with `{-# SPECIALIZE #-}`\n\n## Module Organization & Dependencies\n\n### Layered Architecture\n```\n┌─────────────────┐\n│   Builtins      │ (100+ built-in functions)\n├─────────────────┤\n│   Effects       │ (MonadNix, MonadEval constraints)\n├─────────────────┤\n│   Exec          │ (High-level evaluation)\n├─────────────────┤\n│   Eval          │ (Core evaluation with ADI)\n├─────────────────┤\n│   Value/Thunk   │ (Free monad values, lazy evaluation)\n├─────────────────┤\n│   Expr          │ (NExprF functor, parser, pretty-printer)\n└─────────────────┘\n```\n\n### Key Files for Common Tasks\n\n- **Adding language features**: Start with `src/Nix/Parser.hs`, add to `NExprF` in `src/Nix/Expr/Types.hs`\n- **Modifying evaluation**: `src/Nix/Eval.hs` for core, `src/Nix/Exec.hs` for high-level\n- **Debugging issues**: `src/Nix/Reduce.hs` for test reduction, `src/Nix/Cited.hs` for error context\n- **Performance work**: `src/Nix/Thunk/Basic.hs` for thunk implementation\n- **Built-in functions**: `src/Nix/Builtins.hs` - match Nix semantics exactly\n\n## Testing Philosophy\n\n### Test Categories\n- **Language tests** (`tests/NixLanguageTests.hs`): Official Nix test suite\n- **Evaluation tests** (`tests/EvalTests.hs`): HNix-specific behavior\n- **Parser tests** (`tests/ParserTests.hs`): Round-trip properties\n- **Pretty tests** (`tests/PrettyTests.hs`): Pretty-printer correctness\n\n### Writing Effective Tests\n```haskell\n-- Property-based test for parser round-trip\nprop_parse_pretty :: NExpr -> Property\nprop_parse_pretty expr =\n  parseNixText (prettyNix expr) === Right expr\n\n-- Golden test for evaluation\ngoldenEval :: String -> NExpr -> TestTree\ngoldenEval name expr = goldenVsString name path $ do\n  result <- runLazyM defaultOptions $ evalExprLoc expr\n  pure $ encodeUtf8 $ prettyNValue result\n```\n\n## Important Implementation Notes\n\n### Custom Prelude\nUses `relude` with project utilities in `Nix.Utils`. Key differences:\n- `panic` instead of `error` for impossible cases\n- `pass` for noop in do-blocks\n- Strict `Text` by default\n\n### String Context\nNix strings carry derivation context - critical for store paths:\n```haskell\n-- Context propagates through operations\nmakeNixString :: Text -> NixString  -- No context\nmakeNixStringWithContext :: Text -> Context -> NixString\n```\n\n### Store Integration\n**Warning**: `derivationStrict` creates real `/nix/store` entries. Use `--dry-run` for testing.\n\n### Position Tracking\nCustom `NSourcePos` for performance - strict fields prevent memory leaks during parsing.\n\n## Current Status & Goals\n\n**Primary Goal**: Evaluate all of Nixpkgs\n```bash\nhnix --eval --expr \"import <nixpkgs> {}\" --find\n```\n\n**Working**: Parser, lazy evaluation, most built-ins, REPL, type inference\n**In Progress**: Full Nixpkgs evaluation, performance optimization\n**Known Issues**: Tests disabled by default (`doCheck = false`) due to store interaction\n\n## Resources\n\n- [Win for Recursion Schemes](https://newartisans.com/2018/04/win-for-recursion-schemes/) - Essential architectural context\n- [Design of HNix](https://github.com/haskell-nix/hnix/wiki/Design-of-the-HNix-code-base)\n- [Gitter Chat](https://gitter.im/haskell-nix/Lobby)"
  },
  {
    "path": "CODEOWNERS",
    "content": "/ @jwiegley"
  },
  {
    "path": "ChangeLog.md",
    "content": "\n# ChangeLog\n\n## [(diff)](https://github.com/haskell-nix/hnix/compare/0.16.0...0.17.0#files_bucket) 0.17.0\n\n* Additional\n  * `Nix.Effect`\n    * [(link)](https://github.com/haskell-nix/hnix/pull/1051) Introduction of new type NarContent, a tagged union type of `byteString` and `FilePath`.\n    * [(link)](https://github.com/haskell-nix/hnix/pull/1051) getURL of instance MonadHttp IO is finally working through hnix-store. Which also means\n      builtins.fetchurl is working through it.\n* Breaking:\n  * `Nix.Effect`\n    * [(link)](https://github.com/haskell-nix/hnix/pull/1051) MonadStore's addToStore signature changed to `StorePathName -> NarContent -> RecursiveFlag -> RepairFlag -> m (Either ErrorCall StorePath)` with new introduction of NarContent. Which enable us to add byteString as file to Store. It is corresponding to the hnix-store api change.\n  * `Nix.Expr.Types`\n    * [(link)](https://github.com/haskell-nix/hnix/pull/1042/files) The central HNix type `NExprF` changed, the `NApp` was moved out of `NBinary` & now a `NExprF` constructor of its own, the type signatures were changed accordingly.\n    * [(link)](https://github.com/haskell-nix/hnix/pull/1038/files) project was using `megaparsec` `{,Source}Pos` and to use it shipped a lot of orphan instances. To improve the situation & performance (reports [#1026](https://github.com/haskell-nix/hnix/issues/1026), [#746](https://github.com/haskell-nix/hnix/issues/746)) project uses `N{,Source}Pos` types, related type signatures were changed accordingly.\n  * `Nix.Value`\n    * [(link)](https://github.com/haskell-nix/hnix/pull/1046/files) Unify builder `mkNV*` and `NV*` patterns by bidirectional synonyms, a lot of builders `mkNV*` are removed, and merged to `NV*`. e.g. instead of builder `mkNVList`, `NVList` should be used.\n    * [(link)](https://github.com/haskell-nix/hnix/pull/1046/files) Constraint `NVConstraint f = (Comonad f, Applicative f)` was introduced, in order to unify builder `mkNV*` and `NV*` patterns.\n\n  * `Nix.Parser`:\n    * [(link)](https://github.com/haskell-nix/hnix/pull/1047/files) rm `OperatorInfo`, using `NOperatorDef`. Number of functions changed signatures accordingly:\n    * In `Nix.Pretty`:\n      * `NixDoc ann`\n      * `mkNixDoc`\n      * `selectOp`\n      * `hasAttrOp`\n      * `precedenceWrap`\n      * `wrapPath`\n    * In `Nix.Parser`:\n      * rm `get{App,Unary,Binary,Special}Operator`, currely `NOp` class instances are used instead.\n    \n  * `Nix.Pretty`:\n    * [(link)](https://github.com/haskell-nix/hnix/pull/1047/files) rm `appOp`, instead use `appOpDef`.\n    * [(link)](https://github.com/haskell-nix/hnix/pull/1047/files) `precedenceWrap` behaviour is changed (to be literal to the name), the old behaviour is now a `wrap` function.\n\n## [(diff)](https://github.com/haskell-nix/hnix/compare/0.15.0...0.16.0#files_bucket) 0.16.0\n\nOn update problems, please reach out to us. For support refere to: https://github.com/haskell-nix/hnix/issues/984\n\nPartial log (for now):\n\n* Breaking:\n  * Where `coerce` should work, removed `newtype` accessors.\n  * [(link)](https://github.com/haskell-nix/hnix/pull/1006/files), [(link)](https://github.com/haskell-nix/hnix/pull/1009/files) Incomprehensible record accessors zoo like: `arg`, `options`, `unStore`, `scFlavor`, `nsContext` `_provenance` - was organized, now all record accessors start with `get*`, and their names tend to have according unique sematic meaning of data action they do.\n  * Builder names got unified. Now they all start with `mk*`. So a lof of `nvSet` became `mkNVSet`.\n  * `Nix.String` builders/destructors instead of `make` use `mk`, & where mentioning of `string` is superflous - dropped it from the name, so `stringIgnoreContext`, became `ignoreContext`.\n  * Type system:\n    * Things that are paths are now `newtype Path = Path String`.\n    * Things that are indentifier names are now `newtype VarName = VarName Text`.\n    * Function signatures changed accordingly.\n\n* Additional:\n  * [(link)](https://github.com/haskell-nix/hnix/pull/1019) Matched expression escaping & its representation to breaking changes in Nix `2.4`.\n  * `Builtins` (`builtins` function set) gained functions:\n    * [(link)](https://github.com/haskell-nix/hnix/pull/1032) `path`\n    * [(link)](https://github.com/haskell-nix/hnix/pull/1020) `isPathNix`\n    * [(link)](https://github.com/haskell-nix/hnix/pull/1032) `unsafeDiscardOutputDependency`\n    * [(link)](https://github.com/haskell-nix/hnix/pull/1031) `ceil`\n    * [(link)](https://github.com/haskell-nix/hnix/pull/1031) `floor`\n    * [(link)](https://github.com/haskell-nix/hnix/pull/1021) `hashFile`\n    * [(link)](https://github.com/haskell-nix/hnix/pull/1033) `groupBy`\n  * [(link)](https://github.com/haskell-nix/hnix/pull/1029) `data/nix` submodule (& its tests) updated to 2022-01-17.\n\n* Other notes:\n  * `Shorthands` was kept untouched.\n\n## [(diff)](https://github.com/haskell-nix/hnix/compare/0.14.0...0.15.0#files_bucket) 0.15.0\n\nFor support refere to: https://github.com/haskell-nix/hnix/issues/984\n\nPartial log (for now):\n\n* Breaking:\n\n  * `Nix.Expr.Shorthands`:\n    * `inherit{,From}`:\n      * dropped second(/third) argument as irrelevant ([report](https://github.com/haskell-nix/hnix/issues/326))\n      * bindings to inherit changed type from complex `[NKeyName]` (which is for static & dynamic keys) to `[VarName]` (`VarName` is newtype of `Text`).\n      * So examples of use now are: `inherit [\"a\", \"b\"]`, `inheritFrom (var \"a\") [\"b\", \"c\"]`\n    * `mkAssert`: fixed ([report](https://github.com/haskell-nix/hnix/issues/969)).\n    * fx presedence between the operators:\n        \n        ```haskell\n        (@@), (@.), (@./), ($==), ($!=), ($<), ($<=), ($>), ($>=), ($&&), ($||), ($->), ($//), ($+), ($-), ($*), ($/), ($++), (==>)\n        ```\n        \n        Now these shorthands can be used without sectioning & so represent the Nix expressions one to one.\n        \n        ```haskell\n        nix = \"           a/b   //            c/def   //           <g>  <             def/d\"\n        hask = mkRelPath \"a/b\" $// mkRelPath \"c/def\" $// mkEnvPath \"g\" $<  mkRelPath \"def/d\"\n        ```\n\n* Additional\n  * `Nix.Expr.Shorthands`:\n    * added:\n      * `emptySet`\n      * `emptyList`\n      * `mkOp{,2}`\n      * `mk{,Named,Variadic,General}ParamSet`\n      * `mkNeg` - number negation.\n      * `@.<|>` for Nix language `s.x or y` expession.\n    * entered deprecation:\n      * `mkOper{,2}` bacame `mkOp{,2}`.\n      * `mkBinop` became `mkOp2`.\n      * `mkParaset` supeceeded by `mk{,Named{,Variadic},Variadic,General}ParamSet`.\n    * fixed:\n      * `mkAssert` was creating `with`, now properly creates `assert`.\n\n## [(diff)](https://github.com/haskell-nix/hnix/compare/0.13.1...0.14.0#files_bucket) 0.14.0 (2021-07-08)\n\n* GHC 9.0 support.\n\n* HNix switched to pre-0.9 style of log (aka \"no log\"). We temporarily stopped producing log, choosing effectiveness over writing about it.\n\n* All changes seem trivial (from the inside). There is no changes in `Nix.Expr.Shorthands` module. Would there be difficulties in migration - please write to us - we would tackle & solve it togather.\n\nA partial log:\n\n* Breaking:\n\n  * `Nix.Effects`:\n    * rm `pathExits` in favour of `doesPathExist` (in `Nix.Render`: `class MonadFile`: `doesPathExist`)\n\n  * `Nix.Var`: was found being superflous ([report](https://github.com/haskell-nix/hnix/issues/946)), so reduced. use `Control.Monad.Ref` instead.\n\n  * `Nix.Normal`\n    * rename `opaque(,->Val)`, indicate that it is a literal.\n  \n  * `Nix.Thunk`:\n    * `class MonadThunkId m => MonadThunk{,F} t m a`:\n      * rename `query(M->){,F}`\n\n* Additional:\n\n  * `Nix.Utils`:\n    * added type `TransformF`\n\n  * `Nix.Eval`:\n    * added fun:\n      * `evalContent`\n      * `addMetaInfo`\n      \n  * `Nix.Types.Assumption`:\n    * added instances:\n      * `Assumption`: `{Semigroup,Monoid,One}`\n\n  * `Nix.Type.Env`:\n    * added instances:\n      * `Env`: `{Semigroup,Monoid,One}`\n  \n  * `Nix`:\n    * changed argument order:\n      * `nixEval`:\n        \n        ```haskell\n        -- was:\n          => Maybe FilePath -> Transform g (m a) -> Alg g (m a) -> Fix g -> m a\n        -- became:\n          => Transform g (m a) -> Alg g (m a) -> Maybe FilePath -> Fix g -> m a\n        ```\n        \n  * `Nix.Normal`\n    * add `thunkVal` literal & use it where appropriate `{deThunk, removeEffects}`\n      \n  * `Nix.Thunk.Basic`:\n    * export `deferred`\n\n\n### [(diff)](https://github.com/haskell-nix/hnix/compare/0.13.0.1...0.13.1#files_bucket) 0.13.1 (2021-05-22)\n  * [(link)](https://github.com/haskell-nix/hnix/pull/936/files) `Nix.Parser`: `annotateLocation`: Fix source location preservation.\n  * [(link)](https://github.com/haskell-nix/hnix/pull/934/files) Require Cabal dependency `relude` `>= 1.0`: since imports & Cabal file got cleaned-up & that clean-up depends on `relude` reimports introduced in aforementioned version.\n  * Refactors, reorganization in some modules, docs, clean-ups.\n\n#### [(diff)](https://github.com/haskell-nix/hnix/compare/0.13.0...0.13.0.1#files_bucket) 0.13.0.1 (2021-05-11)\n  * [(link)](https://github.com/haskell-nix/hnix/pull/931/files) `Nix.Expr.Types`: Fix CPP on `Instances.TH.Lift` import.\n\n## [(diff)](https://github.com/haskell-nix/hnix/compare/0.12.0...0.13.0#files_bucket) 0.13.0 (2021-05-10)\n\n* Breaking:\n\n  * [(link)](https://github.com/haskell-nix/hnix/pull/859/files) [(link)](https://github.com/haskell-nix/hnix/pull/863/files) [(link)](https://github.com/haskell-nix/hnix/pull/866/files) `Nix.Thunk`: `class MonadThunk t m a | t -> m, t -> a`. Class was initially designed with Kleisli arrows (`v -> m a`) in mind, which where put to have the design open and inviting customization & integration. Those functional arguments are for custom implementation, so  which in reality of the project were never used and HNax just \"essentially\" (simplifying, because `pure` was mixed with monadic binds to `f`) was passing `pure` into them (actually, `f <=< pure`). These Kliesli functors got arguments sorted properly and were moved to a `MonadThunkF` class and names gained `*F`. And `MonadThunk` now does only what is needed, for example `force` gets the thunk and computes it. All `MonadThunk{,F}` functions become with a classic Haskell arguments order, specialized, and got more straigh-forward to understand and use, and so now they tail recurse also.\n      \n      Now, for example, instead of `force t f` use it as `v <- force t` `f =<< force t`, or `f <=< force`.\n      \n      tl;dr: results:\n      \n      ```haskell\n      class MonadThunkId m => MonadThunk t m a | t -> m, t -> a where\n      \n        thunkId  :: t -> ThunkId m\n      \n        thunk    :: m a -> m t\n      \n        queryM   :: m a -> t -> m a\n        -- old became `queryMF`\n      \n        force    :: t -> m a\n        -- old became `forceF`\n      \n        forceEff :: t -> m a\n        -- old became `forceEffF`\n      \n        further  :: t -> m t\n        -- old became `furtherF`\n      \n      \n      -- | Class of Kleisli functors for easiness of customized implementation developlemnt.\n      class MonadThunkF t m a | t -> m, t -> a where\n\n        queryMF   :: (a   -> m r) -> m r -> t -> m r\n        -- was :: t -> m r -> (a   -> m r) -> m r\n\n        forceF    :: (a   -> m r) -> t   -> m r\n        -- was :: t   -> (a   -> m r) -> m r\n\n        forceEffF :: (a   -> m r) -> t   -> m r\n        -- was :: t   -> (a   -> m r) -> m r\n\n        furtherF  :: (m a -> m a) -> t   -> m t\n        -- was :: t   -> (m a -> m a) -> m t\n\n      ```\n      \n  * [(link)](https://github.com/haskell-nix/hnix/pull/862/files) [(link)](https://github.com/haskell-nix/hnix/pull/870/files) [(link)](https://github.com/haskell-nix/hnix/pull/871/files)  [(link)](https://github.com/haskell-nix/hnix/pull/872/files) [(link)](https://github.com/haskell-nix/hnix/pull/873/files) `Nix.Value.Monad`: `class MonadValue v m`: instances became specialized, Kleisli versions unflipped the arguments of methods into a classical order and moved to the `class MonadValueF`. As a result, `demand` now gets optimized by GHC and also tail recurse. Please, use `f =<< demand t`, or just use `demandF`, while `demandF` in fact just `kleisli =<< demand t`.\n      \n      ```haskell\n      class MonadValue v m where\n      \n        demand :: v       ->         m v\n        -- old became `demandF`\n\n        inform :: v -> m v\n        -- old became `informF`\n      \n\n      class MonadValueF v m where\n\n        demandF :: (v -> m r) -> v -> m r\n        -- was :: v -> (v -> m r) -> m r\n\n        informF :: (m v -> m v) -> v -> m v\n        -- was :: v -> (m v -> m v) -> m v\n      ```\n      \n  * [(link)](https://github.com/haskell-nix/hnix/pull/863/files) `Nix.Normal`: `normalizeValue` removed first functional argument that was passing the function that did the thunk forcing. Now function provides the thunk forcing. Now to normalize simply use `normalizeValue v`. Old implementation now is `normalizeValueF`.\n\n  * [(link)](https://github.com/haskell-nix/hnix/pull/859/commits/8e043bcbda13ea4fd66d3eefd6da690bb3923edd) `Nix.Value.Equal`: `valueEqM`: freed from `RankNTypes: forall t f m .`.\n\n  * [(link)](https://github.com/haskell-nix/hnix/pull/802/commits/529095deaf6bc6b102fe5a3ac7baccfbb8852e49#) `Nix.Strings`: all `hacky*` functions replaced with lawful implemetations, because of that all functions become lawful - dropped the `principled` suffix from functions:\n    * `Nix.String`:\n        ```haskell\n        hackyGetStringNoContext          ->\n             getStringNoContext\n        hackyStringIgnoreContext         ->\n             stringIgnoreContext\n        hackyMakeNixStringWithoutContext ->\n             makeNixStringWithoutContext\n\n        principledMempty        -> mempty\n        principledStringMempty  -> mempty\n        principledStringMConcat -> mconcat\n        principledStringMappend -> mappend\n\n        principledGetContext                        ->\n                  getContext\n        principledMakeNixString                     ->\n                  makeNixString\n        principledIntercalateNixStrin               ->\n                  intercalateNixString\n        principledGetStringNoContext                ->\n                  getStringNoContext\n        principledStringIgnoreContext               ->\n                  stringIgnoreContext\n        principledMakeNixStringWithoutContext       ->\n                  makeNixStringWithoutContext\n        principledMakeNixStringWithSingletonContext ->\n                  makeNixStringWithSingletonContext\n        principledModifyNixContents                 ->\n                  modifyNixContents\n        ```\n\n  * [(link)](https://github.com/haskell-nix/hnix/pull/805/files):\n    * Data type: `MonadFix1T t m`: `Nix.Standard` -> `Nix.Utils.Fix1`\n    * Children found their parents:\n        \n        ```haskell\n        Binary   NAtom :: Nix.Expr.Types -> Nix.Atoms\n        FromJSON NAtom :: Nix.Expr.Types -> Nix.Atoms\n        ToJSON   NAtom :: Nix.Expr.Types -> Nix.Atoms\n\n        Eq1 (NValueF p m)     :: Nix.Value.Equal -> Nix.Value\n\n        Eq1 (NValue' t f m a) :: Nix.Value.Equal -> Nix.Value \n\n        HasCitations m v (NValue' t f m a) :: Nix.Pretty -> Nix.Cited\n        HasCitations m v (NValue  t f m)   :: Nix.Pretty -> Nix.Cited\n\n        when\n          (package hashable >= 1.3.1) -- gained instance\n          $ Hashable1 NonEmpty:: Nix.Expr.Types -> Void -- please use upstreamed instance\n\n        -- | Was upstreamed, released in `ref-tf >= 0.5`.\n        MonadAtomicRef   (ST s) :: Nix.Standard -> Void\n\n        MonadAtomicRef   (Fix1T t m) :: Nix.Standard -> Nix.Utils.Fix1\n        MonadRef         (Fix1T t m) :: Nix.Standard -> Nix.Utils.Fix1\n        MonadEnv         (Fix1T t m) :: Nix.Standard -> Nix.Effects\n        MonadExec        (Fix1T t m) :: Nix.Standard -> Nix.Effects\n        MonadHttp        (Fix1T t m) :: Nix.Standard -> Nix.Effects\n        MonadInstantiate (Fix1T t m) :: Nix.Standard -> Nix.Effects\n        MonadIntrospect  (Fix1T t m) :: Nix.Standard -> Nix.Effects\n        MonadPaths       (Fix1T t m) :: Nix.Standard -> Nix.Effects\n        MonadPutStr      (Fix1T t m) :: Nix.Standard -> Nix.Effects\n        MonadStore       (Fix1T t m) :: Nix.Standard -> Nix.Effects\n        MonadFile        (Fix1T t m) :: Nix.Standard -> Nix.Render\n\n        MonadEnv         (Fix1 t)    :: Nix.Standard -> Nix.Effects\n        MonadExec        (Fix1 t)    :: Nix.Standard -> Nix.Effects\n        MonadHttp        (Fix1 t)    :: Nix.Standard -> Nix.Effects\n        MonadInstantiate (Fix1 t)    :: Nix.Standard -> Nix.Effects\n        MonadIntrospect  (Fix1 t)    :: Nix.Standard -> Nix.Effects\n        MonadPaths       (Fix1 t)    :: Nix.Standard -> Nix.Effects\n        MonadPutStr      (Fix1 t)    :: Nix.Standard -> Nix.Effects\n        ```\n  * [(link)](https://github.com/haskell-nix/hnix/pull/878/files) `Nix.Value`: `nvSet{,',P}`: got unflipped, now accept source position argument before the value.\n  \n  * [(link)](https://github.com/haskell-nix/hnix/pull/878/files) `Nix.Pretty`: `mkNixDoc`: got unflipped.\n  \n  * [(link)](https://github.com/haskell-nix/hnix/pull/886/commits/381b0e5df9cc620a25533ff1c84045a4ea37a833) `Nix.Value`: Data constructor for `NValue' t f m a` changed (`NValue -> NValue'`).\n  \n  * [(link)](https://github.com/haskell-nix/hnix/pull/884/files) `Nix.Parser`: `Parser`: Data type was equivalent to `Either`, so became a type synonim for `Either`.\n\n  * [(link)](https://github.com/haskell-nix/hnix/pull/884/files) `Nix.Thunk.Basic`: `instance MonadThunk (NThunkF m v) m v`: `queryM`: implementation no longer blocks the thunk resource it only reads from.\n  \n  * [(link)](https://github.com/haskell-nix/hnix/pull/908/files): Migrated `(String -> Text)`:\n    * `Nix.Value`: `{NValueF, nvBuiltin{,'}, builtin{,2,3}, describeValue}`\n    * `Nix.Eval`: `MonadNixEval`\n    * `Nix.Render.Frame`: `render{Expr,Value}`\n    * `Nix.Type`: `TVar`\n    * `Nix.Thunk`: `ThunkLoop`\n    * `Nix.Exec`: `{nvBuiltinP, nixInstantiateExpr, exec}`\n    * `Nix.Effects`:\n      * `class`:\n        * `MonadExec: exec'`\n        * `MonadEnv: getEnvVar`\n        * `MonadInstantiate: instatiateExpr`\n      * `parseStoreResult`\n    * `Nix.Effects.Derivation`: `renderSymbolic`\n    * `Nix.Lint`: `{NTypeF, symerr}`\n\n* Additional:\n  * [(link)](https://github.com/haskell-nix/hnix/commit/7e6cd97bf3288cb584241611fdb25bf85d7e0ba7) `cabal.project`: freed from the `cryptohash-sha512` override, Hackage trustees made a revision.\n  * [(link)](https://github.com/haskell-nix/hnix/pull/824/commits/4422eb10959115f21045f39e302314a77df4b775) To be more approachable for user understanding, the thunk representation in outputs changed from `\"<CYCLE>\" -> \"<expr>\"`.\n  * [(link)](https://github.com/haskell-nix/hnix/pull/925/commits/37e81c96996b07cbbdf9fa4bf380265e8c008482) The Nix evaluation cycle representation changed `\"<CYCLE>\" -> \"<cycle>\"`.\n  * [(link)](https://github.com/haskell-nix/hnix/commit/51a3ff9e0065d50e5c625738696526c4a232b0cf) `Nix.Expr.Types`: added hacky implementation of `liftTyped` for `instance Lift (Fix NExprF)`.\n  * [(link)](https://github.com/haskell-nix/hnix/commit/51a3ff9e0065d50e5c625738696526c4a232b0cf) `Nix.Builtins`: `derivation` primOp internal code always fully evaluated, so GHC now always ships only fully compiled version in the bytecode.\n  * [(link)](https://github.com/haskell-nix/hnix/pull/890): Project switched to prelude `relude`.\n  * A bunch of other stuff that is not user-facing.\n\n\n## [(diff)](https://github.com/haskell-nix/hnix/compare/0.11.1...0.12.0#files_bucket) 0.12.0 (2021-01-05)\n\n* *Disclaimer*: Current `derivationStrict` primOp implementation and so every evaluation of a derivation into a store path currently relies on the `hnix-store-remote`, which for those operations relies on the running `nix-daemon`, and so operations use/produce effects into the `/nix/store`. Be cautious - it is effectful.\n\n* Introduction:\n  * New module `Nix.Effects.Derivation`.\n  * Operations on derivations:\n    * old got principled implementations.\n    * also new operations got introduced.\n  * Implementation of the `derivationStrict` primOp.\n\n* Breaking:\n  * [(link)](https://github.com/haskell-nix/hnix/pull/554/commits/3bba5549273c892c60aad5dd6d5058a8db40efbf) `Nix.Effects`: **class** `MonadStore` got principled implementation.\n    * `addPath'` got principled into `addToStore`.\n    * `toFile_` got principled into `addTextToStore'`.\n    * For help & easy migration you may use `addPath` & `toFile_` `addTextToStore` standalone functions in the module.\n  * [(link)](https://github.com/haskell-nix/hnix/pull/554/commits/3bba5549273c892c60aad5dd6d5058a8db40efbf) `Nix.Effects.Basic`: `defaultDerivationStrict` got reimplemented & moved into `Nix.Effects.Derivation`.\n  * [(link)](https://github.com/haskell-nix/hnix/pull/554/commits/3bba5549273c892c60aad5dd6d5058a8db40efbf) `Nix.Standard`: instance for `MonadStore (Fix1T t m)` got principled accoding to class `MonadStore` changes.\n  * [(link)](https://github.com/haskell-nix/hnix/pull/554/commits/3bba5549273c892c60aad5dd6d5058a8db40efbf) `Nix.Fresh.Basic`: instance for `MonadStore (StdIdT m)` got principled.\n\n* Additional:\n  * [(link)](https://github.com/haskell-nix/hnix/pull/554/commits/3bba5549273c892c60aad5dd6d5058a8db40efbf) **New module `Nix.Effects.Derivation`**: [HNix(0.12.0):Nix.Effects.Derivation documentation](https://hackage.haskell.org/package/hnix-0.12.0/docs/Nix-Effects-Derivation.html).\n  * [(link)](https://github.com/haskell-nix/hnix/pull/554/commits/9bcfbbe88ff0bd8d803296193ee1d8603dc5289e) `Nix.Convert`: Principled `NVPath -> NixString` coercion.\n    * In a form of principled `instance FromValue NixString m (NValue' t f m (NValue t f m))`.\n  * [(link)](https://github.com/haskell-nix/hnix/pull/554/commits/a8e6d28fdb98a1c34f425c8395338fdabe96becc) `Nix.String`: Allow custom computations inside string contexts.\n    * By providing `runWithStringContext{T,}'` methods into the API.\n  * [(link)](https://github.com/haskell-nix/hnix/pull/554/commits/e45f7632c51a9657f6e8d54c39fd4d21c466d85f) Includded support for new `base16-bytestring`, which advertices 2x-4x speed increase of its operations.\n  * [(link)](https://github.com/haskell-nix/hnix/pull/554/commits/3bba5549273c892c60aad5dd6d5058a8db40efbf) `Nix.Effects`: `addPath` & `toFile_` standalone functions got principled implementation through the internal use of the new `MonadStore` type class implementation.\n  * [(link)](https://github.com/haskell-nix/hnix/pull/554/commits/3bba5549273c892c60aad5dd6d5058a8db40efbf) `Nix.Effects`: added `addTextToStore`, `parseStoreResult` implementations.\n  * [(link)](https://github.com/haskell-nix/hnix/pull/554/commits/3bba5549273c892c60aad5dd6d5058a8db40efbf) `Nix.Effects`: added type synonyms `{RecursiveFlag, RepairFlag, StorePathName, FilePathFilter, StorePathSet}`.\n  * [(link)](https://github.com/haskell-nix/hnix/pull/760) `Nix.Exec`: Fixed the rendering of internal `Frames`.\n    * Which is an internal mechanism of a project to passing around messages with their context, still to be used internally).\n  * [(link)](https://github.com/haskell-nix/hnix/pull/554/commits/3bba5549273c892c60aad5dd6d5058a8db40efbf) `HNix / Nix`: The library now also uses `hnix-store-remote`.\n  * [(link)](https://github.com/haskell-nix/hnix/pull/554/commits/06b0fca9fd607eb2e995f003424e797a41ffa5b7) `cabal.project`: project uses `cryptohash-sha512` override, the `hnix-store-core` requires it from `hnix` and uses that override also. [Detailed info](https://github.com/haskell-hvr/cryptohash-sha512/pull/5#issuecomment-752796913). We promise to attend to this issue, probably by migrating to `cryptonite` in the nearest releases.\n\nFuture note: The HNix is a big project. During the initial development and currently the API for simplicity exposes allmost all functions, types, etc. Big open API means a big effort to create/maintain a quite noisy changelog and you parsing through it, and also creates a frequent requirements to mark releases as major and bother you due to some type changes in some parts that may not be used or applicable to be public API.\n\nThis year the most gracious API clean-up would happen, we would check and keep open what Hackage projects are using from the API, and the other parts would be open on the request by a way of rapid minor releases. That clean-up is also a work toward splitting the project into several packages some time in the future (split would be into something like Expressions, Evaluation, Executable, Extra), which migration also would be done most thoughful and graceful as possible, with as much easiness and automation provided for migration downstream as possible. If all goes as planned - all downstream would need to do is to get and run our script that would migrate our old map of module imports to new ones, and maybe manually add those newly formed packages into `.cabal` description.\n\nIf it is possible, please, try to switch & use the higher-level API functions where it is applicable. Thank you.\n\n\n### [(diff)](https://github.com/haskell-nix/hnix/compare/0.11.0...0.11.1#files_bucket) 0.11.1 (2020-12-09)\n\n* Additional:\n  * [(link)](https://github.com/haskell-nix/hnix/commit/d32a6fbaf3df1c8879d1b19a18f21c031a73e56c) `Nix.Builtins`: `isString` fixed - It used to return `True` for values coercible to string like derivations and paths. It only accepts string values now.\n  * [(link)](https://github.com/haskell-nix/hnix/commit/53b4db2525a8f074d8c262fa7b66ce97e5820890) `Nix.Builtins`: `substring` fixed - Negative lengths used to capture an empty string. Now they capture the whole rmeainder of the string.\n  * [(link)](https://github.com/haskell-nix/hnix/commit/dc31c5e64f8c7aaaea14cac0134bd47544533e67) `Nix.Effects`: `pathExists` fixed - Now also works with directories.\n  * [(link)](https://github.com/haskell-nix/hnix/commit/e2ad934492eeac9881527610e4a1c1cf31ea1115) `Nix.Parser`: `->` is now properly right-associative (was non-associative).\n  * [(link)](https://github.com/haskell-nix/hnix/commit/50baea5e1e482be3c4fcc13c9a45b1083243f681) `Nix.Parser`: Nix `assert` parser (`nixAssert` function) now accepts top-level Nix format also (which means also accepts all kinds of statements), before that it accepted only regular Nix expressions.\n  * [(link)](https://github.com/haskell-nix/hnix/commit/59698de7185dfae508e5ccea4377a82023c4a0d5) `Nix.Render`: `renderLocation` now also shows/handles location of errors in raw strings.\n\n\n## [(diff)](https://github.com/haskell-nix/hnix/compare/0.10.1...0.11.0#files_bucket) 0.11.0 (2020-11-02)\n\n* Breaking:\n  * [(link)](https://github.com/haskell-nix/hnix/pull/740) Deleted incorrect `instance Generic1 NKeyName` from `module Nix.Expr.Types`.\n  * [(link)](https://github.com/haskell-nix/hnix/pull/739) Parentheses now are properly included in the location annotation for Nix expressions, change of `nixParens` in `module Nix.Parser` essentially results in the change of all module `nix*` function results, essentially making results of the whole module more proper.\n\n* Additional:\n  * [(link)](https://github.com/haskell-nix/hnix/pull/741) Fix QQ Text lifting error: work around of [GHC#12596 \"can't find interface-file declaration\"](https://gitlab.haskell.org/ghc/ghc/-/issues/12596).\n  * [(link)](https://github.com/haskell-nix/hnix/pull/744) Fix comments inclusion into location annotations, by using pre-whitespace position for source end locations.\n\n\n### [(diff)](https://github.com/haskell-nix/hnix/compare/0.10.0...0.10.1#files_bucket) 0.10.1 (2020-09-13)\n\n* Additional:\n  * [(link)](https://github.com/haskell-nix/hnix/pull/715) `{Binding, NExpr, NExprF, NKeyName}` gained `Ord1` instances.\n    * These instances were required by downstream projects to be able to use newer HNix.\n  * [(link)](https://github.com/haskell-nix/hnix/pull/712) CLI gained `--long-version` option for gathering a detailed debug information.\n    * Currently, reports Git commit and its date.\n    * [(link)](https://github.com/haskell-nix/hnix/issues/718) Currently does not work in case of use of the `nix-build`, in which case simply returns `UNKNOWN` placeholder.\n\n\n## [(diff)](https://github.com/haskell-nix/hnix/compare/0.9.1...0.10.0#files_bucket) 0.10.0 (2020-09-12)\n\n* Breaking:\n  * [(link)](https://github.com/haskell-nix/hnix/pull/699) Removed `NExpr` `{FromJSON, ToJSON}` instances.\n    * This also removed the JSON output feature for unevaluated expression trees.\n\n* Additional:\n  * [(link)](https://github.com/haskell-nix/hnix/pull/703) CLI gained `--version` option.\n  * Dependencies:\n    * [(link)](https://github.com/haskell-nix/hnix/pull/686) Requires last major `data-fix` (`0.3`).\n    * [(link)](https://github.com/haskell-nix/hnix/pull/679) Requires last major `prettyprinter` (`1.7`).\n\n\n### [(diff)](https://github.com/haskell-nix/hnix/compare/0.9.0...0.9.1#files_bucket) 0.9.1 (2020-07-13)\n\n* Additional:\n  * REPL:\n    * Better tab completion.\n    * Accepting multi-line input.\n    * Support for passing evaluated expression result of `hnix --eval -E`.\n      to REPL as an `input` variable.\n    * Support for loading `.hnixrc` from the current directory.\n  * Reporting of `builtins.nixVersion` bumped from 2.0 to 2.3.\n  * Dependencies:\n    * Freed from: `{interpolate, contravariant, semigroups, generic-random, tasty-quickcheck}`.\n    * Requires last major `repline` (`0.4`).\n\n\n## [(diff)](https://github.com/haskell-nix/hnix/compare/0.8.0...0.9.0#files_bucket) 0.9.0 (2020-06-15)\n\n* Breaking:\n  * Removed instances due to migration to `haskeline 0.8`:\n    * `instance MonadException m => MonadException(StateT(HashMap FilePath NExprLoc) m)`.\n    * `instance MonadException m => MonadException(Fix1T StandardTF m)`.\n  * Dependencies:\n    * Requires last major `haskeline` (`0.8`).\n\n* Additional:\n  * Library: Official support for `GHC 8.4 - 8.10`.\n  * Executable complies only under `GHC 8.10`.\n\n* Changelog started. Previous release was `0.8.0`.\n\n\n---\n\nHNix uses [PVP Versioning][1].\n\n[1]: https://pvp.haskell.org\n"
  },
  {
    "path": "LICENSE.md",
    "content": "Copyright (c) 2014-2025, John Wiegley.  All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n- Redistributions of source code must retain the above copyright\n  notice, this list of conditions and the following disclaimer.\n\n- Redistributions in binary form must reproduce the above copyright\n  notice, this list of conditions and the following disclaimer in the\n  documentation and/or other materials provided with the distribution.\n\n- Neither the name of New Artisans LLC nor the names of its\n  contributors may be used to endorse or promote products derived from\n  this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "License",
    "content": "Copyright (c) 2014, John Wiegley All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\nlist of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\nthis list of conditions and the following disclaimer in the documentation\nand/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its contributors\nmay be used to endorse or promote products derived from this software without\nspecific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "Makefile",
    "content": "all: default.nix\n\ndefault.nix: hnix.cabal\n\tcabal2nix --shell . > $@\n"
  },
  {
    "path": "ReadMe.md",
    "content": "[![Chatroom Gitter](https://img.shields.io/badge/Chatroom-Gitter-%23753a88)](https://gitter.im/haskell-nix/Lobby)\n[![Hackage](https://img.shields.io/hackage/v/hnix?color=%235e5086&label=Latest%20release%20on%20Hackage)](https://hackage.haskell.org/package/hnix)\n[![Hackage Matrix Builder](https://img.shields.io/badge/Hackage%20Matrix-Builder-%235e5086)](https://matrix.hackage.haskell.org/package/hnix)\n[![Bounds](https://img.shields.io/hackage-deps/v/hnix?label=Released%20dep%20bounds)](https://packdeps.haskellers.com/feed?needle=hnix)\n[![Hydra CI](https://img.shields.io/badge/Nixpkgs%20Hydra-CI-%234f72bb)](https://hydra.nixos.org/job/nixpkgs/trunk/haskellPackages.hnix.x86_64-linux#tabs-status)\n[![Repology page](https://img.shields.io/badge/Repology-page-%23005500)](https://repology.org/project/haskell:hnix/versions)\n\n\n# HNix\n\nParser, evaluator and type checker for the Nix language written in Haskell.\n\n\n## Prerequisites\nTooling is WIP, `nix-shell` and `nix-store` are still used for their purpose, so, to access them Nix is required to be installed.\n\n*Disclaimer*: Since still using Nix for some operations, current `derivationStrict` primOp implementation and so evaluations of a derivation into a store path currently rely on the `hnix-store-remote`, which for those operations relies on the running `nix-daemon`, and so operations use/produce effects into the `/nix/store`. Be cautious - it is effectful (produces `/nix/store` entries).\n\n## Building the project\n\n### Git clone\n\n```shell\ngit clone 'https://github.com/haskell-nix/hnix.git' && cd hnix\n```\n\n\n### (optional) Cachix prebuild binary caches\n\nIf you would use our Nix-shell environment for development, you can connect to our Cachix HNix build caches:\n\n1. Run:\n    ```shell\n    nix-env -iA cachix -f https://cachix.org/api/v1/install\n    ```\n\n\n2. Run: `cachix use hnix`\n\n\n### Building with Cabal\n\nCabal [Quickstart](https://cabal.readthedocs.io/en/3.4/nix-local-build.html).\n\n1. (Optional), to enter the projects reproducible Nix environment:\n    ```shell\n    nix-shell\n    ```\n    \n2. Building:\n    ```shell\n    cabal v2-configure\n    cabal v2-build\n    ```\n  \n3. Loading the project into `ghci` REPL:\n    ```shell\n    cabal v2-repl\n    ```\n    \n4. Testing:\n\n  * Default suite:\n    ```shell\n    cabal v2-test\n    ```\n  \n  * All available tests:\n    ```shell\n    env ALL_TESTS=yes cabal v2-test\n    ```\n    \n  * Selected (list of tests is in `tests/Main.hs`):\n    ```shell\n    env NIXPKGS_TESTS=yes PRETTY_TESTS=1 cabal v2-test\n    ```\n\n#### Checking the project\n\n##### Benchmarks\n\nTo run benchmarks:\n\n```shell\ncabal v2-bench\n```\n\n##### Profiling\n\nGHC User Manual has a full [\"Profiling\"](https://ghc.gitlab.haskell.org/ghc/doc/users_guide/profiling.html) section of relevant info.\n\nTo build `hnix` with profiling enabled:\n\n```shell\ncabal v2-run hnix --enable-profiling --flags=profiling -- <args> +RTS -p\n```\n\nOr to put simply:\n```shell\n# Run profiling for evaluation of a Firefox package.\n# Generate:\n#  * for all functions\n#  * time profiling data\n#  * memory allocation profiling data\n#  * in the JSON profiling format\ncabal v2-run --enable-profiling --flags=profiling --enable-library-profiling --profiling-detail='all-functions' hnix -- --eval --expr '(import <nixpkgs> {}).firefox.outPath' +RTS -Pj\n\n# Then, upload the `hnix.prof` to the https://www.speedscope.app/ to analyze it.\n```\n\n\"RTS\" stands for \"RunTime System\" and has a lot of options, GHC User Manual has [\"Running a compiled program\"/\"Setting RTS options\"](https://ghc.gitlab.haskell.org/ghc/doc/users_guide/runtime_control.html) sections describing them.\n\n##### Full debug info\n\nTo run stack traces & full tracing output on `hnix`:\n\n```shell\ncabal v2-configure --enable-tests --enable-profiling --flags=profiling --flags=tracing\ncabal v2-run hnix -- -v5 --trace <args> +RTS -xc\n```\n\nThis would give the most information as to what happens during parsing & evaluation.\n\n\n#### Runing executable\n\n```shell\ncabal v2-run hnix -- --help\n```\n(`--` is for separation between `cabal` & `hnix` args)\n\n\n### Building with Nix-build\n\nThere is a number of build options to use with `nix-build`, documentation of them is in: `./default.nix`, keys essentially pass-through the [Nixpkgs Haskell Lib API](https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/lib.nix).\n\nOptions can be used as:\n```shell\nnix-build \\\n  --arg <option1> <argument1> \\\n  --arg <option2> <argument2> \\\n  --argstr <option3> \"<strinTypeArg>\"\n```\n\n#### Checking the project\n##### Benchmarks\n\n```shell\nnix-build \\\n  --arg disableOptimization false \\\n  --arg enableDeadCodeElimination true \\\n  --arg doStrip true \\\n  --arg doBenchmark true\n```\n\n##### Profiling\n\n```shell\nnix-build \\\n  --arg disableOptimization false \\\n  --arg enableDeadCodeElimination true \\\n  --arg enableLibraryProfiling true \\\n  --arg enableExecutableProfiling true\n\n./result/bin/hnix <args> +RTS -p\n```\n\n##### Full debug info\n\n```shell\nnix-build \\\n  --arg disableOptimization false \\\n  --arg enableDeadCodeElimination true \\\n  --arg doBenchmark true \\\n  --arg doStrip false \\\n  --arg enableLibraryProfiling true \\\n  --arg enableExecutableProfiling true \\\n  --arg doTracing true \\\n  --arg enableDWARFDebugging true\n\n./result/bin/hnix -v5 --trace <args> +RTS -xc\n```\n\n#### Runing executable\n\n```shell\n./result/bin/hnix\n```\n\n## Using HNix\n\nSee:\n```\nhnix --help\n```\n\nIt has a pretty full/good description of the current options.\n\n\n### Parse & print\n\nTo parse a file with `hnix` and pretty print the result:\n\n```shell\nhnix file.nix\n```\n\n### Evaluating and printing the resulting value\n\nExpression from a file:\n\n```shell\nhnix --eval file.nix\n```\n\nExpression:\n\n```shell\nhnix --eval --expr 'import <nixpkgs> {}'\n```\n\n### Evaluating Nixpkgs\n\nCurrently, the main high-level goal is to be able to evaluate all of Nixpkgs:\n\n```shell\nhnix --eval --expr \"import <nixpkgs> {}\" --find\n```\n\n### Options supported only by HNix\n\nTo see value provenance and thunk context:\n\n```shell\nhnix -v2 --values --thunk --eval --expr 'import <nixpkgs> {}'\n```\n\nTo see tracing as the evaluator runs (note that building with `cabal configure --flags=tracing` will produce much more output than this):\n\n```shell\nhnix --trace --eval --expr 'import <nixpkgs> {}'\n```\n\nTo attempt to generate a reduced test case demonstrating an error:\n\n```shell\nhnix --reduce bug.nix --eval --expr 'import <nixpkgs> {}'\n```\n\n### REPL\n\nTo enter REPL:\n```shell\nhnix --repl\n```\n\nEvaluate an expression and load it into REPL:\n```shell\nhnix --eval --expr '(import <nixpkgs> {}).pkgs.hello' --repl\n```\nThis binds the evaluated expression result to the `input` variable, so that variable can be inspected.\n\nUse the `:help` command for a list of all available REPL commands.\n\n#### Language laziness\n\nNix is a lazy language with the ability of recursion, so by default REPL and eval prints are lazy:\n\n```shell\nhnix \\\n  --eval \\\n  --expr '{ x = true; }'\n  \n{ x = \"<expr>\"; }\n```\n\nTo disable laziness add the `--strict` to commands or `:set strict` in the REPL.\n\n```shell\nhnix \\\n  --eval \\\n  --strict \\\n  --expr '{ x = true; }'\n  \n{ x = true; }\n```\n\n\n## Contributing\n\n* The Haskell Language Server (HLS) works great with our project.\n\n* [Design of the HNix code base Wiki article](https://github.com/haskell-nix/hnix/wiki/Design-of-the-HNix-code-base).\n\n1. If something in the [quests](https://github.com/haskell-nix/hnix/issues?q=is%3Aissue+is%3Aopen+label%3A%22help+wanted%22+no%3Aassignee) looks interesting, look through the thread and leave a comment taking it, to let others know you're working on it.\n\n2. You are free to chat with everyone on [Gitter](https://gitter.im/haskell-nix/Lobby).\n\n3. When the pull request is ready to be submitted, to save time - please, test it with:\n    \n    ```shell\n    cabal v2-test\n    ```\n    \n    Please, check that all default tests that were passing prior are still passing. It's OK if no new tests are passing.\n    \n    \n### (optional) Minimalistic development status loop with amazing [`ghcid`](https://github.com/ndmitchell/ghcid)\n\nIf HLS is not your cup of yea:\n\n```shell\nghcid --command=\"cabal v2-repl --repl-options=-fno-code --repl-options=-fno-break-on-exception --repl-options=-fno-break-on-error --repl-options=-v1 --repl-options=-ferror-spans --repl-options=-j\"\n```\n(optional) To use projects reproducible environment, wrap `ghcid ...` command into a `nix-shell --command ' '`.\n\nFor simplicity `alias` the command in your shell.\n\n\n## Current status\n\nTo understand the project implementation state see:\n  * [ChangeLog](https://github.com/haskell-nix/hnix/blob/master/ChangeLog.md)\n  * [Opened reports](https://github.com/haskell-nix/hnix/issues)\n  * [Project status](https://github.com/haskell-nix/hnix/wiki/Project-status)\n  * [Design of the HNix code base](https://github.com/haskell-nix/hnix/wiki/Design-of-the-HNix-code-base)\n\n"
  },
  {
    "path": "benchmarks/Main.hs",
    "content": "module Main where\n\nimport Criterion.Main\nimport Nix.Prelude\n\nimport qualified ParserBench\n\nmain :: IO ()\nmain = defaultMain $ one ParserBench.benchmarks\n"
  },
  {
    "path": "benchmarks/ParserBench.hs",
    "content": "module ParserBench (benchmarks) where\n\nimport Nix.Parser\nimport Nix.Prelude\n\nimport Criterion\n\nbenchFile :: Path -> Benchmark\nbenchFile = bench . coerce <*> whnfIO . parseNixFile . (\"data/\" <>)\n\nbenchmarks :: Benchmark\nbenchmarks =\n    bgroup\n        \"Parser\"\n        $ fmap\n            benchFile\n            [ \"nixpkgs-all-packages.nix\"\n            , \"nixpkgs-all-packages-pretty.nix\"\n            , \"let-comments.nix\"\n            , \"let-comments-multiline.nix\"\n            , \"let.nix\"\n            , \"simple.nix\"\n            , \"simple-pretty.nix\"\n            ]\n"
  },
  {
    "path": "brittany.yaml",
    "content": "conf_debug:\n  dconf_roundtrip_exactprint_only: false\n  dconf_dump_bridoc_simpl_par: false\n  dconf_dump_ast_unknown: false\n  dconf_dump_bridoc_simpl_floating: false\n  dconf_dump_config: false\n  dconf_dump_bridoc_raw: false\n  dconf_dump_bridoc_final: false\n  dconf_dump_bridoc_simpl_alt: false\n  dconf_dump_bridoc_simpl_indent: false\n  dconf_dump_annotations: false\n  dconf_dump_bridoc_simpl_columns: false\n  dconf_dump_ast_full: false\nconf_forward:\n  options_ghc: []\nconf_errorHandling:\n  econf_ExactPrintFallback: ExactPrintFallbackModeInline\n  econf_Werror: false\n  econf_omit_output_valid_check: false\n  econf_produceOutputOnErrors: false\nconf_preprocessor:\n  ppconf_CPPMode: CPPModeWarn\n  ppconf_hackAroundIncludes: false\nconf_obfuscate: false\nconf_roundtrip_exactprint_only: false\nconf_version: 1\nconf_layout:\n  lconfig_reformatModulePreamble: true\n  lconfig_altChooser:\n    tag: AltChooserBoundedSearch\n    contents: 3\n  lconfig_allowSingleLineExportList: true\n  lconfig_importColumn: 50\n  lconfig_hangingTypeSignature: false\n  lconfig_importAsColumn: 50\n  lconfig_alignmentLimit: 30\n  lconfig_indentListSpecial: true\n  lconfig_indentAmount: 2\n  lconfig_alignmentBreakOnMultiline: true\n  lconfig_cols: 80\n  lconfig_indentPolicy: IndentPolicyFree\n  lconfig_indentWhereSpecial: true\n  lconfig_columnAlignMode:\n    tag: ColumnAlignModeMajority\n    contents: 0.7\n"
  },
  {
    "path": "build.sh",
    "content": "#!/usr/bin/env bash\n\n# NOTE: Script to easy import nix-build settings from env, useful for tooling env replication and the CI builds, relies on `default.nix` interface, which exposes Nixpkgs Haskell Lib interface\n\n# The most strict error checking requirements\nset -Eexuo pipefail\n\n### NOTE: Section handles imports from env, these are settings for Nixpkgs.\n### They use the `default.nix` interface, which exposes expose most of the Nixpkgs Haskell.lib API: https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/lib.nix\n### Some of these options implicitly switch the dependent options.\n### Documentation of this settings is mosly in `default.nix`, since most settings it Nixpkgs related\n### Additional documentation is in Nixpkgs Haskell.lib: https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/lib.nix\n\n# NOTE: If vars not imported - init the vars with default values\n# Non-set/passed ''/'default' compiler setting means currently default GHC of Nixpkgs ecosystem.\ncompiler=${compiler:-'default'}\n\npackageRoot=${packageRoot:-'pkgs.nix-gitignore.gitignoreSource [ ] ./.'}\ncabalName=${cabalName:-'hnix'}\nrev=${rev:-'default'}\n\n# Account in Cachix to use\ncachixAccount=${cachixAccount:-'hnix'}\n\nallowInconsistentDependencies=${allowInconsistentDependencies:-'false'}\ndoJailbreak=${doJailbreak:-'false'}\ndoCheck=${doCheck:-'true'}\n\nsdistTarball=${sdistTarball:-'false'}\nbuildFromSdist=${buildFromSdist:-'false'}\n\nfailOnAllWarnings=${failOnAllWarnings:-'false'}\nbuildStrictly=${buildStrictly:-'false'}\n\nenableDeadCodeElimination=${enableDeadCodeElimination:-'false'}\ndisableOptimization=${disableOptimization:-'true'}\nlinkWithGold=${linkWithGold:-'false'}\n\nenableLibraryProfiling=${enableLibraryProfiling:-'false'}\nenableExecutableProfiling=${enableExecutableProfiling:-'false'}\ndoTracing=${doTracing:-'false'}\nenableDWARFDebugging=${enableDWARFDebugging:-'false'}\ndoStrip=${doStrip:-'false'}\n\nenableSharedLibraries=${enableSharedLibraries:-'true'}\nenableStaticLibraries=${enableStaticLibraries:-'false'}\nenableSharedExecutables=${enableSharedExecutables:-'false'}\njustStaticExecutables=${justStaticExecutables:-'false'}\nenableSeparateBinOutput=${enableSeparateBinOutput:-'false'}\n\ncheckUnusedPackages=${checkUnusedPackages:-'false'}\ndoHaddock=${doHaddock:-'false'}\ndoHyperlinkSource=${doHyperlinkSource:-'false'}\ndoCoverage=${doCoverage:-'false'}\ndoBenchmark=${doBenchmark:-'false'}\ngenerateOptparseApplicativeCompletions=${generateOptparseApplicativeCompletions:-'false'}\n# [ \"binary1\" \"binary2\" ] - should pass \" quotes into Nix interpreter\nexecutableNamesToShellComplete=${executableNamesToShellComplete:-'[ \"hnix\" ]'}\n\nwithHoogle=${withHoogle:-'false'}\n\n# If key not provided (branch is not inside the central repo) - init CACHIX_SIGNING_KEY as empty\nCACHIX_SIGNING_KEY=${CACHIX_SIGNING_KEY:-\"\"}\n\nBUILD_PROJECT() {\n\n\tIFS=$'\\n\\t'\n\n\tif [ ! \"$compiler\" = \"ghcjs\" ]; then\n\n\t\t# Normal GHC build\n\t\tnix-build \\\n\t\t\t--argstr compiler \"$compiler\" \\\n\t\t\t--argstr rev \"$rev\" \\\n\t\t\t--arg allowInconsistentDependencies \"$allowInconsistentDependencies\" \\\n\t\t\t--arg doJailbreak \"$doJailbreak\" \\\n\t\t\t--arg doCheck \"$doCheck\" \\\n\t\t\t--arg sdistTarball \"$sdistTarball\" \\\n\t\t\t--arg buildFromSdist \"$buildFromSdist\" \\\n\t\t\t--arg failOnAllWarnings \"$failOnAllWarnings\" \\\n\t\t\t--arg buildStrictly \"$buildStrictly\" \\\n\t\t\t--arg enableDeadCodeElimination \"$enableDeadCodeElimination\" \\\n\t\t\t--arg disableOptimization \"$disableOptimization\" \\\n\t\t\t--arg linkWithGold \"$linkWithGold\" \\\n\t\t\t--arg enableLibraryProfiling \"$enableLibraryProfiling\" \\\n\t\t\t--arg enableExecutableProfiling \"$enableExecutableProfiling\" \\\n\t\t\t--arg doTracing \"$doTracing\" \\\n\t\t\t--arg enableDWARFDebugging \"$enableDWARFDebugging\" \\\n\t\t\t--arg doStrip \"$doStrip\" \\\n\t\t\t--arg doHyperlinkSource \"$doHyperlinkSource\" \\\n\t\t\t--arg enableSharedLibraries \"$enableSharedLibraries\" \\\n\t\t\t--arg enableStaticLibraries \"$enableStaticLibraries\" \\\n\t\t\t--arg enableSharedExecutables \"$enableSharedExecutables\" \\\n\t\t\t--arg justStaticExecutables \"$justStaticExecutables\" \\\n\t\t\t--arg checkUnusedPackages \"$checkUnusedPackages\" \\\n\t\t\t--arg doCoverage \"$doCoverage\" \\\n\t\t\t--arg doHaddock \"$doHaddock\" \\\n\t\t\t--arg doBenchmark \"$doBenchmark\" \\\n\t\t\t--arg generateOptparseApplicativeCompletions \"$generateOptparseApplicativeCompletions\" \\\n\t\t\t--arg executableNamesToShellComplete \"$executableNamesToShellComplete\" \\\n\t\t\t--arg withHoogle \"$withHoogle\"\n\n\tfi\n}\n\nMAIN() {\n\n\t# Overall it is useful to have in CI test builds the latest stable Nix\n\t# 2020-06-24: HACK: Do not ask why different commands on Linux and macOS. IDK, wished they we the same. These are the only commands that worked on according platforms right after the fresh Nix installer rollout.\n\t# 2020-07-06: HACK: GitHub Actions CI shown that nix-channel or nix-upgrade-nix do not work, there is probably some new rollout, shortcircuting for the time bing with || true\n\t(nix-channel --update && nix-env -u) || (sudo nix upgrade-nix) || true\n\n\t# Report the Nixpkgs channel revision\n\tnix-instantiate --eval -E 'with import <nixpkgs> {}; lib.version or lib.nixpkgsVersion'\n\n\t# Secrets are not shared to PRs from forks\n\t# nix-build | cachix push <account> - uploads binaries, runs&works only in the branches of the main repository, so for PRs - else case runs\n\n\tif [ ! \"$CACHIX_SIGNING_KEY\" = \"\" ]; then\n\n\t\t# Build of the inside repo branch - enable push Cachix cache\n\t\tBUILD_PROJECT | cachix push \"$cachixAccount\"\n\n\telse\n\n\t\t# Build of the side repo/PR - can not push Cachix cache\n\t\tBUILD_PROJECT\n\n\tfi\n\n}\n\n# Run the entry function of the script\nMAIN\n"
  },
  {
    "path": "cabal.project",
    "content": "packages:\n  ./hnix.cabal\n"
  },
  {
    "path": "data/let-comments-multiline.nix",
    "content": "let\n  b.a = 3; /*\n   this is a multiline comment\n   /* we can also nest these comments\n    */ /*\n   */\n  b.c = { e = {}; };\n  /* just some more comments\n   */\n  b.c.e.f = 4;\n/* this file is documented really well */\nin b /* todo */\n"
  },
  {
    "path": "data/let-comments.nix",
    "content": "let\n  b.a = 3;\n   # this is a oneline comment\n   # we can also nest these comments\n    # #\n   #\n  #\n  b.c = { e = {}; };\n  # just some more comments\n   #\n  b.c.e.f = 4;\n# this file is documented really well\nin b # todo"
  },
  {
    "path": "data/let.nix",
    "content": "let\n  b.a = 3;\n  b.c = { e = {}; };\n  b.c.e.f = 4;\nin b"
  },
  {
    "path": "data/nix/README.md",
    "content": "Extracted from https://github.com/NixOS/nix (GPLv2)\ncommit 6c2af1f201a925c2aa632737765685c72b642847\nDate:   Mon Nov 8 14:13:42 202\n\nKeep only `tests/lang` which are required by `hnix`es testsuite.\n"
  },
  {
    "path": "data/nix/tests/lang/data",
    "content": "foo\n"
  },
  {
    "path": "data/nix/tests/lang/dir1/a.nix",
    "content": "\"a\"\n"
  },
  {
    "path": "data/nix/tests/lang/dir2/a.nix",
    "content": "\"X\"\n"
  },
  {
    "path": "data/nix/tests/lang/dir2/b.nix",
    "content": "\"b\"\n"
  },
  {
    "path": "data/nix/tests/lang/dir3/a.nix",
    "content": "\"X\"\n"
  },
  {
    "path": "data/nix/tests/lang/dir3/b.nix",
    "content": "\"X\"\n"
  },
  {
    "path": "data/nix/tests/lang/dir3/c.nix",
    "content": "\"c\"\n"
  },
  {
    "path": "data/nix/tests/lang/dir4/a.nix",
    "content": "\"X\"\n"
  },
  {
    "path": "data/nix/tests/lang/dir4/c.nix",
    "content": "\"X\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-fail-abort.nix",
    "content": "if true then abort \"this should fail\" else 1\n"
  },
  {
    "path": "data/nix/tests/lang/eval-fail-assert.nix",
    "content": "let {\n  x = arg: assert arg == \"y\"; 123;\n\n  body = x \"x\";\n}"
  },
  {
    "path": "data/nix/tests/lang/eval-fail-bad-antiquote-1.nix",
    "content": "\"${x: x}\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-fail-bad-antiquote-2.nix",
    "content": "\"${./fnord}\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-fail-bad-antiquote-3.nix",
    "content": "''${x: x}''\n"
  },
  {
    "path": "data/nix/tests/lang/eval-fail-blackhole.nix",
    "content": "let {\n  body = x;\n  x = y;\n  y = x;\n}\n"
  },
  {
    "path": "data/nix/tests/lang/eval-fail-deepseq.nix",
    "content": "builtins.deepSeq { x = abort \"foo\"; } 456\n"
  },
  {
    "path": "data/nix/tests/lang/eval-fail-hashfile-missing.nix",
    "content": "let\n  paths = [ ./this-file-is-definitely-not-there-7392097 \"/and/neither/is/this/37293620\" ];\nin\n  toString (builtins.concatLists (map (hash: map (builtins.hashFile hash) paths) [\"md5\" \"sha1\" \"sha256\" \"sha512\"]))\n\n"
  },
  {
    "path": "data/nix/tests/lang/eval-fail-missing-arg.nix",
    "content": "({x, y, z}: x + y + z) {x = \"foo\"; z = \"bar\";}\n"
  },
  {
    "path": "data/nix/tests/lang/eval-fail-nonexist-path.nix",
    "content": "# This must fail to evaluate, since ./fnord doesn't exist.  If it did\n# exist, it would produce \"/nix/store/<hash>-fnord/xyzzy\" (with an\n# appropriate context).\n\"${./fnord}/xyzzy\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-fail-path-slash.nix",
    "content": "# Trailing slashes in paths are not allowed.\n# This restriction could be lifted sometime,\n# for example if we make '/' a path concatenation operator.\n# See https://github.com/NixOS/nix/issues/1138\n# and https://nixos.org/nix-dev/2016-June/020829.html\n/nix/store/\n"
  },
  {
    "path": "data/nix/tests/lang/eval-fail-remove.nix",
    "content": "let {\n  attrs = {x = 123; y = 456;};\n\n  body = (removeAttrs attrs [\"x\"]).x;\n}"
  },
  {
    "path": "data/nix/tests/lang/eval-fail-scope-5.nix",
    "content": "let {\n\n  x = \"a\";\n  y = \"b\";\n\n  f = {x ? y, y ? x}: x + y;\n\n  body = f {};\n\n}\n"
  },
  {
    "path": "data/nix/tests/lang/eval-fail-seq.nix",
    "content": "builtins.seq (abort \"foo\") 2\n"
  },
  {
    "path": "data/nix/tests/lang/eval-fail-substring.nix",
    "content": "builtins.substring (builtins.sub 0 1) 1 \"x\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-fail-to-path.nix",
    "content": "builtins.toPath \"foo/bar\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-fail-undeclared-arg.nix",
    "content": "({x, z}: x + z) {x = \"foo\"; y = \"bla\"; z = \"bar\";}\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-any-all.exp",
    "content": "[ false false true true true true false true ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-any-all.nix",
    "content": "with builtins;\n\n[ (any (x: x == 1) [])\n  (any (x: x == 1) [2 3 4])\n  (any (x: x == 1) [1 2 3 4])\n  (any (x: x == 1) [4 3 2 1])\n  (all (x: x == 1) [])\n  (all (x: x == 1) [1])\n  (all (x: x == 1) [1 2 3])\n  (all (x: x == 1) [1 1 1])\n]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-arithmetic.exp",
    "content": "2216\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-arithmetic.nix",
    "content": "with import ./lib.nix;\n\nlet {\n\n  /* Supposedly tail recursive version:\n\n  range_ = accum: first: last:\n    if first == last then ([first] ++ accum)\n    else range_ ([first] ++ accum) (builtins.add first 1) last;\n\n  range = range_ [];\n  */\n\n  x = 12;\n\n  err = abort \"urgh\";\n\n  body = sum\n    [ (sum (range 1 50))\n      (123 + 456)\n      (0 + -10 + -(-11) + -x)\n      (10 - 7 - -2)\n      (10 - (6 - -1))\n      (10 - 1 + 2)\n      (3 * 4 * 5)\n      (56088 / 123 / 2)\n      (3 + 4 * const 5 0 - 6 / id 2)\n\n      (builtins.bitAnd 12 10) # 0b1100 & 0b1010 =  8\n      (builtins.bitOr  12 10) # 0b1100 | 0b1010 = 14\n      (builtins.bitXor 12 10) # 0b1100 ^ 0b1010 =  6\n\n      (if 3 < 7 then 1 else err)\n      (if 7 < 3 then err else 1)\n      (if 3 < 3 then err else 1)\n\n      (if 3 <= 7 then 1 else err)\n      (if 7 <= 3 then err else 1)\n      (if 3 <= 3 then 1 else err)\n\n      (if 3 > 7 then err else 1)\n      (if 7 > 3 then 1 else err)\n      (if 3 > 3 then err else 1)\n\n      (if 3 >= 7 then err else 1)\n      (if 7 >= 3 then 1 else err)\n      (if 3 >= 3 then 1 else err)\n\n      (if 2 > 1 == 1 < 2 then 1 else err)\n      (if 1 + 2 * 3 >= 7 then 1 else err)\n      (if 1 + 2 * 3 < 7 then err else 1)\n\n      # Not integer, but so what.\n      (if \"aa\" < \"ab\" then 1 else err)\n      (if \"aa\" < \"aa\" then err else 1)\n      (if \"foo\" < \"foobar\" then 1 else err)\n    ];\n\n}\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-attrnames.exp",
    "content": "\"newxfoonewxy\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-attrnames.nix",
    "content": "with import ./lib.nix;\n\nlet\n\n  attrs = {y = \"y\"; x = \"x\"; foo = \"foo\";} // rec {x = \"newx\"; bar = x;};\n\n  names = builtins.attrNames attrs;\n\n  values = map (name: builtins.getAttr name attrs) names;\n\nin assert values == builtins.attrValues attrs; concat values\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-attrs.exp",
    "content": "987\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-attrs.nix",
    "content": "let {\n  as = { x = 123; y = 456; } // { z = 789; } // { z = 987; };\n\n  body = if as ? a then as.a else assert as ? z; as.z;\n}\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-attrs2.exp",
    "content": "987\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-attrs2.nix",
    "content": "let {\n  as = { x = 123; y = 456; } // { z = 789; } // { z = 987; };\n\n  A = \"a\";\n  Z = \"z\";\n\n  body = if builtins.hasAttr A as\n         then builtins.getAttr A as\n         else assert builtins.hasAttr Z as; builtins.getAttr Z as;\n}\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-attrs3.exp",
    "content": "\"foo 22 80 itchyxac\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-attrs3.nix",
    "content": "let\n\n  config = \n    {\n      services.sshd.enable = true;\n      services.sshd.port = 22;\n      services.httpd.port = 80;\n      hostName = \"itchy\";\n      a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z = \"x\";\n      foo = {\n        a = \"a\";\n        b.c = \"c\";\n      };\n    };\n\nin\n  if config.services.sshd.enable\n  then \"foo ${toString config.services.sshd.port} ${toString config.services.httpd.port} ${config.hostName}\"\n       + \"${config.a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p.q.r.s.t.u.v.w.x.y.z}\"\n       + \"${config.foo.a}\"\n       + \"${config.foo.b.c}\"\n  else \"bar\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-attrs4.exp",
    "content": "[ true false true false false true false false ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-attrs4.nix",
    "content": "let\n\n  as = { x.y.z = 123; a.b.c = 456; };\n\n  bs = null;\n\nin [ (as ? x) (as ? y) (as ? x.y.z) (as ? x.y.z.a) (as ? x.y.a) (as ? a.b.c) (bs ? x) (bs ? x.y.z) ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-attrs5.exp",
    "content": "[ 123 \"foo\" 456 456 \"foo\" \"xyzzy\" \"xyzzy\" true ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-attrs5.nix",
    "content": "with import ./lib.nix;\n\nlet\n\n  as = { x.y.z = 123; a.b.c = 456; };\n\n  bs = { f-o-o.bar = \"foo\"; };\n\n  or = x: y: x || y;\n  \nin\n  [ as.x.y.z\n    as.foo or \"foo\"\n    as.x.y.bla or as.a.b.c\n    as.a.b.c or as.x.y.z\n    as.x.y.bla or bs.f-o-o.bar or \"xyzzy\"\n    as.x.y.bla or bs.bar.foo or \"xyzzy\"\n    (123).bla or null.foo or \"xyzzy\"\n    # Backwards compatibility test.\n    (fold or [] [true false false])\n  ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-attrs6.exp",
    "content": "{ __overrides = { bar = \"qux\"; }; bar = \"qux\"; foo = \"bar\"; }\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-attrs6.nix",
    "content": "rec {\n  \"${\"foo\"}\" = \"bar\";\n   __overrides = { bar = \"qux\"; };\n}\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-autoargs.exp",
    "content": "\"xyzzy!xyzzy!foobar\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-autoargs.flags",
    "content": "--arg lib import(lang/lib.nix) --argstr xyzzy xyzzy! -A result\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-autoargs.nix",
    "content": "let\n\n  foobar = \"foobar\";\n\nin\n\n{ xyzzy2 ? xyzzy # mutually recursive args\n, xyzzy ? \"blaat\" # will be overridden by --argstr\n, fb ? foobar\n, lib # will be set by --arg\n}:\n\n{\n  result = lib.concat [xyzzy xyzzy2 fb];\n}\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-backslash-newline-1.exp",
    "content": "\"a\\nb\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-backslash-newline-1.nix",
    "content": "\"a\\\nb\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-backslash-newline-2.exp",
    "content": "\"a\\nb\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-backslash-newline-2.nix",
    "content": "''a''\\\nb''\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-builtins-add.exp",
    "content": "[ 5 4 \"int\" \"tt\" \"float\" 4 ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-builtins-add.nix",
    "content": "[\n(builtins.add 2 3)\n(builtins.add 2 2)\n(builtins.typeOf (builtins.add 2  2))\n(\"t\" + \"t\")\n(builtins.typeOf (builtins.add 2.0 2))\n(builtins.add 2.0 2)\n]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-builtins.exp",
    "content": "/foo\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-builtins.nix",
    "content": "assert builtins ? currentSystem;\nassert !builtins ? __currentSystem;\n\nlet {\n\n  x = if builtins ? dirOf then builtins.dirOf /foo/bar else \"\";\n\n  y = if builtins ? fnord then builtins.fnord \"foo\" else \"\";\n\n  body = x + y;\n  \n}\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-callable-attrs.exp",
    "content": "true\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-callable-attrs.nix",
    "content": "({ __functor = self: x: self.foo && x; foo = false; } // { foo = true; }) true\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-catattrs.exp",
    "content": "[ 1 2 ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-catattrs.nix",
    "content": "builtins.catAttrs \"a\" [ { a = 1; } { b = 0; } { a = 2; } ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-closure.exp.xml",
    "content": "<?xml version='1.0' encoding='utf-8'?>\n<expr>\n  <list>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"-13\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"-12\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"-11\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"-9\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"-8\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"-7\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"-5\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"-4\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"-3\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"key\">\n        <int value=\"-1\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"0\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"1\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"2\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"4\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"5\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"6\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"key\">\n        <int value=\"8\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"9\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"10\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"13\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"14\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"15\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"key\">\n        <int value=\"17\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"18\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"19\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"22\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"23\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"key\">\n        <int value=\"26\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"27\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"28\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"31\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"32\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"key\">\n        <int value=\"35\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"36\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"40\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"41\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"key\">\n        <int value=\"44\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"45\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"49\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"key\">\n        <int value=\"53\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"54\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"58\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"key\">\n        <int value=\"62\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"foo\">\n        <bool value=\"true\" />\n      </attr>\n      <attr name=\"key\">\n        <int value=\"67\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"key\">\n        <int value=\"71\" />\n      </attr>\n    </attrs>\n    <attrs>\n      <attr name=\"key\">\n        <int value=\"80\" />\n      </attr>\n    </attrs>\n  </list>\n</expr>\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-closure.nix",
    "content": "let\n\n  closure = builtins.genericClosure {\n    startSet = [{key = 80;}];\n    operator = {key, foo ? false}:\n      if builtins.lessThan key 0\n      then []\n      else [{key = builtins.sub key 9;} {key = builtins.sub key 13; foo = true;}];\n  };\n\n  sort = (import ./lib.nix).sortBy (a: b: builtins.lessThan a.key b.key);\n\nin sort closure\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-comments.exp",
    "content": "\"abcdefghijklmnopqrstuvwxyz\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-comments.nix",
    "content": "# A simple comment\n\"a\"+ # And another\n## A double comment\n\"b\"+  ## And another\n# Nested # comments #\n\"c\"+   # and # some # other #\n# An empty line, following here:\n\n\"d\"+      # and a comment not starting the line !\n\n\"e\"+\n/* multiline comments */\n\"f\" +\n/* multiline\n   comments,\n   on\n   multiple\n   lines\n*/\n\"g\" +\n# Small, tricky comments\n/**/ \"h\"+ /*/*/ \"i\"+ /***/ \"j\"+ /* /*/ \"k\"+ /*/* /*/ \"l\"+\n# Comments with an even number of ending '*' used to fail:\n\"m\"+\n/* */ /* **/ /* ***/ /* ****/ \"n\"+\n/* */ /** */ /*** */ /**** */ \"o\"+\n/** **/ /*** ***/ /**** ****/ \"p\"+\n/* * ** *** **** ***** */     \"q\"+\n# Random comments\n/* ***** ////// * / * / /* */ \"r\"+\n# Mixed comments\n/* # */\n\"s\"+\n# /* #\n\"t\"+\n# /* # */\n\"u\"+\n# /*********/\n\"v\"+\n## */*\n\"w\"+\n/*\n * Multiline, decorated comments\n * # This ain't a nest'd comm'nt\n */\n\"x\"+\n''${/** with **/\"y\"\n  # real\n  /* comments\n     inside ! # */\n\n  # (and empty lines)\n\n}''+          /* And a multiline comment,\n                 on the same line,\n                 after some spaces\n*/             # followed by a one-line comment\n\"z\"\n/* EOF */\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-concat.exp",
    "content": "[ 1 2 3 4 5 6 7 8 9 ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-concat.nix",
    "content": "[1 2 3] ++ [4 5 6] ++ [7 8 9]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-concatmap.exp",
    "content": "[ [ 1 3 5 7 9 ] [ \"a\" \"z\" \"b\" \"z\" ] ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-concatmap.nix",
    "content": "with import ./lib.nix;\n\n[ (builtins.concatMap (x: if x / 2 * 2 == x then [] else [ x ]) (range 0 10))\n  (builtins.concatMap (x: [x] ++ [\"z\"]) [\"a\" \"b\"])\n]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-concatstringssep.exp",
    "content": "[ \"\" \"foobarxyzzy\" \"foo, bar, xyzzy\" \"foo\" \"\" ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-concatstringssep.nix",
    "content": "with builtins;\n\n[ (concatStringsSep \"\" [])\n  (concatStringsSep \"\" [\"foo\" \"bar\" \"xyzzy\"])\n  (concatStringsSep \", \" [\"foo\" \"bar\" \"xyzzy\"])\n  (concatStringsSep \", \" [\"foo\"])\n  (concatStringsSep \", \" [])\n]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-context-introspection.exp",
    "content": "true\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-context-introspection.nix",
    "content": "let\n  drv = derivation {\n    name = \"fail\";\n    builder = \"/bin/false\";\n    system = \"x86_64-linux\";\n    outputs = [ \"out\" \"foo\" ];\n  };\n\n  path = \"${./eval-okay-context-introspection.nix}\";\n\n  desired-context = {\n    \"${builtins.unsafeDiscardStringContext path}\" = {\n      path = true;\n    };\n    \"${builtins.unsafeDiscardStringContext drv.drvPath}\" = {\n      outputs = [ \"foo\" \"out\" ];\n      allOutputs = true;\n    };\n  };\n\n  legit-context = builtins.getContext \"${path}${drv.outPath}${drv.foo.outPath}${drv.drvPath}\";\n\n  constructed-context = builtins.getContext (builtins.appendContext \"\" desired-context);\nin legit-context == constructed-context\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-context.exp",
    "content": "\"foo eval-okay-context.nix bar\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-context.nix",
    "content": "let s = \"foo ${builtins.substring 33 100 (baseNameOf \"${./eval-okay-context.nix}\")} bar\";\nin\n  if s != \"foo eval-okay-context.nix bar\"\n  then abort \"context not discarded\"\n  else builtins.unsafeDiscardStringContext s\n\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-curpos.exp",
    "content": "[ 3 7 4 9 ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-curpos.nix",
    "content": "# Bla\nlet\n  x = __curPos;\n    y = __curPos;\nin [ x.line x.column y.line y.column ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-deepseq.exp",
    "content": "456\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-deepseq.nix",
    "content": "builtins.deepSeq (let as = { x = 123; y = as; }; in as) 456\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-delayed-with-inherit.exp",
    "content": "\"b-overridden\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-delayed-with-inherit.nix",
    "content": "let\n  pkgs_ = with pkgs; {\n    a = derivation {\n      name = \"a\";\n      system = builtins.currentSystem;\n      builder = \"/bin/sh\";\n      args = [ \"-c\" \"touch $out\" ];\n      inherit b;\n    };\n\n    inherit b;\n  };\n\n  packageOverrides = p: {\n    b = derivation {\n      name = \"b-overridden\";\n      system = builtins.currentSystem;\n      builder = \"/bin/sh\";\n      args = [ \"-c\" \"touch $out\" ];\n    };\n  };\n\n  pkgs = pkgs_ // (packageOverrides pkgs_);\nin pkgs.a.b.name\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-delayed-with.exp",
    "content": "\"b-overridden b-overridden a\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-delayed-with.nix",
    "content": "let\n\n  pkgs_ = with pkgs; {\n    a = derivation {\n      name = \"a\";\n      system = builtins.currentSystem;\n      builder = \"/bin/sh\";\n      args = [ \"-c\" \"touch $out\" ];\n      inherit b;\n    };\n\n    b = derivation {\n      name = \"b\";\n      system = builtins.currentSystem;\n      builder = \"/bin/sh\";\n      args = [ \"-c\" \"touch $out\" ];\n      inherit a;\n    };\n\n    c = b;\n  };\n\n  packageOverrides = pkgs: with pkgs; {\n    b = derivation (b.drvAttrs // { name = \"${b.name}-overridden\"; });\n  };\n\n  pkgs = pkgs_ // (packageOverrides pkgs_);\n\nin \"${pkgs.a.b.name} ${pkgs.c.name} ${pkgs.b.a.name}\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-dynamic-attrs-2.exp",
    "content": "true\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-dynamic-attrs-2.nix",
    "content": "{ a.\"${\"b\"}\" = true; a.\"${\"c\"}\" = false; }.a.b\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-dynamic-attrs-bare.exp",
    "content": "{ binds = true; hasAttrs = true; multiAttrs = true; recBinds = true; selectAttrs = true; selectOrAttrs = true; }\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-dynamic-attrs-bare.nix",
    "content": "let\n  aString = \"a\";\n\n  bString = \"b\";\nin {\n  hasAttrs = { a.b = null; } ? ${aString}.b;\n\n  selectAttrs = { a.b = true; }.a.${bString};\n\n  selectOrAttrs = { }.${aString} or true;\n\n  binds = { ${aString}.\"${bString}c\" = true; }.a.bc;\n\n  recBinds = rec { ${bString} = a; a = true; }.b;\n\n  multiAttrs = { ${aString} = true; ${bString} = false; }.a;\n}\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-dynamic-attrs.exp",
    "content": "{ binds = true; hasAttrs = true; multiAttrs = true; recBinds = true; selectAttrs = true; selectOrAttrs = true; }\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-dynamic-attrs.nix",
    "content": "let\n  aString = \"a\";\n\n  bString = \"b\";\nin {\n  hasAttrs = { a.b = null; } ? \"${aString}\".b;\n\n  selectAttrs = { a.b = true; }.a.\"${bString}\";\n\n  selectOrAttrs = { }.\"${aString}\" or true;\n\n  binds = { \"${aString}\".\"${bString}c\" = true; }.a.bc;\n\n  recBinds = rec { \"${bString}\" = a; a = true; }.b;\n\n  multiAttrs = { \"${aString}\" = true; \"${bString}\" = false; }.a;\n}\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-elem.exp",
    "content": "[ true false 30 ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-elem.nix",
    "content": "with import ./lib.nix;\n\nlet xs = range 10 40; in\n\n[ (builtins.elem 23 xs) (builtins.elem 42 xs) (builtins.elemAt xs 20) ]\n\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-empty-args.exp",
    "content": "\"ab\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-empty-args.nix",
    "content": "({}: {x,y,}: \"${x}${y}\") {} {x = \"a\"; y = \"b\";}\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-eq-derivations.exp",
    "content": "[ true true true false ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-eq-derivations.nix",
    "content": "let\n\n  drvA1 = derivation { name = \"a\"; builder = \"/foo\"; system = \"i686-linux\"; };\n  drvA2 = derivation { name = \"a\"; builder = \"/foo\"; system = \"i686-linux\"; };\n  drvA3 = derivation { name = \"a\"; builder = \"/foo\"; system = \"i686-linux\"; } // { dummy = 1; };\n  \n  drvC1 = derivation { name = \"c\"; builder = \"/foo\"; system = \"i686-linux\"; };\n  drvC2 = derivation { name = \"c\"; builder = \"/bar\"; system = \"i686-linux\"; };\n\nin [ (drvA1 == drvA1) (drvA1 == drvA2) (drvA1 == drvA3) (drvC1 == drvC2) ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-eq.exp.disabled",
    "content": "Bool(True)\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-eq.nix",
    "content": "[\"foobar\" (rec {x = 1; y = x;})]\n==\n[(\"foo\" + \"bar\") ({x = 1; y = 1;})]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-filter.exp",
    "content": "[ 0 2 4 6 8 10 100 102 104 106 108 110 ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-filter.nix",
    "content": "with import ./lib.nix;\n\nbuiltins.filter\n  (x: x / 2 * 2 == x)\n  (builtins.concatLists [ (range 0 10) (range 100 110) ])\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-flatten.exp",
    "content": "\"1234567\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-flatten.nix",
    "content": "with import ./lib.nix;\n\nlet {\n\n  l = [\"1\" \"2\" [\"3\" [\"4\"] [\"5\" \"6\"]] \"7\"];\n\n  body = concat (flatten l);\n}\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-float.exp",
    "content": "[ 3.4 3.5 2.5 1.5 ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-float.nix",
    "content": "[\n  (1.1 + 2.3)\n  (builtins.add (0.5 + 0.5) (2.0 + 0.5))\n  ((0.5 + 0.5) * (2.0 + 0.5))\n  ((1.5 + 1.5) / (0.5 * 4.0))\n]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-floor-ceil.exp",
    "content": "\"23;24;23;23\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-floor-ceil.nix",
    "content": "with import ./lib.nix;\n\nlet\n  n1 = builtins.floor 23.5;\n  n2 = builtins.ceil 23.5;\n  n3 = builtins.floor 23;\n  n4 = builtins.ceil 23;\nin\n  builtins.concatStringsSep \";\" (map toString [ n1 n2 n3 n4 ])\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-foldlStrict.exp",
    "content": "500500\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-foldlStrict.nix",
    "content": "with import ./lib.nix;\n\nbuiltins.foldl' (x: y: x + y) 0 (range 1 1000)\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-fromTOML.exp",
    "content": "[ { clients = { data = [ [ \"gamma\" \"delta\" ] [ 1 2 ] ]; hosts = [ \"alpha\" \"omega\" ]; }; database = { connection_max = 5000; enabled = true; ports = [ 8001 8001 8002 ]; server = \"192.168.1.1\"; }; owner = { name = \"Tom Preston-Werner\"; }; servers = { alpha = { dc = \"eqdc10\"; ip = \"10.0.0.1\"; }; beta = { dc = \"eqdc10\"; ip = \"10.0.0.2\"; }; }; title = \"TOML Example\"; } { \"1234\" = \"value\"; \"127.0.0.1\" = \"value\"; a = { b = { c = { }; }; }; arr1 = [ 1 2 3 ]; arr2 = [ \"red\" \"yellow\" \"green\" ]; arr3 = [ [ 1 2 ] [ 3 4 5 ] ]; arr4 = [ \"all\" \"strings\" \"are the same\" \"type\" ]; arr5 = [ [ 1 2 ] [ \"a\" \"b\" \"c\" ] ]; arr7 = [ 1 2 3 ]; arr8 = [ 1 2 ]; bare-key = \"value\"; bare_key = \"value\"; bin1 = 214; bool1 = true; bool2 = false; \"character encoding\" = \"value\"; d = { e = { f = { }; }; }; dog = { \"tater.man\" = { type = { name = \"pug\"; }; }; }; flt1 = 1; flt2 = 3.1415; flt3 = -0.01; flt4 = 5e+22; flt5 = 1e+06; flt6 = -0.02; flt7 = 6.626e-34; flt8 = 9.22462e+06; fruit = [ { name = \"apple\"; physical = { color = \"red\"; shape = \"round\"; }; variety = [ { name = \"red delicious\"; } { name = \"granny smith\"; } ]; } { name = \"banana\"; variety = [ { name = \"plantain\"; } ]; } ]; g = { h = { i = { }; }; }; hex1 = 3735928559; hex2 = 3735928559; hex3 = 3735928559; int1 = 99; int2 = 42; int3 = 0; int4 = -17; int5 = 1000; int6 = 5349221; int7 = 12345; j = { \"ʞ\" = { l = { }; }; }; key = \"value\"; key2 = \"value\"; name = \"Orange\"; oct1 = 342391; oct2 = 493; physical = { color = \"orange\"; shape = \"round\"; }; products = [ { name = \"Hammer\"; sku = 738594937; } { } { color = \"gray\"; name = \"Nail\"; sku = 284758393; } ]; \"quoted \\\"value\\\"\" = \"value\"; site = { \"google.com\" = true; }; str = \"I'm a string. \\\"You can quote me\\\". Name\\tJosé\\nLocation\\tSF.\"; table-1 = { key1 = \"some string\"; key2 = 123; }; table-2 = { key1 = \"another string\"; key2 = 456; }; x = { y = { z = { w = { animal = { type = { name = \"pug\"; }; }; name = { first = \"Tom\"; last = \"Preston-Werner\"; }; point = { x = 1; y = 2; }; }; }; }; }; \"ʎǝʞ\" = \"value\"; } { metadata = { \"checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)\" = \"d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4\"; \"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)\" = \"ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b\"; \"checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)\" = \"23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6\"; \"checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)\" = \"a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef\"; }; package = [ { dependencies = [ \"memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)\" ]; name = \"aho-corasick\"; source = \"registry+https://github.com/rust-lang/crates.io-index\"; version = \"0.6.4\"; } { name = \"ansi_term\"; source = \"registry+https://github.com/rust-lang/crates.io-index\"; version = \"0.9.0\"; } { dependencies = [ \"libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)\" \"termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)\" \"winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)\" ]; name = \"atty\"; source = \"registry+https://github.com/rust-lang/crates.io-index\"; version = \"0.2.10\"; } ]; } { a = [ [ { b = true; } ] ]; c = [ [ { d = true; } ] ]; e = [ [ 123 ] ]; } ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-fromTOML.nix",
    "content": "[\n\n  (builtins.fromTOML ''\n    # This is a TOML document.\n\n    title = \"TOML Example\"\n\n    [owner]\n    name = \"Tom Preston-Werner\"\n    #dob = 1979-05-27T07:32:00-08:00 # First class dates\n\n    [database]\n    server = \"192.168.1.1\"\n    ports = [ 8001, 8001, 8002 ]\n    connection_max = 5000\n    enabled = true\n\n    [servers]\n\n      # Indentation (tabs and/or spaces) is allowed but not required\n      [servers.alpha]\n      ip = \"10.0.0.1\"\n      dc = \"eqdc10\"\n\n      [servers.beta]\n      ip = \"10.0.0.2\"\n      dc = \"eqdc10\"\n\n    [clients]\n    data = [ [\"gamma\", \"delta\"], [1, 2] ]\n\n    # Line breaks are OK when inside arrays\n    hosts = [\n      \"alpha\",\n      \"omega\"\n    ]\n  '')\n\n  (builtins.fromTOML ''\n    key = \"value\"\n    bare_key = \"value\"\n    bare-key = \"value\"\n    1234 = \"value\"\n\n    \"127.0.0.1\" = \"value\"\n    \"character encoding\" = \"value\"\n    \"ʎǝʞ\" = \"value\"\n    'key2' = \"value\"\n    'quoted \"value\"' = \"value\"\n\n    name = \"Orange\"\n\n    physical.color = \"orange\"\n    physical.shape = \"round\"\n    site.\"google.com\" = true\n\n    # This is legal according to the spec, but cpptoml doesn't handle it.\n    #a.b.c = 1\n    #a.d = 2\n\n    str = \"I'm a string. \\\"You can quote me\\\". Name\\tJos\\u00E9\\nLocation\\tSF.\"\n\n    int1 = +99\n    int2 = 42\n    int3 = 0\n    int4 = -17\n    int5 = 1_000\n    int6 = 5_349_221\n    int7 = 1_2_3_4_5\n\n    hex1 = 0xDEADBEEF\n    hex2 = 0xdeadbeef\n    hex3 = 0xdead_beef\n\n    oct1 = 0o01234567\n    oct2 = 0o755\n\n    bin1 = 0b11010110\n\n    flt1 = +1.0\n    flt2 = 3.1415\n    flt3 = -0.01\n    flt4 = 5e+22\n    flt5 = 1e6\n    flt6 = -2E-2\n    flt7 = 6.626e-34\n    flt8 = 9_224_617.445_991_228_313\n\n    bool1 = true\n    bool2 = false\n\n    # FIXME: not supported because Nix doesn't have a date/time type.\n    #odt1 = 1979-05-27T07:32:00Z\n    #odt2 = 1979-05-27T00:32:00-07:00\n    #odt3 = 1979-05-27T00:32:00.999999-07:00\n    #odt4 = 1979-05-27 07:32:00Z\n    #ldt1 = 1979-05-27T07:32:00\n    #ldt2 = 1979-05-27T00:32:00.999999\n    #ld1 = 1979-05-27\n    #lt1 = 07:32:00\n    #lt2 = 00:32:00.999999\n\n    arr1 = [ 1, 2, 3 ]\n    arr2 = [ \"red\", \"yellow\", \"green\" ]\n    arr3 = [ [ 1, 2 ], [3, 4, 5] ]\n    arr4 = [ \"all\", 'strings', \"\"\"are the same\"\"\", ''''type'''']\n    arr5 = [ [ 1, 2 ], [\"a\", \"b\", \"c\"] ]\n\n    arr7 = [\n      1, 2, 3\n    ]\n\n    arr8 = [\n      1,\n      2, # this is ok\n    ]\n\n    [table-1]\n    key1 = \"some string\"\n    key2 = 123\n\n\n    [table-2]\n    key1 = \"another string\"\n    key2 = 456\n\n    [dog.\"tater.man\"]\n    type.name = \"pug\"\n\n    [a.b.c]\n    [ d.e.f ]\n    [ g .  h  . i ]\n    [ j . \"ʞ\" . 'l' ]\n    [x.y.z.w]\n\n    name = { first = \"Tom\", last = \"Preston-Werner\" }\n    point = { x = 1, y = 2 }\n    animal = { type.name = \"pug\" }\n\n    [[products]]\n    name = \"Hammer\"\n    sku = 738594937\n\n    [[products]]\n\n    [[products]]\n    name = \"Nail\"\n    sku = 284758393\n    color = \"gray\"\n\n    [[fruit]]\n      name = \"apple\"\n\n      [fruit.physical]\n        color = \"red\"\n        shape = \"round\"\n\n      [[fruit.variety]]\n        name = \"red delicious\"\n\n      [[fruit.variety]]\n        name = \"granny smith\"\n\n    [[fruit]]\n      name = \"banana\"\n\n      [[fruit.variety]]\n        name = \"plantain\"\n  '')\n\n  (builtins.fromTOML ''\n    [[package]]\n    name = \"aho-corasick\"\n    version = \"0.6.4\"\n    source = \"registry+https://github.com/rust-lang/crates.io-index\"\n    dependencies = [\n     \"memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)\",\n    ]\n\n    [[package]]\n    name = \"ansi_term\"\n    version = \"0.9.0\"\n    source = \"registry+https://github.com/rust-lang/crates.io-index\"\n\n    [[package]]\n    name = \"atty\"\n    version = \"0.2.10\"\n    source = \"registry+https://github.com/rust-lang/crates.io-index\"\n    dependencies = [\n     \"libc 0.2.42 (registry+https://github.com/rust-lang/crates.io-index)\",\n     \"termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)\",\n     \"winapi 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)\",\n    ]\n\n    [metadata]\n    \"checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)\" = \"d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4\"\n    \"checksum ansi_term 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)\" = \"ee49baf6cb617b853aa8d93bf420db2383fab46d314482ca2803b40d5fde979b\"\n    \"checksum ansi_term 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)\" = \"23ac7c30002a5accbf7e8987d0632fa6de155b7c3d39d0067317a391e00a2ef6\"\n    \"checksum arrayvec 0.4.7 (registry+https://github.com/rust-lang/crates.io-index)\" = \"a1e964f9e24d588183fcb43503abda40d288c8657dfc27311516ce2f05675aef\"\n  '')\n\n  (builtins.fromTOML ''\n    a = [[{ b = true }]]\n    c = [ [ { d = true } ] ]\n    e = [[123]]\n  '')\n\n]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-fromjson-escapes.exp",
    "content": "\"quote \\\" reverse solidus \\\\ solidus / backspace \b formfeed \f newline \\n carriage return \\r horizontal tab \\t 1 char unicode encoded backspace \b 1 char unicode encoded e with accent é 2 char unicode encoded s with caron š 3 char unicode encoded rightwards arrow →\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-fromjson-escapes.nix",
    "content": "# This string contains all supported escapes in a JSON string, per json.org\n# \\b and \\f are not supported by Nix\nbuiltins.fromJSON ''\"quote \\\" reverse solidus \\\\ solidus \\/ backspace \\b formfeed \\f newline \\n carriage return \\r horizontal tab \\t 1 char unicode encoded backspace \\u0008 1 char unicode encoded e with accent \\u00e9 2 char unicode encoded s with caron \\u0161 3 char unicode encoded rightwards arrow \\u2192\"''\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-fromjson.exp",
    "content": "true\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-fromjson.nix",
    "content": "# RFC 7159, section 13.\nbuiltins.fromJSON\n  ''\n    {\n      \"Image\": {\n          \"Width\":  800,\n          \"Height\": 600,\n          \"Title\":  \"View from 15th Floor\",\n          \"Thumbnail\": {\n              \"Url\":    \"http://www.example.com/image/481989943\",\n              \"Height\": 125,\n              \"Width\":  100\n          },\n          \"Animated\" : false,\n          \"IDs\": [116, 943, 234, 38793, true  ,false,null, -100],\n          \"Latitude\":  37.7668,\n          \"Longitude\": -122.3959\n        }\n    }\n  ''\n==\n  { Image =\n    { Width = 800;\n      Height = 600;\n      Title = \"View from 15th Floor\";\n      Thumbnail =\n        { Url = http://www.example.com/image/481989943;\n          Height = 125;\n          Width = 100;\n        };\n      Animated = false;\n      IDs = [ 116 943 234 38793 true false null (0-100) ];\n      Latitude = 37.7668;\n      Longitude = -122.3959;\n    };\n  }\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-functionargs.exp.xml",
    "content": "<?xml version='1.0' encoding='utf-8'?>\n<expr>\n  <list>\n    <string value=\"stdenv\" />\n    <string value=\"fetchurl\" />\n    <string value=\"aterm-stdenv\" />\n    <string value=\"aterm-stdenv2\" />\n    <string value=\"libX11\" />\n    <string value=\"libXv\" />\n    <string value=\"mplayer-stdenv2.libXv-libX11\" />\n    <string value=\"mplayer-stdenv2.libXv-libX11_2\" />\n    <string value=\"nix-stdenv-aterm-stdenv\" />\n    <string value=\"nix-stdenv2-aterm2-stdenv2\" />\n  </list>\n</expr>\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-functionargs.nix",
    "content": "let\n\n  stdenvFun = { }: { name = \"stdenv\"; };\n  stdenv2Fun = { }: { name = \"stdenv2\"; };\n  fetchurlFun = { stdenv }: assert stdenv.name == \"stdenv\"; { name = \"fetchurl\"; };\n  atermFun = { stdenv, fetchurl }: { name = \"aterm-${stdenv.name}\"; };\n  aterm2Fun = { stdenv, fetchurl }: { name = \"aterm2-${stdenv.name}\"; };\n  nixFun = { stdenv, fetchurl, aterm }: { name = \"nix-${stdenv.name}-${aterm.name}\"; };\n  \n  mplayerFun =\n    { stdenv, fetchurl, enableX11 ? false, xorg ? null, enableFoo ? true, foo ? null  }:\n    assert stdenv.name == \"stdenv2\";\n    assert enableX11 -> xorg.libXv.name == \"libXv\";\n    assert enableFoo -> foo != null;\n    { name = \"mplayer-${stdenv.name}.${xorg.libXv.name}-${xorg.libX11.name}\"; };\n\n  makeOverridable = f: origArgs: f origArgs //\n    { override = newArgs:\n        makeOverridable f (origArgs // (if builtins.isFunction newArgs then newArgs origArgs else newArgs));\n    };\n    \n  callPackage_ = pkgs: f: args:\n    makeOverridable f ((builtins.intersectAttrs (builtins.functionArgs f) pkgs) // args);\n\n  allPackages =\n    { overrides ? (pkgs: pkgsPrev: { }) }:\n    let\n      callPackage = callPackage_ pkgs;\n      pkgs = pkgsStd // (overrides pkgs pkgsStd);\n      pkgsStd = {\n        inherit pkgs;\n        stdenv = callPackage stdenvFun { };\n        stdenv2 = callPackage stdenv2Fun { };\n        fetchurl = callPackage fetchurlFun { };\n        aterm = callPackage atermFun { };\n        xorg = callPackage xorgFun { };\n        mplayer = callPackage mplayerFun { stdenv = pkgs.stdenv2; enableFoo = false; };\n        nix = callPackage nixFun { };\n      };\n    in pkgs;\n\n  libX11Fun = { stdenv, fetchurl }: { name = \"libX11\"; };\n  libX11_2Fun = { stdenv, fetchurl }: { name = \"libX11_2\"; };\n  libXvFun = { stdenv, fetchurl, libX11 }: { name = \"libXv\"; };\n  \n  xorgFun =\n    { pkgs }:\n    let callPackage = callPackage_ (pkgs // pkgs.xorg); in\n    {\n      libX11 = callPackage libX11Fun { };\n      libXv = callPackage libXvFun { };\n    };\n\nin\n\nlet\n\n  pkgs = allPackages { };\n  \n  pkgs2 = allPackages {\n    overrides = pkgs: pkgsPrev: {\n      stdenv = pkgs.stdenv2;\n      nix = pkgsPrev.nix.override { aterm = aterm2Fun { inherit (pkgs) stdenv fetchurl; }; };\n      xorg = pkgsPrev.xorg // { libX11 = libX11_2Fun { inherit (pkgs) stdenv fetchurl; }; };\n    };\n  };\n  \nin\n\n  [ pkgs.stdenv.name\n    pkgs.fetchurl.name\n    pkgs.aterm.name\n    pkgs2.aterm.name\n    pkgs.xorg.libX11.name\n    pkgs.xorg.libXv.name\n    pkgs.mplayer.name\n    pkgs2.mplayer.name\n    pkgs.nix.name\n    pkgs2.nix.name\n  ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-getattrpos-functionargs.exp",
    "content": "{ column = 11; file = \"eval-okay-getattrpos-functionargs.nix\"; line = 2; }\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-getattrpos-functionargs.nix",
    "content": "let\n  fun = { foo }: {};\n  pos = builtins.unsafeGetAttrPos \"foo\" (builtins.functionArgs fun);\nin { inherit (pos) column line; file = baseNameOf pos.file; }\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-getattrpos-undefined.exp",
    "content": "null\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-getattrpos-undefined.nix",
    "content": "builtins.unsafeGetAttrPos \"abort\" builtins\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-getattrpos.exp",
    "content": "{ column = 5; file = \"eval-okay-getattrpos.nix\"; line = 3; }\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-getattrpos.nix",
    "content": "let\n  as = {\n    foo = \"bar\";\n  };\n  pos = builtins.unsafeGetAttrPos \"foo\" as;\nin { inherit (pos) column line; file = baseNameOf pos.file; }\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-getenv.exp",
    "content": "\"foobar\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-getenv.nix",
    "content": "builtins.getEnv \"TEST_VAR\" + (if builtins.getEnv \"NO_SUCH_VAR\" == \"\" then \"bar\" else \"bla\")\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-hash.exp",
    "content": ""
  },
  {
    "path": "data/nix/tests/lang/eval-okay-hashfile.exp",
    "content": "[ \"d3b07384d113edec49eaa6238ad5ff00\" \"0f343b0931126a20f133d67c2b018a3b\" \"f1d2d2f924e986ac86fdf7b36c94bcdf32beec15\" \"60cacbf3d72e1e7834203da608037b1bf83b40e8\" \"b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c\" \"5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef\" \"0cf9180a764aba863a67b6d72f0918bc131c6772642cb2dce5a34f0a702f9470ddc2bf125c12198b1995c233c34b4afd346c54a2334c350a948a51b6e8b4e6b6\" \"8efb4f73c5655351c444eb109230c556d39e2c7624e9c11abc9e3fb4b9b9254218cc5085b454a9698d085cfa92198491f07a723be4574adc70617b73eb0b6461\" ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-hashfile.nix",
    "content": "let\n  paths = [ ./data ./binary-data ];\nin\n  builtins.concatLists (map (hash: map (builtins.hashFile hash) paths) [\"md5\" \"sha1\" \"sha256\" \"sha512\"])\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-hashstring.exp",
    "content": "[ \"d41d8cd98f00b204e9800998ecf8427e\" \"6c69ee7f211c640419d5366cc076ae46\" \"bb3438fbabd460ea6dbd27d153e2233b\" \"da39a3ee5e6b4b0d3255bfef95601890afd80709\" \"cd54e8568c1b37cf1e5badb0779bcbf382212189\" \"6d12e10b1d331dad210e47fd25d4f260802b7e77\" \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\" \"900a4469df00ccbfd0c145c6d1e4b7953dd0afafadd7534e3a4019e8d38fc663\" \"ad0387b3bd8652f730ca46d25f9c170af0fd589f42e7f23f5a9e6412d97d7e56\" \"cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e\" \"9d0886f8c6b389398a16257bc79780fab9831c7fc11c8ab07fa732cb7b348feade382f92617c9c5305fefba0af02ab5fd39a587d330997ff5bd0db19f7666653\" \"21644b72aa259e5a588cd3afbafb1d4310f4889680f6c83b9d531596a5a284f34dbebff409d23bcc86aee6bad10c891606f075c6f4755cb536da27db5693f3a7\" ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-hashstring.nix",
    "content": "let\n  strings = [ \"\" \"text 1\" \"text 2\" ];\nin\n  builtins.concatLists (map (hash: map (builtins.hashString hash) strings) [\"md5\" \"sha1\" \"sha256\" \"sha512\"])\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-if.exp",
    "content": "3\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-if.nix",
    "content": "if \"foo\" != \"f\" + \"oo\" then 1 else if false then 2 else 3\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-import.exp",
    "content": "[ 1 2 3 4 5 6 7 8 9 10 ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-import.nix",
    "content": "let\n\n  overrides = {\n    import = fn: scopedImport overrides fn;\n\n    scopedImport = attrs: fn: scopedImport (overrides // attrs) fn;\n\n    builtins = builtins // overrides;\n  } // import ./lib.nix;\n\nin scopedImport overrides ./imported.nix\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-ind-string.exp",
    "content": "\"This is an indented multi-line string\\nliteral.  An amount of whitespace at\\nthe start of each line matching the minimum\\nindentation of all lines in the string\\nliteral together will be removed.  Thus,\\nin this case four spaces will be\\nstripped from each line, even though\\n  THIS LINE is indented six spaces.\\n\\nAlso, empty lines don't count in the\\ndetermination of the indentation level (the\\nprevious empty line has indentation 0, but\\nit doesn't matter).\\nIf the string starts with whitespace\\n  followed by a newline, it's stripped, but\\n  that's not the case here. Two spaces are\\n  stripped because of the \\\"  \\\" at the start. \\nThis line is indented\\na bit further.\\nAnti-quotations, like so, are\\nalso allowed.\\n  The \\\\ is not special here.\\n' can be followed by any character except another ', e.g. 'x'.\\nLikewise for $, e.g. $$ or $varName.\\nBut ' followed by ' is special, as is $ followed by {.\\nIf you want them, use anti-quotations: '', \\${.\\n   Tabs are not interpreted as whitespace (since we can't guess\\n   what tab settings are intended), so don't use them.\\n\\tThis line starts with a space and a tab, so only one\\n   space will be stripped from each line.\\nAlso note that if the last line (just before the closing ' ')\\nconsists only of whitespace, it's ignored.  But here there is\\nsome non-whitespace stuff, so the line isn't removed. \\nThis shows a hacky way to preserve an empty line after the start.\\nBut there's no reason to do so: you could just repeat the empty\\nline.\\n  Similarly you can force an indentation level,\\n  in this case to 2 spaces.  This works because the anti-quote\\n  is significant (not whitespace).\\nstart on network-interfaces\\n\\nstart script\\n\\n  rm -f /var/run/opengl-driver\\n  ln -sf 123 /var/run/opengl-driver\\n\\n  rm -f /var/log/slim.log\\n   \\nend script\\n\\nenv SLIM_CFGFILE=abc\\nenv SLIM_THEMESDIR=def\\nenv FONTCONFIG_FILE=/etc/fonts/fonts.conf  \\t\\t\\t\\t# !!! cleanup\\nenv XKB_BINDIR=foo/bin         \\t\\t\\t\\t# Needed for the Xkb extension.\\nenv LD_LIBRARY_PATH=libX11/lib:libXext/lib:/usr/lib/          # related to xorg-sys-opengl - needed to load libglx for (AI)GLX support (for compiz)\\n\\nenv XORG_DRI_DRIVER_PATH=nvidiaDrivers/X11R6/lib/modules/drivers/ \\n\\nexec slim/bin/slim\\nEscaping of ' followed by ': ''\\nEscaping of $ followed by {: \\${\\nAnd finally to interpret \\\\n etc. as in a string: \\n, \\r, \\t.\\nfoo\\n'bla'\\nbar\\ncut -d $'\\\\t' -f 1\\nending dollar $$\\n\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-ind-string.nix",
    "content": "let\n\n  s1 = ''\n    This is an indented multi-line string\n    literal.  An amount of whitespace at\n    the start of each line matching the minimum\n    indentation of all lines in the string\n    literal together will be removed.  Thus,\n    in this case four spaces will be\n    stripped from each line, even though\n      THIS LINE is indented six spaces.\n\n    Also, empty lines don't count in the\n    determination of the indentation level (the\n    previous empty line has indentation 0, but\n    it doesn't matter).\n  '';\n\n  s2 = ''  If the string starts with whitespace\n    followed by a newline, it's stripped, but\n    that's not the case here. Two spaces are\n    stripped because of the \"  \" at the start. \n  '';\n\n  s3 = ''\n      This line is indented\n      a bit further.\n        ''; # indentation of last line doesn't count if it's empty\n\n  s4 = ''\n    Anti-quotations, like ${if true then \"so\" else \"not so\"}, are\n    also allowed.\n  '';\n\n  s5 = ''\n      The \\ is not special here.\n    ' can be followed by any character except another ', e.g. 'x'.\n    Likewise for $, e.g. $$ or $varName.\n    But ' followed by ' is special, as is $ followed by {.\n    If you want them, use anti-quotations: ${\"''\"}, ${\"\\${\"}.\n  '';\n\n  s6 = ''  \n    Tabs are not interpreted as whitespace (since we can't guess\n    what tab settings are intended), so don't use them.\n \tThis line starts with a space and a tab, so only one\n    space will be stripped from each line.\n  '';\n\n  s7 = ''\n    Also note that if the last line (just before the closing ' ')\n    consists only of whitespace, it's ignored.  But here there is\n    some non-whitespace stuff, so the line isn't removed. '';\n\n  s8 = ''    ${\"\"}\n    This shows a hacky way to preserve an empty line after the start.\n    But there's no reason to do so: you could just repeat the empty\n    line.\n  '';\n\n  s9 = ''\n  ${\"\"}  Similarly you can force an indentation level,\n    in this case to 2 spaces.  This works because the anti-quote\n    is significant (not whitespace).\n  '';\n\n  s10 = ''\n  '';\n\n  s11 = '''';\n\n  s12 = ''   '';\n\n  s13 = ''\n    start on network-interfaces\n\n    start script\n    \n      rm -f /var/run/opengl-driver\n      ${if true\n        then \"ln -sf 123 /var/run/opengl-driver\"\n        else if true\n        then \"ln -sf 456 /var/run/opengl-driver\"\n        else \"\"\n      }\n\n      rm -f /var/log/slim.log\n       \n    end script\n\n    env SLIM_CFGFILE=${\"abc\"}\n    env SLIM_THEMESDIR=${\"def\"}\n    env FONTCONFIG_FILE=/etc/fonts/fonts.conf  \t\t\t\t# !!! cleanup\n    env XKB_BINDIR=${\"foo\"}/bin         \t\t\t\t# Needed for the Xkb extension.\n    env LD_LIBRARY_PATH=${\"libX11\"}/lib:${\"libXext\"}/lib:/usr/lib/          # related to xorg-sys-opengl - needed to load libglx for (AI)GLX support (for compiz)\n\n    ${if true\n      then \"env XORG_DRI_DRIVER_PATH=${\"nvidiaDrivers\"}/X11R6/lib/modules/drivers/\"\n    else if true\n      then \"env XORG_DRI_DRIVER_PATH=${\"mesa\"}/lib/modules/dri\"\n      else \"\"\n    } \n\n    exec ${\"slim\"}/bin/slim\n  '';\n\n  s14 = ''\n    Escaping of ' followed by ': '''\n    Escaping of $ followed by {: ''${\n    And finally to interpret \\n etc. as in a string: ''\\n, ''\\r, ''\\t.\n  '';\n\n  # Regression test: antiquotation in '${x}' should work, but didn't.\n  s15 = let x = \"bla\"; in ''\n    foo\n    '${x}'\n    bar\n  '';\n\n  # Regression test: accept $'.\n  s16 = ''\n    cut -d $'\\t' -f 1\n  '';\n\n  # Accept dollars at end of strings \n  s17 = ''ending dollar $'' + ''$'' + \"\\n\";\n\nin s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8 + s9 + s10 + s11 + s12 + s13 + s14 + s15 + s16 + s17\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-let.exp",
    "content": "\"foobar\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-let.nix",
    "content": "let {\n  x = \"foo\";\n  y = \"bar\";\n  body = x + y;\n}\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-list.exp",
    "content": "\"foobarblatest\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-list.nix",
    "content": "with import ./lib.nix;\n\nlet {\n\n  body = concat [\"foo\" \"bar\" \"bla\" \"test\"];\n    \n}"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-listtoattrs.exp",
    "content": "\"AAbar\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-listtoattrs.nix",
    "content": "# this test shows how to use listToAttrs and that evaluation is still lazy (throw isn't called)\nwith import ./lib.nix;\n\nlet \n  asi = name: value : { inherit name value; };\n  list = [ ( asi \"a\" \"A\" ) ( asi \"b\" \"B\" ) ];\n  a = builtins.listToAttrs list;\n  b = builtins.listToAttrs ( list ++ list );\n  r = builtins.listToAttrs [ (asi \"result\" [ a b ]) ( asi \"throw\" (throw \"this should not be thrown\")) ];\n  x = builtins.listToAttrs [ (asi \"foo\" \"bar\") (asi \"foo\" \"bla\") ];\nin concat (map (x: x.a) r.result) + x.foo\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-logic.exp",
    "content": "1\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-logic.nix",
    "content": "assert !false && (true || false) -> true; 1\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-map.exp",
    "content": "\"foobarblabarxyzzybar\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-map.nix",
    "content": "with import ./lib.nix;\n\nconcat (map (x: x + \"bar\") [ \"foo\" \"bla\" \"xyzzy\" ])"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-mapattrs.exp",
    "content": "{ x = \"x-foo\"; y = \"y-bar\"; }\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-mapattrs.nix",
    "content": "with import ./lib.nix;\n\nbuiltins.mapAttrs (name: value: name + \"-\" + value) { x = \"foo\"; y = \"bar\"; }\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-nested-with.exp",
    "content": "2\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-nested-with.nix",
    "content": "with { x = 1; };\nwith { x = 2; };\nx\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-new-let.exp",
    "content": "\"xyzzyfoobar\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-new-let.nix",
    "content": "let\n\n  f = z: \n\n    let\n      x = \"foo\";\n      y = \"bar\";\n      body = 1; # compat test\n    in\n      z + x + y;\n\n  arg = \"xyzzy\";\n\nin f arg\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-null-dynamic-attrs.exp",
    "content": "true\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-null-dynamic-attrs.nix",
    "content": "{ ${null} = true; } == {}\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-overrides.exp",
    "content": "2\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-overrides.nix",
    "content": "let\n\n  overrides = { a = 2; };\n\nin (rec {\n  __overrides = overrides;\n  x = a;\n  a = 1;\n}).x\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-partition.exp",
    "content": "{ right = [ 0 2 4 6 8 10 100 102 104 106 108 110 ]; wrong = [ 1 3 5 7 9 101 103 105 107 109 ]; }\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-partition.nix",
    "content": "with import ./lib.nix;\n\nbuiltins.partition\n  (x: x / 2 * 2 == x)\n  (builtins.concatLists [ (range 0 10) (range 100 110) ])\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-path-antiquotation.nix",
    "content": "let\n  foo = \"foo\";\nin\n{\n  simple = ./${foo};\n  surrounded = ./a-${foo}-b;\n  absolute = /${foo};\n  expr = ./${foo + \"/bar\"};\n  home = ~/${foo};\n  notfirst = ./bar/${foo};\n  slashes = /${foo}/${\"bar\"};\n}\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-path.nix",
    "content": "builtins.path\n  { path = ./.;\n    filter = path: _: baseNameOf path == \"data\";\n    recursive = true;\n    sha256 = \"1yhm3gwvg5a41yylymgblsclk95fs6jy72w0wv925mmidlhcq4sw\";\n    name = \"output\";\n  }\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-pathexists.exp",
    "content": "true\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-pathexists.nix",
    "content": "builtins.pathExists (builtins.toPath ./lib.nix)\n&& builtins.pathExists (builtins.toPath (builtins.toString ./lib.nix))\n&& !builtins.pathExists (builtins.toPath (builtins.toString ./bla.nix))\n&& builtins.pathExists ./lib.nix\n&& !builtins.pathExists ./bla.nix\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-patterns.exp",
    "content": "\"abcxyzDDDDEFijk\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-patterns.nix",
    "content": "let\n\n  f = args@{x, y, z}: x + args.y + z;\n\n  g = {x, y, z}@args: f args;\n\n  h = {x ? \"d\", y ? x, z ? args.x}@args: x + y + z;\n\n  j = {x, y, z, ...}: x + y + z;\n\nin\n  f {x = \"a\"; y = \"b\"; z = \"c\";} +\n  g {x = \"x\"; y = \"y\"; z = \"z\";} +\n  h {x = \"D\";} +\n  h {x = \"D\"; y = \"E\"; z = \"F\";} +\n  j {x = \"i\"; y = \"j\"; z = \"k\"; bla = \"bla\"; foo = \"bar\";}\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-readDir.exp",
    "content": "{ bar = \"regular\"; foo = \"directory\"; }\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-readDir.nix",
    "content": "builtins.readDir ./readDir\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-readfile.exp",
    "content": "\"builtins.readFile ./eval-okay-readfile.nix\\n\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-readfile.nix",
    "content": "builtins.readFile ./eval-okay-readfile.nix\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-redefine-builtin.exp",
    "content": "false\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-redefine-builtin.nix",
    "content": "let\n  throw = abort \"Error!\";\nin (builtins.tryEval <foobaz>).success\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-regex-match.exp",
    "content": "true\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-regex-match.nix",
    "content": "with builtins;\n\nlet\n\n  matches = pat: s: match pat s != null;\n\n  splitFN = match \"((.*)/)?([^/]*)\\\\.(nix|cc)\";\n\nin\n\nassert  matches \"foobar\" \"foobar\";\nassert  matches \"fo*\" \"f\";\nassert !matches \"fo+\" \"f\";\nassert  matches \"fo*\" \"fo\";\nassert  matches \"fo*\" \"foo\";\nassert  matches \"fo+\" \"foo\";\nassert  matches \"fo{1,2}\" \"foo\";\nassert !matches \"fo{1,2}\" \"fooo\";\nassert !matches \"fo*\" \"foobar\";\nassert  matches \"[[:space:]]+([^[:space:]]+)[[:space:]]+\" \"  foo   \";\nassert !matches \"[[:space:]]+([[:upper:]]+)[[:space:]]+\" \"  foo   \";\n\nassert match \"(.*)\\\\.nix\" \"foobar.nix\" == [ \"foobar\" ];\nassert match \"[[:space:]]+([[:upper:]]+)[[:space:]]+\" \"  FOO   \" == [ \"FOO\" ];\n\nassert splitFN \"/path/to/foobar.nix\" == [ \"/path/to/\" \"/path/to\" \"foobar\" \"nix\" ];\nassert splitFN \"foobar.cc\" == [ null null \"foobar\" \"cc\" ];\n\ntrue\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-regex-split.exp",
    "content": "true\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-regex-split.nix",
    "content": "with builtins;\n\n# Non capturing regex returns empty lists\nassert  split \"foobar\" \"foobar\"  == [\"\" [] \"\"];\nassert  split \"fo*\" \"f\"          == [\"\" [] \"\"];\nassert  split \"fo+\" \"f\"          == [\"f\"];\nassert  split \"fo*\" \"fo\"         == [\"\" [] \"\"];\nassert  split \"fo*\" \"foo\"        == [\"\" [] \"\"];\nassert  split \"fo+\" \"foo\"        == [\"\" [] \"\"];\nassert  split \"fo{1,2}\" \"foo\"    == [\"\" [] \"\"];\nassert  split \"fo{1,2}\" \"fooo\"   == [\"\" [] \"o\"];\nassert  split \"fo*\" \"foobar\"     == [\"\" [] \"bar\"];\n\n# Capturing regex returns a list of sub-matches\nassert  split \"(fo*)\" \"f\"        == [\"\" [\"f\"] \"\"];\nassert  split \"(fo+)\" \"f\"        == [\"f\"];\nassert  split \"(fo*)\" \"fo\"       == [\"\" [\"fo\"] \"\"];\nassert  split \"(f)(o*)\" \"f\"      == [\"\" [\"f\" \"\"] \"\"];\nassert  split \"(f)(o*)\" \"foo\"    == [\"\" [\"f\" \"oo\"] \"\"];\nassert  split \"(fo+)\" \"foo\"      == [\"\" [\"foo\"] \"\"];\nassert  split \"(fo{1,2})\" \"foo\"  == [\"\" [\"foo\"] \"\"];\nassert  split \"(fo{1,2})\" \"fooo\" == [\"\" [\"foo\"] \"o\"];\nassert  split \"(fo*)\" \"foobar\"   == [\"\" [\"foo\"] \"bar\"];\n\n# Matches are greedy.\nassert  split \"(o+)\" \"oooofoooo\" == [\"\" [\"oooo\"] \"f\" [\"oooo\"] \"\"];\n\n# Matches multiple times.\nassert  split \"(b)\" \"foobarbaz\"  == [\"foo\" [\"b\"] \"ar\" [\"b\"] \"az\"];\n\n# Split large strings containing newlines. null are inserted when a\n# pattern within the current did not match anything.\nassert  split \"[[:space:]]+|([',.!?])\" ''\n  Nix Rocks!\n  That's why I use it.\n''  == [\n  \"Nix\" [ null ] \"Rocks\" [\"!\"] \"\" [ null ]\n  \"That\" [\"'\"] \"s\" [ null ] \"why\" [ null ] \"I\" [ null ] \"use\" [ null ] \"it\" [\".\"] \"\" [ null ]\n  \"\"\n];\n\n# Documentation examples\nassert  split  \"(a)b\" \"abc\"      == [ \"\" [ \"a\" ] \"c\" ];\nassert  split  \"([ac])\" \"abc\"    == [ \"\" [ \"a\" ] \"b\" [ \"c\" ] \"\" ];\nassert  split  \"(a)|(c)\" \"abc\"   == [ \"\" [ \"a\" null ] \"b\" [ null \"c\" ] \"\" ];\nassert  split  \"([[:upper:]]+)\" \"  FOO   \" == [ \"  \" [ \"FOO\" ] \"   \" ];\n\ntrue\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-remove.exp",
    "content": "456\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-remove.nix",
    "content": "let {\n  attrs = {x = 123; y = 456;};\n\n  body = (removeAttrs attrs [\"x\"]).y;\n}"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-replacestrings.exp",
    "content": "[ \"faabar\" \"fbar\" \"fubar\" \"faboor\" \"fubar\" \"XaXbXcX\" \"X\" \"a_b\" ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-replacestrings.nix",
    "content": "with builtins;\n\n[ (replaceStrings [\"o\"] [\"a\"] \"foobar\")\n  (replaceStrings [\"o\"] [\"\"] \"foobar\")\n  (replaceStrings [\"oo\"] [\"u\"] \"foobar\")\n  (replaceStrings [\"oo\" \"a\"] [\"a\" \"oo\"] \"foobar\")\n  (replaceStrings [\"oo\" \"oo\"] [\"u\" \"i\"] \"foobar\")\n  (replaceStrings [\"\"] [\"X\"] \"abc\")\n  (replaceStrings [\"\"] [\"X\"] \"\")\n  (replaceStrings [\"-\"] [\"_\"] \"a-b\")\n]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-scope-1.exp",
    "content": "3\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-scope-1.nix",
    "content": "(({x}: x:\n\n  { x = 1;\n    y = x;\n  }\n) {x = 2;} 3).y\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-scope-2.exp",
    "content": "1\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-scope-2.nix",
    "content": "((x: {x}:\n  rec {\n    x = 1;\n    y = x;\n  }\n) 2 {x = 3;}).y\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-scope-3.exp",
    "content": "4\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-scope-3.nix",
    "content": "((x: as: {x}:\n  rec {\n    inherit (as) x;\n    y = x;\n  }\n) 2 {x = 4;} {x = 3;}).y\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-scope-4.exp",
    "content": "\"ccdd\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-scope-4.nix",
    "content": "let {\n\n  x = \"a\";\n  y = \"b\";\n\n  f = {x ? y, y ? x}: x + y;\n\n  body = f {x = \"c\";} + f {y = \"d\";};\n\n}\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-scope-6.exp",
    "content": "\"ccdd\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-scope-6.nix",
    "content": "let {\n\n  f = {x ? y, y ? x}: x + y;\n\n  body = f {x = \"c\";} + f {y = \"d\";};\n\n}\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-scope-7.exp",
    "content": "1\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-scope-7.nix",
    "content": "rec {\n  inherit (x) y;\n  x = {\n    y = 1;\n  };\n}.y\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-search-path.exp",
    "content": "\"abccX\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-search-path.flags",
    "content": "-I lang/dir1 -I lang/dir2 -I dir5=lang/dir3"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-search-path.nix",
    "content": "with import ./lib.nix;\nwith builtins;\n\nassert isFunction (import <nix/fetchurl.nix>);\n\nassert length __nixPath == 5;\nassert length (filter (x: baseNameOf x.path == \"dir4\") __nixPath) == 1;\n\nimport <a.nix> + import <b.nix> + import <c.nix> + import <dir5/c.nix>\n  + (let __nixPath = [ { path = ./dir2; } { path = ./dir1; } ]; in import <a.nix>)\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-seq.exp",
    "content": "2\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-seq.nix",
    "content": "builtins.seq 1 2\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-sort.exp",
    "content": "[ [ 42 77 147 249 483 526 ] [ 526 483 249 147 77 42 ] [ \"bar\" \"fnord\" \"foo\" \"xyzzy\" ] [ { key = 1; value = \"foo\"; } { key = 1; value = \"fnord\"; } { key = 2; value = \"bar\"; } ] ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-sort.nix",
    "content": "with builtins;\n\n[ (sort lessThan [ 483 249 526 147 42 77 ])\n  (sort (x: y: y < x) [ 483 249 526 147 42 77 ])\n  (sort lessThan [ \"foo\" \"bar\" \"xyzzy\" \"fnord\" ])\n  (sort (x: y: x.key < y.key)\n    [ { key = 1; value = \"foo\"; } { key = 2; value = \"bar\"; } { key = 1; value = \"fnord\"; } ]) \n]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-splitversion.exp",
    "content": "[ \"1\" \"2\" \"3\" ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-splitversion.nix",
    "content": "builtins.splitVersion \"1.2.3\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-string.exp",
    "content": "\"foobar/a/b/c/d/foo/xyzzy/foo.txt/../foo/x/yescape: \\\"quote\\\" \\n \\\\end\\nof\\nlinefoobarblaatfoo$bar$\\\"$\\\"$\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-string.nix",
    "content": "\"foo\" + \"bar\"\n  + toString (/a/b + /c/d)\n  + toString (/foo/bar + \"/../xyzzy/.\" + \"/foo.txt\")\n  + (\"/../foo\" + toString /x/y)\n  + \"escape: \\\"quote\\\" \\n \\\\\"\n  + \"end\nof\nline\"\n  + \"foo${if true then \"b${\"a\" + \"r\"}\" else \"xyzzy\"}blaat\"\n  + \"foo$bar\"\n  + \"$\\\"$\\\"\"\n  + \"$\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-strings-as-attrs-names.exp",
    "content": "true\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-strings-as-attrs-names.nix",
    "content": "let\n\n  attr = {\n    \"key 1\" = \"test\";\n    \"key 2\" = \"caseok\";\n  };\n\n  t1 = builtins.getAttr \"key 1\" attr;\n  t2 = attr.\"key 2\";\n  t3 = attr ? \"key 1\";\n  t4 = builtins.attrNames { inherit (attr) \"key 1\"; };\n\n  # This is permitted, but there is currently no way to reference this\n  # variable.\n  \"foo bar\" = 1;\n\nin t1 == \"test\"\n   && t2 == \"caseok\"\n   && t3 == true\n   && t4 == [\"key 1\"]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-substring.exp",
    "content": "\"ooxfoobarybarzobaabbc\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-substring.nix",
    "content": "with builtins;\n\nlet\n\n  s = \"foobar\";\n\nin\n\nsubstring 1 2 s\n+ \"x\"\n+ substring 0 (stringLength s) s\n+ \"y\"\n+ substring 3 100 s\n+ \"z\"\n+ substring 2 (sub (stringLength s) 3) s\n+ \"a\"\n+ substring 3 0 s\n+ \"b\"\n+ substring 3 1 s\n+ \"c\"\n+ substring 5 10 \"perl\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-tail-call-1.exp-disabled",
    "content": "100000\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-tail-call-1.nix",
    "content": "let\n  f = n: if n == 100000 then n else f (n + 1);\nin f 0\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-tojson.exp",
    "content": "\"{\\\"a\\\":123,\\\"b\\\":-456,\\\"c\\\":\\\"foo\\\",\\\"d\\\":\\\"foo\\\\n\\\\\\\"bar\\\\\\\"\\\",\\\"e\\\":true,\\\"f\\\":false,\\\"g\\\":[1,2,3],\\\"h\\\":[\\\"a\\\",[\\\"b\\\",{\\\"foo\\\\nbar\\\":{}}]],\\\"i\\\":3,\\\"j\\\":1.44,\\\"k\\\":\\\"foo\\\"}\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-tojson.nix",
    "content": "builtins.toJSON\n  { a = 123;\n    b = -456;\n    c = \"foo\";\n    d = \"foo\\n\\\"bar\\\"\";\n    e = true;\n    f = false;\n    g = [ 1 2 3 ];\n    h = [ \"a\" [ \"b\" { \"foo\\nbar\" = {}; } ] ];\n    i = 1 + 2;\n    j = 1.44;\n    k = { __toString = self: self.a; a = \"foo\"; };\n  }\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-toxml.exp",
    "content": "\"<?xml version='1.0' encoding='utf-8'?>\\n<expr>\\n  <attrs>\\n    <attr name=\\\"a\\\">\\n      <string value=\\\"s\\\" />\\n    </attr>\\n  </attrs>\\n</expr>\\n\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-toxml.nix",
    "content": "# Make sure the expected XML output is produced; in particular, make sure it\n# doesn't contain source location information.\nbuiltins.toXML { a = \"s\"; }\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-toxml2.exp",
    "content": "\"<?xml version='1.0' encoding='utf-8'?>\\n<expr>\\n  <list>\\n    <string value=\\\"ab\\\" />\\n    <int value=\\\"10\\\" />\\n    <attrs>\\n      <attr name=\\\"x\\\">\\n        <string value=\\\"x\\\" />\\n      </attr>\\n      <attr name=\\\"y\\\">\\n        <string value=\\\"x\\\" />\\n      </attr>\\n    </attrs>\\n  </list>\\n</expr>\\n\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-toxml2.nix",
    "content": "builtins.toXML [(\"a\" + \"b\") 10 (rec {x = \"x\"; y = x;})]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-tryeval.exp",
    "content": "{ x = { success = true; value = \"x\"; }; y = { success = false; value = false; }; z = { success = false; value = false; }; }\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-tryeval.nix",
    "content": "{\n  x = builtins.tryEval \"x\";\n  y = builtins.tryEval (assert false; \"y\");\n  z = builtins.tryEval (throw \"bla\");\n}\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-types.exp",
    "content": "[ true false true false true false true false true true true true true true true true true true true false true true true false \"int\" \"bool\" \"string\" \"null\" \"set\" \"list\" \"lambda\" \"lambda\" \"lambda\" \"lambda\" ]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-types.nix",
    "content": "with builtins;\n\n[ (isNull null)\n  (isNull (x: x))\n  (isFunction (x: x))\n  (isFunction \"fnord\")\n  (isString (\"foo\" + \"bar\"))\n  (isString [ \"x\" ])\n  (isInt (1 + 2))\n  (isInt { x = 123; })\n  (isInt (1 / 2))\n  (isInt (1 + 1))\n  (isInt (1 / 2))\n  (isInt (1 * 2))\n  (isInt (1 - 2))\n  (isFloat (1.2))\n  (isFloat (1 + 1.0))\n  (isFloat (1 / 2.0))\n  (isFloat (1 * 2.0))\n  (isFloat (1 - 2.0))\n  (isBool (true && false))\n  (isBool null)\n  (isPath /nix/store)\n  (isPath ./.)\n  (isAttrs { x = 123; })\n  (isAttrs null)\n  (typeOf (3 * 4))\n  (typeOf true)\n  (typeOf \"xyzzy\")\n  (typeOf null)\n  (typeOf { x = 456; })\n  (typeOf [ 1 2 3 ])\n  (typeOf (x: x))\n  (typeOf ((x: y: x) 1))\n  (typeOf map)\n  (typeOf (map (x: x)))\n]\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-versions.exp",
    "content": "true\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-versions.nix",
    "content": "let\n\n  name1 = \"hello-1.0.2\";\n  name2 = \"hello\";\n  name3 = \"915resolution-0.5.2\";\n  name4 = \"xf86-video-i810-1.7.4\";\n\n  eq = 0;\n  lt = builtins.sub 0 1;\n  gt = 1;\n\n  versionTest = v1: v2: expected:\n    let d1 = builtins.compareVersions v1 v2;\n        d2 = builtins.compareVersions v2 v1;\n    in d1 == builtins.sub 0 d2 && d1 == expected;\n\n  tests = [\n    ((builtins.parseDrvName name1).name == \"hello\")\n    ((builtins.parseDrvName name1).version == \"1.0.2\")\n    ((builtins.parseDrvName name2).name == \"hello\")\n    ((builtins.parseDrvName name2).version == \"\")\n    ((builtins.parseDrvName name3).name == \"915resolution\")\n    ((builtins.parseDrvName name3).version == \"0.5.2\")\n    ((builtins.parseDrvName name4).name == \"xf86-video-i810\")\n    ((builtins.parseDrvName name4).version == \"1.7.4\")\n    (versionTest \"1.0\" \"2.3\" lt)\n    (versionTest \"2.1\" \"2.3\" lt)\n    (versionTest \"2.3\" \"2.3\" eq)\n    (versionTest \"2.5\" \"2.3\" gt)\n    (versionTest \"3.1\" \"2.3\" gt)\n    (versionTest \"2.3.1\" \"2.3\" gt)\n    (versionTest \"2.3.1\" \"2.3a\" gt)\n    (versionTest \"2.3pre1\" \"2.3\" lt)\n    (versionTest \"2.3pre3\" \"2.3pre12\" lt)\n    (versionTest \"2.3a\" \"2.3c\" lt)\n    (versionTest \"2.3pre1\" \"2.3c\" lt)\n    (versionTest \"2.3pre1\" \"2.3q\" lt)\n  ];\n\nin (import ./lib.nix).and tests\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-with.exp",
    "content": "\"xyzzybarxyzzybar\"\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-with.nix",
    "content": "let {\n\n  a = \"xyzzy\";\n\n  as = {\n    a = \"foo\";\n    b = \"bar\";\n  };\n\n  bs = {\n    a = \"bar\";\n  };\n\n  x = with as; a + b;\n\n  y = with as; with bs; a + b;\n\n  body = x + y;\n}\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-xml.exp.xml",
    "content": "<?xml version='1.0' encoding='utf-8'?>\n<expr>\n  <attrs>\n    <attr name=\"a\">\n      <string value=\"foo\" />\n    </attr>\n    <attr name=\"at\">\n      <function>\n        <attrspat name=\"args\">\n          <attr name=\"x\" />\n          <attr name=\"y\" />\n          <attr name=\"z\" />\n        </attrspat>\n      </function>\n    </attr>\n    <attr name=\"b\">\n      <string value=\"bar\" />\n    </attr>\n    <attr name=\"c\">\n      <string value=\"foobar\" />\n    </attr>\n    <attr name=\"ellipsis\">\n      <function>\n        <attrspat ellipsis=\"1\">\n          <attr name=\"x\" />\n          <attr name=\"y\" />\n          <attr name=\"z\" />\n        </attrspat>\n      </function>\n    </attr>\n    <attr name=\"f\">\n      <function>\n        <attrspat>\n          <attr name=\"z\" />\n          <attr name=\"x\" />\n          <attr name=\"y\" />\n        </attrspat>\n      </function>\n    </attr>\n    <attr name=\"id\">\n      <function>\n        <varpat name=\"x\" />\n      </function>\n    </attr>\n    <attr name=\"x\">\n      <int value=\"123\" />\n    </attr>\n    <attr name=\"y\">\n      <float value=\"567.89\" />\n    </attr>\n  </attrs>\n</expr>\n"
  },
  {
    "path": "data/nix/tests/lang/eval-okay-xml.nix",
    "content": "rec {\n\n  x = 123;\n\n  y = 567.890;\n\n  a = \"foo\";\n\n  b = \"bar\";\n\n  c = \"foo\" + \"bar\";\n\n  f = {z, x, y}: if y then x else z;\n\n  id = x: x;\n\n  at = args@{x, y, z}: x;\n\n  ellipsis = {x, y, z, ...}: x;\n\n}\n"
  },
  {
    "path": "data/nix/tests/lang/imported.nix",
    "content": "# The function ‘range’ comes from lib.nix and was added to the lexical\n# scope by scopedImport.\nrange 1 5 ++ import ./imported2.nix\n"
  },
  {
    "path": "data/nix/tests/lang/imported2.nix",
    "content": "range 6 10\n"
  },
  {
    "path": "data/nix/tests/lang/lib.nix",
    "content": "with builtins;\n\nrec {\n\n  fold = op: nul: list:\n    if list == []\n    then nul\n    else op (head list) (fold op nul (tail list));\n\n  concat =\n    fold (x: y: x + y) \"\";\n\n  and = fold (x: y: x && y) true;\n\n  flatten = x:\n    if isList x\n    then fold (x: y: (flatten x) ++ y) [] x\n    else [x];\n\n  sum = foldl' (x: y: add x y) 0;\n\n  hasSuffix = ext: fileName:\n    let lenFileName = stringLength fileName;\n        lenExt = stringLength ext;\n    in !(lessThan lenFileName lenExt) &&\n       substring (sub lenFileName lenExt) lenFileName fileName == ext;\n\n  # Split a list at the given position.\n  splitAt = pos: list:\n    if pos == 0 then {first = []; second = list;} else\n    if list == [] then {first = []; second = [];} else\n    let res = splitAt (sub pos 1) (tail list);\n    in {first = [(head list)] ++ res.first; second = res.second;};\n\n  # Stable merge sort.\n  sortBy = comp: list:\n    if lessThan 1 (length list)\n    then\n      let\n        split = splitAt (div (length list) 2) list;\n        first = sortBy comp split.first;\n        second = sortBy comp split.second;\n      in mergeLists comp first second\n    else list;\n\n  mergeLists = comp: list1: list2:\n    if list1 == [] then list2 else\n    if list2 == [] then list1 else\n    if comp (head list2) (head list1) then [(head list2)] ++ mergeLists comp list1 (tail list2) else\n    [(head list1)] ++ mergeLists comp (tail list1) list2;\n\n  id = x: x;\n\n  const = x: y: x;\n\n  range = first: last:\n    if first > last\n      then []\n      else genList (n: first + n) (last - first + 1);\n\n}\n"
  },
  {
    "path": "data/nix/tests/lang/parse-fail-dup-attrs-1.nix",
    "content": "{ x = 123;\n  y = 456;\n  x = 789;\n}\n"
  },
  {
    "path": "data/nix/tests/lang/parse-fail-dup-attrs-2.nix",
    "content": "let {\n\n  as = {\n    x = 123;\n    y = 456;\n  };\n\n  bs = {\n    x = 789;\n    inherit (as) x;\n  };\n  \n}\n"
  },
  {
    "path": "data/nix/tests/lang/parse-fail-dup-attrs-3.nix",
    "content": "let {\n\n  as = {\n    x = 123;\n    y = 456;\n  };\n\n  bs = rec {\n    x = 789;\n    inherit (as) x;\n  };\n  \n}\n"
  },
  {
    "path": "data/nix/tests/lang/parse-fail-dup-attrs-4.nix",
    "content": "{\n  services.ssh.port = 22;\n  services.ssh.port = 23;\n}\n"
  },
  {
    "path": "data/nix/tests/lang/parse-fail-dup-attrs-7.nix",
    "content": "rec {\n\n  x = 1;\n\n  as = {\n    inherit x;\n    inherit x;\n  };\n}"
  },
  {
    "path": "data/nix/tests/lang/parse-fail-dup-formals.nix",
    "content": "{x, y, x}: x"
  },
  {
    "path": "data/nix/tests/lang/parse-fail-mixed-nested-attrs1.nix",
    "content": "{ \n  x.z = 3; \n  x = { y = 3; z = 3; }; \n}\n"
  },
  {
    "path": "data/nix/tests/lang/parse-fail-mixed-nested-attrs2.nix",
    "content": "{ \n  x.y.y = 3; \n  x = { y.y= 3; z = 3; }; \n}\n"
  },
  {
    "path": "data/nix/tests/lang/parse-fail-patterns-1.nix",
    "content": "args@{args, x, y, z}: x\n"
  },
  {
    "path": "data/nix/tests/lang/parse-fail-regression-20060610.nix",
    "content": "let {\n  x =\n    {gcc}:\n    {\n      inherit gcc;\n    };\n\n  body = ({\n    inherit gcc;\n  }).gcc;\n}\n"
  },
  {
    "path": "data/nix/tests/lang/parse-fail-uft8.nix",
    "content": "123 é 4\n"
  },
  {
    "path": "data/nix/tests/lang/parse-fail-undef-var-2.nix",
    "content": "let {\n\n  f = {x, y : [\"baz\" \"bar\" z \"bat\"]}: x + y;\n\n  body = f {x = \"foo\"; y = \"bar\";};\n\n}\n"
  },
  {
    "path": "data/nix/tests/lang/parse-fail-undef-var.nix",
    "content": "x: y\n"
  },
  {
    "path": "data/nix/tests/lang/parse-okay-1.nix",
    "content": "{x, y, z}: x + y + z\n"
  },
  {
    "path": "data/nix/tests/lang/parse-okay-crlf.nix",
    "content": "rec {\n\n  /* Dit is\r\n  een test. */\n\n  x = \n  # Dit is een test.\ry;\n  \n  y = 123;\r\n\n  # CR or CR/LF (but not explicit \\r's) in strings should be\n  # translated to LF.\n  foo = \"multi\rline\r\n  string\n  test\\r\";\n\n  z = 456;\r}\n"
  },
  {
    "path": "data/nix/tests/lang/parse-okay-dup-attrs-5.nix",
    "content": "{\n  services.ssh = { enable = true; };\n  services.ssh.port = 23;\n}\n"
  },
  {
    "path": "data/nix/tests/lang/parse-okay-dup-attrs-6.nix",
    "content": "{\n  services.ssh.port = 23;\n  services.ssh = { enable = true; };\n}\n"
  },
  {
    "path": "data/nix/tests/lang/parse-okay-mixed-nested-attrs-1.nix",
    "content": "{ \n  x = { y = 3; z = 3; }; \n  x.q = 3; \n}\n"
  },
  {
    "path": "data/nix/tests/lang/parse-okay-mixed-nested-attrs-2.nix",
    "content": "{ \n  x.q = 3; \n  x = { y = 3; z = 3; }; \n}\n"
  },
  {
    "path": "data/nix/tests/lang/parse-okay-mixed-nested-attrs-3.nix",
    "content": "{\n    services.ssh.enable = true;\n    services.ssh = { port = 123; };\n    services = {\n        httpd.enable = true;\n    };\n}\n"
  },
  {
    "path": "data/nix/tests/lang/parse-okay-regression-20041027.nix",
    "content": "{stdenv, fetchurl /* pkgconfig, libX11 */ }:\n\nstdenv.mkDerivation {\n  name = \"libXi-6.0.1\";\n  src = fetchurl {\n    url = http://freedesktop.org/~xlibs/release/libXi-6.0.1.tar.bz2;\n    md5 = \"7e935a42428d63a387b3c048be0f2756\";\n  };\n/*  buildInputs = [pkgconfig];\n  propagatedBuildInputs = [libX11]; */\n}\n"
  },
  {
    "path": "data/nix/tests/lang/parse-okay-regression-751.nix",
    "content": "let const = a: \"const\"; in\n''${ const { x = \"q\"; }}''\n"
  },
  {
    "path": "data/nix/tests/lang/parse-okay-subversion.nix",
    "content": "{ localServer ? false\n, httpServer ? false\n, sslSupport ? false\n, pythonBindings ? false\n, javaSwigBindings ? false\n, javahlBindings ? false\n, stdenv, fetchurl\n, openssl ? null, httpd ? null, db4 ? null, expat, swig ? null, j2sdk ? null\n}:\n\nassert expat != null;\nassert localServer -> db4 != null;\nassert httpServer -> httpd != null && httpd.expat == expat;\nassert sslSupport -> openssl != null && (httpServer -> httpd.openssl == openssl);\nassert pythonBindings -> swig != null && swig.pythonSupport;\nassert javaSwigBindings -> swig != null && swig.javaSupport;\nassert javahlBindings -> j2sdk != null;\n\nstdenv.mkDerivation {\n  name = \"subversion-1.1.1\";\n\n  builder = /foo/bar;\n  src = fetchurl {\n    url = http://subversion.tigris.org/tarballs/subversion-1.1.1.tar.bz2;\n    md5 = \"a180c3fe91680389c210c99def54d9e0\";\n  };\n\n  # This is a hopefully temporary fix for the problem that\n  # libsvnjavahl.so isn't linked against libstdc++, which causes\n  # loading the library into the JVM to fail.\n  patches = if javahlBindings then [/javahl.patch] else [];\n\n  openssl = if sslSupport then openssl else null;\n  httpd = if httpServer then httpd else null;\n  db4 = if localServer then db4 else null;\n  swig = if pythonBindings || javaSwigBindings then swig else null;\n  python = if pythonBindings then swig.python else null;\n  j2sdk = if javaSwigBindings then swig.j2sdk else\n          if javahlBindings then j2sdk else null;\n\n  inherit expat localServer httpServer sslSupport\n          pythonBindings javaSwigBindings javahlBindings;\n}\n"
  },
  {
    "path": "data/nix/tests/lang/parse-okay-url.nix",
    "content": "[ x:x\n  https://svn.cs.uu.nl:12443/repos/trace/trunk\n  http://www2.mplayerhq.hu/MPlayer/releases/fonts/font-arial-iso-8859-1.tar.bz2\n  http://losser.st-lab.cs.uu.nl/~armijn/.nix/gcc-3.3.4-static-nix.tar.gz\n  http://fpdownload.macromedia.com/get/shockwave/flash/english/linux/7.0r25/install_flash_player_7_linux.tar.gz\n  https://ftp5.gwdg.de/pub/linux/archlinux/extra/os/x86_64/unzip-6.0-14-x86_64.pkg.tar.zst\n  ftp://ftp.gtk.org/pub/gtk/v1.2/gtk+-1.2.10.tar.gz\n]\n"
  },
  {
    "path": "data/nix/tests/lang/readDir/bar",
    "content": ""
  },
  {
    "path": "data/nix/tests/lang/readDir/foo/git-hates-directories",
    "content": ""
  },
  {
    "path": "data/nixpkgs-all-packages-pretty.nix",
    "content": "{ bootStdenv ? null, config ? null, crossSystem ? null, gccWithCC ? true, gccWithProfiling ? true, noSysDirs ? system != \"x86_64-darwin\" && system != \"x86_64-freebsd\" && system != \"i686-freebsd\" && system != \"x86_64-kfreebsd-gnu\", platform ? null, system ? builtins.currentSystem }:\nlet\n  config_ = config;\n  platform_ = platform;\n  in let\n    lib = import ../../lib;\n    config = let\n      toPath = builtins.toPath;\n      getEnv = x: if builtins ? getEnv\n        then builtins.getEnv x\n        else \"\";\n      pathExists = name:\n      builtins ? pathExists && builtins.pathExists (toPath name);\n      configFile = getEnv \"NIXPKGS_CONFIG\";\n      homeDir = getEnv \"HOME\";\n      configFile2 = homeDir + \"/.nixpkgs/config.nix\";\n      configExpr = if config_ != null\n        then config_\n        else if configFile != \"\" && pathExists configFile\n          then import (toPath configFile)\n          else if homeDir != \"\" && pathExists configFile2\n            then import (toPath configFile2)\n            else { };\n      in if builtins.isFunction configExpr\n        then configExpr {\n          inherit pkgs;\n        }\n        else configExpr;\n    platformAuto = let\n      platforms = import ./platforms.nix;\n      in if system == \"armv6l-linux\"\n        then platforms.raspberrypi\n        else if system == \"armv5tel-linux\"\n          then platforms.sheevaplug\n          else if system == \"mips64el-linux\"\n            then platforms.fuloong2f_n32\n            else if system == \"x86_64-linux\"\n              then platforms.pc64\n              else if system == \"i686-linux\"\n                then platforms.pc32\n                else platforms.pcBase;\n    platform = if platform_ != null\n      then platform_\n      else config.platform or platformAuto;\n    helperFunctions = stdenvAdapters // import ../build-support/trivial-builders.nix {\n      inherit (pkgs) stdenv;\n      inherit (pkgs.xorg) lndir;\n    };\n    stdenvAdapters = import ../stdenv/adapters.nix pkgs;\n    pkgs = applyGlobalOverrides (config.packageOverrides or pkgs:\n    { });\n    applyGlobalOverrides = overrider:\n    let\n      overrides = overrider pkgsOrig // lib.optionalAttrs (pkgsOrig.stdenv ? overrides && crossSystem == null) (pkgsOrig.stdenv.overrides pkgsOrig);\n      pkgsOrig = pkgsFun pkgs { };\n      pkgs = pkgsFun pkgs overrides;\n      in pkgs;\n    pkgsFun = pkgs: overrides:\n    with helperFunctions; let\n      defaultScope = pkgs // pkgs.xorg;\n      self = self_ // overrides;\n      self_ = with self; helperFunctions // {\n        inherit system platform;\n        inherit pkgs;\n        callPackage = newScope { };\n        newScope = extra:\n        lib.callPackageWith (defaultScope // extra);\n        forceSystem = system: kernel:\n        import ./all-packages.nix {\n          inherit system;\n          platform = platform // {\n            kernelArch = kernel;\n          };\n          inherit bootStdenv noSysDirs\n          gccWithCC gccWithProfiling\n          config crossSystem;\n        };\n        pkgsi686Linux = forceSystem \"i686-linux\" \"i386\";\n        callPackage_i686 = lib.callPackageWith (pkgsi686Linux // pkgsi686Linux.xorg);\n        path = ../..;\n        x11 = xlibsWrapper;\n        xlibs = xorg // {\n          xlibs = xlibsWrapper;\n        };\n        inherit lib config\n        stdenvAdapters;\n        inherit (lib) lowPrio hiPrio\n        appendToName makeOverridable;\n        inherit (misc) versionedDerivation;\n        recurseIntoAttrs = attrs:\n        attrs // {\n          recurseForDerivations = true;\n        };\n        builderDefs = lib.composedArgsAndFun (import ../build-support/builder-defs/builder-defs.nix) {\n          inherit stringsWithDeps lib\n          stdenv writeScript fetchurl\n          fetchmtn fetchgit;\n        };\n        builderDefsPackage = builderDefs.builderDefsPackage builderDefs;\n        stringsWithDeps = lib.stringsWithDeps;\n        nix-generate-from-cpan = callPackage ../../maintainers/scripts/nix-generate-from-cpan.nix {\n        };\n        nixpkgs-lint = callPackage ../../maintainers/scripts/nixpkgs-lint.nix {\n        };\n        allStdenvs = import ../stdenv {\n          inherit system platform config;\n          allPackages = args:\n          import ./all-packages.nix ({\n            inherit config system;\n          } // args);\n        };\n        defaultStdenv = allStdenvs.stdenv // {\n          inherit platform;\n        };\n        stdenvCross = lowPrio (makeStdenvCross defaultStdenv crossSystem binutilsCross gccCrossStageFinal);\n        stdenv = if bootStdenv != null\n          then bootStdenv // {\n            inherit platform;\n          }\n          else if crossSystem != null\n            then stdenvCross\n            else let\n              changer = config.replaceStdenv or null;\n              in if changer != null\n                then changer {\n                  pkgs = import ./all-packages.nix {\n                    config = removeAttrs config [\n                      \"replaceStdenv\"\n                    ];\n                  };\n                }\n                else defaultStdenv;\n        stdenvApple = stdenvAdapters.overrideGCC allStdenvs.stdenvNative gccApple;\n        forceNativeDrv = drv:\n        if crossSystem == null\n          then drv\n          else drv // {\n            crossDrv = drv.nativeDrv;\n          };\n        stdenv_32bit = lowPrio (if system == \"x86_64-linux\"\n          then overrideGCC stdenv gcc48_multi\n          else stdenv);\n        attrSetToDir = arg:\n        import ../build-support/upstream-updater/attrset-to-dir.nix {\n          inherit writeTextFile stdenv\n          lib;\n          theAttrSet = arg;\n        };\n        autoreconfHook = makeSetupHook {\n          substitutions = {\n            inherit autoconf automake\n            libtool;\n          };\n        } ../build-support/setup-hooks/autoreconf.sh;\n        buildEnv = import ../build-support/buildenv {\n          inherit (pkgs) runCommand perl;\n        };\n        buildFHSChrootEnv = import ../build-support/build-fhs-chrootenv {\n          inherit stdenv glibc\n          glibcLocales gcc coreutils\n          diffutils findutils;\n          inherit gnused gnugrep gnutar\n          gzip bzip2 bashInteractive xz\n          shadow gawk;\n          inherit less buildEnv;\n        };\n        dotnetenv = import ../build-support/dotnetenv {\n          inherit stdenv;\n          dotnetfx = dotnetfx40;\n        };\n        scatterOutputHook = makeSetupHook {\n        } ../build-support/setup-hooks/scatter_output.sh;\n        vsenv = callPackage ../build-support/vsenv {\n          vs = vs90wrapper;\n        };\n        fetchbower = import ../build-support/fetchbower {\n          inherit stdenv git;\n          inherit (nodePackages) fetch-bower;\n        };\n        fetchbzr = import ../build-support/fetchbzr {\n          inherit stdenv bazaar;\n        };\n        fetchcvs = import ../build-support/fetchcvs {\n          inherit stdenv cvs;\n        };\n        fetchdarcs = import ../build-support/fetchdarcs {\n          inherit stdenv darcs nix;\n        };\n        fetchgit = import ../build-support/fetchgit {\n          inherit stdenv git cacert;\n        };\n        fetchgitPrivate = import ../build-support/fetchgit/private.nix {\n          inherit fetchgit writeScript\n          openssh stdenv;\n        };\n        fetchgitrevision = import ../build-support/fetchgitrevision runCommand git;\n        fetchmtn = callPackage ../build-support/fetchmtn (config.fetchmtn or {\n        });\n        packer = callPackage ../development/tools/packer {\n        };\n        fetchpatch = callPackage ../build-support/fetchpatch {\n        };\n        fetchsvn = import ../build-support/fetchsvn {\n          inherit stdenv subversion\n          openssh;\n          sshSupport = true;\n        };\n        fetchsvnrevision = import ../build-support/fetchsvnrevision runCommand subversion;\n        fetchsvnssh = import ../build-support/fetchsvnssh {\n          inherit stdenv subversion\n          openssh expect;\n          sshSupport = true;\n        };\n        fetchhg = import ../build-support/fetchhg {\n          inherit stdenv mercurial nix;\n        };\n        fetchurl = import ../build-support/fetchurl {\n          inherit curl stdenv;\n        };\n        fetchurlGnome = callPackage ../build-support/fetchurl/gnome.nix {\n        };\n        fetchurlBoot = stdenv.fetchurlBoot;\n        fetchzip = import ../build-support/fetchzip {\n          inherit lib fetchurl unzip;\n        };\n        fetchFromGitHub = { owner, repo, rev, sha256 }:\n        fetchzip {\n          name = \"${repo}-${rev}-src\";\n          url = \"https://github.com/${owner}/${repo}/archive/${rev}.tar.gz\";\n          inherit sha256;\n        };\n        resolveMirrorURLs = { url }:\n        fetchurl {\n          showURLs = true;\n          inherit url;\n        };\n        libredirect = callPackage ../build-support/libredirect {\n        };\n        makeDesktopItem = import ../build-support/make-desktopitem {\n          inherit stdenv;\n        };\n        makeAutostartItem = import ../build-support/make-startupitem {\n          inherit stdenv;\n          inherit lib;\n        };\n        makeInitrd = { compressor ? \"gzip -9\", contents }:\n        import ../build-support/kernel/make-initrd.nix {\n          inherit stdenv perl\n          perlArchiveCpio cpio contents\n          ubootChooser compressor;\n        };\n        makeWrapper = makeSetupHook {\n        } ../build-support/setup-hooks/make-wrapper.sh;\n        makeModulesClosure = { allowMissing ? false, kernel, rootModules }:\n        import ../build-support/kernel/modules-closure.nix {\n          inherit stdenv kmod kernel\n          nukeReferences rootModules\n          allowMissing;\n        };\n        pathsFromGraph = ../build-support/kernel/paths-from-graph.pl;\n        srcOnly = args:\n        import ../build-support/src-only ({\n          inherit stdenv;\n        } // args);\n        substituteAll = import ../build-support/substitute/substitute-all.nix {\n          inherit stdenv;\n        };\n        replaceDependency = import ../build-support/replace-dependency.nix {\n          inherit runCommand nix lib;\n        };\n        nukeReferences = callPackage ../build-support/nuke-references/default.nix {\n        };\n        vmTools = import ../build-support/vm/default.nix {\n          inherit pkgs;\n        };\n        releaseTools = import ../build-support/release/default.nix {\n          inherit pkgs;\n        };\n        composableDerivation = import ../../lib/composable-derivation.nix {\n          inherit pkgs lib;\n        };\n        platforms = import ./platforms.nix;\n        setJavaClassPath = makeSetupHook {\n        } ../build-support/setup-hooks/set-java-classpath.sh;\n        fixDarwinDylibNames = makeSetupHook {\n        } ../build-support/setup-hooks/fix-darwin-dylib-names.sh;\n        keepBuildTree = makeSetupHook {\n        } ../build-support/setup-hooks/keep-build-tree.sh;\n        enableGCOVInstrumentation = makeSetupHook {\n        } ../build-support/setup-hooks/enable-coverage-instrumentation.sh;\n        makeGCOVReport = makeSetupHook {\n          deps = [\n            pkgs.lcov\n            pkgs.enableGCOVInstrumentation\n          ];\n        } ../build-support/setup-hooks/make-coverage-analysis-report.sh;\n        abduco = callPackage ../tools/misc/abduco {\n        };\n        acct = callPackage ../tools/system/acct {\n        };\n        acoustidFingerprinter = callPackage ../tools/audio/acoustid-fingerprinter {\n          ffmpeg = ffmpeg_1;\n        };\n        actdiag = pythonPackages.actdiag;\n        adom = callPackage ../games/adom {\n        };\n        aefs = callPackage ../tools/filesystems/aefs {\n        };\n        aegisub = callPackage ../applications/video/aegisub {\n          wxGTK = wxGTK30;\n          lua = lua5_1;\n        };\n        aespipe = callPackage ../tools/security/aespipe {\n        };\n        aescrypt = callPackage ../tools/misc/aescrypt {\n        };\n        ahcpd = callPackage ../tools/networking/ahcpd {\n        };\n        aircrackng = callPackage ../tools/networking/aircrack-ng {\n        };\n        analog = callPackage ../tools/admin/analog {\n        };\n        apktool = callPackage ../development/tools/apktool {\n          buildTools = androidenv.buildTools;\n        };\n        apt-offline = callPackage ../tools/misc/apt-offline {\n        };\n        archivemount = callPackage ../tools/filesystems/archivemount {\n        };\n        arandr = callPackage ../tools/X11/arandr {\n        };\n        arcanist = callPackage ../development/tools/misc/arcanist {\n        };\n        arduino_core = callPackage ../development/arduino/arduino-core {\n          jdk = jdk;\n          jre = jdk;\n        };\n        argyllcms = callPackage ../tools/graphics/argyllcms {\n        };\n        arp-scan = callPackage ../tools/misc/arp-scan {\n        };\n        ascii = callPackage ../tools/text/ascii {\n        };\n        asymptote = builderDefsPackage ../tools/graphics/asymptote {\n          inherit freeglut ghostscriptX\n          imagemagick fftw boehmgc mesa\n          ncurses readline gsl libsigsegv\n          python zlib perl texinfo xz;\n          texLive = texLiveAggregationFun {\n            paths = [\n              texLive\n              texLiveExtra\n              texLiveCMSuper\n            ];\n          };\n        };\n        awscli = callPackage ../tools/admin/awscli {\n        };\n        ec2_api_tools = callPackage ../tools/virtualization/ec2-api-tools {\n        };\n        ec2_ami_tools = callPackage ../tools/virtualization/ec2-ami-tools {\n        };\n        altermime = callPackage ../tools/networking/altermime {\n        };\n        amule = callPackage ../tools/networking/p2p/amule {\n        };\n        amuleDaemon = appendToName \"daemon\" (amule.override {\n          monolithic = false;\n          daemon = true;\n        });\n        amuleGui = appendToName \"gui\" (amule.override {\n          monolithic = false;\n          client = true;\n        });\n        androidenv = import ../development/mobile/androidenv {\n          inherit pkgs;\n          pkgs_i686 = pkgsi686Linux;\n        };\n        apg = callPackage ../tools/security/apg {\n        };\n        grc = callPackage ../tools/misc/grc {\n        };\n        otool = callPackage ../os-specific/darwin/otool {\n        };\n        pass = callPackage ../tools/security/pass {\n          gnupg = gnupg1compat;\n        };\n        setfile = callPackage ../os-specific/darwin/setfile {\n        };\n        install_name_tool = callPackage ../os-specific/darwin/install_name_tool {\n        };\n        xcodeenv = callPackage ../development/mobile/xcodeenv {\n        };\n        titaniumenv = callPackage ../development/mobile/titaniumenv {\n          inherit pkgs;\n          pkgs_i686 = pkgsi686Linux;\n        };\n        inherit (androidenv) androidsdk_4_1;\n        aria2 = callPackage ../tools/networking/aria2 {\n        };\n        aria = aria2;\n        at = callPackage ../tools/system/at {\n        };\n        atftp = callPackage ../tools/networking/atftp {\n        };\n        autogen = callPackage ../development/tools/misc/autogen {\n        };\n        autojump = callPackage ../tools/misc/autojump {\n        };\n        autorandr = callPackage ../tools/misc/autorandr {\n          inherit (xorg) xrandr xdpyinfo;\n        };\n        avahi = callPackage ../development/libraries/avahi {\n          qt4Support = config.avahi.qt4Support or false;\n        };\n        aws = callPackage ../tools/virtualization/aws {\n        };\n        aws_mturk_clt = callPackage ../tools/misc/aws-mturk-clt {\n        };\n        axel = callPackage ../tools/networking/axel {\n        };\n        azureus = callPackage ../tools/networking/p2p/azureus {\n        };\n        basex = callPackage ../tools/text/xml/basex {\n        };\n        babeld = callPackage ../tools/networking/babeld {\n        };\n        badvpn = callPackage ../tools/networking/badvpn {\n        };\n        banner = callPackage ../games/banner {\n        };\n        barcode = callPackage ../tools/graphics/barcode {\n        };\n        bc = callPackage ../tools/misc/bc {\n        };\n        bcache-tools = callPackage ../tools/filesystems/bcache-tools {\n        };\n        bchunk = callPackage ../tools/cd-dvd/bchunk {\n        };\n        bfr = callPackage ../tools/misc/bfr {\n        };\n        bindfs = callPackage ../tools/filesystems/bindfs {\n        };\n        bitbucket-cli = pythonPackages.bitbucket-cli;\n        blockdiag = pythonPackages.blockdiag;\n        bmon = callPackage ../tools/misc/bmon {\n        };\n        bochs = callPackage ../applications/virtualization/bochs {\n          wxSupport = false;\n        };\n        boomerang = callPackage ../development/tools/boomerang {\n        };\n        bootchart = callPackage ../tools/system/bootchart {\n        };\n        bro = callPackage ../applications/networking/ids/bro {\n        };\n        bsod = callPackage ../misc/emulators/bsod {\n        };\n        btrfsProgs = callPackage ../tools/filesystems/btrfsprogs {\n        };\n        bwm_ng = callPackage ../tools/networking/bwm-ng {\n        };\n        byobu = callPackage ../tools/misc/byobu {\n        };\n        capstone = callPackage ../development/libraries/capstone {\n        };\n        catdoc = callPackage ../tools/text/catdoc {\n        };\n        ccnet = callPackage ../tools/networking/ccnet {\n        };\n        consul = callPackage ../servers/consul {\n        };\n        consul_ui = callPackage ../servers/consul/ui.nix {\n        };\n        chntpw = callPackage ../tools/security/chntpw {\n        };\n        coprthr = callPackage ../development/libraries/coprthr {\n          flex = flex_2_5_35;\n        };\n        crawl = callPackage ../games/crawl {\n          lua = lua5;\n        };\n        cv = callPackage ../tools/misc/cv {\n        };\n        direnv = callPackage ../tools/misc/direnv {\n        };\n        ditaa = callPackage ../tools/graphics/ditaa {\n        };\n        dlx = callPackage ../misc/emulators/dlx {\n        };\n        eggdrop = callPackage ../tools/networking/eggdrop {\n        };\n        enca = callPackage ../tools/text/enca {\n        };\n        fasd = callPackage ../tools/misc/fasd {\n          inherit (haskellPackages) pandoc;\n        };\n        fop = callPackage ../tools/typesetting/fop {\n        };\n        mcrl = callPackage ../tools/misc/mcrl {\n        };\n        mcrl2 = callPackage ../tools/misc/mcrl2 {\n        };\n        mpdcron = callPackage ../tools/audio/mpdcron {\n        };\n        syslogng = callPackage ../tools/system/syslog-ng {\n        };\n        syslogng_incubator = callPackage ../tools/system/syslog-ng-incubator {\n        };\n        rsyslog = callPackage ../tools/system/rsyslog {\n        };\n        mcrypt = callPackage ../tools/misc/mcrypt {\n        };\n        mcelog = callPackage ../os-specific/linux/mcelog {\n        };\n        apparix = callPackage ../tools/misc/apparix {\n        };\n        appdata-tools = callPackage ../tools/misc/appdata-tools {\n        };\n        asciidoc = callPackage ../tools/typesetting/asciidoc {\n          inherit (pythonPackages) matplotlib\n          numpy aafigure\n          recursivePthLoader;\n          enableStandardFeatures = false;\n        };\n        asciidoc-full = appendToName \"full\" (asciidoc.override {\n          inherit (pythonPackages) pygments;\n          enableStandardFeatures = true;\n        });\n        autossh = callPackage ../tools/networking/autossh {\n        };\n        bacula = callPackage ../tools/backup/bacula {\n        };\n        beanstalkd = callPackage ../servers/beanstalkd {\n        };\n        bgs = callPackage ../tools/X11/bgs {\n        };\n        biber = callPackage ../tools/typesetting/biber {\n          inherit (perlPackages) autovivification\n          BusinessISBN BusinessISMN\n          BusinessISSN ConfigAutoConf\n          DataCompare DataDump DateSimple\n          EncodeEUCJPASCII EncodeHanExtra\n          EncodeJIS2K ExtUtilsLibBuilder\n          FileSlurp IPCRun3 Log4Perl\n          LWPProtocolHttps ListAllUtils\n          ListMoreUtils ModuleBuild\n          MozillaCA ReadonlyXS\n          RegexpCommon TextBibTeX\n          UnicodeCollate UnicodeLineBreak\n          URI XMLLibXMLSimple XMLLibXSLT\n          XMLWriter;\n        };\n        bibtextools = callPackage ../tools/typesetting/bibtex-tools {\n          inherit (strategoPackages016) strategoxt\n          sdf;\n        };\n        bittorrent = callPackage ../tools/networking/p2p/bittorrent {\n          gui = true;\n        };\n        bittornado = callPackage ../tools/networking/p2p/bit-tornado {\n        };\n        blueman = callPackage ../tools/bluetooth/blueman {\n          inherit (pythonPackages) notify;\n        };\n        bmrsa = builderDefsPackage (import ../tools/security/bmrsa/11.nix) {\n          inherit unzip;\n        };\n        bogofilter = callPackage ../tools/misc/bogofilter {\n        };\n        bsdiff = callPackage ../tools/compression/bsdiff {\n        };\n        btar = callPackage ../tools/backup/btar {\n        };\n        bud = callPackage ../tools/networking/bud {\n          inherit (pythonPackages) gyp;\n        };\n        bup = callPackage ../tools/backup/bup {\n          inherit (pythonPackages) pyxattr\n          pylibacl setuptools fuse;\n          inherit (haskellPackages) pandoc;\n          par2Support = config.bup.par2Support or false;\n        };\n        ori = callPackage ../tools/backup/ori {\n        };\n        atool = callPackage ../tools/archivers/atool {\n        };\n        bzip2 = callPackage ../tools/compression/bzip2 {\n        };\n        cabextract = callPackage ../tools/archivers/cabextract {\n        };\n        cadaver = callPackage ../tools/networking/cadaver {\n        };\n        cantata = callPackage ../applications/audio/cantata {\n        };\n        can-utils = callPackage ../os-specific/linux/can-utils {\n        };\n        ccid = callPackage ../tools/security/ccid {\n        };\n        ccrypt = callPackage ../tools/security/ccrypt {\n        };\n        cdecl = callPackage ../development/tools/cdecl {\n        };\n        cdrdao = callPackage ../tools/cd-dvd/cdrdao {\n        };\n        cdrkit = callPackage ../tools/cd-dvd/cdrkit {\n        };\n        ceph = callPackage ../tools/filesystems/ceph {\n        };\n        cfdg = builderDefsPackage ../tools/graphics/cfdg {\n          inherit libpng bison flex\n          ffmpeg;\n        };\n        checkinstall = callPackage ../tools/package-management/checkinstall {\n        };\n        cheetahTemplate = builderDefsPackage (import ../tools/text/cheetah-template/2.0.1.nix) {\n          inherit makeWrapper python;\n        };\n        chkrootkit = callPackage ../tools/security/chkrootkit {\n        };\n        chrony = callPackage ../tools/networking/chrony {\n        };\n        chunkfs = callPackage ../tools/filesystems/chunkfs {\n        };\n        chunksync = callPackage ../tools/backup/chunksync {\n        };\n        cjdns = callPackage ../tools/networking/cjdns {\n        };\n        cksfv = callPackage ../tools/networking/cksfv {\n        };\n        clementine = callPackage ../applications/audio/clementine {\n        };\n        ciopfs = callPackage ../tools/filesystems/ciopfs {\n        };\n        colord = callPackage ../tools/misc/colord {\n        };\n        colord-gtk = callPackage ../tools/misc/colord-gtk {\n        };\n        colordiff = callPackage ../tools/text/colordiff {\n        };\n        concurrencykit = callPackage ../development/libraries/concurrencykit {\n        };\n        connect = callPackage ../tools/networking/connect {\n        };\n        conspy = callPackage ../os-specific/linux/conspy {\n        };\n        connman = callPackage ../tools/networking/connman {\n        };\n        connmanui = callPackage ../tools/networking/connmanui {\n        };\n        convertlit = callPackage ../tools/text/convertlit {\n        };\n        collectd = callPackage ../tools/system/collectd {\n        };\n        colormake = callPackage ../development/tools/build-managers/colormake {\n        };\n        cowsay = callPackage ../tools/misc/cowsay {\n        };\n        cpuminer = callPackage ../tools/misc/cpuminer {\n        };\n        cuetools = callPackage ../tools/cd-dvd/cuetools {\n        };\n        unifdef = callPackage ../development/tools/misc/unifdef {\n        };\n        \"unionfs-fuse\" = callPackage ../tools/filesystems/unionfs-fuse {\n        };\n        usb_modeswitch = callPackage ../development/tools/misc/usb-modeswitch {\n        };\n        biosdevname = callPackage ../tools/networking/biosdevname {\n        };\n        clamav = callPackage ../tools/security/clamav {\n        };\n        cloc = callPackage ../tools/misc/cloc {\n          inherit (perlPackages) perl\n          AlgorithmDiff RegexpCommon;\n        };\n        cloog = callPackage ../development/libraries/cloog {\n        };\n        cloogppl = callPackage ../development/libraries/cloog-ppl {\n        };\n        convmv = callPackage ../tools/misc/convmv {\n        };\n        cool-old-term = callPackage ../applications/misc/cool-old-term {\n        };\n        coreutils = callPackage ../tools/misc/coreutils {\n          aclSupport = crossSystem == null && stdenv.isLinux;\n        };\n        cpio = callPackage ../tools/archivers/cpio {\n        };\n        cromfs = callPackage ../tools/archivers/cromfs {\n        };\n        cron = callPackage ../tools/system/cron {\n        };\n        cudatoolkit5 = callPackage ../development/compilers/cudatoolkit/5.5.nix {\n          python = python26;\n        };\n        cudatoolkit6 = callPackage ../development/compilers/cudatoolkit/6.0.nix {\n          python = python26;\n        };\n        cudatoolkit = cudatoolkit5;\n        curl = callPackage ../tools/networking/curl rec {\n          fetchurl = fetchurlBoot;\n          zlibSupport = true;\n          sslSupport = zlibSupport;\n          scpSupport = zlibSupport && !stdenv.isSunOS && !stdenv.isCygwin;\n        };\n        curl3 = callPackage ../tools/networking/curl/7.15.nix rec {\n          zlibSupport = true;\n          sslSupport = zlibSupport;\n        };\n        cunit = callPackage ../tools/misc/cunit {\n        };\n        curlftpfs = callPackage ../tools/filesystems/curlftpfs {\n        };\n        cutter = callPackage ../tools/networking/cutter {\n        };\n        dadadodo = builderDefsPackage (import ../tools/text/dadadodo) {\n        };\n        daq = callPackage ../applications/networking/ids/daq {\n        };\n        dar = callPackage ../tools/archivers/dar {\n        };\n        davfs2 = callPackage ../tools/filesystems/davfs2 {\n        };\n        dbench = callPackage ../development/tools/misc/dbench {\n        };\n        dcraw = callPackage ../tools/graphics/dcraw {\n        };\n        debian_devscripts = callPackage ../tools/misc/debian-devscripts {\n          inherit (perlPackages) CryptSSLeay\n          LWP TimeDate DBFile\n          FileDesktopEntry;\n        };\n        debootstrap = callPackage ../tools/misc/debootstrap {\n        };\n        detox = callPackage ../tools/misc/detox {\n        };\n        ddclient = callPackage ../tools/networking/ddclient {\n        };\n        dd_rescue = callPackage ../tools/system/dd_rescue {\n        };\n        ddrescue = callPackage ../tools/system/ddrescue {\n        };\n        deluge = pythonPackages.deluge;\n        desktop_file_utils = callPackage ../tools/misc/desktop-file-utils {\n        };\n        despotify = callPackage ../development/libraries/despotify {\n        };\n        dev86 = callPackage ../development/compilers/dev86 {\n        };\n        dnsmasq = callPackage ../tools/networking/dnsmasq {\n        };\n        dnstop = callPackage ../tools/networking/dnstop {\n        };\n        dhcp = callPackage ../tools/networking/dhcp {\n        };\n        dhcpcd = callPackage ../tools/networking/dhcpcd {\n        };\n        diffstat = callPackage ../tools/text/diffstat {\n        };\n        diffutils = callPackage ../tools/text/diffutils {\n        };\n        wgetpaste = callPackage ../tools/text/wgetpaste {\n        };\n        dirmngr = callPackage ../tools/security/dirmngr {\n        };\n        disper = callPackage ../tools/misc/disper {\n        };\n        dmd = callPackage ../development/compilers/dmd {\n        };\n        dmg2img = callPackage ../tools/misc/dmg2img {\n        };\n        docbook2odf = callPackage ../tools/typesetting/docbook2odf {\n          inherit (perlPackages) PerlMagick;\n        };\n        docbook2x = callPackage ../tools/typesetting/docbook2x {\n          inherit (perlPackages) XMLSAX\n          XMLParser XMLNamespaceSupport;\n        };\n        dosfstools = callPackage ../tools/filesystems/dosfstools {\n        };\n        dotnetfx35 = callPackage ../development/libraries/dotnetfx35 {\n        };\n        dotnetfx40 = callPackage ../development/libraries/dotnetfx40 {\n        };\n        dropbear = callPackage ../tools/networking/dropbear {\n        };\n        dtach = callPackage ../tools/misc/dtach {\n        };\n        duo-unix = callPackage ../tools/security/duo-unix {\n        };\n        duplicity = callPackage ../tools/backup/duplicity {\n          inherit (pythonPackages) boto\n          lockfile;\n          gnupg = gnupg1;\n        };\n        duply = callPackage ../tools/backup/duply {\n        };\n        dvdplusrwtools = callPackage ../tools/cd-dvd/dvd+rw-tools {\n        };\n        dvgrab = callPackage ../tools/video/dvgrab {\n        };\n        dvtm = callPackage ../tools/misc/dvtm {\n        };\n        e2fsprogs = callPackage ../tools/filesystems/e2fsprogs {\n        };\n        easyrsa = callPackage ../tools/networking/easyrsa {\n        };\n        ebook_tools = callPackage ../tools/text/ebook-tools {\n        };\n        ecryptfs = callPackage ../tools/security/ecryptfs {\n        };\n        editres = callPackage ../tools/graphics/editres {\n          inherit (xlibs) libXt libXaw;\n          inherit (xorg) utilmacros;\n        };\n        edk2 = callPackage ../development/compilers/edk2 {\n        };\n        efibootmgr = callPackage ../tools/system/efibootmgr {\n        };\n        efivar = callPackage ../tools/system/efivar {\n        };\n        evemu = callPackage ../tools/system/evemu {\n        };\n        elasticsearch = callPackage ../servers/search/elasticsearch {\n        };\n        elasticsearchPlugins = recurseIntoAttrs (callPackage ../servers/search/elasticsearch/plugins.nix {\n        });\n        emv = callPackage ../tools/misc/emv {\n        };\n        enblendenfuse = callPackage ../tools/graphics/enblend-enfuse {\n        };\n        encfs = callPackage ../tools/filesystems/encfs {\n        };\n        enscript = callPackage ../tools/text/enscript {\n        };\n        ethtool = callPackage ../tools/misc/ethtool {\n        };\n        ettercap = callPackage ../applications/networking/sniffers/ettercap {\n        };\n        euca2ools = callPackage ../tools/virtualization/euca2ools {\n          pythonPackages = python26Packages;\n        };\n        evtest = callPackage ../applications/misc/evtest {\n        };\n        exempi = callPackage ../development/libraries/exempi {\n        };\n        execline = callPackage ../tools/misc/execline {\n        };\n        exercism = callPackage ../development/tools/exercism {\n        };\n        exif = callPackage ../tools/graphics/exif {\n        };\n        exiftags = callPackage ../tools/graphics/exiftags {\n        };\n        extundelete = callPackage ../tools/filesystems/extundelete {\n        };\n        expect = callPackage ../tools/misc/expect {\n        };\n        f2fs-tools = callPackage ../tools/filesystems/f2fs-tools {\n        };\n        fabric = pythonPackages.fabric;\n        fail2ban = callPackage ../tools/security/fail2ban {\n          systemd = systemd.override {\n            pythonSupport = true;\n          };\n        };\n        fakeroot = callPackage ../tools/system/fakeroot {\n        };\n        fakechroot = callPackage ../tools/system/fakechroot {\n        };\n        fcitx = callPackage ../tools/inputmethods/fcitx {\n        };\n        fcron = callPackage ../tools/system/fcron {\n        };\n        fdm = callPackage ../tools/networking/fdm {\n        };\n        figlet = callPackage ../tools/misc/figlet {\n        };\n        file = callPackage ../tools/misc/file {\n        };\n        filegive = callPackage ../tools/networking/filegive {\n        };\n        fileschanged = callPackage ../tools/misc/fileschanged {\n        };\n        findutils = callPackage ../tools/misc/findutils {\n        };\n        finger_bsd = callPackage ../tools/networking/bsd-finger {\n        };\n        fio = callPackage ../tools/system/fio {\n        };\n        flashtool = callPackage_i686 ../development/mobile/flashtool {\n          platformTools = androidenv.platformTools;\n        };\n        flpsed = callPackage ../applications/editors/flpsed {\n        };\n        flvstreamer = callPackage ../tools/networking/flvstreamer {\n        };\n        libbsd = callPackage ../development/libraries/libbsd {\n        };\n        lprof = callPackage ../tools/graphics/lprof {\n        };\n        fdk_aac = callPackage ../development/libraries/fdk-aac {\n        };\n        flvtool2 = callPackage ../tools/video/flvtool2 {\n        };\n        fontforge = lowPrio (callPackage ../tools/misc/fontforge {\n        });\n        fontforgeX = callPackage ../tools/misc/fontforge {\n          withX11 = true;\n        };\n        forktty = callPackage ../os-specific/linux/forktty {\n        };\n        fortune = callPackage ../tools/misc/fortune {\n        };\n        fox = callPackage ../development/libraries/fox/default.nix {\n          libpng = libpng12;\n        };\n        fox_1_6 = callPackage ../development/libraries/fox/fox-1.6.nix {\n        };\n        fping = callPackage ../tools/networking/fping {\n        };\n        fprot = callPackage ../tools/security/fprot {\n        };\n        freeipmi = callPackage ../tools/system/freeipmi {\n        };\n        freetalk = callPackage ../applications/networking/instant-messengers/freetalk {\n          guile = guile_1_8;\n        };\n        freetds = callPackage ../development/libraries/freetds {\n        };\n        ftgl = callPackage ../development/libraries/ftgl {\n        };\n        ftgl212 = callPackage ../development/libraries/ftgl/2.1.2.nix {\n        };\n        fuppes = callPackage ../tools/networking/fuppes {\n          ffmpeg = ffmpeg_0_6_90;\n        };\n        fsfs = callPackage ../tools/filesystems/fsfs {\n        };\n        fuse_zip = callPackage ../tools/filesystems/fuse-zip {\n        };\n        fuse_exfat = callPackage ../tools/filesystems/fuse-exfat {\n        };\n        dos2unix = callPackage ../tools/text/dos2unix {\n        };\n        uni2ascii = callPackage ../tools/text/uni2ascii {\n        };\n        g500-control = callPackage ../tools/misc/g500-control {\n        };\n        galculator = callPackage ../applications/misc/galculator {\n          gtk = gtk3;\n        };\n        gawk = callPackage ../tools/text/gawk {\n        };\n        gawkInteractive = appendToName \"interactive\" (gawk.override {\n          readlineSupport = true;\n        });\n        gbdfed = callPackage ../tools/misc/gbdfed {\n          gtk = gtk2;\n        };\n        gdmap = callPackage ../tools/system/gdmap {\n        };\n        genext2fs = callPackage ../tools/filesystems/genext2fs {\n        };\n        gengetopt = callPackage ../development/tools/misc/gengetopt {\n        };\n        getmail = callPackage ../tools/networking/getmail {\n        };\n        getopt = callPackage ../tools/misc/getopt {\n        };\n        gftp = callPackage ../tools/networking/gftp {\n        };\n        gifsicle = callPackage ../tools/graphics/gifsicle {\n        };\n        glusterfs = callPackage ../tools/filesystems/glusterfs {\n        };\n        glmark2 = callPackage ../tools/graphics/glmark2 {\n        };\n        glxinfo = callPackage ../tools/graphics/glxinfo {\n        };\n        gmvault = callPackage ../tools/networking/gmvault {\n        };\n        gnokii = builderDefsPackage (import ../tools/misc/gnokii) {\n          inherit intltool perl gettext\n          libusb pkgconfig bluez readline\n          pcsclite libical gtk glib;\n          inherit (xorg) libXpm;\n        };\n        gnufdisk = callPackage ../tools/system/fdisk {\n          guile = guile_1_8;\n        };\n        gnugrep = callPackage ../tools/text/gnugrep {\n          libiconv = libiconvOrNull;\n        };\n        gnulib = callPackage ../development/tools/gnulib {\n        };\n        gnupatch = callPackage ../tools/text/gnupatch {\n        };\n        gnupg1orig = callPackage ../tools/security/gnupg1 {\n        };\n        gnupg1compat = callPackage ../tools/security/gnupg1compat {\n        };\n        gnupg1 = gnupg1compat;\n        gnupg = callPackage ../tools/security/gnupg {\n          libusb = libusb1;\n        };\n        gnupg2_1 = lowPrio (callPackage ../tools/security/gnupg/git.nix {\n          libassuan = libassuan2_1;\n        });\n        gnuplot = callPackage ../tools/graphics/gnuplot {\n        };\n        gnuplot_qt = gnuplot.override {\n          withQt = true;\n        };\n        gnuplot_aquaterm = gnuplot.override {\n          aquaterm = true;\n        };\n        gnused = callPackage ../tools/text/gnused {\n        };\n        gnutar = callPackage ../tools/archivers/gnutar {\n        };\n        gnuvd = callPackage ../tools/misc/gnuvd {\n        };\n        goaccess = callPackage ../tools/misc/goaccess {\n        };\n        googleAuthenticator = callPackage ../os-specific/linux/google-authenticator {\n        };\n        gource = callPackage ../applications/version-management/gource {\n        };\n        gpodder = callPackage ../applications/audio/gpodder {\n        };\n        gptfdisk = callPackage ../tools/system/gptfdisk {\n        };\n        grafana = callPackage ../development/tools/misc/grafana {\n        };\n        grafx2 = callPackage ../applications/graphics/grafx2 {\n        };\n        graphviz = callPackage ../tools/graphics/graphviz {\n        };\n        graphviz_2_0 = callPackage ../tools/graphics/graphviz/2.0.nix {\n        };\n        grive = callPackage ../tools/filesystems/grive {\n          json_c = json-c-0-11;\n        };\n        groff = callPackage ../tools/text/groff {\n          ghostscript = null;\n        };\n        grub = callPackage_i686 ../tools/misc/grub {\n          buggyBiosCDSupport = config.grub.buggyBiosCDSupport or true;\n        };\n        grub2 = callPackage ../tools/misc/grub/2.0x.nix {\n          libusb = libusb1;\n          flex = flex_2_5_35;\n        };\n        grub2_efi = grub2.override {\n          EFIsupport = true;\n        };\n        gssdp = callPackage ../development/libraries/gssdp {\n          inherit (gnome) libsoup;\n        };\n        gt5 = callPackage ../tools/system/gt5 {\n        };\n        gtest = callPackage ../development/libraries/gtest {\n        };\n        gtkdatabox = callPackage ../development/libraries/gtkdatabox {\n        };\n        gtkgnutella = callPackage ../tools/networking/p2p/gtk-gnutella {\n        };\n        gtkvnc = callPackage ../tools/admin/gtk-vnc {\n        };\n        gtmess = callPackage ../applications/networking/instant-messengers/gtmess {\n        };\n        gummiboot = callPackage ../tools/misc/gummiboot {\n        };\n        gupnp = callPackage ../development/libraries/gupnp {\n          inherit (gnome) libsoup;\n        };\n        gupnp_av = callPackage ../development/libraries/gupnp-av {\n        };\n        gupnp_igd = callPackage ../development/libraries/gupnp-igd {\n        };\n        gupnptools = callPackage ../tools/networking/gupnp-tools {\n        };\n        gvpe = builderDefsPackage ../tools/networking/gvpe {\n          inherit openssl gmp nettools\n          iproute;\n        };\n        gvolicon = callPackage ../tools/audio/gvolicon {\n        };\n        gzip = callPackage ../tools/compression/gzip {\n        };\n        gzrt = callPackage ../tools/compression/gzrt {\n        };\n        partclone = callPackage ../tools/backup/partclone {\n        };\n        partimage = callPackage ../tools/backup/partimage {\n        };\n        pigz = callPackage ../tools/compression/pigz {\n        };\n        haproxy = callPackage ../tools/networking/haproxy {\n        };\n        haveged = callPackage ../tools/security/haveged {\n        };\n        hardlink = callPackage ../tools/system/hardlink {\n        };\n        hashcat = callPackage ../tools/security/hashcat {\n        };\n        halibut = callPackage ../tools/typesetting/halibut {\n        };\n        hddtemp = callPackage ../tools/misc/hddtemp {\n        };\n        hdf5 = callPackage ../tools/misc/hdf5 {\n          szip = null;\n        };\n        heimdall = callPackage ../tools/misc/heimdall {\n        };\n        hevea = callPackage ../tools/typesetting/hevea {\n        };\n        highlight = callPackage ../tools/text/highlight {\n          lua = lua5;\n        };\n        host = callPackage ../tools/networking/host {\n        };\n        hping = callPackage ../tools/networking/hping {\n        };\n        httpie = callPackage ../tools/networking/httpie {\n        };\n        httpfs2 = callPackage ../tools/filesystems/httpfs {\n        };\n        iasl = callPackage ../development/compilers/iasl {\n        };\n        icecast = callPackage ../servers/icecast {\n        };\n        icoutils = callPackage ../tools/graphics/icoutils {\n        };\n        idutils = callPackage ../tools/misc/idutils {\n        };\n        idle3tools = callPackage ../tools/system/idle3tools {\n        };\n        iftop = callPackage ../tools/networking/iftop {\n        };\n        imapproxy = callPackage ../tools/networking/imapproxy {\n        };\n        imapsync = callPackage ../tools/networking/imapsync {\n          inherit (perlPackages) MailIMAPClient;\n        };\n        inadyn = callPackage ../tools/networking/inadyn {\n        };\n        inetutils = callPackage ../tools/networking/inetutils {\n        };\n        ioping = callPackage ../tools/system/ioping {\n        };\n        iodine = callPackage ../tools/networking/iodine {\n        };\n        iperf = callPackage ../tools/networking/iperf {\n        };\n        ipmitool = callPackage ../tools/system/ipmitool {\n          static = false;\n        };\n        ipmiutil = callPackage ../tools/system/ipmiutil {\n        };\n        ised = callPackage ../tools/misc/ised {\n        };\n        isl = callPackage ../development/libraries/isl {\n        };\n        isl_0_12 = callPackage ../development/libraries/isl/0.12.2.nix {\n        };\n        isync = callPackage ../tools/networking/isync {\n        };\n        jd-gui = callPackage_i686 ../tools/security/jd-gui {\n        };\n        jdiskreport = callPackage ../tools/misc/jdiskreport {\n        };\n        jfsrec = callPackage ../tools/filesystems/jfsrec {\n          boost = boost144;\n        };\n        jfsutils = callPackage ../tools/filesystems/jfsutils {\n        };\n        jhead = callPackage ../tools/graphics/jhead {\n        };\n        jing = callPackage ../tools/text/xml/jing {\n        };\n        jmtpfs = callPackage ../tools/filesystems/jmtpfs {\n        };\n        jnettop = callPackage ../tools/networking/jnettop {\n        };\n        jq = callPackage ../development/tools/jq {\n        };\n        jscoverage = callPackage ../development/tools/misc/jscoverage {\n        };\n        jwhois = callPackage ../tools/networking/jwhois {\n        };\n        kazam = callPackage ../applications/video/kazam {\n        };\n        kalibrate-rtl = callPackage ../tools/misc/kalibrate-rtl {\n        };\n        kexectools = callPackage ../os-specific/linux/kexectools {\n        };\n        keychain = callPackage ../tools/misc/keychain {\n        };\n        kismet = callPackage ../applications/networking/sniffers/kismet {\n        };\n        less = callPackage ../tools/misc/less {\n        };\n        lockfileProgs = callPackage ../tools/misc/lockfile-progs {\n        };\n        logstash = callPackage ../tools/misc/logstash {\n        };\n        logstash-forwarder = callPackage ../tools/misc/logstash-forwarder {\n        };\n        kippo = callPackage ../servers/kippo {\n        };\n        klavaro = callPackage ../games/klavaro {\n        };\n        kzipmix = callPackage_i686 ../tools/compression/kzipmix {\n        };\n        minidlna = callPackage ../tools/networking/minidlna {\n          ffmpeg = ffmpeg_0_10;\n        };\n        mmv = callPackage ../tools/misc/mmv {\n        };\n        most = callPackage ../tools/misc/most {\n        };\n        multitail = callPackage ../tools/misc/multitail {\n        };\n        netperf = callPackage ../applications/networking/netperf {\n        };\n        ninka = callPackage ../development/tools/misc/ninka {\n        };\n        nodejs = callPackage ../development/web/nodejs {\n        };\n        nodePackages = recurseIntoAttrs (import ./node-packages.nix {\n          inherit pkgs stdenv nodejs\n          fetchurl fetchgit;\n          neededNatives = [\n            python\n          ] ++ lib.optional (lib.elem system lib.platforms.linux) utillinux;\n          self = pkgs.nodePackages;\n        });\n        ldapvi = callPackage ../tools/misc/ldapvi {\n        };\n        ldns = callPackage ../development/libraries/ldns {\n        };\n        lftp = callPackage ../tools/networking/lftp {\n        };\n        libconfig = callPackage ../development/libraries/libconfig {\n        };\n        libee = callPackage ../development/libraries/libee {\n        };\n        libestr = callPackage ../development/libraries/libestr {\n        };\n        libevdev = callPackage ../development/libraries/libevdev {\n        };\n        liboauth = callPackage ../development/libraries/liboauth {\n        };\n        libtirpc = callPackage ../development/libraries/ti-rpc {\n        };\n        libshout = callPackage ../development/libraries/libshout {\n        };\n        libqmi = callPackage ../development/libraries/libqmi {\n        };\n        libmbim = callPackage ../development/libraries/libmbim {\n        };\n        libtorrent = callPackage ../tools/networking/p2p/libtorrent {\n        };\n        logcheck = callPackage ../tools/system/logcheck {\n          inherit (perlPackages) mimeConstruct;\n        };\n        logrotate = callPackage ../tools/system/logrotate {\n        };\n        logstalgia = callPackage ../tools/graphics/logstalgia {\n        };\n        lout = callPackage ../tools/typesetting/lout {\n        };\n        lrzip = callPackage ../tools/compression/lrzip {\n        };\n        lsh = lowPrio (callPackage ../tools/networking/lsh {\n        });\n        lshw = callPackage ../tools/system/lshw {\n        };\n        lxc = callPackage ../os-specific/linux/lxc {\n        };\n        lzip = callPackage ../tools/compression/lzip {\n        };\n        lzma = xz;\n        xz = callPackage ../tools/compression/xz {\n        };\n        lzop = callPackage ../tools/compression/lzop {\n        };\n        maildrop = callPackage ../tools/networking/maildrop {\n        };\n        mailpile = callPackage ../applications/networking/mailreaders/mailpile {\n        };\n        mailutils = callPackage ../tools/networking/mailutils {\n          guile = guile_1_8;\n        };\n        mairix = callPackage ../tools/text/mairix {\n        };\n        makemkv = callPackage ../applications/video/makemkv {\n        };\n        man = callPackage ../tools/misc/man {\n        };\n        man_db = callPackage ../tools/misc/man-db {\n        };\n        memtest86 = callPackage ../tools/misc/memtest86 {\n        };\n        memtest86plus = callPackage ../tools/misc/memtest86+ {\n        };\n        meo = callPackage ../tools/security/meo {\n        };\n        mc = callPackage ../tools/misc/mc {\n        };\n        mcabber = callPackage ../applications/networking/instant-messengers/mcabber {\n        };\n        mcron = callPackage ../tools/system/mcron {\n          guile = guile_1_8;\n        };\n        mdbtools = callPackage ../tools/misc/mdbtools {\n        };\n        mdbtools_git = callPackage ../tools/misc/mdbtools/git.nix {\n          inherit (gnome) scrollkeeper;\n        };\n        mednafen = callPackage ../misc/emulators/mednafen {\n        };\n        mednafen-server = callPackage ../misc/emulators/mednafen/server.nix {\n        };\n        megacli = callPackage ../tools/misc/megacli {\n        };\n        megatools = callPackage ../tools/networking/megatools {\n        };\n        mfcuk = callPackage ../tools/security/mfcuk {\n        };\n        minecraft = callPackage ../games/minecraft {\n        };\n        minecraft-server = callPackage ../games/minecraft-server {\n        };\n        minetest = callPackage ../games/minetest {\n          libpng = libpng12;\n        };\n        miniupnpc = callPackage ../tools/networking/miniupnpc {\n        };\n        miniupnpd = callPackage ../tools/networking/miniupnpd {\n        };\n        minixml = callPackage ../development/libraries/minixml {\n        };\n        mjpegtools = callPackage ../tools/video/mjpegtools {\n        };\n        mkcue = callPackage ../tools/cd-dvd/mkcue {\n        };\n        mkpasswd = callPackage ../tools/security/mkpasswd {\n        };\n        mktemp = callPackage ../tools/security/mktemp {\n        };\n        mktorrent = callPackage ../tools/misc/mktorrent {\n        };\n        modemmanager = callPackage ../tools/networking/modemmanager {\n        };\n        monit = callPackage ../tools/system/monit {\n        };\n        mosh = callPackage ../tools/networking/mosh {\n          boost = boostHeaders;\n          inherit (perlPackages) IOTty;\n        };\n        mpage = callPackage ../tools/text/mpage {\n        };\n        mr = callPackage ../applications/version-management/mr {\n        };\n        mscgen = callPackage ../tools/graphics/mscgen {\n        };\n        msf = builderDefsPackage (import ../tools/security/metasploit/3.1.nix) {\n          inherit ruby makeWrapper;\n        };\n        mssys = callPackage ../tools/misc/mssys {\n        };\n        mtdutils = callPackage ../tools/filesystems/mtdutils {\n        };\n        mtools = callPackage ../tools/filesystems/mtools {\n        };\n        mtr = callPackage ../tools/networking/mtr {\n        };\n        multitran = recurseIntoAttrs (let\n          callPackage = newScope pkgs.multitran;\n          in rec {\n            multitrandata = callPackage ../tools/text/multitran/data {\n            };\n            libbtree = callPackage ../tools/text/multitran/libbtree {\n            };\n            libmtsupport = callPackage ../tools/text/multitran/libmtsupport {\n            };\n            libfacet = callPackage ../tools/text/multitran/libfacet {\n            };\n            libmtquery = callPackage ../tools/text/multitran/libmtquery {\n            };\n            mtutils = callPackage ../tools/text/multitran/mtutils {\n            };\n          });\n        munge = callPackage ../tools/security/munge {\n        };\n        muscleframework = callPackage ../tools/security/muscleframework {\n        };\n        muscletool = callPackage ../tools/security/muscletool {\n        };\n        mysql2pgsql = callPackage ../tools/misc/mysql2pgsql {\n        };\n        namazu = callPackage ../tools/text/namazu {\n        };\n        nbd = callPackage ../tools/networking/nbd {\n        };\n        ndjbdns = callPackage ../tools/networking/ndjbdns {\n        };\n        netatalk = callPackage ../tools/filesystems/netatalk {\n        };\n        netcdf = callPackage ../development/libraries/netcdf {\n        };\n        nc6 = callPackage ../tools/networking/nc6 {\n        };\n        ncat = callPackage ../tools/networking/ncat {\n        };\n        ncftp = callPackage ../tools/networking/ncftp {\n        };\n        ncompress = callPackage ../tools/compression/ncompress {\n        };\n        ndisc6 = callPackage ../tools/networking/ndisc6 {\n        };\n        netboot = callPackage ../tools/networking/netboot {\n        };\n        netcat = callPackage ../tools/networking/netcat {\n        };\n        netcat-openbsd = callPackage ../tools/networking/netcat-openbsd {\n        };\n        nethogs = callPackage ../tools/networking/nethogs {\n        };\n        netkittftp = callPackage ../tools/networking/netkit/tftp {\n        };\n        netpbm = callPackage ../tools/graphics/netpbm {\n        };\n        netrw = callPackage ../tools/networking/netrw {\n        };\n        netselect = callPackage ../tools/networking/netselect {\n        };\n        networkmanager = callPackage ../tools/networking/network-manager {\n        };\n        networkmanager_openvpn = callPackage ../tools/networking/network-manager/openvpn.nix {\n        };\n        networkmanager_pptp = callPackage ../tools/networking/network-manager/pptp.nix {\n        };\n        networkmanager_vpnc = callPackage ../tools/networking/network-manager/vpnc.nix {\n        };\n        networkmanager_openconnect = callPackage ../tools/networking/network-manager/openconnect.nix {\n        };\n        networkmanagerapplet = newScope gnome ../tools/networking/network-manager-applet {\n          dconf = gnome3.dconf;\n        };\n        newsbeuter = callPackage ../applications/networking/feedreaders/newsbeuter {\n        };\n        newsbeuter-dev = callPackage ../applications/networking/feedreaders/newsbeuter/dev.nix {\n        };\n        ngrep = callPackage ../tools/networking/ngrep {\n        };\n        ngrok = callPackage ../tools/misc/ngrok {\n        };\n        mpack = callPackage ../tools/networking/mpack {\n        };\n        pa_applet = callPackage ../tools/audio/pa-applet {\n        };\n        pnmixer = callPackage ../tools/audio/pnmixer {\n        };\n        nifskope = callPackage ../tools/graphics/nifskope {\n        };\n        nilfs_utils = callPackage ../tools/filesystems/nilfs-utils {\n        };\n        nitrogen = callPackage ../tools/X11/nitrogen {\n        };\n        nlopt = callPackage ../development/libraries/nlopt {\n        };\n        npapi_sdk = callPackage ../development/libraries/npapi-sdk {\n        };\n        npth = callPackage ../development/libraries/npth {\n        };\n        nmap = callPackage ../tools/security/nmap {\n        };\n        nmap_graphical = callPackage ../tools/security/nmap {\n          inherit (pythonPackages) pysqlite;\n          graphicalSupport = true;\n        };\n        notbit = callPackage ../applications/networking/notbit {\n        };\n        nox = callPackage ../tools/package-management/nox {\n          pythonPackages = python3Packages;\n          nix = nixUnstable;\n        };\n        nss_pam_ldapd = callPackage ../tools/networking/nss-pam-ldapd {\n        };\n        ntfs3g = callPackage ../tools/filesystems/ntfs-3g {\n        };\n        ntfsprogs = pkgs.ntfs3g;\n        ntop = callPackage ../tools/networking/ntop {\n        };\n        ntopng = callPackage ../tools/networking/ntopng {\n        };\n        ntp = callPackage ../tools/networking/ntp {\n        };\n        numdiff = callPackage ../tools/text/numdiff {\n        };\n        nssmdns = callPackage ../tools/networking/nss-mdns {\n        };\n        nwdiag = pythonPackages.nwdiag;\n        nylon = callPackage ../tools/networking/nylon {\n        };\n        nzbget = callPackage ../tools/networking/nzbget {\n        };\n        oathToolkit = callPackage ../tools/security/oath-toolkit {\n        };\n        obex_data_server = callPackage ../tools/bluetooth/obex-data-server {\n        };\n        obexd = callPackage ../tools/bluetooth/obexd {\n        };\n        obexfs = callPackage ../tools/bluetooth/obexfs {\n        };\n        obexftp = callPackage ../tools/bluetooth/obexftp {\n        };\n        obnam = callPackage ../tools/backup/obnam {\n        };\n        odt2txt = callPackage ../tools/text/odt2txt {\n        };\n        offlineimap = callPackage ../tools/networking/offlineimap {\n          inherit (pythonPackages) sqlite3;\n        };\n        opendbx = callPackage ../development/libraries/opendbx {\n        };\n        opendkim = callPackage ../development/libraries/opendkim {\n        };\n        opendylan = callPackage ../development/compilers/opendylan {\n          opendylan-bootstrap = opendylan_bin;\n        };\n        opendylan_bin = callPackage ../development/compilers/opendylan/bin.nix {\n        };\n        openjade = callPackage ../tools/text/sgml/openjade {\n        };\n        openobex = callPackage ../tools/bluetooth/openobex {\n        };\n        openopc = callPackage ../tools/misc/openopc {\n          pythonFull = python27Full.override {\n            extraLibs = [\n              python27Packages.pyro3\n            ];\n          };\n        };\n        openresolv = callPackage ../tools/networking/openresolv {\n        };\n        opensc = callPackage ../tools/security/opensc {\n        };\n        opensc_dnie_wrapper = callPackage ../tools/security/opensc-dnie-wrapper {\n        };\n        openssh = callPackage ../tools/networking/openssh {\n          hpnSupport = false;\n          withKerberos = false;\n          etcDir = \"/etc/ssh\";\n          pam = if stdenv.isLinux\n            then pam\n            else null;\n        };\n        openssh_hpn = pkgs.appendToName \"with-hpn\" (openssh.override {\n          hpnSupport = true;\n        });\n        openssh_with_kerberos = pkgs.appendToName \"with-kerberos\" (openssh.override {\n          withKerberos = true;\n        });\n        opensp = callPackage ../tools/text/sgml/opensp {\n        };\n        spCompat = callPackage ../tools/text/sgml/opensp/compat.nix {\n        };\n        openvpn = callPackage ../tools/networking/openvpn {\n        };\n        openvpn_learnaddress = callPackage ../tools/networking/openvpn/openvpn_learnaddress.nix {\n        };\n        optipng = callPackage ../tools/graphics/optipng {\n          libpng = libpng12;\n        };\n        oslrd = callPackage ../tools/networking/oslrd {\n        };\n        ossec = callPackage ../tools/security/ossec {\n        };\n        otpw = callPackage ../os-specific/linux/otpw {\n        };\n        p7zip = callPackage ../tools/archivers/p7zip {\n        };\n        pal = callPackage ../tools/misc/pal {\n        };\n        panomatic = callPackage ../tools/graphics/panomatic {\n        };\n        par2cmdline = callPackage ../tools/networking/par2cmdline {\n        };\n        parallel = callPackage ../tools/misc/parallel {\n        };\n        parcellite = callPackage ../tools/misc/parcellite {\n        };\n        patchutils = callPackage ../tools/text/patchutils {\n        };\n        parted = callPackage ../tools/misc/parted {\n          hurd = null;\n        };\n        pitivi = callPackage ../applications/video/pitivi {\n          gst = gst_all_1;\n          clutter-gtk = clutter_gtk;\n          inherit (gnome3) gnome_icon_theme\n          gnome_icon_theme_symbolic;\n        };\n        p0f = callPackage ../tools/security/p0f {\n        };\n        pngout = callPackage ../tools/graphics/pngout {\n        };\n        hurdPartedCross = if crossSystem != null && crossSystem.config == \"i586-pc-gnu\"\n          then makeOverridable ({ hurd }:\n          (parted.override {\n            inherit hurd;\n            enableStatic = true;\n            gettext = null;\n            readline = null;\n            devicemapper = null;\n          }).crossDrv) {\n            hurd = gnu.hurdCrossIntermediate;\n          }\n          else null;\n        ipsecTools = callPackage ../os-specific/linux/ipsec-tools {\n          flex = flex_2_5_35;\n        };\n        patch = gnupatch;\n        pbzip2 = callPackage ../tools/compression/pbzip2 {\n        };\n        pciutils = callPackage ../tools/system/pciutils {\n        };\n        pcsclite = callPackage ../tools/security/pcsclite {\n        };\n        pdf2djvu = callPackage ../tools/typesetting/pdf2djvu {\n        };\n        pdfjam = callPackage ../tools/typesetting/pdfjam {\n        };\n        jbig2enc = callPackage ../tools/graphics/jbig2enc {\n        };\n        pdfread = callPackage ../tools/graphics/pdfread {\n        };\n        briss = callPackage ../tools/graphics/briss {\n        };\n        bully = callPackage ../tools/networking/bully {\n        };\n        pdnsd = callPackage ../tools/networking/pdnsd {\n        };\n        peco = callPackage ../tools/text/peco {\n        };\n        pg_top = callPackage ../tools/misc/pg_top {\n        };\n        pdsh = callPackage ../tools/networking/pdsh {\n          rsh = true;\n          ssh = openssh;\n        };\n        pfstools = callPackage ../tools/graphics/pfstools {\n        };\n        philter = callPackage ../tools/networking/philter {\n        };\n        pinentry = callPackage ../tools/security/pinentry {\n        };\n        pius = callPackage ../tools/security/pius {\n        };\n        pk2cmd = callPackage ../tools/misc/pk2cmd {\n        };\n        plantuml = callPackage ../tools/misc/plantuml {\n        };\n        plan9port = callPackage ../tools/system/plan9port {\n        };\n        ploticus = callPackage ../tools/graphics/ploticus {\n          libpng = libpng12;\n        };\n        plotutils = callPackage ../tools/graphics/plotutils {\n        };\n        plowshare = callPackage ../tools/misc/plowshare {\n        };\n        pngcrush = callPackage ../tools/graphics/pngcrush {\n        };\n        pngnq = callPackage ../tools/graphics/pngnq {\n        };\n        pngtoico = callPackage ../tools/graphics/pngtoico {\n          libpng = libpng12;\n        };\n        pngquant = callPackage ../tools/graphics/pngquant {\n        };\n        podiff = callPackage ../tools/text/podiff {\n        };\n        poedit = callPackage ../tools/text/poedit {\n        };\n        polipo = callPackage ../servers/polipo {\n        };\n        polkit_gnome = callPackage ../tools/security/polkit-gnome {\n        };\n        ponysay = callPackage ../tools/misc/ponysay {\n        };\n        povray = callPackage ../tools/graphics/povray {\n        };\n        ppl = callPackage ../development/libraries/ppl {\n        };\n        ppp = callPackage ../tools/networking/ppp {\n        };\n        pptp = callPackage ../tools/networking/pptp {\n        };\n        prey-bash-client = callPackage ../tools/security/prey {\n        };\n        projectm = callPackage ../applications/audio/projectm {\n        };\n        proxychains = callPackage ../tools/networking/proxychains {\n        };\n        proxytunnel = callPackage ../tools/misc/proxytunnel {\n        };\n        cntlm = callPackage ../tools/networking/cntlm {\n        };\n        pastebinit = callPackage ../tools/misc/pastebinit {\n        };\n        psmisc = callPackage ../os-specific/linux/psmisc {\n        };\n        pstoedit = callPackage ../tools/graphics/pstoedit {\n        };\n        pv = callPackage ../tools/misc/pv {\n        };\n        pwgen = callPackage ../tools/security/pwgen {\n        };\n        pwnat = callPackage ../tools/networking/pwnat {\n        };\n        pycangjie = callPackage ../development/python-modules/pycangjie {\n        };\n        pydb = callPackage ../development/tools/pydb {\n        };\n        pystringtemplate = callPackage ../development/python-modules/stringtemplate {\n        };\n        pythonDBus = dbus_python;\n        pythonIRClib = builderDefsPackage (import ../development/python-modules/irclib) {\n          inherit python;\n        };\n        pythonSexy = builderDefsPackage (import ../development/python-modules/libsexy) {\n          inherit python libsexy pkgconfig\n          libxml2 pygtk pango gtk glib;\n        };\n        openmpi = callPackage ../development/libraries/openmpi {\n        };\n        qhull = callPackage ../development/libraries/qhull {\n        };\n        qjoypad = callPackage ../tools/misc/qjoypad {\n        };\n        qshowdiff = callPackage ../tools/text/qshowdiff {\n        };\n        quilt = callPackage ../development/tools/quilt {\n        };\n        radvd = callPackage ../tools/networking/radvd {\n        };\n        ranger = callPackage ../applications/misc/ranger {\n        };\n        privateer = callPackage ../games/privateer {\n        };\n        rtmpdump = callPackage ../tools/video/rtmpdump {\n        };\n        reaverwps = callPackage ../tools/networking/reaver-wps {\n        };\n        recutils = callPackage ../tools/misc/recutils {\n        };\n        recoll = callPackage ../applications/search/recoll {\n        };\n        reiser4progs = callPackage ../tools/filesystems/reiser4progs {\n        };\n        reiserfsprogs = callPackage ../tools/filesystems/reiserfsprogs {\n        };\n        relfs = callPackage ../tools/filesystems/relfs {\n          inherit (gnome) gnome_vfs GConf;\n        };\n        remarkjs = callPackage ../development/web/remarkjs {\n        };\n        remind = callPackage ../tools/misc/remind {\n        };\n        remmina = callPackage ../applications/networking/remote/remmina {\n        };\n        renameutils = callPackage ../tools/misc/renameutils {\n        };\n        replace = callPackage ../tools/text/replace {\n        };\n        reptyr = callPackage ../os-specific/linux/reptyr {\n        };\n        rdiff_backup = callPackage ../tools/backup/rdiff-backup {\n        };\n        rdmd = callPackage ../development/compilers/rdmd {\n        };\n        rhash = callPackage ../tools/security/rhash {\n        };\n        riemann_c_client = callPackage ../tools/misc/riemann-c-client {\n        };\n        ripmime = callPackage ../tools/networking/ripmime {\n        };\n        rkflashtool = callPackage ../tools/misc/rkflashtool {\n        };\n        rmlint = callPackage ../tools/misc/rmlint {\n        };\n        rng_tools = callPackage ../tools/security/rng-tools {\n        };\n        rsnapshot = callPackage ../tools/backup/rsnapshot {\n          logger = inetutils;\n        };\n        rlwrap = callPackage ../tools/misc/rlwrap {\n        };\n        rockbox_utility = callPackage ../tools/misc/rockbox-utility {\n        };\n        rpPPPoE = builderDefsPackage (import ../tools/networking/rp-pppoe) {\n          inherit ppp;\n        };\n        rpm = callPackage ../tools/package-management/rpm {\n        };\n        rrdtool = callPackage ../tools/misc/rrdtool {\n        };\n        rtorrent = callPackage ../tools/networking/p2p/rtorrent {\n        };\n        rubber = callPackage ../tools/typesetting/rubber {\n        };\n        rxp = callPackage ../tools/text/xml/rxp {\n        };\n        rzip = callPackage ../tools/compression/rzip {\n        };\n        s3backer = callPackage ../tools/filesystems/s3backer {\n        };\n        s3cmd = callPackage ../tools/networking/s3cmd {\n        };\n        s3cmd_15_pre_81e3842f7a = lowPrio (callPackage ../tools/networking/s3cmd/git.nix {\n        });\n        s3sync = callPackage ../tools/networking/s3sync {\n          ruby = ruby18;\n        };\n        sablotron = callPackage ../tools/text/xml/sablotron {\n        };\n        safecopy = callPackage ../tools/system/safecopy {\n        };\n        salut_a_toi = callPackage ../applications/networking/instant-messengers/salut-a-toi {\n        };\n        samplicator = callPackage ../tools/networking/samplicator {\n        };\n        screen = callPackage ../tools/misc/screen {\n        };\n        scrot = callPackage ../tools/graphics/scrot {\n        };\n        scrypt = callPackage ../tools/security/scrypt {\n        };\n        sdcv = callPackage ../applications/misc/sdcv {\n        };\n        sec = callPackage ../tools/admin/sec {\n        };\n        seccure = callPackage ../tools/security/seccure {\n        };\n        setserial = builderDefsPackage (import ../tools/system/setserial) {\n          inherit groff;\n        };\n        seqdiag = pythonPackages.seqdiag;\n        screenfetch = callPackage ../tools/misc/screenfetch {\n        };\n        sg3_utils = callPackage ../tools/system/sg3_utils {\n        };\n        sharutils = callPackage ../tools/archivers/sharutils {\n        };\n        shotwell = callPackage ../applications/graphics/shotwell {\n        };\n        shebangfix = callPackage ../tools/misc/shebangfix {\n        };\n        shellinabox = callPackage ../servers/shellinabox {\n        };\n        siege = callPackage ../tools/networking/siege {\n        };\n        silc_client = callPackage ../applications/networking/instant-messengers/silc-client {\n        };\n        silc_server = callPackage ../servers/silc-server {\n        };\n        silver-searcher = callPackage ../tools/text/silver-searcher {\n        };\n        simplescreenrecorder = callPackage ../applications/video/simplescreenrecorder {\n        };\n        sleuthkit = callPackage ../tools/system/sleuthkit {\n        };\n        slimrat = callPackage ../tools/networking/slimrat {\n          inherit (perlPackages) WWWMechanize\n          LWP;\n        };\n        slsnif = callPackage ../tools/misc/slsnif {\n        };\n        smartmontools = callPackage ../tools/system/smartmontools {\n        };\n        smbldaptools = callPackage ../tools/networking/smbldaptools {\n          inherit (perlPackages) NetLDAP\n          CryptSmbHash DigestSHA1;\n        };\n        smbnetfs = callPackage ../tools/filesystems/smbnetfs {\n        };\n        snort = callPackage ../applications/networking/ids/snort {\n        };\n        snx = callPackage_i686 ../tools/networking/snx {\n          inherit (pkgsi686Linux) pam\n          gcc33;\n          inherit (pkgsi686Linux.xlibs) libX11;\n        };\n        solr = callPackage ../servers/search/solr {\n        };\n        sparsehash = callPackage ../development/libraries/sparsehash {\n        };\n        spiped = callPackage ../tools/networking/spiped {\n        };\n        sproxy = haskellPackages.callPackage ../tools/networking/sproxy {\n        };\n        sproxy-web = haskellPackages.callPackage ../tools/networking/sproxy-web {\n        };\n        stardict = callPackage ../applications/misc/stardict/stardict.nix {\n          inherit (gnome) libgnomeui\n          scrollkeeper;\n        };\n        storebrowse = callPackage ../tools/system/storebrowse {\n        };\n        fusesmb = callPackage ../tools/filesystems/fusesmb {\n        };\n        sl = callPackage ../tools/misc/sl {\n        };\n        socat = callPackage ../tools/networking/socat {\n        };\n        socat2pre = lowPrio (callPackage ../tools/networking/socat/2.x.nix {\n        });\n        sourceHighlight = callPackage ../tools/text/source-highlight {\n          boost = boost149;\n        };\n        spaceFM = callPackage ../applications/misc/spacefm {\n        };\n        squashfsTools = callPackage ../tools/filesystems/squashfs {\n        };\n        sshfsFuse = callPackage ../tools/filesystems/sshfs-fuse {\n        };\n        sshuttle = callPackage ../tools/security/sshuttle {\n        };\n        sudo = callPackage ../tools/security/sudo {\n        };\n        suidChroot = builderDefsPackage (import ../tools/system/suid-chroot) {\n        };\n        super = callPackage ../tools/security/super {\n        };\n        ssdeep = callPackage ../tools/security/ssdeep {\n        };\n        ssmtp = callPackage ../tools/networking/ssmtp {\n          tlsSupport = true;\n        };\n        ssss = callPackage ../tools/security/ssss {\n        };\n        storeBackup = callPackage ../tools/backup/store-backup {\n        };\n        stow = callPackage ../tools/misc/stow {\n        };\n        stun = callPackage ../tools/networking/stun {\n        };\n        stunnel = callPackage ../tools/networking/stunnel {\n        };\n        su = shadow.su;\n        surfraw = callPackage ../tools/networking/surfraw {\n        };\n        swec = callPackage ../tools/networking/swec {\n          inherit (perlPackages) LWP URI\n          HTMLParser HTTPServerSimple\n          Parent;\n        };\n        svnfs = callPackage ../tools/filesystems/svnfs {\n        };\n        sysbench = callPackage ../development/tools/misc/sysbench {\n        };\n        system_config_printer = callPackage ../tools/misc/system-config-printer {\n          libxml2 = libxml2Python;\n        };\n        sitecopy = callPackage ../tools/networking/sitecopy {\n        };\n        stricat = callPackage ../tools/security/stricat {\n        };\n        privoxy = callPackage ../tools/networking/privoxy {\n        };\n        t1utils = callPackage ../tools/misc/t1utils {\n        };\n        tarsnap = callPackage ../tools/backup/tarsnap {\n        };\n        tcpcrypt = callPackage ../tools/security/tcpcrypt {\n        };\n        tboot = callPackage ../tools/security/tboot {\n        };\n        tcpdump = callPackage ../tools/networking/tcpdump {\n        };\n        tcpflow = callPackage ../tools/networking/tcpflow {\n        };\n        teamviewer = callPackage_i686 ../applications/networking/remote/teamviewer {\n        };\n        teamviewer8 = lowPrio (callPackage_i686 ../applications/networking/remote/teamviewer/8.nix {\n        });\n        telnet = callPackage ../tools/networking/telnet {\n        };\n        texmacs = callPackage ../applications/editors/texmacs {\n          tex = texLive;\n          extraFonts = true;\n          guile = guile_1_8;\n        };\n        texmaker = callPackage ../applications/editors/texmaker {\n        };\n        texstudio = callPackage ../applications/editors/texstudio {\n        };\n        tiled-qt = callPackage ../applications/editors/tiled-qt {\n          qt = qt4;\n        };\n        tinc = callPackage ../tools/networking/tinc {\n        };\n        tiny8086 = callPackage ../applications/virtualization/8086tiny {\n        };\n        tmpwatch = callPackage ../tools/misc/tmpwatch {\n        };\n        tmux = callPackage ../tools/misc/tmux {\n        };\n        tor = callPackage ../tools/security/tor {\n        };\n        torbutton = callPackage ../tools/security/torbutton {\n        };\n        torbrowser = callPackage ../tools/security/tor/torbrowser.nix {\n        };\n        torsocks = callPackage ../tools/security/tor/torsocks.nix {\n        };\n        tpm-quote-tools = callPackage ../tools/security/tpm-quote-tools {\n        };\n        tpm-tools = callPackage ../tools/security/tpm-tools {\n        };\n        trickle = callPackage ../tools/networking/trickle {\n        };\n        trousers = callPackage ../tools/security/trousers {\n        };\n        ttf2pt1 = callPackage ../tools/misc/ttf2pt1 {\n        };\n        ttysnoop = callPackage ../os-specific/linux/ttysnoop {\n        };\n        twitterBootstrap = callPackage ../development/web/twitter-bootstrap {\n        };\n        txt2man = callPackage ../tools/misc/txt2man {\n        };\n        ucl = callPackage ../development/libraries/ucl {\n        };\n        ucspi-tcp = callPackage ../tools/networking/ucspi-tcp {\n        };\n        udftools = callPackage ../tools/filesystems/udftools {\n        };\n        udptunnel = callPackage ../tools/networking/udptunnel {\n        };\n        ufraw = callPackage ../applications/graphics/ufraw {\n        };\n        unetbootin = callPackage ../tools/cd-dvd/unetbootin {\n        };\n        unfs3 = callPackage ../servers/unfs3 {\n        };\n        unoconv = callPackage ../tools/text/unoconv {\n        };\n        upx = callPackage ../tools/compression/upx {\n        };\n        urlview = callPackage ../applications/misc/urlview {\n        };\n        usbmuxd = callPackage ../tools/misc/usbmuxd {\n        };\n        vacuum = callPackage ../applications/networking/instant-messengers/vacuum {\n        };\n        volatility = callPackage ../tools/security/volatility {\n        };\n        vidalia = callPackage ../tools/security/vidalia {\n        };\n        vbetool = builderDefsPackage ../tools/system/vbetool {\n          inherit pciutils libx86 zlib;\n        };\n        vde2 = callPackage ../tools/networking/vde2 {\n        };\n        vboot_reference = callPackage ../tools/system/vboot_reference {\n        };\n        vcsh = callPackage ../applications/version-management/vcsh {\n        };\n        verilog = callPackage ../applications/science/electronics/verilog {\n        };\n        vfdecrypt = callPackage ../tools/misc/vfdecrypt {\n        };\n        vifm = callPackage ../applications/misc/vifm {\n        };\n        viking = callPackage ../applications/misc/viking {\n          inherit (gnome) scrollkeeper;\n        };\n        vnc2flv = callPackage ../tools/video/vnc2flv {\n        };\n        vncrec = builderDefsPackage ../tools/video/vncrec {\n          inherit (xlibs) imake libX11\n          xproto gccmakedep libXt libXmu\n          libXaw libXext xextproto libSM\n          libICE libXpm libXp;\n        };\n        vobcopy = callPackage ../tools/cd-dvd/vobcopy {\n        };\n        vobsub2srt = callPackage ../tools/cd-dvd/vobsub2srt {\n        };\n        vorbisgain = callPackage ../tools/misc/vorbisgain {\n        };\n        vpnc = callPackage ../tools/networking/vpnc {\n        };\n        openconnect = callPackage ../tools/networking/openconnect.nix {\n        };\n        vtun = callPackage ../tools/networking/vtun {\n        };\n        wal_e = callPackage ../tools/backup/wal-e {\n        };\n        watchman = callPackage ../development/tools/watchman {\n        };\n        wbox = callPackage ../tools/networking/wbox {\n        };\n        welkin = callPackage ../tools/graphics/welkin {\n        };\n        testdisk = callPackage ../tools/misc/testdisk {\n        };\n        htmlTidy = callPackage ../tools/text/html-tidy {\n        };\n        html-xml-utils = callPackage ../tools/text/xml/html-xml-utils {\n        };\n        tftp_hpa = callPackage ../tools/networking/tftp-hpa {\n        };\n        tigervnc = callPackage ../tools/admin/tigervnc {\n          fontDirectories = [\n            xorg.fontadobe75dpi\n            xorg.fontmiscmisc\n            xorg.fontcursormisc\n            xorg.fontbhlucidatypewriter75dpi\n          ];\n          inherit (xorg) xorgserver;\n          fltk = fltk13;\n        };\n        tightvnc = callPackage ../tools/admin/tightvnc {\n          fontDirectories = [\n            xorg.fontadobe75dpi\n            xorg.fontmiscmisc\n            xorg.fontcursormisc\n            xorg.fontbhlucidatypewriter75dpi\n          ];\n        };\n        time = callPackage ../tools/misc/time {\n        };\n        tkabber = callPackage ../applications/networking/instant-messengers/tkabber {\n        };\n        qfsm = callPackage ../applications/science/electronics/qfsm {\n        };\n        tkgate = callPackage ../applications/science/electronics/tkgate/1.x.nix {\n          inherit (xlibs) libX11 imake\n          xproto gccmakedep;\n        };\n        tkgate2 = lowPrio (callPackage ../applications/science/electronics/tkgate/2.x.nix {\n          inherit (xlibs) libX11;\n        });\n        tm = callPackage ../tools/system/tm {\n        };\n        trang = callPackage ../tools/text/xml/trang {\n        };\n        tre = callPackage ../development/libraries/tre {\n        };\n        ts = callPackage ../tools/system/ts {\n        };\n        transfig = callPackage ../tools/graphics/transfig {\n          libpng = libpng12;\n        };\n        truecrypt = callPackage ../applications/misc/truecrypt {\n          wxGUI = config.truecrypt.wxGUI or true;\n        };\n        ttmkfdir = callPackage ../tools/misc/ttmkfdir {\n        };\n        unclutter = callPackage ../tools/misc/unclutter {\n        };\n        unbound = callPackage ../tools/networking/unbound {\n        };\n        units = callPackage ../tools/misc/units {\n        };\n        unrar = callPackage ../tools/archivers/unrar {\n        };\n        xarchive = callPackage ../tools/archivers/xarchive {\n        };\n        xarchiver = callPackage ../tools/archivers/xarchiver {\n        };\n        xcruiser = callPackage ../applications/misc/xcruiser {\n        };\n        unarj = callPackage ../tools/archivers/unarj {\n        };\n        unshield = callPackage ../tools/archivers/unshield {\n        };\n        unzip = callPackage ../tools/archivers/unzip {\n        };\n        unzipNLS = lowPrio (unzip.override {\n          enableNLS = true;\n        });\n        uptimed = callPackage ../tools/system/uptimed {\n        };\n        varnish = callPackage ../servers/varnish {\n        };\n        varnish2 = callPackage ../servers/varnish/2.1.nix {\n        };\n        venus = callPackage ../tools/misc/venus {\n          python = python27;\n        };\n        vlan = callPackage ../tools/networking/vlan {\n        };\n        wakelan = callPackage ../tools/networking/wakelan {\n        };\n        wavemon = callPackage ../tools/networking/wavemon {\n        };\n        w3cCSSValidator = callPackage ../tools/misc/w3c-css-validator {\n          tomcat = tomcat6;\n        };\n        wdfs = callPackage ../tools/filesystems/wdfs {\n        };\n        wdiff = callPackage ../tools/text/wdiff {\n        };\n        webalizer = callPackage ../tools/networking/webalizer {\n        };\n        webdruid = builderDefsPackage ../tools/admin/webdruid {\n          inherit zlib libpng freetype gd\n          which libxml2 geoip;\n        };\n        weighttp = callPackage ../tools/networking/weighttp {\n        };\n        wget = callPackage ../tools/networking/wget {\n          inherit (perlPackages) LWP;\n        };\n        which = callPackage ../tools/system/which {\n        };\n        wicd = callPackage ../tools/networking/wicd {\n        };\n        wkhtmltopdf = callPackage ../tools/graphics/wkhtmltopdf {\n        };\n        wv = callPackage ../tools/misc/wv {\n        };\n        wv2 = callPackage ../tools/misc/wv2 {\n        };\n        x86info = callPackage ../os-specific/linux/x86info {\n        };\n        x11_ssh_askpass = callPackage ../tools/networking/x11-ssh-askpass {\n        };\n        xbursttools = assert stdenv ? glibc; import ../tools/misc/xburst-tools {\n          inherit stdenv fetchgit autoconf\n          automake confuse pkgconfig\n          libusb libusb1;\n          gccCross = let\n            pkgsCross = import ./all-packages.nix {\n              inherit system;\n              inherit bootStdenv noSysDirs\n              gccWithCC gccWithProfiling\n              config;\n              crossSystem = {\n                config = \"mipsel-unknown-linux\";\n                bigEndian = true;\n                arch = \"mips\";\n                float = \"soft\";\n                withTLS = true;\n                libc = \"uclibc\";\n                platform = {\n                  name = \"ben_nanonote\";\n                  kernelMajor = \"2.6\";\n                  kernelHeadersBaseConfig = \"bcm47xx_defconfig\";\n                  kernelArch = \"mips\";\n                };\n                gcc = { arch = \"mips32\"; };\n              };\n            };\n            in pkgsCross.gccCrossStageStatic;\n        };\n        xclip = callPackage ../tools/misc/xclip {\n        };\n        xtitle = callPackage ../tools/misc/xtitle {\n        };\n        xdelta = callPackage ../tools/compression/xdelta {\n        };\n        xdummy = callPackage ../tools/misc/xdummy {\n        };\n        xfsprogs = callPackage ../tools/filesystems/xfsprogs {\n        };\n        xmlroff = callPackage ../tools/typesetting/xmlroff {\n          inherit (gnome) libgnomeprint;\n        };\n        xmlstarlet = callPackage ../tools/text/xml/xmlstarlet {\n        };\n        xmlto = callPackage ../tools/typesetting/xmlto {\n        };\n        xmltv = callPackage ../tools/misc/xmltv {\n        };\n        xmpppy = builderDefsPackage (import ../development/python-modules/xmpppy) {\n          inherit python setuptools;\n        };\n        xorriso = callPackage ../tools/cd-dvd/xorriso {\n        };\n        xpf = callPackage ../tools/text/xml/xpf {\n          libxml2 = libxml2Python;\n        };\n        xsel = callPackage ../tools/misc/xsel {\n        };\n        xtreemfs = callPackage ../tools/filesystems/xtreemfs {\n        };\n        xvfb_run = callPackage ../tools/misc/xvfb-run {\n          inherit (texFunctions) fontsConf;\n        };\n        youtubeDL = callPackage ../tools/misc/youtube-dl {\n        };\n        zbar = callPackage ../tools/graphics/zbar {\n          pygtk = lib.overrideDerivation pygtk (x:\n          { gtk = gtk2; });\n        };\n        zdelta = callPackage ../tools/compression/zdelta {\n        };\n        zfstools = callPackage ../tools/filesystems/zfstools {\n          zfs = linuxPackages.zfs;\n        };\n        zile = callPackage ../applications/editors/zile {\n        };\n        zip = callPackage ../tools/archivers/zip {\n        };\n        zpaq = callPackage ../tools/archivers/zpaq {\n        };\n        zpaqd = callPackage ../tools/archivers/zpaq/zpaqd.nix {\n        };\n        zsync = callPackage ../tools/compression/zsync {\n        };\n        bash = lowPrio (callPackage ../shells/bash {\n          texinfo = null;\n        });\n        bashInteractive = appendToName \"interactive\" (callPackage ../shells/bash {\n          interactive = true;\n          readline = readline63;\n        });\n        bashCompletion = callPackage ../shells/bash-completion {\n        };\n        dash = callPackage ../shells/dash {\n        };\n        fish = callPackage ../shells/fish {\n          python = python27Full;\n        };\n        tcsh = callPackage ../shells/tcsh {\n        };\n        rush = callPackage ../shells/rush {\n        };\n        zsh = callPackage ../shells/zsh {\n        };\n        abc = abcPatchable [ ];\n        abcPatchable = patches:\n        import ../development/compilers/abc/default.nix {\n          inherit stdenv fetchurl patches\n          jre apacheAnt;\n          javaCup = callPackage ../development/libraries/java/cup {\n          };\n        };\n        aldor = callPackage ../development/compilers/aldor {\n        };\n        aliceml = callPackage ../development/compilers/aliceml {\n        };\n        aspectj = callPackage ../development/compilers/aspectj {\n        };\n        ats = callPackage ../development/compilers/ats {\n        };\n        ats2 = callPackage ../development/compilers/ats2 {\n        };\n        avra = callPackage ../development/compilers/avra {\n        };\n        bigloo = callPackage ../development/compilers/bigloo {\n        };\n        chicken = callPackage ../development/compilers/chicken {\n        };\n        ccl = builderDefsPackage ../development/compilers/ccl {\n        };\n        clang = wrapClang llvmPackages.clang;\n        clang_34 = wrapClang llvmPackages_34.clang;\n        clang_33 = wrapClang (clangUnwrapped llvm_33 ../development/compilers/llvm/3.3/clang.nix);\n        clangAnalyzer = callPackage ../development/tools/analysis/clang-analyzer {\n          clang = clang_34;\n          llvmPackages = llvmPackages_34;\n        };\n        clangUnwrapped = llvm: pkg:\n        callPackage pkg {\n          stdenv = if stdenv.isDarwin\n            then stdenvApple\n            else stdenv;\n          inherit llvm;\n        };\n        clangSelf = clangWrapSelf llvmPackagesSelf.clang;\n        clangWrapSelf = build:\n        import ../build-support/clang-wrapper {\n          clang = build;\n          stdenv = clangStdenv;\n          libc = glibc;\n          binutils = binutils;\n          shell = bash;\n          inherit libcxx coreutils zlib;\n          nativeTools = false;\n          nativeLibc = false;\n        };\n        clangStdenv = lowPrio (stdenvAdapters.overrideGCC stdenv clang);\n        libcxxStdenv = stdenvAdapters.overrideGCC stdenv (clangWrapSelf llvmPackages.clang);\n        clean = callPackage ../development/compilers/clean {\n        };\n        closurecompiler = callPackage ../development/compilers/closure {\n        };\n        cmucl_binary = callPackage ../development/compilers/cmucl/binary.nix {\n        };\n        compcert = callPackage ../development/compilers/compcert {\n        };\n        cryptol1 = lowPrio (callPackage ../development/compilers/cryptol/1.8.x.nix {\n        });\n        cryptol2 = with haskellPackages_ghc763; callPackage ../development/compilers/cryptol/2.0.x.nix {\n          Cabal = Cabal_1_18_1_3;\n          cabalInstall = cabalInstall_1_18_0_3;\n          process = process_1_2_0_0;\n        };\n        cython = pythonPackages.cython;\n        cython3 = python3Packages.cython;\n        dylan = callPackage ../development/compilers/gwydion-dylan {\n          dylan = callPackage ../development/compilers/gwydion-dylan/binary.nix {\n          };\n        };\n        ecl = callPackage ../development/compilers/ecl {\n        };\n        eql = callPackage ../development/compilers/eql {\n        };\n        adobe_flex_sdk = callPackage ../development/compilers/adobe-flex-sdk {\n        };\n        fpc = callPackage ../development/compilers/fpc {\n        };\n        fpc_2_4_0 = callPackage ../development/compilers/fpc/2.4.0.nix {\n        };\n        gambit = callPackage ../development/compilers/gambit {\n        };\n        gcc = gcc48;\n        gcc33 = wrapGCC (import ../development/compilers/gcc/3.3 {\n          inherit fetchurl stdenv\n          noSysDirs;\n        });\n        gcc34 = wrapGCC (import ../development/compilers/gcc/3.4 {\n          inherit fetchurl stdenv\n          noSysDirs;\n        });\n        gcc48_realCross = lib.addMetaAttrs {\n          hydraPlatforms = [ ];\n        } (callPackage ../development/compilers/gcc/4.8 {\n          inherit noSysDirs;\n          binutilsCross = binutilsCross;\n          libcCross = libcCross;\n          profiledCompiler = false;\n          enableMultilib = false;\n          crossStageStatic = false;\n          cross = assert crossSystem != null; crossSystem;\n        });\n        gcc_realCross = gcc48_realCross;\n        gccCrossStageStatic = let\n          libcCross1 = if stdenv.cross.libc == \"msvcrt\"\n            then windows.mingw_w64_headers\n            else if stdenv.cross.libc == \"libSystem\"\n              then darwin.xcode\n              else null;\n          in wrapGCCCross {\n            gcc = forceNativeDrv (lib.addMetaAttrs {\n              hydraPlatforms = [ ];\n            } (gcc_realCross.override {\n              crossStageStatic = true;\n              langCC = false;\n              libcCross = libcCross1;\n              enableShared = false;\n            }));\n            libc = libcCross1;\n            binutils = binutilsCross;\n            cross = assert crossSystem != null; crossSystem;\n          };\n        gccCrossMingw2 = wrapGCCCross {\n          gcc = gccCrossStageStatic.gcc;\n          libc = windows.mingw_headers2;\n          binutils = binutilsCross;\n          cross = assert crossSystem != null; crossSystem;\n        };\n        gccCrossStageFinal = wrapGCCCross {\n          gcc = forceNativeDrv (gcc_realCross.override {\n            libpthreadCross = if crossSystem != null && crossSystem.config == \"i586-pc-gnu\"\n              then gnu.libpthreadCross\n              else null;\n            langCC = crossSystem == null || crossSystem.config != \"i686-pc-mingw32\";\n          });\n          libc = libcCross;\n          binutils = binutilsCross;\n          cross = assert crossSystem != null; crossSystem;\n        };\n        gcc44 = lowPrio (wrapGCC (makeOverridable (import ../development/compilers/gcc/4.4) {\n          inherit fetchurl stdenv gmp mpfr\n          gettext which noSysDirs;\n          texinfo = texinfo4;\n          profiledCompiler = true;\n        }));\n        gcc45 = lowPrio (wrapGCC (callPackage ../development/compilers/gcc/4.5 {\n          inherit fetchurl stdenv gmp mpfr\n          mpc libelf zlib perl gettext\n          which noSysDirs;\n          texinfo = texinfo4;\n          ppl = null;\n          cloogppl = null;\n          profiledCompiler = !stdenv.isArm;\n          cross = null;\n          libcCross = if crossSystem != null\n            then libcCross\n            else null;\n          libpthreadCross = if crossSystem != null && crossSystem.config == \"i586-pc-gnu\"\n            then gnu.libpthreadCross\n            else null;\n        }));\n        gcc46 = lowPrio (wrapGCC (callPackage ../development/compilers/gcc/4.6 {\n          inherit noSysDirs;\n          ppl = null;\n          cloog = null;\n          profiledCompiler = false;\n          cross = null;\n          libcCross = if crossSystem != null\n            then libcCross\n            else null;\n          libpthreadCross = if crossSystem != null && crossSystem.config == \"i586-pc-gnu\"\n            then gnu.libpthreadCross\n            else null;\n          texinfo = texinfo413;\n        }));\n        gcc48 = lowPrio (wrapGCC (callPackage ../development/compilers/gcc/4.8 {\n          inherit noSysDirs;\n          profiledCompiler = with stdenv; !isDarwin && (isi686 || isx86_64);\n          cross = null;\n          libcCross = if crossSystem != null\n            then libcCross\n            else null;\n          libpthreadCross = if crossSystem != null && crossSystem.config == \"i586-pc-gnu\"\n            then gnu.libpthreadCross\n            else null;\n        }));\n        gcc48_multi = if system == \"x86_64-linux\"\n          then lowPrio (wrapGCCWith (import ../build-support/gcc-wrapper) glibc_multi (gcc48.gcc.override {\n            stdenv = overrideGCC stdenv (wrapGCCWith (import ../build-support/gcc-wrapper) glibc_multi gcc.gcc);\n            profiledCompiler = false;\n            enableMultilib = true;\n          }))\n          else throw \"Multilib gcc not supported on ‘${system}’\";\n        gcc48_debug = lowPrio (wrapGCC (callPackage ../development/compilers/gcc/4.8 {\n          stripped = false;\n          inherit noSysDirs;\n          cross = null;\n          libcCross = null;\n          binutilsCross = null;\n        }));\n        gcc49 = lowPrio (wrapGCC (callPackage ../development/compilers/gcc/4.9 {\n          inherit noSysDirs;\n          profiledCompiler = with stdenv; !isDarwin && (isi686 || isx86_64);\n          cross = null;\n          libcCross = if crossSystem != null\n            then libcCross\n            else null;\n          libpthreadCross = if crossSystem != null && crossSystem.config == \"i586-pc-gnu\"\n            then gnu.libpthreadCross\n            else null;\n        }));\n        gccApple = assert stdenv.isDarwin; wrapGCC (makeOverridable (import ../development/compilers/gcc/4.2-apple64) {\n          inherit fetchurl noSysDirs;\n          profiledCompiler = true;\n          stdenv = allStdenvs.stdenvNative;\n        });\n        gfortran = gfortran48;\n        gfortran48 = wrapGCC (gcc48.gcc.override {\n          name = \"gfortran\";\n          langFortran = true;\n          langCC = false;\n          langC = false;\n          profiledCompiler = false;\n        });\n        gcj = gcj48;\n        gcj48 = wrapGCC (gcc48.gcc.override {\n          name = \"gcj\";\n          langJava = true;\n          langFortran = false;\n          langCC = false;\n          langC = false;\n          profiledCompiler = false;\n          inherit zip unzip zlib boehmgc\n          gettext pkgconfig perl;\n          inherit gtk;\n          inherit (gnome) libart_lgpl;\n          inherit (xlibs) libX11 libXt\n          libSM libICE libXtst libXi\n          libXrender libXrandr xproto\n          renderproto xextproto inputproto\n          randrproto;\n        });\n        gnat = gnat45;\n        gnat45 = wrapGCC (gcc45.gcc.override {\n          name = \"gnat\";\n          langCC = false;\n          langC = true;\n          langAda = true;\n          profiledCompiler = false;\n          inherit gnatboot;\n          cloogppl = null;\n          ppl = null;\n        });\n        gnat46 = wrapGCC (gcc46.gcc.override {\n          name = \"gnat\";\n          langCC = false;\n          langC = true;\n          langAda = true;\n          profiledCompiler = false;\n          gnatboot = gnat45;\n          ppl = null;\n          cloog = null;\n        });\n        gnatboot = wrapGCC (import ../development/compilers/gnatboot {\n          inherit fetchurl stdenv;\n        });\n        gccgo = gccgo48;\n        gccgo48 = wrapGCC (gcc48.gcc.override {\n          name = \"gccgo\";\n          langCC = true;\n          langC = true;\n          langGo = true;\n        });\n        ghdl = wrapGCC (import ../development/compilers/gcc/4.3 {\n          inherit stdenv fetchurl gmp mpfr\n          noSysDirs gnat;\n          texinfo = texinfo4;\n          name = \"ghdl\";\n          langVhdl = true;\n          langCC = false;\n          langC = false;\n          profiledCompiler = false;\n          enableMultilib = false;\n        });\n        ghdl_mcode = callPackage ../development/compilers/ghdl {\n        };\n        gcl = builderDefsPackage ../development/compilers/gcl {\n          inherit mpfr m4 binutils\n          fetchcvs emacs zlib which\n          texinfo;\n          gmp = gmp4;\n          inherit (xlibs) libX11 xproto\n          inputproto libXi libXext\n          xextproto libXt libXaw libXmu;\n          inherit stdenv;\n          texLive = texLiveAggregationFun {\n            paths = [\n              texLive\n              texLiveExtra\n            ];\n          };\n        };\n        jhc = callPackage ../development/compilers/jhc {\n          inherit (haskellPackages_ghc763) ghc\n          binary zlib utf8String readline\n          fgl regexCompat HsSyck random;\n        };\n        gcc-arm-embedded-4_7 = callPackage_i686 ../development/compilers/gcc-arm-embedded {\n          version = \"4.7-2013q3-20130916\";\n          releaseType = \"update\";\n          sha256 = \"1bd9bi9q80xn2rpy0rn1vvj70rh15kb7dmah0qs4q2rv78fqj40d\";\n        };\n        gcc-arm-embedded-4_8 = callPackage_i686 ../development/compilers/gcc-arm-embedded {\n          version = \"4.8-2014q1-20140314\";\n          releaseType = \"update\";\n          sha256 = \"ce92859550819d4a3d1a6e2672ea64882b30afa2c08cf67fa8e1d93788c2c577\";\n        };\n        gcc-arm-embedded = gcc-arm-embedded-4_8;\n        haskell = let\n          pkgs_ = pkgs // {\n            gmp = gmp.override {\n              withStatic = true;\n            };\n          };\n          callPackage = newScope pkgs_;\n          newScope = extra:\n          lib.callPackageWith (pkgs_ // pkgs_.xorg // extra);\n          in callPackage ./haskell-defaults.nix {\n            pkgs = pkgs_;\n            inherit callPackage newScope;\n          };\n        ghc = recurseIntoAttrs (lib.mapAttrs' (name:\n        value:\n        lib.nameValuePair (builtins.substring (builtins.stringLength \"packages_\") (builtins.stringLength name) name) value.ghc) (lib.filterAttrs (name:\n        value:\n        builtins.substring 0 (builtins.stringLength \"packages_\") name == \"packages_\") haskell));\n        haskellPackages = haskellPackages_ghc783;\n        haskellPlatform = haskellPlatformPackages.\"2013_2_0_0\";\n        haskellPackages_ghc6104 = haskell.packages_ghc6104;\n        haskellPackages_ghc6123 = haskell.packages_ghc6123;\n        haskellPackages_ghc704 = haskell.packages_ghc704;\n        haskellPackages_ghc722 = haskell.packages_ghc722;\n        haskellPackages_ghc742 = haskell.packages_ghc742;\n        haskellPackages_ghc763 = haskell.packages_ghc763;\n        haskellPackages_ghc783_no_profiling = recurseIntoAttrs haskell.packages_ghc783.noProfiling;\n        haskellPackages_ghc783_profiling = recurseIntoAttrs haskell.packages_ghc783.profiling;\n        haskellPackages_ghc783 = recurseIntoAttrs haskell.packages_ghc783.highPrio;\n        haskellPackages_ghcHEAD = haskell.packages_ghcHEAD;\n        haskellPlatformPackages = recurseIntoAttrs (import ../development/libraries/haskell/haskell-platform {\n          inherit pkgs;\n        });\n        haxe = callPackage ../development/compilers/haxe {\n        };\n        hhvm = callPackage ../development/compilers/hhvm {\n        };\n        hiphopvm = hhvm;\n        falcon = builderDefsPackage (import ../development/interpreters/falcon) {\n          inherit cmake;\n        };\n        fsharp = callPackage ../development/compilers/fsharp {\n        };\n        go_1_0 = callPackage ../development/compilers/go {\n        };\n        go_1_1 = if stdenv.isDarwin\n          then callPackage ../development/compilers/go/1.1-darwin.nix {\n          }\n          else callPackage ../development/compilers/go/1.1.nix {\n          };\n        go_1_2 = callPackage ../development/compilers/go/1.2.nix {\n        };\n        go_1_3 = callPackage ../development/compilers/go/1.3.nix {\n        };\n        go = go_1_3;\n        gox = callPackage ../development/compilers/go/gox.nix {\n        };\n        gprolog = callPackage ../development/compilers/gprolog {\n        };\n        gwt240 = callPackage ../development/compilers/gwt/2.4.0.nix {\n        };\n        icedtea7_jdk = callPackage ../development/compilers/icedtea rec {\n          jdk = openjdk;\n          jdkPath = \"${openjdk}/lib/openjdk\";\n        } // { outputs = [ \"out\" ]; };\n        icedtea7_jre = lib.setName \"icedtea7-${lib.getVersion pkgs.icedtea7_jdk.jre}\" (lib.addMetaAttrs {\n          description = \"Free Java runtime environment based on OpenJDK 7.0 and the IcedTea project\";\n        } pkgs.icedtea7_jdk.jre) // {\n          outputs = [ \"jre\" ];\n        };\n        icedtea7_web = callPackage ../development/compilers/icedtea-web {\n          jdk = \"${icedtea7_jdk}/lib/icedtea\";\n        };\n        ikarus = callPackage ../development/compilers/ikarus {\n        };\n        hugs = callPackage ../development/compilers/hugs {\n        };\n        path64 = callPackage ../development/compilers/path64 {\n        };\n        openjdk = if stdenv.isDarwin\n          then callPackage ../development/compilers/openjdk-darwin {\n          }\n          else let\n            openjdkBootstrap = callPackage ../development/compilers/openjdk/bootstrap.nix {\n            };\n            in callPackage ../development/compilers/openjdk {\n              jdk = openjdkBootstrap;\n            } // { outputs = [ \"out\" ]; };\n        openjre = lib.setName \"openjre-${lib.getVersion pkgs.openjdk.jre}\" (lib.addMetaAttrs {\n          description = \"The open-source Java Runtime Environment\";\n        } pkgs.openjdk.jre) // {\n          outputs = [ \"jre\" ];\n        };\n        jdk = if stdenv.isDarwin || stdenv.system == \"i686-linux\" || stdenv.system == \"x86_64-linux\"\n          then pkgs.openjdk\n          else pkgs.oraclejdk;\n        jre = if stdenv.isDarwin || stdenv.system == \"i686-linux\" || stdenv.system == \"x86_64-linux\"\n          then pkgs.openjre\n          else pkgs.oraclejre;\n        oraclejdk = pkgs.jdkdistro true false;\n        oraclejdk7 = pkgs.oraclejdk7distro true false;\n        oraclejdk8 = pkgs.oraclejdk8distro true false;\n        oraclejre = lowPrio (pkgs.jdkdistro false false);\n        oraclejre7 = lowPrio (pkgs.oraclejdk7distro false false);\n        oraclejre8 = lowPrio (pkgs.oraclejdk8distro false false);\n        jrePlugin = lowPrio (pkgs.jdkdistro false true);\n        supportsJDK = system == \"i686-linux\" || system == \"x86_64-linux\";\n        jdkdistro = installjdk:\n        pluginSupport:\n        assert supportsJDK; (if pluginSupport\n          then appendToName \"with-plugin\"\n          else x:\n          x) (callPackage ../development/compilers/oraclejdk/jdk6-linux.nix {\n        });\n        oraclejdk7distro = installjdk:\n        pluginSupport:\n        assert supportsJDK; (if pluginSupport\n          then appendToName \"with-plugin\"\n          else x:\n          x) (callPackage ../development/compilers/oraclejdk/jdk7-linux.nix {\n          inherit installjdk;\n        });\n        oraclejdk8distro = installjdk:\n        pluginSupport:\n        assert supportsJDK; (if pluginSupport\n          then appendToName \"with-plugin\"\n          else x:\n          x) (callPackage ../development/compilers/oraclejdk/jdk8-linux.nix {\n          inherit installjdk;\n        });\n        jikes = callPackage ../development/compilers/jikes {\n        };\n        juliaGit = callPackage ../development/compilers/julia/git-20131013.nix {\n          liblapack = liblapack.override {\n            shared = true;\n          };\n          llvm = llvm_33;\n        };\n        julia021 = callPackage ../development/compilers/julia/0.2.1.nix {\n          liblapack = liblapack.override {\n            shared = true;\n          };\n          llvm = llvm_33;\n        };\n        julia030 = let\n          liblapack = liblapack_3_5_0.override {\n            shared = true;\n          };\n          in callPackage ../development/compilers/julia/0.3.0.nix {\n            inherit liblapack;\n            suitesparse = suitesparse.override {\n              inherit liblapack;\n            };\n            openblas = openblas_0_2_10;\n            llvm = llvm_34;\n          };\n        julia = julia021;\n        lazarus = builderDefsPackage (import ../development/compilers/fpc/lazarus.nix) {\n          inherit makeWrapper gtk glib\n          pango atk gdk_pixbuf;\n          inherit (xlibs) libXi inputproto\n          libX11 xproto libXext xextproto;\n          fpc = fpc;\n        };\n        lessc = callPackage ../development/compilers/lessc {\n        };\n        llvm = llvmPackages.llvm;\n        llvm_34 = llvmPackages_34.llvm;\n        llvm_33 = llvm_v ../development/compilers/llvm/3.3/llvm.nix;\n        llvm_v = path:\n        callPackage path {\n          stdenv = if stdenv.isDarwin\n            then stdenvApple\n            else stdenv;\n        };\n        llvmPackages = if !stdenv.isDarwin\n          then llvmPackages_34\n          else llvmPackages_34 // {\n            llvm = llvm_33;\n            clang = clang_33;\n          };\n        llvmPackages_34 = recurseIntoAttrs (import ../development/compilers/llvm/3.4 {\n          inherit stdenv newScope\n          fetchurl;\n          isl = isl_0_12;\n        });\n        llvmPackagesSelf = import ../development/compilers/llvm/3.4 {\n          inherit newScope fetchurl;\n          isl = isl_0_12;\n          stdenv = libcxxStdenv;\n        };\n        manticore = callPackage ../development/compilers/manticore {\n        };\n        mentorToolchains = recurseIntoAttrs (callPackage_i686 ../development/compilers/mentor {\n        });\n        mercury = callPackage ../development/compilers/mercury {\n        };\n        mitscheme = callPackage ../development/compilers/mit-scheme {\n        };\n        mlton = callPackage ../development/compilers/mlton {\n        };\n        mono = callPackage ../development/compilers/mono {\n          inherit (xlibs) libX11;\n        };\n        monoDLLFixer = callPackage ../build-support/mono-dll-fixer {\n        };\n        mozart = callPackage ../development/compilers/mozart {\n        };\n        neko = callPackage ../development/compilers/neko {\n        };\n        nasm = callPackage ../development/compilers/nasm {\n        };\n        nvidia_cg_toolkit = callPackage ../development/compilers/nvidia-cg-toolkit {\n        };\n        ocaml = ocamlPackages.ocaml;\n        ocaml_3_08_0 = callPackage ../development/compilers/ocaml/3.08.0.nix {\n        };\n        ocaml_3_10_0 = callPackage ../development/compilers/ocaml/3.10.0.nix {\n        };\n        ocaml_3_11_2 = callPackage ../development/compilers/ocaml/3.11.2.nix {\n        };\n        ocaml_3_12_1 = callPackage ../development/compilers/ocaml/3.12.1.nix {\n        };\n        ocaml_4_00_1 = callPackage ../development/compilers/ocaml/4.00.1.nix {\n        };\n        ocaml_4_01_0 = callPackage ../development/compilers/ocaml/4.01.0.nix {\n        };\n        orc = callPackage ../development/compilers/orc {\n        };\n        metaocaml_3_09 = callPackage ../development/compilers/ocaml/metaocaml-3.09.nix {\n        };\n        ber_metaocaml_003 = callPackage ../development/compilers/ocaml/ber-metaocaml-003.nix {\n        };\n        mkOcamlPackages = ocaml: self:\n        let\n          callPackage = newScope self;\n          in rec {\n            inherit ocaml;\n            camlidl = callPackage ../development/tools/ocaml/camlidl {\n            };\n            camlp5_5_strict = callPackage ../development/tools/ocaml/camlp5/5.15.nix {\n            };\n            camlp5_5_transitional = callPackage ../development/tools/ocaml/camlp5/5.15.nix {\n              transitional = true;\n            };\n            camlp5_6_strict = callPackage ../development/tools/ocaml/camlp5 {\n            };\n            camlp5_6_transitional = callPackage ../development/tools/ocaml/camlp5 {\n              transitional = true;\n            };\n            camlp5_strict = camlp5_6_strict;\n            camlp5_transitional = camlp5_6_transitional;\n            camlzip = callPackage ../development/ocaml-modules/camlzip {\n            };\n            camomile_0_8_2 = callPackage ../development/ocaml-modules/camomile/0.8.2.nix {\n            };\n            camomile = callPackage ../development/ocaml-modules/camomile {\n            };\n            camlimages = callPackage ../development/ocaml-modules/camlimages {\n              libpng = libpng12;\n              giflib = giflib_4_1;\n            };\n            biniou = callPackage ../development/ocaml-modules/biniou {\n            };\n            ocaml_cairo = callPackage ../development/ocaml-modules/ocaml-cairo {\n            };\n            cppo = callPackage ../development/tools/ocaml/cppo {\n            };\n            cryptokit = callPackage ../development/ocaml-modules/cryptokit {\n            };\n            csv = callPackage ../development/ocaml-modules/csv {\n            };\n            deriving = callPackage ../development/tools/ocaml/deriving {\n            };\n            easy-format = callPackage ../development/ocaml-modules/easy-format {\n            };\n            findlib = callPackage ../development/tools/ocaml/findlib {\n            };\n            javalib = callPackage ../development/ocaml-modules/javalib {\n              extlib = ocaml_extlib_maximal;\n            };\n            dypgen = callPackage ../development/ocaml-modules/dypgen {\n            };\n            patoline = callPackage ../tools/typesetting/patoline {\n            };\n            gmetadom = callPackage ../development/ocaml-modules/gmetadom {\n            };\n            lablgl = callPackage ../development/ocaml-modules/lablgl {\n            };\n            lablgtk = callPackage ../development/ocaml-modules/lablgtk {\n              inherit (gnome) libgnomecanvas\n              libglade gtksourceview;\n            };\n            lablgtkmathview = callPackage ../development/ocaml-modules/lablgtkmathview {\n              gtkmathview = callPackage ../development/libraries/gtkmathview {\n              };\n            };\n            menhir = callPackage ../development/ocaml-modules/menhir {\n            };\n            merlin = callPackage ../development/tools/ocaml/merlin {\n            };\n            mldonkey = callPackage ../applications/networking/p2p/mldonkey {\n            };\n            mlgmp = callPackage ../development/ocaml-modules/mlgmp {\n            };\n            ocaml_batteries = callPackage ../development/ocaml-modules/batteries {\n            };\n            ocaml_cryptgps = callPackage ../development/ocaml-modules/cryptgps {\n            };\n            ocaml_data_notation = callPackage ../development/ocaml-modules/odn {\n            };\n            ocaml_expat = callPackage ../development/ocaml-modules/expat {\n            };\n            ocamlgraph = callPackage ../development/ocaml-modules/ocamlgraph {\n            };\n            ocaml_http = callPackage ../development/ocaml-modules/http {\n            };\n            ocamlify = callPackage ../development/tools/ocaml/ocamlify {\n            };\n            ocaml_lwt = callPackage ../development/ocaml-modules/lwt {\n            };\n            ocamlmod = callPackage ../development/tools/ocaml/ocamlmod {\n            };\n            ocaml_mysql = callPackage ../development/ocaml-modules/mysql {\n            };\n            ocamlnet = callPackage ../development/ocaml-modules/ocamlnet {\n            };\n            ocaml_oasis = callPackage ../development/tools/ocaml/oasis {\n            };\n            ocaml_pcre = callPackage ../development/ocaml-modules/pcre {\n              inherit pcre;\n            };\n            ocaml_react = callPackage ../development/ocaml-modules/react {\n            };\n            ocamlsdl = callPackage ../development/ocaml-modules/ocamlsdl {\n            };\n            ocaml_sqlite3 = callPackage ../development/ocaml-modules/sqlite3 {\n            };\n            ocaml_ssl = callPackage ../development/ocaml-modules/ssl {\n            };\n            ounit = callPackage ../development/ocaml-modules/ounit {\n            };\n            ulex = callPackage ../development/ocaml-modules/ulex {\n            };\n            ulex08 = callPackage ../development/ocaml-modules/ulex/0.8 {\n              camlp5 = camlp5_transitional;\n            };\n            ocaml_typeconv = callPackage ../development/ocaml-modules/typeconv {\n            };\n            ocaml_typeconv_3_0_5 = callPackage ../development/ocaml-modules/typeconv/3.0.5.nix {\n            };\n            ocaml_sexplib = callPackage ../development/ocaml-modules/sexplib {\n            };\n            ocaml_extlib = callPackage ../development/ocaml-modules/extlib {\n            };\n            ocaml_extlib_maximal = callPackage ../development/ocaml-modules/extlib {\n              minimal = false;\n            };\n            pycaml = callPackage ../development/ocaml-modules/pycaml {\n            };\n            opam_1_0_0 = callPackage ../development/tools/ocaml/opam/1.0.0.nix {\n            };\n            opam_1_1 = callPackage ../development/tools/ocaml/opam/1.1.nix {\n            };\n            opam = opam_1_1;\n            sawja = callPackage ../development/ocaml-modules/sawja {\n            };\n            uucd = callPackage ../development/ocaml-modules/uucd {\n            };\n            uunf = callPackage ../development/ocaml-modules/uunf {\n            };\n            uutf = callPackage ../development/ocaml-modules/uutf {\n            };\n            xmlm = callPackage ../development/ocaml-modules/xmlm {\n            };\n            yojson = callPackage ../development/ocaml-modules/yojson {\n            };\n            zarith = callPackage ../development/ocaml-modules/zarith {\n            };\n          };\n        ocamlPackages = recurseIntoAttrs ocamlPackages_4_01_0;\n        ocamlPackages_3_10_0 = mkOcamlPackages ocaml_3_10_0 pkgs.ocamlPackages_3_10_0;\n        ocamlPackages_3_11_2 = mkOcamlPackages ocaml_3_11_2 pkgs.ocamlPackages_3_11_2;\n        ocamlPackages_3_12_1 = mkOcamlPackages ocaml_3_12_1 pkgs.ocamlPackages_3_12_1;\n        ocamlPackages_4_00_1 = mkOcamlPackages ocaml_4_00_1 pkgs.ocamlPackages_4_00_1;\n        ocamlPackages_4_01_0 = mkOcamlPackages ocaml_4_01_0 pkgs.ocamlPackages_4_01_0;\n        ocamlPackages_latest = ocamlPackages_4_01_0;\n        ocaml_make = callPackage ../development/ocaml-modules/ocamlmake {\n        };\n        opa = let\n          callPackage = newScope pkgs.ocamlPackages_4_00_1;\n          in callPackage ../development/compilers/opa {\n          };\n        ocamlnat = let\n          callPackage = newScope pkgs.ocamlPackages_3_12_1;\n          in callPackage ../development/ocaml-modules/ocamlnat {\n          };\n        qcmm = callPackage ../development/compilers/qcmm {\n          lua = lua4;\n          ocaml = ocaml_3_08_0;\n        };\n        roadsend = callPackage ../development/compilers/roadsend {\n        };\n        rustc = callPackage ../development/compilers/rustc/0.11.nix {\n        };\n        rustcMaster = callPackage ../development/compilers/rustc/head.nix {\n        };\n        rust = rustc;\n        sbclBootstrap = callPackage ../development/compilers/sbcl/bootstrap.nix {\n        };\n        sbcl = callPackage ../development/compilers/sbcl {\n          clisp = clisp;\n        };\n        scala_2_9 = callPackage ../development/compilers/scala/2.9.nix {\n        };\n        scala_2_10 = callPackage ../development/compilers/scala/2.10.nix {\n        };\n        scala_2_11 = callPackage ../development/compilers/scala {\n        };\n        scala = scala_2_11;\n        sdcc = callPackage ../development/compilers/sdcc {\n        };\n        smlnjBootstrap = callPackage ../development/compilers/smlnj/bootstrap.nix {\n        };\n        smlnj = callPackage_i686 ../development/compilers/smlnj {\n        };\n        stalin = callPackage ../development/compilers/stalin {\n        };\n        strategoPackages = recurseIntoAttrs strategoPackages018;\n        strategoPackages016 = callPackage ../development/compilers/strategoxt/0.16.nix {\n          stdenv = overrideInStdenv stdenv [\n            gnumake380\n          ];\n        };\n        strategoPackages017 = callPackage ../development/compilers/strategoxt/0.17.nix {\n          readline = readline5;\n        };\n        strategoPackages018 = callPackage ../development/compilers/strategoxt/0.18.nix {\n          readline = readline5;\n        };\n        metaBuildEnv = callPackage ../development/compilers/meta-environment/meta-build-env {\n        };\n        swiProlog = callPackage ../development/compilers/swi-prolog {\n        };\n        tbb = callPackage ../development/libraries/tbb {\n        };\n        tinycc = callPackage ../development/compilers/tinycc {\n        };\n        urweb = callPackage ../development/compilers/urweb {\n        };\n        vala = callPackage ../development/compilers/vala/default.nix {\n        };\n        visualcpp = callPackage ../development/compilers/visual-c++ {\n        };\n        vs90wrapper = callPackage ../development/compilers/vs90wrapper {\n        };\n        webdsl = callPackage ../development/compilers/webdsl {\n        };\n        win32hello = callPackage ../development/compilers/visual-c++/test {\n        };\n        wrapGCCWith = gccWrapper: glibc:\n        baseGCC: gccWrapper {\n          nativeTools = stdenv ? gcc && stdenv.gcc.nativeTools;\n          nativeLibc = stdenv ? gcc && stdenv.gcc.nativeLibc;\n          nativePrefix = if stdenv ? gcc\n            then stdenv.gcc.nativePrefix\n            else \"\";\n          gcc = baseGCC;\n          libc = glibc;\n          shell = bash;\n          inherit stdenv binutils\n          coreutils zlib;\n        };\n        wrapClangWith = clangWrapper:\n        glibc: baseClang: clangWrapper {\n          nativeTools = stdenv.gcc.nativeTools or false;\n          nativeLibc = stdenv.gcc.nativeLibc or false;\n          nativePrefix = stdenv.gcc.nativePrefix or \"\";\n          clang = baseClang;\n          libc = glibc;\n          shell = bash;\n          binutils = stdenv.gcc.binutils;\n          inherit stdenv coreutils zlib;\n        };\n        wrapClang = wrapClangWith (makeOverridable (import ../build-support/clang-wrapper)) glibc;\n        wrapGCC = wrapGCCWith (makeOverridable (import ../build-support/gcc-wrapper)) glibc;\n        wrapGCCCross = { binutils, cross, gcc, libc, name ? \"gcc-cross-wrapper\", shell ? \"\" }:\n        forceNativeDrv (import ../build-support/gcc-cross-wrapper {\n          nativeTools = false;\n          nativeLibc = false;\n          noLibc = libc == null;\n          inherit stdenv gcc binutils libc\n          shell name cross;\n        });\n        yap = callPackage ../development/compilers/yap {\n        };\n        yasm = callPackage ../development/compilers/yasm {\n        };\n        acl2 = builderDefsPackage ../development/interpreters/acl2 {\n          inherit sbcl;\n        };\n        angelscript = callPackage ../development/interpreters/angelscript {\n        };\n        clisp = callPackage ../development/interpreters/clisp {\n        };\n        clisp_2_44_1 = callPackage ../development/interpreters/clisp/2.44.1.nix {\n          libsigsegv = libsigsegv_25;\n        };\n        clojure = callPackage ../development/interpreters/clojure {\n        };\n        clooj = callPackage ../development/interpreters/clojure/clooj.nix {\n        };\n        erlangR14 = callPackage ../development/interpreters/erlang/R14.nix {\n        };\n        erlangR15 = callPackage ../development/interpreters/erlang/R15.nix {\n        };\n        erlangR16 = callPackage ../development/interpreters/erlang/R16.nix {\n        };\n        erlangR17 = callPackage ../development/interpreters/erlang/R17.nix {\n        };\n        erlang = erlangR17;\n        rebar = callPackage ../development/tools/build-managers/rebar {\n        };\n        elixir = callPackage ../development/interpreters/elixir {\n        };\n        groovy = callPackage ../development/interpreters/groovy {\n        };\n        guile_1_8 = callPackage ../development/interpreters/guile/1.8.nix {\n        };\n        guile_2_0 = callPackage ../development/interpreters/guile {\n        };\n        guile = guile_2_0;\n        hadoop = callPackage ../applications/networking/cluster/hadoop {\n        };\n        io = callPackage ../development/interpreters/io {\n        };\n        j = callPackage ../development/interpreters/j {\n        };\n        jmeter = callPackage ../applications/networking/jmeter {\n        };\n        davmail = callPackage ../applications/networking/davmail {\n        };\n        lxappearance = callPackage ../applications/misc/lxappearance {\n        };\n        kona = callPackage ../development/interpreters/kona {\n        };\n        love = callPackage ../development/interpreters/love {\n          lua = lua5;\n        };\n        love_luajit = callPackage ../development/interpreters/love {\n          lua = luajit;\n        };\n        love_0_9 = callPackage ../development/interpreters/love/0.9.nix {\n        };\n        lua4 = callPackage ../development/interpreters/lua-4 {\n        };\n        lua5_0 = callPackage ../development/interpreters/lua-5/5.0.3.nix {\n        };\n        lua5_1 = callPackage ../development/interpreters/lua-5/5.1.nix {\n        };\n        lua5_2 = callPackage ../development/interpreters/lua-5/5.2.nix {\n        };\n        lua5_2_compat = callPackage ../development/interpreters/lua-5/5.2.nix {\n          compat = true;\n        };\n        lua5 = lua5_1;\n        lua = lua5;\n        lua5_sockets = callPackage ../development/interpreters/lua-5/sockets.nix {\n        };\n        lua5_expat = callPackage ../development/interpreters/lua-5/expat.nix {\n        };\n        lua5_filesystem = callPackage ../development/interpreters/lua-5/filesystem.nix {\n        };\n        lua5_sec = callPackage ../development/interpreters/lua-5/sec.nix {\n        };\n        luarocks = callPackage ../development/tools/misc/luarocks {\n          lua = lua5;\n        };\n        luajit = callPackage ../development/interpreters/luajit {\n        };\n        lush2 = callPackage ../development/interpreters/lush {\n        };\n        maude = callPackage ../development/interpreters/maude {\n          bison = bison2;\n          flex = flex_2_5_35;\n        };\n        mesos = callPackage ../applications/networking/cluster/mesos {\n          sasl = cyrus_sasl;\n          automake = automake114x;\n          inherit (pythonPackages) python\n          boto setuptools distutils-cfg\n          wrapPython;\n          pythonProtobuf = pythonPackages.protobuf;\n        };\n        octave = callPackage ../development/interpreters/octave {\n          fltk = fltk13;\n          qt = null;\n          ghostscript = null;\n          llvm = null;\n          hdf5 = null;\n          glpk = null;\n          suitesparse = null;\n          openjdk = null;\n          gnuplot = null;\n          readline = readline63;\n        };\n        octaveFull = lowPrio (callPackage ../development/interpreters/octave {\n          fltk = fltk13;\n          qt = qt4;\n        });\n        octaveHG = callPackage ../development/interpreters/octave/hg.nix {\n        };\n        ocropus = callPackage ../applications/misc/ocropus {\n        };\n        perl514 = callPackage ../development/interpreters/perl/5.14 {\n        };\n        perl516 = callPackage ../development/interpreters/perl/5.16 {\n          fetchurl = fetchurlBoot;\n        };\n        perl520 = callPackage ../development/interpreters/perl/5.20 {\n        };\n        perl = if system != \"i686-cygwin\"\n          then perl516\n          else sysPerl;\n        php = php54;\n        phpPackages = recurseIntoAttrs (import ./php-packages.nix {\n          inherit php pkgs;\n        });\n        php53 = callPackage ../development/interpreters/php/5.3.nix {\n        };\n        php_fpm53 = callPackage ../development/interpreters/php/5.3.nix {\n          config = config // {\n            php = (config.php or { }) // {\n              fpm = true;\n              apxs2 = false;\n            };\n          };\n        };\n        php54 = callPackage ../development/interpreters/php/5.4.nix {\n        };\n        picolisp = callPackage ../development/interpreters/picolisp {\n        };\n        pltScheme = racket;\n        polyml = callPackage ../development/compilers/polyml {\n        };\n        pure = callPackage ../development/interpreters/pure {\n          llvm = llvm_33;\n        };\n        python = python2;\n        python2 = python27;\n        python3 = python34;\n        pythonPackages = python2Packages;\n        python2Packages = python27Packages;\n        python3Packages = python34Packages;\n        pythonFull = python2Full;\n        python2Full = python27Full;\n        python26 = callPackage ../development/interpreters/python/2.6 {\n          db = db47;\n        };\n        python27 = callPackage ../development/interpreters/python/2.7 {\n        };\n        python32 = callPackage ../development/interpreters/python/3.2 {\n        };\n        python33 = callPackage ../development/interpreters/python/3.3 {\n        };\n        python34 = hiPrio (callPackage ../development/interpreters/python/3.4 {\n        });\n        pypy = callPackage ../development/interpreters/pypy/2.3 {\n        };\n        python26Full = callPackage ../development/interpreters/python/wrapper.nix {\n          extraLibs = [ ];\n          postBuild = \"\";\n          python = python26;\n          inherit (python26Packages) recursivePthLoader;\n        };\n        python27Full = callPackage ../development/interpreters/python/wrapper.nix {\n          extraLibs = [ ];\n          postBuild = \"\";\n          python = python27;\n          inherit (python27Packages) recursivePthLoader;\n        };\n        pythonDocs = recurseIntoAttrs (import ../development/interpreters/python/docs {\n          inherit stdenv fetchurl lib;\n        });\n        pythonLinkmeWrapper = callPackage ../development/interpreters/python/python-linkme-wrapper.nix {\n        };\n        pypi2nix = python27Packages.pypi2nix;\n        pyrex = pyrex095;\n        pyrex095 = callPackage ../development/interpreters/pyrex/0.9.5.nix {\n        };\n        pyrex096 = callPackage ../development/interpreters/pyrex/0.9.6.nix {\n        };\n        qi = callPackage ../development/compilers/qi {\n        };\n        racket = callPackage ../development/interpreters/racket {\n        };\n        rakudo = callPackage ../development/interpreters/rakudo {\n        };\n        rascal = callPackage ../development/interpreters/rascal {\n        };\n        regina = callPackage ../development/interpreters/regina {\n        };\n        renpy = callPackage ../development/interpreters/renpy {\n          wrapPython = pythonPackages.wrapPython;\n        };\n        ruby18 = callPackage ../development/interpreters/ruby/ruby-18.nix {\n        };\n        ruby19 = callPackage ../development/interpreters/ruby/ruby-19.nix {\n        };\n        ruby2 = lowPrio (callPackage ../development/interpreters/ruby/ruby-2.0.nix {\n        });\n        ruby = ruby19;\n        rubyLibs = recurseIntoAttrs (callPackage ../development/interpreters/ruby/libs.nix {\n        });\n        rake = rubyLibs.rake;\n        rubySqlite3 = callPackage ../development/ruby-modules/sqlite3 {\n        };\n        rubygemsFun = ruby:\n        builderDefsPackage (import ../development/interpreters/ruby/rubygems.nix) {\n          inherit ruby makeWrapper;\n        };\n        rubygems = hiPrio (rubygemsFun ruby);\n        rq = callPackage ../applications/networking/cluster/rq {\n        };\n        scsh = callPackage ../development/interpreters/scsh {\n        };\n        scheme48 = callPackage ../development/interpreters/scheme48 {\n        };\n        spark = callPackage ../applications/networking/cluster/spark {\n        };\n        spidermonkey = callPackage ../development/interpreters/spidermonkey {\n        };\n        spidermonkey_1_8_0rc1 = callPackage ../development/interpreters/spidermonkey/1.8.0-rc1.nix {\n        };\n        spidermonkey_185 = callPackage ../development/interpreters/spidermonkey/185-1.0.0.nix {\n        };\n        spidermonkey_17 = callPackage ../development/interpreters/spidermonkey/17.0.nix {\n        };\n        spidermonkey_24 = callPackage ../development/interpreters/spidermonkey/24.2.nix {\n        };\n        supercollider = callPackage ../development/interpreters/supercollider {\n          qt = qt4;\n          fftw = fftwSinglePrec;\n        };\n        supercollider_scel = supercollider.override {\n          useSCEL = true;\n        };\n        sysPerl = callPackage ../development/interpreters/perl/sys-perl {\n        };\n        tcl = callPackage ../development/interpreters/tcl {\n        };\n        xulrunner = callPackage ../development/interpreters/xulrunner {\n          inherit (gnome) libIDL;\n          inherit (pythonPackages) pysqlite;\n        };\n        xulrunner_30 = firefox30Pkgs.xulrunner;\n        amdadlsdk = callPackage ../development/misc/amdadl-sdk {\n        };\n        amdappsdk26 = callPackage ../development/misc/amdapp-sdk {\n          version = \"2.6\";\n        };\n        amdappsdk27 = callPackage ../development/misc/amdapp-sdk {\n          version = \"2.7\";\n        };\n        amdappsdk28 = callPackage ../development/misc/amdapp-sdk {\n          version = \"2.8\";\n        };\n        amdappsdk = amdappsdk28;\n        amdappsdkFull = callPackage ../development/misc/amdapp-sdk {\n          version = \"2.8\";\n          samples = true;\n        };\n        avrgcclibc = callPackage ../development/misc/avr-gcc-with-avr-libc {\n          gcc = gcc46;\n          stdenv = overrideGCC stdenv gcc46;\n        };\n        avr8burnomat = callPackage ../development/misc/avr8-burn-omat {\n        };\n        sourceFromHead = import ../build-support/source-from-head-fun.nix {\n          inherit config;\n        };\n        ecj = callPackage ../development/eclipse/ecj {\n        };\n        jdtsdk = callPackage ../development/eclipse/jdt-sdk {\n        };\n        jruby165 = callPackage ../development/interpreters/jruby {\n        };\n        guileCairo = callPackage ../development/guile-modules/guile-cairo {\n        };\n        guileGnome = callPackage ../development/guile-modules/guile-gnome {\n          gconf = gnome.GConf;\n          inherit (gnome) gnome_vfs\n          libglade libgnome libgnomecanvas\n          libgnomeui;\n        };\n        guile_lib = callPackage ../development/guile-modules/guile-lib {\n        };\n        guile_ncurses = callPackage ../development/guile-modules/guile-ncurses {\n        };\n        guile-xcb = callPackage ../development/guile-modules/guile-xcb {\n        };\n        pharo-vm = callPackage_i686 ../development/pharo/vm {\n        };\n        srecord = callPackage ../development/tools/misc/srecord {\n        };\n        windowssdk = import ../development/misc/windows-sdk {\n          inherit fetchurl stdenv\n          cabextract;\n        };\n        ansible = callPackage ../tools/system/ansible {\n        };\n        antlr = callPackage ../development/tools/parsing/antlr/2.7.7.nix {\n        };\n        antlr3 = callPackage ../development/tools/parsing/antlr {\n        };\n        ant = apacheAnt;\n        apacheAnt = callPackage ../development/tools/build-managers/apache-ant {\n        };\n        astyle = callPackage ../development/tools/misc/astyle {\n        };\n        autobuild = callPackage ../development/tools/misc/autobuild {\n        };\n        autoconf = callPackage ../development/tools/misc/autoconf {\n        };\n        autoconf213 = callPackage ../development/tools/misc/autoconf/2.13.nix {\n        };\n        autocutsel = callPackage ../tools/X11/autocutsel {\n        };\n        automake = automake112x;\n        automake111x = callPackage ../development/tools/misc/automake/automake-1.11.x.nix {\n        };\n        automake112x = callPackage ../development/tools/misc/automake/automake-1.12.x.nix {\n        };\n        automake113x = callPackage ../development/tools/misc/automake/automake-1.13.x.nix {\n        };\n        automake114x = callPackage ../development/tools/misc/automake/automake-1.14.x.nix {\n        };\n        automoc4 = callPackage ../development/tools/misc/automoc4 {\n        };\n        avrdude = callPackage ../development/tools/misc/avrdude {\n        };\n        avarice = callPackage ../development/tools/misc/avarice {\n        };\n        babeltrace = callPackage ../development/tools/misc/babeltrace {\n        };\n        bam = callPackage ../development/tools/build-managers/bam {\n        };\n        binutils = callPackage ../development/tools/misc/binutils {\n          inherit noSysDirs;\n        };\n        binutils_nogold = lowPrio (callPackage ../development/tools/misc/binutils {\n          inherit noSysDirs;\n          gold = false;\n        });\n        binutilsCross = if crossSystem != null && crossSystem.libc == \"libSystem\"\n          then darwin.cctools\n          else lowPrio (forceNativeDrv (import ../development/tools/misc/binutils {\n            inherit stdenv fetchurl zlib\n            bison;\n            noSysDirs = true;\n            cross = assert crossSystem != null; crossSystem;\n          }));\n        bison2 = callPackage ../development/tools/parsing/bison/2.x.nix {\n        };\n        bison3 = callPackage ../development/tools/parsing/bison/3.x.nix {\n        };\n        bison = bison3;\n        buildbot = callPackage ../development/tools/build-managers/buildbot {\n          inherit (pythonPackages) twisted\n          jinja2 sqlalchemy\n          sqlalchemy_migrate;\n          dateutil = pythonPackages.dateutil_1_5;\n        };\n        buildbotSlave = callPackage ../development/tools/build-managers/buildbot-slave {\n          inherit (pythonPackages) twisted;\n        };\n        byacc = callPackage ../development/tools/parsing/byacc {\n        };\n        casperjs = callPackage ../development/tools/casperjs {\n        };\n        cbrowser = callPackage ../development/tools/misc/cbrowser {\n        };\n        ccache = callPackage ../development/tools/misc/ccache {\n        };\n        ccacheWrapper = makeOverridable ({ extraConfig ? \"\" }:\n        wrapGCC (ccache.links extraConfig)) {\n        };\n        ccacheStdenv = lowPrio (overrideGCC stdenv ccacheWrapper);\n        cccc = callPackage ../development/tools/analysis/cccc {\n        };\n        cgdb = callPackage ../development/tools/misc/cgdb {\n        };\n        chromedriver = callPackage ../development/tools/selenium/chromedriver {\n          gconf = gnome.GConf;\n        };\n        chrpath = callPackage ../development/tools/misc/chrpath {\n        };\n        \"cl-launch\" = callPackage ../development/tools/misc/cl-launch {\n        };\n        complexity = callPackage ../development/tools/misc/complexity {\n        };\n        ctags = callPackage ../development/tools/misc/ctags {\n        };\n        ctagsWrapped = import ../development/tools/misc/ctags/wrapped.nix {\n          inherit pkgs ctags\n          writeScriptBin;\n        };\n        cmake = callPackage ../development/tools/build-managers/cmake {\n        };\n        cmake264 = callPackage ../development/tools/build-managers/cmake/264.nix {\n        };\n        cmakeCurses = cmake.override {\n          useNcurses = true;\n        };\n        cmakeWithGui = cmakeCurses.override {\n          useQt4 = true;\n        };\n        coccinelle = callPackage ../development/tools/misc/coccinelle {\n        };\n        framac = callPackage ../development/tools/analysis/frama-c {\n        };\n        cppi = callPackage ../development/tools/misc/cppi {\n        };\n        cproto = callPackage ../development/tools/misc/cproto {\n        };\n        cflow = callPackage ../development/tools/misc/cflow {\n        };\n        cov-build = callPackage ../development/tools/analysis/cov-build {\n        };\n        cppcheck = callPackage ../development/tools/analysis/cppcheck {\n        };\n        cscope = callPackage ../development/tools/misc/cscope {\n        };\n        csslint = callPackage ../development/web/csslint {\n        };\n        libcxx = callPackage ../development/libraries/libc++ {\n          stdenv = pkgs.clangStdenv;\n        };\n        libcxxabi = callPackage ../development/libraries/libc++abi {\n          stdenv = pkgs.clangStdenv;\n        };\n        libsigrok = callPackage ../development/tools/libsigrok {\n        };\n        libsigrokdecode = callPackage ../development/tools/libsigrokdecode {\n        };\n        dejagnu = callPackage ../development/tools/misc/dejagnu {\n        };\n        dfeet = callPackage ../development/tools/misc/d-feet {\n          inherit (pythonPackages) pep8;\n        };\n        dfu-programmer = callPackage ../development/tools/misc/dfu-programmer {\n        };\n        ddd = callPackage ../development/tools/misc/ddd {\n        };\n        distcc = callPackage ../development/tools/misc/distcc {\n        };\n        distccWrapper = makeOverridable ({ extraConfig ? \"\" }:\n        wrapGCC (distcc.links extraConfig)) {\n        };\n        distccStdenv = lowPrio (overrideGCC stdenv distccWrapper);\n        distccMasquerade = callPackage ../development/tools/misc/distcc/masq.nix {\n          gccRaw = gcc.gcc;\n          binutils = binutils;\n        };\n        docutils = builderDefsPackage (import ../development/tools/documentation/docutils) {\n          inherit python pil makeWrapper;\n        };\n        doxygen = callPackage ../development/tools/documentation/doxygen {\n          qt4 = null;\n        };\n        doxygen_gui = lowPrio (doxygen.override {\n          inherit qt4;\n        });\n        drush = callPackage ../development/tools/misc/drush {\n        };\n        eggdbus = callPackage ../development/tools/misc/eggdbus {\n        };\n        elfutils = callPackage ../development/tools/misc/elfutils {\n        };\n        epm = callPackage ../development/tools/misc/epm {\n        };\n        emma = callPackage ../development/tools/analysis/emma {\n        };\n        findbugs = callPackage ../development/tools/analysis/findbugs {\n        };\n        pmd = callPackage ../development/tools/analysis/pmd {\n        };\n        jdepend = callPackage ../development/tools/analysis/jdepend {\n        };\n        checkstyle = callPackage ../development/tools/analysis/checkstyle {\n        };\n        flex_2_5_35 = callPackage ../development/tools/parsing/flex/2.5.35.nix {\n        };\n        flex_2_5_39 = callPackage ../development/tools/parsing/flex/2.5.39.nix {\n        };\n        flex = flex_2_5_39;\n        m4 = gnum4;\n        global = callPackage ../development/tools/misc/global {\n        };\n        gnome_doc_utils = callPackage ../development/tools/documentation/gnome-doc-utils {\n        };\n        gnum4 = callPackage ../development/tools/misc/gnum4 {\n        };\n        gnumake380 = callPackage ../development/tools/build-managers/gnumake/3.80 {\n        };\n        gnumake381 = callPackage ../development/tools/build-managers/gnumake/3.81 {\n        };\n        gnumake382 = callPackage ../development/tools/build-managers/gnumake/3.82 {\n        };\n        gnumake40 = callPackage ../development/tools/build-managers/gnumake/4.0 {\n        };\n        gnumake = gnumake382;\n        gob2 = callPackage ../development/tools/misc/gob2 {\n        };\n        gradle = callPackage ../development/tools/build-managers/gradle {\n        };\n        gperf = callPackage ../development/tools/misc/gperf {\n        };\n        gtk_doc = callPackage ../development/tools/documentation/gtk-doc {\n        };\n        gtkdialog = callPackage ../development/tools/misc/gtkdialog {\n        };\n        guileLint = callPackage ../development/tools/guile/guile-lint {\n        };\n        gwrap = callPackage ../development/tools/guile/g-wrap {\n        };\n        help2man = callPackage ../development/tools/misc/help2man {\n          inherit (perlPackages) LocaleGettext;\n        };\n        hyenae = callPackage ../tools/networking/hyenae {\n        };\n        ibus = callPackage ../development/libraries/ibus {\n        };\n        iconnamingutils = callPackage ../development/tools/misc/icon-naming-utils {\n          inherit (perlPackages) XMLSimple;\n        };\n        indent = callPackage ../development/tools/misc/indent {\n        };\n        ino = callPackage ../development/arduino/ino {\n        };\n        inotifyTools = callPackage ../development/tools/misc/inotify-tools {\n        };\n        intel-gpu-tools = callPackage ../development/tools/misc/intel-gpu-tools {\n          inherit (xorg) libpciaccess\n          dri2proto libX11 libXext libXv\n          libXrandr;\n        };\n        ired = callPackage ../development/tools/analysis/radare/ired.nix {\n        };\n        itstool = callPackage ../development/tools/misc/itstool {\n        };\n        jam = callPackage ../development/tools/build-managers/jam {\n        };\n        jikespg = callPackage ../development/tools/parsing/jikespg {\n        };\n        jenkins = callPackage ../development/tools/continuous-integration/jenkins {\n        };\n        lcov = callPackage ../development/tools/analysis/lcov {\n        };\n        leiningen = callPackage ../development/tools/build-managers/leiningen {\n        };\n        libtool = libtool_2;\n        libtool_1_5 = callPackage ../development/tools/misc/libtool {\n        };\n        libtool_2 = callPackage ../development/tools/misc/libtool/libtool2.nix {\n        };\n        lsof = callPackage ../development/tools/misc/lsof {\n        };\n        ltrace = callPackage ../development/tools/misc/ltrace {\n        };\n        lttng-tools = callPackage ../development/tools/misc/lttng-tools {\n        };\n        lttng-ust = callPackage ../development/tools/misc/lttng-ust {\n        };\n        lttv = callPackage ../development/tools/misc/lttv {\n        };\n        mk = callPackage ../development/tools/build-managers/mk {\n        };\n        neoload = callPackage ../development/tools/neoload {\n          licenseAccepted = config.neoload.accept_license or false;\n        };\n        ninja = callPackage ../development/tools/build-managers/ninja {\n        };\n        nixbang = callPackage ../development/tools/misc/nixbang {\n          pythonPackages = python3Packages;\n        };\n        node_webkit = callPackage ../development/tools/node-webkit {\n          gconf = pkgs.gnome.GConf;\n        };\n        noweb = callPackage ../development/tools/literate-programming/noweb {\n        };\n        omake = callPackage ../development/tools/ocaml/omake {\n        };\n        omake_rc1 = callPackage ../development/tools/ocaml/omake/0.9.8.6-rc1.nix {\n        };\n        opengrok = callPackage ../development/tools/misc/opengrok {\n        };\n        openocd = callPackage ../development/tools/misc/openocd {\n        };\n        oprofile = callPackage ../development/tools/profiling/oprofile {\n        };\n        patchelf = callPackage ../development/tools/misc/patchelf {\n        };\n        peg = callPackage ../development/tools/parsing/peg {\n        };\n        phantomjs = callPackage ../development/tools/phantomjs {\n          stdenv = if stdenv.isDarwin\n            then overrideGCC stdenv gccApple\n            else stdenv;\n        };\n        pmccabe = callPackage ../development/tools/misc/pmccabe {\n        };\n        pkgconfig = forceNativeDrv (callPackage ../development/tools/misc/pkgconfig {\n        });\n        pkgconfigUpstream = lowPrio (pkgconfig.override {\n          vanilla = true;\n        });\n        prelink = callPackage ../development/tools/misc/prelink {\n        };\n        premake3 = callPackage ../development/tools/misc/premake/3.nix {\n        };\n        premake4 = callPackage ../development/tools/misc/premake {\n        };\n        premake = premake4;\n        pstack = callPackage ../development/tools/misc/gdb/pstack.nix {\n        };\n        radare = callPackage ../development/tools/analysis/radare {\n          inherit (gnome) vte;\n          lua = lua5;\n          useX11 = config.radare.useX11 or false;\n          pythonBindings = config.radare.pythonBindings or false;\n          rubyBindings = config.radare.rubyBindings or false;\n          luaBindings = config.radare.luaBindings or false;\n        };\n        ragel = callPackage ../development/tools/parsing/ragel {\n        };\n        re2c = callPackage ../development/tools/parsing/re2c {\n        };\n        remake = callPackage ../development/tools/build-managers/remake {\n        };\n        saleae-logic = callPackage ../development/tools/misc/saleae-logic {\n        };\n        seleniumRCBin = callPackage ../development/tools/selenium/remote-control {\n          jre = jdk;\n        };\n        selenium-server-standalone = callPackage ../development/tools/selenium/server {\n        };\n        scons = callPackage ../development/tools/build-managers/scons {\n        };\n        simpleBuildTool = callPackage ../development/tools/build-managers/simple-build-tool {\n        };\n        sigrok-cli = callPackage ../development/tools/sigrok-cli {\n        };\n        slimerjs = callPackage ../development/tools/slimerjs {\n        };\n        sloccount = callPackage ../development/tools/misc/sloccount {\n        };\n        smatch = callPackage ../development/tools/analysis/smatch {\n          buildllvmsparse = false;\n          buildc2xml = false;\n        };\n        smc = callPackage ../tools/misc/smc {\n        };\n        sparse = callPackage ../development/tools/analysis/sparse {\n        };\n        speedtest_cli = callPackage ../tools/networking/speedtest-cli {\n        };\n        spin = callPackage ../development/tools/analysis/spin {\n        };\n        splint = callPackage ../development/tools/analysis/splint {\n          flex = flex_2_5_35;\n        };\n        stm32flash = callPackage ../development/tools/misc/stm32flash {\n        };\n        strace = callPackage ../development/tools/misc/strace {\n        };\n        swig = callPackage ../development/tools/misc/swig {\n        };\n        swig2 = callPackage ../development/tools/misc/swig/2.x.nix {\n        };\n        swig3 = callPackage ../development/tools/misc/swig/3.x.nix {\n        };\n        swigWithJava = swig;\n        swfmill = callPackage ../tools/video/swfmill {\n        };\n        swftools = callPackage ../tools/video/swftools {\n        };\n        tcptrack = callPackage ../development/tools/misc/tcptrack {\n        };\n        teensy-loader = callPackage ../development/tools/misc/teensy {\n        };\n        texinfo413 = callPackage ../development/tools/misc/texinfo/4.13a.nix {\n        };\n        texinfo5 = callPackage ../development/tools/misc/texinfo/5.2.nix {\n        };\n        texinfo4 = texinfo413;\n        texinfo = texinfo5;\n        texinfoInteractive = appendToName \"interactive\" (texinfo.override {\n          interactive = true;\n        });\n        texi2html = callPackage ../development/tools/misc/texi2html {\n        };\n        uhd = callPackage ../development/tools/misc/uhd {\n        };\n        uisp = callPackage ../development/tools/misc/uisp {\n        };\n        uncrustify = callPackage ../development/tools/misc/uncrustify {\n        };\n        vagrant = callPackage ../development/tools/vagrant {\n          ruby = ruby2;\n        };\n        gdb = callPackage ../development/tools/misc/gdb {\n          hurd = gnu.hurdCross;\n          readline = readline63;\n          inherit (gnu) mig;\n        };\n        gdbCross = lowPrio (callPackage ../development/tools/misc/gdb {\n          target = crossSystem;\n        });\n        valgrind = callPackage ../development/tools/analysis/valgrind {\n          stdenv = if stdenv.isDarwin\n            then overrideGCC stdenv gccApple\n            else stdenv;\n        };\n        valkyrie = callPackage ../development/tools/analysis/valkyrie {\n        };\n        xc3sprog = callPackage ../development/tools/misc/xc3sprog {\n        };\n        xmlindent = callPackage ../development/web/xmlindent {\n        };\n        xpwn = callPackage ../development/mobile/xpwn {\n        };\n        xxdiff = callPackage ../development/tools/misc/xxdiff {\n          bison = bison2;\n        };\n        yacc = bison;\n        yodl = callPackage ../development/tools/misc/yodl {\n        };\n        a52dec = callPackage ../development/libraries/a52dec {\n        };\n        aacskeys = callPackage ../development/libraries/aacskeys {\n        };\n        aalib = callPackage ../development/libraries/aalib {\n        };\n        accountsservice = callPackage ../development/libraries/accountsservice {\n        };\n        acl = callPackage ../development/libraries/acl {\n        };\n        activemq = callPackage ../development/libraries/apache-activemq {\n        };\n        adns = callPackage ../development/libraries/adns {\n        };\n        afflib = callPackage ../development/libraries/afflib {\n        };\n        agg = callPackage ../development/libraries/agg {\n        };\n        allegro = callPackage ../development/libraries/allegro {\n        };\n        allegro5 = callPackage ../development/libraries/allegro/5.nix {\n        };\n        allegro5unstable = callPackage ../development/libraries/allegro/5-unstable.nix {\n        };\n        amrnb = callPackage ../development/libraries/amrnb {\n        };\n        amrwb = callPackage ../development/libraries/amrwb {\n        };\n        apr = callPackage ../development/libraries/apr {\n        };\n        aprutil = callPackage ../development/libraries/apr-util {\n          bdbSupport = true;\n        };\n        asio = callPackage ../development/libraries/asio {\n        };\n        aspell = callPackage ../development/libraries/aspell {\n        };\n        aspellDicts = recurseIntoAttrs (import ../development/libraries/aspell/dictionaries.nix {\n          inherit fetchurl stdenv aspell\n          which;\n        });\n        aterm = aterm25;\n        aterm25 = callPackage ../development/libraries/aterm/2.5.nix {\n        };\n        aterm28 = lowPrio (callPackage ../development/libraries/aterm/2.8.nix {\n        });\n        attica = callPackage ../development/libraries/attica {\n        };\n        attr = callPackage ../development/libraries/attr {\n        };\n        at_spi2_core = callPackage ../development/libraries/at-spi2-core {\n        };\n        at_spi2_atk = callPackage ../development/libraries/at-spi2-atk {\n        };\n        aqbanking = callPackage ../development/libraries/aqbanking {\n        };\n        aubio = callPackage ../development/libraries/aubio {\n        };\n        audiofile = callPackage ../development/libraries/audiofile {\n        };\n        axis = callPackage ../development/libraries/axis {\n        };\n        babl_0_0_22 = callPackage ../development/libraries/babl/0_0_22.nix {\n        };\n        babl = callPackage ../development/libraries/babl {\n        };\n        beecrypt = callPackage ../development/libraries/beecrypt {\n        };\n        boehmgc = callPackage ../development/libraries/boehm-gc {\n        };\n        boolstuff = callPackage ../development/libraries/boolstuff {\n        };\n        boost144 = callPackage ../development/libraries/boost/1.44.nix {\n        };\n        boost149 = callPackage ../development/libraries/boost/1.49.nix {\n        };\n        boost155 = callPackage ../development/libraries/boost/1.55.nix {\n        };\n        boost = boost155;\n        boostHeaders = callPackage ../development/libraries/boost/header-only-wrapper.nix {\n        };\n        botan = callPackage ../development/libraries/botan {\n        };\n        botanUnstable = callPackage ../development/libraries/botan/unstable.nix {\n        };\n        box2d = callPackage ../development/libraries/box2d {\n        };\n        box2d_2_0_1 = callPackage ../development/libraries/box2d/2.0.1.nix {\n        };\n        buddy = callPackage ../development/libraries/buddy {\n        };\n        bwidget = callPackage ../development/libraries/bwidget {\n        };\n        c-ares = callPackage ../development/libraries/c-ares {\n          fetchurl = fetchurlBoot;\n        };\n        caelum = callPackage ../development/libraries/caelum {\n        };\n        capnproto = callPackage ../development/libraries/capnproto {\n        };\n        scmccid = callPackage ../development/libraries/scmccid {\n        };\n        ccrtp = callPackage ../development/libraries/ccrtp {\n        };\n        ccrtp_1_8 = callPackage ../development/libraries/ccrtp/1.8.nix {\n        };\n        celt = callPackage ../development/libraries/celt {\n        };\n        celt_0_7 = callPackage ../development/libraries/celt/0.7.nix {\n        };\n        celt_0_5_1 = callPackage ../development/libraries/celt/0.5.1.nix {\n        };\n        cgal = callPackage ../development/libraries/CGAL {\n        };\n        cgui = callPackage ../development/libraries/cgui {\n        };\n        check = callPackage ../development/libraries/check {\n        };\n        chipmunk = builderDefsPackage (import ../development/libraries/chipmunk) {\n          inherit cmake freeglut mesa;\n          inherit (xlibs) libX11 xproto\n          inputproto libXi libXmu;\n        };\n        chmlib = callPackage ../development/libraries/chmlib {\n        };\n        chromaprint = callPackage ../development/libraries/chromaprint {\n        };\n        cil = callPackage ../development/libraries/cil {\n        };\n        cilaterm = callPackage ../development/libraries/cil-aterm {\n          stdenv = overrideInStdenv stdenv [\n            gnumake380\n          ];\n        };\n        clanlib = callPackage ../development/libraries/clanlib {\n        };\n        classads = callPackage ../development/libraries/classads {\n        };\n        classpath = callPackage ../development/libraries/java/classpath {\n          javac = gcj;\n          jvm = gcj;\n          gconf = gnome.GConf;\n        };\n        clearsilver = callPackage ../development/libraries/clearsilver {\n        };\n        cln = callPackage ../development/libraries/cln {\n        };\n        clppcre = builderDefsPackage (import ../development/libraries/cl-ppcre) {\n        };\n        clucene_core_2 = callPackage ../development/libraries/clucene-core/2.x.nix {\n        };\n        clucene_core_1 = callPackage ../development/libraries/clucene-core {\n        };\n        clucene_core = clucene_core_1;\n        clutter = callPackage ../development/libraries/clutter {\n        };\n        clutter_1_18 = callPackage ../development/libraries/clutter/1.18.nix {\n          cogl = cogl_1_18;\n        };\n        clutter-gst = callPackage ../development/libraries/clutter-gst {\n        };\n        clutter_gtk = callPackage ../development/libraries/clutter-gtk {\n        };\n        clutter_gtk_0_10 = callPackage ../development/libraries/clutter-gtk/0.10.8.nix {\n        };\n        cminpack = callPackage ../development/libraries/cminpack {\n        };\n        cogl = callPackage ../development/libraries/cogl {\n        };\n        cogl_1_18 = callPackage ../development/libraries/cogl/1.18.nix {\n        };\n        coin3d = callPackage ../development/libraries/coin3d {\n        };\n        commoncpp2 = callPackage ../development/libraries/commoncpp2 {\n        };\n        confuse = callPackage ../development/libraries/confuse {\n        };\n        coredumper = callPackage ../development/libraries/coredumper {\n        };\n        ctl = callPackage ../development/libraries/ctl {\n        };\n        cpp-netlib = callPackage ../development/libraries/cpp-netlib {\n        };\n        cppunit = callPackage ../development/libraries/cppunit {\n        };\n        cppnetlib = callPackage ../development/libraries/cppnetlib {\n          boost = boostHeaders;\n        };\n        cracklib = callPackage ../development/libraries/cracklib {\n        };\n        cryptopp = callPackage ../development/libraries/crypto++ {\n        };\n        cyrus_sasl = callPackage ../development/libraries/cyrus-sasl {\n        };\n        db = db5;\n        db4 = db48;\n        db44 = callPackage ../development/libraries/db/db-4.4.nix {\n        };\n        db45 = callPackage ../development/libraries/db/db-4.5.nix {\n        };\n        db47 = callPackage ../development/libraries/db/db-4.7.nix {\n        };\n        db48 = callPackage ../development/libraries/db/db-4.8.nix {\n        };\n        db5 = db53;\n        db53 = callPackage ../development/libraries/db/db-5.3.nix {\n        };\n        db6 = db60;\n        db60 = callPackage ../development/libraries/db/db-6.0.nix {\n        };\n        dbus = callPackage ../development/libraries/dbus {\n        };\n        dbus_cplusplus = callPackage ../development/libraries/dbus-cplusplus {\n        };\n        dbus_glib = callPackage ../development/libraries/dbus-glib {\n        };\n        dbus_java = callPackage ../development/libraries/java/dbus-java {\n        };\n        dbus_python = callPackage ../development/python-modules/dbus {\n        };\n        dbus_tools = pkgs.dbus.tools;\n        dbus_libs = pkgs.dbus.libs;\n        dbus_daemon = pkgs.dbus.daemon;\n        dhex = callPackage ../applications/editors/dhex {\n        };\n        dclib = callPackage ../development/libraries/dclib {\n        };\n        dillo = callPackage ../applications/networking/browsers/dillo {\n          fltk = fltk13;\n        };\n        directfb = callPackage ../development/libraries/directfb {\n        };\n        dotconf = callPackage ../development/libraries/dotconf {\n        };\n        dssi = callPackage ../development/libraries/dssi {\n        };\n        dragonegg = llvmPackages.dragonegg;\n        dxflib = callPackage ../development/libraries/dxflib {\n        };\n        eigen = callPackage ../development/libraries/eigen {\n        };\n        eigen2 = callPackage ../development/libraries/eigen/2.0.nix {\n        };\n        enchant = callPackage ../development/libraries/enchant {\n        };\n        enet = callPackage ../development/libraries/enet {\n        };\n        enginepkcs11 = callPackage ../development/libraries/enginepkcs11 {\n        };\n        epoxy = callPackage ../development/libraries/epoxy {\n          inherit (xorg) utilmacros\n          libX11;\n        };\n        esdl = callPackage ../development/libraries/esdl {\n        };\n        exiv2 = callPackage ../development/libraries/exiv2 {\n        };\n        expat = callPackage ../development/libraries/expat {\n        };\n        extremetuxracer = builderDefsPackage (import ../games/extremetuxracer) {\n          inherit mesa tcl freeglut SDL\n          SDL_mixer pkgconfig gettext\n          intltool;\n          inherit (xlibs) libX11 xproto\n          libXi inputproto libXmu libXext\n          xextproto libXt libSM libICE;\n          libpng = libpng12;\n        };\n        eventlog = callPackage ../development/libraries/eventlog {\n        };\n        facile = callPackage ../development/libraries/facile {\n        };\n        faac = callPackage ../development/libraries/faac {\n        };\n        faad2 = callPackage ../development/libraries/faad2 {\n        };\n        farsight2 = callPackage ../development/libraries/farsight2 {\n        };\n        farstream = callPackage ../development/libraries/farstream {\n          inherit (gst_all_1) gstreamer\n          gst-plugins-base gst-python\n          gst-plugins-good gst-plugins-bad\n          gst-libav;\n        };\n        fcgi = callPackage ../development/libraries/fcgi {\n        };\n        ffmpeg_0_6 = callPackage ../development/libraries/ffmpeg/0.6.nix {\n          vpxSupport = !stdenv.isMips;\n        };\n        ffmpeg_0_6_90 = callPackage ../development/libraries/ffmpeg/0.6.90.nix {\n          vpxSupport = !stdenv.isMips;\n        };\n        ffmpeg_0_10 = callPackage ../development/libraries/ffmpeg/0.10.nix {\n          vpxSupport = !stdenv.isMips;\n          stdenv = if stdenv.isDarwin\n            then overrideGCC stdenv gccApple\n            else stdenv;\n        };\n        ffmpeg_1 = callPackage ../development/libraries/ffmpeg/1.x.nix {\n          vpxSupport = !stdenv.isMips;\n        };\n        ffmpeg_2 = callPackage ../development/libraries/ffmpeg/2.x.nix {\n        };\n        ffmpeg = ffmpeg_2;\n        ffms = callPackage ../development/libraries/ffms {\n        };\n        fftw = callPackage ../development/libraries/fftw {\n        };\n        fftwSinglePrec = fftw.override {\n          precision = \"single\";\n        };\n        fftwFloat = fftwSinglePrec;\n        flann = callPackage ../development/libraries/flann {\n        };\n        flite = callPackage ../development/libraries/flite {\n        };\n        fltk13 = callPackage ../development/libraries/fltk/fltk13.nix {\n        };\n        fltk20 = callPackage ../development/libraries/fltk {\n        };\n        fmod = callPackage ../development/libraries/fmod {\n        };\n        freeimage = callPackage ../development/libraries/freeimage {\n        };\n        freetts = callPackage ../development/libraries/freetts {\n        };\n        cfitsio = callPackage ../development/libraries/cfitsio {\n        };\n        fontconfig = callPackage ../development/libraries/fontconfig {\n        };\n        makeFontsConf = let\n          fontconfig_ = fontconfig;\n          in { fontDirectories, fontconfig ? fontconfig_ }:\n          import ../development/libraries/fontconfig/make-fonts-conf.nix {\n            inherit runCommand libxslt\n            fontconfig fontDirectories;\n          };\n        freealut = callPackage ../development/libraries/freealut {\n        };\n        freeglut = callPackage ../development/libraries/freeglut {\n        };\n        freetype = callPackage ../development/libraries/freetype {\n        };\n        frei0r = callPackage ../development/libraries/frei0r {\n        };\n        fribidi = callPackage ../development/libraries/fribidi {\n        };\n        funambol = callPackage ../development/libraries/funambol {\n        };\n        fam = gamin;\n        gamin = callPackage ../development/libraries/gamin {\n        };\n        ganv = callPackage ../development/libraries/ganv {\n        };\n        gav = callPackage ../games/gav {\n        };\n        gsb = callPackage ../games/gsb {\n        };\n        gdome2 = callPackage ../development/libraries/gdome2 {\n          inherit (gnome) gtkdoc;\n        };\n        gdbm = callPackage ../development/libraries/gdbm {\n        };\n        gegl = callPackage ../development/libraries/gegl {\n        };\n        gegl_0_0_22 = callPackage ../development/libraries/gegl/0_0_22.nix {\n          libpng = libpng12;\n        };\n        geoclue = callPackage ../development/libraries/geoclue {\n        };\n        geoclue2 = callPackage ../development/libraries/geoclue/2.0.nix {\n        };\n        geoip = callPackage ../development/libraries/geoip {\n        };\n        geoipjava = callPackage ../development/libraries/java/geoipjava {\n        };\n        geos = callPackage ../development/libraries/geos {\n        };\n        gettext = gettext_0_18;\n        gettext_0_17 = callPackage ../development/libraries/gettext/0.17.nix {\n        };\n        gettext_0_18 = callPackage ../development/libraries/gettext {\n        };\n        gd = callPackage ../development/libraries/gd {\n        };\n        gdal = callPackage ../development/libraries/gdal {\n        };\n        ggz_base_libs = callPackage ../development/libraries/ggz_base_libs {\n        };\n        giblib = callPackage ../development/libraries/giblib {\n        };\n        libgit2 = callPackage ../development/libraries/git2 {\n        };\n        glew = callPackage ../development/libraries/glew {\n        };\n        glfw = glfw3;\n        glfw2 = callPackage ../development/libraries/glfw/2.x.nix {\n        };\n        glfw3 = callPackage ../development/libraries/glfw/3.x.nix {\n        };\n        glibc = callPackage ../development/libraries/glibc/2.19 {\n          kernelHeaders = linuxHeaders;\n          installLocales = config.glibc.locales or false;\n          machHeaders = null;\n          hurdHeaders = null;\n          gccCross = null;\n        };\n        glibc_memusage = callPackage ../development/libraries/glibc/2.19 {\n          kernelHeaders = linuxHeaders;\n          installLocales = false;\n          withGd = true;\n        };\n        glibcCross = forceNativeDrv (makeOverridable (import ../development/libraries/glibc/2.19) (let\n          crossGNU = crossSystem != null && crossSystem.config == \"i586-pc-gnu\";\n          in {\n            inherit stdenv fetchurl;\n            gccCross = gccCrossStageStatic;\n            kernelHeaders = if crossGNU\n              then gnu.hurdHeaders\n              else linuxHeadersCross;\n            installLocales = config.glibc.locales or false;\n          } // lib.optionalAttrs crossGNU {\n            inherit (gnu) machHeaders\n            hurdHeaders libpthreadHeaders\n            mig;\n            inherit fetchgit;\n          }));\n        libcCrossChooser = name:\n        if name == \"glibc\"\n          then glibcCross\n          else if name == \"uclibc\"\n            then uclibcCross\n            else if name == \"msvcrt\"\n              then windows.mingw_w64\n              else if name == \"libSystem\"\n                then darwin.xcode\n                else throw \"Unknown libc\";\n        libcCross = assert crossSystem != null; libcCrossChooser crossSystem.libc;\n        eglibc = callPackage ../development/libraries/eglibc {\n          kernelHeaders = linuxHeaders;\n          installLocales = config.glibc.locales or false;\n        };\n        glibcLocales = callPackage ../development/libraries/glibc/2.19/locales.nix {\n        };\n        glibcInfo = callPackage ../development/libraries/glibc/2.19/info.nix {\n        };\n        glibc_multi = runCommand \"${glibc.name}-multi\" {\n          glibc64 = glibc;\n          glibc32 = (import ./all-packages.nix {\n            system = \"i686-linux\";\n          }).glibc;\n        } ''\n          mkdir -p ''$out\n          ln -s ''$glibc64/* ''$out/\n          \n          rm ''$out/lib ''$out/lib64\n          mkdir -p ''$out/lib\n          ln -s ''$glibc64/lib/* ''$out/lib\n          ln -s ''$glibc32/lib ''$out/lib/32\n          ln -s lib ''$out/lib64\n          \n          # fixing ldd RLTDLIST\n          rm ''$out/bin\n          cp -rs ''$glibc64/bin ''$out\n          chmod u+w ''$out/bin\n          rm ''$out/bin/ldd\n          sed -e \"s|^RTLDLIST=.*''$|RTLDLIST=\\\"''$out/lib/ld-2.19.so ''$out/lib/32/ld-linux.so.2\\\"|g\" \\\n              ''$glibc64/bin/ldd > ''$out/bin/ldd\n          chmod 555 ''$out/bin/ldd\n          \n          rm ''$out/include\n          cp -rs ''$glibc32/include ''$out\n          chmod -R u+w ''$out/include\n          cp -rsf ''$glibc64/include ''$out\n        '';\n        glm = callPackage ../development/libraries/glm {\n        };\n        glog = callPackage ../development/libraries/glog {\n        };\n        gloox = callPackage ../development/libraries/gloox {\n        };\n        glpk = callPackage ../development/libraries/glpk {\n        };\n        glsurf = callPackage ../applications/science/math/glsurf {\n          inherit (ocamlPackages) lablgl\n          findlib camlimages ocaml_mysql\n          mlgmp;\n          libpng = libpng12;\n          giflib = giflib_4_1;\n        };\n        gmime = callPackage ../development/libraries/gmime {\n        };\n        gmm = callPackage ../development/libraries/gmm {\n        };\n        gmp = gmp5;\n        gmp5 = gmp51;\n        gmpxx = appendToName \"with-cxx\" (gmp.override {\n          cxx = true;\n        });\n        gmp4 = callPackage ../development/libraries/gmp/4.3.2.nix {\n        };\n        gmp51 = callPackage ../development/libraries/gmp/5.1.x.nix {\n        };\n        mpfr = callPackage ../development/libraries/mpfr/default.nix {\n        };\n        gobjectIntrospection = callPackage ../development/libraries/gobject-introspection {\n        };\n        goocanvas = callPackage ../development/libraries/goocanvas {\n        };\n        google-gflags = callPackage ../development/libraries/google-gflags {\n        };\n        gperftools = callPackage ../development/libraries/gperftools {\n        };\n        gst_all_1 = recurseIntoAttrs (callPackage ../development/libraries/gstreamer {\n          callPackage = pkgs.newScope (pkgs // {\n            libav = pkgs.libav_10;\n          });\n        });\n        gst_all = {\n          inherit (pkgs) gstreamer gnonlin\n          gst_python qt_gstreamer;\n          gstPluginsBase = pkgs.gst_plugins_base;\n          gstPluginsBad = pkgs.gst_plugins_bad;\n          gstPluginsGood = pkgs.gst_plugins_good;\n          gstPluginsUgly = pkgs.gst_plugins_ugly;\n          gstFfmpeg = pkgs.gst_ffmpeg;\n        };\n        gstreamer = callPackage ../development/libraries/gstreamer/legacy/gstreamer {\n          bison = bison2;\n        };\n        gst_plugins_base = callPackage ../development/libraries/gstreamer/legacy/gst-plugins-base {\n        };\n        gst_plugins_good = callPackage ../development/libraries/gstreamer/legacy/gst-plugins-good {\n        };\n        gst_plugins_bad = callPackage ../development/libraries/gstreamer/legacy/gst-plugins-bad {\n        };\n        gst_plugins_ugly = callPackage ../development/libraries/gstreamer/legacy/gst-plugins-ugly {\n        };\n        gst_ffmpeg = callPackage ../development/libraries/gstreamer/legacy/gst-ffmpeg {\n          ffmpeg = ffmpeg_0_10;\n        };\n        gst_python = callPackage ../development/libraries/gstreamer/legacy/gst-python {\n        };\n        gstreamermm = callPackage ../development/libraries/gstreamer/legacy/gstreamermm {\n        };\n        gnonlin = callPackage ../development/libraries/gstreamer/legacy/gnonlin {\n        };\n        gusb = callPackage ../development/libraries/gusb {\n          inherit (gnome) gtkdoc;\n        };\n        qt_gstreamer = callPackage ../development/libraries/gstreamer/legacy/qt-gstreamer {\n        };\n        gnet = callPackage ../development/libraries/gnet {\n        };\n        gnu-efi = callPackage ../development/libraries/gnu-efi {\n        };\n        gnutls = gnutls32;\n        gnutls31 = callPackage ../development/libraries/gnutls/3.1.nix {\n          guileBindings = config.gnutls.guile or false;\n        };\n        gnutls32 = callPackage ../development/libraries/gnutls/3.2.nix {\n          guileBindings = config.gnutls.guile or false;\n        };\n        gnutls_with_guile = lowPrio (gnutls.override {\n          guileBindings = true;\n        });\n        gpac = callPackage ../applications/video/gpac {\n        };\n        gpgme = callPackage ../development/libraries/gpgme {\n          gnupg1 = gnupg1orig;\n        };\n        grantlee = callPackage ../development/libraries/grantlee {\n        };\n        gsasl = callPackage ../development/libraries/gsasl {\n        };\n        gsl = callPackage ../development/libraries/gsl {\n        };\n        gsm = callPackage ../development/libraries/gsm {\n        };\n        gsoap = callPackage ../development/libraries/gsoap {\n        };\n        gss = callPackage ../development/libraries/gss {\n        };\n        gtkimageview = callPackage ../development/libraries/gtkimageview {\n        };\n        gtkmathview = callPackage ../development/libraries/gtkmathview {\n        };\n        gtkLibs = {\n          inherit (pkgs) glib glibmm atk\n          atkmm cairo pango pangomm\n          gdk_pixbuf gtk gtkmm;\n        };\n        glib = callPackage ../development/libraries/glib {\n        };\n        glib-tested = glib.override {\n          doCheck = true;\n        };\n        glibmm = callPackage ../development/libraries/glibmm {\n        };\n        glib_networking = callPackage ../development/libraries/glib-networking {\n        };\n        atk = callPackage ../development/libraries/atk {\n        };\n        atkmm = callPackage ../development/libraries/atkmm {\n        };\n        pixman = callPackage ../development/libraries/pixman {\n        };\n        cairo = callPackage ../development/libraries/cairo {\n          glSupport = config.cairo.gl or stdenv.isLinux && !stdenv.isArm && !stdenv.isMips;\n        };\n        cairomm = callPackage ../development/libraries/cairomm {\n        };\n        pango = callPackage ../development/libraries/pango {\n        };\n        pangomm = callPackage ../development/libraries/pangomm {\n        };\n        pangox_compat = callPackage ../development/libraries/pangox-compat {\n        };\n        gdk_pixbuf = callPackage ../development/libraries/gdk-pixbuf {\n          stdenv = if stdenv.isDarwin\n            then clangStdenv\n            else stdenv;\n        };\n        gtk2 = callPackage ../development/libraries/gtk+/2.x.nix {\n          cupsSupport = config.gtk2.cups or stdenv.isLinux;\n        };\n        gtk3 = callPackage ../development/libraries/gtk+/3.x.nix {\n        };\n        gtk = pkgs.gtk2;\n        gtkmm = callPackage ../development/libraries/gtkmm/2.x.nix {\n        };\n        gtkmm3 = callPackage ../development/libraries/gtkmm/3.x.nix {\n        };\n        gtkmozembedsharp = callPackage ../development/libraries/gtkmozembed-sharp {\n          gtksharp = gtksharp2;\n        };\n        gtksharp1 = callPackage ../development/libraries/gtk-sharp-1 {\n          inherit (gnome) libglade\n          libgtkhtml gtkhtml\n          libgnomecanvas libgnomeui\n          libgnomeprint libgnomeprintui\n          GConf;\n        };\n        gtksharp2 = callPackage ../development/libraries/gtk-sharp-2 {\n          inherit (gnome) libglade\n          libgtkhtml gtkhtml\n          libgnomecanvas libgnomeui\n          libgnomeprint libgnomeprintui\n          GConf gnomepanel;\n        };\n        gtksourceviewsharp = callPackage ../development/libraries/gtksourceview-sharp {\n          inherit (gnome) gtksourceview;\n          gtksharp = gtksharp2;\n        };\n        gtkspell = callPackage ../development/libraries/gtkspell {\n        };\n        gtkspell3 = callPackage ../development/libraries/gtkspell/3.nix {\n        };\n        gts = callPackage ../development/libraries/gts {\n        };\n        gvfs = callPackage ../development/libraries/gvfs {\n          gconf = gnome.GConf;\n        };\n        gwenhywfar = callPackage ../development/libraries/gwenhywfar {\n        };\n        hamlib = callPackage ../development/libraries/hamlib {\n        };\n        kerberos = heimdal;\n        heimdal = callPackage ../development/libraries/kerberos/heimdal.nix {\n        };\n        harfbuzz = callPackage ../development/libraries/harfbuzz {\n        };\n        hawknl = callPackage ../development/libraries/hawknl {\n        };\n        herqq = callPackage ../development/libraries/herqq {\n        };\n        hspell = callPackage ../development/libraries/hspell {\n        };\n        hspellDicts = callPackage ../development/libraries/hspell/dicts.nix {\n        };\n        hsqldb = callPackage ../development/libraries/java/hsqldb {\n        };\n        http-parser = callPackage ../development/libraries/http-parser {\n          inherit (pythonPackages) gyp;\n        };\n        hunspell = callPackage ../development/libraries/hunspell {\n        };\n        hwloc = callPackage ../development/libraries/hwloc {\n          inherit (xlibs) libX11;\n        };\n        hydraAntLogger = callPackage ../development/libraries/java/hydra-ant-logger {\n        };\n        icu = callPackage ../development/libraries/icu {\n        };\n        id3lib = callPackage ../development/libraries/id3lib {\n        };\n        iksemel = callPackage ../development/libraries/iksemel {\n        };\n        ilbc = callPackage ../development/libraries/ilbc {\n        };\n        ilixi = callPackage ../development/libraries/ilixi {\n        };\n        ilmbase = callPackage ../development/libraries/ilmbase {\n        };\n        imlib = callPackage ../development/libraries/imlib {\n          libpng = libpng12;\n        };\n        imlib2 = callPackage ../development/libraries/imlib2 {\n        };\n        incrtcl = callPackage ../development/libraries/incrtcl {\n        };\n        indilib = callPackage ../development/libraries/indilib {\n        };\n        iniparser = callPackage ../development/libraries/iniparser {\n        };\n        intltool = callPackage ../development/tools/misc/intltool {\n        };\n        irrlicht3843 = callPackage ../development/libraries/irrlicht {\n        };\n        isocodes = callPackage ../development/libraries/iso-codes {\n        };\n        itk = callPackage ../development/libraries/itk {\n        };\n        jamp = builderDefsPackage ../games/jamp {\n          inherit mesa SDL SDL_image\n          SDL_mixer;\n        };\n        jasper = callPackage ../development/libraries/jasper {\n        };\n        jama = callPackage ../development/libraries/jama {\n        };\n        jansson = callPackage ../development/libraries/jansson {\n        };\n        jbig2dec = callPackage ../development/libraries/jbig2dec {\n        };\n        jetty_gwt = callPackage ../development/libraries/java/jetty-gwt {\n        };\n        jetty_util = callPackage ../development/libraries/java/jetty-util {\n        };\n        json_glib = callPackage ../development/libraries/json-glib {\n        };\n        json-c-0-11 = callPackage ../development/libraries/json-c/0.11.nix {\n        };\n        json_c = callPackage ../development/libraries/json-c {\n        };\n        jsoncpp = callPackage ../development/libraries/jsoncpp {\n        };\n        libjson = callPackage ../development/libraries/libjson {\n        };\n        judy = callPackage ../development/libraries/judy {\n        };\n        keybinder = callPackage ../development/libraries/keybinder {\n          automake = automake111x;\n          lua = lua5_1;\n        };\n        keybinder3 = callPackage ../development/libraries/keybinder3 {\n          automake = automake111x;\n          lua = lua5_1;\n        };\n        krb5 = callPackage ../development/libraries/kerberos/krb5.nix {\n        };\n        lcms = lcms1;\n        lcms1 = callPackage ../development/libraries/lcms {\n        };\n        lcms2 = callPackage ../development/libraries/lcms2 {\n        };\n        lensfun = callPackage ../development/libraries/lensfun {\n        };\n        lesstif = callPackage ../development/libraries/lesstif {\n        };\n        lesstif93 = callPackage ../development/libraries/lesstif-0.93 {\n        };\n        leveldb = callPackage ../development/libraries/leveldb {\n        };\n        levmar = callPackage ../development/libraries/levmar {\n        };\n        leptonica = callPackage ../development/libraries/leptonica {\n          libpng = libpng12;\n        };\n        lgi = callPackage ../development/libraries/lgi {\n          lua = lua5_1;\n        };\n        lib3ds = callPackage ../development/libraries/lib3ds {\n        };\n        libaacs = callPackage ../development/libraries/libaacs {\n        };\n        libaal = callPackage ../development/libraries/libaal {\n        };\n        libao = callPackage ../development/libraries/libao {\n          usePulseAudio = config.pulseaudio or true;\n        };\n        libarchive = callPackage ../development/libraries/libarchive {\n        };\n        libass = callPackage ../development/libraries/libass {\n        };\n        libassuan1 = callPackage ../development/libraries/libassuan1 {\n        };\n        libassuan = callPackage ../development/libraries/libassuan {\n        };\n        libassuan2_1 = callPackage ../development/libraries/libassuan/git.nix {\n        };\n        libatomic_ops = callPackage ../development/libraries/libatomic_ops {\n        };\n        libav = libav_10;\n        libav_all = callPackage ../development/libraries/libav {\n        };\n        inherit (libav_all) libav_0_8\n        libav_9 libav_10;\n        libavc1394 = callPackage ../development/libraries/libavc1394 {\n        };\n        libbluedevil = callPackage ../development/libraries/libbluedevil {\n        };\n        libbluray = callPackage ../development/libraries/libbluray {\n        };\n        libbs2b = callPackage ../development/libraries/audio/libbs2b {\n        };\n        libcaca = callPackage ../development/libraries/libcaca {\n        };\n        libcanberra = callPackage ../development/libraries/libcanberra {\n        };\n        libcanberra_gtk3 = libcanberra.override {\n          gtk = gtk3;\n        };\n        libcanberra_kde = if config.kde_runtime.libcanberraWithoutGTK or true\n          then libcanberra.override {\n            gtk = null;\n          }\n          else libcanberra;\n        libcello = callPackage ../development/libraries/libcello {\n        };\n        libcdaudio = callPackage ../development/libraries/libcdaudio {\n        };\n        libcddb = callPackage ../development/libraries/libcddb {\n        };\n        libcdio = callPackage ../development/libraries/libcdio {\n        };\n        libcdio082 = callPackage ../development/libraries/libcdio/0.82.nix {\n        };\n        libcdr = callPackage ../development/libraries/libcdr {\n          lcms = lcms2;\n        };\n        libchamplain = callPackage ../development/libraries/libchamplain {\n          inherit (gnome) libsoup;\n        };\n        libchamplain_0_6 = callPackage ../development/libraries/libchamplain/0.6.nix {\n        };\n        libchop = callPackage ../development/libraries/libchop {\n        };\n        libcm = callPackage ../development/libraries/libcm {\n        };\n        inherit (gnome3) libcroco;\n        libcangjie = callPackage ../development/libraries/libcangjie {\n        };\n        libcredis = callPackage ../development/libraries/libcredis {\n        };\n        libctemplate = callPackage ../development/libraries/libctemplate {\n        };\n        libcue = callPackage ../development/libraries/libcue {\n        };\n        libdaemon = callPackage ../development/libraries/libdaemon {\n        };\n        libdbi = callPackage ../development/libraries/libdbi {\n        };\n        libdbiDriversBase = callPackage ../development/libraries/libdbi-drivers {\n          mysql = null;\n          sqlite = null;\n        };\n        libdbiDrivers = libdbiDriversBase.override {\n          inherit sqlite mysql;\n        };\n        libdbusmenu_qt = callPackage ../development/libraries/libdbusmenu-qt {\n        };\n        libdc1394 = callPackage ../development/libraries/libdc1394 {\n        };\n        libdc1394avt = callPackage ../development/libraries/libdc1394avt {\n        };\n        libdevil = callPackage ../development/libraries/libdevil {\n        };\n        libdiscid = callPackage ../development/libraries/libdiscid {\n        };\n        libdivsufsort = callPackage ../development/libraries/libdivsufsort {\n        };\n        libdmtx = callPackage ../development/libraries/libdmtx {\n        };\n        libdnet = callPackage ../development/libraries/libdnet {\n        };\n        libdrm = callPackage ../development/libraries/libdrm {\n          inherit fetchurl stdenv\n          pkgconfig;\n          inherit (xorg) libpthreadstubs;\n        };\n        libdv = callPackage ../development/libraries/libdv {\n        };\n        libdvbpsi = callPackage ../development/libraries/libdvbpsi {\n        };\n        libdwg = callPackage ../development/libraries/libdwg {\n        };\n        libdvdcss = callPackage ../development/libraries/libdvdcss {\n        };\n        libdvdnav = callPackage ../development/libraries/libdvdnav {\n        };\n        libdvdread = callPackage ../development/libraries/libdvdread {\n        };\n        libdwarf = callPackage ../development/libraries/libdwarf {\n        };\n        libeatmydata = callPackage ../development/libraries/libeatmydata {\n        };\n        libebml = callPackage ../development/libraries/libebml {\n        };\n        libedit = callPackage ../development/libraries/libedit {\n        };\n        libelf = callPackage ../development/libraries/libelf {\n        };\n        libfm = callPackage ../development/libraries/libfm {\n        };\n        libgadu = callPackage ../development/libraries/libgadu {\n        };\n        libgdata = gnome3.libgdata;\n        libgig = callPackage ../development/libraries/libgig {\n        };\n        libgnome_keyring = callPackage ../development/libraries/libgnome-keyring {\n        };\n        libgnome_keyring3 = gnome3.libgnome_keyring;\n        libgnurl = callPackage ../development/libraries/libgnurl {\n        };\n        libseccomp = callPackage ../development/libraries/libseccomp {\n        };\n        libsecret = callPackage ../development/libraries/libsecret {\n        };\n        libserialport = callPackage ../development/libraries/libserialport {\n        };\n        libgtop = callPackage ../development/libraries/libgtop {\n        };\n        liblo = callPackage ../development/libraries/liblo {\n        };\n        liblrdf = librdf;\n        liblscp = callPackage ../development/libraries/liblscp {\n        };\n        libe-book = callPackage ../development/libraries/libe-book {\n        };\n        libe-book_00 = callPackage ../development/libraries/libe-book/0.0.nix {\n        };\n        libev = builderDefsPackage ../development/libraries/libev {\n        };\n        libevent14 = callPackage ../development/libraries/libevent/1.4.nix {\n        };\n        libevent = callPackage ../development/libraries/libevent {\n        };\n        libewf = callPackage ../development/libraries/libewf {\n        };\n        libexif = callPackage ../development/libraries/libexif {\n        };\n        libexosip = callPackage ../development/libraries/exosip {\n        };\n        libexosip_3 = callPackage ../development/libraries/exosip/3.x.nix {\n          libosip = libosip_3;\n        };\n        libextractor = callPackage ../development/libraries/libextractor {\n          libmpeg2 = mpeg2dec;\n        };\n        libexttextcat = callPackage ../development/libraries/libexttextcat {\n        };\n        libf2c = callPackage ../development/libraries/libf2c {\n        };\n        libfixposix = callPackage ../development/libraries/libfixposix {\n        };\n        libffcall = builderDefsPackage (import ../development/libraries/libffcall) {\n          inherit fetchcvs;\n        };\n        libffi = callPackage ../development/libraries/libffi {\n        };\n        libftdi = callPackage ../development/libraries/libftdi {\n        };\n        libftdi1 = callPackage ../development/libraries/libftdi/1.x.nix {\n        };\n        libgcrypt = callPackage ../development/libraries/libgcrypt {\n        };\n        libgcrypt_1_6 = lowPrio (callPackage ../development/libraries/libgcrypt/1.6.nix {\n        });\n        libgdiplus = callPackage ../development/libraries/libgdiplus {\n        };\n        libgksu = callPackage ../development/libraries/libgksu {\n        };\n        libgpgerror = callPackage ../development/libraries/libgpg-error {\n        };\n        libgphoto2 = callPackage ../development/libraries/libgphoto2 {\n        };\n        libgphoto2_4 = callPackage ../development/libraries/libgphoto2/2.4.nix {\n        };\n        libgpod = callPackage ../development/libraries/libgpod {\n          inherit (pkgs.pythonPackages) mutagen;\n        };\n        libharu = callPackage ../development/libraries/libharu {\n        };\n        libical = callPackage ../development/libraries/libical {\n        };\n        libicns = callPackage ../development/libraries/libicns {\n        };\n        libimobiledevice = callPackage ../development/libraries/libimobiledevice {\n        };\n        libiodbc = callPackage ../development/libraries/libiodbc {\n          useGTK = config.libiodbc.gtk or false;\n        };\n        libivykis = callPackage ../development/libraries/libivykis {\n        };\n        liblastfmSF = callPackage ../development/libraries/liblastfmSF {\n        };\n        liblastfm = callPackage ../development/libraries/liblastfm {\n        };\n        liblqr1 = callPackage ../development/libraries/liblqr-1 {\n        };\n        liblockfile = callPackage ../development/libraries/liblockfile {\n        };\n        liblogging = callPackage ../development/libraries/liblogging {\n        };\n        libmcrypt = callPackage ../development/libraries/libmcrypt {\n        };\n        libmhash = callPackage ../development/libraries/libmhash {\n        };\n        libmodbus = callPackage ../development/libraries/libmodbus {\n        };\n        libmtp = callPackage ../development/libraries/libmtp {\n        };\n        libmsgpack = callPackage ../development/libraries/libmsgpack {\n        };\n        libnatspec = callPackage ../development/libraries/libnatspec {\n        };\n        libnfc = callPackage ../development/libraries/libnfc {\n        };\n        libnfsidmap = callPackage ../development/libraries/libnfsidmap {\n        };\n        libnice = callPackage ../development/libraries/libnice {\n        };\n        liboping = callPackage ../development/libraries/liboping {\n        };\n        libplist = callPackage ../development/libraries/libplist {\n        };\n        libQGLViewer = callPackage ../development/libraries/libqglviewer {\n        };\n        libre = callPackage ../development/libraries/libre {\n        };\n        librem = callPackage ../development/libraries/librem {\n        };\n        libresample = callPackage ../development/libraries/libresample {\n        };\n        librevenge = callPackage ../development/libraries/librevenge {\n        };\n        librevisa = callPackage ../development/libraries/librevisa {\n        };\n        libsamplerate = callPackage ../development/libraries/libsamplerate {\n        };\n        libspectre = callPackage ../development/libraries/libspectre {\n        };\n        libgsf = callPackage ../development/libraries/libgsf {\n        };\n        libiconv = callPackage ../development/libraries/libiconv {\n        };\n        libiconvOrEmpty = if libiconvOrNull == null\n          then [ ]\n          else [ libiconv ];\n        libiconvOrNull = if gcc.libc or null != null || stdenv.isGlibc\n          then null\n          else libiconv;\n        libiconvOrLibc = if libiconvOrNull == null\n          then gcc.libc\n          else libiconv;\n        libintlOrEmpty = stdenv.lib.optional (!stdenv.isLinux) gettext;\n        libid3tag = callPackage ../development/libraries/libid3tag {\n        };\n        libidn = callPackage ../development/libraries/libidn {\n        };\n        libiec61883 = callPackage ../development/libraries/libiec61883 {\n        };\n        libinfinity = callPackage ../development/libraries/libinfinity {\n          inherit (gnome) gtkdoc;\n        };\n        libiptcdata = callPackage ../development/libraries/libiptcdata {\n        };\n        libjpeg_original = callPackage ../development/libraries/libjpeg {\n        };\n        libjpeg_turbo = callPackage ../development/libraries/libjpeg-turbo {\n        };\n        libjpeg = if stdenv.isLinux\n          then libjpeg_turbo\n          else libjpeg_original;\n        libjpeg62 = callPackage ../development/libraries/libjpeg/62.nix {\n          libtool = libtool_1_5;\n        };\n        libjson_rpc_cpp = callPackage ../development/libraries/libjson-rpc-cpp {\n        };\n        libkate = callPackage ../development/libraries/libkate {\n        };\n        libksba = callPackage ../development/libraries/libksba {\n        };\n        libmad = callPackage ../development/libraries/libmad {\n        };\n        libmatchbox = callPackage ../development/libraries/libmatchbox {\n        };\n        libmatthew_java = callPackage ../development/libraries/java/libmatthew-java {\n        };\n        libmatroska = callPackage ../development/libraries/libmatroska {\n        };\n        libmcs = callPackage ../development/libraries/libmcs {\n        };\n        libmemcached = callPackage ../development/libraries/libmemcached {\n        };\n        libmicrohttpd = callPackage ../development/libraries/libmicrohttpd {\n        };\n        libmikmod = callPackage ../development/libraries/libmikmod {\n          stdenv = if stdenv.isDarwin\n            then overrideGCC stdenv gccApple\n            else stdenv;\n        };\n        libmilter = callPackage ../development/libraries/libmilter {\n        };\n        libmkv = callPackage ../development/libraries/libmkv {\n        };\n        libmms = callPackage ../development/libraries/libmms {\n        };\n        libmowgli = callPackage ../development/libraries/libmowgli {\n        };\n        libmng = callPackage ../development/libraries/libmng {\n        };\n        libmnl = callPackage ../development/libraries/libmnl {\n        };\n        libmodplug = callPackage ../development/libraries/libmodplug {\n        };\n        libmpcdec = callPackage ../development/libraries/libmpcdec {\n        };\n        libmp3splt = callPackage ../development/libraries/libmp3splt {\n        };\n        libmrss = callPackage ../development/libraries/libmrss {\n        };\n        libmsn = callPackage ../development/libraries/libmsn {\n        };\n        libmspack = callPackage ../development/libraries/libmspack {\n        };\n        libmusclecard = callPackage ../development/libraries/libmusclecard {\n        };\n        libmusicbrainz2 = callPackage ../development/libraries/libmusicbrainz/2.x.nix {\n        };\n        libmusicbrainz3 = callPackage ../development/libraries/libmusicbrainz {\n        };\n        libmusicbrainz5 = callPackage ../development/libraries/libmusicbrainz/5.x.nix {\n        };\n        libmusicbrainz = libmusicbrainz3;\n        libmwaw = callPackage ../development/libraries/libmwaw {\n        };\n        libmwaw_02 = callPackage ../development/libraries/libmwaw/0.2.nix {\n        };\n        libmx = callPackage ../development/libraries/libmx {\n        };\n        libnet = callPackage ../development/libraries/libnet {\n        };\n        libnetfilter_conntrack = callPackage ../development/libraries/libnetfilter_conntrack {\n        };\n        libnetfilter_queue = callPackage ../development/libraries/libnetfilter_queue {\n        };\n        libnfnetlink = callPackage ../development/libraries/libnfnetlink {\n        };\n        libnftnl = callPackage ../development/libraries/libnftnl {\n        };\n        libnih = callPackage ../development/libraries/libnih {\n        };\n        libnova = callPackage ../development/libraries/libnova {\n        };\n        libnxml = callPackage ../development/libraries/libnxml {\n        };\n        libodfgen = callPackage ../development/libraries/libodfgen {\n        };\n        libofa = callPackage ../development/libraries/libofa {\n        };\n        libofx = callPackage ../development/libraries/libofx {\n        };\n        libogg = callPackage ../development/libraries/libogg {\n        };\n        liboggz = callPackage ../development/libraries/liboggz {\n        };\n        liboil = callPackage ../development/libraries/liboil {\n        };\n        liboop = callPackage ../development/libraries/liboop {\n        };\n        libopus = callPackage ../development/libraries/libopus {\n        };\n        libosinfo = callPackage ../development/libraries/libosinfo {\n        };\n        libosip = callPackage ../development/libraries/osip {\n        };\n        libosip_3 = callPackage ../development/libraries/osip/3.nix {\n        };\n        libotr = callPackage ../development/libraries/libotr {\n          libgcrypt = libgcrypt_1_6;\n        };\n        libotr_3_2 = callPackage ../development/libraries/libotr/3.2.nix {\n        };\n        libp11 = callPackage ../development/libraries/libp11 {\n        };\n        libpar2 = callPackage ../development/libraries/libpar2 {\n        };\n        libpcap = callPackage ../development/libraries/libpcap {\n        };\n        libpipeline = callPackage ../development/libraries/libpipeline {\n        };\n        libpng = callPackage ../development/libraries/libpng {\n        };\n        libpng_apng = libpng.override {\n          apngSupport = true;\n        };\n        libpng12 = callPackage ../development/libraries/libpng/12.nix {\n        };\n        libpng15 = callPackage ../development/libraries/libpng/15.nix {\n        };\n        libpaper = callPackage ../development/libraries/libpaper {\n        };\n        libproxy = callPackage ../development/libraries/libproxy {\n          stdenv = if stdenv.isDarwin\n            then overrideGCC stdenv gcc\n            else stdenv;\n        };\n        libpseudo = callPackage ../development/libraries/libpseudo {\n        };\n        libpwquality = callPackage ../development/libraries/libpwquality {\n        };\n        libqalculate = callPackage ../development/libraries/libqalculate {\n        };\n        librsvg = callPackage ../development/libraries/librsvg {\n          gtk2 = null;\n          gtk3 = null;\n        };\n        librsync = callPackage ../development/libraries/librsync {\n        };\n        libsearpc = callPackage ../development/libraries/libsearpc {\n        };\n        libsigcxx = callPackage ../development/libraries/libsigcxx {\n        };\n        libsigcxx12 = callPackage ../development/libraries/libsigcxx/1.2.nix {\n        };\n        libsigsegv = callPackage ../development/libraries/libsigsegv {\n        };\n        libsigsegv_25 = callPackage ../development/libraries/libsigsegv/2.5.nix {\n        };\n        libsndfile = callPackage ../development/libraries/libsndfile {\n        };\n        libsodium = callPackage ../development/libraries/libsodium {\n        };\n        libsoup = callPackage ../development/libraries/libsoup {\n        };\n        libssh = callPackage ../development/libraries/libssh {\n        };\n        libssh2 = callPackage ../development/libraries/libssh2 {\n        };\n        libstartup_notification = callPackage ../development/libraries/startup-notification {\n        };\n        libspatialindex = callPackage ../development/libraries/libspatialindex {\n        };\n        libspatialite = callPackage ../development/libraries/libspatialite {\n        };\n        libtar = callPackage ../development/libraries/libtar {\n        };\n        libtasn1 = callPackage ../development/libraries/libtasn1 {\n        };\n        libtheora = callPackage ../development/libraries/libtheora {\n        };\n        libtiff = callPackage ../development/libraries/libtiff {\n        };\n        libtiger = callPackage ../development/libraries/libtiger {\n        };\n        libtommath = callPackage ../development/libraries/libtommath {\n        };\n        libtorrentRasterbar = callPackage ../development/libraries/libtorrent-rasterbar {\n          stdenv = if stdenv.isDarwin\n            then clangStdenv\n            else stdenv;\n        };\n        libtoxcore = callPackage ../development/libraries/libtoxcore {\n        };\n        libtsm = callPackage ../development/libraries/libtsm {\n        };\n        libtunepimp = callPackage ../development/libraries/libtunepimp {\n        };\n        libtxc_dxtn = callPackage ../development/libraries/libtxc_dxtn {\n        };\n        libtxc_dxtn_s2tc = callPackage ../development/libraries/libtxc_dxtn_s2tc {\n        };\n        libgeotiff = callPackage ../development/libraries/libgeotiff {\n        };\n        libunistring = callPackage ../development/libraries/libunistring {\n        };\n        libupnp = callPackage ../development/libraries/pupnp {\n        };\n        giflib = callPackage ../development/libraries/giflib {\n        };\n        giflib_4_1 = callPackage ../development/libraries/giflib/4.1.nix {\n        };\n        libungif = callPackage ../development/libraries/giflib/libungif.nix {\n        };\n        libunibreak = callPackage ../development/libraries/libunibreak {\n        };\n        libunique = callPackage ../development/libraries/libunique/default.nix {\n        };\n        liburcu = callPackage ../development/libraries/liburcu {\n        };\n        libusb = callPackage ../development/libraries/libusb {\n        };\n        libusb1 = callPackage ../development/libraries/libusb1 {\n          stdenv = if stdenv.isDarwin\n            then clangStdenv\n            else stdenv;\n        };\n        libunwind = callPackage ../development/libraries/libunwind {\n        };\n        libuvVersions = callPackage ../development/libraries/libuv {\n        };\n        libv4l = lowPrio (v4l_utils.override {\n          withQt4 = false;\n        });\n        libva = callPackage ../development/libraries/libva {\n        };\n        libvdpau = callPackage ../development/libraries/libvdpau {\n        };\n        libvirt = callPackage ../development/libraries/libvirt {\n        };\n        libvirt-glib = callPackage ../development/libraries/libvirt-glib {\n        };\n        libvisio = callPackage ../development/libraries/libvisio {\n        };\n        libvisual = callPackage ../development/libraries/libvisual {\n        };\n        libvncserver = callPackage ../development/libraries/libvncserver {\n        };\n        libviper = callPackage ../development/libraries/libviper {\n        };\n        libvpx = callPackage ../development/libraries/libvpx {\n        };\n        libvterm = callPackage ../development/libraries/libvterm {\n        };\n        libvorbis = callPackage ../development/libraries/libvorbis {\n        };\n        libwebp = callPackage ../development/libraries/libwebp {\n        };\n        libwmf = callPackage ../development/libraries/libwmf {\n        };\n        libwnck = libwnck2;\n        libwnck2 = callPackage ../development/libraries/libwnck {\n        };\n        libwnck3 = callPackage ../development/libraries/libwnck/3.x.nix {\n        };\n        libwpd = callPackage ../development/libraries/libwpd {\n        };\n        libwpd_08 = callPackage ../development/libraries/libwpd/0.8.nix {\n        };\n        libwpg = callPackage ../development/libraries/libwpg {\n        };\n        libx86 = builderDefsPackage ../development/libraries/libx86 {\n        };\n        libxdg_basedir = callPackage ../development/libraries/libxdg-basedir {\n        };\n        libxkbcommon = callPackage ../development/libraries/libxkbcommon {\n        };\n        libxklavier = callPackage ../development/libraries/libxklavier {\n        };\n        libxmi = callPackage ../development/libraries/libxmi {\n        };\n        libxml2 = callPackage ../development/libraries/libxml2 {\n          pythonSupport = false;\n        };\n        libxml2Python = lowPrio (libxml2.override {\n          pythonSupport = true;\n        });\n        libxmlxx = callPackage ../development/libraries/libxmlxx {\n        };\n        libxmp = callPackage ../development/libraries/libxmp {\n        };\n        libxslt = callPackage ../development/libraries/libxslt {\n        };\n        libixp_for_wmii = lowPrio (import ../development/libraries/libixp_for_wmii {\n          inherit fetchurl stdenv;\n        });\n        libyaml = callPackage ../development/libraries/libyaml {\n        };\n        libyamlcpp = callPackage ../development/libraries/libyaml-cpp {\n        };\n        libyamlcpp03 = callPackage ../development/libraries/libyaml-cpp/0.3.x.nix {\n        };\n        libyubikey = callPackage ../development/libraries/libyubikey {\n        };\n        libzip = callPackage ../development/libraries/libzip {\n        };\n        libzdb = callPackage ../development/libraries/libzdb {\n        };\n        libzrtpcpp = callPackage ../development/libraries/libzrtpcpp {\n        };\n        libzrtpcpp_1_6 = callPackage ../development/libraries/libzrtpcpp/1.6.nix {\n          ccrtp = ccrtp_1_8;\n        };\n        libwacom = callPackage ../development/libraries/libwacom {\n        };\n        lightning = callPackage ../development/libraries/lightning {\n        };\n        lirc = callPackage ../development/libraries/lirc {\n        };\n        liquidwar = builderDefsPackage ../games/liquidwar {\n          inherit (xlibs) xproto libX11\n          libXrender;\n          inherit gmp mesa libjpeg expat\n          gettext perl SDL SDL_image\n          SDL_mixer SDL_ttf curl sqlite\n          libogg libvorbis libcaca csound\n          cunit;\n          guile = guile_1_8;\n          libpng = libpng15;\n        };\n        log4cpp = callPackage ../development/libraries/log4cpp {\n        };\n        log4cxx = callPackage ../development/libraries/log4cxx {\n        };\n        log4cplus = callPackage ../development/libraries/log4cplus {\n        };\n        loudmouth = callPackage ../development/libraries/loudmouth {\n        };\n        lzo = callPackage ../development/libraries/lzo {\n        };\n        mdds_0_7_1 = callPackage ../development/libraries/mdds/0.7.1.nix {\n        };\n        mdds = callPackage ../development/libraries/mdds {\n        };\n        mediastreamer = callPackage ../development/libraries/mediastreamer {\n        };\n        menu-cache = callPackage ../development/libraries/menu-cache {\n        };\n        mesaSupported = lib.elem system lib.platforms.mesaPlatforms;\n        mesaDarwinOr = alternative:\n        if stdenv.isDarwin\n          then callPackage ../development/libraries/mesa-darwin {\n          }\n          else alternative;\n        mesa_noglu = mesaDarwinOr (callPackage ../development/libraries/mesa {\n          grsecEnabled = true;\n        });\n        mesa_glu = mesaDarwinOr (callPackage ../development/libraries/mesa-glu {\n        });\n        mesa_drivers = mesaDarwinOr (let\n          mo = mesa_noglu.override {\n            grsecEnabled = config.grsecurity or false;\n          };\n          in mo.drivers);\n        mesa = mesaDarwinOr (buildEnv {\n          name = \"mesa-${mesa_noglu.version}\";\n          paths = [ mesa_noglu mesa_glu ];\n        });\n        metaEnvironment = recurseIntoAttrs (let\n          callPackage = newScope pkgs.metaEnvironment;\n          in rec {\n            sdfLibrary = callPackage ../development/libraries/sdf-library {\n              aterm = aterm28;\n            };\n            toolbuslib = callPackage ../development/libraries/toolbuslib {\n              aterm = aterm28;\n              inherit (windows) w32api;\n            };\n            cLibrary = callPackage ../development/libraries/c-library {\n              aterm = aterm28;\n            };\n            errorSupport = callPackage ../development/libraries/error-support {\n              aterm = aterm28;\n            };\n            ptSupport = callPackage ../development/libraries/pt-support {\n              aterm = aterm28;\n            };\n            ptableSupport = callPackage ../development/libraries/ptable-support {\n              aterm = aterm28;\n            };\n            configSupport = callPackage ../development/libraries/config-support {\n              aterm = aterm28;\n            };\n            asfSupport = callPackage ../development/libraries/asf-support {\n              aterm = aterm28;\n            };\n            tideSupport = callPackage ../development/libraries/tide-support {\n              aterm = aterm28;\n            };\n            rstoreSupport = callPackage ../development/libraries/rstore-support {\n              aterm = aterm28;\n            };\n            sdfSupport = callPackage ../development/libraries/sdf-support {\n              aterm = aterm28;\n            };\n            sglr = callPackage ../development/libraries/sglr {\n              aterm = aterm28;\n            };\n            ascSupport = callPackage ../development/libraries/asc-support {\n              aterm = aterm28;\n            };\n            pgen = callPackage ../development/libraries/pgen {\n              aterm = aterm28;\n            };\n          });\n        ming = callPackage ../development/libraries/ming {\n        };\n        minizip = callPackage ../development/libraries/minizip {\n        };\n        minmay = callPackage ../development/libraries/minmay {\n        };\n        miro = callPackage ../applications/video/miro {\n          inherit (pythonPackages) pywebkitgtk\n          pysqlite pycurl mutagen;\n        };\n        mkvtoolnix = callPackage ../applications/video/mkvtoolnix {\n        };\n        mlt-qt4 = callPackage ../development/libraries/mlt {\n          qt = qt4;\n          SDL = SDL_pulseaudio;\n        };\n        mlt-qt5 = callPackage ../development/libraries/mlt {\n          qt = qt5;\n          SDL = SDL_pulseaudio;\n        };\n        movit = callPackage ../development/libraries/movit {\n        };\n        mps = callPackage ../development/libraries/mps {\n        };\n        libmpeg2 = callPackage ../development/libraries/libmpeg2 {\n        };\n        mpeg2dec = libmpeg2;\n        msilbc = callPackage ../development/libraries/msilbc {\n        };\n        mp4v2 = callPackage ../development/libraries/mp4v2 {\n        };\n        mpc = callPackage ../development/libraries/mpc {\n        };\n        mpich2 = callPackage ../development/libraries/mpich2 {\n        };\n        mtdev = callPackage ../development/libraries/mtdev {\n        };\n        mtpfs = callPackage ../tools/filesystems/mtpfs {\n        };\n        mu = callPackage ../tools/networking/mu {\n          texinfo = texinfo4;\n        };\n        muparser = callPackage ../development/libraries/muparser {\n        };\n        mygpoclient = callPackage ../development/python-modules/mygpoclient {\n        };\n        mygui = callPackage ../development/libraries/mygui {\n        };\n        myguiSvn = callPackage ../development/libraries/mygui/svn.nix {\n        };\n        mysocketw = callPackage ../development/libraries/mysocketw {\n        };\n        mythes = callPackage ../development/libraries/mythes {\n        };\n        nanomsg = callPackage ../development/libraries/nanomsg {\n        };\n        ncurses = callPackage ../development/libraries/ncurses {\n          unicode = system != \"i686-cygwin\";\n        };\n        neon = callPackage ../development/libraries/neon {\n          compressionSupport = true;\n          sslSupport = true;\n        };\n        nethack = builderDefsPackage (import ../games/nethack) {\n          inherit ncurses flex bison;\n        };\n        nettle = callPackage ../development/libraries/nettle {\n        };\n        newt = callPackage ../development/libraries/newt {\n        };\n        nix-plugins = callPackage ../development/libraries/nix-plugins {\n          nix = pkgs.nixUnstable;\n        };\n        nspr = callPackage ../development/libraries/nspr {\n        };\n        nss = lowPrio (callPackage ../development/libraries/nss {\n        });\n        nssTools = callPackage ../development/libraries/nss {\n          includeTools = true;\n        };\n        ntrack = callPackage ../development/libraries/ntrack {\n        };\n        nvidia-texture-tools = callPackage ../development/libraries/nvidia-texture-tools {\n        };\n        ode = builderDefsPackage (import ../development/libraries/ode) {\n        };\n        ogre = callPackage ../development/libraries/ogre {\n        };\n        ogrepaged = callPackage ../development/libraries/ogrepaged {\n        };\n        oniguruma = callPackage ../development/libraries/oniguruma {\n        };\n        openal = callPackage ../development/libraries/openal {\n        };\n        openalSoft = callPackage ../development/libraries/openal-soft {\n        };\n        openbabel = callPackage ../development/libraries/openbabel {\n        };\n        opencascade = callPackage ../development/libraries/opencascade {\n        };\n        opencascade_6_5 = callPackage ../development/libraries/opencascade/6.5.nix {\n          automake = automake111x;\n          ftgl = ftgl212;\n        };\n        opencascade_oce = callPackage ../development/libraries/opencascade/oce.nix {\n        };\n        opencsg = callPackage ../development/libraries/opencsg {\n        };\n        openct = callPackage ../development/libraries/openct {\n        };\n        opencv = callPackage ../development/libraries/opencv {\n        };\n        opencv_2_1 = callPackage ../development/libraries/opencv/2.1.nix {\n          libpng = libpng12;\n        };\n        openexr_ctl = callPackage ../development/libraries/openexr_ctl {\n        };\n        openexr = callPackage ../development/libraries/openexr {\n        };\n        openldap = callPackage ../development/libraries/openldap {\n        };\n        openlierox = callPackage ../games/openlierox {\n        };\n        libopensc_dnie = callPackage ../development/libraries/libopensc-dnie {\n        };\n        opencolorio = callPackage ../development/libraries/opencolorio {\n        };\n        ois = callPackage ../development/libraries/ois {\n        };\n        opal = callPackage ../development/libraries/opal {\n        };\n        openjpeg = callPackage ../development/libraries/openjpeg {\n          lcms = lcms2;\n        };\n        openscenegraph = callPackage ../development/libraries/openscenegraph {\n          giflib = giflib_4_1;\n          ffmpeg = ffmpeg_0_10;\n        };\n        openspades = callPackage ../games/openspades {\n        };\n        libressl = callPackage ../development/libraries/libressl {\n        };\n        boringssl = callPackage ../development/libraries/boringssl {\n        };\n        openssl = callPackage ../development/libraries/openssl {\n          fetchurl = fetchurlBoot;\n          cryptodevHeaders = linuxPackages.cryptodev.override {\n            fetchurl = fetchurlBoot;\n            onlyHeaders = true;\n          };\n        };\n        ortp = callPackage ../development/libraries/ortp {\n          srtp = srtp_linphone;\n        };\n        p11_kit = callPackage ../development/libraries/p11-kit {\n        };\n        paperkey = callPackage ../tools/security/paperkey {\n        };\n        pangoxsl = callPackage ../development/libraries/pangoxsl {\n        };\n        pcl = callPackage ../development/libraries/pcl {\n          vtk = vtkWithQt4;\n        };\n        pcre = callPackage ../development/libraries/pcre {\n          unicodeSupport = config.pcre.unicode or true;\n        };\n        pdf2xml = callPackage ../development/libraries/pdf2xml {\n        };\n        phonon = callPackage ../development/libraries/phonon {\n        };\n        phonon_backend_gstreamer = callPackage ../development/libraries/phonon-backend-gstreamer {\n        };\n        phonon_backend_vlc = callPackage ../development/libraries/phonon-backend-vlc {\n        };\n        physfs = callPackage ../development/libraries/physfs {\n        };\n        pkcs11helper = callPackage ../development/libraries/pkcs11helper {\n        };\n        plib = callPackage ../development/libraries/plib {\n        };\n        pocketsphinx = callPackage ../development/libraries/pocketsphinx {\n        };\n        podofo = callPackage ../development/libraries/podofo {\n        };\n        polkit = callPackage ../development/libraries/polkit {\n          spidermonkey = spidermonkey_185;\n        };\n        polkit_qt_1 = callPackage ../development/libraries/polkit-qt-1 {\n        };\n        policykit = callPackage ../development/libraries/policykit {\n        };\n        poppler = callPackage ../development/libraries/poppler {\n          lcms = lcms2;\n        };\n        popplerQt4 = poppler.poppler_qt4;\n        popt = callPackage ../development/libraries/popt {\n        };\n        portaudio = callPackage ../development/libraries/portaudio {\n          stdenv = if stdenv.isDarwin\n            then clangStdenv\n            else stdenv;\n        };\n        portaudioSVN = callPackage ../development/libraries/portaudio/svn-head.nix {\n        };\n        portmidi = callPackage ../development/libraries/portmidi {\n        };\n        prison = callPackage ../development/libraries/prison {\n        };\n        proj = callPackage ../development/libraries/proj {\n        };\n        postgis = callPackage ../development/libraries/postgis {\n        };\n        protobuf = callPackage ../development/libraries/protobuf {\n        };\n        protobufc = callPackage ../development/libraries/protobufc {\n        };\n        pth = callPackage ../development/libraries/pth {\n        };\n        ptlib = callPackage ../development/libraries/ptlib {\n        };\n        re2 = callPackage ../development/libraries/re2 {\n        };\n        qca2 = callPackage ../development/libraries/qca2 {\n        };\n        qca2_ossl = callPackage ../development/libraries/qca2/ossl.nix {\n        };\n        qimageblitz = callPackage ../development/libraries/qimageblitz {\n        };\n        qjson = callPackage ../development/libraries/qjson {\n        };\n        qoauth = callPackage ../development/libraries/qoauth {\n        };\n        qt3 = callPackage ../development/libraries/qt-3 {\n          openglSupport = mesaSupported;\n          libpng = libpng12;\n        };\n        qt4 = pkgs.kde4.qt4;\n        qt48 = callPackage ../development/libraries/qt-4.x/4.8 {\n          mesa = mesa_noglu;\n          inherit (pkgs.gnome) libgnomeui\n          GConf gnome_vfs;\n          cups = if stdenv.isLinux\n            then cups\n            else null;\n          stdenv = if stdenv.isDarwin\n            then clangStdenv\n            else stdenv;\n        };\n        qt48Full = qt48.override {\n          docs = true;\n          demos = true;\n          examples = true;\n          developerBuild = true;\n        };\n        qt4SDK = qtcreator.override {\n          sdkBuild = true;\n          qtLib = qt48Full;\n        };\n        qt53Full = qt53.override {\n          buildDocs = true;\n          buildExamples = true;\n          buildTests = true;\n          developerBuild = true;\n        };\n        qt53 = callPackage ../development/libraries/qt-5/qt-5.3.nix {\n          mesa = mesa_noglu;\n          cups = if stdenv.isLinux\n            then cups\n            else null;\n          inherit (gnome) libgnomeui GConf\n          gnome_vfs;\n          bison = bison2;\n        };\n        qt5 = callPackage ../development/libraries/qt-5 {\n          mesa = mesa_noglu;\n          cups = if stdenv.isLinux\n            then cups\n            else null;\n          inherit (gnome) libgnomeui GConf\n          gnome_vfs;\n          bison = bison2;\n        };\n        qt5Full = qt5.override {\n          buildDocs = true;\n          buildExamples = true;\n          buildTests = true;\n          developerBuild = true;\n        };\n        qt5SDK = qtcreator.override {\n          sdkBuild = true;\n          qtLib = qt5Full;\n        };\n        qtcreator = callPackage ../development/qtcreator {\n          qtLib = qt48.override {\n            developerBuild = true;\n          };\n        };\n        qtscriptgenerator = callPackage ../development/libraries/qtscriptgenerator {\n        };\n        quesoglc = callPackage ../development/libraries/quesoglc {\n        };\n        qwt = callPackage ../development/libraries/qwt {\n        };\n        qwt6 = callPackage ../development/libraries/qwt/6.nix {\n        };\n        rabbitmq-c = callPackage ../development/libraries/rabbitmq-c {\n        };\n        rabbitmq-java-client = callPackage ../development/libraries/rabbitmq-java-client {\n        };\n        raul = callPackage ../development/libraries/audio/raul {\n        };\n        readline = readline6;\n        readline4 = callPackage ../development/libraries/readline/readline4.nix {\n        };\n        readline5 = callPackage ../development/libraries/readline/readline5.nix {\n        };\n        readline6 = callPackage ../development/libraries/readline/readline6.nix {\n        };\n        readline63 = callPackage ../development/libraries/readline/readline6.3.nix {\n        };\n        librdf_raptor = callPackage ../development/libraries/librdf/raptor.nix {\n        };\n        librdf_raptor2 = callPackage ../development/libraries/librdf/raptor2.nix {\n        };\n        librdf_rasqal = callPackage ../development/libraries/librdf/rasqal.nix {\n        };\n        librdf_redland = callPackage ../development/libraries/librdf/redland.nix {\n        };\n        librdf = callPackage ../development/libraries/librdf {\n        };\n        lilv = callPackage ../development/libraries/audio/lilv {\n        };\n        lv2 = callPackage ../development/libraries/audio/lv2 {\n        };\n        lvtk = callPackage ../development/libraries/audio/lvtk {\n        };\n        qrupdate = callPackage ../development/libraries/qrupdate {\n        };\n        redland = pkgs.librdf_redland;\n        rhino = callPackage ../development/libraries/java/rhino {\n          javac = gcj;\n          jvm = gcj;\n        };\n        rlog = callPackage ../development/libraries/rlog {\n        };\n        rubberband = callPackage ../development/libraries/rubberband {\n          fftw = fftwSinglePrec;\n          inherit (vamp) vampSDK;\n        };\n        sbc = callPackage ../development/libraries/sbc {\n        };\n        schroedinger = callPackage ../development/libraries/schroedinger {\n        };\n        SDL = callPackage ../development/libraries/SDL {\n          openglSupport = mesaSupported;\n          alsaSupport = !stdenv.isDarwin;\n          x11Support = true;\n          pulseaudioSupport = stdenv.isDarwin;\n          stdenv = if stdenv.isDarwin\n            then clangStdenv\n            else stdenv;\n        };\n        SDL_pulseaudio = SDL.override {\n          pulseaudioSupport = true;\n        };\n        SDL_gfx = callPackage ../development/libraries/SDL_gfx {\n        };\n        SDL_image = callPackage ../development/libraries/SDL_image {\n          stdenv = if stdenv.isDarwin\n            then clangStdenv\n            else stdenv;\n        };\n        SDL_mixer = callPackage ../development/libraries/SDL_mixer {\n        };\n        SDL_net = callPackage ../development/libraries/SDL_net {\n        };\n        SDL_sound = callPackage ../development/libraries/SDL_sound {\n        };\n        SDL_ttf = callPackage ../development/libraries/SDL_ttf {\n        };\n        SDL2 = callPackage ../development/libraries/SDL2 {\n          openglSupport = mesaSupported;\n          alsaSupport = true;\n          x11Support = true;\n          pulseaudioSupport = false;\n        };\n        SDL2_image = callPackage ../development/libraries/SDL2_image {\n        };\n        SDL2_mixer = callPackage ../development/libraries/SDL2_mixer {\n        };\n        SDL2_net = callPackage ../development/libraries/SDL2_net {\n        };\n        SDL2_gfx = callPackage ../development/libraries/SDL2_gfx {\n        };\n        serd = callPackage ../development/libraries/serd {\n        };\n        serf = callPackage ../development/libraries/serf {\n        };\n        silgraphite = callPackage ../development/libraries/silgraphite {\n        };\n        graphite2 = callPackage ../development/libraries/silgraphite/graphite2.nix {\n        };\n        simgear = callPackage ../development/libraries/simgear {\n        };\n        sfml_git = callPackage ../development/libraries/sfml {\n        };\n        skalibs = callPackage ../development/libraries/skalibs {\n        };\n        slang = callPackage ../development/libraries/slang {\n        };\n        slibGuile = callPackage ../development/libraries/slib {\n          scheme = guile_1_8;\n          texinfo = texinfo4;\n        };\n        smpeg = callPackage ../development/libraries/smpeg {\n        };\n        snack = callPackage ../development/libraries/snack {\n        };\n        snappy = callPackage ../development/libraries/snappy {\n        };\n        sodium = callPackage ../development/libraries/sodium {\n        };\n        sofia_sip = callPackage ../development/libraries/sofia-sip {\n        };\n        soprano = callPackage ../development/libraries/soprano {\n        };\n        soqt = callPackage ../development/libraries/soqt {\n        };\n        sord = callPackage ../development/libraries/sord {\n        };\n        spandsp = callPackage ../development/libraries/spandsp {\n        };\n        speechd = callPackage ../development/libraries/speechd {\n        };\n        speech_tools = callPackage ../development/libraries/speech-tools {\n        };\n        speex = callPackage ../development/libraries/speex {\n        };\n        sphinxbase = callPackage ../development/libraries/sphinxbase {\n        };\n        spice = callPackage ../development/libraries/spice {\n          celt = celt_0_5_1;\n          inherit (xlibs) libXrandr\n          libXfixes libXext libXrender\n          libXinerama;\n          inherit (pythonPackages) pyparsing;\n        };\n        spice_gtk = callPackage ../development/libraries/spice-gtk {\n        };\n        spice_protocol = callPackage ../development/libraries/spice-protocol {\n        };\n        sratom = callPackage ../development/libraries/audio/sratom {\n        };\n        srtp = callPackage ../development/libraries/srtp {\n        };\n        srtp_linphone = callPackage ../development/libraries/srtp/linphone.nix {\n        };\n        sqlite = lowPrio (callPackage ../development/libraries/sqlite {\n          readline = null;\n          ncurses = null;\n        });\n        sqliteInteractive = appendToName \"interactive\" (sqlite.override {\n          inherit readline ncurses;\n        });\n        sqlcipher = lowPrio (callPackage ../development/libraries/sqlcipher {\n          readline = null;\n          ncurses = null;\n        });\n        stfl = callPackage ../development/libraries/stfl {\n          stdenv = if stdenv.isDarwin\n            then overrideGCC stdenv gccApple\n            else stdenv;\n        };\n        stlink = callPackage ../development/tools/misc/stlink {\n        };\n        steghide = callPackage ../tools/security/steghide {\n        };\n        stepmania = callPackage ../games/stepmania {\n        };\n        stlport = callPackage ../development/libraries/stlport {\n        };\n        strigi = callPackage ../development/libraries/strigi {\n          clucene_core = clucene_core_2;\n        };\n        subtitleeditor = callPackage ../applications/video/subtitleeditor {\n        };\n        suil = callPackage ../development/libraries/audio/suil {\n        };\n        suitesparse = callPackage ../development/libraries/suitesparse {\n        };\n        sutils = callPackage ../tools/misc/sutils {\n        };\n        sword = callPackage ../development/libraries/sword {\n        };\n        szip = callPackage ../development/libraries/szip {\n        };\n        t1lib = callPackage ../development/libraries/t1lib {\n        };\n        taglib = callPackage ../development/libraries/taglib {\n        };\n        taglib_extras = callPackage ../development/libraries/taglib-extras {\n        };\n        talloc = callPackage ../development/libraries/talloc {\n        };\n        tclap = callPackage ../development/libraries/tclap {\n        };\n        tclgpg = callPackage ../development/libraries/tclgpg {\n        };\n        tcllib = callPackage ../development/libraries/tcllib {\n        };\n        tcltls = callPackage ../development/libraries/tcltls {\n        };\n        tdb = callPackage ../development/libraries/tdb {\n        };\n        tecla = callPackage ../development/libraries/tecla {\n        };\n        telepathy_glib = callPackage ../development/libraries/telepathy/glib {\n        };\n        telepathy_farstream = callPackage ../development/libraries/telepathy/farstream {\n        };\n        telepathy_qt = callPackage ../development/libraries/telepathy/qt {\n        };\n        thrift = callPackage ../development/libraries/thrift {\n        };\n        tinyxml = tinyxml2;\n        tinyxml2 = callPackage ../development/libraries/tinyxml/2.6.2.nix {\n        };\n        tk = callPackage ../development/libraries/tk {\n        };\n        tnt = callPackage ../development/libraries/tnt {\n        };\n        tokyocabinet = callPackage ../development/libraries/tokyo-cabinet {\n        };\n        tokyotyrant = callPackage ../development/libraries/tokyo-tyrant {\n        };\n        tremor = callPackage ../development/libraries/tremor {\n        };\n        unicap = callPackage ../development/libraries/unicap {\n        };\n        tsocks = callPackage ../development/libraries/tsocks {\n        };\n        unixODBC = callPackage ../development/libraries/unixODBC {\n        };\n        unixODBCDrivers = recurseIntoAttrs (import ../development/libraries/unixODBCDrivers {\n          inherit fetchurl stdenv unixODBC\n          glibc libtool openssl zlib;\n          inherit postgresql mysql sqlite;\n        });\n        urt = callPackage ../development/libraries/urt {\n        };\n        ustr = callPackage ../development/libraries/ustr {\n        };\n        usbredir = callPackage ../development/libraries/usbredir {\n          libusb = libusb1;\n        };\n        ucommon = callPackage ../development/libraries/ucommon {\n        };\n        v8 = callPackage ../development/libraries/v8 {\n          inherit (pythonPackages) gyp;\n        };\n        vaapiIntel = callPackage ../development/libraries/vaapi-intel {\n        };\n        vaapiVdpau = callPackage ../development/libraries/vaapi-vdpau {\n        };\n        vamp = callPackage ../development/libraries/audio/vamp {\n        };\n        vcdimager = callPackage ../development/libraries/vcdimager {\n        };\n        vigra = callPackage ../development/libraries/vigra {\n          inherit (pkgs.pythonPackages) numpy;\n        };\n        vlock = callPackage ../misc/screensavers/vlock {\n        };\n        vmime = callPackage ../development/libraries/vmime {\n        };\n        vrpn = callPackage ../development/libraries/vrpn {\n        };\n        vtk = callPackage ../development/libraries/vtk {\n        };\n        vtkWithQt4 = vtk.override {\n          qtLib = qt4;\n        };\n        vxl = callPackage ../development/libraries/vxl {\n          libpng = libpng12;\n        };\n        wayland = callPackage ../development/libraries/wayland {\n        };\n        webkit = webkitgtk;\n        webkitgtk = callPackage ../development/libraries/webkitgtk {\n          harfbuzz = harfbuzz.override {\n            withIcu = true;\n          };\n          gst-plugins-base = gst_all_1.gst-plugins-base;\n        };\n        webkitgtk2 = webkitgtk.override {\n          withGtk2 = true;\n          enableIntrospection = false;\n        };\n        wildmidi = callPackage ../development/libraries/wildmidi {\n        };\n        wvstreams = callPackage ../development/libraries/wvstreams {\n        };\n        wxGTK = wxGTK28;\n        wxGTK28 = callPackage ../development/libraries/wxGTK-2.8 {\n          inherit (gnome) GConf;\n          withMesa = lib.elem system lib.platforms.mesaPlatforms;\n        };\n        wxGTK29 = callPackage ../development/libraries/wxGTK-2.9/default.nix {\n          inherit (gnome) GConf;\n          withMesa = lib.elem system lib.platforms.mesaPlatforms;\n          stdenv = if stdenv.isDarwin\n            then clangStdenv\n            else stdenv;\n        };\n        wxGTK30 = callPackage ../development/libraries/wxGTK-3.0/default.nix {\n          inherit (gnome) GConf;\n          withMesa = lib.elem system lib.platforms.mesaPlatforms;\n          stdenv = if stdenv.isDarwin\n            then clangStdenv\n            else stdenv;\n        };\n        wtk = callPackage ../development/libraries/wtk {\n        };\n        x264 = callPackage ../development/libraries/x264 {\n        };\n        xapian = callPackage ../development/libraries/xapian {\n        };\n        xapianBindings = callPackage ../development/libraries/xapian/bindings {\n        };\n        xapian10 = callPackage ../development/libraries/xapian/1.0.x.nix {\n        };\n        xapianBindings10 = callPackage ../development/libraries/xapian/bindings/1.0.x.nix {\n        };\n        Xaw3d = callPackage ../development/libraries/Xaw3d {\n        };\n        xbase = callPackage ../development/libraries/xbase {\n        };\n        xcb-util-cursor = callPackage ../development/libraries/xcb-util-cursor {\n        };\n        xdo = callPackage ../tools/misc/xdo {\n        };\n        xineLib = callPackage ../development/libraries/xine-lib {\n          ffmpeg = ffmpeg_1;\n        };\n        xautolock = callPackage ../misc/screensavers/xautolock {\n        };\n        xercesc = callPackage ../development/libraries/xercesc {\n        };\n        xlibsWrapper = callPackage ../development/libraries/xlibs-wrapper {\n          packages = [\n            freetype\n            fontconfig\n            xlibs.xproto\n            xlibs.libX11\n            xlibs.libXt\n            xlibs.libXft\n            xlibs.libXext\n            xlibs.libSM\n            xlibs.libICE\n            xlibs.xextproto\n          ];\n        };\n        xmlrpc_c = callPackage ../development/libraries/xmlrpc-c {\n        };\n        xmlsec = callPackage ../development/libraries/xmlsec {\n        };\n        xvidcore = callPackage ../development/libraries/xvidcore {\n        };\n        xylib = callPackage ../development/libraries/xylib {\n        };\n        yajl = callPackage ../development/libraries/yajl {\n        };\n        zangband = builderDefsPackage (import ../games/zangband) {\n          inherit ncurses flex bison\n          autoconf automake m4 coreutils;\n        };\n        zeitgeist = callPackage ../development/libraries/zeitgeist {\n        };\n        zlib = callPackage ../development/libraries/zlib {\n          fetchurl = fetchurlBoot;\n        };\n        zlibStatic = lowPrio (appendToName \"static\" (callPackage ../development/libraries/zlib {\n          static = true;\n        }));\n        zeromq2 = callPackage ../development/libraries/zeromq/2.x.nix {\n        };\n        zeromq3 = callPackage ../development/libraries/zeromq/3.x.nix {\n        };\n        zeromq4 = callPackage ../development/libraries/zeromq/4.x.nix {\n        };\n        zziplib = callPackage ../development/libraries/zziplib {\n        };\n        atermjava = callPackage ../development/libraries/java/aterm {\n          stdenv = overrideInStdenv stdenv [\n            gnumake380\n          ];\n        };\n        commonsFileUpload = callPackage ../development/libraries/java/jakarta-commons/file-upload {\n        };\n        fastjar = callPackage ../development/tools/java/fastjar {\n        };\n        httpunit = callPackage ../development/libraries/java/httpunit {\n        };\n        gwtdragdrop = callPackage ../development/libraries/java/gwt-dragdrop {\n        };\n        gwtwidgets = callPackage ../development/libraries/java/gwt-widgets {\n        };\n        jakartabcel = callPackage ../development/libraries/java/jakarta-bcel {\n          regexp = jakartaregexp;\n        };\n        jakartaregexp = callPackage ../development/libraries/java/jakarta-regexp {\n        };\n        javaCup = callPackage ../development/libraries/java/cup {\n        };\n        javasvn = callPackage ../development/libraries/java/javasvn {\n        };\n        jclasslib = callPackage ../development/tools/java/jclasslib {\n        };\n        jdom = callPackage ../development/libraries/java/jdom {\n        };\n        jflex = callPackage ../development/libraries/java/jflex {\n        };\n        jjtraveler = callPackage ../development/libraries/java/jjtraveler {\n          stdenv = overrideInStdenv stdenv [\n            gnumake380\n          ];\n        };\n        junit = callPackage ../development/libraries/java/junit {\n          antBuild = releaseTools.antBuild;\n        };\n        junixsocket = callPackage ../development/libraries/java/junixsocket {\n        };\n        jzmq = callPackage ../development/libraries/java/jzmq {\n        };\n        lucene = callPackage ../development/libraries/java/lucene {\n        };\n        mockobjects = callPackage ../development/libraries/java/mockobjects {\n        };\n        saxon = callPackage ../development/libraries/java/saxon {\n        };\n        saxonb = callPackage ../development/libraries/java/saxon/default8.nix {\n        };\n        sharedobjects = callPackage ../development/libraries/java/shared-objects {\n          stdenv = overrideInStdenv stdenv [\n            gnumake380\n          ];\n        };\n        smack = callPackage ../development/libraries/java/smack {\n        };\n        swt = callPackage ../development/libraries/java/swt {\n          inherit (gnome) libsoup;\n        };\n        jquery_ui = callPackage ../development/libraries/javascript/jquery-ui {\n        };\n        yuicompressor = callPackage ../development/tools/yuicompressor {\n        };\n        asdf = callPackage ../development/lisp-modules/asdf {\n          texLive = null;\n        };\n        clwrapperFunction = callPackage ../development/lisp-modules/clwrapper;\n        wrapLisp = lisp:\n        clwrapperFunction {\n          inherit lisp;\n        };\n        lispPackagesFor = clwrapper:\n        callPackage ../development/lisp-modules/lisp-packages.nix {\n          inherit clwrapper;\n        };\n        lispPackagesClisp = lispPackagesFor (wrapLisp clisp);\n        lispPackagesSBCL = lispPackagesFor (wrapLisp sbcl);\n        lispPackages = recurseIntoAttrs lispPackagesSBCL;\n        buildPerlPackage = import ../development/perl-modules/generic perl;\n        perlPackages = recurseIntoAttrs (import ./perl-packages.nix {\n          inherit pkgs;\n          overrides = (config.perlPackageOverrides or p:\n          { }) pkgs;\n        });\n        perl514Packages = import ./perl-packages.nix {\n          pkgs = pkgs // {\n            perl = perl514;\n            buildPerlPackage = import ../development/perl-modules/generic perl514;\n          };\n          overrides = (config.perl514PackageOverrides or p:\n          { }) pkgs;\n        };\n        perlXMLParser = perlPackages.XMLParser;\n        ack = perlPackages.ack;\n        perlArchiveCpio = perlPackages.ArchiveCpio;\n        perlcritic = perlPackages.PerlCritic;\n        planetary_annihilation = callPackage ../games/planetaryannihilation {\n        };\n        buildPythonPackage = pythonPackages.buildPythonPackage;\n        python26Packages = import ./python-packages.nix {\n          inherit pkgs;\n          python = python26;\n        };\n        python27Packages = lib.hiPrioSet (recurseIntoAttrs (import ./python-packages.nix {\n          inherit pkgs;\n          python = python27;\n        }));\n        python32Packages = import ./python-packages.nix {\n          inherit pkgs;\n          python = python32;\n        };\n        python33Packages = recurseIntoAttrs (import ./python-packages.nix {\n          inherit pkgs;\n          python = python33;\n        });\n        python34Packages = recurseIntoAttrs (import ./python-packages.nix {\n          inherit pkgs;\n          python = python34;\n        });\n        pypyPackages = recurseIntoAttrs (import ./python-packages.nix {\n          inherit pkgs;\n          python = pypy;\n        });\n        foursuite = callPackage ../development/python-modules/4suite {\n        };\n        bsddb3 = callPackage ../development/python-modules/bsddb3 {\n        };\n        ecdsa = callPackage ../development/python-modules/ecdsa {\n        };\n        numeric = callPackage ../development/python-modules/numeric {\n        };\n        pil = pythonPackages.pil;\n        psyco = callPackage ../development/python-modules/psyco {\n        };\n        pycairo = pythonPackages.pycairo;\n        pycapnp = pythonPackages.pycapnp;\n        pycrypto = pythonPackages.pycrypto;\n        pycups = callPackage ../development/python-modules/pycups {\n        };\n        pyexiv2 = callPackage ../development/python-modules/pyexiv2 {\n        };\n        pygame = callPackage ../development/python-modules/pygame {\n        };\n        pygobject = pythonPackages.pygobject;\n        pygobject3 = pythonPackages.pygobject3;\n        pygtk = pythonPackages.pygtk;\n        pyGtkGlade = pythonPackages.pyGtkGlade;\n        pylint = callPackage ../development/python-modules/pylint {\n        };\n        pyopenssl = builderDefsPackage (import ../development/python-modules/pyopenssl) {\n          inherit python openssl;\n        };\n        rhpl = callPackage ../development/python-modules/rhpl {\n        };\n        sip = callPackage ../development/python-modules/sip {\n        };\n        pyqt4 = callPackage ../development/python-modules/pyqt/4.x.nix {\n          stdenv = if stdenv.isDarwin\n            then clangStdenv\n            else stdenv;\n        };\n        pysideApiextractor = callPackage ../development/python-modules/pyside/apiextractor.nix {\n        };\n        pysideGeneratorrunner = callPackage ../development/python-modules/pyside/generatorrunner.nix {\n        };\n        pyside = callPackage ../development/python-modules/pyside {\n        };\n        pysideTools = callPackage ../development/python-modules/pyside/tools.nix {\n        };\n        pysideShiboken = callPackage ../development/python-modules/pyside/shiboken.nix {\n        };\n        pyx = callPackage ../development/python-modules/pyx {\n        };\n        pyxml = callPackage ../development/python-modules/pyxml {\n        };\n        rbtools = callPackage ../development/python-modules/rbtools {\n        };\n        setuptools = pythonPackages.setuptools;\n        slowaes = callPackage ../development/python-modules/slowaes {\n        };\n        wxPython = pythonPackages.wxPython;\n        wxPython28 = pythonPackages.wxPython28;\n        twisted = pythonPackages.twisted;\n        ZopeInterface = pythonPackages.zope_interface;\n        R = callPackage ../applications/science/math/R {\n          inherit (xlibs) libX11 libXt;\n          texLive = texLiveAggregationFun {\n            paths = [\n              texLive\n              texLiveExtra\n            ];\n          };\n          withRecommendedPackages = false;\n        };\n        rWrapper = callPackage ../development/r-modules/wrapper.nix {\n          recommendedPackages = with rPackages; [\n            MASS\n            lattice\n            Matrix\n            nlme\n            survival\n            boot\n            cluster\n            codetools\n            foreign\n            KernSmooth\n            rpart\n            class\n            nnet\n            spatial\n            mgcv\n          ];\n          packages = [ ];\n        };\n        rPackages = import ../development/r-modules/cran-packages.nix {\n          inherit pkgs;\n          overrides = (config.rPackageOverrides or p:\n          { }) pkgs;\n        };\n        rdf4store = callPackage ../servers/http/4store {\n        };\n        apacheHttpd = pkgs.apacheHttpd_2_2;\n        apacheHttpd_2_2 = callPackage ../servers/http/apache-httpd/2.2.nix {\n          sslSupport = true;\n        };\n        apacheHttpd_2_4 = lowPrio (callPackage ../servers/http/apache-httpd/2.4.nix {\n          sslSupport = true;\n        });\n        apcupsd = callPackage ../servers/apcupsd {\n        };\n        sabnzbd = callPackage ../servers/sabnzbd {\n        };\n        bind = callPackage ../servers/dns/bind {\n        };\n        bird = callPackage ../servers/bird {\n        };\n        couchdb = callPackage ../servers/http/couchdb {\n          spidermonkey = spidermonkey_185;\n          python = python27;\n          sphinx = python27Packages.sphinx;\n          erlang = erlangR16;\n        };\n        dico = callPackage ../servers/dico {\n        };\n        dict = callPackage ../servers/dict {\n          libmaa = callPackage ../servers/dict/libmaa.nix {\n          };\n        };\n        dictdDBs = recurseIntoAttrs (import ../servers/dict/dictd-db.nix {\n          inherit builderDefs;\n        });\n        dictDBCollector = import ../servers/dict/dictd-db-collector.nix {\n          inherit stdenv lib dict;\n        };\n        dictdWiktionary = callPackage ../servers/dict/dictd-wiktionary.nix {\n        };\n        dictdWordnet = callPackage ../servers/dict/dictd-wordnet.nix {\n        };\n        diod = callPackage ../servers/diod {\n        };\n        dovecot = dovecot21;\n        dovecot21 = callPackage ../servers/mail/dovecot {\n        };\n        dovecot22 = callPackage ../servers/mail/dovecot/2.2.x.nix {\n        };\n        dovecot_pigeonhole = callPackage ../servers/mail/dovecot-pigeonhole {\n        };\n        etcd = callPackage ../servers/etcd {\n        };\n        ejabberd = callPackage ../servers/xmpp/ejabberd {\n          erlang = erlangR16;\n        };\n        elasticmq = callPackage ../servers/elasticmq {\n        };\n        etcdctl = callPackage ../development/tools/etcdctl {\n        };\n        fcgiwrap = callPackage ../servers/fcgiwrap {\n        };\n        felix = callPackage ../servers/felix {\n        };\n        felix_remoteshell = callPackage ../servers/felix/remoteshell.nix {\n        };\n        fingerd_bsd = callPackage ../servers/fingerd/bsd-fingerd {\n        };\n        firebird = callPackage ../servers/firebird {\n          icu = null;\n        };\n        firebirdSuper = callPackage ../servers/firebird {\n          superServer = true;\n        };\n        fleet = callPackage ../servers/fleet {\n        };\n        freepops = callPackage ../servers/mail/freepops {\n        };\n        freeswitch = callPackage ../servers/sip/freeswitch {\n        };\n        ghostOne = callPackage ../servers/games/ghost-one {\n          boost = boost144.override {\n            taggedLayout = true;\n          };\n        };\n        ircdHybrid = callPackage ../servers/irc/ircd-hybrid {\n        };\n        jboss = callPackage ../servers/http/jboss {\n        };\n        jboss_mysql_jdbc = callPackage ../servers/http/jboss/jdbc/mysql {\n        };\n        jetty = callPackage ../servers/http/jetty {\n        };\n        jetty61 = callPackage ../servers/http/jetty/6.1 {\n        };\n        joseki = callPackage ../servers/http/joseki {\n        };\n        leafnode = callPackage ../servers/news/leafnode {\n        };\n        lighttpd = callPackage ../servers/http/lighttpd {\n        };\n        mailman = callPackage ../servers/mail/mailman {\n        };\n        mediatomb = callPackage ../servers/mediatomb {\n        };\n        memcached = callPackage ../servers/memcached {\n        };\n        mod_dnssd = callPackage ../servers/http/apache-modules/mod_dnssd/default.nix {\n        };\n        mod_evasive = callPackage ../servers/http/apache-modules/mod_evasive {\n        };\n        mod_python = callPackage ../servers/http/apache-modules/mod_python {\n        };\n        mod_fastcgi = callPackage ../servers/http/apache-modules/mod_fastcgi {\n        };\n        mod_wsgi = callPackage ../servers/http/apache-modules/mod_wsgi {\n        };\n        mpd = callPackage ../servers/mpd {\n          aacSupport = config.mpd.aacSupport or true;\n          ffmpegSupport = config.mpd.ffmpegSupport or true;\n        };\n        mpd_clientlib = callPackage ../servers/mpd/clientlib.nix {\n        };\n        miniHttpd = callPackage ../servers/http/mini-httpd {\n        };\n        mlmmj = callPackage ../servers/mail/mlmmj {\n        };\n        myserver = callPackage ../servers/http/myserver {\n        };\n        nginx = callPackage ../servers/http/nginx {\n          rtmp = true;\n          fullWebDAV = true;\n          syslog = true;\n          moreheaders = true;\n        };\n        ngircd = callPackage ../servers/irc/ngircd {\n        };\n        nix-binary-cache = callPackage ../servers/http/nix-binary-cache {\n        };\n        nsd = callPackage ../servers/dns/nsd {\n        };\n        nsq = callPackage ../servers/nsq {\n        };\n        openresty = callPackage ../servers/http/openresty {\n        };\n        opensmtpd = callPackage ../servers/mail/opensmtpd {\n        };\n        petidomo = callPackage ../servers/mail/petidomo {\n        };\n        popa3d = callPackage ../servers/mail/popa3d {\n        };\n        postfix = callPackage ../servers/mail/postfix {\n        };\n        postfix211 = callPackage ../servers/mail/postfix/2.11.nix {\n        };\n        pulseaudio = callPackage ../servers/pulseaudio {\n          gconf = gnome.GConf;\n          bluez = null;\n          avahi = null;\n        };\n        pulseaudioFull = pulseaudio.override {\n          bluez = bluez5;\n          avahi = avahi;\n          jackaudioSupport = true;\n          x11Support = true;\n        };\n        tomcat_connectors = callPackage ../servers/http/apache-modules/tomcat-connectors {\n        };\n        pies = callPackage ../servers/pies {\n        };\n        portmap = callPackage ../servers/portmap {\n        };\n        rpcbind = callPackage ../servers/rpcbind {\n        };\n        mariadb = callPackage ../servers/sql/mariadb {\n        };\n        mongodb = callPackage ../servers/nosql/mongodb {\n        };\n        riak = callPackage ../servers/nosql/riak/1.3.1.nix {\n        };\n        influxdb = callPackage ../servers/nosql/influxdb {\n        };\n        mysql51 = import ../servers/sql/mysql/5.1.x.nix {\n          inherit fetchurl ncurses zlib\n          perl openssl stdenv;\n          ps = procps;\n        };\n        mysql55 = callPackage ../servers/sql/mysql/5.5.x.nix {\n        };\n        mysql = mysql51;\n        mysql_jdbc = callPackage ../servers/sql/mysql/jdbc {\n        };\n        nagios = callPackage ../servers/monitoring/nagios {\n        };\n        munin = callPackage ../servers/monitoring/munin {\n        };\n        nagiosPluginsOfficial = callPackage ../servers/monitoring/nagios/plugins/official-2.x.nix {\n        };\n        neo4j = callPackage ../servers/nosql/neo4j {\n        };\n        net_snmp = callPackage ../servers/monitoring/net-snmp {\n        };\n        riemann = callPackage ../servers/monitoring/riemann {\n        };\n        oidentd = callPackage ../servers/identd/oidentd {\n        };\n        openfire = callPackage ../servers/xmpp/openfire {\n        };\n        oracleXE = callPackage ../servers/sql/oracle-xe {\n        };\n        OVMF = callPackage ../applications/virtualization/OVMF {\n        };\n        postgresql = postgresql92;\n        postgresql84 = callPackage ../servers/sql/postgresql/8.4.x.nix {\n        };\n        postgresql90 = callPackage ../servers/sql/postgresql/9.0.x.nix {\n        };\n        postgresql91 = callPackage ../servers/sql/postgresql/9.1.x.nix {\n        };\n        postgresql92 = callPackage ../servers/sql/postgresql/9.2.x.nix {\n        };\n        postgresql93 = callPackage ../servers/sql/postgresql/9.3.x.nix {\n        };\n        postgresql_jdbc = callPackage ../servers/sql/postgresql/jdbc {\n        };\n        psqlodbc = callPackage ../servers/sql/postgresql/psqlodbc {\n        };\n        pyIRCt = builderDefsPackage (import ../servers/xmpp/pyIRCt) {\n          inherit xmpppy pythonIRClib\n          python makeWrapper;\n        };\n        pyMAILt = builderDefsPackage (import ../servers/xmpp/pyMAILt) {\n          inherit xmpppy python\n          makeWrapper fetchcvs;\n        };\n        qpid-cpp = callPackage ../servers/amqp/qpid-cpp {\n        };\n        rabbitmq_server = callPackage ../servers/amqp/rabbitmq-server {\n        };\n        radius = callPackage ../servers/radius {\n        };\n        redis = callPackage ../servers/nosql/redis {\n        };\n        redstore = callPackage ../servers/http/redstore {\n        };\n        restund = callPackage ../servers/restund {\n        };\n        rethinkdb = callPackage ../servers/nosql/rethinkdb {\n        };\n        rippled = callPackage ../servers/rippled {\n        };\n        s6 = callPackage ../servers/s6 {\n        };\n        spamassassin = callPackage ../servers/mail/spamassassin {\n          inherit (perlPackages) HTMLParser\n          NetDNS NetAddrIP DBFile HTTPDate\n          MailDKIM LWP IOSocketSSL;\n        };\n        samba = callPackage ../servers/samba {\n        };\n        samba_light = lowPrio (callPackage ../servers/samba {\n          pam = null;\n          fam = null;\n          cups = null;\n          acl = null;\n          openldap = null;\n          libunwind = null;\n        });\n        serfdom = callPackage ../servers/serfdom {\n        };\n        seyren = callPackage ../servers/monitoring/seyren {\n        };\n        shishi = callPackage ../servers/shishi {\n        };\n        sipwitch = callPackage ../servers/sip/sipwitch {\n        };\n        spawn_fcgi = callPackage ../servers/http/spawn-fcgi {\n        };\n        squids = recurseIntoAttrs (import ../servers/squid/squids.nix {\n          inherit fetchurl stdenv perl lib\n          composableDerivation openldap\n          pam db cyrus_sasl kerberos\n          libcap expat libxml2 libtool\n          openssl;\n        });\n        squid = squids.squid31;\n        thttpd = callPackage ../servers/http/thttpd {\n        };\n        storm = callPackage ../servers/computing/storm {\n        };\n        tomcat5 = callPackage ../servers/http/tomcat/5.0.nix {\n        };\n        tomcat6 = callPackage ../servers/http/tomcat/6.0.nix {\n        };\n        tomcat_mysql_jdbc = callPackage ../servers/http/tomcat/jdbc/mysql {\n        };\n        axis2 = callPackage ../servers/http/tomcat/axis2 {\n        };\n        unifi = callPackage ../servers/unifi {\n        };\n        virtuoso6 = callPackage ../servers/sql/virtuoso/6.x.nix {\n        };\n        virtuoso7 = callPackage ../servers/sql/virtuoso/7.x.nix {\n        };\n        virtuoso = virtuoso6;\n        vsftpd = callPackage ../servers/ftp/vsftpd {\n        };\n        winstone = callPackage ../servers/http/winstone {\n        };\n        xinetd = callPackage ../servers/xinetd {\n        };\n        xquartz = callPackage ../servers/x11/xquartz {\n        };\n        quartz-wm = callPackage ../servers/x11/quartz-wm {\n          stdenv = clangStdenv;\n        };\n        xorg = recurseIntoAttrs (import ../servers/x11/xorg/default.nix {\n          inherit clangStdenv fetchurl\n          fetchgit fetchpatch stdenv\n          pkgconfig intltool freetype\n          fontconfig libxslt expat libpng\n          zlib perl mesa_drivers\n          spice_protocol dbus libuuid\n          openssl gperf m4 autoconf\n          automake libtool xmlto asciidoc\n          flex bison python mtdev pixman;\n          mesa = mesa_noglu;\n          udev = if stdenv.isLinux\n            then udev\n            else null;\n          libdrm = if stdenv.isLinux\n            then libdrm\n            else null;\n        } // {\n          xf86videointel-testing = callPackage ../servers/x11/xorg/xf86-video-intel-testing.nix {\n          };\n        });\n        xorgReplacements = callPackage ../servers/x11/xorg/replacements.nix {\n        };\n        xorgVideoUnichrome = callPackage ../servers/x11/xorg/unichrome/default.nix {\n        };\n        yaws = callPackage ../servers/http/yaws {\n        };\n        zabbix = recurseIntoAttrs (import ../servers/monitoring/zabbix {\n          inherit fetchurl stdenv\n          pkgconfig postgresql curl\n          openssl zlib;\n        });\n        zabbix20 = callPackage ../servers/monitoring/zabbix/2.0.nix {\n        };\n        zabbix22 = callPackage ../servers/monitoring/zabbix/2.2.nix {\n        };\n        afuse = callPackage ../os-specific/linux/afuse {\n        };\n        amdUcode = callPackage ../os-specific/linux/microcode/amd.nix {\n        };\n        autofs5 = callPackage ../os-specific/linux/autofs/autofs-v5.nix {\n        };\n        _915resolution = callPackage ../os-specific/linux/915resolution {\n        };\n        nfsUtils = callPackage ../os-specific/linux/nfs-utils {\n        };\n        acpi = callPackage ../os-specific/linux/acpi {\n        };\n        acpid = callPackage ../os-specific/linux/acpid {\n        };\n        acpitool = callPackage ../os-specific/linux/acpitool {\n        };\n        alienfx = callPackage ../os-specific/linux/alienfx {\n        };\n        alsaLib = callPackage ../os-specific/linux/alsa-lib {\n        };\n        alsaPlugins = callPackage ../os-specific/linux/alsa-plugins {\n          jack2 = null;\n        };\n        alsaPluginWrapper = callPackage ../os-specific/linux/alsa-plugins/wrapper.nix {\n        };\n        alsaUtils = callPackage ../os-specific/linux/alsa-utils {\n        };\n        alsaOss = callPackage ../os-specific/linux/alsa-oss {\n        };\n        microcode2ucode = callPackage ../os-specific/linux/microcode/converter.nix {\n        };\n        microcodeIntel = callPackage ../os-specific/linux/microcode/intel.nix {\n        };\n        apparmor = callPackage ../os-specific/linux/apparmor {\n          inherit (perlPackages) LocaleGettext\n          TermReadKey RpcXML;\n          bison = bison2;\n        };\n        atop = callPackage ../os-specific/linux/atop {\n        };\n        audit = callPackage ../os-specific/linux/audit {\n        };\n        b43Firmware_5_1_138 = callPackage ../os-specific/linux/firmware/b43-firmware/5.1.138.nix {\n        };\n        b43FirmwareCutter = callPackage ../os-specific/linux/firmware/b43-firmware-cutter {\n        };\n        batctl = callPackage ../os-specific/linux/batman-adv/batctl.nix {\n        };\n        bluez4 = callPackage ../os-specific/linux/bluez {\n          pygobject = pygobject3;\n        };\n        bluez5 = lowPrio (callPackage ../os-specific/linux/bluez/bluez5.nix {\n        });\n        bluez = bluez4;\n        inherit (pythonPackages) bedup;\n        beret = callPackage ../games/beret {\n        };\n        bridge_utils = callPackage ../os-specific/linux/bridge-utils {\n        };\n        busybox = callPackage ../os-specific/linux/busybox {\n        };\n        checkpolicy = callPackage ../os-specific/linux/checkpolicy {\n        };\n        checksec = callPackage ../os-specific/linux/checksec {\n        };\n        cifs_utils = callPackage ../os-specific/linux/cifs-utils {\n        };\n        conky = callPackage ../os-specific/linux/conky {\n          mpdSupport = config.conky.mpdSupport or true;\n          x11Support = config.conky.x11Support or false;\n          xdamage = config.conky.xdamage or false;\n          wireless = config.conky.wireless or false;\n          luaSupport = config.conky.luaSupport or false;\n          rss = config.conky.rss or false;\n          weatherMetar = config.conky.weatherMetar or false;\n          weatherXoap = config.conky.weatherXoap or false;\n        };\n        cpufrequtils = callPackage ../os-specific/linux/cpufrequtils {\n        };\n        cryopid = callPackage ../os-specific/linux/cryopid {\n        };\n        criu = callPackage ../os-specific/linux/criu {\n        };\n        cryptsetup = callPackage ../os-specific/linux/cryptsetup {\n        };\n        cramfsswap = callPackage ../os-specific/linux/cramfsswap {\n        };\n        darwin = rec {\n          cctools = forceNativeDrv (callPackage ../os-specific/darwin/cctools-port {\n            cross = assert crossSystem != null; crossSystem;\n            inherit maloader;\n            xctoolchain = xcode.toolchain;\n          });\n          maloader = callPackage ../os-specific/darwin/maloader {\n            inherit opencflite;\n          };\n          opencflite = callPackage ../os-specific/darwin/opencflite {\n          };\n          xcode = callPackage ../os-specific/darwin/xcode {\n          };\n        };\n        devicemapper = lvm2;\n        disk_indicator = callPackage ../os-specific/linux/disk-indicator {\n        };\n        dmidecode = callPackage ../os-specific/linux/dmidecode {\n        };\n        dmtcp = callPackage ../os-specific/linux/dmtcp {\n        };\n        dietlibc = callPackage ../os-specific/linux/dietlibc {\n        };\n        directvnc = builderDefsPackage ../os-specific/linux/directvnc {\n          inherit libjpeg pkgconfig zlib\n          directfb;\n          inherit (xlibs) xproto;\n        };\n        dmraid = callPackage ../os-specific/linux/dmraid {\n        };\n        drbd = callPackage ../os-specific/linux/drbd {\n        };\n        dstat = callPackage ../os-specific/linux/dstat {\n          python = pythonFull;\n        };\n        libossp_uuid = callPackage ../development/libraries/libossp-uuid {\n        };\n        libuuid = if crossSystem != null && crossSystem.config == \"i586-pc-gnu\"\n          then utillinux // {\n            crossDrv = lib.overrideDerivation utillinux.crossDrv (args:\n            {\n              configureFlags = args.configureFlags + \" --disable-libblkid --disable-mount --disable-libmount\" + \" --disable-fsck --enable-static --disable-partx\";\n              doCheck = false;\n              CPPFLAGS = lib.concatStringsSep \" \" (map (v:\n              \"-D${v}=4096\") [\n                \"PATH_MAX\"\n                \"MAXPATHLEN\"\n                \"MAXHOSTNAMELEN\"\n              ]);\n            });\n          }\n          else if stdenv.isLinux\n            then utillinux\n            else null;\n        e3cfsprogs = callPackage ../os-specific/linux/e3cfsprogs {\n        };\n        ebtables = callPackage ../os-specific/linux/ebtables {\n        };\n        eject = utillinux;\n        ffado = callPackage ../os-specific/linux/ffado {\n        };\n        fbterm = callPackage ../os-specific/linux/fbterm {\n        };\n        firejail = callPackage ../os-specific/linux/firejail {\n        };\n        fuse = callPackage ../os-specific/linux/fuse {\n        };\n        fxload = callPackage ../os-specific/linux/fxload {\n        };\n        gfxtablet = callPackage ../os-specific/linux/gfxtablet {\n        };\n        gpm = callPackage ../servers/gpm {\n        };\n        gradm = callPackage ../os-specific/linux/gradm {\n          flex = flex_2_5_35;\n        };\n        hdparm = callPackage ../os-specific/linux/hdparm {\n        };\n        hibernate = callPackage ../os-specific/linux/hibernate {\n        };\n        hostapd = callPackage ../os-specific/linux/hostapd {\n        };\n        htop = if stdenv.isLinux\n          then callPackage ../os-specific/linux/htop {\n          }\n          else if stdenv.isDarwin\n            then callPackage ../os-specific/darwin/htop {\n            }\n            else null;\n        gnu = recurseIntoAttrs (callPackage ../os-specific/gnu {\n          inherit platform crossSystem;\n        });\n        hwdata = callPackage ../os-specific/linux/hwdata {\n        };\n        i7z = callPackage ../os-specific/linux/i7z {\n        };\n        ifplugd = callPackage ../os-specific/linux/ifplugd {\n        };\n        iomelt = callPackage ../os-specific/linux/iomelt {\n        };\n        iotop = callPackage ../os-specific/linux/iotop {\n        };\n        iproute = callPackage ../os-specific/linux/iproute {\n        };\n        iputils = callPackage ../os-specific/linux/iputils {\n          sp = spCompat;\n          inherit (perlPackages) SGMLSpm;\n        };\n        iptables = callPackage ../os-specific/linux/iptables {\n        };\n        iw = callPackage ../os-specific/linux/iw {\n        };\n        jujuutils = callPackage ../os-specific/linux/jujuutils {\n        };\n        kbd = callPackage ../os-specific/linux/kbd {\n        };\n        kmscon = callPackage ../os-specific/linux/kmscon {\n        };\n        latencytop = callPackage ../os-specific/linux/latencytop {\n        };\n        ldm = callPackage ../os-specific/linux/ldm {\n        };\n        libaio = callPackage ../os-specific/linux/libaio {\n        };\n        libatasmart = callPackage ../os-specific/linux/libatasmart {\n        };\n        libcgroup = callPackage ../os-specific/linux/libcgroup {\n        };\n        libnl = callPackage ../os-specific/linux/libnl {\n        };\n        libnl_3_2_19 = callPackage ../os-specific/linux/libnl/3.2.19.nix {\n        };\n        linuxConsoleTools = callPackage ../os-specific/linux/consoletools {\n        };\n        linuxHeaders = linuxHeaders_3_7;\n        linuxHeaders24Cross = forceNativeDrv (import ../os-specific/linux/kernel-headers/2.4.nix {\n          inherit stdenv fetchurl perl;\n          cross = assert crossSystem != null; crossSystem;\n        });\n        linuxHeaders26Cross = forceNativeDrv (import ../os-specific/linux/kernel-headers/2.6.32.nix {\n          inherit stdenv fetchurl perl;\n          cross = assert crossSystem != null; crossSystem;\n        });\n        linuxHeaders_3_7 = callPackage ../os-specific/linux/kernel-headers/3.7.nix {\n        };\n        linuxHeaders_3_14 = callPackage ../os-specific/linux/kernel-headers/3.14.nix {\n        };\n        linuxHeadersCrossChooser = ver:\n        if ver == \"2.4\"\n          then linuxHeaders24Cross\n          else if ver == \"2.6\"\n            then linuxHeaders26Cross\n            else throw \"Unknown linux kernel version\";\n        linuxHeadersCross = assert crossSystem != null; linuxHeadersCrossChooser crossSystem.platform.kernelMajor;\n        kernelPatches = callPackage ../os-specific/linux/kernel/patches.nix {\n        };\n        linux_3_2 = makeOverridable (import ../os-specific/linux/kernel/linux-3.2.nix) {\n          inherit fetchurl stdenv perl\n          buildLinux;\n          kernelPatches = [ ];\n        };\n        linux_3_2_xen = lowPrio (linux_3_2.override {\n          extraConfig = ''XEN_DOM0 y'';\n        });\n        linux_3_4 = makeOverridable (import ../os-specific/linux/kernel/linux-3.4.nix) {\n          inherit fetchurl stdenv perl\n          buildLinux;\n          kernelPatches = lib.optionals ((platform.kernelArch or null) == \"mips\") [\n            kernelPatches.mips_fpureg_emu\n            kernelPatches.mips_fpu_sigill\n          ];\n        };\n        linux_3_6_rpi = makeOverridable (import ../os-specific/linux/kernel/linux-rpi-3.6.nix) {\n          inherit fetchurl stdenv perl\n          buildLinux;\n        };\n        linux_3_10 = makeOverridable (import ../os-specific/linux/kernel/linux-3.10.nix) {\n          inherit fetchurl stdenv perl\n          buildLinux;\n          kernelPatches = lib.optionals ((platform.kernelArch or null) == \"mips\") [\n            kernelPatches.mips_fpureg_emu\n            kernelPatches.mips_fpu_sigill\n            kernelPatches.mips_ext3_n32\n          ];\n        };\n        linux_3_12 = makeOverridable (import ../os-specific/linux/kernel/linux-3.12.nix) {\n          inherit fetchurl stdenv perl\n          buildLinux;\n          kernelPatches = lib.optionals ((platform.kernelArch or null) == \"mips\") [\n            kernelPatches.mips_fpureg_emu\n            kernelPatches.mips_fpu_sigill\n            kernelPatches.mips_ext3_n32\n          ];\n        };\n        linux_3_14 = makeOverridable (import ../os-specific/linux/kernel/linux-3.14.nix) {\n          inherit fetchurl stdenv perl\n          buildLinux;\n          kernelPatches = lib.optionals ((platform.kernelArch or null) == \"mips\") [\n            kernelPatches.mips_fpureg_emu\n            kernelPatches.mips_fpu_sigill\n            kernelPatches.mips_ext3_n32\n          ];\n        };\n        linux_3_15 = makeOverridable (import ../os-specific/linux/kernel/linux-3.15.nix) {\n          inherit fetchurl stdenv perl\n          buildLinux;\n          kernelPatches = lib.optionals ((platform.kernelArch or null) == \"mips\") [\n            kernelPatches.mips_fpureg_emu\n            kernelPatches.mips_fpu_sigill\n            kernelPatches.mips_ext3_n32\n          ];\n        };\n        linux_3_16 = makeOverridable (import ../os-specific/linux/kernel/linux-3.16.nix) {\n          inherit fetchurl stdenv perl\n          buildLinux;\n          kernelPatches = lib.optionals ((platform.kernelArch or null) == \"mips\") [\n            kernelPatches.mips_fpureg_emu\n            kernelPatches.mips_fpu_sigill\n            kernelPatches.mips_ext3_n32\n          ];\n        };\n        linux_testing = makeOverridable (import ../os-specific/linux/kernel/linux-testing.nix) {\n          inherit fetchurl stdenv perl\n          buildLinux;\n          kernelPatches = lib.optionals ((platform.kernelArch or null) == \"mips\") [\n            kernelPatches.mips_fpureg_emu\n            kernelPatches.mips_fpu_sigill\n            kernelPatches.mips_ext3_n32\n          ];\n        };\n        grFlavors = import ../build-support/grsecurity/flavors.nix;\n        mkGrsecurity = opts:\n        import ../build-support/grsecurity {\n          grsecOptions = opts;\n          inherit pkgs lib;\n        };\n        grKernel = opts:\n        (mkGrsecurity opts).grsecKernel;\n        grPackage = opts:\n        recurseIntoAttrs (mkGrsecurity opts).grsecPackage;\n        linux_grsec_stable_desktop = grKernel grFlavors.linux_grsec_stable_desktop;\n        linux_grsec_stable_server = grKernel grFlavors.linux_grsec_stable_server;\n        linux_grsec_stable_server_xen = grKernel grFlavors.linux_grsec_stable_server_xen;\n        linux_grsec_testing_desktop = grKernel grFlavors.linux_grsec_testing_desktop;\n        linux_grsec_testing_server = grKernel grFlavors.linux_grsec_testing_server;\n        linux_grsec_testing_server_xen = grKernel grFlavors.linux_grsec_testing_server_xen;\n        linuxPackagesFor = kernel: self:\n        let\n          callPackage = newScope self;\n          in {\n            inherit kernel;\n            acpi_call = callPackage ../os-specific/linux/acpi-call {\n            };\n            batman_adv = callPackage ../os-specific/linux/batman-adv {\n            };\n            bbswitch = callPackage ../os-specific/linux/bbswitch {\n            };\n            ati_drivers_x11 = callPackage ../os-specific/linux/ati-drivers {\n            };\n            blcr = callPackage ../os-specific/linux/blcr {\n            };\n            cryptodev = callPackage ../os-specific/linux/cryptodev {\n            };\n            cpupower = callPackage ../os-specific/linux/cpupower {\n            };\n            e1000e = callPackage ../os-specific/linux/e1000e {\n            };\n            v4l2loopback = callPackage ../os-specific/linux/v4l2loopback {\n            };\n            frandom = callPackage ../os-specific/linux/frandom {\n            };\n            ktap = callPackage ../os-specific/linux/ktap {\n            };\n            lttng-modules = callPackage ../os-specific/linux/lttng-modules {\n            };\n            broadcom_sta = callPackage ../os-specific/linux/broadcom-sta/default.nix {\n            };\n            nvidiabl = callPackage ../os-specific/linux/nvidiabl {\n            };\n            nvidia_x11 = callPackage ../os-specific/linux/nvidia-x11 {\n            };\n            nvidia_x11_legacy173 = callPackage ../os-specific/linux/nvidia-x11/legacy173.nix {\n            };\n            nvidia_x11_legacy304 = callPackage ../os-specific/linux/nvidia-x11/legacy304.nix {\n            };\n            openafsClient = callPackage ../servers/openafs-client {\n            };\n            openiscsi = callPackage ../os-specific/linux/open-iscsi {\n            };\n            wis_go7007 = callPackage ../os-specific/linux/wis-go7007 {\n            };\n            kernelHeaders = callPackage ../os-specific/linux/kernel-headers {\n            };\n            klibc = callPackage ../os-specific/linux/klibc {\n            };\n            klibcShrunk = lowPrio (callPackage ../os-specific/linux/klibc/shrunk.nix {\n            });\n            ndiswrapper = callPackage ../os-specific/linux/ndiswrapper {\n            };\n            netatop = callPackage ../os-specific/linux/netatop {\n            };\n            perf = callPackage ../os-specific/linux/kernel/perf.nix {\n            };\n            psmouse_alps = callPackage ../os-specific/linux/psmouse-alps {\n            };\n            spl = callPackage ../os-specific/linux/spl {\n            };\n            spl_git = callPackage ../os-specific/linux/spl/git.nix {\n            };\n            sysdig = callPackage ../os-specific/linux/sysdig {\n            };\n            tp_smapi = callPackage ../os-specific/linux/tp_smapi {\n            };\n            v86d = callPackage ../os-specific/linux/v86d {\n            };\n            virtualbox = callPackage ../applications/virtualization/virtualbox {\n              stdenv = stdenv_32bit;\n              inherit (gnome) libIDL;\n              enableExtensionPack = config.virtualbox.enableExtensionPack or false;\n            };\n            virtualboxGuestAdditions = callPackage ../applications/virtualization/virtualbox/guest-additions {\n            };\n            zfs = callPackage ../os-specific/linux/zfs {\n            };\n            zfs_git = callPackage ../os-specific/linux/zfs/git.nix {\n            };\n          };\n        linux = linuxPackages.kernel;\n        linuxPackages = linuxPackages_3_12;\n        linux_latest = pkgs.linux_3_16;\n        linuxPackages_latest = pkgs.linuxPackages_3_16;\n        linuxPackages_3_2 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_2 linuxPackages_3_2);\n        linuxPackages_3_2_xen = linuxPackagesFor pkgs.linux_3_2_xen linuxPackages_3_2_xen;\n        linuxPackages_3_4 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_4 linuxPackages_3_4);\n        linuxPackages_3_6_rpi = linuxPackagesFor pkgs.linux_3_6_rpi linuxPackages_3_6_rpi;\n        linuxPackages_3_10 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_10 linuxPackages_3_10);\n        linuxPackages_3_10_tuxonice = linuxPackagesFor pkgs.linux_3_10_tuxonice linuxPackages_3_10_tuxonice;\n        linuxPackages_3_12 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_12 linuxPackages_3_12);\n        linuxPackages_3_14 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_14 linuxPackages_3_14);\n        linuxPackages_3_15 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_15 linuxPackages_3_15);\n        linuxPackages_3_16 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_16 linuxPackages_3_16);\n        linuxPackages_testing = recurseIntoAttrs (linuxPackagesFor pkgs.linux_testing linuxPackages_testing);\n        linuxPackages_grsec_stable_desktop = grPackage grFlavors.linux_grsec_stable_desktop;\n        linuxPackages_grsec_stable_server = grPackage grFlavors.linux_grsec_stable_server;\n        linuxPackages_grsec_stable_server_xen = grPackage grFlavors.linux_grsec_stable_server_xen;\n        linuxPackages_grsec_testing_desktop = grPackage grFlavors.linux_grsec_testing_desktop;\n        linuxPackages_grsec_testing_server = grPackage grFlavors.linux_grsec_testing_server;\n        linuxPackages_grsec_testing_server_xen = grPackage grFlavors.linux_grsec_testing_server_xen;\n        linuxManualConfig = pkgs.buildLinux;\n        buildLinux = import ../os-specific/linux/kernel/manual-config.nix {\n          inherit (pkgs) stdenv runCommand\n          nettools bc perl kmod\n          writeTextFile ubootChooser;\n        };\n        keyutils = callPackage ../os-specific/linux/keyutils {\n        };\n        libselinux = callPackage ../os-specific/linux/libselinux {\n        };\n        libsemanage = callPackage ../os-specific/linux/libsemanage {\n        };\n        libraw = callPackage ../development/libraries/libraw {\n        };\n        libraw1394 = callPackage ../development/libraries/libraw1394 {\n        };\n        libsexy = callPackage ../development/libraries/libsexy {\n        };\n        libsepol = callPackage ../os-specific/linux/libsepol {\n        };\n        libsmbios = callPackage ../os-specific/linux/libsmbios {\n        };\n        lm_sensors = callPackage ../os-specific/linux/lm-sensors {\n        };\n        lockdep = callPackage ../os-specific/linux/lockdep {\n        };\n        lsiutil = callPackage ../os-specific/linux/lsiutil {\n        };\n        kmod = callPackage ../os-specific/linux/kmod {\n        };\n        kmod-blacklist-ubuntu = callPackage ../os-specific/linux/kmod-blacklist-ubuntu {\n        };\n        kvm = qemu_kvm;\n        libcap = callPackage ../os-specific/linux/libcap {\n        };\n        libcap_progs = callPackage ../os-specific/linux/libcap/progs.nix {\n        };\n        libcap_pam = callPackage ../os-specific/linux/libcap/pam.nix {\n        };\n        libcap_manpages = callPackage ../os-specific/linux/libcap/man.nix {\n        };\n        libcap_ng = callPackage ../os-specific/linux/libcap-ng {\n        };\n        libnscd = callPackage ../os-specific/linux/libnscd {\n        };\n        libnotify = callPackage ../development/libraries/libnotify {\n        };\n        libvolume_id = callPackage ../os-specific/linux/libvolume_id {\n        };\n        lsscsi = callPackage ../os-specific/linux/lsscsi {\n        };\n        lvm2 = callPackage ../os-specific/linux/lvm2 {\n        };\n        mdadm = callPackage ../os-specific/linux/mdadm {\n        };\n        mingetty = callPackage ../os-specific/linux/mingetty {\n        };\n        module_init_tools = callPackage ../os-specific/linux/module-init-tools {\n        };\n        aggregateModules = modules:\n        callPackage ../os-specific/linux/kmod/aggregator.nix {\n          inherit modules;\n        };\n        multipath_tools = callPackage ../os-specific/linux/multipath-tools {\n        };\n        musl = callPackage ../os-specific/linux/musl {\n        };\n        nettools = callPackage ../os-specific/linux/net-tools {\n        };\n        neverball = callPackage ../games/neverball {\n          libpng = libpng15;\n        };\n        nftables = callPackage ../os-specific/linux/nftables {\n        };\n        numactl = callPackage ../os-specific/linux/numactl {\n        };\n        gocode = callPackage ../development/tools/gocode {\n        };\n        gogoclient = callPackage ../os-specific/linux/gogoclient {\n        };\n        nss_ldap = callPackage ../os-specific/linux/nss_ldap {\n        };\n        pam = callPackage ../os-specific/linux/pam {\n        };\n        pam_ccreds = callPackage ../os-specific/linux/pam_ccreds {\n        };\n        pam_console = callPackage ../os-specific/linux/pam_console {\n          libtool = libtool_1_5;\n        };\n        pam_devperm = callPackage ../os-specific/linux/pam_devperm {\n        };\n        pam_krb5 = callPackage ../os-specific/linux/pam_krb5 {\n        };\n        pam_ldap = callPackage ../os-specific/linux/pam_ldap {\n        };\n        pam_login = callPackage ../os-specific/linux/pam_login {\n        };\n        pam_ssh_agent_auth = callPackage ../os-specific/linux/pam_ssh_agent_auth {\n        };\n        pam_usb = callPackage ../os-specific/linux/pam_usb {\n        };\n        paxctl = callPackage ../os-specific/linux/paxctl {\n        };\n        pax-utils = callPackage ../os-specific/linux/pax-utils {\n        };\n        pcmciaUtils = callPackage ../os-specific/linux/pcmciautils {\n          firmware = config.pcmciaUtils.firmware or [\n          ];\n          config = config.pcmciaUtils.config or null;\n        };\n        plymouth = callPackage ../os-specific/linux/plymouth {\n          automake = automake113x;\n        };\n        pmount = callPackage ../os-specific/linux/pmount {\n        };\n        pmutils = callPackage ../os-specific/linux/pm-utils {\n        };\n        pmtools = callPackage ../os-specific/linux/pmtools {\n        };\n        policycoreutils = callPackage ../os-specific/linux/policycoreutils {\n        };\n        powertop = callPackage ../os-specific/linux/powertop {\n        };\n        prayer = callPackage ../servers/prayer {\n        };\n        procps = procps-ng;\n        procps-old = lowPrio (callPackage ../os-specific/linux/procps {\n        });\n        procps-ng = callPackage ../os-specific/linux/procps-ng {\n        };\n        watch = callPackage ../os-specific/linux/procps/watch.nix {\n        };\n        qemu_kvm = lowPrio (qemu.override {\n          x86Only = true;\n        });\n        firmwareLinuxNonfree = callPackage ../os-specific/linux/firmware/firmware-linux-nonfree {\n        };\n        radeontools = callPackage ../os-specific/linux/radeontools {\n        };\n        raspberrypifw = callPackage ../os-specific/linux/firmware/raspberrypi {\n        };\n        regionset = callPackage ../os-specific/linux/regionset {\n        };\n        rfkill = callPackage ../os-specific/linux/rfkill {\n        };\n        rfkill_udev = callPackage ../os-specific/linux/rfkill/udev.nix {\n        };\n        rtkit = callPackage ../os-specific/linux/rtkit {\n        };\n        sdparm = callPackage ../os-specific/linux/sdparm {\n        };\n        sepolgen = callPackage ../os-specific/linux/sepolgen {\n        };\n        setools = callPackage ../os-specific/linux/setools {\n        };\n        shadow = callPackage ../os-specific/linux/shadow {\n        };\n        statifier = builderDefsPackage (import ../os-specific/linux/statifier) {\n        };\n        sysdig = callPackage ../os-specific/linux/sysdig {\n          kernel = null;\n        };\n        sysfsutils = callPackage ../os-specific/linux/sysfsutils {\n        };\n        sysprof = callPackage ../development/tools/profiling/sysprof {\n          inherit (gnome) libglade;\n        };\n        libsysfs = sysfsutils;\n        systool = sysfsutils;\n        sysklogd = callPackage ../os-specific/linux/sysklogd {\n        };\n        syslinux = callPackage ../os-specific/linux/syslinux {\n        };\n        sysstat = callPackage ../os-specific/linux/sysstat {\n        };\n        systemd = callPackage ../os-specific/linux/systemd {\n          linuxHeaders = linuxHeaders_3_14;\n        };\n        systemtap = callPackage ../development/tools/profiling/systemtap {\n          inherit (gnome) libglademm;\n        };\n        systemd_with_lvm2 = pkgs.lib.overrideDerivation pkgs.systemd (p:\n        {\n          name = p.name + \"-with-lvm2\";\n          postInstall = p.postInstall + ''\n            cp \"${pkgs.lvm2}/lib/systemd/system-generators/\"* ''$out/lib/systemd/system-generators\n          '';\n        });\n        sysvinit = callPackage ../os-specific/linux/sysvinit {\n        };\n        sysvtools = callPackage ../os-specific/linux/sysvinit {\n          withoutInitTools = true;\n        };\n        tcp_wrappers = callPackage ../os-specific/linux/tcp-wrappers {\n        };\n        trackballs = callPackage ../games/trackballs {\n          debug = false;\n          guile = guile_1_8;\n        };\n        tunctl = callPackage ../os-specific/linux/tunctl {\n        };\n        ubootChooser = name:\n        if name == \"upstream\"\n          then ubootUpstream\n          else if name == \"sheevaplug\"\n            then ubootSheevaplug\n            else if name == \"guruplug\"\n              then ubootGuruplug\n              else if name == \"nanonote\"\n                then ubootNanonote\n                else throw \"Unknown uboot\";\n        ubootUpstream = callPackage ../misc/uboot {\n        };\n        ubootSheevaplug = callPackage ../misc/uboot/sheevaplug.nix {\n        };\n        ubootNanonote = callPackage ../misc/uboot/nanonote.nix {\n        };\n        ubootGuruplug = callPackage ../misc/uboot/guruplug.nix {\n        };\n        uclibc = callPackage ../os-specific/linux/uclibc {\n        };\n        uclibcCross = lowPrio (callPackage ../os-specific/linux/uclibc {\n          inherit fetchurl stdenv\n          libiconv;\n          linuxHeaders = linuxHeadersCross;\n          gccCross = gccCrossStageStatic;\n          cross = assert crossSystem != null; crossSystem;\n        });\n        udev145 = callPackage ../os-specific/linux/udev/145.nix {\n        };\n        udev = pkgs.systemd;\n        udisks1 = callPackage ../os-specific/linux/udisks/1-default.nix {\n        };\n        udisks2 = callPackage ../os-specific/linux/udisks/2-default.nix {\n        };\n        udisks = udisks1;\n        udisks_glue = callPackage ../os-specific/linux/udisks-glue {\n        };\n        untie = callPackage ../os-specific/linux/untie {\n        };\n        upower = callPackage ../os-specific/linux/upower {\n        };\n        upower_99 = callPackage ../os-specific/linux/upower/0.99.nix {\n        };\n        upstart = callPackage ../os-specific/linux/upstart {\n        };\n        usbutils = callPackage ../os-specific/linux/usbutils {\n        };\n        usermount = callPackage ../os-specific/linux/usermount {\n        };\n        utillinux = lowPrio (callPackage ../os-specific/linux/util-linux {\n          ncurses = null;\n          perl = null;\n        });\n        utillinuxCurses = utillinux.override {\n          inherit ncurses perl;\n        };\n        v4l_utils = callPackage ../os-specific/linux/v4l-utils {\n          withQt4 = true;\n        };\n        windows = rec {\n          cygwinSetup = callPackage ../os-specific/windows/cygwin-setup {\n          };\n          jom = callPackage ../os-specific/windows/jom {\n          };\n          w32api = callPackage ../os-specific/windows/w32api {\n            gccCross = gccCrossStageStatic;\n            binutilsCross = binutilsCross;\n          };\n          w32api_headers = w32api.override {\n            onlyHeaders = true;\n          };\n          mingw_runtime = callPackage ../os-specific/windows/mingwrt {\n            gccCross = gccCrossMingw2;\n            binutilsCross = binutilsCross;\n          };\n          mingw_runtime_headers = mingw_runtime.override {\n            onlyHeaders = true;\n          };\n          mingw_headers1 = buildEnv {\n            name = \"mingw-headers-1\";\n            paths = [\n              w32api_headers\n              mingw_runtime_headers\n            ];\n          };\n          mingw_headers2 = buildEnv {\n            name = \"mingw-headers-2\";\n            paths = [\n              w32api\n              mingw_runtime_headers\n            ];\n          };\n          mingw_headers3 = buildEnv {\n            name = \"mingw-headers-3\";\n            paths = [\n              w32api\n              mingw_runtime\n            ];\n          };\n          mingw_w64 = callPackage ../os-specific/windows/mingw-w64 {\n            gccCross = gccCrossStageStatic;\n            binutilsCross = binutilsCross;\n          };\n          mingw_w64_headers = callPackage ../os-specific/windows/mingw-w64 {\n            onlyHeaders = true;\n          };\n          mingw_w64_pthreads = callPackage ../os-specific/windows/mingw-w64 {\n            onlyPthreads = true;\n          };\n          pthreads = callPackage ../os-specific/windows/pthread-w32 {\n            mingw_headers = mingw_headers3;\n          };\n          wxMSW = callPackage ../os-specific/windows/wxMSW-2.8 {\n          };\n        };\n        wesnoth = callPackage ../games/wesnoth {\n          lua = lua5;\n        };\n        wirelesstools = callPackage ../os-specific/linux/wireless-tools {\n        };\n        wpa_supplicant = callPackage ../os-specific/linux/wpa_supplicant {\n        };\n        wpa_supplicant_gui = callPackage ../os-specific/linux/wpa_supplicant/gui.nix {\n        };\n        xf86_input_mtrack = callPackage ../os-specific/linux/xf86-input-mtrack {\n          inherit (xorg) utilmacros xproto\n          inputproto xorgserver;\n        };\n        xf86_input_multitouch = callPackage ../os-specific/linux/xf86-input-multitouch {\n        };\n        xf86_input_wacom = callPackage ../os-specific/linux/xf86-input-wacom {\n        };\n        xf86_video_nested = callPackage ../os-specific/linux/xf86-video-nested {\n          inherit (xorg) fontsproto\n          renderproto utilmacros\n          xorgserver;\n        };\n        xf86_video_nouveau = xorg.xf86videonouveau;\n        xmoto = builderDefsPackage (import ../games/xmoto) {\n          inherit chipmunk sqlite curl\n          zlib bzip2 libjpeg libpng\n          freeglut mesa SDL SDL_mixer\n          SDL_image SDL_net SDL_ttf lua5\n          ode libxdg_basedir libxml2;\n        };\n        xorg_sys_opengl = callPackage ../os-specific/linux/opengl/xorg-sys {\n        };\n        zd1211fw = callPackage ../os-specific/linux/firmware/zd1211 {\n        };\n        andagii = callPackage ../data/fonts/andagii {\n        };\n        anonymousPro = callPackage ../data/fonts/anonymous-pro {\n        };\n        arkpandora_ttf = builderDefsPackage (import ../data/fonts/arkpandora) {\n        };\n        aurulent-sans = callPackage ../data/fonts/aurulent-sans {\n        };\n        bakoma_ttf = callPackage ../data/fonts/bakoma-ttf {\n        };\n        cacert = callPackage ../data/misc/cacert {\n        };\n        cantarell_fonts = callPackage ../data/fonts/cantarell-fonts {\n        };\n        corefonts = callPackage ../data/fonts/corefonts {\n        };\n        wrapFonts = paths:\n        import ../data/fonts/fontWrap {\n          inherit fetchurl stdenv\n          builderDefs paths;\n          inherit (xorg) mkfontdir\n          mkfontscale;\n        };\n        clearlyU = callPackage ../data/fonts/clearlyU {\n        };\n        cm_unicode = callPackage ../data/fonts/cm-unicode {\n        };\n        dejavu_fonts = callPackage ../data/fonts/dejavu-fonts {\n          inherit (perlPackages) FontTTF;\n        };\n        docbook5 = callPackage ../data/sgml+xml/schemas/docbook-5.0 {\n        };\n        docbook_sgml_dtd_31 = callPackage ../data/sgml+xml/schemas/sgml-dtd/docbook/3.1.nix {\n        };\n        docbook_sgml_dtd_41 = callPackage ../data/sgml+xml/schemas/sgml-dtd/docbook/4.1.nix {\n        };\n        docbook_xml_dtd_412 = callPackage ../data/sgml+xml/schemas/xml-dtd/docbook/4.1.2.nix {\n        };\n        docbook_xml_dtd_42 = callPackage ../data/sgml+xml/schemas/xml-dtd/docbook/4.2.nix {\n        };\n        docbook_xml_dtd_43 = callPackage ../data/sgml+xml/schemas/xml-dtd/docbook/4.3.nix {\n        };\n        docbook_xml_dtd_45 = callPackage ../data/sgml+xml/schemas/xml-dtd/docbook/4.5.nix {\n        };\n        docbook_xml_ebnf_dtd = callPackage ../data/sgml+xml/schemas/xml-dtd/docbook-ebnf {\n        };\n        docbook_xml_xslt = docbook_xsl;\n        docbook_xsl = callPackage ../data/sgml+xml/stylesheets/xslt/docbook-xsl {\n        };\n        docbook5_xsl = docbook_xsl_ns;\n        docbook_xsl_ns = callPackage ../data/sgml+xml/stylesheets/xslt/docbook-xsl-ns {\n        };\n        dosemu_fonts = callPackage ../data/fonts/dosemu-fonts {\n        };\n        eb-garamond = callPackage ../data/fonts/eb-garamond {\n        };\n        fira = callPackage ../data/fonts/fira {\n        };\n        freefont_ttf = callPackage ../data/fonts/freefont-ttf {\n        };\n        freepats = callPackage ../data/misc/freepats {\n        };\n        gentium = callPackage ../data/fonts/gentium {\n        };\n        gnome_user_docs = callPackage ../data/documentation/gnome-user-docs {\n        };\n        inherit (gnome3) gsettings_desktop_schemas;\n        hicolor_icon_theme = callPackage ../data/icons/hicolor-icon-theme {\n        };\n        inconsolata = callPackage ../data/fonts/inconsolata {\n        };\n        ipafont = callPackage ../data/fonts/ipafont {\n        };\n        junicode = callPackage ../data/fonts/junicode {\n        };\n        kochi-substitute = callPackage ../data/fonts/kochi-substitute {\n        };\n        kochi-substitute-naga10 = callPackage ../data/fonts/kochi-substitute-naga10 {\n        };\n        liberation_ttf = callPackage ../data/fonts/redhat-liberation-fonts {\n        };\n        libertine = builderDefsPackage (import ../data/fonts/libertine) {\n          inherit fetchurl fontforge lib;\n        };\n        lmmath = callPackage ../data/fonts/lmodern/lmmath.nix {\n        };\n        lmodern = callPackage ../data/fonts/lmodern {\n        };\n        lohit-fonts = callPackage ../data/fonts/lohit-fonts {\n        };\n        manpages = callPackage ../data/documentation/man-pages {\n        };\n        miscfiles = callPackage ../data/misc/miscfiles {\n        };\n        mobile_broadband_provider_info = callPackage ../data/misc/mobile-broadband-provider-info {\n        };\n        mph_2b_damase = callPackage ../data/fonts/mph-2b-damase {\n        };\n        nafees = callPackage ../data/fonts/nafees {\n        };\n        oldstandard = callPackage ../data/fonts/oldstandard {\n        };\n        opensans-ttf = callPackage ../data/fonts/opensans-ttf {\n        };\n        poly = callPackage ../data/fonts/poly {\n        };\n        posix_man_pages = callPackage ../data/documentation/man-pages-posix {\n        };\n        pthreadmanpages = callPackage ../data/documentation/pthread-man-pages {\n        };\n        shared_mime_info = callPackage ../data/misc/shared-mime-info {\n        };\n        shared_desktop_ontologies = callPackage ../data/misc/shared-desktop-ontologies {\n        };\n        stdmanpages = callPackage ../data/documentation/std-man-pages {\n        };\n        symbola = callPackage ../data/fonts/symbola {\n        };\n        iana_etc = callPackage ../data/misc/iana-etc {\n        };\n        poppler_data = callPackage ../data/misc/poppler-data {\n        };\n        r3rs = callPackage ../data/documentation/rnrs/r3rs.nix {\n        };\n        r4rs = callPackage ../data/documentation/rnrs/r4rs.nix {\n        };\n        r5rs = callPackage ../data/documentation/rnrs/r5rs.nix {\n        };\n        source-code-pro = callPackage ../data/fonts/source-code-pro {\n        };\n        source-sans-pro = callPackage ../data/fonts/source-sans-pro {\n        };\n        source-serif-pro = callPackage ../data/fonts/source-serif-pro {\n        };\n        source-han-sans-japanese = callPackage ../data/fonts/source-han-sans/japanese.nix {\n        };\n        source-han-sans-korean = callPackage ../data/fonts/source-han-sans/korean.nix {\n        };\n        source-han-sans-simplified-chinese = callPackage ../data/fonts/source-han-sans/simplified-chinese.nix {\n        };\n        source-han-sans-traditional-chinese = callPackage ../data/fonts/source-han-sans/traditional-chinese.nix {\n        };\n        tango-icon-theme = callPackage ../data/icons/tango-icon-theme {\n        };\n        themes = name:\n        import (../data/misc/themes + (\"/\" + name + \".nix\")) {\n          inherit fetchurl;\n        };\n        theano = callPackage ../data/fonts/theano {\n        };\n        tempora_lgc = callPackage ../data/fonts/tempora-lgc {\n        };\n        terminus_font = callPackage ../data/fonts/terminus-font {\n        };\n        tipa = callPackage ../data/fonts/tipa {\n        };\n        ttf_bitstream_vera = callPackage ../data/fonts/ttf-bitstream-vera {\n        };\n        tzdata = callPackage ../data/misc/tzdata {\n        };\n        ubuntu_font_family = callPackage ../data/fonts/ubuntu-font-family {\n        };\n        ucsFonts = callPackage ../data/fonts/ucs-fonts {\n        };\n        unifont = callPackage ../data/fonts/unifont {\n        };\n        vistafonts = callPackage ../data/fonts/vista-fonts {\n        };\n        wqy_microhei = callPackage ../data/fonts/wqy-microhei {\n        };\n        wqy_zenhei = callPackage ../data/fonts/wqy-zenhei {\n        };\n        xhtml1 = callPackage ../data/sgml+xml/schemas/xml-dtd/xhtml1 {\n        };\n        xkeyboard_config = xorg.xkeyboardconfig;\n        a2jmidid = callPackage ../applications/audio/a2jmidid {\n        };\n        aangifte2006 = callPackage_i686 ../applications/taxes/aangifte-2006 {\n        };\n        aangifte2007 = callPackage_i686 ../applications/taxes/aangifte-2007 {\n        };\n        aangifte2008 = callPackage_i686 ../applications/taxes/aangifte-2008 {\n        };\n        aangifte2009 = callPackage_i686 ../applications/taxes/aangifte-2009 {\n        };\n        aangifte2010 = callPackage_i686 ../applications/taxes/aangifte-2010 {\n        };\n        aangifte2011 = callPackage_i686 ../applications/taxes/aangifte-2011 {\n        };\n        aangifte2012 = callPackage_i686 ../applications/taxes/aangifte-2012 {\n        };\n        aangifte2013 = callPackage_i686 ../applications/taxes/aangifte-2013 {\n        };\n        abcde = callPackage ../applications/audio/abcde {\n          inherit (perlPackages) DigestSHA\n          MusicBrainz MusicBrainzDiscID;\n          libcdio = libcdio082;\n        };\n        abiword = callPackage ../applications/office/abiword {\n          inherit (gnome) libglade\n          libgnomecanvas;\n        };\n        abook = callPackage ../applications/misc/abook {\n        };\n        adobe-reader = callPackage_i686 ../applications/misc/adobe-reader {\n        };\n        aewan = callPackage ../applications/editors/aewan {\n        };\n        alchemy = callPackage ../applications/graphics/alchemy {\n        };\n        ams-lv2 = callPackage ../applications/audio/ams-lv2 {\n        };\n        amsn = callPackage ../applications/networking/instant-messengers/amsn {\n        };\n        antiword = callPackage ../applications/office/antiword {\n        };\n        ardour = ardour3;\n        ardour3 = lowPrio (callPackage ../applications/audio/ardour {\n          inherit (gnome) libgnomecanvas\n          libgnomecanvasmm;\n        });\n        arora = callPackage ../applications/networking/browsers/arora {\n        };\n        atom = callPackage ../applications/editors/atom {\n          gconf = gnome.GConf;\n        };\n        aseprite = callPackage ../applications/editors/aseprite {\n          giflib = giflib_4_1;\n        };\n        audacious = callPackage ../applications/audio/audacious {\n        };\n        audacity = callPackage ../applications/audio/audacity {\n          ffmpeg = ffmpeg_0_10;\n        };\n        milkytracker = callPackage ../applications/audio/milkytracker {\n        };\n        aumix = callPackage ../applications/audio/aumix {\n          gtkGUI = false;\n        };\n        autopanosiftc = callPackage ../applications/graphics/autopanosiftc {\n        };\n        avidemux = callPackage ../applications/video/avidemux {\n        };\n        avogadro = callPackage ../applications/science/chemistry/avogadro {\n          eigen = eigen2;\n        };\n        avrdudess = callPackage ../applications/misc/avrdudess {\n        };\n        avxsynth = callPackage ../applications/video/avxsynth {\n        };\n        awesome-3-4 = callPackage ../applications/window-managers/awesome/3.4.nix {\n          lua = lua5;\n          cairo = cairo.override {\n            xcbSupport = true;\n          };\n        };\n        awesome-3-5 = callPackage ../applications/window-managers/awesome {\n          lua = lua5_1;\n          cairo = cairo.override {\n            xcbSupport = true;\n          };\n        };\n        awesome = awesome-3-5;\n        inherit (gnome3) baobab;\n        bar = callPackage ../applications/window-managers/bar {\n        };\n        baresip = callPackage ../applications/networking/instant-messengers/baresip {\n          ffmpeg = ffmpeg_1;\n        };\n        batik = callPackage ../applications/graphics/batik {\n        };\n        bazaar = callPackage ../applications/version-management/bazaar {\n        };\n        bazaarTools = builderDefsPackage (import ../applications/version-management/bazaar/tools.nix) {\n          inherit bazaar;\n        };\n        beast = callPackage ../applications/audio/beast {\n          inherit (gnome) libgnomecanvas\n          libart_lgpl;\n          guile = guile_1_8;\n        };\n        bibletime = callPackage ../applications/misc/bibletime {\n        };\n        bitcoin = callPackage ../applications/misc/bitcoin {\n        };\n        bitlbee = callPackage ../applications/networking/instant-messengers/bitlbee {\n          gnutls = gnutls;\n          libotr = libotr_3_2;\n        };\n        blender = callPackage ../applications/misc/blender {\n          python = python34;\n        };\n        bristol = callPackage ../applications/audio/bristol {\n        };\n        bspwm = callPackage ../applications/window-managers/bspwm {\n        };\n        bvi = callPackage ../applications/editors/bvi {\n        };\n        calf = callPackage ../applications/audio/calf {\n          inherit (gnome) libglade;\n        };\n        calibre = callPackage ../applications/misc/calibre {\n          inherit (pythonPackages) pyqt5\n          sip_4_16;\n        };\n        camlistore = callPackage ../applications/misc/camlistore {\n        };\n        carrier = builderDefsPackage (import ../applications/networking/instant-messengers/carrier/2.5.0.nix) {\n          inherit fetchurl stdenv\n          pkgconfig perl perlXMLParser\n          libxml2 openssl nss gtkspell\n          aspell gettext ncurses avahi\n          dbus dbus_glib python libtool\n          automake autoconf gstreamer;\n          inherit gtk glib;\n          inherit (gnome) startupnotification\n          GConf;\n          inherit (xlibs) libXScrnSaver\n          scrnsaverproto libX11 xproto\n          kbproto;\n        };\n        funpidgin = carrier;\n        cc1394 = callPackage ../applications/video/cc1394 {\n        };\n        cddiscid = callPackage ../applications/audio/cd-discid {\n        };\n        cdparanoia = cdparanoiaIII;\n        cdparanoiaIII = callPackage ../applications/audio/cdparanoia {\n        };\n        cdrtools = callPackage ../applications/misc/cdrtools {\n        };\n        centerim = callPackage ../applications/networking/instant-messengers/centerim {\n        };\n        cgit = callPackage ../applications/version-management/git-and-tools/cgit {\n        };\n        cgminer = callPackage ../applications/misc/cgminer {\n          amdappsdk = amdappsdk28;\n        };\n        chatzilla = callPackage ../applications/networking/irc/chatzilla {\n        };\n        chromium = lowPrio (callPackage ../applications/networking/browsers/chromium {\n          channel = \"stable\";\n          pulseSupport = config.pulseaudio or true;\n          enablePepperFlash = config.chromium.enablePepperFlash or false;\n          enablePepperPDF = config.chromium.enablePepperPDF or false;\n        });\n        chromiumBeta = lowPrio (chromium.override {\n          channel = \"beta\";\n        });\n        chromiumBetaWrapper = lowPrio (wrapChromium chromiumBeta);\n        chromiumDev = lowPrio (chromium.override {\n          channel = \"dev\";\n        });\n        chromiumDevWrapper = lowPrio (wrapChromium chromiumDev);\n        chromiumWrapper = wrapChromium chromium;\n        cinelerra = callPackage ../applications/video/cinelerra {\n        };\n        clipit = callPackage ../applications/misc/clipit {\n        };\n        cmus = callPackage ../applications/audio/cmus {\n        };\n        compiz = callPackage ../applications/window-managers/compiz {\n          inherit (gnome) GConf ORBit2\n          metacity;\n          boost = boost149;\n        };\n        coriander = callPackage ../applications/video/coriander {\n          inherit (gnome) libgnomeui\n          GConf;\n        };\n        csound = callPackage ../applications/audio/csound {\n        };\n        cinepaint = callPackage ../applications/graphics/cinepaint {\n          fltk = fltk13;\n          libpng = libpng12;\n        };\n        codeblocks = callPackage ../applications/editors/codeblocks {\n        };\n        codeblocksFull = callPackage ../applications/editors/codeblocks {\n          contribPlugins = true;\n        };\n        codeville = builderDefsPackage (import ../applications/version-management/codeville/0.8.0.nix) {\n          inherit makeWrapper;\n          python = pythonFull;\n        };\n        comical = callPackage ../applications/graphics/comical {\n        };\n        conkeror = callPackage ../applications/networking/browsers/conkeror {\n        };\n        conkerorWrapper = wrapFirefox {\n          browser = conkeror;\n          browserName = \"conkeror\";\n          desktopName = \"Conkeror\";\n        };\n        cuneiform = builderDefsPackage (import ../tools/graphics/cuneiform) {\n          inherit cmake patchelf;\n          imagemagick = imagemagick;\n        };\n        cvs = callPackage ../applications/version-management/cvs {\n        };\n        cvsps = callPackage ../applications/version-management/cvsps {\n        };\n        cvs2svn = callPackage ../applications/version-management/cvs2svn {\n        };\n        d4x = callPackage ../applications/misc/d4x {\n        };\n        darcs = with haskellPackages_ghc783; callPackage ../applications/version-management/darcs {\n          cabal = cabal.override {\n            extension = self: super: {\n              isLibrary = false;\n              configureFlags = \"-f-library \" + (super.configureFlags or \"\");\n            };\n          };\n        };\n        darktable = callPackage ../applications/graphics/darktable {\n          inherit (gnome) GConf libglade;\n        };\n        dd-agent = callPackage ../tools/networking/dd-agent {\n          inherit (pythonPackages) tornado;\n        };\n        dia = callPackage ../applications/graphics/dia {\n          inherit (pkgs.gnome) libart_lgpl\n          libgnomeui;\n        };\n        diffuse = callPackage ../applications/version-management/diffuse {\n        };\n        distrho = callPackage ../applications/audio/distrho {\n        };\n        djvulibre = callPackage ../applications/misc/djvulibre {\n        };\n        djvu2pdf = callPackage ../tools/typesetting/djvu2pdf {\n        };\n        djview = callPackage ../applications/graphics/djview {\n        };\n        djview4 = pkgs.djview;\n        dmenu = callPackage ../applications/misc/dmenu {\n          enableXft = config.dmenu.enableXft or false;\n        };\n        dmtx = builderDefsPackage (import ../tools/graphics/dmtx) {\n          inherit libpng libtiff libjpeg\n          imagemagick librsvg pkgconfig\n          bzip2 zlib libtool freetype\n          fontconfig ghostscript jasper\n          xz;\n          inherit (xlibs) libX11;\n        };\n        docker = callPackage ../applications/virtualization/docker {\n        };\n        doodle = callPackage ../applications/search/doodle {\n        };\n        dunst = callPackage ../applications/misc/dunst {\n        };\n        dvb_apps = callPackage ../applications/video/dvb-apps {\n        };\n        dvdauthor = callPackage ../applications/video/dvdauthor {\n        };\n        dwb = callPackage ../applications/networking/browsers/dwb {\n          dconf = gnome3.dconf;\n        };\n        dwbWrapper = wrapFirefox {\n          browser = dwb;\n          browserName = \"dwb\";\n          desktopName = \"dwb\";\n        };\n        dwm = callPackage ../applications/window-managers/dwm {\n          patches = config.dwm.patches or [\n          ];\n        };\n        dzen2 = callPackage ../applications/window-managers/dzen2 {\n        };\n        eaglemode = callPackage ../applications/misc/eaglemode {\n        };\n        eclipses = recurseIntoAttrs (callPackage ../applications/editors/eclipse {\n        });\n        ed = callPackage ../applications/editors/ed {\n        };\n        ekho = callPackage ../applications/audio/ekho {\n        };\n        electrum = callPackage ../applications/misc/electrum {\n        };\n        elinks = callPackage ../applications/networking/browsers/elinks {\n        };\n        elvis = callPackage ../applications/editors/elvis {\n        };\n        emacs = emacs24;\n        emacs24 = callPackage ../applications/editors/emacs-24 {\n          libXaw = xlibs.libXaw;\n          Xaw3d = null;\n          gconf = null;\n          librsvg = null;\n          alsaLib = null;\n          imagemagick = null;\n        };\n        emacs24-nox = lowPrio (appendToName \"nox\" (emacs24.override {\n          withX = false;\n        }));\n        emacs24Macport = lowPrio (callPackage ../applications/editors/emacs-24/macport.nix {\n          stdenv = pkgs.clangStdenv;\n        });\n        emacsPackages = emacs: self: let\n          callPackage = newScope self;\n          in rec {\n            inherit emacs;\n            autoComplete = callPackage ../applications/editors/emacs-modes/auto-complete {\n            };\n            bbdb = callPackage ../applications/editors/emacs-modes/bbdb {\n            };\n            bbdb3 = callPackage ../applications/editors/emacs-modes/bbdb/3.nix {\n            };\n            cedet = callPackage ../applications/editors/emacs-modes/cedet {\n            };\n            calfw = callPackage ../applications/editors/emacs-modes/calfw {\n            };\n            coffee = callPackage ../applications/editors/emacs-modes/coffee {\n            };\n            colorTheme = callPackage ../applications/editors/emacs-modes/color-theme {\n            };\n            colorThemeSolarized = callPackage ../applications/editors/emacs-modes/color-theme-solarized {\n            };\n            cryptol = callPackage ../applications/editors/emacs-modes/cryptol {\n            };\n            cua = callPackage ../applications/editors/emacs-modes/cua {\n            };\n            darcsum = callPackage ../applications/editors/emacs-modes/darcsum {\n            };\n            jabber = callPackage ../applications/editors/emacs-modes/jabber {\n            };\n            emacsClangCompleteAsync = callPackage ../applications/editors/emacs-modes/emacs-clang-complete-async {\n            };\n            emacsSessionManagement = callPackage ../applications/editors/emacs-modes/session-management-for-emacs {\n            };\n            emacsw3m = callPackage ../applications/editors/emacs-modes/emacs-w3m {\n            };\n            emms = callPackage ../applications/editors/emacs-modes/emms {\n            };\n            ess = callPackage ../applications/editors/emacs-modes/ess {\n            };\n            flymakeCursor = callPackage ../applications/editors/emacs-modes/flymake-cursor {\n            };\n            gh = callPackage ../applications/editors/emacs-modes/gh {\n            };\n            graphvizDot = callPackage ../applications/editors/emacs-modes/graphviz-dot {\n            };\n            gist = callPackage ../applications/editors/emacs-modes/gist {\n            };\n            idris = callPackage ../applications/editors/emacs-modes/idris {\n            };\n            jade = callPackage ../applications/editors/emacs-modes/jade {\n            };\n            jdee = callPackage ../applications/editors/emacs-modes/jdee {\n            };\n            js2 = callPackage ../applications/editors/emacs-modes/js2 {\n            };\n            stratego = callPackage ../applications/editors/emacs-modes/stratego {\n            };\n            haskellMode = callPackage ../applications/editors/emacs-modes/haskell {\n            };\n            ocamlMode = callPackage ../applications/editors/emacs-modes/ocaml {\n            };\n            structuredHaskellMode = callPackage ../applications/editors/emacs-modes/structured-haskell-mode {\n              inherit (haskellPackages) cabal\n              haskellSrcExts;\n            };\n            tuaregMode = callPackage ../applications/editors/emacs-modes/tuareg {\n            };\n            hol_light_mode = callPackage ../applications/editors/emacs-modes/hol_light {\n            };\n            htmlize = callPackage ../applications/editors/emacs-modes/htmlize {\n            };\n            logito = callPackage ../applications/editors/emacs-modes/logito {\n            };\n            loremIpsum = callPackage ../applications/editors/emacs-modes/lorem-ipsum {\n            };\n            magit = callPackage ../applications/editors/emacs-modes/magit {\n            };\n            maudeMode = callPackage ../applications/editors/emacs-modes/maude {\n            };\n            metaweblog = callPackage ../applications/editors/emacs-modes/metaweblog {\n            };\n            notmuch = lowPrio (callPackage ../applications/networking/mailreaders/notmuch {\n            });\n            offlineimap = callPackage ../applications/editors/emacs-modes/offlineimap {\n            };\n            org = hiPrio (callPackage ../applications/editors/emacs-modes/org {\n            });\n            org2blog = callPackage ../applications/editors/emacs-modes/org2blog {\n            };\n            pcache = callPackage ../applications/editors/emacs-modes/pcache {\n            };\n            phpMode = callPackage ../applications/editors/emacs-modes/php {\n            };\n            prologMode = callPackage ../applications/editors/emacs-modes/prolog {\n            };\n            proofgeneral_4_2 = callPackage ../applications/editors/emacs-modes/proofgeneral/4.2.nix {\n              texinfo = texinfo4;\n              texLive = pkgs.texLiveAggregationFun {\n                paths = [\n                  pkgs.texLive\n                  pkgs.texLiveCMSuper\n                ];\n              };\n            };\n            proofgeneral_4_3_pre = callPackage ../applications/editors/emacs-modes/proofgeneral/4.3pre.nix {\n              texinfo = texinfo4;\n              texLive = pkgs.texLiveAggregationFun {\n                paths = [\n                  pkgs.texLive\n                  pkgs.texLiveCMSuper\n                ];\n              };\n            };\n            proofgeneral = self.proofgeneral_4_2;\n            quack = callPackage ../applications/editors/emacs-modes/quack {\n            };\n            rectMark = callPackage ../applications/editors/emacs-modes/rect-mark {\n            };\n            remember = callPackage ../applications/editors/emacs-modes/remember {\n            };\n            rudel = callPackage ../applications/editors/emacs-modes/rudel {\n            };\n            sbtMode = callPackage ../applications/editors/emacs-modes/sbt-mode {\n            };\n            scalaMode1 = callPackage ../applications/editors/emacs-modes/scala-mode/v1.nix {\n            };\n            scalaMode2 = callPackage ../applications/editors/emacs-modes/scala-mode/v2.nix {\n            };\n            sunriseCommander = callPackage ../applications/editors/emacs-modes/sunrise-commander {\n            };\n            writeGood = callPackage ../applications/editors/emacs-modes/writegood {\n            };\n            xmlRpc = callPackage ../applications/editors/emacs-modes/xml-rpc {\n            };\n          };\n        emacs24Packages = recurseIntoAttrs (emacsPackages emacs24 pkgs.emacs24Packages);\n        inherit (gnome3) empathy;\n        epdfview = callPackage ../applications/misc/epdfview {\n        };\n        inherit (gnome3) epiphany;\n        espeak = callPackage ../applications/audio/espeak {\n        };\n        espeakedit = callPackage ../applications/audio/espeak/edit.nix {\n        };\n        esniper = callPackage ../applications/networking/esniper {\n        };\n        etherape = callPackage ../applications/networking/sniffers/etherape {\n          inherit (gnome) gnomedocutils\n          libgnome libglade libgnomeui\n          scrollkeeper;\n        };\n        evopedia = callPackage ../applications/misc/evopedia {\n        };\n        keepassx = callPackage ../applications/misc/keepassx {\n        };\n        keepassx2 = callPackage ../applications/misc/keepassx/2.0.nix {\n        };\n        inherit (gnome3) evince;\n        evolution_data_server = gnome3.evolution_data_server;\n        keepass = callPackage ../applications/misc/keepass {\n        };\n        exrdisplay = callPackage ../applications/graphics/exrdisplay {\n          fltk = fltk20;\n        };\n        fbpanel = callPackage ../applications/window-managers/fbpanel {\n        };\n        fbreader = callPackage ../applications/misc/fbreader {\n        };\n        fetchmail = import ../applications/misc/fetchmail {\n          inherit stdenv fetchurl openssl;\n        };\n        fldigi = callPackage ../applications/audio/fldigi {\n        };\n        fluidsynth = callPackage ../applications/audio/fluidsynth {\n        };\n        fossil = callPackage ../applications/version-management/fossil {\n        };\n        fribid = callPackage ../applications/networking/browsers/mozilla-plugins/fribid {\n        };\n        fvwm = callPackage ../applications/window-managers/fvwm {\n        };\n        geany = callPackage ../applications/editors/geany {\n        };\n        gksu = callPackage ../applications/misc/gksu {\n        };\n        gnuradio = callPackage ../applications/misc/gnuradio {\n          inherit (pythonPackages) lxml\n          numpy scipy matplotlib pyopengl;\n          fftw = fftwFloat;\n        };\n        gnuradio-osmosdr = callPackage ../applications/misc/gnuradio-osmosdr {\n        };\n        goldendict = callPackage ../applications/misc/goldendict {\n        };\n        google-musicmanager = callPackage ../applications/audio/google-musicmanager {\n        };\n        gpicview = callPackage ../applications/graphics/gpicview {\n        };\n        gqrx = callPackage ../applications/misc/gqrx {\n        };\n        grass = import ../applications/misc/grass {\n          inherit (xlibs) libXmu libXext\n          libXp libX11 libXt libSM libICE\n          libXpm libXaw libXrender;\n          inherit config\n          composableDerivation stdenv\n          fetchurl lib flex bison cairo\n          fontconfig gdal zlib ncurses\n          gdbm proj pkgconfig swig blas\n          liblapack libjpeg libpng mysql\n          unixODBC mesa postgresql python\n          readline sqlite tcl tk libtiff\n          freetype makeWrapper wxGTK;\n          fftw = fftwSinglePrec;\n          ffmpeg = ffmpeg_0_10;\n          motif = lesstif;\n          opendwg = libdwg;\n          wxPython = wxPython28;\n        };\n        grip = callPackage ../applications/misc/grip {\n          inherit (gnome) libgnome\n          libgnomeui vte;\n        };\n        gtimelog = pythonPackages.gtimelog;\n        inherit (gnome3) gucharmap;\n        guitarix = callPackage ../applications/audio/guitarix {\n          fftw = fftwSinglePrec;\n        };\n        photivo = callPackage ../applications/graphics/photivo {\n        };\n        wavesurfer = callPackage ../applications/misc/audio/wavesurfer {\n        };\n        wireshark = callPackage ../applications/networking/sniffers/wireshark {\n        };\n        wvdial = callPackage ../os-specific/linux/wvdial {\n        };\n        fbida = callPackage ../applications/graphics/fbida {\n        };\n        fdupes = callPackage ../tools/misc/fdupes {\n        };\n        feh = callPackage ../applications/graphics/feh {\n        };\n        filezilla = callPackage ../applications/networking/ftp/filezilla {\n        };\n        firefox13Pkgs = callPackage ../applications/networking/browsers/firefox/13.0.nix {\n          inherit (gnome) libIDL;\n        };\n        firefox13Wrapper = wrapFirefox {\n          browser = firefox13Pkgs.firefox;\n        };\n        firefox30Pkgs = callPackage ../applications/networking/browsers/firefox/30.nix {\n          inherit (gnome) libIDL;\n          inherit (pythonPackages) pysqlite;\n          libpng = libpng_apng;\n        };\n        firefox = callPackage ../applications/networking/browsers/firefox {\n          inherit (gnome) libIDL;\n          inherit (pythonPackages) pysqlite;\n        };\n        firefoxWrapper = wrapFirefox {\n          browser = pkgs.firefox;\n        };\n        firefox-bin = callPackage ../applications/networking/browsers/firefox-bin {\n          gconf = pkgs.gnome.GConf;\n          inherit (pkgs.gnome) libgnome\n          libgnomeui;\n          inherit (pkgs.xlibs) libX11\n          libXScrnSaver libXext\n          libXinerama libXrender libXt;\n        };\n        flac = callPackage ../applications/audio/flac {\n        };\n        flashplayer = callPackage ../applications/networking/browsers/mozilla-plugins/flashplayer-11 {\n          debug = config.flashplayer.debug or false;\n        };\n        fluxbox = callPackage ../applications/window-managers/fluxbox {\n        };\n        freecad = callPackage ../applications/graphics/freecad {\n          opencascade = opencascade_6_5;\n          inherit (pythonPackages) matplotlib\n          pycollada;\n        };\n        freemind = callPackage ../applications/misc/freemind {\n          jdk = jdk;\n          jre = jdk;\n        };\n        freenet = callPackage ../applications/networking/p2p/freenet {\n        };\n        freepv = callPackage ../applications/graphics/freepv {\n        };\n        xfontsel = callPackage ../applications/misc/xfontsel {\n        };\n        xlsfonts = callPackage ../applications/misc/xlsfonts {\n        };\n        freerdp = callPackage ../applications/networking/remote/freerdp {\n          ffmpeg = ffmpeg_1;\n        };\n        freerdpUnstable = callPackage ../applications/networking/remote/freerdp/unstable.nix {\n        };\n        freicoin = callPackage ../applications/misc/freicoin {\n        };\n        fspot = callPackage ../applications/graphics/f-spot {\n          inherit (gnome) libgnome\n          libgnomeui;\n          gtksharp = gtksharp1;\n        };\n        fuze = callPackage ../applications/networking/instant-messengers/fuze {\n        };\n        gcolor2 = callPackage ../applications/graphics/gcolor2 {\n        };\n        get_iplayer = callPackage ../applications/misc/get_iplayer {\n        };\n        gimp_2_8 = callPackage ../applications/graphics/gimp/2.8.nix {\n          inherit (gnome) libart_lgpl;\n          webkit = null;\n          lcms = lcms2;\n          wrapPython = pythonPackages.wrapPython;\n        };\n        gimp = gimp_2_8;\n        gimpPlugins = recurseIntoAttrs (import ../applications/graphics/gimp/plugins {\n          inherit pkgs gimp;\n        });\n        gitAndTools = recurseIntoAttrs (import ../applications/version-management/git-and-tools {\n          inherit pkgs;\n        });\n        git = gitAndTools.git;\n        gitFull = gitAndTools.gitFull;\n        gitSVN = gitAndTools.gitSVN;\n        gitRepo = callPackage ../applications/version-management/git-repo {\n          python = python27;\n        };\n        gitolite = callPackage ../applications/version-management/gitolite {\n        };\n        inherit (gnome3) gitg;\n        giv = callPackage ../applications/graphics/giv {\n          pcre = pcre.override {\n            unicodeSupport = true;\n          };\n        };\n        gmrun = callPackage ../applications/misc/gmrun {\n        };\n        gnucash = callPackage ../applications/office/gnucash {\n          inherit (gnome2) libgnomeui\n          libgtkhtml gtkhtml libbonoboui\n          libgnomeprint libglade\n          libart_lgpl;\n          gconf = gnome2.GConf;\n          guile = guile_1_8;\n          slibGuile = slibGuile.override {\n            scheme = guile_1_8;\n          };\n          goffice = goffice_0_8;\n        };\n        goffice_0_8 = callPackage ../desktops/gnome-3/3.10/misc/goffice/0.8.nix {\n          inherit (gnome2) libglade\n          libgnomeui;\n          gconf = gnome2.GConf;\n          libart = gnome2.libart_lgpl;\n        };\n        ideas = recurseIntoAttrs (callPackage ../applications/editors/idea {\n        } // callPackage ../applications/editors/idea/pycharm.nix {\n        });\n        libquvi = callPackage ../applications/video/quvi/library.nix {\n        };\n        mi2ly = callPackage ../applications/audio/mi2ly {\n        };\n        praat = callPackage ../applications/audio/praat {\n        };\n        quvi = callPackage ../applications/video/quvi/tool.nix {\n        };\n        quvi_scripts = callPackage ../applications/video/quvi/scripts.nix {\n        };\n        qjackctl = callPackage ../applications/audio/qjackctl {\n        };\n        gkrellm = callPackage ../applications/misc/gkrellm {\n        };\n        gmu = callPackage ../applications/audio/gmu {\n        };\n        gnash = callPackage ../applications/video/gnash {\n          inherit (gnome) gtkglext;\n        };\n        gnome_mplayer = callPackage ../applications/video/gnome-mplayer {\n          inherit (gnome) GConf;\n        };\n        gnumeric = callPackage ../applications/office/gnumeric {\n          inherit (gnome3) goffice\n          gnome_icon_theme;\n        };\n        gnunet = callPackage ../applications/networking/p2p/gnunet {\n          libgcrypt = libgcrypt_1_6;\n        };\n        gnunet_svn = lowPrio (callPackage ../applications/networking/p2p/gnunet/svn.nix {\n          libgcrypt = libgcrypt_1_6;\n        });\n        gocr = callPackage ../applications/graphics/gocr {\n        };\n        gobby5 = callPackage ../applications/editors/gobby {\n          inherit (gnome) gtksourceview;\n        };\n        gphoto2 = callPackage ../applications/misc/gphoto2 {\n        };\n        gphoto2fs = builderDefsPackage ../applications/misc/gphoto2/gphotofs.nix {\n          inherit libgphoto2 fuse\n          pkgconfig glib libtool;\n        };\n        graphicsmagick = callPackage ../applications/graphics/graphicsmagick {\n        };\n        graphicsmagick_q16 = callPackage ../applications/graphics/graphicsmagick {\n          quantumdepth = 16;\n        };\n        graphicsmagick137 = callPackage ../applications/graphics/graphicsmagick/1.3.7.nix {\n          libpng = libpng12;\n        };\n        gtkpod = callPackage ../applications/audio/gtkpod {\n          inherit (gnome) libglade;\n        };\n        jbidwatcher = callPackage ../applications/misc/jbidwatcher {\n          java = if stdenv.isLinux\n            then jre\n            else jdk;\n        };\n        qrdecode = builderDefsPackage (import ../tools/graphics/qrdecode) {\n          libpng = libpng12;\n          opencv = opencv_2_1;\n        };\n        qrencode = callPackage ../tools/graphics/qrencode {\n        };\n        gecko_mediaplayer = callPackage ../applications/networking/browsers/mozilla-plugins/gecko-mediaplayer {\n          inherit (gnome) GConf;\n          browser = firefox;\n        };\n        geeqie = callPackage ../applications/graphics/geeqie {\n        };\n        gigedit = callPackage ../applications/audio/gigedit {\n        };\n        gqview = callPackage ../applications/graphics/gqview {\n        };\n        gmpc = callPackage ../applications/audio/gmpc {\n        };\n        gmtk = callPackage ../applications/networking/browsers/mozilla-plugins/gmtk {\n          inherit (gnome) GConf;\n        };\n        googleearth = callPackage_i686 ../applications/misc/googleearth {\n        };\n        google_talk_plugin = callPackage ../applications/networking/browsers/mozilla-plugins/google-talk-plugin {\n          libpng = libpng12;\n        };\n        gosmore = builderDefsPackage ../applications/misc/gosmore {\n          inherit fetchsvn curl pkgconfig\n          libxml2 gtk;\n        };\n        gpsbabel = callPackage ../applications/misc/gpsbabel {\n        };\n        gpscorrelate = callPackage ../applications/misc/gpscorrelate {\n        };\n        gpsd = callPackage ../servers/gpsd {\n        };\n        guitone = callPackage ../applications/version-management/guitone {\n        };\n        gv = callPackage ../applications/misc/gv {\n        };\n        guvcview = callPackage ../os-specific/linux/guvcview {\n        };\n        hello = callPackage ../applications/misc/hello/ex-2 {\n        };\n        herbstluftwm = callPackage ../applications/window-managers/herbstluftwm {\n        };\n        hexchat = callPackage ../applications/networking/irc/hexchat {\n        };\n        hexedit = callPackage ../applications/editors/hexedit {\n        };\n        hipchat = callPackage ../applications/networking/instant-messengers/hipchat {\n        };\n        homebank = callPackage ../applications/office/homebank {\n        };\n        htmldoc = callPackage ../applications/misc/htmldoc {\n          fltk = fltk13;\n        };\n        hugin = callPackage ../applications/graphics/hugin {\n        };\n        hydrogen = callPackage ../applications/audio/hydrogen {\n        };\n        i3 = callPackage ../applications/window-managers/i3 {\n        };\n        i3lock = callPackage ../applications/window-managers/i3/lock.nix {\n          inherit (xorg) libxkbfile;\n          cairo = cairo.override {\n            xcbSupport = true;\n          };\n        };\n        i3minator = callPackage ../tools/misc/i3minator {\n        };\n        i3status = callPackage ../applications/window-managers/i3/status.nix {\n        };\n        i810switch = callPackage ../os-specific/linux/i810switch {\n        };\n        icewm = callPackage ../applications/window-managers/icewm {\n        };\n        id3v2 = callPackage ../applications/audio/id3v2 {\n        };\n        ifenslave = callPackage ../os-specific/linux/ifenslave {\n        };\n        ii = callPackage ../applications/networking/irc/ii {\n        };\n        ike = callPackage ../applications/ike {\n        };\n        ikiwiki = callPackage ../applications/misc/ikiwiki {\n          inherit (perlPackages) TextMarkdown\n          URI HTMLParser HTMLScrubber\n          HTMLTemplate TimeDate CGISession\n          DBFile CGIFormBuilder\n          LocaleGettext RpcXML XMLSimple\n          PerlMagick YAML YAMLLibYAML\n          HTMLTree Filechdir\n          AuthenPassphrase\n          NetOpenIDConsumer\n          LWPxParanoidAgent CryptSSLeay;\n        };\n        imagemagick = callPackage ../applications/graphics/ImageMagick {\n          tetex = null;\n          librsvg = null;\n        };\n        imagemagickBig = lowPrio (callPackage ../applications/graphics/ImageMagick {\n        });\n        impressive = callPackage ../applications/office/impressive {\n          inherit (pythonPackages) pyopengl;\n        };\n        inferno = callPackage_i686 ../applications/inferno {\n        };\n        inkscape = callPackage ../applications/graphics/inkscape {\n          inherit (pythonPackages) lxml;\n          lcms = lcms2;\n        };\n        ion3 = callPackage ../applications/window-managers/ion-3 {\n          lua = lua5;\n        };\n        ipe = callPackage ../applications/graphics/ipe {\n        };\n        iptraf = callPackage ../applications/networking/iptraf {\n        };\n        irssi = callPackage ../applications/networking/irc/irssi {\n          stdenv = if stdenv.isDarwin\n            then stdenvAdapters.overrideGCC stdenv gccApple\n            else stdenv;\n        };\n        irssi_fish = callPackage ../applications/networking/irc/irssi/fish {\n        };\n        irssi_otr = callPackage ../applications/networking/irc/irssi/otr {\n        };\n        bip = callPackage ../applications/networking/irc/bip {\n        };\n        jack_capture = callPackage ../applications/audio/jack-capture {\n        };\n        jack_oscrolloscope = callPackage ../applications/audio/jack-oscrolloscope {\n        };\n        jack_rack = callPackage ../applications/audio/jack-rack {\n        };\n        jackmeter = callPackage ../applications/audio/jackmeter {\n        };\n        jalv = callPackage ../applications/audio/jalv {\n        };\n        jedit = callPackage ../applications/editors/jedit {\n        };\n        jigdo = callPackage ../applications/misc/jigdo {\n        };\n        jitsi = callPackage ../applications/networking/instant-messengers/jitsi {\n        };\n        joe = callPackage ../applications/editors/joe {\n        };\n        jbrout = callPackage ../applications/graphics/jbrout {\n          inherit (pythonPackages) lxml;\n        };\n        jwm = callPackage ../applications/window-managers/jwm {\n        };\n        k3d = callPackage ../applications/graphics/k3d {\n          inherit (pkgs.gnome2) gtkglext;\n        };\n        keepnote = callPackage ../applications/office/keepnote {\n          pygtk = pyGtkGlade;\n        };\n        kermit = callPackage ../tools/misc/kermit {\n        };\n        keymon = callPackage ../applications/video/key-mon {\n        };\n        kino = callPackage ../applications/video/kino {\n          inherit (gnome) libglade;\n        };\n        lame = callPackage ../applications/audio/lame {\n        };\n        larswm = callPackage ../applications/window-managers/larswm {\n        };\n        lash = callPackage ../applications/audio/lash {\n        };\n        ladspaH = callPackage ../applications/audio/ladspa-plugins/ladspah.nix {\n        };\n        ladspaPlugins = callPackage ../applications/audio/ladspa-plugins {\n          fftw = fftwSinglePrec;\n        };\n        caps = callPackage ../applications/audio/caps {\n        };\n        lastwatch = callPackage ../applications/audio/lastwatch {\n        };\n        lastfmsubmitd = callPackage ../applications/audio/lastfmsubmitd {\n        };\n        lbdb = callPackage ../tools/misc/lbdb {\n        };\n        lci = callPackage ../applications/science/logic/lci {\n        };\n        ldcpp = callPackage ../applications/networking/p2p/ldcpp {\n          inherit (gnome) libglade;\n        };\n        librecad = callPackage ../applications/misc/librecad {\n        };\n        librecad2 = callPackage ../applications/misc/librecad/2.0.nix {\n        };\n        libreoffice = callPackage ../applications/office/libreoffice {\n          inherit (perlPackages) ArchiveZip\n          CompressZlib;\n          inherit (gnome) GConf ORBit2\n          gnome_vfs;\n          zip = zip.override {\n            enableNLS = false;\n          };\n          boost = boost155;\n          jdk = openjdk;\n          fontsConf = makeFontsConf {\n            fontDirectories = [\n              freefont_ttf\n              xorg.fontmiscmisc\n              xorg.fontbhttf\n            ];\n          };\n          clucene_core = clucene_core_2;\n          lcms = lcms2;\n          harfbuzz = harfbuzz.override {\n            withIcu = true;\n            withGraphite2 = true;\n          };\n        };\n        liferea = callPackage ../applications/networking/newsreaders/liferea {\n        };\n        lingot = callPackage ../applications/audio/lingot {\n          inherit (gnome) libglade;\n        };\n        links = callPackage ../applications/networking/browsers/links {\n        };\n        ledger = callPackage ../applications/office/ledger/2.6.3.nix {\n        };\n        ledger3 = callPackage ../applications/office/ledger/3.0.nix {\n        };\n        lighttable = callPackage ../applications/editors/lighttable {\n        };\n        links2 = callPackage ../applications/networking/browsers/links2 {\n        };\n        linphone = callPackage ../applications/networking/instant-messengers/linphone rec {\n          inherit (gnome) libglade;\n          libexosip = libexosip_3;\n          libosip = libosip_3;\n        };\n        linuxsampler = callPackage ../applications/audio/linuxsampler {\n          bison = bison2;\n        };\n        llpp = callPackage ../applications/misc/llpp {\n          inherit (ocamlPackages) lablgl;\n        };\n        lmms = callPackage ../applications/audio/lmms {\n        };\n        lrzsz = callPackage ../tools/misc/lrzsz {\n        };\n        luminanceHDR = callPackage ../applications/graphics/luminance-hdr {\n        };\n        lxdvdrip = callPackage ../applications/video/lxdvdrip {\n        };\n        handbrake = callPackage ../applications/video/handbrake {\n        };\n        lynx = callPackage ../applications/networking/browsers/lynx {\n        };\n        lyx = callPackage ../applications/misc/lyx {\n        };\n        makeself = callPackage ../applications/misc/makeself {\n        };\n        matchbox = callPackage ../applications/window-managers/matchbox {\n        };\n        mcpp = callPackage ../development/compilers/mcpp {\n        };\n        mda_lv2 = callPackage ../applications/audio/mda-lv2 {\n        };\n        meld = callPackage ../applications/version-management/meld {\n          inherit (gnome) scrollkeeper;\n          pygtk = pyGtkGlade;\n        };\n        mcomix = callPackage ../applications/graphics/mcomix {\n        };\n        mercurial = callPackage ../applications/version-management/mercurial {\n          inherit (pythonPackages) curses\n          docutils;\n          guiSupport = false;\n        };\n        mercurialFull = appendToName \"full\" (pkgs.mercurial.override {\n          guiSupport = true;\n        });\n        merkaartor = callPackage ../applications/misc/merkaartor {\n        };\n        meshlab = callPackage ../applications/graphics/meshlab {\n        };\n        mhwaveedit = callPackage ../applications/audio/mhwaveedit {\n        };\n        mid2key = callPackage ../applications/audio/mid2key {\n        };\n        midori = callPackage ../applications/networking/browsers/midori {\n        };\n        midoriWrapper = wrapFirefox {\n          browser = midori;\n          browserName = \"midori\";\n          desktopName = \"Midori\";\n          icon = \"${midori}/share/icons/hicolor/22x22/apps/midori.png\";\n        };\n        mikmod = callPackage ../applications/audio/mikmod {\n        };\n        minicom = callPackage ../tools/misc/minicom {\n        };\n        minimodem = callPackage ../applications/audio/minimodem {\n        };\n        minidjvu = callPackage ../applications/graphics/minidjvu {\n        };\n        mirage = callPackage ../applications/graphics/mirage {\n        };\n        mixxx = callPackage ../applications/audio/mixxx {\n          inherit (vamp) vampSDK;\n        };\n        mmex = callPackage ../applications/office/mmex {\n        };\n        moc = callPackage ../applications/audio/moc {\n        };\n        monkeysAudio = callPackage ../applications/audio/monkeys-audio {\n        };\n        monodevelop = callPackage ../applications/editors/monodevelop {\n          inherit (gnome) gnome_vfs\n          libbonobo libglade libgnome\n          GConf;\n          mozilla = firefox;\n          gtksharp = gtksharp2;\n        };\n        monodoc = callPackage ../applications/editors/monodoc {\n          gtksharp = gtksharp1;\n        };\n        monotone = callPackage ../applications/version-management/monotone {\n          lua = lua5;\n          boost = boost149;\n        };\n        monotoneViz = builderDefsPackage (import ../applications/version-management/monotone-viz/mtn-head.nix) {\n          inherit ocaml graphviz pkgconfig\n          autoconf automake libtool glib\n          gtk;\n          inherit (ocamlPackages) lablgtk;\n          inherit (gnome) libgnomecanvas;\n        };\n        mopidy = callPackage ../applications/audio/mopidy {\n        };\n        mopidy-spotify = callPackage ../applications/audio/mopidy-spotify {\n        };\n        mopidy-moped = callPackage ../applications/audio/mopidy-moped {\n        };\n        mozilla = callPackage ../applications/networking/browsers/mozilla {\n          inherit (gnome) libIDL;\n        };\n        mozplugger = builderDefsPackage (import ../applications/networking/browsers/mozilla-plugins/mozplugger) {\n          inherit firefox;\n          inherit (xlibs) libX11 xproto;\n        };\n        easytag = callPackage ../applications/audio/easytag {\n        };\n        mp3info = callPackage ../applications/audio/mp3info {\n        };\n        mp3splt = callPackage ../applications/audio/mp3splt {\n        };\n        mpc123 = callPackage ../applications/audio/mpc123 {\n        };\n        mpg123 = callPackage ../applications/audio/mpg123 {\n        };\n        mpg321 = callPackage ../applications/audio/mpg321 {\n        };\n        mpc_cli = callPackage ../applications/audio/mpc {\n        };\n        ncmpc = callPackage ../applications/audio/ncmpc {\n        };\n        ncmpcpp = callPackage ../applications/audio/ncmpcpp {\n        };\n        normalize = callPackage ../applications/audio/normalize {\n        };\n        mplayer = callPackage ../applications/video/mplayer {\n          pulseSupport = config.pulseaudio or false;\n          vdpauSupport = config.mplayer.vdpauSupport or false;\n        };\n        mplayer2 = callPackage ../applications/video/mplayer2 {\n          ffmpeg = libav_9;\n        };\n        MPlayerPlugin = browser:\n        import ../applications/networking/browsers/mozilla-plugins/mplayerplug-in {\n          inherit browser;\n          inherit fetchurl stdenv\n          pkgconfig gettext;\n          inherit (xlibs) libXpm;\n        };\n        mpv = callPackage ../applications/video/mpv {\n          lua = lua5_1;\n          bs2bSupport = true;\n          quviSupport = true;\n          cacaSupport = true;\n        };\n        mrxvt = callPackage ../applications/misc/mrxvt {\n        };\n        multisync = callPackage ../applications/misc/multisync {\n          inherit (gnome) ORBit2 libbonobo\n          libgnomeui GConf;\n        };\n        mumble = callPackage ../applications/networking/mumble {\n          avahi = avahi.override {\n            withLibdnssdCompat = true;\n          };\n          jackSupport = config.mumble.jackSupport or false;\n          speechdSupport = config.mumble.speechdSupport or false;\n        };\n        murmur = callPackage ../applications/networking/mumble/murmur.nix {\n          avahi = avahi.override {\n            withLibdnssdCompat = true;\n          };\n          iceSupport = config.murmur.iceSupport or true;\n        };\n        mutt = callPackage ../applications/networking/mailreaders/mutt {\n        };\n        pcmanfm = callPackage ../applications/misc/pcmanfm {\n        };\n        ruby_gpgme = callPackage ../development/libraries/ruby_gpgme {\n          ruby = ruby19;\n          hoe = rubyLibs.hoe;\n        };\n        ruby_ncursesw_sup = callPackage ../development/libraries/ruby_ncursesw_sup {\n        };\n        shotcut = callPackage ../applications/video/shotcut {\n          mlt = mlt-qt5;\n        };\n        smplayer = callPackage ../applications/video/smplayer {\n        };\n        sup = with rubyLibs; callPackage ../applications/networking/mailreaders/sup {\n          ruby = ruby19.override {\n            cursesSupport = true;\n          };\n          inherit gettext highline iconv\n          locale lockfile text trollop\n          xapian_ruby which;\n          rmail_sup = \"\";\n          unicode = \"\";\n          bundler = pkgs.lib.overrideDerivation pkgs.rubyLibs.bundler (oldAttrs:\n          { dontPatchShebangs = 1; });\n          chronic = chronic;\n          gpgme = ruby_gpgme;\n          mime_types = mime_types;\n          ncursesw_sup = ruby_ncursesw_sup;\n          rake = rake;\n        };\n        synfigstudio = callPackage ../applications/graphics/synfigstudio {\n          fontsConf = makeFontsConf {\n            fontDirectories = [\n              freefont_ttf\n            ];\n          };\n        };\n        sxhkd = callPackage ../applications/window-managers/sxhkd {\n        };\n        msmtp = callPackage ../applications/networking/msmtp {\n        };\n        imapfilter = callPackage ../applications/networking/mailreaders/imapfilter.nix {\n          lua = lua5;\n        };\n        mupdf = callPackage ../applications/misc/mupdf {\n        };\n        mypaint = callPackage ../applications/graphics/mypaint {\n        };\n        mythtv = callPackage ../applications/video/mythtv {\n        };\n        tvtime = callPackage ../applications/video/tvtime {\n          kernel = linux;\n        };\n        nano = callPackage ../applications/editors/nano {\n        };\n        navipowm = callPackage ../applications/misc/navipowm {\n        };\n        navit = callPackage ../applications/misc/navit {\n        };\n        netbeans = callPackage ../applications/editors/netbeans {\n        };\n        ncdu = callPackage ../tools/misc/ncdu {\n        };\n        ncdc = callPackage ../applications/networking/p2p/ncdc {\n        };\n        nedit = callPackage ../applications/editors/nedit {\n          motif = lesstif;\n        };\n        netsurfBrowser = netsurf.browser;\n        netsurf = recurseIntoAttrs (import ../applications/networking/browsers/netsurf {\n          inherit pkgs;\n        });\n        notmuch = callPackage ../applications/networking/mailreaders/notmuch {\n          emacs = null;\n        };\n        nova = callPackage ../applications/virtualization/nova {\n        };\n        novaclient = callPackage ../applications/virtualization/nova/client.nix {\n        };\n        nspluginwrapper = callPackage ../applications/networking/browsers/mozilla-plugins/nspluginwrapper {\n        };\n        nvi = callPackage ../applications/editors/nvi {\n        };\n        nvpy = callPackage ../applications/editors/nvpy {\n        };\n        obconf = callPackage ../tools/X11/obconf {\n          inherit (gnome) libglade;\n        };\n        ocrad = callPackage ../applications/graphics/ocrad {\n        };\n        offrss = callPackage ../applications/networking/offrss {\n        };\n        ogmtools = callPackage ../applications/video/ogmtools {\n        };\n        omxplayer = callPackage ../applications/video/omxplayer {\n        };\n        oneteam = callPackage ../applications/networking/instant-messengers/oneteam {\n        };\n        openbox = callPackage ../applications/window-managers/openbox {\n        };\n        openimageio = callPackage ../applications/graphics/openimageio {\n        };\n        openjump = callPackage ../applications/misc/openjump {\n        };\n        openscad = callPackage ../applications/graphics/openscad {\n        };\n        opera = callPackage ../applications/networking/browsers/opera {\n          inherit (pkgs.kde4) kdelibs;\n        };\n        opusfile = callPackage ../applications/audio/opusfile {\n        };\n        opusTools = callPackage ../applications/audio/opus-tools {\n        };\n        pamixer = callPackage ../applications/audio/pamixer {\n        };\n        pan = callPackage ../applications/networking/newsreaders/pan {\n          spellChecking = false;\n        };\n        panotools = callPackage ../applications/graphics/panotools {\n        };\n        pavucontrol = callPackage ../applications/audio/pavucontrol {\n        };\n        paraview = callPackage ../applications/graphics/paraview {\n        };\n        pencil = callPackage ../applications/graphics/pencil {\n        };\n        petrifoo = callPackage ../applications/audio/petrifoo {\n          inherit (gnome) libgnomecanvas;\n        };\n        pdftk = callPackage ../tools/typesetting/pdftk {\n        };\n        pdfgrep = callPackage ../tools/typesetting/pdfgrep {\n        };\n        pianobar = callPackage ../applications/audio/pianobar {\n        };\n        pianobooster = callPackage ../applications/audio/pianobooster {\n        };\n        picard = callPackage ../applications/audio/picard {\n        };\n        picocom = callPackage ../tools/misc/picocom {\n        };\n        pidgin = callPackage ../applications/networking/instant-messengers/pidgin {\n          openssl = if config.pidgin.openssl or true\n            then openssl\n            else null;\n          gnutls = if config.pidgin.gnutls or false\n            then gnutls\n            else null;\n          libgcrypt = if config.pidgin.gnutls or false\n            then libgcrypt\n            else null;\n          startupnotification = libstartup_notification;\n        };\n        pidginlatex = callPackage ../applications/networking/instant-messengers/pidgin-plugins/pidgin-latex {\n          imagemagick = imagemagickBig;\n        };\n        pidginlatexSF = builderDefsPackage (import ../applications/networking/instant-messengers/pidgin-plugins/pidgin-latex/pidgin-latex-sf.nix) {\n          inherit pkgconfig pidgin texLive\n          imagemagick which glib gtk;\n        };\n        pidginmsnpecan = callPackage ../applications/networking/instant-messengers/pidgin-plugins/msn-pecan {\n        };\n        pidginotr = callPackage ../applications/networking/instant-messengers/pidgin-plugins/otr {\n        };\n        pidginsipe = callPackage ../applications/networking/instant-messengers/pidgin-plugins/sipe {\n        };\n        toxprpl = callPackage ../applications/networking/instant-messengers/pidgin-plugins/tox-prpl {\n        };\n        pinfo = callPackage ../applications/misc/pinfo {\n        };\n        pinta = callPackage ../applications/graphics/pinta {\n          gtksharp = gtksharp2;\n        };\n        pommed = callPackage ../os-specific/linux/pommed {\n          inherit (xorg) libXpm;\n        };\n        potrace = callPackage ../applications/graphics/potrace {\n        };\n        posterazor = callPackage ../applications/misc/posterazor {\n        };\n        pqiv = callPackage ../applications/graphics/pqiv {\n        };\n        qiv = callPackage ../applications/graphics/qiv {\n        };\n        procmail = callPackage ../applications/misc/procmail {\n        };\n        pstree = callPackage ../applications/misc/pstree {\n        };\n        pulseview = callPackage ../applications/science/electronics/pulseview {\n        };\n        puredata = callPackage ../applications/audio/puredata {\n        };\n        pythonmagick = callPackage ../applications/graphics/PythonMagick {\n        };\n        qbittorrent = callPackage ../applications/networking/p2p/qbittorrent {\n        };\n        eiskaltdcpp = callPackage ../applications/networking/p2p/eiskaltdcpp {\n        };\n        qemu = callPackage ../applications/virtualization/qemu {\n        };\n        qmmp = callPackage ../applications/audio/qmmp {\n        };\n        qsampler = callPackage ../applications/audio/qsampler {\n        };\n        qsynth = callPackage ../applications/audio/qsynth {\n        };\n        qtpfsgui = callPackage ../applications/graphics/qtpfsgui {\n        };\n        qtractor = callPackage ../applications/audio/qtractor {\n        };\n        quodlibet = callPackage ../applications/audio/quodlibet {\n          inherit (pythonPackages) mutagen;\n        };\n        quodlibet-with-gst-plugins = callPackage ../applications/audio/quodlibet {\n          inherit (pythonPackages) mutagen;\n          withGstPlugins = true;\n          gst_plugins_bad = null;\n        };\n        rakarrack = callPackage ../applications/audio/rakarrack {\n          inherit (xorg) libXpm libXft;\n          fltk = fltk13;\n        };\n        rapcad = callPackage ../applications/graphics/rapcad {\n        };\n        rapidsvn = callPackage ../applications/version-management/rapidsvn {\n        };\n        ratpoison = callPackage ../applications/window-managers/ratpoison {\n        };\n        rawtherapee = callPackage ../applications/graphics/rawtherapee {\n          fftw = fftwSinglePrec;\n        };\n        rcs = callPackage ../applications/version-management/rcs {\n        };\n        rdesktop = callPackage ../applications/networking/remote/rdesktop {\n        };\n        recode = callPackage ../tools/text/recode {\n        };\n        retroshare = callPackage ../applications/networking/p2p/retroshare {\n          qt = qt4;\n        };\n        retroshare06 = lowPrio (callPackage ../applications/networking/p2p/retroshare/0.6.nix {\n          qt = qt4;\n        });\n        rsync = callPackage ../applications/networking/sync/rsync {\n          enableACLs = !(stdenv.isDarwin || stdenv.isSunOS || stdenv.isFreeBSD);\n          enableCopyDevicesPatch = config.rsync.enableCopyDevicesPatch or false;\n        };\n        rtl-sdr = callPackage ../applications/misc/rtl-sdr {\n        };\n        rubyripper = callPackage ../applications/audio/rubyripper {\n        };\n        rxvt = callPackage ../applications/misc/rxvt {\n        };\n        rxvt_unicode = callPackage ../applications/misc/rxvt_unicode {\n          perlSupport = true;\n          gdkPixbufSupport = true;\n          unicode3Support = true;\n        };\n        sakura = callPackage ../applications/misc/sakura {\n          inherit (gnome) vte;\n        };\n        sbagen = callPackage ../applications/misc/sbagen {\n        };\n        scite = callPackage ../applications/editors/scite {\n        };\n        scribus = callPackage ../applications/office/scribus {\n          inherit (gnome) libart_lgpl;\n        };\n        seafile-client = callPackage ../applications/networking/seafile-client {\n        };\n        seeks = callPackage ../tools/networking/p2p/seeks {\n          opencv = opencv_2_1;\n        };\n        seg3d = callPackage ../applications/graphics/seg3d {\n          wxGTK = wxGTK28.override {\n            unicode = false;\n          };\n        };\n        seq24 = callPackage ../applications/audio/seq24 {\n        };\n        setbfree = callPackage ../applications/audio/setbfree {\n        };\n        sflphone = callPackage ../applications/networking/instant-messengers/sflphone {\n          gtk = gtk3;\n        };\n        siproxd = callPackage ../applications/networking/siproxd {\n        };\n        skype = callPackage_i686 ../applications/networking/instant-messengers/skype {\n        };\n        skype4pidgin = callPackage ../applications/networking/instant-messengers/pidgin-plugins/skype4pidgin {\n        };\n        skype_call_recorder = callPackage ../applications/networking/instant-messengers/skype-call-recorder {\n        };\n        slrn = callPackage ../applications/networking/newsreaders/slrn {\n        };\n        spideroak = callPackage ../applications/networking/spideroak {\n        };\n        ssvnc = callPackage ../applications/networking/remote/ssvnc {\n        };\n        st = callPackage ../applications/misc/st {\n          conf = config.st.conf or null;\n        };\n        linuxstopmotion = callPackage ../applications/video/linuxstopmotion {\n        };\n        sweethome3d = recurseIntoAttrs (callPackage ../applications/misc/sweethome3d {\n        } // callPackage ../applications/misc/sweethome3d/editors.nix {\n          sweethome3dApp = sweethome3d.application;\n        });\n        sxiv = callPackage ../applications/graphics/sxiv {\n        };\n        bittorrentSync = callPackage ../applications/networking/bittorrentsync {\n        };\n        dropbox = callPackage ../applications/networking/dropbox {\n        };\n        dropbox-cli = callPackage ../applications/networking/dropbox-cli {\n        };\n        lightdm = callPackage ../applications/display-managers/lightdm {\n        };\n        lightdm_gtk_greeter = callPackage ../applications/display-managers/lightdm-gtk-greeter {\n        };\n        slic3r = callPackage ../applications/misc/slic3r {\n          perlPackages = perl514Packages;\n          perl = perl514;\n        };\n        curaengine = callPackage ../applications/misc/curaengine {\n        };\n        cura = callPackage ../applications/misc/cura {\n        };\n        printrun = callPackage ../applications/misc/printrun {\n        };\n        slim = callPackage ../applications/display-managers/slim {\n          libpng = libpng12;\n        };\n        smartdeblur = callPackage ../applications/graphics/smartdeblur {\n        };\n        snd = callPackage ../applications/audio/snd {\n        };\n        shntool = callPackage ../applications/audio/shntool {\n        };\n        sonic_visualiser = callPackage ../applications/audio/sonic-visualiser {\n          inherit (pkgs.vamp) vampSDK;\n          inherit (pkgs.xlibs) libX11;\n          fftw = pkgs.fftwSinglePrec;\n        };\n        sox = callPackage ../applications/misc/audio/sox {\n        };\n        soxr = callPackage ../applications/misc/audio/soxr {\n        };\n        spotify = callPackage ../applications/audio/spotify {\n          inherit (gnome) GConf;\n          libpng = libpng12;\n        };\n        libspotify = callPackage ../development/libraries/libspotify {\n          apiKey = config.libspotify.apiKey or null;\n        };\n        stalonetray = callPackage ../applications/window-managers/stalonetray {\n        };\n        stp = callPackage ../applications/science/logic/stp {\n        };\n        stumpwm = lispPackages.stumpwm;\n        sublime = callPackage ../applications/editors/sublime {\n        };\n        sublime3 = lowPrio (callPackage ../applications/editors/sublime3 {\n        });\n        subversion = callPackage ../applications/version-management/subversion/default.nix {\n          bdbSupport = true;\n          httpServer = false;\n          httpSupport = true;\n          pythonBindings = false;\n          perlBindings = false;\n          javahlBindings = false;\n          saslSupport = false;\n          httpd = apacheHttpd;\n          sasl = cyrus_sasl;\n        };\n        subversionClient = appendToName \"client\" (subversion.override {\n          bdbSupport = false;\n          perlBindings = true;\n          pythonBindings = true;\n        });\n        surf = callPackage ../applications/misc/surf {\n          webkit = webkitgtk2;\n        };\n        svk = perlPackages.SVK;\n        swh_lv2 = callPackage ../applications/audio/swh-lv2 {\n        };\n        sylpheed = callPackage ../applications/networking/mailreaders/sylpheed {\n          sslSupport = true;\n          gpgSupport = true;\n        };\n        symlinks = callPackage ../tools/system/symlinks {\n        };\n        syncthing = callPackage ../applications/networking/syncthing {\n        };\n        synergy = callPackage ../applications/misc/synergy {\n        };\n        tabbed = callPackage ../applications/window-managers/tabbed {\n        };\n        tahoelafs = callPackage ../tools/networking/p2p/tahoe-lafs {\n          inherit (pythonPackages) twisted\n          foolscap simplejson nevow zfec\n          pycryptopp sqlite3 darcsver\n          setuptoolsTrial setuptoolsDarcs\n          numpy pyasn1 mock;\n        };\n        tailor = builderDefsPackage (import ../applications/version-management/tailor) {\n          inherit makeWrapper python;\n        };\n        tangogps = callPackage ../applications/misc/tangogps {\n          gconf = gnome.GConf;\n        };\n        teamspeak_client = callPackage ../applications/networking/instant-messengers/teamspeak/client.nix {\n        };\n        teamspeak_server = callPackage ../applications/networking/instant-messengers/teamspeak/server.nix {\n        };\n        taskjuggler = callPackage ../applications/misc/taskjuggler {\n        };\n        taskwarrior = callPackage ../applications/misc/taskwarrior {\n        };\n        taskserver = callPackage ../servers/misc/taskserver {\n        };\n        telegram-cli = callPackage ../applications/networking/instant-messengers/telegram-cli/default.nix {\n        };\n        telepathy_gabble = callPackage ../applications/networking/instant-messengers/telepathy/gabble {\n        };\n        telepathy_haze = callPackage ../applications/networking/instant-messengers/telepathy/haze {\n        };\n        telepathy_logger = callPackage ../applications/networking/instant-messengers/telepathy/logger {\n        };\n        telepathy_mission_control = callPackage ../applications/networking/instant-messengers/telepathy/mission-control {\n        };\n        telepathy_rakia = callPackage ../applications/networking/instant-messengers/telepathy/rakia {\n        };\n        telepathy_salut = callPackage ../applications/networking/instant-messengers/telepathy/salut {\n        };\n        terminator = callPackage ../applications/misc/terminator {\n          vte = gnome.vte.override {\n            pythonSupport = true;\n          };\n          inherit (pythonPackages) notify;\n        };\n        tesseract = callPackage ../applications/graphics/tesseract {\n        };\n        thinkingRock = callPackage ../applications/misc/thinking-rock {\n        };\n        thunderbird = callPackage ../applications/networking/mailreaders/thunderbird {\n          inherit (gnome) libIDL;\n          inherit (pythonPackages) pysqlite;\n          libpng = libpng_apng;\n        };\n        thunderbird-bin = callPackage ../applications/networking/mailreaders/thunderbird-bin {\n          gconf = pkgs.gnome.GConf;\n          inherit (pkgs.gnome) libgnome\n          libgnomeui;\n          inherit (pkgs.xlibs) libX11\n          libXScrnSaver libXext\n          libXinerama libXrender libXt;\n        };\n        tig = gitAndTools.tig;\n        timidity = callPackage ../tools/misc/timidity {\n        };\n        tint2 = callPackage ../applications/misc/tint2 {\n        };\n        tkcvs = callPackage ../applications/version-management/tkcvs {\n        };\n        tla = callPackage ../applications/version-management/arch {\n        };\n        todo-txt-cli = callPackage ../applications/office/todo.txt-cli {\n        };\n        torchat = callPackage ../applications/networking/instant-messengers/torchat {\n          wrapPython = pythonPackages.wrapPython;\n        };\n        toxic = callPackage ../applications/networking/instant-messengers/toxic {\n        };\n        transcode = callPackage ../applications/audio/transcode {\n        };\n        transmission = callPackage ../applications/networking/p2p/transmission {\n        };\n        transmission_gtk = transmission.override {\n          enableGTK3 = true;\n        };\n        transmission_remote_gtk = callPackage ../applications/networking/p2p/transmission-remote-gtk {\n        };\n        trayer = callPackage ../applications/window-managers/trayer {\n        };\n        tree = callPackage ../tools/system/tree {\n        };\n        tribler = callPackage ../applications/networking/p2p/tribler {\n        };\n        twister = callPackage ../applications/networking/p2p/twister {\n        };\n        twmn = callPackage ../applications/misc/twmn {\n        };\n        twinkle = callPackage ../applications/networking/instant-messengers/twinkle {\n        };\n        umurmur = callPackage ../applications/networking/umurmur {\n        };\n        unison = callPackage ../applications/networking/sync/unison {\n          inherit (ocamlPackages) lablgtk;\n          enableX11 = config.unison.enableX11 or true;\n        };\n        uucp = callPackage ../tools/misc/uucp {\n        };\n        uvccapture = callPackage ../applications/video/uvccapture {\n        };\n        uwimap = callPackage ../tools/networking/uwimap {\n        };\n        uzbl = callPackage ../applications/networking/browsers/uzbl {\n          webkit = webkitgtk2;\n        };\n        uTox = callPackage ../applications/networking/instant-messengers/utox {\n        };\n        vanitygen = callPackage ../applications/misc/vanitygen {\n        };\n        vbindiff = callPackage ../applications/editors/vbindiff {\n        };\n        vcprompt = callPackage ../applications/version-management/vcprompt {\n        };\n        vdpauinfo = callPackage ../tools/X11/vdpauinfo {\n        };\n        veracity = callPackage ../applications/version-management/veracity {\n        };\n        viewMtn = builderDefsPackage (import ../applications/version-management/viewmtn/0.10.nix) {\n          inherit monotone cheetahTemplate\n          highlight ctags makeWrapper\n          graphviz which python;\n          flup = pythonPackages.flup;\n        };\n        vim = callPackage ../applications/editors/vim {\n        };\n        macvim = callPackage ../applications/editors/vim/macvim.nix {\n        };\n        vimHugeX = vim_configurable;\n        vim_configurable = callPackage ../applications/editors/vim/configurable.nix {\n          inherit (pkgs) fetchurl fetchhg\n          stdenv ncurses pkgconfig gettext\n          composableDerivation lib config\n          glib gtk python perl tcl ruby;\n          inherit (pkgs.xlibs) libX11\n          libXext libSM libXpm libXt\n          libXaw libXau libXmu libICE;\n          features = \"huge\";\n          lua = pkgs.lua5;\n          gui = config.vim.gui or \"auto\";\n          flags = [ \"python\" \"X11\" ];\n          inherit stdenvAdapters gccApple;\n        };\n        vimNox = lowPrio (vim_configurable.override {\n          source = \"vim-nox\";\n        });\n        qvim = lowPrio (callPackage ../applications/editors/vim/qvim.nix {\n          inherit (pkgs) fetchgit stdenv\n          ncurses pkgconfig gettext\n          composableDerivation lib config\n          python perl tcl ruby qt4;\n          inherit (pkgs.xlibs) libX11\n          libXext libSM libXpm libXt\n          libXaw libXau libXmu libICE;\n          inherit (pkgs) stdenvAdapters\n          gccApple;\n          features = \"huge\";\n          lua = pkgs.lua5;\n          flags = [ \"python\" \"X11\" ];\n        });\n        vimpc = callPackage ../applications/audio/vimpc {\n        };\n        virtviewer = callPackage ../applications/virtualization/virt-viewer {\n          gtkvnc = gtkvnc.override {\n            enableGTK3 = true;\n          };\n          spice_gtk = spice_gtk.override {\n            enableGTK3 = true;\n          };\n        };\n        virtmanager = callPackage ../applications/virtualization/virt-manager {\n          inherit (gnome) gnome_python;\n          vte = gnome3.vte;\n          dconf = gnome3.dconf;\n          gtkvnc = gtkvnc.override {\n            enableGTK3 = true;\n          };\n          spice_gtk = spice_gtk.override {\n            enableGTK3 = true;\n          };\n        };\n        virtinst = callPackage ../applications/virtualization/virtinst {\n        };\n        virtualgl = callPackage ../tools/X11/virtualgl {\n        };\n        bumblebee = callPackage ../tools/X11/bumblebee {\n        };\n        vkeybd = callPackage ../applications/audio/vkeybd {\n          inherit (xlibs) libX11;\n        };\n        vlc = callPackage ../applications/video/vlc {\n        };\n        vmpk = callPackage ../applications/audio/vmpk {\n        };\n        vnstat = callPackage ../applications/networking/vnstat {\n        };\n        vorbisTools = callPackage ../applications/audio/vorbis-tools {\n        };\n        vue = callPackage ../applications/misc/vue {\n          jre = icedtea7_jre;\n        };\n        vwm = callPackage ../applications/window-managers/vwm {\n        };\n        vym = callPackage ../applications/misc/vym {\n        };\n        w3m = callPackage ../applications/networking/browsers/w3m {\n          graphicsSupport = false;\n        };\n        weechat = callPackage ../applications/networking/irc/weechat {\n        };\n        weechatDevel = lowPrio (callPackage ../applications/networking/irc/weechat/devel.nix {\n        });\n        weston = callPackage ../applications/window-managers/weston {\n        };\n        windowmaker = callPackage ../applications/window-managers/windowmaker {\n        };\n        winswitch = callPackage ../tools/X11/winswitch {\n        };\n        wings = callPackage ../applications/graphics/wings {\n          erlang = erlangR14;\n          esdl = esdl.override {\n            erlang = erlangR14;\n          };\n        };\n        wmname = callPackage ../applications/misc/wmname {\n        };\n        wmctrl = callPackage ../tools/X11/wmctrl {\n        };\n        wmiimenu = import ../applications/window-managers/wmii31 {\n          libixp = libixp_for_wmii;\n          inherit fetchurl stdenv gawk;\n          inherit (xlibs) libX11;\n        };\n        wmiiSnap = import ../applications/window-managers/wmii {\n          libixp = libixp_for_wmii;\n          inherit fetchurl stdenv gawk;\n          inherit (xlibs) libX11 xextproto\n          libXt libXext;\n          includeUnpack = config.stdenv.includeUnpack or false;\n        };\n        wordnet = callPackage ../applications/misc/wordnet {\n        };\n        wrapChromium = browser:\n        wrapFirefox {\n          inherit browser;\n          browserName = browser.packageName;\n          desktopName = \"Chromium\";\n          icon = \"${browser}/share/icons/hicolor/48x48/apps/${browser.packageName}.png\";\n        };\n        wrapFirefox = { browser, browserName ? \"firefox\", desktopName ? \"Firefox\", icon ? \"${browser}/lib/${browser.name}/browser/icons/mozicon128.png\", nameSuffix ? \"\" }:\n        let\n          cfg = stdenv.lib.attrByPath [\n            browserName\n          ] { } config;\n          enableAdobeFlash = cfg.enableAdobeFlash or false;\n          enableGnash = cfg.enableGnash or false;\n          in import ../applications/networking/browsers/firefox/wrapper.nix {\n            inherit stdenv lib makeWrapper\n            makeDesktopItem browser\n            browserName desktopName\n            nameSuffix icon;\n            plugins = assert !(enableGnash && enableAdobeFlash); [\n            ] ++ lib.optional enableGnash gnash ++ lib.optional enableAdobeFlash flashplayer ++ lib.optional (cfg.enableDjvu or false) djview4 ++ lib.optional (cfg.enableMPlayer or false) (MPlayerPlugin browser) ++ lib.optional (cfg.enableGeckoMediaPlayer or false) gecko_mediaplayer ++ lib.optional (supportsJDK && (cfg.jre or false && jrePlugin ? mozillaPlugin)) jrePlugin ++ lib.optional (cfg.enableGoogleTalkPlugin or false) google_talk_plugin ++ lib.optional (cfg.enableFriBIDPlugin or false) fribid ++ lib.optional (cfg.enableGnomeExtensions or false) gnome3.gnome_shell;\n            libs = [\n              gstreamer\n              gst_plugins_base\n            ] ++ lib.optionals (cfg.enableQuakeLive or false) (with xlibs; [\n              stdenv.gcc\n              libX11\n              libXxf86dga\n              libXxf86vm\n              libXext\n              libXt\n              alsaLib\n              zlib\n            ]);\n            gtk_modules = [ libcanberra ];\n          };\n        x11vnc = callPackage ../tools/X11/x11vnc {\n        };\n        x2vnc = callPackage ../tools/X11/x2vnc {\n        };\n        xaos = builderDefsPackage (import ../applications/graphics/xaos) {\n          inherit (xlibs) libXt libX11\n          libXext xextproto xproto;\n          inherit gsl aalib zlib intltool\n          gettext perl;\n          libpng = libpng12;\n        };\n        xara = callPackage ../applications/graphics/xara {\n        };\n        xawtv = callPackage ../applications/video/xawtv {\n        };\n        xbindkeys = callPackage ../tools/X11/xbindkeys {\n        };\n        xbmc = callPackage ../applications/video/xbmc {\n          ffmpeg = ffmpeg_1;\n        };\n        xca = callPackage ../applications/misc/xca {\n        };\n        xcalib = callPackage ../tools/X11/xcalib {\n        };\n        xcape = callPackage ../tools/X11/xcape {\n        };\n        xchainkeys = callPackage ../tools/X11/xchainkeys {\n        };\n        xchat = callPackage ../applications/networking/irc/xchat {\n        };\n        xchm = callPackage ../applications/misc/xchm {\n        };\n        xcompmgr = callPackage ../applications/window-managers/xcompmgr {\n        };\n        compton = callPackage ../applications/window-managers/compton {\n        };\n        xdaliclock = callPackage ../tools/misc/xdaliclock {\n        };\n        xdg-user-dirs = callPackage ../tools/X11/xdg-user-dirs {\n        };\n        xdg_utils = callPackage ../tools/X11/xdg-utils {\n        };\n        xdotool = callPackage ../tools/X11/xdotool {\n        };\n        xen = callPackage ../applications/virtualization/xen {\n          stdenv = overrideGCC stdenv gcc45;\n        };\n        xfe = callPackage ../applications/misc/xfe {\n          fox = fox_1_6;\n        };\n        xfig = callPackage ../applications/graphics/xfig {\n        };\n        xineUI = callPackage ../applications/video/xine-ui {\n        };\n        xneur_0_13 = callPackage ../applications/misc/xneur {\n        };\n        xneur_0_8 = callPackage ../applications/misc/xneur/0.8.nix {\n        };\n        xneur = xneur_0_13;\n        gxneur = callPackage ../applications/misc/gxneur {\n          inherit (gnome) libglade GConf;\n        };\n        xournal = callPackage ../applications/graphics/xournal {\n          inherit (gnome) libgnomeprint\n          libgnomeprintui libgnomecanvas;\n        };\n        xpdf = callPackage ../applications/misc/xpdf {\n          motif = lesstif;\n          base14Fonts = \"${ghostscript}/share/ghostscript/fonts\";\n        };\n        xkb_switch = callPackage ../tools/X11/xkb-switch {\n        };\n        libxpdf = callPackage ../applications/misc/xpdf/libxpdf.nix {\n        };\n        xpra = callPackage ../tools/X11/xpra {\n        };\n        xrestop = callPackage ../tools/X11/xrestop {\n        };\n        xscreensaver = callPackage ../misc/screensavers/xscreensaver {\n          inherit (gnome) libglade;\n        };\n        xsynth_dssi = callPackage ../applications/audio/xsynth-dssi {\n        };\n        xterm = callPackage ../applications/misc/xterm {\n        };\n        finalterm = callPackage ../applications/misc/finalterm {\n        };\n        xtrace = callPackage ../tools/X11/xtrace {\n        };\n        xlaunch = callPackage ../tools/X11/xlaunch {\n        };\n        xmacro = callPackage ../tools/X11/xmacro {\n        };\n        xmove = callPackage ../applications/misc/xmove {\n        };\n        xmp = callPackage ../applications/audio/xmp {\n        };\n        xnee = callPackage ../tools/X11/xnee {\n          stdenv = overrideInStdenv stdenv [\n            gnumake381\n          ];\n        };\n        xvidcap = callPackage ../applications/video/xvidcap {\n          inherit (gnome) scrollkeeper\n          libglade;\n        };\n        yate = callPackage ../applications/misc/yate {\n        };\n        inherit (gnome3) yelp;\n        qgis = callPackage ../applications/misc/qgis {\n        };\n        qtbitcointrader = callPackage ../applications/misc/qtbitcointrader {\n        };\n        ykpers = callPackage ../applications/misc/ykpers {\n        };\n        yoshimi = callPackage ../applications/audio/yoshimi {\n          fltk = fltk13;\n        };\n        zathuraCollection = recurseIntoAttrs (let\n          callPackage = newScope pkgs.zathuraCollection;\n          in import ../applications/misc/zathura {\n            inherit callPackage pkgs\n            fetchurl;\n            useMupdf = config.zathura.useMupdf or false;\n          });\n        zathura = zathuraCollection.zathuraWrapper;\n        zed = callPackage ../applications/editors/zed {\n        };\n        zeroc_ice = callPackage ../development/libraries/zeroc-ice {\n        };\n        girara = callPackage ../applications/misc/girara {\n          gtk = gtk3;\n        };\n        zgrviewer = callPackage ../applications/graphics/zgrviewer {\n        };\n        zotero = callPackage ../applications/office/zotero {\n          xulrunner = xulrunner_30;\n        };\n        zynaddsubfx = callPackage ../applications/audio/zynaddsubfx {\n        };\n        alienarena = callPackage ../games/alienarena {\n        };\n        andyetitmoves = if stdenv.isLinux\n          then callPackage ../games/andyetitmoves {\n          }\n          else null;\n        anki = callPackage ../games/anki {\n        };\n        asc = callPackage ../games/asc {\n          lua = lua5;\n          libsigcxx = libsigcxx12;\n        };\n        astromenace = callPackage ../games/astromenace {\n        };\n        atanks = callPackage ../games/atanks {\n        };\n        ballAndPaddle = callPackage ../games/ball-and-paddle {\n          guile = guile_1_8;\n        };\n        bitsnbots = callPackage ../games/bitsnbots {\n          lua = lua5;\n        };\n        blackshades = callPackage ../games/blackshades {\n        };\n        blackshadeselite = callPackage ../games/blackshadeselite {\n        };\n        blobby = callPackage ../games/blobby {\n        };\n        bsdgames = callPackage ../games/bsdgames {\n        };\n        btanks = callPackage ../games/btanks {\n        };\n        bzflag = callPackage ../games/bzflag {\n        };\n        castle_combat = callPackage ../games/castle-combat {\n        };\n        chessdb = callPackage ../games/chessdb {\n        };\n        construoBase = lowPrio (callPackage ../games/construo {\n          mesa = null;\n          freeglut = null;\n        });\n        construo = construoBase.override {\n          inherit mesa freeglut;\n        };\n        crack_attack = callPackage ../games/crack-attack {\n        };\n        crafty = callPackage ../games/crafty {\n        };\n        craftyFull = appendToName \"full\" (crafty.override {\n          fullVariant = true;\n        });\n        crrcsim = callPackage ../games/crrcsim {\n        };\n        dhewm3 = callPackage ../games/dhewm3 {\n        };\n        drumkv1 = callPackage ../applications/audio/drumkv1 {\n        };\n        dwarf_fortress = callPackage_i686 ../games/dwarf-fortress {\n          SDL_image = pkgsi686Linux.SDL_image.override {\n            libpng = pkgsi686Linux.libpng12;\n          };\n        };\n        dwarf_fortress_2014 = callPackage_i686 ../games/dwarf-fortress/df2014.nix {\n          SDL_image = pkgsi686Linux.SDL_image.override {\n            libpng = pkgsi686Linux.libpng12;\n          };\n        };\n        dwarf_fortress_modable = appendToName \"moddable\" (dwarf_fortress.override {\n          copyDataDirectory = true;\n        });\n        dwarf_fortress_2014_modable = appendToName \"moddable\" (dwarf_fortress_2014.override {\n          copyDataDirectory = true;\n        });\n        dwarf-therapist = callPackage ../games/dwarf-therapist {\n        };\n        d1x_rebirth = callPackage ../games/d1x-rebirth {\n        };\n        d2x_rebirth = callPackage ../games/d2x-rebirth {\n        };\n        eboard = callPackage ../games/eboard {\n        };\n        eduke32 = callPackage ../games/eduke32 {\n        };\n        egoboo = callPackage ../games/egoboo {\n        };\n        exult = callPackage ../games/exult {\n        };\n        flightgear = callPackage ../games/flightgear {\n        };\n        freeciv = callPackage ../games/freeciv {\n        };\n        freeciv_gtk = callPackage ../games/freeciv {\n          gtkClient = true;\n          sdlClient = false;\n        };\n        freedink = callPackage ../games/freedink {\n        };\n        fsg = callPackage ../games/fsg {\n          wxGTK = wxGTK28.override {\n            unicode = false;\n          };\n        };\n        gemrb = callPackage ../games/gemrb {\n        };\n        gl117 = callPackage ../games/gl-117 {\n        };\n        glestae = callPackage ../games/glestae {\n        };\n        globulation2 = callPackage ../games/globulation {\n        };\n        gltron = callPackage ../games/gltron {\n        };\n        gnuchess = callPackage ../games/gnuchess {\n        };\n        gnugo = callPackage ../games/gnugo {\n        };\n        gparted = callPackage ../tools/misc/gparted {\n        };\n        gsmartcontrol = callPackage ../tools/misc/gsmartcontrol {\n          inherit (gnome) libglademm;\n        };\n        gtypist = callPackage ../games/gtypist {\n        };\n        hexen = callPackage ../games/hexen {\n        };\n        icbm3d = callPackage ../games/icbm3d {\n        };\n        ingen = callPackage ../applications/audio/ingen {\n        };\n        instead = callPackage ../games/instead {\n          lua = lua5;\n        };\n        kobodeluxe = callPackage ../games/kobodeluxe {\n        };\n        lincity = builderDefsPackage (import ../games/lincity) {\n          inherit (xlibs) libX11 libXext\n          xextproto libICE libSM xproto;\n          inherit libpng zlib;\n        };\n        lincity_ng = callPackage ../games/lincity/ng.nix {\n        };\n        mars = callPackage ../games/mars {\n        };\n        micropolis = callPackage ../games/micropolis {\n        };\n        mnemosyne = callPackage ../games/mnemosyne {\n          inherit (pythonPackages) matplotlib\n          cherrypy sqlite3;\n        };\n        naev = callPackage ../games/naev {\n        };\n        nexuiz = callPackage ../games/nexuiz {\n        };\n        njam = callPackage ../games/njam {\n        };\n        oilrush = callPackage ../games/oilrush {\n        };\n        openra = callPackage ../games/openra {\n        };\n        openttd = callPackage ../games/openttd {\n          zlib = zlibStatic;\n        };\n        opentyrian = callPackage ../games/opentyrian {\n        };\n        openxcom = callPackage ../games/openxcom {\n        };\n        pingus = callPackage ../games/pingus {\n        };\n        pioneers = callPackage ../games/pioneers {\n        };\n        pong3d = callPackage ../games/pong3d {\n        };\n        prboom = callPackage ../games/prboom {\n        };\n        quake3demo = callPackage ../games/quake3/wrapper {\n          name = \"quake3-demo-${quake3game.name}\";\n          description = \"Demo of Quake 3 Arena, a classic first-person shooter\";\n          game = quake3game;\n          paks = [ quake3demodata ];\n        };\n        quake3demodata = callPackage ../games/quake3/demo {\n        };\n        quake3game = callPackage ../games/quake3/game {\n        };\n        quantumminigolf = callPackage ../games/quantumminigolf {\n        };\n        racer = callPackage ../games/racer {\n        };\n        residualvm = callPackage ../games/residualvm {\n          openglSupport = mesaSupported;\n        };\n        rigsofrods = callPackage ../games/rigsofrods {\n          mygui = myguiSvn;\n        };\n        rili = callPackage ../games/rili {\n        };\n        rogue = callPackage ../games/rogue {\n        };\n        samplv1 = callPackage ../applications/audio/samplv1 {\n        };\n        sauerbraten = callPackage ../games/sauerbraten {\n        };\n        scid = callPackage ../games/scid {\n        };\n        scummvm = callPackage ../games/scummvm {\n        };\n        scorched3d = callPackage ../games/scorched3d {\n        };\n        sdlmame = callPackage ../games/sdlmame {\n        };\n        sgtpuzzles = builderDefsPackage (import ../games/sgt-puzzles) {\n          inherit pkgconfig fetchsvn perl\n          gtk;\n          inherit (xlibs) libX11;\n        };\n        simutrans = callPackage ../games/simutrans {\n        };\n        soi = callPackage ../games/soi {\n        };\n        spaceOrbit = callPackage ../games/orbit {\n        };\n        spring = callPackage ../games/spring {\n        };\n        springLobby = callPackage ../games/spring/springlobby.nix {\n        };\n        stardust = callPackage ../games/stardust {\n        };\n        steam = callPackage_i686 ../games/steam {\n        };\n        steamChrootEnv = callPackage_i686 ../games/steam/chrootenv.nix {\n          zenity = gnome2.zenity;\n        };\n        stuntrally = callPackage ../games/stuntrally {\n        };\n        superTux = callPackage ../games/super-tux {\n        };\n        superTuxKart = callPackage ../games/super-tux-kart {\n        };\n        synthv1 = callPackage ../applications/audio/synthv1 {\n        };\n        tbe = callPackage ../games/the-butterfly-effect {\n        };\n        teetertorture = callPackage ../games/teetertorture {\n        };\n        teeworlds = callPackage ../games/teeworlds {\n        };\n        tennix = callPackage ../games/tennix {\n        };\n        tibia = callPackage ../games/tibia {\n        };\n        tintin = callPackage ../games/tintin {\n        };\n        tpm = callPackage ../games/thePenguinMachine {\n        };\n        tremulous = callPackage ../games/tremulous {\n        };\n        speed_dreams = callPackage ../games/speed-dreams {\n          plib = plib.override {\n            enablePIC = !stdenv.isi686;\n          };\n          libpng = libpng12;\n        };\n        torcs = callPackage ../games/torcs {\n          plib = plib.override {\n            enablePIC = !stdenv.isi686;\n          };\n        };\n        trigger = callPackage ../games/trigger {\n        };\n        typespeed = callPackage ../games/typespeed {\n        };\n        ufoai = callPackage ../games/ufoai {\n        };\n        ultimatestunts = callPackage ../games/ultimatestunts {\n        };\n        ultrastardx = callPackage ../games/ultrastardx {\n          ffmpeg = ffmpeg_0_6;\n          lua = lua5;\n        };\n        unvanquished = callPackage ../games/unvanquished {\n        };\n        uqm = callPackage ../games/uqm {\n        };\n        urbanterror = callPackage ../games/urbanterror {\n        };\n        ut2004demo = callPackage ../games/ut2004demo {\n        };\n        vdrift = callPackage ../games/vdrift {\n        };\n        vectoroids = callPackage ../games/vectoroids {\n        };\n        vessel = callPackage_i686 ../games/vessel {\n        };\n        warmux = callPackage ../games/warmux {\n        };\n        warsow = callPackage ../games/warsow {\n          libjpeg = libjpeg62;\n        };\n        warzone2100 = callPackage ../games/warzone2100 {\n        };\n        widelands = callPackage ../games/widelands {\n          lua = lua5_1;\n        };\n        worldofgoo_demo = callPackage ../games/worldofgoo {\n          demo = true;\n        };\n        worldofgoo = callPackage ../games/worldofgoo {\n        };\n        xboard = callPackage ../games/xboard {\n        };\n        xconq = callPackage ../games/xconq {\n        };\n        xonotic = callPackage ../games/xonotic {\n        };\n        xskat = callPackage ../games/xskat {\n        };\n        xsokoban = builderDefsPackage (import ../games/xsokoban) {\n          inherit (xlibs) libX11 xproto\n          libXpm libXt;\n        };\n        zdoom = callPackage ../games/zdoom {\n        };\n        zod = callPackage ../games/zod {\n        };\n        zoom = callPackage ../games/zoom {\n        };\n        keen4 = callPackage ../games/keen4 {\n        };\n        zeroad = callPackage ../games/0ad {\n        };\n        cinnamon = recurseIntoAttrs rec {\n          callPackage = newScope pkgs.cinnamon;\n          inherit (gnome3) gnome_common\n          libgnomekbd gnome-menus zenity;\n          muffin = callPackage ../desktops/cinnamon/muffin.nix {\n          };\n          cinnamon-control-center = callPackage ../desktops/cinnamon/cinnamon-control-center.nix {\n          };\n          cinnamon-settings-daemon = callPackage ../desktops/cinnamon/cinnamon-settings-daemon.nix {\n          };\n          cinnamon-session = callPackage ../desktops/cinnamon/cinnamon-session.nix {\n          };\n          cinnamon-desktop = callPackage ../desktops/cinnamon/cinnamon-desktop.nix {\n          };\n          cinnamon-translations = callPackage ../desktops/cinnamon/cinnamon-translations.nix {\n          };\n          cjs = callPackage ../desktops/cinnamon/cjs.nix {\n          };\n        };\n        enlightenment = callPackage ../desktops/enlightenment {\n        };\n        e17 = recurseIntoAttrs (let\n          callPackage = newScope pkgs.e17;\n          in import ../desktops/e17 {\n            inherit callPackage pkgs;\n          });\n        e18 = recurseIntoAttrs (let\n          callPackage = newScope pkgs.e18;\n          in import ../desktops/e18 {\n            inherit callPackage pkgs;\n          });\n        gnome2 = callPackage ../desktops/gnome-2 {\n          callPackage = pkgs.newScope pkgs.gnome2;\n          self = pkgs.gnome2;\n        } // pkgs.gtkLibs // {\n          inherit (pkgs) libsoup libwnck\n          gtk_doc gnome_doc_utils;\n        };\n        gnome3 = recurseIntoAttrs (callPackage ../desktops/gnome-3/3.10 {\n          callPackage = pkgs.newScope pkgs.gnome3;\n          self = pkgs.gnome3;\n        });\n        gnome3_12 = recurseIntoAttrs (callPackage ../desktops/gnome-3/3.12 {\n          callPackage = pkgs.newScope pkgs.gnome3_12;\n        });\n        gnome = recurseIntoAttrs gnome2;\n        hsetroot = callPackage ../tools/X11/hsetroot {\n        };\n        kakasi = callPackage ../tools/text/kakasi {\n        };\n        kde4 = recurseIntoAttrs pkgs.kde412;\n        kde4_next = recurseIntoAttrs (lib.lowPrioSet pkgs.kde412);\n        kde412 = kdePackagesFor (pkgs.kde412 // {\n          eigen = eigen2;\n          libusb = libusb1;\n          libcanberra = libcanberra_kde;\n        }) ../desktops/kde-4.12;\n        kdePackagesFor = self: dir: let\n          callPackageOrig = callPackage;\n          in let\n            callPackage = newScope self;\n            kde4 = callPackageOrig dir {\n              inherit callPackage\n              callPackageOrig;\n            };\n            in kde4 // {\n              inherit kde4;\n              wrapper = callPackage ../build-support/kdewrapper {\n              };\n              recurseForRelease = true;\n              akunambol = callPackage ../applications/networking/sync/akunambol {\n              };\n              amarok = callPackage ../applications/audio/amarok {\n              };\n              bangarang = callPackage ../applications/video/bangarang {\n              };\n              basket = callPackage ../applications/office/basket {\n              };\n              bluedevil = callPackage ../tools/bluetooth/bluedevil {\n              };\n              calligra = callPackage ../applications/office/calligra {\n              };\n              colord-kde = callPackage ../tools/misc/colord-kde {\n              };\n              digikam = if builtins.compareVersions \"4.9\" kde4.release == 1\n                then callPackage ../applications/graphics/digikam/2.nix {\n                }\n                else callPackage ../applications/graphics/digikam {\n                };\n              eventlist = callPackage ../applications/office/eventlist {\n              };\n              k3b = callPackage ../applications/misc/k3b {\n              };\n              kadu = callPackage ../applications/networking/instant-messengers/kadu {\n              };\n              kbibtex = callPackage ../applications/office/kbibtex {\n              };\n              kde_gtk_config = callPackage ../tools/misc/kde-gtk-config {\n              };\n              kde_wacomtablet = callPackage ../applications/misc/kde-wacomtablet {\n              };\n              kdeconnect = callPackage ../applications/misc/kdeconnect {\n              };\n              kdenlive = callPackage ../applications/video/kdenlive {\n                mlt = mlt-qt4;\n              };\n              kdesvn = callPackage ../applications/version-management/kdesvn {\n              };\n              kdevelop = callPackage ../applications/editors/kdevelop {\n              };\n              kdevplatform = callPackage ../development/libraries/kdevplatform {\n              };\n              kdiff3 = callPackage ../tools/text/kdiff3 {\n              };\n              kile = callPackage ../applications/editors/kile {\n              };\n              kmplayer = callPackage ../applications/video/kmplayer {\n              };\n              kmymoney = callPackage ../applications/office/kmymoney {\n              };\n              kipi_plugins = callPackage ../applications/graphics/kipi-plugins {\n              };\n              konversation = callPackage ../applications/networking/irc/konversation {\n              };\n              kvirc = callPackage ../applications/networking/irc/kvirc {\n              };\n              krename = callPackage ../applications/misc/krename {\n              };\n              krusader = callPackage ../applications/misc/krusader {\n              };\n              ksshaskpass = callPackage ../tools/security/ksshaskpass {\n              };\n              ktorrent = callPackage ../applications/networking/p2p/ktorrent {\n              };\n              kuickshow = callPackage ../applications/graphics/kuickshow {\n              };\n              libalkimia = callPackage ../development/libraries/libalkimia {\n              };\n              libktorrent = callPackage ../development/libraries/libktorrent {\n              };\n              libkvkontakte = callPackage ../development/libraries/libkvkontakte {\n              };\n              liblikeback = callPackage ../development/libraries/liblikeback {\n              };\n              libmm-qt = callPackage ../development/libraries/libmm-qt {\n              };\n              libnm-qt = callPackage ../development/libraries/libnm-qt {\n              };\n              networkmanagement = callPackage ../tools/networking/networkmanagement {\n              };\n              partitionManager = callPackage ../tools/misc/partition-manager {\n              };\n              plasma-nm = callPackage ../tools/networking/plasma-nm {\n              };\n              polkit_kde_agent = callPackage ../tools/security/polkit-kde-agent {\n              };\n              psi = callPackage ../applications/networking/instant-messengers/psi {\n              };\n              qtcurve = callPackage ../misc/themes/qtcurve {\n              };\n              quassel = callPackage ../applications/networking/irc/quassel {\n                dconf = gnome3.dconf;\n              };\n              quasselWithoutKDE = self.quassel.override {\n                withKDE = false;\n                tag = \"-without-kde\";\n              };\n              quasselDaemon = self.quassel.override {\n                monolithic = false;\n                daemon = true;\n                tag = \"-daemon\";\n              };\n              quasselClient = self.quassel.override {\n                monolithic = false;\n                client = true;\n                tag = \"-client\";\n              };\n              quasselClientWithoutKDE = self.quasselClient.override {\n                withKDE = false;\n                tag = \"-client-without-kde\";\n              };\n              rekonq = callPackage ../applications/networking/browsers/rekonq {\n              };\n              kwebkitpart = callPackage ../applications/networking/browsers/kwebkitpart {\n              };\n              rsibreak = callPackage ../applications/misc/rsibreak {\n              };\n              semnotes = callPackage ../applications/misc/semnotes {\n              };\n              skrooge = callPackage ../applications/office/skrooge {\n              };\n              telepathy = callPackage ../applications/networking/instant-messengers/telepathy/kde {\n              };\n              yakuake = callPackage ../applications/misc/yakuake {\n              };\n              zanshin = callPackage ../applications/office/zanshin {\n              };\n              kwooty = callPackage ../applications/networking/newsreaders/kwooty {\n              };\n            };\n        redshift = callPackage ../applications/misc/redshift {\n          inherit (xorg) libX11 libXrandr\n          libxcb randrproto libXxf86vm\n          xf86vidmodeproto;\n          inherit (gnome) GConf;\n          inherit (pythonPackages) pyxdg;\n          geoclue = geoclue2;\n        };\n        oxygen_gtk = callPackage ../misc/themes/gtk2/oxygen-gtk {\n        };\n        gtk_engines = callPackage ../misc/themes/gtk2/gtk-engines {\n        };\n        gtk-engine-murrine = callPackage ../misc/themes/gtk2/gtk-engine-murrine {\n        };\n        gnome_themes_standard = gnome3.gnome_themes_standard;\n        mate-icon-theme = callPackage ../misc/themes/mate-icon-theme {\n        };\n        mate-themes = callPackage ../misc/themes/mate-themes {\n        };\n        xfce = xfce4_10;\n        xfce4_10 = recurseIntoAttrs (import ../desktops/xfce {\n          inherit pkgs newScope;\n        });\n        drgeo = builderDefsPackage (import ../applications/science/geometry/drgeo) {\n          inherit (gnome) libglade;\n          inherit libxml2 perl intltool\n          libtool pkgconfig gtk;\n          guile = guile_1_8;\n        };\n        tetgen = callPackage ../applications/science/geometry/tetgen {\n        };\n        alliance = callPackage ../applications/science/electronics/alliance {\n          motif = lesstif;\n        };\n        arb = callPackage ../applications/science/biology/arb {\n          lesstif = lesstif93;\n        };\n        archimedes = callPackage ../applications/science/electronics/archimedes {\n        };\n        biolib = callPackage ../development/libraries/science/biology/biolib {\n        };\n        emboss = callPackage ../applications/science/biology/emboss {\n        };\n        mrbayes = callPackage ../applications/science/biology/mrbayes {\n        };\n        ncbiCTools = builderDefsPackage ../development/libraries/ncbi {\n          inherit tcsh mesa lesstif;\n          inherit (xlibs) libX11 libXaw\n          xproto libXt libSM libICE libXmu\n          libXext;\n        };\n        ncbi_tools = callPackage ../applications/science/biology/ncbi-tools {\n        };\n        paml = callPackage ../applications/science/biology/paml {\n        };\n        pal2nal = callPackage ../applications/science/biology/pal2nal {\n        };\n        plink = callPackage ../applications/science/biology/plink/default.nix {\n        };\n        arpack = callPackage ../development/libraries/science/math/arpack {\n        };\n        atlas = callPackage ../development/libraries/science/math/atlas {\n          tolerateCpuTimingInaccuracy = true;\n        };\n        blas = callPackage ../development/libraries/science/math/blas {\n        };\n        content = builderDefsPackage ../applications/science/math/content {\n          inherit mesa lesstif;\n          inherit (xlibs) libX11 libXaw\n          xproto libXt libSM libICE libXmu\n          libXext libXcursor;\n        };\n        jags = callPackage ../applications/science/math/jags {\n        };\n        liblapack = callPackage ../development/libraries/science/math/liblapack {\n        };\n        liblapack_3_5_0 = callPackage ../development/libraries/science/math/liblapack/3.5.0.nix {\n        };\n        liblbfgs = callPackage ../development/libraries/science/math/liblbfgs {\n        };\n        openblas = callPackage ../development/libraries/science/math/openblas {\n        };\n        openblas_0_2_10 = callPackage ../development/libraries/science/math/openblas/0.2.10.nix {\n          liblapack = liblapack_3_5_0;\n        };\n        mathematica = callPackage ../applications/science/math/mathematica {\n        };\n        sage = callPackage ../applications/science/math/sage {\n        };\n        gromacs = callPackage ../applications/science/molecular-dynamics/gromacs {\n          singlePrec = true;\n          fftw = fftwSinglePrec;\n          cmake = cmakeCurses;\n        };\n        gromacsDouble = lowPrio (callPackage ../applications/science/molecular-dynamics/gromacs {\n          singlePrec = false;\n          fftw = fftw;\n          cmake = cmakeCurses;\n        });\n        abc-verifier = callPackage ../applications/science/logic/abc {\n        };\n        alt-ergo = callPackage ../applications/science/logic/alt-ergo {\n        };\n        coq = callPackage ../applications/science/logic/coq {\n          inherit (ocamlPackages) findlib\n          lablgtk;\n          camlp5 = ocamlPackages.camlp5_transitional;\n        };\n        coq_HEAD = callPackage ../applications/science/logic/coq/HEAD.nix {\n          inherit (ocamlPackages) findlib\n          lablgtk;\n          camlp5 = ocamlPackages.camlp5_transitional;\n        };\n        coq_8_3 = callPackage ../applications/science/logic/coq/8.3.nix {\n          inherit (ocamlPackages) findlib\n          lablgtk;\n          camlp5 = ocamlPackages.camlp5_transitional;\n        };\n        cvc3 = callPackage ../applications/science/logic/cvc3 {\n        };\n        ekrhyper = callPackage ../applications/science/logic/ekrhyper {\n        };\n        eprover = callPackage ../applications/science/logic/eprover {\n          texLive = texLiveAggregationFun {\n            paths = [\n              texLive\n              texLiveExtra\n            ];\n          };\n        };\n        ginac = callPackage ../applications/science/math/ginac {\n        };\n        hol = callPackage ../applications/science/logic/hol {\n        };\n        hol_light = callPackage ../applications/science/logic/hol_light {\n          inherit (ocamlPackages) findlib;\n          camlp5 = ocamlPackages.camlp5_strict;\n        };\n        isabelle = import ../applications/science/logic/isabelle {\n          inherit (pkgs) stdenv fetchurl\n          nettools perl polyml;\n          inherit (pkgs.emacs24Packages) proofgeneral;\n        };\n        iprover = callPackage ../applications/science/logic/iprover {\n        };\n        leo2 = callPackage ../applications/science/logic/leo2 {\n        };\n        logisim = callPackage ../applications/science/logic/logisim {\n        };\n        ltl2ba = callPackage ../applications/science/logic/ltl2ba {\n        };\n        matita = callPackage ../applications/science/logic/matita {\n          ocaml = ocaml_3_11_2;\n          inherit (ocamlPackages_3_11_2) findlib\n          lablgtk ocaml_expat gmetadom\n          ocaml_http lablgtkmathview\n          ocaml_mysql ocaml_sqlite3\n          ocamlnet camlzip ocaml_pcre;\n          ulex08 = ocamlPackages_3_11_2.ulex08.override {\n            camlp5 = ocamlPackages_3_11_2.camlp5_5_transitional;\n          };\n        };\n        matita_130312 = lowPrio (callPackage ../applications/science/logic/matita/130312.nix {\n          inherit (ocamlPackages) findlib\n          lablgtk ocaml_expat gmetadom\n          ocaml_http ocaml_mysql ocamlnet\n          ulex08 camlzip ocaml_pcre;\n        });\n        minisat = callPackage ../applications/science/logic/minisat {\n        };\n        opensmt = callPackage ../applications/science/logic/opensmt {\n        };\n        otter = callPackage ../applications/science/logic/otter {\n        };\n        picosat = callPackage ../applications/science/logic/picosat {\n        };\n        prooftree = callPackage ../applications/science/logic/prooftree {\n          inherit (ocamlPackages) findlib\n          lablgtk;\n          camlp5 = ocamlPackages.camlp5_transitional;\n        };\n        prover9 = callPackage ../applications/science/logic/prover9 {\n        };\n        satallax = callPackage ../applications/science/logic/satallax {\n        };\n        spass = callPackage ../applications/science/logic/spass {\n        };\n        ssreflect = callPackage ../applications/science/logic/ssreflect {\n          camlp5 = ocamlPackages.camlp5_transitional;\n        };\n        tptp = callPackage ../applications/science/logic/tptp {\n        };\n        twelf = callPackage ../applications/science/logic/twelf {\n          smlnj = if stdenv.isDarwin\n            then smlnjBootstrap\n            else smlnj;\n        };\n        verifast = callPackage ../applications/science/logic/verifast {\n        };\n        why3 = callPackage ../applications/science/logic/why3 {\n        };\n        yices = callPackage ../applications/science/logic/yices {\n        };\n        z3 = callPackage ../applications/science/logic/z3 {\n        };\n        boolector = boolector15;\n        boolector15 = callPackage ../applications/science/logic/boolector {\n        };\n        boolector16 = lowPrio (callPackage ../applications/science/logic/boolector {\n          useV16 = true;\n        });\n        eagle = callPackage_i686 ../applications/science/electronics/eagle {\n        };\n        caneda = callPackage ../applications/science/electronics/caneda {\n        };\n        gtkwave = callPackage ../applications/science/electronics/gtkwave {\n        };\n        kicad = callPackage ../applications/science/electronics/kicad {\n          wxGTK = wxGTK29;\n        };\n        ngspice = callPackage ../applications/science/electronics/ngspice {\n        };\n        qucs = callPackage ../applications/science/electronics/qucs {\n        };\n        xoscope = callPackage ../applications/science/electronics/xoscope {\n        };\n        ecm = callPackage ../applications/science/math/ecm {\n        };\n        eukleides = callPackage ../applications/science/math/eukleides {\n          texinfo = texinfo4;\n        };\n        fricas = callPackage ../applications/science/math/fricas {\n        };\n        gap = callPackage ../applications/science/math/gap {\n        };\n        maxima = callPackage ../applications/science/math/maxima {\n        };\n        wxmaxima = callPackage ../applications/science/math/wxmaxima {\n        };\n        pari = callPackage ../applications/science/math/pari {\n        };\n        pspp = callPackage ../applications/science/math/pssp {\n          inherit (gnome) libglade\n          gtksourceview;\n        };\n        singular = callPackage ../applications/science/math/singular {\n        };\n        scilab = callPackage ../applications/science/math/scilab {\n          withXaw3d = false;\n          withTk = true;\n          withGtk = false;\n          withOCaml = true;\n          withX = true;\n        };\n        msieve = callPackage ../applications/science/math/msieve {\n        };\n        weka = callPackage ../applications/science/math/weka {\n        };\n        yad = callPackage ../tools/misc/yad {\n        };\n        yacas = callPackage ../applications/science/math/yacas {\n        };\n        speedcrunch = callPackage ../applications/science/math/speedcrunch {\n          qt = qt4;\n          cmake = cmakeCurses;\n        };\n        boinc = callPackage ../applications/science/misc/boinc {\n        };\n        celestia = callPackage ../applications/science/astronomy/celestia {\n          lua = lua5_1;\n          inherit (xlibs) libXmu;\n          inherit (pkgs.gnome) gtkglext;\n        };\n        fityk = callPackage ../applications/science/misc/fityk {\n        };\n        gravit = callPackage ../applications/science/astronomy/gravit {\n        };\n        golly = callPackage ../applications/science/misc/golly {\n        };\n        megam = callPackage ../applications/science/misc/megam {\n        };\n        root = callPackage ../applications/science/misc/root {\n        };\n        simgrid = callPackage ../applications/science/misc/simgrid {\n        };\n        spyder = callPackage ../applications/science/spyder {\n          inherit (pythonPackages) pyflakes\n          rope sphinx numpy scipy\n          matplotlib;\n          inherit (pythonPackages) ipython\n          pep8;\n          inherit pylint;\n        };\n        stellarium = callPackage ../applications/science/astronomy/stellarium {\n        };\n        tulip = callPackage ../applications/science/misc/tulip {\n        };\n        vite = callPackage ../applications/science/misc/vite {\n        };\n        xplanet = callPackage ../applications/science/astronomy/xplanet {\n        };\n        atari800 = callPackage ../misc/emulators/atari800 {\n        };\n        ataripp = callPackage ../misc/emulators/atari++ {\n        };\n        auctex = callPackage ../tools/typesetting/tex/auctex {\n        };\n        beep = callPackage ../misc/beep {\n        };\n        cups = callPackage ../misc/cups {\n          libusb = libusb1;\n        };\n        cups_pdf_filter = callPackage ../misc/cups/pdf-filter.nix {\n        };\n        gutenprint = callPackage ../misc/drivers/gutenprint {\n        };\n        gutenprintBin = callPackage ../misc/drivers/gutenprint/bin.nix {\n        };\n        cupsBjnp = callPackage ../misc/cups/drivers/cups-bjnp {\n        };\n        darcnes = callPackage ../misc/emulators/darcnes {\n        };\n        dbacl = callPackage ../tools/misc/dbacl {\n        };\n        dblatex = callPackage ../tools/typesetting/tex/dblatex {\n          enableAllFeatures = false;\n        };\n        dblatexFull = appendToName \"full\" (dblatex.override {\n          enableAllFeatures = true;\n        });\n        dosbox = callPackage ../misc/emulators/dosbox {\n        };\n        dpkg = callPackage ../tools/package-management/dpkg {\n        };\n        ekiga = newScope pkgs.gnome ../applications/networking/instant-messengers/ekiga {\n        };\n        emulationstation = callPackage ../misc/emulators/emulationstation {\n        };\n        electricsheep = callPackage ../misc/screensavers/electricsheep {\n        };\n        fakenes = callPackage ../misc/emulators/fakenes {\n        };\n        fceux = callPackage ../misc/emulators/fceux {\n        };\n        foldingathome = callPackage ../misc/foldingathome {\n        };\n        foo2zjs = callPackage ../misc/drivers/foo2zjs {\n        };\n        foomatic_filters = callPackage ../misc/drivers/foomatic-filters {\n        };\n        freestyle = callPackage ../misc/freestyle {\n        };\n        gajim = callPackage ../applications/networking/instant-messengers/gajim {\n        };\n        gammu = callPackage ../applications/misc/gammu {\n        };\n        gensgs = callPackage_i686 ../misc/emulators/gens-gs {\n        };\n        ghostscript = callPackage ../misc/ghostscript {\n          x11Support = false;\n          cupsSupport = config.ghostscript.cups or !stdenv.isDarwin;\n          gnuFork = config.ghostscript.gnu or false;\n        };\n        ghostscriptX = appendToName \"with-X\" (ghostscript.override {\n          x11Support = true;\n        });\n        guix = callPackage ../tools/package-management/guix {\n        };\n        gxemul = callPackage ../misc/gxemul {\n        };\n        hatari = callPackage ../misc/emulators/hatari {\n        };\n        hplip = callPackage ../misc/drivers/hplip {\n        };\n        hplipWithPlugin = hplip.override {\n          withPlugin = true;\n        };\n        jack1 = callPackage ../misc/jackaudio/jack1.nix {\n        };\n        jack2 = callPackage ../misc/jackaudio {\n        };\n        keynav = callPackage ../tools/X11/keynav {\n        };\n        lazylist = callPackage ../tools/typesetting/tex/lazylist {\n        };\n        lilypond = callPackage ../misc/lilypond {\n          guile = guile_1_8;\n        };\n        martyr = callPackage ../development/libraries/martyr {\n        };\n        maven = maven3;\n        maven3 = callPackage ../misc/maven {\n          jdk = openjdk;\n        };\n        mess = callPackage ../misc/emulators/mess {\n          inherit (pkgs.gnome) GConf;\n        };\n        mupen64plus = callPackage ../misc/emulators/mupen64plus {\n        };\n        mupen64plus1_5 = callPackage ../misc/emulators/mupen64plus/1.5.nix {\n        };\n        nix = nixStable;\n        nixStable = callPackage ../tools/package-management/nix {\n          storeDir = config.nix.storeDir or \"/nix/store\";\n          stateDir = config.nix.stateDir or \"/nix/var\";\n        };\n        nixUnstable = callPackage ../tools/package-management/nix/unstable.nix {\n          storeDir = config.nix.storeDir or \"/nix/store\";\n          stateDir = config.nix.stateDir or \"/nix/var\";\n        };\n        nixops = callPackage ../tools/package-management/nixops {\n        };\n        nix-prefetch-scripts = callPackage ../tools/package-management/nix-prefetch-scripts {\n        };\n        nix-repl = callPackage ../tools/package-management/nix-repl {\n        };\n        nut = callPackage ../applications/misc/nut {\n        };\n        solfege = callPackage ../misc/solfege {\n          pysqlite = pkgs.pythonPackages.sqlite3;\n        };\n        disnix = callPackage ../tools/package-management/disnix {\n        };\n        dysnomia = callPackage ../tools/package-management/disnix/dysnomia {\n          enableApacheWebApplication = config.disnix.enableApacheWebApplication or false;\n          enableAxis2WebService = config.disnix.enableAxis2WebService or false;\n          enableEjabberdDump = config.disnix.enableEjabberdDump or false;\n          enableMySQLDatabase = config.disnix.enableMySQLDatabase or false;\n          enablePostgreSQLDatabase = config.disnix.enablePostgreSQLDatabase or false;\n          enableSubversionRepository = config.disnix.enableSubversionRepository or false;\n          enableTomcatWebApplication = config.disnix.enableTomcatWebApplication or false;\n        };\n        disnixos = callPackage ../tools/package-management/disnix/disnixos {\n        };\n        DisnixWebService = callPackage ../tools/package-management/disnix/DisnixWebService {\n        };\n        latex2html = callPackage ../tools/typesetting/tex/latex2html/default.nix {\n          tex = tetex;\n        };\n        lkproof = callPackage ../tools/typesetting/tex/lkproof {\n        };\n        mysqlWorkbench = newScope gnome ../applications/misc/mysql-workbench {\n          lua = lua5;\n          inherit (pythonPackages) pexpect\n          paramiko;\n        };\n        robomongo = callPackage ../applications/misc/robomongo {\n        };\n        opkg = callPackage ../tools/package-management/opkg {\n        };\n        pgadmin = callPackage ../applications/misc/pgadmin {\n        };\n        pgf = pgf2;\n        pgf1 = callPackage ../tools/typesetting/tex/pgf/1.x.nix {\n        };\n        pgf2 = callPackage ../tools/typesetting/tex/pgf/2.x.nix {\n        };\n        pgfplots = callPackage ../tools/typesetting/tex/pgfplots {\n        };\n        pjsip = callPackage ../applications/networking/pjsip {\n        };\n        polytable = callPackage ../tools/typesetting/tex/polytable {\n        };\n        PPSSPP = callPackage ../misc/emulators/ppsspp {\n        };\n        uae = callPackage ../misc/emulators/uae {\n        };\n        putty = callPackage ../applications/networking/remote/putty {\n        };\n        retroarch = callPackage ../misc/emulators/retroarch {\n        };\n        rssglx = callPackage ../misc/screensavers/rss-glx {\n        };\n        xlockmore = callPackage ../misc/screensavers/xlockmore {\n        };\n        samsungUnifiedLinuxDriver = import ../misc/cups/drivers/samsung {\n          inherit fetchurl stdenv;\n          inherit cups ghostscript glibc\n          patchelf;\n          gcc = import ../development/compilers/gcc/4.4 {\n            inherit stdenv fetchurl gmp mpfr\n            noSysDirs gettext which;\n            texinfo = texinfo4;\n            profiledCompiler = true;\n          };\n        };\n        saneBackends = callPackage ../applications/graphics/sane/backends.nix {\n          gt68xxFirmware = config.sane.gt68xxFirmware or null;\n          snapscanFirmware = config.sane.snapscanFirmware or null;\n          hotplugSupport = config.sane.hotplugSupport or true;\n          libusb = libusb1;\n        };\n        saneBackendsGit = callPackage ../applications/graphics/sane/backends-git.nix {\n          gt68xxFirmware = config.sane.gt68xxFirmware or null;\n          snapscanFirmware = config.sane.snapscanFirmware or null;\n          hotplugSupport = config.sane.hotplugSupport or true;\n        };\n        mkSaneConfig = callPackage ../applications/graphics/sane/config.nix {\n        };\n        saneFrontends = callPackage ../applications/graphics/sane/frontends.nix {\n        };\n        seafile-shared = callPackage ../misc/seafile-shared {\n        };\n        slock = callPackage ../misc/screensavers/slock {\n        };\n        sourceAndTags = import ../misc/source-and-tags {\n          inherit pkgs stdenv unzip lib\n          ctags;\n          hasktags = haskellPackages.hasktags;\n        };\n        splix = callPackage ../misc/cups/drivers/splix {\n        };\n        streamripper = callPackage ../applications/audio/streamripper {\n        };\n        sqsh = callPackage ../development/tools/sqsh {\n        };\n        tetex = callPackage ../tools/typesetting/tex/tetex {\n          libpng = libpng12;\n        };\n        tex4ht = callPackage ../tools/typesetting/tex/tex4ht {\n        };\n        texFunctions = import ../tools/typesetting/tex/nix pkgs;\n        texLive = builderDefsPackage (import ../tools/typesetting/tex/texlive) {\n          inherit builderDefs zlib bzip2\n          ncurses libpng ed lesstif ruby\n          potrace gd t1lib freetype icu\n          perl expat curl xz pkgconfig\n          zziplib texinfo libjpeg bison\n          python fontconfig flex poppler\n          libpaper graphite2 makeWrapper;\n          inherit (xlibs) libXaw libX11\n          xproto libXt libXpm libXmu\n          libXext xextproto libSM libICE;\n          ghostscript = ghostscriptX;\n          harfbuzz = harfbuzz.override {\n            withIcu = true;\n            withGraphite2 = true;\n          };\n        };\n        texLiveFull = lib.setName \"texlive-full\" (texLiveAggregationFun {\n          paths = [\n            texLive\n            texLiveExtra\n            lmodern\n            texLiveCMSuper\n            texLiveLatexXColor\n            texLivePGF\n            texLiveBeamer\n            texLiveModerncv\n            tipa\n            tex4ht\n            texinfo\n            texLiveModerntimeline\n          ];\n        });\n        texLiveAggregationFun = params:\n        builderDefsPackage (import ../tools/typesetting/tex/texlive/aggregate.nix) ({\n          inherit poppler perl\n          makeWrapper;\n        } // params);\n        texDisser = callPackage ../tools/typesetting/tex/disser {\n        };\n        texLiveContext = builderDefsPackage (import ../tools/typesetting/tex/texlive/context.nix) {\n          inherit texLive;\n        };\n        texLiveExtra = builderDefsPackage (import ../tools/typesetting/tex/texlive/extra.nix) {\n          inherit texLive xz;\n        };\n        texLiveCMSuper = builderDefsPackage (import ../tools/typesetting/tex/texlive/cm-super.nix) {\n          inherit texLive;\n        };\n        texLiveLatexXColor = builderDefsPackage (import ../tools/typesetting/tex/texlive/xcolor.nix) {\n          inherit texLive;\n        };\n        texLivePGF = builderDefsPackage (import ../tools/typesetting/tex/texlive/pgf.nix) {\n          inherit texLiveLatexXColor\n          texLive;\n        };\n        texLiveBeamer = builderDefsPackage (import ../tools/typesetting/tex/texlive/beamer.nix) {\n          inherit texLiveLatexXColor\n          texLivePGF texLive;\n        };\n        texLiveModerncv = builderDefsPackage (import ../tools/typesetting/tex/texlive/moderncv.nix) {\n          inherit texLive unzip;\n        };\n        texLiveModerntimeline = builderDefsPackage (import ../tools/typesetting/tex/texlive/moderntimeline.nix) {\n          inherit texLive unzip;\n        };\n        thermald = callPackage ../tools/system/thermald {\n        };\n        thinkfan = callPackage ../tools/system/thinkfan {\n        };\n        vice = callPackage ../misc/emulators/vice {\n          libX11 = xlibs.libX11;\n          giflib = giflib_4_1;\n        };\n        viewnior = callPackage ../applications/graphics/viewnior {\n        };\n        vimPlugins = recurseIntoAttrs (callPackage ../misc/vim-plugins {\n        });\n        vimprobable2 = callPackage ../applications/networking/browsers/vimprobable2 {\n          webkit = webkitgtk2;\n        };\n        vimprobable2Wrapper = wrapFirefox {\n          browser = vimprobable2;\n          browserName = \"vimprobable2\";\n          desktopName = \"Vimprobable2\";\n        };\n        vimb = callPackage ../applications/networking/browsers/vimb {\n          webkit = webkitgtk2;\n        };\n        vimbWrapper = wrapFirefox {\n          browser = vimb;\n          browserName = \"vimb\";\n          desktopName = \"Vimb\";\n        };\n        VisualBoyAdvance = callPackage ../misc/emulators/VisualBoyAdvance {\n        };\n        wineStable = callPackage_i686 ../misc/emulators/wine/stable.nix {\n          bison = bison2;\n        };\n        wineUnstable = lowPrio (callPackage_i686 ../misc/emulators/wine/unstable.nix {\n          bison = bison2;\n        });\n        wine = wineStable;\n        winetricks = callPackage ../misc/emulators/wine/winetricks.nix {\n          inherit (gnome2) zenity;\n        };\n        wxmupen64plus = callPackage ../misc/emulators/wxmupen64plus {\n        };\n        x2x = callPackage ../tools/X11/x2x {\n        };\n        xboxdrv = callPackage ../misc/drivers/xboxdrv {\n        };\n        xinput_calibrator = callPackage ../tools/X11/xinput_calibrator {\n          inherit (xlibs) libXi\n          inputproto;\n        };\n        xosd = callPackage ../misc/xosd {\n        };\n        xsane = callPackage ../applications/graphics/sane/xsane.nix {\n          libpng = libpng12;\n          saneBackends = saneBackends;\n        };\n        yafc = callPackage ../applications/networking/yafc {\n        };\n        yandex-disk = callPackage ../tools/filesystems/yandex-disk {\n        };\n        myEnvFun = import ../misc/my-env {\n          inherit substituteAll pkgs;\n          inherit (stdenv) mkDerivation;\n        };\n        PatolineEnv = pack: myEnvFun {\n          name = \"patoline\";\n          buildInputs = [\n            stdenv\n            ncurses\n            mesa\n            freeglut\n            libzip\n            gcc\n            pack.ocaml\n            pack.findlib\n            pack.camomile\n            pack.dypgen\n            pack.ocaml_sqlite3\n            pack.camlzip\n            pack.lablgtk\n            pack.camlimages\n            pack.ocaml_cairo\n            pack.lablgl\n            pack.ocamlnet\n            pack.cryptokit\n            pack.ocaml_pcre\n            pack.patoline\n          ];\n          extraCmds = ''\n            LD_LIBRARY_PATH=\\''$LD_LIBRARY_PATH:${gcc.gcc}/lib\n            export LD_LIBRARY_PATH\n          '';\n        };\n        patoline = PatolineEnv ocamlPackages_4_00_1;\n        znc = callPackage ../applications/networking/znc {\n        };\n        zncModules = recurseIntoAttrs (callPackage ../applications/networking/znc/modules.nix {\n        });\n        zsnes = callPackage_i686 ../misc/emulators/zsnes {\n        };\n        snes9x-gtk = callPackage ../misc/emulators/snes9x-gtk {\n        };\n        misc = import ../misc/misc.nix {\n          inherit pkgs stdenv;\n        };\n        bullet = callPackage ../development/libraries/bullet {\n        };\n        dart = callPackage ../development/interpreters/dart {\n        };\n        httrack = callPackage ../tools/backup/httrack {\n        };\n        mg = callPackage ../applications/editors/mg {\n        };\n        adobeReader = adobe-reader;\n        asciidocFull = asciidoc-full;\n        lttngTools = lttng-tools;\n        lttngUst = lttng-ust;\n      };\n      in self;\n    in pkgs\n"
  },
  {
    "path": "data/nixpkgs-all-packages.nix",
    "content": "/* This file composes the Nix Packages collection.  That is, it\n   imports the functions that build the various packages, and calls\n   them with appropriate arguments.  The result is a set of all the\n   packages in the Nix Packages collection for some particular\n   platform. */\n\n\n{ # The system (e.g., `i686-linux') for which to build the packages.\n  system ? builtins.currentSystem\n\n, # The standard environment to use.  Only used for bootstrapping.  If\n  # null, the default standard environment is used.\n  bootStdenv ? null\n\n, # Non-GNU/Linux OSes are currently \"impure\" platforms, with their libc\n  # outside of the store.  Thus, GCC, GFortran, & co. must always look for\n  # files in standard system directories (/usr/include, etc.)\n  noSysDirs ? (system != \"x86_64-darwin\"\n               && system != \"x86_64-freebsd\" && system != \"i686-freebsd\"\n               && system != \"x86_64-kfreebsd-gnu\")\n\n  # More flags for the bootstrapping of stdenv.\n, gccWithCC ? true\n, gccWithProfiling ? true\n\n, # Allow a configuration attribute set to be passed in as an\n  # argument.  Otherwise, it's read from $NIXPKGS_CONFIG or\n  # ~/.nixpkgs/config.nix.\n  config ? null\n\n, crossSystem ? null\n, platform ? null\n}:\n\n\nlet config_ = config; platform_ = platform; in # rename the function arguments\n\nlet\n\n  lib = import ../../lib;\n\n  # The contents of the configuration file found at $NIXPKGS_CONFIG or\n  # $HOME/.nixpkgs/config.nix.\n  # for NIXOS (nixos-rebuild): use nixpkgs.config option\n  config =\n    let\n      toPath = builtins.toPath;\n      getEnv = x: if builtins ? getEnv then builtins.getEnv x else \"\";\n      pathExists = name:\n        builtins ? pathExists && builtins.pathExists (toPath name);\n\n      configFile = getEnv \"NIXPKGS_CONFIG\";\n      homeDir = getEnv \"HOME\";\n      configFile2 = homeDir + \"/.nixpkgs/config.nix\";\n\n      configExpr =\n        if config_ != null then config_\n        else if configFile != \"\" && pathExists configFile then import (toPath configFile)\n        else if homeDir != \"\" && pathExists configFile2 then import (toPath configFile2)\n        else {};\n\n    in\n      # allow both:\n      # { /* the config */ } and\n      # { pkgs, ... } : { /* the config */ }\n      if builtins.isFunction configExpr\n        then configExpr { inherit pkgs; }\n        else configExpr;\n\n  # Allow setting the platform in the config file. Otherwise, let's use a reasonable default (pc)\n\n  platformAuto = let\n      platforms = (import ./platforms.nix);\n    in\n      if system == \"armv6l-linux\" then platforms.raspberrypi\n      else if system == \"armv5tel-linux\" then platforms.sheevaplug\n      else if system == \"mips64el-linux\" then platforms.fuloong2f_n32\n      else if system == \"x86_64-linux\" then platforms.pc64\n      else if system == \"i686-linux\" then platforms.pc32\n      else platforms.pcBase;\n\n  platform = if platform_ != null then platform_\n    else config.platform or platformAuto;\n\n  # Helper functions that are exported through `pkgs'.\n  helperFunctions =\n    stdenvAdapters //\n    (import ../build-support/trivial-builders.nix { inherit (pkgs) stdenv; inherit (pkgs.xorg) lndir; });\n\n  stdenvAdapters =\n    import ../stdenv/adapters.nix pkgs;\n\n\n  # Allow packages to be overriden globally via the `packageOverrides'\n  # configuration option, which must be a function that takes `pkgs'\n  # as an argument and returns a set of new or overriden packages.\n  # The `packageOverrides' function is called with the *original*\n  # (un-overriden) set of packages, allowing packageOverrides\n  # attributes to refer to the original attributes (e.g. \"foo =\n  # ... pkgs.foo ...\").\n  pkgs = applyGlobalOverrides (config.packageOverrides or (pkgs: {}));\n\n\n  # Return the complete set of packages, after applying the overrides\n  # returned by the `overrider' function (see above).  Warning: this\n  # function is very expensive!\n  applyGlobalOverrides = overrider:\n    let\n      # Call the overrider function.  We don't want stdenv overrides\n      # in the case of cross-building, or otherwise the basic\n      # overrided packages will not be built with the crossStdenv\n      # adapter.\n      overrides = overrider pkgsOrig //\n        (lib.optionalAttrs (pkgsOrig.stdenv ? overrides && crossSystem == null) (pkgsOrig.stdenv.overrides pkgsOrig));\n\n      # The un-overriden packages, passed to `overrider'.\n      pkgsOrig = pkgsFun pkgs {};\n\n      # The overriden, final packages.\n      pkgs = pkgsFun pkgs overrides;\n    in pkgs;\n\n\n  # The package compositions.  Yes, this isn't properly indented.\n  pkgsFun = pkgs: overrides:\n    with helperFunctions;\n    let defaultScope = pkgs // pkgs.xorg; self = self_ // overrides;\n    self_ = with self; helperFunctions // {\n\n  # Make some arguments passed to all-packages.nix available\n  inherit system platform;\n\n  # Allow callPackage to fill in the pkgs argument\n  inherit pkgs;\n\n\n  # We use `callPackage' to be able to omit function arguments that\n  # can be obtained from `pkgs' or `pkgs.xorg' (i.e. `defaultScope').\n  # Use `newScope' for sets of packages in `pkgs' (see e.g. `gnome'\n  # below).\n  callPackage = newScope {};\n\n  newScope = extra: lib.callPackageWith (defaultScope // extra);\n\n\n  # Override system. This is useful to build i686 packages on x86_64-linux.\n  forceSystem = system: kernel: (import ./all-packages.nix) {\n    inherit system;\n    platform = platform // { kernelArch = kernel; };\n    inherit bootStdenv noSysDirs gccWithCC gccWithProfiling config\n      crossSystem;\n  };\n\n\n  # Used by wine, firefox with debugging version of Flash, ...\n  pkgsi686Linux = forceSystem \"i686-linux\" \"i386\";\n\n  callPackage_i686 = lib.callPackageWith (pkgsi686Linux // pkgsi686Linux.xorg);\n\n\n  # For convenience, allow callers to get the path to Nixpkgs.\n  path = ../..;\n\n\n  ### Symbolic names.\n\n  x11 = xlibsWrapper;\n\n  # `xlibs' is the set of X library components.  This used to be the\n  # old modular X llibraries project (called `xlibs') but now it's just\n  # the set of packages in the modular X.org tree (which also includes\n  # non-library components like the server, drivers, fonts, etc.).\n  xlibs = xorg // {xlibs = xlibsWrapper;};\n\n\n  ### Helper functions.\n\n  inherit lib config stdenvAdapters;\n\n  inherit (lib) lowPrio hiPrio appendToName makeOverridable;\n  inherit (misc) versionedDerivation;\n\n  # Applying this to an attribute set will cause nix-env to look\n  # inside the set for derivations.\n  recurseIntoAttrs = attrs: attrs // { recurseForDerivations = true; };\n\n  builderDefs = lib.composedArgsAndFun (import ../build-support/builder-defs/builder-defs.nix) {\n    inherit stringsWithDeps lib stdenv writeScript\n      fetchurl fetchmtn fetchgit;\n  };\n\n  builderDefsPackage = builderDefs.builderDefsPackage builderDefs;\n\n  stringsWithDeps = lib.stringsWithDeps;\n\n\n  ### Nixpkgs maintainer tools\n\n  nix-generate-from-cpan = callPackage ../../maintainers/scripts/nix-generate-from-cpan.nix { };\n\n  nixpkgs-lint = callPackage ../../maintainers/scripts/nixpkgs-lint.nix { };\n\n\n  ### STANDARD ENVIRONMENT\n\n\n  allStdenvs = import ../stdenv {\n    inherit system platform config;\n    allPackages = args: import ./all-packages.nix ({ inherit config system; } // args);\n  };\n\n  defaultStdenv = allStdenvs.stdenv // { inherit platform; };\n\n  stdenvCross = lowPrio (makeStdenvCross defaultStdenv crossSystem binutilsCross gccCrossStageFinal);\n\n  stdenv =\n    if bootStdenv != null then (bootStdenv // {inherit platform;}) else\n      if crossSystem != null then\n        stdenvCross\n      else\n        let\n            changer = config.replaceStdenv or null;\n        in if changer != null then\n          changer {\n            # We import again all-packages to avoid recursivities.\n            pkgs = import ./all-packages.nix {\n              # We remove packageOverrides to avoid recursivities\n              config = removeAttrs config [ \"replaceStdenv\" ];\n            };\n          }\n      else\n        defaultStdenv;\n\n  stdenvApple = stdenvAdapters.overrideGCC allStdenvs.stdenvNative gccApple;\n\n  forceNativeDrv = drv : if crossSystem == null then drv else\n    (drv // { crossDrv = drv.nativeDrv; });\n\n  # A stdenv capable of building 32-bit binaries.  On x86_64-linux,\n  # it uses GCC compiled with multilib support; on i686-linux, it's\n  # just the plain stdenv.\n  stdenv_32bit = lowPrio (\n    if system == \"x86_64-linux\" then\n      overrideGCC stdenv gcc48_multi\n    else\n      stdenv);\n\n\n  ### BUILD SUPPORT\n\n  attrSetToDir = arg: import ../build-support/upstream-updater/attrset-to-dir.nix {\n    inherit writeTextFile stdenv lib;\n    theAttrSet = arg;\n  };\n\n  autoreconfHook = makeSetupHook\n    { substitutions = { inherit autoconf automake libtool; }; }\n    ../build-support/setup-hooks/autoreconf.sh;\n\n  buildEnv = import ../build-support/buildenv {\n    inherit (pkgs) runCommand perl;\n  };\n\n  buildFHSChrootEnv = import ../build-support/build-fhs-chrootenv {\n    inherit stdenv glibc glibcLocales gcc coreutils diffutils findutils;\n    inherit gnused gnugrep gnutar gzip bzip2 bashInteractive xz shadow gawk;\n    inherit less buildEnv;\n  };\n\n  dotnetenv = import ../build-support/dotnetenv {\n    inherit stdenv;\n    dotnetfx = dotnetfx40;\n  };\n\n  scatterOutputHook = makeSetupHook {} ../build-support/setup-hooks/scatter_output.sh;\n\n  vsenv = callPackage ../build-support/vsenv {\n    vs = vs90wrapper;\n  };\n\n  fetchbower = import ../build-support/fetchbower {\n    inherit stdenv git;\n    inherit (nodePackages) fetch-bower;\n  };\n\n  fetchbzr = import ../build-support/fetchbzr {\n    inherit stdenv bazaar;\n  };\n\n  fetchcvs = import ../build-support/fetchcvs {\n    inherit stdenv cvs;\n  };\n\n  fetchdarcs = import ../build-support/fetchdarcs {\n    inherit stdenv darcs nix;\n  };\n\n  fetchgit = import ../build-support/fetchgit {\n    inherit stdenv git cacert;\n  };\n\n  fetchgitPrivate = import ../build-support/fetchgit/private.nix {\n    inherit fetchgit writeScript openssh stdenv;\n  };\n\n  fetchgitrevision = import ../build-support/fetchgitrevision runCommand git;\n\n  fetchmtn = callPackage ../build-support/fetchmtn (config.fetchmtn or {});\n\n  packer = callPackage ../development/tools/packer { };\n\n  fetchpatch = callPackage ../build-support/fetchpatch { };\n\n  fetchsvn = import ../build-support/fetchsvn {\n    inherit stdenv subversion openssh;\n    sshSupport = true;\n  };\n\n  fetchsvnrevision = import ../build-support/fetchsvnrevision runCommand subversion;\n\n  fetchsvnssh = import ../build-support/fetchsvnssh {\n    inherit stdenv subversion openssh expect;\n    sshSupport = true;\n  };\n\n  fetchhg = import ../build-support/fetchhg {\n    inherit stdenv mercurial nix;\n  };\n\n  # `fetchurl' downloads a file from the network.\n  fetchurl = import ../build-support/fetchurl {\n    inherit curl stdenv;\n  };\n\n  # A wrapper around fetchurl that generates miror://gnome URLs automatically\n  fetchurlGnome = callPackage ../build-support/fetchurl/gnome.nix { };\n\n  # fetchurlBoot is used for curl and its dependencies in order to\n  # prevent a cyclic dependency (curl depends on curl.tar.bz2,\n  # curl.tar.bz2 depends on fetchurl, fetchurl depends on curl).  It\n  # uses the curl from the previous bootstrap phase (e.g. a statically\n  # linked curl in the case of stdenv-linux).\n  fetchurlBoot = stdenv.fetchurlBoot;\n\n  fetchzip = import ../build-support/fetchzip { inherit lib fetchurl unzip; };\n\n  fetchFromGitHub = { owner, repo, rev, sha256 }: fetchzip {\n    name = \"${repo}-${rev}-src\";\n    url = \"https://github.com/${owner}/${repo}/archive/${rev}.tar.gz\";\n    inherit sha256;\n  };\n\n  resolveMirrorURLs = {url}: fetchurl {\n    showURLs = true;\n    inherit url;\n  };\n\n  libredirect = callPackage ../build-support/libredirect { };\n\n  makeDesktopItem = import ../build-support/make-desktopitem {\n    inherit stdenv;\n  };\n\n  makeAutostartItem = import ../build-support/make-startupitem {\n    inherit stdenv;\n    inherit lib;\n  };\n\n  makeInitrd = {contents, compressor ? \"gzip -9\"}:\n    import ../build-support/kernel/make-initrd.nix {\n      inherit stdenv perl perlArchiveCpio cpio contents ubootChooser compressor;\n    };\n\n  makeWrapper = makeSetupHook { } ../build-support/setup-hooks/make-wrapper.sh;\n\n  makeModulesClosure = { kernel, rootModules, allowMissing ? false }:\n    import ../build-support/kernel/modules-closure.nix {\n      inherit stdenv kmod kernel nukeReferences rootModules allowMissing;\n    };\n\n  pathsFromGraph = ../build-support/kernel/paths-from-graph.pl;\n\n  srcOnly = args: (import ../build-support/src-only) ({inherit stdenv; } // args);\n\n  substituteAll = import ../build-support/substitute/substitute-all.nix {\n    inherit stdenv;\n  };\n\n  replaceDependency = import ../build-support/replace-dependency.nix {\n    inherit runCommand nix lib;\n  };\n\n  nukeReferences = callPackage ../build-support/nuke-references/default.nix { };\n\n  vmTools = import ../build-support/vm/default.nix {\n    inherit pkgs;\n  };\n\n  releaseTools = import ../build-support/release/default.nix {\n    inherit pkgs;\n  };\n\n  composableDerivation = (import ../../lib/composable-derivation.nix) {\n    inherit pkgs lib;\n  };\n\n  platforms = import ./platforms.nix;\n\n  setJavaClassPath = makeSetupHook { } ../build-support/setup-hooks/set-java-classpath.sh;\n\n  fixDarwinDylibNames = makeSetupHook { } ../build-support/setup-hooks/fix-darwin-dylib-names.sh;\n\n  keepBuildTree = makeSetupHook { } ../build-support/setup-hooks/keep-build-tree.sh;\n\n  enableGCOVInstrumentation = makeSetupHook { } ../build-support/setup-hooks/enable-coverage-instrumentation.sh;\n\n  makeGCOVReport = makeSetupHook\n    { deps = [ pkgs.lcov pkgs.enableGCOVInstrumentation ]; }\n    ../build-support/setup-hooks/make-coverage-analysis-report.sh;\n\n\n  ### TOOLS\n\n  abduco = callPackage ../tools/misc/abduco { };\n\n  acct = callPackage ../tools/system/acct { };\n\n  acoustidFingerprinter = callPackage ../tools/audio/acoustid-fingerprinter {\n    ffmpeg = ffmpeg_1;\n  };\n\n  actdiag = pythonPackages.actdiag;\n\n  adom = callPackage ../games/adom { };\n\n  aefs = callPackage ../tools/filesystems/aefs { };\n\n  aegisub = callPackage ../applications/video/aegisub {\n    wxGTK = wxGTK30;\n    lua = lua5_1;\n  };\n\n  aespipe = callPackage ../tools/security/aespipe { };\n\n  aescrypt = callPackage ../tools/misc/aescrypt { };\n\n  ahcpd = callPackage ../tools/networking/ahcpd { };\n\n  aircrackng = callPackage ../tools/networking/aircrack-ng { };\n\n  analog = callPackage ../tools/admin/analog {};\n\n  apktool = callPackage ../development/tools/apktool {\n    buildTools = androidenv.buildTools;\n  };\n\n  apt-offline = callPackage ../tools/misc/apt-offline { };\n\n  archivemount = callPackage ../tools/filesystems/archivemount { };\n\n  arandr = callPackage ../tools/X11/arandr { };\n\n  arcanist = callPackage ../development/tools/misc/arcanist {};\n\n  arduino_core = callPackage ../development/arduino/arduino-core {\n    jdk = jdk;\n    jre = jdk;\n  };\n\n  argyllcms = callPackage ../tools/graphics/argyllcms {};\n\n  arp-scan = callPackage ../tools/misc/arp-scan { };\n\n  ascii = callPackage ../tools/text/ascii { };\n\n  asymptote = builderDefsPackage ../tools/graphics/asymptote {\n    inherit freeglut ghostscriptX imagemagick fftw boehmgc\n      mesa ncurses readline gsl libsigsegv python zlib perl\n      texinfo xz;\n    texLive = texLiveAggregationFun {\n      paths = [ texLive texLiveExtra texLiveCMSuper ];\n    };\n  };\n\n  awscli = callPackage ../tools/admin/awscli { };\n\n  ec2_api_tools = callPackage ../tools/virtualization/ec2-api-tools { };\n\n  ec2_ami_tools = callPackage ../tools/virtualization/ec2-ami-tools { };\n\n  altermime = callPackage ../tools/networking/altermime {};\n\n  amule = callPackage ../tools/networking/p2p/amule { };\n\n  amuleDaemon = appendToName \"daemon\" (amule.override {\n    monolithic = false;\n    daemon = true;\n  });\n\n  amuleGui = appendToName \"gui\" (amule.override {\n    monolithic = false;\n    client = true;\n  });\n\n  androidenv = import ../development/mobile/androidenv {\n    inherit pkgs;\n    pkgs_i686 = pkgsi686Linux;\n  };\n\n  apg = callPackage ../tools/security/apg { };\n\n  grc = callPackage ../tools/misc/grc { };\n\n  otool = callPackage ../os-specific/darwin/otool { };\n\n  pass = callPackage ../tools/security/pass {\n    gnupg = gnupg1compat;\n  };\n\n  setfile = callPackage ../os-specific/darwin/setfile { };\n\n  install_name_tool = callPackage ../os-specific/darwin/install_name_tool { };\n\n  xcodeenv = callPackage ../development/mobile/xcodeenv { };\n\n  titaniumenv = callPackage ../development/mobile/titaniumenv {\n    inherit pkgs;\n    pkgs_i686 = pkgsi686Linux;\n  };\n\n  inherit (androidenv) androidsdk_4_1;\n\n  aria2 = callPackage ../tools/networking/aria2 { };\n  aria = aria2;\n\n  at = callPackage ../tools/system/at { };\n\n  atftp = callPackage ../tools/networking/atftp {};\n\n  autogen = callPackage ../development/tools/misc/autogen { };\n\n  autojump = callPackage ../tools/misc/autojump { };\n\n  autorandr = callPackage ../tools/misc/autorandr {\n    inherit (xorg) xrandr xdpyinfo;\n  };\n\n  avahi = callPackage ../development/libraries/avahi {\n    qt4Support = config.avahi.qt4Support or false;\n  };\n\n  aws = callPackage ../tools/virtualization/aws { };\n\n  aws_mturk_clt = callPackage ../tools/misc/aws-mturk-clt { };\n\n  axel = callPackage ../tools/networking/axel { };\n\n  azureus = callPackage ../tools/networking/p2p/azureus { };\n\n  basex = callPackage ../tools/text/xml/basex { };\n\n  babeld = callPackage ../tools/networking/babeld { };\n\n  badvpn = callPackage ../tools/networking/badvpn {};\n\n  banner = callPackage ../games/banner {};\n\n  barcode = callPackage ../tools/graphics/barcode {};\n\n  bc = callPackage ../tools/misc/bc { };\n\n  bcache-tools = callPackage ../tools/filesystems/bcache-tools { };\n\n  bchunk = callPackage ../tools/cd-dvd/bchunk { };\n\n  bfr = callPackage ../tools/misc/bfr { };\n\n  bindfs = callPackage ../tools/filesystems/bindfs { };\n\n  bitbucket-cli = pythonPackages.bitbucket-cli;\n\n  blockdiag = pythonPackages.blockdiag;\n\n  bmon = callPackage ../tools/misc/bmon { };\n\n  bochs = callPackage ../applications/virtualization/bochs { wxSupport = false; };\n\n  boomerang = callPackage ../development/tools/boomerang { };\n\n  bootchart = callPackage ../tools/system/bootchart { };\n\n  bro = callPackage ../applications/networking/ids/bro { };\n\n  bsod = callPackage ../misc/emulators/bsod { };\n\n  btrfsProgs = callPackage ../tools/filesystems/btrfsprogs { };\n\n  bwm_ng = callPackage ../tools/networking/bwm-ng { };\n\n  byobu = callPackage ../tools/misc/byobu { };\n\n  capstone = callPackage ../development/libraries/capstone { };\n\n  catdoc = callPackage ../tools/text/catdoc { };\n\n  ccnet = callPackage ../tools/networking/ccnet { };\n\n  consul = callPackage ../servers/consul { };\n  consul_ui = callPackage ../servers/consul/ui.nix { };\n\n  chntpw = callPackage ../tools/security/chntpw { };\n\n  coprthr = callPackage ../development/libraries/coprthr {\n    flex = flex_2_5_35;\n  };\n\n  crawl = callPackage ../games/crawl { lua = lua5; };\n\n  cv = callPackage ../tools/misc/cv { };\n\n  direnv = callPackage ../tools/misc/direnv { };\n\n  ditaa = callPackage ../tools/graphics/ditaa { };\n\n  dlx = callPackage ../misc/emulators/dlx { };\n\n  eggdrop = callPackage ../tools/networking/eggdrop { };\n\n  enca = callPackage ../tools/text/enca { };\n\n  fasd = callPackage ../tools/misc/fasd {\n    inherit (haskellPackages) pandoc;\n  };\n\n  fop = callPackage ../tools/typesetting/fop { };\n\n  mcrl = callPackage ../tools/misc/mcrl { };\n\n  mcrl2 = callPackage ../tools/misc/mcrl2 { };\n\n  mpdcron = callPackage ../tools/audio/mpdcron { };\n\n  syslogng = callPackage ../tools/system/syslog-ng { };\n\n  syslogng_incubator = callPackage ../tools/system/syslog-ng-incubator { };\n\n  rsyslog = callPackage ../tools/system/rsyslog { };\n\n  mcrypt = callPackage ../tools/misc/mcrypt { };\n\n  mcelog = callPackage ../os-specific/linux/mcelog { };\n\n  apparix = callPackage ../tools/misc/apparix { };\n\n  appdata-tools = callPackage ../tools/misc/appdata-tools { };\n\n  asciidoc = callPackage ../tools/typesetting/asciidoc {\n    inherit (pythonPackages) matplotlib numpy aafigure recursivePthLoader;\n    enableStandardFeatures = false;\n  };\n\n  asciidoc-full = appendToName \"full\" (asciidoc.override {\n    inherit (pythonPackages) pygments;\n    enableStandardFeatures = true;\n  });\n\n  autossh = callPackage ../tools/networking/autossh { };\n\n  bacula = callPackage ../tools/backup/bacula { };\n\n  beanstalkd = callPackage ../servers/beanstalkd { };\n\n  bgs = callPackage ../tools/X11/bgs { };\n\n  biber = callPackage ../tools/typesetting/biber {\n    inherit (perlPackages)\n      autovivification BusinessISBN BusinessISMN BusinessISSN ConfigAutoConf\n      DataCompare DataDump DateSimple EncodeEUCJPASCII EncodeHanExtra EncodeJIS2K\n      ExtUtilsLibBuilder FileSlurp IPCRun3 Log4Perl LWPProtocolHttps ListAllUtils\n      ListMoreUtils ModuleBuild MozillaCA ReadonlyXS RegexpCommon TextBibTeX\n      UnicodeCollate UnicodeLineBreak URI XMLLibXMLSimple XMLLibXSLT XMLWriter;\n  };\n\n  bibtextools = callPackage ../tools/typesetting/bibtex-tools {\n    inherit (strategoPackages016) strategoxt sdf;\n  };\n\n  bittorrent = callPackage ../tools/networking/p2p/bittorrent {\n    gui = true;\n  };\n\n  bittornado = callPackage ../tools/networking/p2p/bit-tornado { };\n\n  blueman = callPackage ../tools/bluetooth/blueman {\n    inherit (pythonPackages) notify;\n  };\n\n  bmrsa = builderDefsPackage (import ../tools/security/bmrsa/11.nix) {\n    inherit unzip;\n  };\n\n  bogofilter = callPackage ../tools/misc/bogofilter { };\n\n  bsdiff = callPackage ../tools/compression/bsdiff { };\n\n  btar = callPackage ../tools/backup/btar { };\n\n  bud = callPackage ../tools/networking/bud {\n    inherit (pythonPackages) gyp;\n  };\n\n  bup = callPackage ../tools/backup/bup {\n    inherit (pythonPackages) pyxattr pylibacl setuptools fuse;\n    inherit (haskellPackages) pandoc;\n    par2Support = (config.bup.par2Support or false);\n  };\n\n  ori = callPackage ../tools/backup/ori { };\n\n  atool = callPackage ../tools/archivers/atool { };\n\n  bzip2 = callPackage ../tools/compression/bzip2 { };\n\n  cabextract = callPackage ../tools/archivers/cabextract { };\n\n  cadaver = callPackage ../tools/networking/cadaver { };\n\n  cantata = callPackage ../applications/audio/cantata { };\n\n  can-utils = callPackage ../os-specific/linux/can-utils { };\n\n  ccid = callPackage ../tools/security/ccid { };\n\n  ccrypt = callPackage ../tools/security/ccrypt { };\n\n  cdecl = callPackage ../development/tools/cdecl { };\n\n  cdrdao = callPackage ../tools/cd-dvd/cdrdao { };\n\n  cdrkit = callPackage ../tools/cd-dvd/cdrkit { };\n\n  ceph = callPackage ../tools/filesystems/ceph { };\n\n  cfdg = builderDefsPackage ../tools/graphics/cfdg {\n    inherit libpng bison flex ffmpeg;\n  };\n\n  checkinstall = callPackage ../tools/package-management/checkinstall { };\n\n  cheetahTemplate = builderDefsPackage (import ../tools/text/cheetah-template/2.0.1.nix) {\n    inherit makeWrapper python;\n  };\n\n  chkrootkit = callPackage ../tools/security/chkrootkit { };\n\n  chrony = callPackage ../tools/networking/chrony { };\n\n  chunkfs = callPackage ../tools/filesystems/chunkfs { };\n\n  chunksync = callPackage ../tools/backup/chunksync { };\n\n  cjdns = callPackage ../tools/networking/cjdns { };\n\n  cksfv = callPackage ../tools/networking/cksfv { };\n\n  clementine = callPackage ../applications/audio/clementine { };\n\n  ciopfs = callPackage ../tools/filesystems/ciopfs { };\n\n  colord = callPackage ../tools/misc/colord { };\n\n  colord-gtk = callPackage ../tools/misc/colord-gtk { };\n\n  colordiff = callPackage ../tools/text/colordiff { };\n\n  concurrencykit = callPackage ../development/libraries/concurrencykit { };\n\n  connect = callPackage ../tools/networking/connect { };\n\n  conspy = callPackage ../os-specific/linux/conspy {};\n\n  connman = callPackage ../tools/networking/connman { };\n\n  connmanui = callPackage ../tools/networking/connmanui { };\n\n  convertlit = callPackage ../tools/text/convertlit { };\n\n  collectd = callPackage ../tools/system/collectd { };\n\n  colormake = callPackage ../development/tools/build-managers/colormake { };\n\n  cowsay = callPackage ../tools/misc/cowsay { };\n\n  cpuminer = callPackage ../tools/misc/cpuminer { };\n\n  cuetools = callPackage ../tools/cd-dvd/cuetools { };\n\n  unifdef = callPackage ../development/tools/misc/unifdef { };\n\n  \"unionfs-fuse\" = callPackage ../tools/filesystems/unionfs-fuse { };\n\n  usb_modeswitch = callPackage ../development/tools/misc/usb-modeswitch { };\n\n  biosdevname = callPackage ../tools/networking/biosdevname { };\n\n  clamav = callPackage ../tools/security/clamav { };\n\n  cloc = callPackage ../tools/misc/cloc {\n    inherit (perlPackages) perl AlgorithmDiff RegexpCommon;\n  };\n\n  cloog = callPackage ../development/libraries/cloog { };\n\n  cloogppl = callPackage ../development/libraries/cloog-ppl { };\n\n  convmv = callPackage ../tools/misc/convmv { };\n\n  cool-old-term = callPackage ../applications/misc/cool-old-term { };\n\n  coreutils = callPackage ../tools/misc/coreutils\n    {\n      # TODO: Add ACL support for cross-Linux.\n      aclSupport = crossSystem == null && stdenv.isLinux;\n    };\n\n  cpio = callPackage ../tools/archivers/cpio { };\n\n  cromfs = callPackage ../tools/archivers/cromfs { };\n\n  cron = callPackage ../tools/system/cron { };\n\n  cudatoolkit5 = callPackage ../development/compilers/cudatoolkit/5.5.nix {\n    python = python26;\n  };\n\n  cudatoolkit6 = callPackage ../development/compilers/cudatoolkit/6.0.nix {\n    python = python26;\n  };\n\n  cudatoolkit = cudatoolkit5;\n\n  curl = callPackage ../tools/networking/curl rec {\n    fetchurl = fetchurlBoot;\n    zlibSupport = true;\n    sslSupport = zlibSupport;\n    scpSupport = zlibSupport && !stdenv.isSunOS && !stdenv.isCygwin;\n  };\n\n  curl3 = callPackage ../tools/networking/curl/7.15.nix rec {\n    zlibSupport = true;\n    sslSupport = zlibSupport;\n  };\n\n  cunit = callPackage ../tools/misc/cunit { };\n\n  curlftpfs = callPackage ../tools/filesystems/curlftpfs { };\n\n  cutter = callPackage ../tools/networking/cutter { };\n\n  dadadodo = builderDefsPackage (import ../tools/text/dadadodo) { };\n\n  daq = callPackage ../applications/networking/ids/daq { };\n\n  dar = callPackage ../tools/archivers/dar { };\n\n  davfs2 = callPackage ../tools/filesystems/davfs2 { };\n\n  dbench = callPackage ../development/tools/misc/dbench { };\n\n  dcraw = callPackage ../tools/graphics/dcraw { };\n\n  debian_devscripts = callPackage ../tools/misc/debian-devscripts {\n    inherit (perlPackages) CryptSSLeay LWP TimeDate DBFile FileDesktopEntry;\n  };\n\n  debootstrap = callPackage ../tools/misc/debootstrap { };\n\n  detox = callPackage ../tools/misc/detox { };\n\n  ddclient = callPackage ../tools/networking/ddclient { };\n\n  dd_rescue = callPackage ../tools/system/dd_rescue { };\n\n  ddrescue = callPackage ../tools/system/ddrescue { };\n\n  deluge = pythonPackages.deluge;\n\n  desktop_file_utils = callPackage ../tools/misc/desktop-file-utils { };\n\n  despotify = callPackage ../development/libraries/despotify { };\n\n  dev86 = callPackage ../development/compilers/dev86 { };\n\n  dnsmasq = callPackage ../tools/networking/dnsmasq { };\n\n  dnstop = callPackage ../tools/networking/dnstop { };\n\n  dhcp = callPackage ../tools/networking/dhcp { };\n\n  dhcpcd = callPackage ../tools/networking/dhcpcd { };\n\n  diffstat = callPackage ../tools/text/diffstat { };\n\n  diffutils = callPackage ../tools/text/diffutils { };\n\n  wgetpaste = callPackage ../tools/text/wgetpaste { };\n\n  dirmngr = callPackage ../tools/security/dirmngr { };\n\n  disper = callPackage ../tools/misc/disper { };\n\n  dmd = callPackage ../development/compilers/dmd { };\n\n  dmg2img = callPackage ../tools/misc/dmg2img { };\n\n  docbook2odf = callPackage ../tools/typesetting/docbook2odf {\n    inherit (perlPackages) PerlMagick;\n  };\n\n  docbook2x = callPackage ../tools/typesetting/docbook2x {\n    inherit (perlPackages) XMLSAX XMLParser XMLNamespaceSupport;\n  };\n\n  dosfstools = callPackage ../tools/filesystems/dosfstools { };\n\n  dotnetfx35 = callPackage ../development/libraries/dotnetfx35 { };\n\n  dotnetfx40 = callPackage ../development/libraries/dotnetfx40 { };\n\n  dropbear = callPackage ../tools/networking/dropbear { };\n\n  dtach = callPackage ../tools/misc/dtach { };\n\n  duo-unix = callPackage ../tools/security/duo-unix { };\n\n  duplicity = callPackage ../tools/backup/duplicity {\n    inherit (pythonPackages) boto lockfile;\n    gnupg = gnupg1;\n  };\n\n  duply = callPackage ../tools/backup/duply { };\n\n  dvdplusrwtools = callPackage ../tools/cd-dvd/dvd+rw-tools { };\n\n  dvgrab = callPackage ../tools/video/dvgrab { };\n\n  dvtm = callPackage ../tools/misc/dvtm { };\n\n  e2fsprogs = callPackage ../tools/filesystems/e2fsprogs { };\n\n  easyrsa = callPackage ../tools/networking/easyrsa { };\n\n  ebook_tools = callPackage ../tools/text/ebook-tools { };\n\n  ecryptfs = callPackage ../tools/security/ecryptfs { };\n\n  editres = callPackage ../tools/graphics/editres {\n    inherit (xlibs) libXt libXaw;\n    inherit (xorg) utilmacros;\n  };\n\n  edk2 = callPackage ../development/compilers/edk2 { };\n\n  efibootmgr = callPackage ../tools/system/efibootmgr { };\n\n  efivar = callPackage ../tools/system/efivar { };\n\n  evemu = callPackage ../tools/system/evemu { };\n\n  elasticsearch = callPackage ../servers/search/elasticsearch { };\n\n  elasticsearchPlugins = recurseIntoAttrs (\n    callPackage ../servers/search/elasticsearch/plugins.nix { }\n  );\n\n  emv = callPackage ../tools/misc/emv { };\n\n  enblendenfuse = callPackage ../tools/graphics/enblend-enfuse { };\n\n  encfs = callPackage ../tools/filesystems/encfs { };\n\n  enscript = callPackage ../tools/text/enscript { };\n\n  ethtool = callPackage ../tools/misc/ethtool { };\n\n  ettercap = callPackage ../applications/networking/sniffers/ettercap { };\n\n  euca2ools = callPackage ../tools/virtualization/euca2ools { pythonPackages = python26Packages; };\n\n  evtest = callPackage ../applications/misc/evtest { };\n\n  exempi = callPackage ../development/libraries/exempi { };\n\n  execline = callPackage ../tools/misc/execline { };\n\n  exercism = callPackage ../development/tools/exercism { };\n\n  exif = callPackage ../tools/graphics/exif { };\n\n  exiftags = callPackage ../tools/graphics/exiftags { };\n\n  extundelete = callPackage ../tools/filesystems/extundelete { };\n\n  expect = callPackage ../tools/misc/expect { };\n\n  f2fs-tools = callPackage ../tools/filesystems/f2fs-tools { };\n\n  fabric = pythonPackages.fabric;\n\n  fail2ban = callPackage ../tools/security/fail2ban {\n    systemd = systemd.override {\n      pythonSupport = true;\n    };\n  };\n\n  fakeroot = callPackage ../tools/system/fakeroot { };\n\n  fakechroot = callPackage ../tools/system/fakechroot { };\n\n  fcitx = callPackage ../tools/inputmethods/fcitx { };\n\n  fcron = callPackage ../tools/system/fcron { };\n\n  fdm = callPackage ../tools/networking/fdm {};\n\n  figlet = callPackage ../tools/misc/figlet { };\n\n  file = callPackage ../tools/misc/file { };\n\n  filegive = callPackage ../tools/networking/filegive { };\n\n  fileschanged = callPackage ../tools/misc/fileschanged { };\n\n  findutils = callPackage ../tools/misc/findutils { };\n\n  finger_bsd = callPackage ../tools/networking/bsd-finger { };\n\n  fio = callPackage ../tools/system/fio { };\n\n  flashtool = callPackage_i686 ../development/mobile/flashtool {\n    platformTools = androidenv.platformTools;\n  };\n\n  flpsed = callPackage ../applications/editors/flpsed { };\n\n  flvstreamer = callPackage ../tools/networking/flvstreamer { };\n\n  libbsd = callPackage ../development/libraries/libbsd { };\n\n  lprof = callPackage ../tools/graphics/lprof { };\n\n  fdk_aac = callPackage ../development/libraries/fdk-aac { };\n\n  flvtool2 = callPackage ../tools/video/flvtool2 { };\n\n  fontforge = lowPrio (callPackage ../tools/misc/fontforge { });\n\n  fontforgeX = callPackage ../tools/misc/fontforge {\n    withX11 = true;\n  };\n\n  forktty = callPackage ../os-specific/linux/forktty {};\n\n  fortune = callPackage ../tools/misc/fortune { };\n\n  fox = callPackage ../development/libraries/fox/default.nix {\n    libpng = libpng12;\n  };\n\n  fox_1_6 = callPackage ../development/libraries/fox/fox-1.6.nix { };\n\n  fping = callPackage ../tools/networking/fping {};\n\n  fprot = callPackage ../tools/security/fprot { };\n\n  freeipmi = callPackage ../tools/system/freeipmi {};\n\n  freetalk = callPackage ../applications/networking/instant-messengers/freetalk {\n    guile = guile_1_8;\n  };\n\n  freetds = callPackage ../development/libraries/freetds { };\n\n  ftgl = callPackage ../development/libraries/ftgl { };\n\n  ftgl212 = callPackage ../development/libraries/ftgl/2.1.2.nix { };\n\n  fuppes = callPackage ../tools/networking/fuppes {\n    ffmpeg = ffmpeg_0_6_90;\n  };\n\n  fsfs = callPackage ../tools/filesystems/fsfs { };\n\n  fuse_zip = callPackage ../tools/filesystems/fuse-zip { };\n\n  fuse_exfat = callPackage ../tools/filesystems/fuse-exfat { };\n\n  dos2unix = callPackage ../tools/text/dos2unix { };\n\n  uni2ascii = callPackage ../tools/text/uni2ascii { };\n\n  g500-control = callPackage ../tools/misc/g500-control { };\n\n  galculator = callPackage ../applications/misc/galculator {\n    gtk = gtk3;\n  };\n\n  gawk = callPackage ../tools/text/gawk { };\n\n  gawkInteractive = appendToName \"interactive\"\n    (gawk.override { readlineSupport = true; });\n\n  gbdfed = callPackage ../tools/misc/gbdfed {\n    gtk = gtk2;\n  };\n\n  gdmap = callPackage ../tools/system/gdmap { };\n\n  genext2fs = callPackage ../tools/filesystems/genext2fs { };\n\n  gengetopt = callPackage ../development/tools/misc/gengetopt { };\n\n  getmail = callPackage ../tools/networking/getmail { };\n\n  getopt = callPackage ../tools/misc/getopt { };\n\n  gftp = callPackage ../tools/networking/gftp { };\n\n  gifsicle = callPackage ../tools/graphics/gifsicle { };\n\n  glusterfs = callPackage ../tools/filesystems/glusterfs { };\n\n  glmark2 = callPackage ../tools/graphics/glmark2 { };\n\n  glxinfo = callPackage ../tools/graphics/glxinfo { };\n\n  gmvault = callPackage ../tools/networking/gmvault { };\n\n  gnokii = builderDefsPackage (import ../tools/misc/gnokii) {\n    inherit intltool perl gettext libusb pkgconfig bluez readline pcsclite\n      libical gtk glib;\n    inherit (xorg) libXpm;\n  };\n\n  gnufdisk = callPackage ../tools/system/fdisk {\n    guile = guile_1_8;\n  };\n\n  gnugrep = callPackage ../tools/text/gnugrep {\n    libiconv = libiconvOrNull;\n  };\n\n  gnulib = callPackage ../development/tools/gnulib { };\n\n  gnupatch = callPackage ../tools/text/gnupatch { };\n\n  gnupg1orig = callPackage ../tools/security/gnupg1 { };\n\n  gnupg1compat = callPackage ../tools/security/gnupg1compat { };\n\n  # use config.packageOverrides if you prefer original gnupg1\n  gnupg1 = gnupg1compat;\n\n  gnupg = callPackage ../tools/security/gnupg { libusb = libusb1; };\n\n  gnupg2_1 = lowPrio (callPackage ../tools/security/gnupg/git.nix {\n    libassuan = libassuan2_1;\n  });\n\n  gnuplot = callPackage ../tools/graphics/gnuplot { };\n\n  gnuplot_qt = gnuplot.override { withQt = true; };\n\n  # must have AquaTerm installed separately\n  gnuplot_aquaterm = gnuplot.override { aquaterm = true; };\n\n  gnused = callPackage ../tools/text/gnused { };\n\n  gnutar = callPackage ../tools/archivers/gnutar { };\n\n  gnuvd = callPackage ../tools/misc/gnuvd { };\n\n  goaccess = callPackage ../tools/misc/goaccess { };\n\n  googleAuthenticator = callPackage ../os-specific/linux/google-authenticator { };\n\n  gource = callPackage ../applications/version-management/gource {};\n\n  gpodder = callPackage ../applications/audio/gpodder { };\n\n  gptfdisk = callPackage ../tools/system/gptfdisk { };\n\n  grafana = callPackage ../development/tools/misc/grafana { };\n\n  grafx2 = callPackage ../applications/graphics/grafx2 {};\n\n  graphviz = callPackage ../tools/graphics/graphviz { };\n\n  /* Readded by Michael Raskin. There are programs in the wild\n   * that do want 2.0 but not 2.22. Please give a day's notice for\n   * objections before removal.\n   */\n  graphviz_2_0 = callPackage ../tools/graphics/graphviz/2.0.nix { };\n\n  grive = callPackage ../tools/filesystems/grive {\n    json_c = json-c-0-11; # won't configure with 0.12; others are vulnerable\n  };\n\n  groff = callPackage ../tools/text/groff {\n    ghostscript = null;\n  };\n\n  grub = callPackage_i686 ../tools/misc/grub {\n    buggyBiosCDSupport = config.grub.buggyBiosCDSupport or true;\n  };\n\n  grub2 = callPackage ../tools/misc/grub/2.0x.nix { libusb = libusb1; flex = flex_2_5_35; };\n\n  grub2_efi = grub2.override { EFIsupport = true; };\n\n  gssdp = callPackage ../development/libraries/gssdp {\n    inherit (gnome) libsoup;\n  };\n\n  gt5 = callPackage ../tools/system/gt5 { };\n\n  gtest = callPackage ../development/libraries/gtest {};\n\n  gtkdatabox = callPackage ../development/libraries/gtkdatabox {};\n\n  gtkgnutella = callPackage ../tools/networking/p2p/gtk-gnutella { };\n\n  gtkvnc = callPackage ../tools/admin/gtk-vnc {};\n\n  gtmess = callPackage ../applications/networking/instant-messengers/gtmess { };\n\n  gummiboot = callPackage ../tools/misc/gummiboot { };\n\n  gupnp = callPackage ../development/libraries/gupnp {\n    inherit (gnome) libsoup;\n  };\n\n  gupnp_av = callPackage ../development/libraries/gupnp-av {};\n\n  gupnp_igd = callPackage ../development/libraries/gupnp-igd {};\n\n  gupnptools = callPackage ../tools/networking/gupnp-tools {};\n\n  gvpe = builderDefsPackage ../tools/networking/gvpe {\n    inherit openssl gmp nettools iproute;\n  };\n\n  gvolicon = callPackage ../tools/audio/gvolicon {};\n\n  gzip = callPackage ../tools/compression/gzip { };\n\n  gzrt = callPackage ../tools/compression/gzrt { };\n\n  partclone = callPackage ../tools/backup/partclone { };\n\n  partimage = callPackage ../tools/backup/partimage { };\n\n  pigz = callPackage ../tools/compression/pigz { };\n\n  haproxy = callPackage ../tools/networking/haproxy { };\n\n  haveged = callPackage ../tools/security/haveged { };\n\n  hardlink = callPackage ../tools/system/hardlink { };\n\n  hashcat = callPackage ../tools/security/hashcat { };\n\n  halibut = callPackage ../tools/typesetting/halibut { };\n\n  hddtemp = callPackage ../tools/misc/hddtemp { };\n\n  hdf5 = callPackage ../tools/misc/hdf5 {\n    szip = null;\n  };\n\n  heimdall = callPackage ../tools/misc/heimdall { };\n\n  hevea = callPackage ../tools/typesetting/hevea { };\n\n  highlight = callPackage ../tools/text/highlight {\n    lua = lua5;\n  };\n\n  host = callPackage ../tools/networking/host { };\n\n  hping = callPackage ../tools/networking/hping { };\n\n  httpie = callPackage ../tools/networking/httpie { };\n\n  httpfs2 = callPackage ../tools/filesystems/httpfs { };\n\n  # FIXME: This Hydra snapshot is outdated and depends on the `nixPerl',\n  # which no longer exists.\n  #\n  # hydra = callPackage ../development/tools/misc/hydra {\n  #   nix = nixUnstable;\n  # };\n\n  iasl = callPackage ../development/compilers/iasl { };\n\n  icecast = callPackage ../servers/icecast { };\n\n  icoutils = callPackage ../tools/graphics/icoutils { };\n\n  idutils = callPackage ../tools/misc/idutils { };\n\n  idle3tools = callPackage ../tools/system/idle3tools { };\n\n  iftop = callPackage ../tools/networking/iftop { };\n\n  imapproxy = callPackage ../tools/networking/imapproxy { };\n\n  imapsync = callPackage ../tools/networking/imapsync {\n    inherit (perlPackages) MailIMAPClient;\n  };\n\n  inadyn = callPackage ../tools/networking/inadyn { };\n\n  inetutils = callPackage ../tools/networking/inetutils { };\n\n  ioping = callPackage ../tools/system/ioping {};\n\n  iodine = callPackage ../tools/networking/iodine { };\n\n  iperf = callPackage ../tools/networking/iperf { };\n\n  ipmitool = callPackage ../tools/system/ipmitool {\n    static = false;\n  };\n\n  ipmiutil = callPackage ../tools/system/ipmiutil {};\n\n  ised = callPackage ../tools/misc/ised {};\n\n  isl = callPackage ../development/libraries/isl { };\n  isl_0_12 = callPackage ../development/libraries/isl/0.12.2.nix { };\n\n  isync = callPackage ../tools/networking/isync { };\n\n  jd-gui = callPackage_i686 ../tools/security/jd-gui { };\n\n  jdiskreport = callPackage ../tools/misc/jdiskreport { };\n\n  jfsrec = callPackage ../tools/filesystems/jfsrec {\n    boost = boost144;\n  };\n\n  jfsutils = callPackage ../tools/filesystems/jfsutils { };\n\n  jhead = callPackage ../tools/graphics/jhead { };\n\n  jing = callPackage ../tools/text/xml/jing { };\n\n  jmtpfs = callPackage ../tools/filesystems/jmtpfs { };\n\n  jnettop = callPackage ../tools/networking/jnettop { };\n\n  jq = callPackage ../development/tools/jq {};\n\n  jscoverage = callPackage ../development/tools/misc/jscoverage { };\n\n  jwhois = callPackage ../tools/networking/jwhois { };\n\n  kazam = callPackage ../applications/video/kazam { };\n\n  kalibrate-rtl = callPackage ../tools/misc/kalibrate-rtl { };\n\n  kexectools = callPackage ../os-specific/linux/kexectools { };\n\n  keychain = callPackage ../tools/misc/keychain { };\n\n  kismet = callPackage ../applications/networking/sniffers/kismet { };\n\n  less = callPackage ../tools/misc/less { };\n\n  lockfileProgs = callPackage ../tools/misc/lockfile-progs { };\n\n  logstash = callPackage ../tools/misc/logstash { };\n\n  logstash-forwarder = callPackage ../tools/misc/logstash-forwarder { };\n\n  kippo = callPackage ../servers/kippo { };\n\n  klavaro = callPackage ../games/klavaro {};\n\n  kzipmix = callPackage_i686 ../tools/compression/kzipmix { };\n\n  minidlna = callPackage ../tools/networking/minidlna {\n    ffmpeg = ffmpeg_0_10;\n  };\n\n  mmv = callPackage ../tools/misc/mmv { };\n\n  most = callPackage ../tools/misc/most { };\n\n  multitail = callPackage ../tools/misc/multitail { };\n\n  netperf = callPackage ../applications/networking/netperf { };\n\n  ninka = callPackage ../development/tools/misc/ninka { };\n\n  nodejs = callPackage ../development/web/nodejs {};\n\n  nodePackages = recurseIntoAttrs (import ./node-packages.nix {\n    inherit pkgs stdenv nodejs fetchurl fetchgit;\n    neededNatives = [python] ++ lib.optional (lib.elem system lib.platforms.linux) utillinux;\n    self = pkgs.nodePackages;\n  });\n\n  ldapvi = callPackage ../tools/misc/ldapvi { };\n\n  ldns = callPackage ../development/libraries/ldns { };\n\n  lftp = callPackage ../tools/networking/lftp { };\n\n  libconfig = callPackage ../development/libraries/libconfig { };\n\n  libee = callPackage ../development/libraries/libee { };\n\n  libestr = callPackage ../development/libraries/libestr { };\n\n  libevdev = callPackage ../development/libraries/libevdev { };\n\n  liboauth = callPackage ../development/libraries/liboauth { };\n\n  libtirpc = callPackage ../development/libraries/ti-rpc { };\n\n  libshout = callPackage ../development/libraries/libshout { };\n\n  libqmi = callPackage ../development/libraries/libqmi { };\n\n  libmbim = callPackage ../development/libraries/libmbim { };\n\n  libtorrent = callPackage ../tools/networking/p2p/libtorrent { };\n\n  logcheck = callPackage ../tools/system/logcheck {\n    inherit (perlPackages) mimeConstruct;\n  };\n\n  logrotate = callPackage ../tools/system/logrotate { };\n\n  logstalgia = callPackage ../tools/graphics/logstalgia {};\n\n  lout = callPackage ../tools/typesetting/lout { };\n\n  lrzip = callPackage ../tools/compression/lrzip { };\n\n  # lsh installs `bin/nettle-lfib-stream' and so does Nettle.  Give the\n  # former a lower priority than Nettle.\n  lsh = lowPrio (callPackage ../tools/networking/lsh { });\n\n  lshw = callPackage ../tools/system/lshw { };\n\n  lxc = callPackage ../os-specific/linux/lxc { };\n\n  lzip = callPackage ../tools/compression/lzip { };\n\n  lzma = xz;\n\n  xz = callPackage ../tools/compression/xz { };\n\n  lzop = callPackage ../tools/compression/lzop { };\n\n  maildrop = callPackage ../tools/networking/maildrop { };\n\n  mailpile = callPackage ../applications/networking/mailreaders/mailpile { };\n\n  mailutils = callPackage ../tools/networking/mailutils {\n    guile = guile_1_8;\n  };\n\n  mairix = callPackage ../tools/text/mairix { };\n\n  makemkv = callPackage ../applications/video/makemkv { };\n\n  man = callPackage ../tools/misc/man { };\n\n  man_db = callPackage ../tools/misc/man-db { };\n\n  memtest86 = callPackage ../tools/misc/memtest86 { };\n\n  memtest86plus = callPackage ../tools/misc/memtest86+ { };\n\n  meo = callPackage ../tools/security/meo { };\n\n  mc = callPackage ../tools/misc/mc { };\n\n  mcabber = callPackage ../applications/networking/instant-messengers/mcabber { };\n\n  mcron = callPackage ../tools/system/mcron {\n    guile = guile_1_8;\n  };\n\n  mdbtools = callPackage ../tools/misc/mdbtools { };\n\n  mdbtools_git = callPackage ../tools/misc/mdbtools/git.nix {\n    inherit (gnome) scrollkeeper;\n  };\n\n  mednafen = callPackage ../misc/emulators/mednafen { };\n\n  mednafen-server = callPackage ../misc/emulators/mednafen/server.nix { };\n\n  megacli = callPackage ../tools/misc/megacli { };\n\n  megatools = callPackage ../tools/networking/megatools { };\n\n  mfcuk = callPackage ../tools/security/mfcuk { };\n\n  minecraft = callPackage ../games/minecraft { };\n\n  minecraft-server = callPackage ../games/minecraft-server { };\n\n  minetest = callPackage ../games/minetest {\n    libpng = libpng12;\n  };\n\n  miniupnpc = callPackage ../tools/networking/miniupnpc { };\n\n  miniupnpd = callPackage ../tools/networking/miniupnpd { };\n\n  minixml = callPackage ../development/libraries/minixml { };\n\n  mjpegtools = callPackage ../tools/video/mjpegtools { };\n\n  mkcue = callPackage ../tools/cd-dvd/mkcue { };\n\n  mkpasswd = callPackage ../tools/security/mkpasswd { };\n\n  mktemp = callPackage ../tools/security/mktemp { };\n\n  mktorrent = callPackage ../tools/misc/mktorrent { };\n\n  modemmanager = callPackage ../tools/networking/modemmanager {};\n\n  monit = callPackage ../tools/system/monit { };\n\n  mosh = callPackage ../tools/networking/mosh {\n    boost = boostHeaders;\n    inherit (perlPackages) IOTty;\n  };\n\n  mpage = callPackage ../tools/text/mpage { };\n\n  mr = callPackage ../applications/version-management/mr { };\n\n  mscgen = callPackage ../tools/graphics/mscgen { };\n\n  msf = builderDefsPackage (import ../tools/security/metasploit/3.1.nix) {\n    inherit ruby makeWrapper;\n  };\n\n  mssys = callPackage ../tools/misc/mssys { };\n\n  mtdutils = callPackage ../tools/filesystems/mtdutils { };\n\n  mtools = callPackage ../tools/filesystems/mtools { };\n\n  mtr = callPackage ../tools/networking/mtr {};\n\n  multitran = recurseIntoAttrs (let callPackage = newScope pkgs.multitran; in rec {\n    multitrandata = callPackage ../tools/text/multitran/data { };\n\n    libbtree = callPackage ../tools/text/multitran/libbtree { };\n\n    libmtsupport = callPackage ../tools/text/multitran/libmtsupport { };\n\n    libfacet = callPackage ../tools/text/multitran/libfacet { };\n\n    libmtquery = callPackage ../tools/text/multitran/libmtquery { };\n\n    mtutils = callPackage ../tools/text/multitran/mtutils { };\n  });\n\n  munge = callPackage ../tools/security/munge { };\n\n  muscleframework = callPackage ../tools/security/muscleframework { };\n\n  muscletool = callPackage ../tools/security/muscletool { };\n\n  mysql2pgsql = callPackage ../tools/misc/mysql2pgsql { };\n\n  namazu = callPackage ../tools/text/namazu { };\n\n  nbd = callPackage ../tools/networking/nbd { };\n\n  ndjbdns = callPackage ../tools/networking/ndjbdns { };\n\n  netatalk = callPackage ../tools/filesystems/netatalk { };\n\n  netcdf = callPackage ../development/libraries/netcdf { };\n\n  nc6 = callPackage ../tools/networking/nc6 { };\n\n  ncat = callPackage ../tools/networking/ncat { };\n\n  ncftp = callPackage ../tools/networking/ncftp { };\n\n  ncompress = callPackage ../tools/compression/ncompress { };\n\n  ndisc6 = callPackage ../tools/networking/ndisc6 { };\n\n  netboot = callPackage ../tools/networking/netboot {};\n\n  netcat = callPackage ../tools/networking/netcat { };\n\n  netcat-openbsd = callPackage ../tools/networking/netcat-openbsd { };\n\n  nethogs = callPackage ../tools/networking/nethogs { };\n\n  netkittftp = callPackage ../tools/networking/netkit/tftp { };\n\n  netpbm = callPackage ../tools/graphics/netpbm { };\n\n  netrw = callPackage ../tools/networking/netrw { };\n\n  netselect = callPackage ../tools/networking/netselect { };\n\n  networkmanager = callPackage ../tools/networking/network-manager { };\n\n  networkmanager_openvpn = callPackage ../tools/networking/network-manager/openvpn.nix { };\n\n  networkmanager_pptp = callPackage ../tools/networking/network-manager/pptp.nix { };\n\n  networkmanager_vpnc = callPackage ../tools/networking/network-manager/vpnc.nix { };\n\n  networkmanager_openconnect = callPackage ../tools/networking/network-manager/openconnect.nix { };\n\n  networkmanagerapplet = newScope gnome ../tools/networking/network-manager-applet { dconf = gnome3.dconf; };\n\n  newsbeuter = callPackage ../applications/networking/feedreaders/newsbeuter { };\n\n  newsbeuter-dev = callPackage ../applications/networking/feedreaders/newsbeuter/dev.nix { };\n\n  ngrep = callPackage ../tools/networking/ngrep { };\n\n  ngrok = callPackage ../tools/misc/ngrok { };\n\n  mpack = callPackage ../tools/networking/mpack { };\n\n  pa_applet = callPackage ../tools/audio/pa-applet { };\n\n  pnmixer = callPackage ../tools/audio/pnmixer { };\n\n  nifskope = callPackage ../tools/graphics/nifskope { };\n\n  nilfs_utils = callPackage ../tools/filesystems/nilfs-utils {};\n\n  nitrogen = callPackage ../tools/X11/nitrogen {};\n\n  nlopt = callPackage ../development/libraries/nlopt {};\n\n  npapi_sdk = callPackage ../development/libraries/npapi-sdk {};\n\n  npth = callPackage ../development/libraries/npth {};\n\n  nmap = callPackage ../tools/security/nmap { };\n\n  nmap_graphical = callPackage ../tools/security/nmap {\n    inherit (pythonPackages) pysqlite;\n    graphicalSupport = true;\n  };\n\n  notbit = callPackage ../applications/networking/notbit { };\n\n  nox = callPackage ../tools/package-management/nox {\n    pythonPackages = python3Packages;\n    nix = nixUnstable;\n  };\n\n  nss_pam_ldapd = callPackage ../tools/networking/nss-pam-ldapd {};\n\n  ntfs3g = callPackage ../tools/filesystems/ntfs-3g { };\n\n  # ntfsprogs are merged into ntfs-3g\n  ntfsprogs = pkgs.ntfs3g;\n\n  ntop = callPackage ../tools/networking/ntop { };\n\n  ntopng = callPackage ../tools/networking/ntopng { };\n\n  ntp = callPackage ../tools/networking/ntp { };\n\n  numdiff = callPackage ../tools/text/numdiff { };\n\n  nssmdns = callPackage ../tools/networking/nss-mdns { };\n\n  nwdiag = pythonPackages.nwdiag;\n\n  nylon = callPackage ../tools/networking/nylon { };\n\n  nzbget = callPackage ../tools/networking/nzbget { };\n\n  oathToolkit = callPackage ../tools/security/oath-toolkit { };\n\n  obex_data_server = callPackage ../tools/bluetooth/obex-data-server { };\n\n  obexd = callPackage ../tools/bluetooth/obexd { };\n\n  obexfs = callPackage ../tools/bluetooth/obexfs { };\n\n  obexftp = callPackage ../tools/bluetooth/obexftp { };\n\n  obnam = callPackage ../tools/backup/obnam { };\n\n  odt2txt = callPackage ../tools/text/odt2txt { };\n\n  offlineimap = callPackage ../tools/networking/offlineimap {\n    inherit (pythonPackages) sqlite3;\n  };\n\n  opendbx = callPackage ../development/libraries/opendbx { };\n\n  opendkim = callPackage ../development/libraries/opendkim { };\n\n  opendylan = callPackage ../development/compilers/opendylan {\n    opendylan-bootstrap = opendylan_bin;\n  };\n\n  opendylan_bin = callPackage ../development/compilers/opendylan/bin.nix { };\n\n  openjade = callPackage ../tools/text/sgml/openjade { };\n\n  openobex = callPackage ../tools/bluetooth/openobex { };\n\n  openopc = callPackage ../tools/misc/openopc {\n    pythonFull = python27Full.override {\n      extraLibs = [ python27Packages.pyro3 ];\n    };\n  };\n\n  openresolv = callPackage ../tools/networking/openresolv { };\n\n  opensc = callPackage ../tools/security/opensc { };\n\n  opensc_dnie_wrapper = callPackage ../tools/security/opensc-dnie-wrapper { };\n\n  openssh =\n    callPackage ../tools/networking/openssh {\n      hpnSupport = false;\n      withKerberos = false;\n      etcDir = \"/etc/ssh\";\n      pam = if stdenv.isLinux then pam else null;\n    };\n\n  openssh_hpn = pkgs.appendToName \"with-hpn\" (openssh.override { hpnSupport = true; });\n\n  openssh_with_kerberos = pkgs.appendToName \"with-kerberos\" (openssh.override { withKerberos = true; });\n\n  opensp = callPackage ../tools/text/sgml/opensp { };\n\n  spCompat = callPackage ../tools/text/sgml/opensp/compat.nix { };\n\n  openvpn = callPackage ../tools/networking/openvpn { };\n\n  openvpn_learnaddress = callPackage ../tools/networking/openvpn/openvpn_learnaddress.nix { };\n\n  optipng = callPackage ../tools/graphics/optipng {\n    libpng = libpng12;\n  };\n\n  oslrd = callPackage ../tools/networking/oslrd { };\n\n  ossec = callPackage ../tools/security/ossec {};\n\n  otpw = callPackage ../os-specific/linux/otpw { };\n\n  p7zip = callPackage ../tools/archivers/p7zip { };\n\n  pal = callPackage ../tools/misc/pal { };\n\n  panomatic = callPackage ../tools/graphics/panomatic { };\n\n  par2cmdline = callPackage ../tools/networking/par2cmdline { };\n\n  parallel = callPackage ../tools/misc/parallel { };\n\n  parcellite = callPackage ../tools/misc/parcellite { };\n\n  patchutils = callPackage ../tools/text/patchutils { };\n\n  parted = callPackage ../tools/misc/parted { hurd = null; };\n\n  pitivi = callPackage ../applications/video/pitivi {\n    gst = gst_all_1;\n    clutter-gtk = clutter_gtk;\n    inherit (gnome3) gnome_icon_theme gnome_icon_theme_symbolic;\n  };\n\n  p0f = callPackage ../tools/security/p0f { };\n\n  pngout = callPackage ../tools/graphics/pngout { };\n\n  hurdPartedCross =\n    if crossSystem != null && crossSystem.config == \"i586-pc-gnu\"\n    then (makeOverridable\n            ({ hurd }:\n              (parted.override {\n                # Needs the Hurd's libstore.\n                inherit hurd;\n\n                # The Hurd wants a libparted.a.\n                enableStatic = true;\n\n                gettext = null;\n                readline = null;\n                devicemapper = null;\n              }).crossDrv)\n           { hurd = gnu.hurdCrossIntermediate; })\n    else null;\n\n  ipsecTools = callPackage ../os-specific/linux/ipsec-tools { flex = flex_2_5_35; };\n\n  patch = gnupatch;\n\n  pbzip2 = callPackage ../tools/compression/pbzip2 { };\n\n  pciutils = callPackage ../tools/system/pciutils { };\n\n  pcsclite = callPackage ../tools/security/pcsclite { };\n\n  pdf2djvu = callPackage ../tools/typesetting/pdf2djvu { };\n\n  pdfjam = callPackage ../tools/typesetting/pdfjam { };\n\n  jbig2enc = callPackage ../tools/graphics/jbig2enc { };\n\n  pdfread = callPackage ../tools/graphics/pdfread { };\n\n  briss = callPackage ../tools/graphics/briss { };\n\n  bully = callPackage ../tools/networking/bully { };\n\n  pdnsd = callPackage ../tools/networking/pdnsd { };\n\n  peco = callPackage ../tools/text/peco { };\n\n  pg_top = callPackage ../tools/misc/pg_top { };\n\n  pdsh = callPackage ../tools/networking/pdsh {\n    rsh = true;          # enable internal rsh implementation\n    ssh = openssh;\n  };\n\n  pfstools = callPackage ../tools/graphics/pfstools { };\n\n  philter = callPackage ../tools/networking/philter { };\n\n  pinentry = callPackage ../tools/security/pinentry { };\n\n  pius = callPackage ../tools/security/pius { };\n\n  pk2cmd = callPackage ../tools/misc/pk2cmd { };\n\n  plantuml = callPackage ../tools/misc/plantuml { };\n\n  plan9port = callPackage ../tools/system/plan9port { };\n\n  ploticus = callPackage ../tools/graphics/ploticus {\n    libpng = libpng12;\n  };\n\n  plotutils = callPackage ../tools/graphics/plotutils { };\n\n  plowshare = callPackage ../tools/misc/plowshare { };\n\n  pngcrush = callPackage ../tools/graphics/pngcrush { };\n\n  pngnq = callPackage ../tools/graphics/pngnq { };\n\n  pngtoico = callPackage ../tools/graphics/pngtoico {\n    libpng = libpng12;\n  };\n\n  pngquant = callPackage ../tools/graphics/pngquant { };\n\n  podiff = callPackage ../tools/text/podiff { };\n\n  poedit = callPackage ../tools/text/poedit { };\n\n  polipo = callPackage ../servers/polipo { };\n\n  polkit_gnome = callPackage ../tools/security/polkit-gnome { };\n\n  ponysay = callPackage ../tools/misc/ponysay { };\n\n  povray = callPackage ../tools/graphics/povray { };\n\n  ppl = callPackage ../development/libraries/ppl { };\n\n  ppp = callPackage ../tools/networking/ppp { };\n\n  pptp = callPackage ../tools/networking/pptp {};\n\n  prey-bash-client = callPackage ../tools/security/prey { };\n\n  projectm = callPackage ../applications/audio/projectm { };\n\n  proxychains = callPackage ../tools/networking/proxychains { };\n\n  proxytunnel = callPackage ../tools/misc/proxytunnel { };\n\n  cntlm = callPackage ../tools/networking/cntlm { };\n\n  pastebinit = callPackage ../tools/misc/pastebinit { };\n\n  psmisc = callPackage ../os-specific/linux/psmisc { };\n\n  pstoedit = callPackage ../tools/graphics/pstoedit { };\n\n  pv = callPackage ../tools/misc/pv { };\n\n  pwgen = callPackage ../tools/security/pwgen { };\n\n  pwnat = callPackage ../tools/networking/pwnat { };\n\n  pycangjie = callPackage ../development/python-modules/pycangjie { };\n\n  pydb = callPackage ../development/tools/pydb { };\n\n  pystringtemplate = callPackage ../development/python-modules/stringtemplate { };\n\n  pythonDBus = dbus_python;\n\n  pythonIRClib = builderDefsPackage (import ../development/python-modules/irclib) {\n    inherit python;\n  };\n\n  pythonSexy = builderDefsPackage (import ../development/python-modules/libsexy) {\n    inherit python libsexy pkgconfig libxml2 pygtk pango gtk glib;\n  };\n\n  openmpi = callPackage ../development/libraries/openmpi { };\n\n  qhull = callPackage ../development/libraries/qhull { };\n\n  qjoypad = callPackage ../tools/misc/qjoypad { };\n\n  qshowdiff = callPackage ../tools/text/qshowdiff { };\n\n  quilt = callPackage ../development/tools/quilt { };\n\n  radvd = callPackage ../tools/networking/radvd { };\n\n  ranger = callPackage ../applications/misc/ranger { };\n\n  privateer = callPackage ../games/privateer { };\n\n  rtmpdump = callPackage ../tools/video/rtmpdump { };\n\n  reaverwps = callPackage ../tools/networking/reaver-wps {};\n\n  recutils = callPackage ../tools/misc/recutils { };\n\n  recoll = callPackage ../applications/search/recoll { };\n\n  reiser4progs = callPackage ../tools/filesystems/reiser4progs { };\n\n  reiserfsprogs = callPackage ../tools/filesystems/reiserfsprogs { };\n\n  relfs = callPackage ../tools/filesystems/relfs {\n    inherit (gnome) gnome_vfs GConf;\n  };\n\n  remarkjs = callPackage ../development/web/remarkjs { };\n\n  remind = callPackage ../tools/misc/remind { };\n\n  remmina = callPackage ../applications/networking/remote/remmina {};\n\n  renameutils = callPackage ../tools/misc/renameutils { };\n\n  replace = callPackage ../tools/text/replace { };\n\n  reptyr = callPackage ../os-specific/linux/reptyr {};\n\n  rdiff_backup = callPackage ../tools/backup/rdiff-backup { };\n\n  rdmd = callPackage ../development/compilers/rdmd { };\n\n  rhash = callPackage ../tools/security/rhash { };\n\n  riemann_c_client = callPackage ../tools/misc/riemann-c-client { };\n\n  ripmime = callPackage ../tools/networking/ripmime {};\n\n  rkflashtool = callPackage ../tools/misc/rkflashtool { };\n\n  rmlint = callPackage ../tools/misc/rmlint {};\n\n  rng_tools = callPackage ../tools/security/rng-tools { };\n\n  rsnapshot = callPackage ../tools/backup/rsnapshot {\n    # For the `logger' command, we can use either `utillinux' or\n    # GNU Inetutils.  The latter is more portable.\n    logger = inetutils;\n  };\n\n  rlwrap = callPackage ../tools/misc/rlwrap { };\n\n  rockbox_utility = callPackage ../tools/misc/rockbox-utility { };\n\n  rpPPPoE = builderDefsPackage (import ../tools/networking/rp-pppoe) {\n    inherit ppp;\n  };\n\n  rpm = callPackage ../tools/package-management/rpm { };\n\n  rrdtool = callPackage ../tools/misc/rrdtool { };\n\n  rtorrent = callPackage ../tools/networking/p2p/rtorrent { };\n\n  rubber = callPackage ../tools/typesetting/rubber { };\n\n  rxp = callPackage ../tools/text/xml/rxp { };\n\n  rzip = callPackage ../tools/compression/rzip { };\n\n  s3backer = callPackage ../tools/filesystems/s3backer { };\n\n  s3cmd = callPackage ../tools/networking/s3cmd { };\n\n  s3cmd_15_pre_81e3842f7a = lowPrio (callPackage ../tools/networking/s3cmd/git.nix { });\n\n  s3sync = callPackage ../tools/networking/s3sync {\n    ruby = ruby18;\n  };\n\n  sablotron = callPackage ../tools/text/xml/sablotron { };\n\n  safecopy = callPackage ../tools/system/safecopy { };\n\n  salut_a_toi = callPackage ../applications/networking/instant-messengers/salut-a-toi {};\n\n  samplicator = callPackage ../tools/networking/samplicator { };\n\n  screen = callPackage ../tools/misc/screen { };\n\n  scrot = callPackage ../tools/graphics/scrot { };\n\n  scrypt = callPackage ../tools/security/scrypt { };\n\n  sdcv = callPackage ../applications/misc/sdcv { };\n\n  sec = callPackage ../tools/admin/sec { };\n\n  seccure = callPackage ../tools/security/seccure { };\n\n  setserial = builderDefsPackage (import ../tools/system/setserial) {\n    inherit groff;\n  };\n\n  seqdiag = pythonPackages.seqdiag;\n\n  screenfetch = callPackage ../tools/misc/screenfetch { };\n\n  sg3_utils = callPackage ../tools/system/sg3_utils { };\n\n  sharutils = callPackage ../tools/archivers/sharutils { };\n\n  shotwell = callPackage ../applications/graphics/shotwell { };\n\n  shebangfix = callPackage ../tools/misc/shebangfix { };\n\n  shellinabox = callPackage ../servers/shellinabox { };\n\n  siege = callPackage ../tools/networking/siege {};\n\n  silc_client = callPackage ../applications/networking/instant-messengers/silc-client { };\n\n  silc_server = callPackage ../servers/silc-server { };\n\n  silver-searcher = callPackage ../tools/text/silver-searcher { };\n\n  simplescreenrecorder = callPackage ../applications/video/simplescreenrecorder { };\n\n  sleuthkit = callPackage ../tools/system/sleuthkit {};\n\n  slimrat = callPackage ../tools/networking/slimrat {\n    inherit (perlPackages) WWWMechanize LWP;\n  };\n\n  slsnif = callPackage ../tools/misc/slsnif { };\n\n  smartmontools = callPackage ../tools/system/smartmontools { };\n\n  smbldaptools = callPackage ../tools/networking/smbldaptools {\n    inherit (perlPackages) NetLDAP CryptSmbHash DigestSHA1;\n  };\n\n  smbnetfs = callPackage ../tools/filesystems/smbnetfs {};\n\n  snort = callPackage ../applications/networking/ids/snort { };\n\n  snx = callPackage_i686 ../tools/networking/snx {\n    inherit (pkgsi686Linux) pam gcc33;\n    inherit (pkgsi686Linux.xlibs) libX11;\n  };\n\n  solr = callPackage ../servers/search/solr { };\n\n  sparsehash = callPackage ../development/libraries/sparsehash { };\n\n  spiped = callPackage ../tools/networking/spiped { };\n\n  sproxy = haskellPackages.callPackage ../tools/networking/sproxy { };\n\n  sproxy-web = haskellPackages.callPackage ../tools/networking/sproxy-web { };\n\n  stardict = callPackage ../applications/misc/stardict/stardict.nix {\n    inherit (gnome) libgnomeui scrollkeeper;\n  };\n\n  storebrowse = callPackage ../tools/system/storebrowse { };\n\n  fusesmb = callPackage ../tools/filesystems/fusesmb { };\n\n  sl = callPackage ../tools/misc/sl { };\n\n  socat = callPackage ../tools/networking/socat { };\n\n  socat2pre = lowPrio (callPackage ../tools/networking/socat/2.x.nix { });\n\n  sourceHighlight = callPackage ../tools/text/source-highlight {\n    # Boost 1.54 causes the \"test_regexranges\" test to fail\n    boost = boost149;\n  };\n\n  spaceFM = callPackage ../applications/misc/spacefm { };\n\n  squashfsTools = callPackage ../tools/filesystems/squashfs { };\n\n  sshfsFuse = callPackage ../tools/filesystems/sshfs-fuse { };\n\n  sshuttle = callPackage ../tools/security/sshuttle { };\n\n  sudo = callPackage ../tools/security/sudo { };\n\n  suidChroot = builderDefsPackage (import ../tools/system/suid-chroot) { };\n\n  super = callPackage ../tools/security/super { };\n\n  ssdeep = callPackage ../tools/security/ssdeep { };\n\n  ssmtp = callPackage ../tools/networking/ssmtp {\n    tlsSupport = true;\n  };\n\n  ssss = callPackage ../tools/security/ssss { };\n\n  storeBackup = callPackage ../tools/backup/store-backup { };\n\n  stow = callPackage ../tools/misc/stow { };\n\n  stun = callPackage ../tools/networking/stun { };\n\n  stunnel = callPackage ../tools/networking/stunnel { };\n\n  su = shadow.su;\n\n  surfraw = callPackage ../tools/networking/surfraw { };\n\n  swec = callPackage ../tools/networking/swec {\n    inherit (perlPackages) LWP URI HTMLParser HTTPServerSimple Parent;\n  };\n\n  svnfs = callPackage ../tools/filesystems/svnfs { };\n\n  sysbench = callPackage ../development/tools/misc/sysbench {};\n\n  system_config_printer = callPackage ../tools/misc/system-config-printer {\n    libxml2 = libxml2Python;\n   };\n\n  sitecopy = callPackage ../tools/networking/sitecopy { };\n\n  stricat = callPackage ../tools/security/stricat { };\n\n  privoxy = callPackage ../tools/networking/privoxy { };\n\n  t1utils = callPackage ../tools/misc/t1utils { };\n\n  tarsnap = callPackage ../tools/backup/tarsnap { };\n\n  tcpcrypt = callPackage ../tools/security/tcpcrypt { };\n\n  tboot = callPackage ../tools/security/tboot { };\n\n  tcpdump = callPackage ../tools/networking/tcpdump { };\n\n  tcpflow = callPackage ../tools/networking/tcpflow { };\n\n  teamviewer = callPackage_i686 ../applications/networking/remote/teamviewer { };\n\n  # Work In Progress: it doesn't start unless running a daemon as root\n  teamviewer8 = lowPrio (callPackage_i686 ../applications/networking/remote/teamviewer/8.nix { });\n\n  telnet = callPackage ../tools/networking/telnet { };\n\n  texmacs = callPackage ../applications/editors/texmacs {\n    tex = texLive; /* tetex is also an option */\n    extraFonts = true;\n    guile = guile_1_8;\n  };\n\n  texmaker = callPackage ../applications/editors/texmaker { };\n\n  texstudio = callPackage ../applications/editors/texstudio { };\n\n  tiled-qt = callPackage ../applications/editors/tiled-qt { qt = qt4; };\n\n  tinc = callPackage ../tools/networking/tinc { };\n\n  tiny8086 = callPackage ../applications/virtualization/8086tiny { };\n\n  tmpwatch = callPackage ../tools/misc/tmpwatch  { };\n\n  tmux = callPackage ../tools/misc/tmux { };\n\n  tor = callPackage ../tools/security/tor { };\n\n  torbutton = callPackage ../tools/security/torbutton { };\n\n  torbrowser = callPackage ../tools/security/tor/torbrowser.nix { };\n\n  torsocks = callPackage ../tools/security/tor/torsocks.nix { };\n\n  tpm-quote-tools = callPackage ../tools/security/tpm-quote-tools { };\n\n  tpm-tools = callPackage ../tools/security/tpm-tools { };\n\n  trickle = callPackage ../tools/networking/trickle {};\n\n  trousers = callPackage ../tools/security/trousers { };\n\n  ttf2pt1 = callPackage ../tools/misc/ttf2pt1 { };\n\n  ttysnoop = callPackage ../os-specific/linux/ttysnoop {};\n\n  twitterBootstrap = callPackage ../development/web/twitter-bootstrap {};\n\n  txt2man = callPackage ../tools/misc/txt2man { };\n\n  ucl = callPackage ../development/libraries/ucl { };\n\n  ucspi-tcp = callPackage ../tools/networking/ucspi-tcp { };\n\n  udftools = callPackage ../tools/filesystems/udftools {};\n\n  udptunnel = callPackage ../tools/networking/udptunnel { };\n\n  ufraw = callPackage ../applications/graphics/ufraw { };\n\n  unetbootin = callPackage ../tools/cd-dvd/unetbootin { };\n\n  unfs3 = callPackage ../servers/unfs3 { };\n\n  unoconv = callPackage ../tools/text/unoconv { };\n\n  upx = callPackage ../tools/compression/upx { };\n\n  urlview = callPackage ../applications/misc/urlview {};\n\n  usbmuxd = callPackage ../tools/misc/usbmuxd {};\n\n  vacuum = callPackage ../applications/networking/instant-messengers/vacuum {};\n\n  volatility = callPackage ../tools/security/volatility { };\n\n  vidalia = callPackage ../tools/security/vidalia { };\n\n  vbetool = builderDefsPackage ../tools/system/vbetool {\n    inherit pciutils libx86 zlib;\n  };\n\n  vde2 = callPackage ../tools/networking/vde2 { };\n\n  vboot_reference = callPackage ../tools/system/vboot_reference { };\n\n  vcsh = callPackage ../applications/version-management/vcsh { };\n\n  verilog = callPackage ../applications/science/electronics/verilog {};\n\n  vfdecrypt = callPackage ../tools/misc/vfdecrypt { };\n\n  vifm = callPackage ../applications/misc/vifm { };\n\n  viking = callPackage ../applications/misc/viking {\n    inherit (gnome) scrollkeeper;\n  };\n\n  vnc2flv = callPackage ../tools/video/vnc2flv {};\n\n  vncrec = builderDefsPackage ../tools/video/vncrec {\n    inherit (xlibs) imake libX11 xproto gccmakedep libXt\n      libXmu libXaw libXext xextproto libSM libICE libXpm\n      libXp;\n  };\n\n  vobcopy = callPackage ../tools/cd-dvd/vobcopy { };\n\n  vobsub2srt = callPackage ../tools/cd-dvd/vobsub2srt { };\n\n  vorbisgain = callPackage ../tools/misc/vorbisgain { };\n\n  vpnc = callPackage ../tools/networking/vpnc { };\n\n  openconnect = callPackage ../tools/networking/openconnect.nix { };\n\n  vtun = callPackage ../tools/networking/vtun { };\n\n  wal_e = callPackage ../tools/backup/wal-e { };\n\n  watchman = callPackage ../development/tools/watchman { };\n\n  wbox = callPackage ../tools/networking/wbox {};\n\n  welkin = callPackage ../tools/graphics/welkin {};\n\n  testdisk = callPackage ../tools/misc/testdisk { };\n\n  htmlTidy = callPackage ../tools/text/html-tidy { };\n\n  html-xml-utils = callPackage ../tools/text/xml/html-xml-utils { };\n\n  tftp_hpa = callPackage ../tools/networking/tftp-hpa {};\n\n  tigervnc = callPackage ../tools/admin/tigervnc {\n    fontDirectories = [ xorg.fontadobe75dpi xorg.fontmiscmisc xorg.fontcursormisc\n      xorg.fontbhlucidatypewriter75dpi ];\n    inherit (xorg) xorgserver;\n    fltk = fltk13;\n  };\n\n  tightvnc = callPackage ../tools/admin/tightvnc {\n    fontDirectories = [ xorg.fontadobe75dpi xorg.fontmiscmisc xorg.fontcursormisc\n      xorg.fontbhlucidatypewriter75dpi ];\n  };\n\n  time = callPackage ../tools/misc/time { };\n\n  tkabber = callPackage ../applications/networking/instant-messengers/tkabber { };\n\n  qfsm = callPackage ../applications/science/electronics/qfsm { };\n\n  tkgate = callPackage ../applications/science/electronics/tkgate/1.x.nix {\n    inherit (xlibs) libX11 imake xproto gccmakedep;\n  };\n\n  # The newer package is low-priority because it segfaults at startup.\n  tkgate2 = lowPrio (callPackage ../applications/science/electronics/tkgate/2.x.nix {\n    inherit (xlibs) libX11;\n  });\n\n  tm = callPackage ../tools/system/tm { };\n\n  trang = callPackage ../tools/text/xml/trang { };\n\n  tre = callPackage ../development/libraries/tre { };\n\n  ts = callPackage ../tools/system/ts { };\n\n  transfig = callPackage ../tools/graphics/transfig {\n    libpng = libpng12;\n  };\n\n  truecrypt = callPackage ../applications/misc/truecrypt {\n    wxGUI = config.truecrypt.wxGUI or true;\n  };\n\n  ttmkfdir = callPackage ../tools/misc/ttmkfdir { };\n\n  unclutter = callPackage ../tools/misc/unclutter { };\n\n  unbound = callPackage ../tools/networking/unbound { };\n\n  units = callPackage ../tools/misc/units { };\n\n  unrar = callPackage ../tools/archivers/unrar { };\n\n  xarchive = callPackage ../tools/archivers/xarchive { };\n\n  xarchiver = callPackage ../tools/archivers/xarchiver { };\n\n  xcruiser = callPackage ../applications/misc/xcruiser { };\n\n  unarj = callPackage ../tools/archivers/unarj { };\n\n  unshield = callPackage ../tools/archivers/unshield { };\n\n  unzip = callPackage ../tools/archivers/unzip { };\n\n  unzipNLS = lowPrio (unzip.override { enableNLS = true; });\n\n  uptimed = callPackage ../tools/system/uptimed { };\n\n  varnish = callPackage ../servers/varnish { };\n\n  varnish2 = callPackage ../servers/varnish/2.1.nix { };\n\n  venus = callPackage ../tools/misc/venus {\n    python = python27;\n  };\n\n  vlan = callPackage ../tools/networking/vlan { };\n\n  wakelan = callPackage ../tools/networking/wakelan { };\n\n  wavemon = callPackage ../tools/networking/wavemon { };\n\n  w3cCSSValidator = callPackage ../tools/misc/w3c-css-validator {\n    tomcat = tomcat6;\n  };\n\n  wdfs = callPackage ../tools/filesystems/wdfs { };\n\n  wdiff = callPackage ../tools/text/wdiff { };\n\n  webalizer = callPackage ../tools/networking/webalizer { };\n\n  webdruid = builderDefsPackage ../tools/admin/webdruid {\n    inherit zlib libpng freetype gd which\n      libxml2 geoip;\n  };\n\n  weighttp = callPackage ../tools/networking/weighttp { };\n\n  wget = callPackage ../tools/networking/wget {\n    inherit (perlPackages) LWP;\n  };\n\n  which = callPackage ../tools/system/which { };\n\n  wicd = callPackage ../tools/networking/wicd { };\n\n  wkhtmltopdf = callPackage ../tools/graphics/wkhtmltopdf { };\n\n  wv = callPackage ../tools/misc/wv { };\n\n  wv2 = callPackage ../tools/misc/wv2 { };\n\n  x86info = callPackage ../os-specific/linux/x86info { };\n\n  x11_ssh_askpass = callPackage ../tools/networking/x11-ssh-askpass { };\n\n  xbursttools = assert stdenv ? glibc; import ../tools/misc/xburst-tools {\n    inherit stdenv fetchgit autoconf automake confuse pkgconfig libusb libusb1;\n    # It needs a cross compiler for mipsel to build the firmware it will\n    # load into the Ben Nanonote\n    gccCross =\n      let\n        pkgsCross = (import ./all-packages.nix) {\n          inherit system;\n          inherit bootStdenv noSysDirs gccWithCC gccWithProfiling config;\n          # Ben Nanonote system\n          crossSystem = {\n            config = \"mipsel-unknown-linux\";\n            bigEndian = true;\n            arch = \"mips\";\n            float = \"soft\";\n            withTLS = true;\n            libc = \"uclibc\";\n            platform = {\n              name = \"ben_nanonote\";\n              kernelMajor = \"2.6\";\n              # It's not a bcm47xx processor, but for the headers this should work\n              kernelHeadersBaseConfig = \"bcm47xx_defconfig\";\n              kernelArch = \"mips\";\n            };\n            gcc = {\n              arch = \"mips32\";\n            };\n          };\n        };\n      in\n        pkgsCross.gccCrossStageStatic;\n  };\n\n  xclip = callPackage ../tools/misc/xclip { };\n\n  xtitle = callPackage ../tools/misc/xtitle { };\n\n  xdelta = callPackage ../tools/compression/xdelta { };\n\n  xdummy = callPackage ../tools/misc/xdummy { };\n\n  xfsprogs = callPackage ../tools/filesystems/xfsprogs { };\n\n  xmlroff = callPackage ../tools/typesetting/xmlroff {\n    inherit (gnome) libgnomeprint;\n  };\n\n  xmlstarlet = callPackage ../tools/text/xml/xmlstarlet { };\n\n  xmlto = callPackage ../tools/typesetting/xmlto { };\n\n  xmltv = callPackage ../tools/misc/xmltv { };\n\n  xmpppy = builderDefsPackage (import ../development/python-modules/xmpppy) {\n    inherit python setuptools;\n  };\n\n  xorriso = callPackage ../tools/cd-dvd/xorriso { };\n\n  xpf = callPackage ../tools/text/xml/xpf {\n    libxml2 = libxml2Python;\n  };\n\n  xsel = callPackage ../tools/misc/xsel { };\n\n  xtreemfs = callPackage ../tools/filesystems/xtreemfs {};\n\n  xvfb_run = callPackage ../tools/misc/xvfb-run { inherit (texFunctions) fontsConf; };\n\n  youtubeDL = callPackage ../tools/misc/youtube-dl { };\n\n  zbar = callPackage ../tools/graphics/zbar {\n    pygtk = lib.overrideDerivation pygtk (x: {\n      gtk = gtk2;\n    });\n  };\n\n  zdelta = callPackage ../tools/compression/zdelta { };\n\n  zfstools = callPackage ../tools/filesystems/zfstools {\n    zfs = linuxPackages.zfs;\n  };\n\n  zile = callPackage ../applications/editors/zile { };\n\n  zip = callPackage ../tools/archivers/zip { };\n\n  zpaq = callPackage ../tools/archivers/zpaq { };\n  zpaqd = callPackage ../tools/archivers/zpaq/zpaqd.nix { };\n\n  zsync = callPackage ../tools/compression/zsync { };\n\n\n  ### SHELLS\n\n  bash = lowPrio (callPackage ../shells/bash {\n    texinfo = null;\n  });\n\n  bashInteractive = appendToName \"interactive\" (callPackage ../shells/bash {\n    interactive = true;\n    readline = readline63; # Includes many vi mode fixes\n  });\n\n  bashCompletion = callPackage ../shells/bash-completion { };\n\n  dash = callPackage ../shells/dash { };\n\n  fish = callPackage ../shells/fish {\n    python = python27Full;\n  };\n\n  tcsh = callPackage ../shells/tcsh { };\n\n  rush = callPackage ../shells/rush { };\n\n  zsh = callPackage ../shells/zsh { };\n\n\n  ### DEVELOPMENT / COMPILERS\n\n  abc =\n    abcPatchable [];\n\n  abcPatchable = patches :\n    import ../development/compilers/abc/default.nix {\n      inherit stdenv fetchurl patches jre apacheAnt;\n      javaCup = callPackage ../development/libraries/java/cup { };\n    };\n\n  aldor = callPackage ../development/compilers/aldor { };\n\n  aliceml = callPackage ../development/compilers/aliceml { };\n\n  aspectj = callPackage ../development/compilers/aspectj { };\n\n  ats = callPackage ../development/compilers/ats { };\n  ats2 = callPackage ../development/compilers/ats2 { };\n\n  avra = callPackage ../development/compilers/avra { };\n\n  bigloo = callPackage ../development/compilers/bigloo { };\n\n  chicken = callPackage ../development/compilers/chicken { };\n\n  ccl = builderDefsPackage ../development/compilers/ccl {};\n\n  clang = wrapClang llvmPackages.clang;\n\n  clang_34 = wrapClang llvmPackages_34.clang;\n  clang_33 = wrapClang (clangUnwrapped llvm_33 ../development/compilers/llvm/3.3/clang.nix);\n\n  clangAnalyzer = callPackage ../development/tools/analysis/clang-analyzer {\n    clang = clang_34;\n    llvmPackages = llvmPackages_34;\n  };\n\n  clangUnwrapped = llvm: pkg: callPackage pkg {\n    stdenv = if stdenv.isDarwin then stdenvApple else stdenv;\n    inherit llvm;\n  };\n\n  clangSelf = clangWrapSelf llvmPackagesSelf.clang;\n\n  clangWrapSelf = build: (import ../build-support/clang-wrapper) {\n    clang = build;\n    stdenv = clangStdenv;\n    libc = glibc;\n    binutils = binutils;\n    shell = bash;\n    inherit libcxx coreutils zlib;\n    nativeTools = false;\n    nativeLibc = false;\n  };\n\n  #Use this instead of stdenv to build with clang\n  clangStdenv = lowPrio (stdenvAdapters.overrideGCC stdenv clang);\n  libcxxStdenv = stdenvAdapters.overrideGCC stdenv (clangWrapSelf llvmPackages.clang);\n\n  clean = callPackage ../development/compilers/clean { };\n\n  closurecompiler = callPackage ../development/compilers/closure { };\n\n  cmucl_binary = callPackage ../development/compilers/cmucl/binary.nix { };\n\n  compcert = callPackage ../development/compilers/compcert {};\n\n  cryptol1 = lowPrio (callPackage ../development/compilers/cryptol/1.8.x.nix {});\n  cryptol2 = with haskellPackages_ghc763; callPackage ../development/compilers/cryptol/2.0.x.nix {\n    Cabal = Cabal_1_18_1_3;\n    cabalInstall = cabalInstall_1_18_0_3;\n    process = process_1_2_0_0;\n  };\n\n  cython = pythonPackages.cython;\n  cython3 = python3Packages.cython;\n\n  dylan = callPackage ../development/compilers/gwydion-dylan {\n    dylan = callPackage ../development/compilers/gwydion-dylan/binary.nix {  };\n  };\n\n  ecl = callPackage ../development/compilers/ecl { };\n\n  eql = callPackage ../development/compilers/eql {};\n\n  adobe_flex_sdk = callPackage ../development/compilers/adobe-flex-sdk { };\n\n  fpc = callPackage ../development/compilers/fpc { };\n  fpc_2_4_0 = callPackage ../development/compilers/fpc/2.4.0.nix { };\n\n  gambit = callPackage ../development/compilers/gambit { };\n\n  gcc = gcc48;\n\n  gcc33 = wrapGCC (import ../development/compilers/gcc/3.3 {\n    inherit fetchurl stdenv noSysDirs;\n  });\n\n  gcc34 = wrapGCC (import ../development/compilers/gcc/3.4 {\n    inherit fetchurl stdenv noSysDirs;\n  });\n\n  gcc48_realCross = lib.addMetaAttrs { hydraPlatforms = []; }\n    (callPackage ../development/compilers/gcc/4.8 {\n      inherit noSysDirs;\n      binutilsCross = binutilsCross;\n      libcCross = libcCross;\n      profiledCompiler = false;\n      enableMultilib = false;\n      crossStageStatic = false;\n      cross = assert crossSystem != null; crossSystem;\n    });\n\n  gcc_realCross = gcc48_realCross;\n\n  gccCrossStageStatic = let\n      libcCross1 =\n        if stdenv.cross.libc == \"msvcrt\" then windows.mingw_w64_headers\n        else if stdenv.cross.libc == \"libSystem\" then darwin.xcode\n        else null;\n    in\n      wrapGCCCross {\n      gcc = forceNativeDrv (lib.addMetaAttrs { hydraPlatforms = []; } (\n        gcc_realCross.override {\n          crossStageStatic = true;\n          langCC = false;\n          libcCross = libcCross1;\n          enableShared = false;\n        }));\n      libc = libcCross1;\n      binutils = binutilsCross;\n      cross = assert crossSystem != null; crossSystem;\n  };\n\n  # Only needed for mingw builds\n  gccCrossMingw2 = wrapGCCCross {\n    gcc = gccCrossStageStatic.gcc;\n    libc = windows.mingw_headers2;\n    binutils = binutilsCross;\n    cross = assert crossSystem != null; crossSystem;\n  };\n\n  gccCrossStageFinal = wrapGCCCross {\n    gcc = forceNativeDrv (gcc_realCross.override {\n      libpthreadCross =\n        # FIXME: Don't explicitly refer to `i586-pc-gnu'.\n        if crossSystem != null && crossSystem.config == \"i586-pc-gnu\"\n        then gnu.libpthreadCross\n        else null;\n\n      # XXX: We have troubles cross-compiling libstdc++ on MinGW (see\n      # <http://hydra.nixos.org/build/4268232>), so don't even try.\n      langCC = (crossSystem == null\n                || crossSystem.config != \"i686-pc-mingw32\");\n     });\n    libc = libcCross;\n    binutils = binutilsCross;\n    cross = assert crossSystem != null; crossSystem;\n  };\n\n  gcc44 = lowPrio (wrapGCC (makeOverridable (import ../development/compilers/gcc/4.4) {\n    inherit fetchurl stdenv gmp mpfr /* ppl cloogppl */\n      gettext which noSysDirs;\n    texinfo = texinfo4;\n    profiledCompiler = true;\n  }));\n\n  gcc45 = lowPrio (wrapGCC (callPackage ../development/compilers/gcc/4.5 {\n    inherit fetchurl stdenv gmp mpfr mpc libelf zlib perl\n      gettext which noSysDirs;\n    texinfo = texinfo4;\n\n    ppl = null;\n    cloogppl = null;\n\n    # bootstrapping a profiled compiler does not work in the sheevaplug:\n    # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43944\n    profiledCompiler = !stdenv.isArm;\n\n    # When building `gcc.crossDrv' (a \"Canadian cross\", with host == target\n    # and host != build), `cross' must be null but the cross-libc must still\n    # be passed.\n    cross = null;\n    libcCross = if crossSystem != null then libcCross else null;\n    libpthreadCross =\n      if crossSystem != null && crossSystem.config == \"i586-pc-gnu\"\n      then gnu.libpthreadCross\n      else null;\n  }));\n\n  gcc46 = lowPrio (wrapGCC (callPackage ../development/compilers/gcc/4.6 {\n    inherit noSysDirs;\n\n    ppl = null;\n    cloog = null;\n\n    # bootstrapping a profiled compiler does not work in the sheevaplug:\n    # http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43944\n    profiledCompiler = false;\n\n    # When building `gcc.crossDrv' (a \"Canadian cross\", with host == target\n    # and host != build), `cross' must be null but the cross-libc must still\n    # be passed.\n    cross = null;\n    libcCross = if crossSystem != null then libcCross else null;\n    libpthreadCross =\n      if crossSystem != null && crossSystem.config == \"i586-pc-gnu\"\n      then gnu.libpthreadCross\n      else null;\n    texinfo = texinfo413;\n  }));\n\n  gcc48 = lowPrio (wrapGCC (callPackage ../development/compilers/gcc/4.8 {\n    inherit noSysDirs;\n\n    # PGO seems to speed up compilation by gcc by ~10%, see #445 discussion\n    profiledCompiler = with stdenv; (!isDarwin && (isi686 || isx86_64));\n\n    # When building `gcc.crossDrv' (a \"Canadian cross\", with host == target\n    # and host != build), `cross' must be null but the cross-libc must still\n    # be passed.\n    cross = null;\n    libcCross = if crossSystem != null then libcCross else null;\n    libpthreadCross =\n      if crossSystem != null && crossSystem.config == \"i586-pc-gnu\"\n      then gnu.libpthreadCross\n      else null;\n  }));\n\n  gcc48_multi =\n    if system == \"x86_64-linux\" then lowPrio (\n      wrapGCCWith (import ../build-support/gcc-wrapper) glibc_multi (gcc48.gcc.override {\n        stdenv = overrideGCC stdenv (wrapGCCWith (import ../build-support/gcc-wrapper) glibc_multi gcc.gcc);\n        profiledCompiler = false;\n        enableMultilib = true;\n      }))\n    else throw \"Multilib gcc not supported on ‘${system}’\";\n\n  gcc48_debug = lowPrio (wrapGCC (callPackage ../development/compilers/gcc/4.8 {\n    stripped = false;\n\n    inherit noSysDirs;\n    cross = null;\n    libcCross = null;\n    binutilsCross = null;\n  }));\n\n  gcc49 = lowPrio (wrapGCC (callPackage ../development/compilers/gcc/4.9 {\n    inherit noSysDirs;\n\n    # PGO seems to speed up compilation by gcc by ~10%, see #445 discussion\n    profiledCompiler = with stdenv; (!isDarwin && (isi686 || isx86_64));\n\n    # When building `gcc.crossDrv' (a \"Canadian cross\", with host == target\n    # and host != build), `cross' must be null but the cross-libc must still\n    # be passed.\n    cross = null;\n    libcCross = if crossSystem != null then libcCross else null;\n    libpthreadCross =\n      if crossSystem != null && crossSystem.config == \"i586-pc-gnu\"\n      then gnu.libpthreadCross\n      else null;\n  }));\n\n  gccApple =\n    assert stdenv.isDarwin;\n    wrapGCC (makeOverridable (import ../development/compilers/gcc/4.2-apple64) {\n      inherit fetchurl noSysDirs;\n      profiledCompiler = true;\n      # Since it fails to build with GCC 4.6, build it with the \"native\"\n      # Apple-GCC.\n      stdenv = allStdenvs.stdenvNative;\n    });\n\n  gfortran = gfortran48;\n\n  gfortran48 = wrapGCC (gcc48.gcc.override {\n    name = \"gfortran\";\n    langFortran = true;\n    langCC = false;\n    langC = false;\n    profiledCompiler = false;\n  });\n\n  gcj = gcj48;\n\n  gcj48 = wrapGCC (gcc48.gcc.override {\n    name = \"gcj\";\n    langJava = true;\n    langFortran = false;\n    langCC = false;\n    langC = false;\n    profiledCompiler = false;\n    inherit zip unzip zlib boehmgc gettext pkgconfig perl;\n    inherit gtk;\n    inherit (gnome) libart_lgpl;\n    inherit (xlibs) libX11 libXt libSM libICE libXtst libXi libXrender\n      libXrandr xproto renderproto xextproto inputproto randrproto;\n  });\n\n  gnat = gnat45;\n\n  gnat45 = wrapGCC (gcc45.gcc.override {\n    name = \"gnat\";\n    langCC = false;\n    langC = true;\n    langAda = true;\n    profiledCompiler = false;\n    inherit gnatboot;\n    # We can't use the ppl stuff, because we would have\n    # libstdc++ problems.\n    cloogppl = null;\n    ppl = null;\n  });\n\n  gnat46 = wrapGCC (gcc46.gcc.override {\n    name = \"gnat\";\n    langCC = false;\n    langC = true;\n    langAda = true;\n    profiledCompiler = false;\n    gnatboot = gnat45;\n    # We can't use the ppl stuff, because we would have\n    # libstdc++ problems.\n    ppl = null;\n    cloog = null;\n  });\n\n  gnatboot = wrapGCC (import ../development/compilers/gnatboot {\n    inherit fetchurl stdenv;\n  });\n\n  gccgo = gccgo48;\n\n  gccgo48 = wrapGCC (gcc48.gcc.override {\n    name = \"gccgo\";\n    langCC = true; #required for go.\n    langC = true;\n    langGo = true;\n  });\n\n  ghdl = wrapGCC (import ../development/compilers/gcc/4.3 {\n    inherit stdenv fetchurl gmp mpfr noSysDirs gnat;\n    texinfo = texinfo4;\n    name = \"ghdl\";\n    langVhdl = true;\n    langCC = false;\n    langC = false;\n    profiledCompiler = false;\n    enableMultilib = false;\n  });\n\n  ghdl_mcode = callPackage ../development/compilers/ghdl { };\n\n  gcl = builderDefsPackage ../development/compilers/gcl {\n    inherit mpfr m4 binutils fetchcvs emacs zlib which\n      texinfo;\n    gmp = gmp4;\n    inherit (xlibs) libX11 xproto inputproto libXi\n      libXext xextproto libXt libXaw libXmu;\n    inherit stdenv;\n    texLive = texLiveAggregationFun {\n      paths = [\n        texLive texLiveExtra\n      ];\n    };\n  };\n\n  jhc = callPackage ../development/compilers/jhc {\n    inherit (haskellPackages_ghc763) ghc binary zlib utf8String readline fgl\n      regexCompat HsSyck random;\n  };\n\n  gcc-arm-embedded-4_7 = callPackage_i686 ../development/compilers/gcc-arm-embedded {\n    version = \"4.7-2013q3-20130916\";\n    releaseType = \"update\";\n    sha256 = \"1bd9bi9q80xn2rpy0rn1vvj70rh15kb7dmah0qs4q2rv78fqj40d\";\n  };\n  gcc-arm-embedded-4_8 = callPackage_i686 ../development/compilers/gcc-arm-embedded {\n    version = \"4.8-2014q1-20140314\";\n    releaseType = \"update\";\n    sha256 = \"ce92859550819d4a3d1a6e2672ea64882b30afa2c08cf67fa8e1d93788c2c577\";\n  };\n  gcc-arm-embedded = gcc-arm-embedded-4_8;\n\n  # Haskell and GHC\n\n  # Import Haskell infrastructure.\n\n  haskell = let pkgs_       = pkgs // { gmp = gmp.override { withStatic = true; }; };\n                callPackage = newScope pkgs_;\n                newScope    = extra: lib.callPackageWith (pkgs_ // pkgs_.xorg // extra);\n            in callPackage ./haskell-defaults.nix { pkgs = pkgs_; inherit callPackage newScope; };\n\n  # Available GHC versions.\n\n  # For several compiler versions, we export a large set of Haskell-related\n  # packages.\n\n  # NOTE (recurseIntoAttrs): After discussion, we originally decided to\n  # enable it for all GHC versions. However, this is getting too much,\n  # particularly in connection with Hydra builds for all these packages.\n  # So we enable it for selected versions only. We build all ghcs, though\n\n  ghc = recurseIntoAttrs (lib.mapAttrs' (name: value:\n    lib.nameValuePair (builtins.substring (builtins.stringLength \"packages_\") (builtins.stringLength name) name) value.ghc\n  ) (lib.filterAttrs (name: value:\n    builtins.substring 0 (builtins.stringLength \"packages_\") name == \"packages_\"\n  ) haskell));\n\n  haskellPackages = haskellPackages_ghc783;\n  haskellPlatform = haskellPlatformPackages.\"2013_2_0_0\";\n\n  haskellPackages_ghc6104 = haskell.packages_ghc6104;\n  haskellPackages_ghc6123 = haskell.packages_ghc6123;\n  haskellPackages_ghc704  = haskell.packages_ghc704;\n  haskellPackages_ghc722  = haskell.packages_ghc722;\n  haskellPackages_ghc742  = haskell.packages_ghc742;\n  haskellPackages_ghc763  = haskell.packages_ghc763;\n  haskellPackages_ghc783_no_profiling = recurseIntoAttrs haskell.packages_ghc783.noProfiling;\n  haskellPackages_ghc783_profiling    = recurseIntoAttrs haskell.packages_ghc783.profiling;\n  haskellPackages_ghc783              = recurseIntoAttrs haskell.packages_ghc783.highPrio;\n  haskellPackages_ghcHEAD = haskell.packages_ghcHEAD;\n\n  haskellPlatformPackages = recurseIntoAttrs (import ../development/libraries/haskell/haskell-platform { inherit pkgs; });\n\n  haxe = callPackage ../development/compilers/haxe { };\n\n  hhvm = callPackage ../development/compilers/hhvm { };\n  hiphopvm = hhvm; /* Compatibility alias */\n\n  falcon = builderDefsPackage (import ../development/interpreters/falcon) {\n    inherit cmake;\n  };\n\n  fsharp = callPackage ../development/compilers/fsharp {};\n\n  go_1_0 = callPackage ../development/compilers/go { };\n\n  go_1_1 =\n    if stdenv.isDarwin then\n      callPackage ../development/compilers/go/1.1-darwin.nix { }\n    else\n      callPackage ../development/compilers/go/1.1.nix { };\n\n  go_1_2 = callPackage ../development/compilers/go/1.2.nix { };\n\n  go_1_3 = callPackage ../development/compilers/go/1.3.nix { };\n\n  go = go_1_3;\n\n  gox = callPackage ../development/compilers/go/gox.nix { };\n\n  gprolog = callPackage ../development/compilers/gprolog { };\n\n  gwt240 = callPackage ../development/compilers/gwt/2.4.0.nix { };\n\n  icedtea7_jdk = callPackage ../development/compilers/icedtea rec {\n    jdk = openjdk;\n    jdkPath = \"${openjdk}/lib/openjdk\";\n  } // { outputs = [ \"out\" ]; };\n\n  icedtea7_jre = (lib.setName \"icedtea7-${lib.getVersion pkgs.icedtea7_jdk.jre}\" (lib.addMetaAttrs\n    { description = \"Free Java runtime environment based on OpenJDK 7.0 and the IcedTea project\"; }\n    pkgs.icedtea7_jdk.jre)) // { outputs = [ \"jre\" ]; };\n\n  icedtea7_web = callPackage ../development/compilers/icedtea-web {\n    jdk = \"${icedtea7_jdk}/lib/icedtea\";\n  };\n\n  ikarus = callPackage ../development/compilers/ikarus { };\n\n  hugs = callPackage ../development/compilers/hugs { };\n\n  path64 = callPackage ../development/compilers/path64 { };\n\n  openjdk =\n    if stdenv.isDarwin then\n      callPackage ../development/compilers/openjdk-darwin { }\n    else\n      let\n        openjdkBootstrap = callPackage ../development/compilers/openjdk/bootstrap.nix { };\n      in (callPackage ../development/compilers/openjdk {\n        jdk = openjdkBootstrap;\n      }) // { outputs = [ \"out\" ]; };\n\n  # FIXME: Need a way to set per-output meta attributes.\n  openjre = (lib.setName \"openjre-${lib.getVersion pkgs.openjdk.jre}\" (lib.addMetaAttrs\n    { description = \"The open-source Java Runtime Environment\"; }\n    pkgs.openjdk.jre)) // { outputs = [ \"jre\" ]; };\n\n  jdk = if stdenv.isDarwin || stdenv.system == \"i686-linux\" || stdenv.system == \"x86_64-linux\"\n    then pkgs.openjdk\n    else pkgs.oraclejdk;\n  jre = if stdenv.isDarwin || stdenv.system == \"i686-linux\" || stdenv.system == \"x86_64-linux\"\n    then pkgs.openjre\n    else pkgs.oraclejre;\n\n  oraclejdk = pkgs.jdkdistro true false;\n\n  oraclejdk7 = pkgs.oraclejdk7distro true false;\n\n  oraclejdk8 = pkgs.oraclejdk8distro true false;\n\n  oraclejre = lowPrio (pkgs.jdkdistro false false);\n\n  oraclejre7 = lowPrio (pkgs.oraclejdk7distro false false);\n\n  oraclejre8 = lowPrio (pkgs.oraclejdk8distro false false);\n\n  jrePlugin = lowPrio (pkgs.jdkdistro false true);\n\n  supportsJDK =\n    system == \"i686-linux\" ||\n    system == \"x86_64-linux\";\n\n  jdkdistro = installjdk: pluginSupport:\n    assert supportsJDK;\n    (if pluginSupport then appendToName \"with-plugin\" else x: x)\n      (callPackage ../development/compilers/oraclejdk/jdk6-linux.nix { });\n\n  oraclejdk7distro = installjdk: pluginSupport:\n    assert supportsJDK;\n    (if pluginSupport then appendToName \"with-plugin\" else x: x)\n      (callPackage ../development/compilers/oraclejdk/jdk7-linux.nix { inherit installjdk; });\n\n  oraclejdk8distro = installjdk: pluginSupport:\n    assert supportsJDK;\n    (if pluginSupport then appendToName \"with-plugin\" else x: x)\n      (callPackage ../development/compilers/oraclejdk/jdk8-linux.nix { inherit installjdk; });\n\n  jikes = callPackage ../development/compilers/jikes { };\n\n  juliaGit = callPackage ../development/compilers/julia/git-20131013.nix {\n    liblapack = liblapack.override {shared = true;};\n    llvm = llvm_33;\n  };\n  julia021 = callPackage ../development/compilers/julia/0.2.1.nix {\n    liblapack = liblapack.override {shared = true;};\n    llvm = llvm_33;\n  };\n  julia030 = let\n    liblapack = liblapack_3_5_0.override {shared = true;};\n  in callPackage ../development/compilers/julia/0.3.0.nix {\n    inherit liblapack;\n    suitesparse = suitesparse.override {\n      inherit liblapack;\n    };\n    openblas = openblas_0_2_10;\n    llvm = llvm_34;\n  };\n  julia = julia021;\n\n  lazarus = builderDefsPackage (import ../development/compilers/fpc/lazarus.nix) {\n    inherit makeWrapper gtk glib pango atk gdk_pixbuf;\n    inherit (xlibs) libXi inputproto libX11 xproto libXext xextproto;\n    fpc = fpc;\n  };\n\n  lessc = callPackage ../development/compilers/lessc { };\n\n  llvm = llvmPackages.llvm;\n\n  llvm_34 = llvmPackages_34.llvm;\n  llvm_33 = llvm_v ../development/compilers/llvm/3.3/llvm.nix;\n\n  llvm_v = path: callPackage path {\n    stdenv = if stdenv.isDarwin then stdenvApple else stdenv;\n  };\n\n  llvmPackages = if !stdenv.isDarwin then llvmPackages_34 else llvmPackages_34 // {\n    # until someone solves build problems with _34\n    llvm = llvm_33;\n    clang = clang_33;\n  };\n\n  llvmPackages_34 = recurseIntoAttrs (import ../development/compilers/llvm/3.4 {\n    inherit stdenv newScope fetchurl;\n    isl = isl_0_12;\n  });\n  llvmPackagesSelf = import ../development/compilers/llvm/3.4 { inherit newScope fetchurl; isl = isl_0_12; stdenv = libcxxStdenv; };\n\n  manticore = callPackage ../development/compilers/manticore { };\n\n  mentorToolchains = recurseIntoAttrs (\n    callPackage_i686 ../development/compilers/mentor {}\n  );\n\n  mercury = callPackage ../development/compilers/mercury { };\n\n  mitscheme = callPackage ../development/compilers/mit-scheme { };\n\n  mlton = callPackage ../development/compilers/mlton { };\n\n  mono = callPackage ../development/compilers/mono {\n    inherit (xlibs) libX11;\n  };\n\n  monoDLLFixer = callPackage ../build-support/mono-dll-fixer { };\n\n  mozart = callPackage ../development/compilers/mozart { };\n\n  neko = callPackage ../development/compilers/neko { };\n\n  nasm = callPackage ../development/compilers/nasm { };\n\n  nvidia_cg_toolkit = callPackage ../development/compilers/nvidia-cg-toolkit { };\n\n  ocaml = ocamlPackages.ocaml;\n\n  ocaml_3_08_0 = callPackage ../development/compilers/ocaml/3.08.0.nix { };\n\n  ocaml_3_10_0 = callPackage ../development/compilers/ocaml/3.10.0.nix { };\n\n  ocaml_3_11_2 = callPackage ../development/compilers/ocaml/3.11.2.nix { };\n\n  ocaml_3_12_1 = callPackage ../development/compilers/ocaml/3.12.1.nix { };\n\n  ocaml_4_00_1 = callPackage ../development/compilers/ocaml/4.00.1.nix { };\n\n  ocaml_4_01_0 = callPackage ../development/compilers/ocaml/4.01.0.nix { };\n\n  orc = callPackage ../development/compilers/orc { };\n\n  metaocaml_3_09 = callPackage ../development/compilers/ocaml/metaocaml-3.09.nix { };\n\n  ber_metaocaml_003 = callPackage ../development/compilers/ocaml/ber-metaocaml-003.nix { };\n\n  mkOcamlPackages = ocaml: self: let callPackage = newScope self; in rec {\n    inherit ocaml;\n\n    camlidl = callPackage ../development/tools/ocaml/camlidl { };\n\n    camlp5_5_strict = callPackage ../development/tools/ocaml/camlp5/5.15.nix { };\n\n    camlp5_5_transitional = callPackage ../development/tools/ocaml/camlp5/5.15.nix {\n      transitional = true;\n    };\n\n    camlp5_6_strict = callPackage ../development/tools/ocaml/camlp5 { };\n\n    camlp5_6_transitional = callPackage ../development/tools/ocaml/camlp5 {\n      transitional = true;\n    };\n\n    camlp5_strict = camlp5_6_strict;\n\n    camlp5_transitional = camlp5_6_transitional;\n\n    camlzip = callPackage ../development/ocaml-modules/camlzip { };\n\n    camomile_0_8_2 = callPackage ../development/ocaml-modules/camomile/0.8.2.nix { };\n    camomile = callPackage ../development/ocaml-modules/camomile { };\n\n    camlimages = callPackage ../development/ocaml-modules/camlimages {\n      libpng = libpng12;\n      giflib = giflib_4_1;\n    };\n\n    biniou = callPackage ../development/ocaml-modules/biniou { };\n\n    ocaml_cairo = callPackage ../development/ocaml-modules/ocaml-cairo { };\n\n    cppo = callPackage ../development/tools/ocaml/cppo { };\n\n    cryptokit = callPackage ../development/ocaml-modules/cryptokit { };\n\n    csv = callPackage ../development/ocaml-modules/csv { };\n\n    deriving = callPackage ../development/tools/ocaml/deriving { };\n\n    easy-format = callPackage ../development/ocaml-modules/easy-format { };\n\n    findlib = callPackage ../development/tools/ocaml/findlib { };\n\n    javalib = callPackage ../development/ocaml-modules/javalib {\n      extlib = ocaml_extlib_maximal;\n    };\n\n    dypgen = callPackage ../development/ocaml-modules/dypgen { };\n\n    patoline = callPackage ../tools/typesetting/patoline { };\n\n    gmetadom = callPackage ../development/ocaml-modules/gmetadom { };\n\n    lablgl = callPackage ../development/ocaml-modules/lablgl { };\n\n    lablgtk = callPackage ../development/ocaml-modules/lablgtk {\n      inherit (gnome) libgnomecanvas libglade gtksourceview;\n    };\n\n    lablgtkmathview = callPackage ../development/ocaml-modules/lablgtkmathview {\n      gtkmathview = callPackage ../development/libraries/gtkmathview { };\n    };\n\n    menhir = callPackage ../development/ocaml-modules/menhir { };\n\n    merlin = callPackage ../development/tools/ocaml/merlin { };\n\n    mldonkey = callPackage ../applications/networking/p2p/mldonkey { };\n\n    mlgmp =  callPackage ../development/ocaml-modules/mlgmp { };\n\n    ocaml_batteries = callPackage ../development/ocaml-modules/batteries { };\n\n    ocaml_cryptgps = callPackage ../development/ocaml-modules/cryptgps { };\n\n    ocaml_data_notation = callPackage ../development/ocaml-modules/odn { };\n\n    ocaml_expat = callPackage ../development/ocaml-modules/expat { };\n\n    ocamlgraph = callPackage ../development/ocaml-modules/ocamlgraph { };\n\n    ocaml_http = callPackage ../development/ocaml-modules/http { };\n\n    ocamlify = callPackage ../development/tools/ocaml/ocamlify { };\n\n    ocaml_lwt = callPackage ../development/ocaml-modules/lwt { };\n\n    ocamlmod = callPackage ../development/tools/ocaml/ocamlmod { };\n\n    ocaml_mysql = callPackage ../development/ocaml-modules/mysql { };\n\n    ocamlnet = callPackage ../development/ocaml-modules/ocamlnet { };\n\n    ocaml_oasis = callPackage ../development/tools/ocaml/oasis { };\n\n    ocaml_pcre = callPackage ../development/ocaml-modules/pcre {\n      inherit pcre;\n    };\n\n    ocaml_react = callPackage ../development/ocaml-modules/react { };\n\n    ocamlsdl= callPackage ../development/ocaml-modules/ocamlsdl { };\n\n    ocaml_sqlite3 = callPackage ../development/ocaml-modules/sqlite3 { };\n\n    ocaml_ssl = callPackage ../development/ocaml-modules/ssl { };\n\n    ounit = callPackage ../development/ocaml-modules/ounit { };\n\n    ulex = callPackage ../development/ocaml-modules/ulex { };\n\n    ulex08 = callPackage ../development/ocaml-modules/ulex/0.8 {\n      camlp5 = camlp5_transitional;\n    };\n\n    ocaml_typeconv = callPackage ../development/ocaml-modules/typeconv { };\n\n    ocaml_typeconv_3_0_5 = callPackage ../development/ocaml-modules/typeconv/3.0.5.nix { };\n\n    ocaml_sexplib = callPackage ../development/ocaml-modules/sexplib { };\n\n    ocaml_extlib = callPackage ../development/ocaml-modules/extlib { };\n    ocaml_extlib_maximal = callPackage ../development/ocaml-modules/extlib {\n      minimal = false;\n    };\n\n    pycaml = callPackage ../development/ocaml-modules/pycaml { };\n\n    opam_1_0_0 = callPackage ../development/tools/ocaml/opam/1.0.0.nix { };\n    opam_1_1 = callPackage ../development/tools/ocaml/opam/1.1.nix { };\n    opam = opam_1_1;\n\n    sawja = callPackage ../development/ocaml-modules/sawja { };\n\n    uucd = callPackage ../development/ocaml-modules/uucd { };\n    uunf = callPackage ../development/ocaml-modules/uunf { };\n    uutf = callPackage ../development/ocaml-modules/uutf { };\n    xmlm = callPackage ../development/ocaml-modules/xmlm { };\n\n    yojson = callPackage ../development/ocaml-modules/yojson { };\n\n    zarith = callPackage ../development/ocaml-modules/zarith { };\n  };\n\n  ocamlPackages = recurseIntoAttrs ocamlPackages_4_01_0;\n  ocamlPackages_3_10_0 = mkOcamlPackages ocaml_3_10_0 pkgs.ocamlPackages_3_10_0;\n  ocamlPackages_3_11_2 = mkOcamlPackages ocaml_3_11_2 pkgs.ocamlPackages_3_11_2;\n  ocamlPackages_3_12_1 = mkOcamlPackages ocaml_3_12_1 pkgs.ocamlPackages_3_12_1;\n  ocamlPackages_4_00_1 = mkOcamlPackages ocaml_4_00_1 pkgs.ocamlPackages_4_00_1;\n  ocamlPackages_4_01_0 = mkOcamlPackages ocaml_4_01_0 pkgs.ocamlPackages_4_01_0;\n  ocamlPackages_latest = ocamlPackages_4_01_0;\n\n  ocaml_make = callPackage ../development/ocaml-modules/ocamlmake { };\n\n  opa = let callPackage = newScope pkgs.ocamlPackages_4_00_1; in callPackage ../development/compilers/opa { };\n\n  ocamlnat = let callPackage = newScope pkgs.ocamlPackages_3_12_1; in callPackage ../development/ocaml-modules/ocamlnat { };\n\n  qcmm = callPackage ../development/compilers/qcmm {\n    lua   = lua4;\n    ocaml = ocaml_3_08_0;\n  };\n\n  roadsend = callPackage ../development/compilers/roadsend { };\n\n  rustc       = callPackage ../development/compilers/rustc/0.11.nix {};\n  rustcMaster = callPackage ../development/compilers/rustc/head.nix {};\n\n  rust = rustc;\n\n\n  sbclBootstrap = callPackage ../development/compilers/sbcl/bootstrap.nix {};\n  sbcl = callPackage ../development/compilers/sbcl {\n    clisp = clisp;\n  };\n\n  scala_2_9 = callPackage ../development/compilers/scala/2.9.nix { };\n  scala_2_10 = callPackage ../development/compilers/scala/2.10.nix { };\n  scala_2_11 = callPackage ../development/compilers/scala { };\n  scala = scala_2_11;\n\n  sdcc = callPackage ../development/compilers/sdcc { };\n\n  smlnjBootstrap = callPackage ../development/compilers/smlnj/bootstrap.nix { };\n  smlnj = callPackage_i686 ../development/compilers/smlnj { };\n\n  stalin = callPackage ../development/compilers/stalin { };\n\n  strategoPackages = recurseIntoAttrs strategoPackages018;\n\n  strategoPackages016 = callPackage ../development/compilers/strategoxt/0.16.nix {\n    stdenv = overrideInStdenv stdenv [gnumake380];\n  };\n\n  strategoPackages017 = callPackage ../development/compilers/strategoxt/0.17.nix {\n    readline = readline5;\n  };\n\n  strategoPackages018 = callPackage ../development/compilers/strategoxt/0.18.nix {\n    readline = readline5;\n  };\n\n  metaBuildEnv = callPackage ../development/compilers/meta-environment/meta-build-env { };\n\n  swiProlog = callPackage ../development/compilers/swi-prolog { };\n\n  tbb = callPackage ../development/libraries/tbb { };\n\n  tinycc = callPackage ../development/compilers/tinycc { };\n\n  urweb = callPackage ../development/compilers/urweb { };\n\n  vala = callPackage ../development/compilers/vala/default.nix { };\n\n  visualcpp = callPackage ../development/compilers/visual-c++ { };\n\n  vs90wrapper = callPackage ../development/compilers/vs90wrapper { };\n\n  webdsl = callPackage ../development/compilers/webdsl { };\n\n  win32hello = callPackage ../development/compilers/visual-c++/test { };\n\n  wrapGCCWith = gccWrapper: glibc: baseGCC: gccWrapper {\n    nativeTools = stdenv ? gcc && stdenv.gcc.nativeTools;\n    nativeLibc = stdenv ? gcc && stdenv.gcc.nativeLibc;\n    nativePrefix = if stdenv ? gcc then stdenv.gcc.nativePrefix else \"\";\n    gcc = baseGCC;\n    libc = glibc;\n    shell = bash;\n    inherit stdenv binutils coreutils zlib;\n  };\n\n  wrapClangWith = clangWrapper: glibc: baseClang: clangWrapper {\n    nativeTools = stdenv.gcc.nativeTools or false;\n    nativeLibc = stdenv.gcc.nativeLibc or false;\n    nativePrefix = stdenv.gcc.nativePrefix or \"\";\n    clang = baseClang;\n    libc = glibc;\n    shell = bash;\n    binutils = stdenv.gcc.binutils;\n    inherit stdenv coreutils zlib;\n  };\n\n  wrapClang = wrapClangWith (makeOverridable (import ../build-support/clang-wrapper)) glibc;\n\n  wrapGCC = wrapGCCWith (makeOverridable (import ../build-support/gcc-wrapper)) glibc;\n\n  wrapGCCCross =\n    {gcc, libc, binutils, cross, shell ? \"\", name ? \"gcc-cross-wrapper\"}:\n\n    forceNativeDrv (import ../build-support/gcc-cross-wrapper {\n      nativeTools = false;\n      nativeLibc = false;\n      noLibc = (libc == null);\n      inherit stdenv gcc binutils libc shell name cross;\n    });\n\n  # prolog\n  yap = callPackage ../development/compilers/yap { };\n\n  yasm = callPackage ../development/compilers/yasm { };\n\n\n  ### DEVELOPMENT / INTERPRETERS\n\n  acl2 = builderDefsPackage ../development/interpreters/acl2 {\n    inherit sbcl;\n  };\n\n  angelscript = callPackage ../development/interpreters/angelscript {};\n\n  clisp = callPackage ../development/interpreters/clisp { };\n\n  # compatibility issues in 2.47 - at list 2.44.1 is known good\n  # for sbcl bootstrap\n  clisp_2_44_1 = callPackage ../development/interpreters/clisp/2.44.1.nix {\n    libsigsegv = libsigsegv_25;\n  };\n\n  clojure = callPackage ../development/interpreters/clojure { };\n\n  clooj = callPackage ../development/interpreters/clojure/clooj.nix { };\n\n  erlangR14 = callPackage ../development/interpreters/erlang/R14.nix { };\n  erlangR15 = callPackage ../development/interpreters/erlang/R15.nix { };\n  erlangR16 = callPackage ../development/interpreters/erlang/R16.nix { };\n  erlangR17 = callPackage ../development/interpreters/erlang/R17.nix { };\n  erlang = erlangR17;\n\n  rebar = callPackage ../development/tools/build-managers/rebar { };\n\n  elixir = callPackage ../development/interpreters/elixir { };\n\n  groovy = callPackage ../development/interpreters/groovy { };\n\n  guile_1_8 = callPackage ../development/interpreters/guile/1.8.nix { };\n\n  guile_2_0 = callPackage ../development/interpreters/guile { };\n\n  guile = guile_2_0;\n\n  hadoop = callPackage ../applications/networking/cluster/hadoop { };\n\n  io = callPackage ../development/interpreters/io { };\n\n  j = callPackage ../development/interpreters/j {};\n\n  jmeter = callPackage ../applications/networking/jmeter {};\n\n  davmail = callPackage ../applications/networking/davmail {};\n\n  lxappearance = callPackage ../applications/misc/lxappearance {};\n\n  kona = callPackage ../development/interpreters/kona {};\n\n  love = callPackage ../development/interpreters/love {lua=lua5;};\n  love_luajit = callPackage ../development/interpreters/love {lua=luajit;};\n  love_0_9 = callPackage ../development/interpreters/love/0.9.nix { };\n\n  lua4 = callPackage ../development/interpreters/lua-4 { };\n  lua5_0 = callPackage ../development/interpreters/lua-5/5.0.3.nix { };\n  lua5_1 = callPackage ../development/interpreters/lua-5/5.1.nix { };\n  lua5_2 = callPackage ../development/interpreters/lua-5/5.2.nix { };\n  lua5_2_compat = callPackage ../development/interpreters/lua-5/5.2.nix {\n    compat = true;\n  };\n  lua5 = lua5_1;\n  lua = lua5;\n\n  lua5_sockets = callPackage ../development/interpreters/lua-5/sockets.nix {};\n  lua5_expat = callPackage ../development/interpreters/lua-5/expat.nix {};\n  lua5_filesystem = callPackage ../development/interpreters/lua-5/filesystem.nix {};\n  lua5_sec = callPackage ../development/interpreters/lua-5/sec.nix {};\n\n  luarocks = callPackage ../development/tools/misc/luarocks {\n     lua = lua5;\n  };\n\n  luajit = callPackage ../development/interpreters/luajit {};\n\n  lush2 = callPackage ../development/interpreters/lush {};\n\n  maude = callPackage ../development/interpreters/maude {\n    bison = bison2;\n    flex = flex_2_5_35;\n  };\n\n  mesos = callPackage ../applications/networking/cluster/mesos {\n    sasl = cyrus_sasl;\n    automake = automake114x;\n    inherit (pythonPackages) python boto setuptools distutils-cfg wrapPython;\n    pythonProtobuf = pythonPackages.protobuf;\n  };\n\n  octave = callPackage ../development/interpreters/octave {\n    fltk = fltk13;\n    qt = null;\n    ghostscript = null;\n    llvm = null;\n    hdf5 = null;\n    glpk = null;\n    suitesparse = null;\n    openjdk = null;\n    gnuplot = null;\n    readline = readline63;\n  };\n  octaveFull = (lowPrio (callPackage ../development/interpreters/octave {\n    fltk = fltk13;\n    qt = qt4;\n  }));\n\n  # mercurial (hg) bleeding edge version\n  octaveHG = callPackage ../development/interpreters/octave/hg.nix { };\n\n  ocropus = callPackage ../applications/misc/ocropus { };\n\n  perl514 = callPackage ../development/interpreters/perl/5.14 { };\n\n  perl516 = callPackage ../development/interpreters/perl/5.16 {\n    fetchurl = fetchurlBoot;\n  };\n\n  perl520 = callPackage ../development/interpreters/perl/5.20 { };\n\n  perl = if system != \"i686-cygwin\" then perl516 else sysPerl;\n\n  php = php54;\n\n  phpPackages = recurseIntoAttrs (import ./php-packages.nix {\n    inherit php pkgs;\n  });\n\n  php53 = callPackage ../development/interpreters/php/5.3.nix { };\n\n  php_fpm53 = callPackage ../development/interpreters/php/5.3.nix {\n    config = config // {\n      php = (config.php or {}) // {\n        fpm = true;\n        apxs2 = false;\n      };\n    };\n  };\n\n  php54 = callPackage ../development/interpreters/php/5.4.nix { };\n\n  picolisp = callPackage ../development/interpreters/picolisp {};\n\n  pltScheme = racket; # just to be sure\n\n  polyml = callPackage ../development/compilers/polyml { };\n\n  pure = callPackage ../development/interpreters/pure {\n    llvm = llvm_33 ;\n  };\n\n  python = python2;\n  python2 = python27;\n  python3 = python34;\n\n  # pythonPackages further below, but assigned here because they need to be in sync\n  pythonPackages = python2Packages;\n  python2Packages = python27Packages;\n  python3Packages = python34Packages;\n\n  pythonFull = python2Full;\n  python2Full = python27Full;\n\n  python26 = callPackage ../development/interpreters/python/2.6 { db = db47; };\n  python27 = callPackage ../development/interpreters/python/2.7 { };\n  python32 = callPackage ../development/interpreters/python/3.2 { };\n  python33 = callPackage ../development/interpreters/python/3.3 { };\n  python34 = hiPrio (callPackage ../development/interpreters/python/3.4 { });\n\n  pypy = callPackage ../development/interpreters/pypy/2.3 { };\n\n  python26Full = callPackage ../development/interpreters/python/wrapper.nix {\n    extraLibs = [];\n    postBuild = \"\";\n    python = python26;\n    inherit (python26Packages) recursivePthLoader;\n  };\n  python27Full = callPackage ../development/interpreters/python/wrapper.nix {\n    extraLibs = [];\n    postBuild = \"\";\n    python = python27;\n    inherit (python27Packages) recursivePthLoader;\n  };\n\n  pythonDocs = recurseIntoAttrs (import ../development/interpreters/python/docs {\n    inherit stdenv fetchurl lib;\n  });\n\n  pythonLinkmeWrapper = callPackage ../development/interpreters/python/python-linkme-wrapper.nix { };\n\n  pypi2nix = python27Packages.pypi2nix;\n\n  pyrex = pyrex095;\n\n  pyrex095 = callPackage ../development/interpreters/pyrex/0.9.5.nix { };\n\n  pyrex096 = callPackage ../development/interpreters/pyrex/0.9.6.nix { };\n\n  qi = callPackage ../development/compilers/qi { };\n\n  racket = callPackage ../development/interpreters/racket { };\n\n  rakudo = callPackage ../development/interpreters/rakudo { };\n\n  rascal = callPackage ../development/interpreters/rascal { };\n\n  regina = callPackage ../development/interpreters/regina { };\n\n  renpy = callPackage ../development/interpreters/renpy {\n    wrapPython = pythonPackages.wrapPython;\n  };\n\n  ruby18 = callPackage ../development/interpreters/ruby/ruby-18.nix { };\n  ruby19 = callPackage ../development/interpreters/ruby/ruby-19.nix { };\n  ruby2 = lowPrio (callPackage ../development/interpreters/ruby/ruby-2.0.nix { });\n\n  ruby = ruby19;\n\n  rubyLibs = recurseIntoAttrs (callPackage ../development/interpreters/ruby/libs.nix { });\n\n  rake = rubyLibs.rake;\n\n  rubySqlite3 = callPackage ../development/ruby-modules/sqlite3 { };\n\n  rubygemsFun = ruby: builderDefsPackage (import ../development/interpreters/ruby/rubygems.nix) {\n    inherit ruby makeWrapper;\n  };\n  rubygems = hiPrio (rubygemsFun ruby);\n\n  rq = callPackage ../applications/networking/cluster/rq { };\n\n  scsh = callPackage ../development/interpreters/scsh { };\n\n  scheme48 = callPackage ../development/interpreters/scheme48 { };\n\n  spark = callPackage ../applications/networking/cluster/spark { };\n\n  spidermonkey = callPackage ../development/interpreters/spidermonkey { };\n  spidermonkey_1_8_0rc1 = callPackage ../development/interpreters/spidermonkey/1.8.0-rc1.nix { };\n  spidermonkey_185 = callPackage ../development/interpreters/spidermonkey/185-1.0.0.nix { };\n  spidermonkey_17 = callPackage ../development/interpreters/spidermonkey/17.0.nix { };\n  spidermonkey_24 = callPackage ../development/interpreters/spidermonkey/24.2.nix { };\n\n  supercollider = callPackage ../development/interpreters/supercollider {\n    qt = qt4;\n    fftw = fftwSinglePrec;\n  };\n\n  supercollider_scel = supercollider.override { useSCEL = true; };\n\n  sysPerl = callPackage ../development/interpreters/perl/sys-perl { };\n\n  tcl = callPackage ../development/interpreters/tcl { };\n\n  xulrunner = callPackage ../development/interpreters/xulrunner {\n    inherit (gnome) libIDL;\n    inherit (pythonPackages) pysqlite;\n  };\n\n  xulrunner_30 = firefox30Pkgs.xulrunner;\n\n\n  ### DEVELOPMENT / MISC\n\n  amdadlsdk = callPackage ../development/misc/amdadl-sdk { };\n\n  amdappsdk26 = callPackage ../development/misc/amdapp-sdk {\n    version = \"2.6\";\n  };\n\n  amdappsdk27 = callPackage ../development/misc/amdapp-sdk {\n    version = \"2.7\";\n  };\n\n  amdappsdk28 = callPackage ../development/misc/amdapp-sdk {\n    version = \"2.8\";\n  };\n\n  amdappsdk = amdappsdk28;\n\n  amdappsdkFull = callPackage ../development/misc/amdapp-sdk {\n    version = \"2.8\";\n    samples = true;\n  };\n\n  avrgcclibc = callPackage ../development/misc/avr-gcc-with-avr-libc {\n    gcc = gcc46;\n    stdenv = overrideGCC stdenv gcc46;\n  };\n\n  avr8burnomat = callPackage ../development/misc/avr8-burn-omat { };\n\n  sourceFromHead = import ../build-support/source-from-head-fun.nix {\n    inherit config;\n  };\n\n  ecj = callPackage ../development/eclipse/ecj { };\n\n  jdtsdk = callPackage ../development/eclipse/jdt-sdk { };\n\n  jruby165 = callPackage ../development/interpreters/jruby { };\n\n  guileCairo = callPackage ../development/guile-modules/guile-cairo { };\n\n  guileGnome = callPackage ../development/guile-modules/guile-gnome {\n    gconf = gnome.GConf;\n    inherit (gnome) gnome_vfs libglade libgnome libgnomecanvas libgnomeui;\n  };\n\n  guile_lib = callPackage ../development/guile-modules/guile-lib { };\n\n  guile_ncurses = callPackage ../development/guile-modules/guile-ncurses { };\n\n  guile-xcb = callPackage ../development/guile-modules/guile-xcb { };\n\n  pharo-vm = callPackage_i686 ../development/pharo/vm { };\n\n  srecord = callPackage ../development/tools/misc/srecord { };\n\n  windowssdk = (\n    import ../development/misc/windows-sdk {\n      inherit fetchurl stdenv cabextract;\n    });\n\n\n  ### DEVELOPMENT / TOOLS\n\n  ansible = callPackage ../tools/system/ansible { };\n\n  antlr = callPackage ../development/tools/parsing/antlr/2.7.7.nix { };\n\n  antlr3 = callPackage ../development/tools/parsing/antlr { };\n\n  ant = apacheAnt;\n\n  apacheAnt = callPackage ../development/tools/build-managers/apache-ant { };\n\n  astyle = callPackage ../development/tools/misc/astyle { };\n\n  autobuild = callPackage ../development/tools/misc/autobuild { };\n\n  autoconf = callPackage ../development/tools/misc/autoconf { };\n\n  autoconf213 = callPackage ../development/tools/misc/autoconf/2.13.nix { };\n\n  autocutsel = callPackage ../tools/X11/autocutsel{ };\n\n  automake = automake112x;\n\n  automake111x = callPackage ../development/tools/misc/automake/automake-1.11.x.nix { };\n\n  automake112x = callPackage ../development/tools/misc/automake/automake-1.12.x.nix { };\n\n  automake113x = callPackage ../development/tools/misc/automake/automake-1.13.x.nix { };\n\n  automake114x = callPackage ../development/tools/misc/automake/automake-1.14.x.nix { };\n\n  automoc4 = callPackage ../development/tools/misc/automoc4 { };\n\n  avrdude = callPackage ../development/tools/misc/avrdude { };\n\n  avarice = callPackage ../development/tools/misc/avarice { };\n\n  babeltrace = callPackage ../development/tools/misc/babeltrace { };\n\n  bam = callPackage ../development/tools/build-managers/bam {};\n\n  binutils = callPackage ../development/tools/misc/binutils {\n    inherit noSysDirs;\n  };\n\n  binutils_nogold = lowPrio (callPackage ../development/tools/misc/binutils {\n    inherit noSysDirs;\n    gold = false;\n  });\n\n  binutilsCross =\n    if crossSystem != null && crossSystem.libc == \"libSystem\" then darwin.cctools\n    else lowPrio (forceNativeDrv (import ../development/tools/misc/binutils {\n      inherit stdenv fetchurl zlib bison;\n      noSysDirs = true;\n      cross = assert crossSystem != null; crossSystem;\n    }));\n\n  bison2 = callPackage ../development/tools/parsing/bison/2.x.nix { };\n  bison3 = callPackage ../development/tools/parsing/bison/3.x.nix { };\n  bison = bison3;\n\n  buildbot = callPackage ../development/tools/build-managers/buildbot {\n    inherit (pythonPackages) twisted jinja2 sqlalchemy sqlalchemy_migrate;\n    dateutil = pythonPackages.dateutil_1_5;\n  };\n\n  buildbotSlave = callPackage ../development/tools/build-managers/buildbot-slave {\n    inherit (pythonPackages) twisted;\n  };\n\n  byacc = callPackage ../development/tools/parsing/byacc { };\n\n  casperjs = callPackage ../development/tools/casperjs { };\n\n  cbrowser = callPackage ../development/tools/misc/cbrowser { };\n\n  ccache = callPackage ../development/tools/misc/ccache { };\n\n  # Wrapper that works as gcc or g++\n  # It can be used by setting in nixpkgs config like this, for example:\n  #    replaceStdenv = { pkgs }: pkgs.ccacheStdenv;\n  # But if you build in chroot, you should have that path in chroot\n  # If instantiated directly, it will use the HOME/.ccache as cache directory.\n  # You can use an override in packageOverrides to set extraConfig:\n  #    packageOverrides = pkgs: {\n  #     ccacheWrapper = pkgs.ccacheWrapper.override {\n  #       extraConfig = ''\n  #         CCACHE_COMPRESS=1\n  #         CCACHE_DIR=/bin/.ccache\n  #       '';\n  #     };\n  #\n  ccacheWrapper = makeOverridable ({ extraConfig ? \"\" }:\n     wrapGCC (ccache.links extraConfig)) {};\n  ccacheStdenv = lowPrio (overrideGCC stdenv ccacheWrapper);\n\n  cccc = callPackage ../development/tools/analysis/cccc { };\n\n  cgdb = callPackage ../development/tools/misc/cgdb { };\n\n  chromedriver = callPackage ../development/tools/selenium/chromedriver { gconf = gnome.GConf; };\n\n  chrpath = callPackage ../development/tools/misc/chrpath { };\n\n  \"cl-launch\" = callPackage ../development/tools/misc/cl-launch {};\n\n  complexity = callPackage ../development/tools/misc/complexity { };\n\n  ctags = callPackage ../development/tools/misc/ctags { };\n\n  ctagsWrapped = import ../development/tools/misc/ctags/wrapped.nix {\n    inherit pkgs ctags writeScriptBin;\n  };\n\n  cmake = callPackage ../development/tools/build-managers/cmake { };\n\n  cmake264 = callPackage ../development/tools/build-managers/cmake/264.nix { };\n\n  cmakeCurses = cmake.override { useNcurses = true; };\n\n  cmakeWithGui = cmakeCurses.override { useQt4 = true; };\n\n  coccinelle = callPackage ../development/tools/misc/coccinelle { };\n\n  framac = callPackage ../development/tools/analysis/frama-c { };\n\n  cppi = callPackage ../development/tools/misc/cppi { };\n\n  cproto = callPackage ../development/tools/misc/cproto { };\n\n  cflow = callPackage ../development/tools/misc/cflow { };\n\n  cov-build = callPackage ../development/tools/analysis/cov-build {};\n\n  cppcheck = callPackage ../development/tools/analysis/cppcheck { };\n\n  cscope = callPackage ../development/tools/misc/cscope { };\n\n  csslint = callPackage ../development/web/csslint { };\n\n  libcxx = callPackage ../development/libraries/libc++ { stdenv = pkgs.clangStdenv; };\n  libcxxabi = callPackage ../development/libraries/libc++abi { stdenv = pkgs.clangStdenv; };\n\n  libsigrok = callPackage ../development/tools/libsigrok { };\n\n  libsigrokdecode = callPackage ../development/tools/libsigrokdecode { };\n\n  dejagnu = callPackage ../development/tools/misc/dejagnu { };\n\n  dfeet = callPackage ../development/tools/misc/d-feet {\n    inherit (pythonPackages) pep8;\n  };\n\n  dfu-programmer = callPackage ../development/tools/misc/dfu-programmer { };\n\n  ddd = callPackage ../development/tools/misc/ddd { };\n\n  distcc = callPackage ../development/tools/misc/distcc { };\n\n  # distccWrapper: wrapper that works as gcc or g++\n  # It can be used by setting in nixpkgs config like this, for example:\n  #    replaceStdenv = { pkgs }: pkgs.distccStdenv;\n  # But if you build in chroot, a default 'nix' will create\n  # a new net namespace, and won't have network access.\n  # You can use an override in packageOverrides to set extraConfig:\n  #    packageOverrides = pkgs: {\n  #     distccWrapper = pkgs.distccWrapper.override {\n  #       extraConfig = ''\n  #         DISTCC_HOSTS=\"myhost1 myhost2\"\n  #       '';\n  #     };\n  #\n  distccWrapper = makeOverridable ({ extraConfig ? \"\" }:\n     wrapGCC (distcc.links extraConfig)) {};\n  distccStdenv = lowPrio (overrideGCC stdenv distccWrapper);\n\n  distccMasquerade = callPackage ../development/tools/misc/distcc/masq.nix {\n    gccRaw = gcc.gcc;\n    binutils = binutils;\n  };\n\n  docutils = builderDefsPackage (import ../development/tools/documentation/docutils) {\n    inherit python pil makeWrapper;\n  };\n\n  doxygen = callPackage ../development/tools/documentation/doxygen {\n    qt4 = null;\n  };\n\n  doxygen_gui = lowPrio (doxygen.override { inherit qt4; });\n\n  drush = callPackage ../development/tools/misc/drush { };\n\n  eggdbus = callPackage ../development/tools/misc/eggdbus { };\n\n  elfutils = callPackage ../development/tools/misc/elfutils { };\n\n  epm = callPackage ../development/tools/misc/epm { };\n\n  emma = callPackage ../development/tools/analysis/emma { };\n\n  findbugs = callPackage ../development/tools/analysis/findbugs { };\n\n  pmd = callPackage ../development/tools/analysis/pmd { };\n\n  jdepend = callPackage ../development/tools/analysis/jdepend { };\n\n  checkstyle = callPackage ../development/tools/analysis/checkstyle { };\n\n  flex_2_5_35 = callPackage ../development/tools/parsing/flex/2.5.35.nix { };\n  flex_2_5_39 = callPackage ../development/tools/parsing/flex/2.5.39.nix { };\n  flex = flex_2_5_39;\n\n  m4 = gnum4;\n\n  global = callPackage ../development/tools/misc/global { };\n\n  gnome_doc_utils = callPackage ../development/tools/documentation/gnome-doc-utils {};\n\n  gnum4 = callPackage ../development/tools/misc/gnum4 { };\n\n  gnumake380 = callPackage ../development/tools/build-managers/gnumake/3.80 { };\n  gnumake381 = callPackage ../development/tools/build-managers/gnumake/3.81 { };\n  gnumake382 = callPackage ../development/tools/build-managers/gnumake/3.82 { };\n  gnumake40  = callPackage ../development/tools/build-managers/gnumake/4.0  { };\n  gnumake = gnumake382;\n\n  gob2 = callPackage ../development/tools/misc/gob2 { };\n\n  gradle = callPackage ../development/tools/build-managers/gradle { };\n\n  gperf = callPackage ../development/tools/misc/gperf { };\n\n  gtk_doc = callPackage ../development/tools/documentation/gtk-doc { };\n\n  gtkdialog = callPackage ../development/tools/misc/gtkdialog { };\n\n  guileLint = callPackage ../development/tools/guile/guile-lint { };\n\n  gwrap = callPackage ../development/tools/guile/g-wrap { };\n\n  help2man = callPackage ../development/tools/misc/help2man {\n    inherit (perlPackages) LocaleGettext;\n  };\n\n  hyenae = callPackage ../tools/networking/hyenae { };\n\n  ibus = callPackage ../development/libraries/ibus { };\n\n  iconnamingutils = callPackage ../development/tools/misc/icon-naming-utils {\n    inherit (perlPackages) XMLSimple;\n  };\n\n  indent = callPackage ../development/tools/misc/indent { };\n\n  ino = callPackage ../development/arduino/ino { };\n\n  inotifyTools = callPackage ../development/tools/misc/inotify-tools { };\n\n  intel-gpu-tools = callPackage ../development/tools/misc/intel-gpu-tools {\n    inherit (xorg) libpciaccess dri2proto libX11 libXext libXv libXrandr;\n  };\n\n  ired = callPackage ../development/tools/analysis/radare/ired.nix { };\n\n  itstool = callPackage ../development/tools/misc/itstool { };\n\n  jam = callPackage ../development/tools/build-managers/jam { };\n\n  jikespg = callPackage ../development/tools/parsing/jikespg { };\n\n  jenkins = callPackage ../development/tools/continuous-integration/jenkins { };\n\n  lcov = callPackage ../development/tools/analysis/lcov { };\n\n  leiningen = callPackage ../development/tools/build-managers/leiningen { };\n\n  libtool = libtool_2;\n\n  libtool_1_5 = callPackage ../development/tools/misc/libtool { };\n\n  libtool_2 = callPackage ../development/tools/misc/libtool/libtool2.nix { };\n\n  lsof = callPackage ../development/tools/misc/lsof { };\n\n  ltrace = callPackage ../development/tools/misc/ltrace { };\n\n  lttng-tools = callPackage ../development/tools/misc/lttng-tools { };\n\n  lttng-ust = callPackage ../development/tools/misc/lttng-ust { };\n\n  lttv = callPackage ../development/tools/misc/lttv { };\n\n  mk = callPackage ../development/tools/build-managers/mk { };\n\n  neoload = callPackage ../development/tools/neoload {\n    licenseAccepted = (config.neoload.accept_license or false);\n  };\n\n  ninja = callPackage ../development/tools/build-managers/ninja { };\n\n  nixbang = callPackage ../development/tools/misc/nixbang {\n      pythonPackages = python3Packages;\n  };\n\n  node_webkit = callPackage ../development/tools/node-webkit {\n    gconf = pkgs.gnome.GConf;\n  };\n\n  noweb = callPackage ../development/tools/literate-programming/noweb { };\n\n  omake = callPackage ../development/tools/ocaml/omake { };\n  omake_rc1 = callPackage ../development/tools/ocaml/omake/0.9.8.6-rc1.nix { };\n\n  opengrok = callPackage ../development/tools/misc/opengrok { };\n\n  openocd = callPackage ../development/tools/misc/openocd { };\n\n  oprofile = callPackage ../development/tools/profiling/oprofile { };\n\n  patchelf = callPackage ../development/tools/misc/patchelf { };\n\n  peg = callPackage ../development/tools/parsing/peg { };\n\n  phantomjs = callPackage ../development/tools/phantomjs {\n    stdenv = if stdenv.isDarwin\n      then overrideGCC stdenv gccApple\n      else stdenv;\n  };\n\n  pmccabe = callPackage ../development/tools/misc/pmccabe { };\n\n  /* Make pkgconfig always return a nativeDrv, never a proper crossDrv,\n     because most usage of pkgconfig as buildInput (inheritance of\n     pre-cross nixpkgs) means using it using as nativeBuildInput\n     cross_renaming: we should make all programs use pkgconfig as\n     nativeBuildInput after the renaming.\n     */\n  pkgconfig = forceNativeDrv (callPackage ../development/tools/misc/pkgconfig { });\n  pkgconfigUpstream = lowPrio (pkgconfig.override { vanilla = true; });\n\n  prelink = callPackage ../development/tools/misc/prelink { };\n\n  premake3 = callPackage ../development/tools/misc/premake/3.nix { };\n\n  premake4 = callPackage ../development/tools/misc/premake { };\n\n  premake = premake4;\n\n  pstack = callPackage ../development/tools/misc/gdb/pstack.nix { };\n\n  radare = callPackage ../development/tools/analysis/radare {\n    inherit (gnome) vte;\n    lua = lua5;\n    useX11 = config.radare.useX11 or false;\n    pythonBindings = config.radare.pythonBindings or false;\n    rubyBindings = config.radare.rubyBindings or false;\n    luaBindings = config.radare.luaBindings or false;\n  };\n\n  ragel = callPackage ../development/tools/parsing/ragel { };\n\n  re2c = callPackage ../development/tools/parsing/re2c { };\n\n  remake = callPackage ../development/tools/build-managers/remake { };\n\n  saleae-logic = callPackage ../development/tools/misc/saleae-logic { };\n\n  # couldn't find the source yet\n  seleniumRCBin = callPackage ../development/tools/selenium/remote-control {\n    jre = jdk;\n  };\n\n  selenium-server-standalone = callPackage ../development/tools/selenium/server { };\n\n  scons = callPackage ../development/tools/build-managers/scons { };\n\n  simpleBuildTool = callPackage ../development/tools/build-managers/simple-build-tool { };\n\n  sigrok-cli = callPackage ../development/tools/sigrok-cli { };\n\n  slimerjs = callPackage ../development/tools/slimerjs {};\n\n  sloccount = callPackage ../development/tools/misc/sloccount { };\n\n  smatch = callPackage ../development/tools/analysis/smatch {\n    buildllvmsparse = false;\n    buildc2xml = false;\n  };\n\n  smc = callPackage ../tools/misc/smc { };\n\n  sparse = callPackage ../development/tools/analysis/sparse { };\n\n  speedtest_cli = callPackage ../tools/networking/speedtest-cli { };\n\n  spin = callPackage ../development/tools/analysis/spin { };\n\n  splint = callPackage ../development/tools/analysis/splint {\n    flex = flex_2_5_35;\n  };\n\n  stm32flash = callPackage ../development/tools/misc/stm32flash { };\n\n  strace = callPackage ../development/tools/misc/strace { };\n\n  swig = callPackage ../development/tools/misc/swig { };\n\n  swig2 = callPackage ../development/tools/misc/swig/2.x.nix { };\n\n  swig3 = callPackage ../development/tools/misc/swig/3.x.nix { };\n\n  swigWithJava = swig;\n\n  swfmill = callPackage ../tools/video/swfmill { };\n\n  swftools = callPackage ../tools/video/swftools { };\n\n  tcptrack = callPackage ../development/tools/misc/tcptrack { };\n\n  teensy-loader = callPackage ../development/tools/misc/teensy { };\n\n  texinfo413 = callPackage ../development/tools/misc/texinfo/4.13a.nix { };\n  texinfo5 = callPackage ../development/tools/misc/texinfo/5.2.nix { };\n  texinfo4 = texinfo413;\n  texinfo = texinfo5;\n  texinfoInteractive = appendToName \"interactive\" (\n    texinfo.override { interactive = true; }\n  );\n\n  texi2html = callPackage ../development/tools/misc/texi2html { };\n\n  uhd = callPackage ../development/tools/misc/uhd { };\n\n  uisp = callPackage ../development/tools/misc/uisp { };\n\n  uncrustify = callPackage ../development/tools/misc/uncrustify { };\n\n  vagrant = callPackage ../development/tools/vagrant {\n    ruby = ruby2;\n  };\n\n  gdb = callPackage ../development/tools/misc/gdb {\n    hurd = gnu.hurdCross;\n    readline = readline63;\n    inherit (gnu) mig;\n  };\n\n  gdbCross = lowPrio (callPackage ../development/tools/misc/gdb {\n    target = crossSystem;\n  });\n\n  valgrind = callPackage ../development/tools/analysis/valgrind {\n    stdenv =\n      # On Darwin, Valgrind 3.7.0 expects Apple's GCC (for\n      # `__private_extern'.)\n      if stdenv.isDarwin\n      then overrideGCC stdenv gccApple\n      else stdenv;\n  };\n\n  valkyrie = callPackage ../development/tools/analysis/valkyrie { };\n\n  xc3sprog = callPackage ../development/tools/misc/xc3sprog { };\n\n  xmlindent = callPackage ../development/web/xmlindent {};\n\n  xpwn = callPackage ../development/mobile/xpwn {};\n\n  xxdiff = callPackage ../development/tools/misc/xxdiff {\n    bison = bison2;\n  };\n\n  yacc = bison;\n\n  yodl = callPackage ../development/tools/misc/yodl { };\n\n\n  ### DEVELOPMENT / LIBRARIES\n\n  a52dec = callPackage ../development/libraries/a52dec { };\n\n  aacskeys = callPackage ../development/libraries/aacskeys { };\n\n  aalib = callPackage ../development/libraries/aalib { };\n\n  accountsservice = callPackage ../development/libraries/accountsservice { };\n\n  acl = callPackage ../development/libraries/acl { };\n\n  activemq = callPackage ../development/libraries/apache-activemq { };\n\n  adns = callPackage ../development/libraries/adns { };\n\n  afflib = callPackage ../development/libraries/afflib {};\n\n  agg = callPackage ../development/libraries/agg { };\n\n  allegro = callPackage ../development/libraries/allegro {};\n  allegro5 = callPackage ../development/libraries/allegro/5.nix {};\n  allegro5unstable = callPackage\n    ../development/libraries/allegro/5-unstable.nix {};\n\n  amrnb = callPackage ../development/libraries/amrnb { };\n\n  amrwb = callPackage ../development/libraries/amrwb { };\n\n  apr = callPackage ../development/libraries/apr { };\n\n  aprutil = callPackage ../development/libraries/apr-util {\n    bdbSupport = true;\n  };\n\n  asio = callPackage ../development/libraries/asio { };\n\n  aspell = callPackage ../development/libraries/aspell { };\n\n  aspellDicts = recurseIntoAttrs (import ../development/libraries/aspell/dictionaries.nix {\n    inherit fetchurl stdenv aspell which;\n  });\n\n  aterm = aterm25;\n\n  aterm25 = callPackage ../development/libraries/aterm/2.5.nix { };\n\n  aterm28 = lowPrio (callPackage ../development/libraries/aterm/2.8.nix { });\n\n  attica = callPackage ../development/libraries/attica { };\n\n  attr = callPackage ../development/libraries/attr { };\n\n  at_spi2_core = callPackage ../development/libraries/at-spi2-core { };\n\n  at_spi2_atk = callPackage ../development/libraries/at-spi2-atk { };\n\n  aqbanking = callPackage ../development/libraries/aqbanking { };\n\n  aubio = callPackage ../development/libraries/aubio { };\n\n  audiofile = callPackage ../development/libraries/audiofile { };\n\n  axis = callPackage ../development/libraries/axis { };\n\n  babl_0_0_22 = callPackage ../development/libraries/babl/0_0_22.nix { };\n\n  babl = callPackage ../development/libraries/babl { };\n\n  beecrypt = callPackage ../development/libraries/beecrypt { };\n\n  boehmgc = callPackage ../development/libraries/boehm-gc { };\n\n  boolstuff = callPackage ../development/libraries/boolstuff { };\n\n  boost144 = callPackage ../development/libraries/boost/1.44.nix { };\n  boost149 = callPackage ../development/libraries/boost/1.49.nix { };\n  boost155 = callPackage ../development/libraries/boost/1.55.nix { };\n  boost = boost155;\n\n  boostHeaders = callPackage ../development/libraries/boost/header-only-wrapper.nix { };\n\n  botan = callPackage ../development/libraries/botan { };\n  botanUnstable = callPackage ../development/libraries/botan/unstable.nix { };\n\n  box2d = callPackage ../development/libraries/box2d { };\n  box2d_2_0_1 = callPackage ../development/libraries/box2d/2.0.1.nix { };\n\n  buddy = callPackage ../development/libraries/buddy { };\n\n  bwidget = callPackage ../development/libraries/bwidget { };\n\n  c-ares = callPackage ../development/libraries/c-ares {\n    fetchurl = fetchurlBoot;\n  };\n\n  caelum = callPackage ../development/libraries/caelum { };\n\n  capnproto = callPackage ../development/libraries/capnproto { };\n\n  scmccid = callPackage ../development/libraries/scmccid { };\n\n  ccrtp = callPackage ../development/libraries/ccrtp { };\n  ccrtp_1_8 = callPackage ../development/libraries/ccrtp/1.8.nix { };\n\n  celt = callPackage ../development/libraries/celt {};\n  celt_0_7 = callPackage ../development/libraries/celt/0.7.nix {};\n  celt_0_5_1 = callPackage ../development/libraries/celt/0.5.1.nix {};\n\n  cgal = callPackage ../development/libraries/CGAL {};\n\n  cgui = callPackage ../development/libraries/cgui {};\n\n  check = callPackage ../development/libraries/check { };\n\n  chipmunk = builderDefsPackage (import ../development/libraries/chipmunk) {\n    inherit cmake freeglut mesa;\n    inherit (xlibs) libX11 xproto inputproto libXi libXmu;\n  };\n\n  chmlib = callPackage ../development/libraries/chmlib { };\n\n  chromaprint = callPackage ../development/libraries/chromaprint { };\n\n  cil = callPackage ../development/libraries/cil { };\n\n  cilaterm = callPackage ../development/libraries/cil-aterm {\n    stdenv = overrideInStdenv stdenv [gnumake380];\n  };\n\n  clanlib = callPackage ../development/libraries/clanlib { };\n\n  classads = callPackage ../development/libraries/classads { };\n\n  classpath = callPackage ../development/libraries/java/classpath {\n    javac = gcj;\n    jvm = gcj;\n    gconf = gnome.GConf;\n  };\n\n  clearsilver = callPackage ../development/libraries/clearsilver { };\n\n  cln = callPackage ../development/libraries/cln { };\n\n  clppcre = builderDefsPackage (import ../development/libraries/cl-ppcre) { };\n\n  clucene_core_2 = callPackage ../development/libraries/clucene-core/2.x.nix { };\n\n  clucene_core_1 = callPackage ../development/libraries/clucene-core { };\n\n  clucene_core = clucene_core_1;\n\n  clutter = callPackage ../development/libraries/clutter { };\n\n  clutter_1_18 = callPackage ../development/libraries/clutter/1.18.nix {\n    cogl = cogl_1_18;\n  };\n\n  clutter-gst = callPackage ../development/libraries/clutter-gst { };\n\n  clutter_gtk = callPackage ../development/libraries/clutter-gtk { };\n  clutter_gtk_0_10 = callPackage ../development/libraries/clutter-gtk/0.10.8.nix { };\n\n  cminpack = callPackage ../development/libraries/cminpack { };\n\n  cogl = callPackage ../development/libraries/cogl { };\n\n  cogl_1_18 = callPackage ../development/libraries/cogl/1.18.nix { };\n\n  coin3d = callPackage ../development/libraries/coin3d { };\n\n  commoncpp2 = callPackage ../development/libraries/commoncpp2 { };\n\n  confuse = callPackage ../development/libraries/confuse { };\n\n  coredumper = callPackage ../development/libraries/coredumper { };\n\n  ctl = callPackage ../development/libraries/ctl { };\n\n  cpp-netlib = callPackage ../development/libraries/cpp-netlib { };\n\n  cppunit = callPackage ../development/libraries/cppunit { };\n\n  cppnetlib = callPackage ../development/libraries/cppnetlib {\n    boost = boostHeaders;\n  };\n\n  cracklib = callPackage ../development/libraries/cracklib { };\n\n  cryptopp = callPackage ../development/libraries/crypto++ { };\n\n  cyrus_sasl = callPackage ../development/libraries/cyrus-sasl { };\n\n  # Make bdb5 the default as it is the last release under the custom\n  # bsd-like license\n  db = db5;\n  db4 = db48;\n  db44 = callPackage ../development/libraries/db/db-4.4.nix { };\n  db45 = callPackage ../development/libraries/db/db-4.5.nix { };\n  db47 = callPackage ../development/libraries/db/db-4.7.nix { };\n  db48 = callPackage ../development/libraries/db/db-4.8.nix { };\n  db5 = db53;\n  db53 = callPackage ../development/libraries/db/db-5.3.nix { };\n  db6 = db60;\n  db60 = callPackage ../development/libraries/db/db-6.0.nix { };\n\n  dbus = callPackage ../development/libraries/dbus { };\n  dbus_cplusplus  = callPackage ../development/libraries/dbus-cplusplus { };\n  dbus_glib       = callPackage ../development/libraries/dbus-glib { };\n  dbus_java       = callPackage ../development/libraries/java/dbus-java { };\n  dbus_python     = callPackage ../development/python-modules/dbus { };\n\n  # Should we deprecate these? Currently there are many references.\n  dbus_tools = pkgs.dbus.tools;\n  dbus_libs = pkgs.dbus.libs;\n  dbus_daemon = pkgs.dbus.daemon;\n\n  dhex = callPackage ../applications/editors/dhex { };\n\n  dclib = callPackage ../development/libraries/dclib { };\n\n  dillo = callPackage ../applications/networking/browsers/dillo {\n    fltk = fltk13;\n  };\n\n  directfb = callPackage ../development/libraries/directfb { };\n\n  dotconf = callPackage ../development/libraries/dotconf { };\n\n  dssi = callPackage ../development/libraries/dssi {};\n\n  dragonegg = llvmPackages.dragonegg;\n\n  dxflib = callPackage ../development/libraries/dxflib {};\n\n  eigen = callPackage ../development/libraries/eigen {};\n\n  eigen2 = callPackage ../development/libraries/eigen/2.0.nix {};\n\n  enchant = callPackage ../development/libraries/enchant { };\n\n  enet = callPackage ../development/libraries/enet { };\n\n  enginepkcs11 = callPackage ../development/libraries/enginepkcs11 { };\n\n  epoxy = callPackage ../development/libraries/epoxy {\n    inherit (xorg) utilmacros libX11;\n  };\n\n  esdl = callPackage ../development/libraries/esdl { };\n\n  exiv2 = callPackage ../development/libraries/exiv2 { };\n\n  expat = callPackage ../development/libraries/expat { };\n\n  extremetuxracer = builderDefsPackage (import ../games/extremetuxracer) {\n    inherit mesa tcl freeglut SDL SDL_mixer pkgconfig\n      gettext intltool;\n    inherit (xlibs) libX11 xproto libXi inputproto\n      libXmu libXext xextproto libXt libSM libICE;\n    libpng = libpng12;\n  };\n\n  eventlog = callPackage ../development/libraries/eventlog { };\n\n  facile = callPackage ../development/libraries/facile { };\n\n  faac = callPackage ../development/libraries/faac { };\n\n  faad2 = callPackage ../development/libraries/faad2 { };\n\n  farsight2 = callPackage ../development/libraries/farsight2 { };\n\n  farstream = callPackage ../development/libraries/farstream {\n    inherit (gst_all_1)\n      gstreamer gst-plugins-base gst-python gst-plugins-good gst-plugins-bad\n      gst-libav;\n  };\n\n  fcgi = callPackage ../development/libraries/fcgi { };\n\n  ffmpeg_0_6 = callPackage ../development/libraries/ffmpeg/0.6.nix {\n    vpxSupport = !stdenv.isMips;\n  };\n\n  ffmpeg_0_6_90 = callPackage ../development/libraries/ffmpeg/0.6.90.nix {\n    vpxSupport = !stdenv.isMips;\n  };\n\n  ffmpeg_0_10 = callPackage ../development/libraries/ffmpeg/0.10.nix {\n    vpxSupport = !stdenv.isMips;\n\n    stdenv = if stdenv.isDarwin\n      then overrideGCC stdenv gccApple\n      else stdenv;\n  };\n\n  ffmpeg_1 = callPackage ../development/libraries/ffmpeg/1.x.nix {\n    vpxSupport = !stdenv.isMips;\n  };\n\n  ffmpeg_2 = callPackage ../development/libraries/ffmpeg/2.x.nix { };\n\n  ffmpeg = ffmpeg_2;\n\n  ffms = callPackage ../development/libraries/ffms { };\n\n  fftw = callPackage ../development/libraries/fftw { };\n  fftwSinglePrec = fftw.override { precision = \"single\"; };\n  fftwFloat = fftwSinglePrec; # the configure option is just an alias\n\n  flann = callPackage ../development/libraries/flann { };\n\n  flite = callPackage ../development/libraries/flite { };\n\n  fltk13 = callPackage ../development/libraries/fltk/fltk13.nix { };\n\n  fltk20 = callPackage ../development/libraries/fltk { };\n\n  fmod = callPackage ../development/libraries/fmod { };\n\n  freeimage = callPackage ../development/libraries/freeimage { };\n\n  freetts = callPackage ../development/libraries/freetts { };\n\n  cfitsio = callPackage ../development/libraries/cfitsio { };\n\n  fontconfig = callPackage ../development/libraries/fontconfig { };\n\n  makeFontsConf = let fontconfig_ = fontconfig; in {fontconfig ? fontconfig_, fontDirectories}:\n    import ../development/libraries/fontconfig/make-fonts-conf.nix {\n      inherit runCommand libxslt fontconfig fontDirectories;\n    };\n\n  freealut = callPackage ../development/libraries/freealut { };\n\n  freeglut = callPackage ../development/libraries/freeglut { };\n\n  freetype = callPackage ../development/libraries/freetype { };\n\n  frei0r = callPackage ../development/libraries/frei0r { };\n\n  fribidi = callPackage ../development/libraries/fribidi { };\n\n  funambol = callPackage ../development/libraries/funambol { };\n\n  fam = gamin;\n\n  gamin = callPackage ../development/libraries/gamin { };\n\n  ganv = callPackage ../development/libraries/ganv { };\n\n  gav = callPackage ../games/gav { };\n\n  gsb = callPackage ../games/gsb { };\n\n  gdome2 = callPackage ../development/libraries/gdome2 {\n    inherit (gnome) gtkdoc;\n  };\n\n  gdbm = callPackage ../development/libraries/gdbm { };\n\n  gegl = callPackage ../development/libraries/gegl {\n    #  avocodec avformat librsvg\n  };\n\n  gegl_0_0_22 = callPackage ../development/libraries/gegl/0_0_22.nix {\n    #  avocodec avformat librsvg\n    libpng = libpng12;\n  };\n\n  geoclue = callPackage ../development/libraries/geoclue {};\n\n  geoclue2 = callPackage ../development/libraries/geoclue/2.0.nix {};\n\n  geoip = callPackage ../development/libraries/geoip { };\n\n  geoipjava = callPackage ../development/libraries/java/geoipjava { };\n\n  geos = callPackage ../development/libraries/geos { };\n\n  gettext = gettext_0_18;\n\n  gettext_0_17 = callPackage ../development/libraries/gettext/0.17.nix { };\n  gettext_0_18 = callPackage ../development/libraries/gettext { };\n\n  gd = callPackage ../development/libraries/gd { };\n\n  gdal = callPackage ../development/libraries/gdal { };\n\n  ggz_base_libs = callPackage ../development/libraries/ggz_base_libs {};\n\n  giblib = callPackage ../development/libraries/giblib { };\n\n  libgit2 = callPackage ../development/libraries/git2 { };\n\n  glew = callPackage ../development/libraries/glew { };\n\n  glfw = glfw3;\n  glfw2 = callPackage ../development/libraries/glfw/2.x.nix { };\n  glfw3 = callPackage ../development/libraries/glfw/3.x.nix { };\n\n  glibc = callPackage ../development/libraries/glibc/2.19 {\n    kernelHeaders = linuxHeaders;\n    installLocales = config.glibc.locales or false;\n    machHeaders = null;\n    hurdHeaders = null;\n    gccCross = null;\n  };\n\n  glibc_memusage = callPackage ../development/libraries/glibc/2.19 {\n    kernelHeaders = linuxHeaders;\n    installLocales = false;\n    withGd = true;\n  };\n\n  glibcCross = forceNativeDrv (makeOverridable (import ../development/libraries/glibc/2.19)\n    (let crossGNU = crossSystem != null && crossSystem.config == \"i586-pc-gnu\";\n     in {\n       inherit stdenv fetchurl;\n       gccCross = gccCrossStageStatic;\n       kernelHeaders = if crossGNU then gnu.hurdHeaders else linuxHeadersCross;\n       installLocales = config.glibc.locales or false;\n     }\n     // lib.optionalAttrs crossGNU {\n        inherit (gnu) machHeaders hurdHeaders libpthreadHeaders mig;\n        inherit fetchgit;\n      }));\n\n\n  # We can choose:\n  libcCrossChooser = name : if name == \"glibc\" then glibcCross\n    else if name == \"uclibc\" then uclibcCross\n    else if name == \"msvcrt\" then windows.mingw_w64\n    else if name == \"libSystem\" then darwin.xcode\n    else throw \"Unknown libc\";\n\n  libcCross = assert crossSystem != null; libcCrossChooser crossSystem.libc;\n\n  eglibc = callPackage ../development/libraries/eglibc {\n    kernelHeaders = linuxHeaders;\n    installLocales = config.glibc.locales or false;\n  };\n\n  glibcLocales = callPackage ../development/libraries/glibc/2.19/locales.nix { };\n\n  glibcInfo = callPackage ../development/libraries/glibc/2.19/info.nix { };\n\n  glibc_multi =\n    runCommand \"${glibc.name}-multi\"\n      { glibc64 = glibc;\n        glibc32 = (import ./all-packages.nix {system = \"i686-linux\";}).glibc;\n      }\n      ''\n        mkdir -p $out\n        ln -s $glibc64/* $out/\n\n        rm $out/lib $out/lib64\n        mkdir -p $out/lib\n        ln -s $glibc64/lib/* $out/lib\n        ln -s $glibc32/lib $out/lib/32\n        ln -s lib $out/lib64\n\n        # fixing ldd RLTDLIST\n        rm $out/bin\n        cp -rs $glibc64/bin $out\n        chmod u+w $out/bin\n        rm $out/bin/ldd\n        sed -e \"s|^RTLDLIST=.*$|RTLDLIST=\\\"$out/lib/ld-2.19.so $out/lib/32/ld-linux.so.2\\\"|g\" \\\n            $glibc64/bin/ldd > $out/bin/ldd\n        chmod 555 $out/bin/ldd\n\n        rm $out/include\n        cp -rs $glibc32/include $out\n        chmod -R u+w $out/include\n        cp -rsf $glibc64/include $out\n      '' # */\n      ;\n\n  glm = callPackage ../development/libraries/glm { };\n\n  glog = callPackage ../development/libraries/glog { };\n\n  gloox = callPackage ../development/libraries/gloox { };\n\n  glpk = callPackage ../development/libraries/glpk { };\n\n  glsurf = callPackage ../applications/science/math/glsurf {\n    inherit (ocamlPackages) lablgl findlib camlimages ocaml_mysql mlgmp;\n    libpng = libpng12;\n    giflib = giflib_4_1;\n  };\n\n  gmime = callPackage ../development/libraries/gmime { };\n\n  gmm = callPackage ../development/libraries/gmm { };\n\n  gmp = gmp5;\n  gmp5 = gmp51;\n\n  gmpxx = appendToName \"with-cxx\" (gmp.override { cxx = true; });\n\n  # The GHC bootstrap binaries link against libgmp.so.3, which is in GMP 4.x.\n  gmp4 = callPackage ../development/libraries/gmp/4.3.2.nix { };\n\n  gmp51 = callPackage ../development/libraries/gmp/5.1.x.nix { };\n\n  #GMP ex-satellite, so better keep it near gmp\n  mpfr = callPackage ../development/libraries/mpfr/default.nix { };\n\n  gobjectIntrospection = callPackage ../development/libraries/gobject-introspection { };\n\n  goocanvas = callPackage ../development/libraries/goocanvas { };\n\n  google-gflags = callPackage ../development/libraries/google-gflags { };\n\n  gperftools = callPackage ../development/libraries/gperftools { };\n\n  gst_all_1 = recurseIntoAttrs(callPackage ../development/libraries/gstreamer {\n    callPackage = pkgs.newScope (pkgs // { libav = pkgs.libav_10; });\n  });\n\n  gst_all = {\n    inherit (pkgs) gstreamer gnonlin gst_python qt_gstreamer;\n    gstPluginsBase = pkgs.gst_plugins_base;\n    gstPluginsBad = pkgs.gst_plugins_bad;\n    gstPluginsGood = pkgs.gst_plugins_good;\n    gstPluginsUgly = pkgs.gst_plugins_ugly;\n    gstFfmpeg = pkgs.gst_ffmpeg;\n  };\n\n  gstreamer = callPackage ../development/libraries/gstreamer/legacy/gstreamer {\n    bison = bison2;\n  };\n\n  gst_plugins_base = callPackage ../development/libraries/gstreamer/legacy/gst-plugins-base {};\n\n  gst_plugins_good = callPackage ../development/libraries/gstreamer/legacy/gst-plugins-good {};\n\n  gst_plugins_bad = callPackage ../development/libraries/gstreamer/legacy/gst-plugins-bad {};\n\n  gst_plugins_ugly = callPackage ../development/libraries/gstreamer/legacy/gst-plugins-ugly {};\n\n  gst_ffmpeg = callPackage ../development/libraries/gstreamer/legacy/gst-ffmpeg {\n    ffmpeg = ffmpeg_0_10;\n  };\n\n  gst_python = callPackage ../development/libraries/gstreamer/legacy/gst-python {};\n\n  gstreamermm = callPackage ../development/libraries/gstreamer/legacy/gstreamermm { };\n\n  gnonlin = callPackage ../development/libraries/gstreamer/legacy/gnonlin {};\n\n  gusb = callPackage ../development/libraries/gusb {\n    inherit (gnome) gtkdoc;\n  };\n\n  qt_gstreamer = callPackage ../development/libraries/gstreamer/legacy/qt-gstreamer {};\n\n  gnet = callPackage ../development/libraries/gnet { };\n\n  gnu-efi = callPackage ../development/libraries/gnu-efi { };\n\n  gnutls = gnutls32;\n\n  gnutls31 = callPackage ../development/libraries/gnutls/3.1.nix {\n    guileBindings = config.gnutls.guile or false;\n  };\n\n  gnutls32 = callPackage ../development/libraries/gnutls/3.2.nix {\n    guileBindings = config.gnutls.guile or false;\n  };\n\n  gnutls_with_guile = lowPrio (gnutls.override { guileBindings = true; });\n\n  gpac = callPackage ../applications/video/gpac { };\n\n  gpgme = callPackage ../development/libraries/gpgme {\n    gnupg1 = gnupg1orig;\n  };\n\n  grantlee = callPackage ../development/libraries/grantlee { };\n\n  gsasl = callPackage ../development/libraries/gsasl { };\n\n  gsl = callPackage ../development/libraries/gsl { };\n\n  gsm = callPackage ../development/libraries/gsm {};\n\n  gsoap = callPackage ../development/libraries/gsoap { };\n\n  gss = callPackage ../development/libraries/gss { };\n\n  gtkimageview = callPackage ../development/libraries/gtkimageview { };\n\n  gtkmathview = callPackage ../development/libraries/gtkmathview { };\n\n  gtkLibs = {\n    inherit (pkgs) glib glibmm atk atkmm cairo pango pangomm gdk_pixbuf gtk\n      gtkmm;\n  };\n\n  glib = callPackage ../development/libraries/glib { };\n  glib-tested = glib.override { doCheck = true; }; # checked version separate to break cycles\n  glibmm = callPackage ../development/libraries/glibmm { };\n\n  glib_networking = callPackage ../development/libraries/glib-networking {};\n\n  atk = callPackage ../development/libraries/atk { };\n  atkmm = callPackage ../development/libraries/atkmm { };\n\n  pixman = callPackage ../development/libraries/pixman { };\n\n  cairo = callPackage ../development/libraries/cairo {\n    glSupport = config.cairo.gl or (stdenv.isLinux &&\n      !stdenv.isArm && !stdenv.isMips);\n  };\n  cairomm = callPackage ../development/libraries/cairomm { };\n\n  pango = callPackage ../development/libraries/pango { };\n  pangomm = callPackage ../development/libraries/pangomm { };\n\n  pangox_compat = callPackage ../development/libraries/pangox-compat { };\n\n  gdk_pixbuf = callPackage ../development/libraries/gdk-pixbuf {\n    # workaround signal 10 in gdk_pixbuf tests\n    stdenv = if stdenv.isDarwin\n      then clangStdenv\n      else stdenv;\n  };\n\n  gtk2 = callPackage ../development/libraries/gtk+/2.x.nix {\n    cupsSupport = config.gtk2.cups or stdenv.isLinux;\n  };\n\n  gtk3 = callPackage ../development/libraries/gtk+/3.x.nix { };\n\n  gtk = pkgs.gtk2;\n\n  gtkmm = callPackage ../development/libraries/gtkmm/2.x.nix { };\n  gtkmm3 = callPackage ../development/libraries/gtkmm/3.x.nix { };\n\n  gtkmozembedsharp = callPackage ../development/libraries/gtkmozembed-sharp {\n    gtksharp = gtksharp2;\n  };\n\n  gtksharp1 = callPackage ../development/libraries/gtk-sharp-1 {\n    inherit (gnome) libglade libgtkhtml gtkhtml\n              libgnomecanvas libgnomeui libgnomeprint\n              libgnomeprintui GConf;\n  };\n\n  gtksharp2 = callPackage ../development/libraries/gtk-sharp-2 {\n    inherit (gnome) libglade libgtkhtml gtkhtml\n              libgnomecanvas libgnomeui libgnomeprint\n              libgnomeprintui GConf gnomepanel;\n  };\n\n  gtksourceviewsharp = callPackage ../development/libraries/gtksourceview-sharp {\n    inherit (gnome) gtksourceview;\n    gtksharp = gtksharp2;\n  };\n\n  gtkspell = callPackage ../development/libraries/gtkspell { };\n\n  gtkspell3 = callPackage ../development/libraries/gtkspell/3.nix { };\n\n  gts = callPackage ../development/libraries/gts { };\n\n  gvfs = callPackage ../development/libraries/gvfs { gconf = gnome.GConf; };\n\n  gwenhywfar = callPackage ../development/libraries/gwenhywfar { };\n\n  hamlib = callPackage ../development/libraries/hamlib { };\n\n  # TODO : Add MIT Kerberos and let admin choose.\n  kerberos = heimdal;\n\n  heimdal = callPackage ../development/libraries/kerberos/heimdal.nix { };\n\n  harfbuzz = callPackage ../development/libraries/harfbuzz { };\n\n  hawknl = callPackage ../development/libraries/hawknl { };\n\n  herqq = callPackage ../development/libraries/herqq { };\n\n  hspell = callPackage ../development/libraries/hspell { };\n\n  hspellDicts = callPackage ../development/libraries/hspell/dicts.nix { };\n\n  hsqldb = callPackage ../development/libraries/java/hsqldb { };\n\n  http-parser = callPackage ../development/libraries/http-parser { inherit (pythonPackages) gyp; };\n\n  hunspell = callPackage ../development/libraries/hunspell { };\n\n  hwloc = callPackage ../development/libraries/hwloc {\n    inherit (xlibs) libX11;\n  };\n\n  hydraAntLogger = callPackage ../development/libraries/java/hydra-ant-logger { };\n\n  icu = callPackage ../development/libraries/icu { };\n\n  id3lib = callPackage ../development/libraries/id3lib { };\n\n  iksemel = callPackage ../development/libraries/iksemel { };\n\n  ilbc = callPackage ../development/libraries/ilbc { };\n\n  ilixi = callPackage ../development/libraries/ilixi { };\n\n  ilmbase = callPackage ../development/libraries/ilmbase { };\n\n  imlib = callPackage ../development/libraries/imlib {\n    libpng = libpng12;\n  };\n\n  imlib2 = callPackage ../development/libraries/imlib2 { };\n\n  incrtcl = callPackage ../development/libraries/incrtcl { };\n\n  indilib = callPackage ../development/libraries/indilib { };\n\n  iniparser = callPackage ../development/libraries/iniparser { };\n\n  intltool = callPackage ../development/tools/misc/intltool { };\n\n  irrlicht3843 = callPackage ../development/libraries/irrlicht { };\n\n  isocodes = callPackage ../development/libraries/iso-codes { };\n\n  itk = callPackage ../development/libraries/itk { };\n\n  jamp = builderDefsPackage ../games/jamp {\n    inherit mesa SDL SDL_image SDL_mixer;\n  };\n\n  jasper = callPackage ../development/libraries/jasper { };\n\n  jama = callPackage ../development/libraries/jama { };\n\n  jansson = callPackage ../development/libraries/jansson { };\n\n  jbig2dec = callPackage ../development/libraries/jbig2dec { };\n\n  jetty_gwt = callPackage ../development/libraries/java/jetty-gwt { };\n\n  jetty_util = callPackage ../development/libraries/java/jetty-util { };\n\n  json_glib = callPackage ../development/libraries/json-glib { };\n\n  json-c-0-11 = callPackage ../development/libraries/json-c/0.11.nix { }; # vulnerable\n  json_c = callPackage ../development/libraries/json-c { };\n\n  jsoncpp = callPackage ../development/libraries/jsoncpp { };\n\n  libjson = callPackage ../development/libraries/libjson { };\n\n  judy = callPackage ../development/libraries/judy { };\n\n  keybinder = callPackage ../development/libraries/keybinder {\n    automake = automake111x;\n    lua = lua5_1;\n  };\n\n  keybinder3 = callPackage ../development/libraries/keybinder3 {\n    automake = automake111x;\n    lua = lua5_1;\n  };\n\n  krb5 = callPackage ../development/libraries/kerberos/krb5.nix { };\n\n  lcms = lcms1;\n\n  lcms1 = callPackage ../development/libraries/lcms { };\n\n  lcms2 = callPackage ../development/libraries/lcms2 { };\n\n  lensfun = callPackage ../development/libraries/lensfun { };\n\n  lesstif = callPackage ../development/libraries/lesstif { };\n\n  lesstif93 = callPackage ../development/libraries/lesstif-0.93 { };\n\n  leveldb = callPackage ../development/libraries/leveldb { };\n\n  levmar = callPackage ../development/libraries/levmar { };\n\n  leptonica = callPackage ../development/libraries/leptonica {\n    libpng = libpng12;\n  };\n\n  lgi = callPackage ../development/libraries/lgi {\n    lua = lua5_1;\n  };\n\n  lib3ds = callPackage ../development/libraries/lib3ds { };\n\n  libaacs = callPackage ../development/libraries/libaacs { };\n\n  libaal = callPackage ../development/libraries/libaal { };\n\n  libao = callPackage ../development/libraries/libao {\n    usePulseAudio = config.pulseaudio or true;\n  };\n\n  libarchive = callPackage ../development/libraries/libarchive { };\n\n  libass = callPackage ../development/libraries/libass { };\n\n  libassuan1 = callPackage ../development/libraries/libassuan1 { };\n\n  libassuan = callPackage ../development/libraries/libassuan { };\n\n  libassuan2_1 = callPackage ../development/libraries/libassuan/git.nix { };\n\n  libatomic_ops = callPackage ../development/libraries/libatomic_ops {};\n\n  libav = libav_10;\n  libav_all = callPackage ../development/libraries/libav { };\n  inherit (libav_all) libav_0_8 libav_9 libav_10;\n\n  libavc1394 = callPackage ../development/libraries/libavc1394 { };\n\n  libbluedevil = callPackage ../development/libraries/libbluedevil { };\n\n  libbluray = callPackage ../development/libraries/libbluray { };\n\n  libbs2b = callPackage ../development/libraries/audio/libbs2b { };\n\n  libcaca = callPackage ../development/libraries/libcaca { };\n\n  libcanberra = callPackage ../development/libraries/libcanberra { };\n  libcanberra_gtk3 = libcanberra.override { gtk = gtk3; };\n  libcanberra_kde = if (config.kde_runtime.libcanberraWithoutGTK or true)\n    then libcanberra.override { gtk = null; }\n    else libcanberra;\n\n  libcello = callPackage ../development/libraries/libcello {};\n\n  libcdaudio = callPackage ../development/libraries/libcdaudio { };\n\n  libcddb = callPackage ../development/libraries/libcddb { };\n\n  libcdio = callPackage ../development/libraries/libcdio { };\n  libcdio082 = callPackage ../development/libraries/libcdio/0.82.nix { };\n\n  libcdr = callPackage ../development/libraries/libcdr { lcms = lcms2; };\n\n  libchamplain = callPackage ../development/libraries/libchamplain {\n    inherit (gnome) libsoup;\n  };\n\n  libchamplain_0_6 = callPackage ../development/libraries/libchamplain/0.6.nix {};\n\n  libchop = callPackage ../development/libraries/libchop { };\n\n  libcm = callPackage ../development/libraries/libcm { };\n\n  inherit (gnome3) libcroco;\n\n  libcangjie = callPackage ../development/libraries/libcangjie { };\n\n  libcredis = callPackage ../development/libraries/libcredis { };\n\n  libctemplate = callPackage ../development/libraries/libctemplate { };\n\n  libcue = callPackage ../development/libraries/libcue { };\n\n  libdaemon = callPackage ../development/libraries/libdaemon { };\n\n  libdbi = callPackage ../development/libraries/libdbi { };\n\n  libdbiDriversBase = callPackage ../development/libraries/libdbi-drivers {\n    mysql = null;\n    sqlite = null;\n  };\n\n  libdbiDrivers = libdbiDriversBase.override {\n    inherit sqlite mysql;\n  };\n\n  libdbusmenu_qt = callPackage ../development/libraries/libdbusmenu-qt { };\n\n  libdc1394 = callPackage ../development/libraries/libdc1394 { };\n\n  libdc1394avt = callPackage ../development/libraries/libdc1394avt { };\n\n  libdevil = callPackage ../development/libraries/libdevil { };\n\n  libdiscid = callPackage ../development/libraries/libdiscid { };\n\n  libdivsufsort = callPackage ../development/libraries/libdivsufsort { };\n\n  libdmtx = callPackage ../development/libraries/libdmtx { };\n\n  libdnet = callPackage ../development/libraries/libdnet { };\n\n  libdrm = callPackage ../development/libraries/libdrm {\n    inherit fetchurl stdenv pkgconfig;\n    inherit (xorg) libpthreadstubs;\n  };\n\n  libdv = callPackage ../development/libraries/libdv { };\n\n  libdvbpsi = callPackage ../development/libraries/libdvbpsi { };\n\n  libdwg = callPackage ../development/libraries/libdwg { };\n\n  libdvdcss = callPackage ../development/libraries/libdvdcss { };\n\n  libdvdnav = callPackage ../development/libraries/libdvdnav { };\n\n  libdvdread = callPackage ../development/libraries/libdvdread { };\n\n  libdwarf = callPackage ../development/libraries/libdwarf { };\n\n  libeatmydata = callPackage ../development/libraries/libeatmydata { };\n\n  libebml = callPackage ../development/libraries/libebml { };\n\n  libedit = callPackage ../development/libraries/libedit { };\n\n  libelf = callPackage ../development/libraries/libelf { };\n\n  libfm = callPackage ../development/libraries/libfm { };\n\n  libgadu = callPackage ../development/libraries/libgadu { };\n\n  libgdata = gnome3.libgdata;\n\n  libgig = callPackage ../development/libraries/libgig { };\n\n  libgnome_keyring = callPackage ../development/libraries/libgnome-keyring { };\n  libgnome_keyring3 = gnome3.libgnome_keyring;\n\n  libgnurl = callPackage ../development/libraries/libgnurl { };\n\n  libseccomp = callPackage ../development/libraries/libseccomp { };\n\n  libsecret = callPackage ../development/libraries/libsecret { };\n\n  libserialport = callPackage ../development/libraries/libserialport { };\n\n  libgtop = callPackage ../development/libraries/libgtop {};\n\n  liblo = callPackage ../development/libraries/liblo { };\n\n  liblrdf = librdf;\n\n  liblscp = callPackage ../development/libraries/liblscp { };\n\n  libe-book = callPackage ../development/libraries/libe-book {};\n  libe-book_00 = callPackage ../development/libraries/libe-book/0.0.nix {};\n\n  libev = builderDefsPackage ../development/libraries/libev { };\n\n  libevent14 = callPackage ../development/libraries/libevent/1.4.nix { };\n  libevent = callPackage ../development/libraries/libevent { };\n\n  libewf = callPackage ../development/libraries/libewf { };\n\n  libexif = callPackage ../development/libraries/libexif { };\n\n  libexosip = callPackage ../development/libraries/exosip {};\n\n  libexosip_3 = callPackage ../development/libraries/exosip/3.x.nix {\n    libosip = libosip_3;\n  };\n\n  libextractor = callPackage ../development/libraries/libextractor {\n    libmpeg2 = mpeg2dec;\n  };\n\n  libexttextcat = callPackage ../development/libraries/libexttextcat {};\n\n  libf2c = callPackage ../development/libraries/libf2c {};\n\n  libfixposix = callPackage ../development/libraries/libfixposix {};\n\n  libffcall = builderDefsPackage (import ../development/libraries/libffcall) {\n    inherit fetchcvs;\n  };\n\n  libffi = callPackage ../development/libraries/libffi { };\n\n  libftdi = callPackage ../development/libraries/libftdi { };\n\n  libftdi1 = callPackage ../development/libraries/libftdi/1.x.nix { };\n\n  libgcrypt = callPackage ../development/libraries/libgcrypt { };\n\n  libgcrypt_1_6 = lowPrio (callPackage ../development/libraries/libgcrypt/1.6.nix { });\n\n  libgdiplus = callPackage ../development/libraries/libgdiplus { };\n\n  libgksu = callPackage ../development/libraries/libgksu { };\n\n  libgpgerror = callPackage ../development/libraries/libgpg-error { };\n\n  libgphoto2 = callPackage ../development/libraries/libgphoto2 { };\n\n  libgphoto2_4 = callPackage ../development/libraries/libgphoto2/2.4.nix { };\n\n  libgpod = callPackage ../development/libraries/libgpod {\n    inherit (pkgs.pythonPackages) mutagen;\n  };\n\n  libharu = callPackage ../development/libraries/libharu { };\n\n  libical = callPackage ../development/libraries/libical { };\n\n  libicns = callPackage ../development/libraries/libicns { };\n\n  libimobiledevice = callPackage ../development/libraries/libimobiledevice { };\n\n  libiodbc = callPackage ../development/libraries/libiodbc {\n    useGTK = config.libiodbc.gtk or false;\n  };\n\n  libivykis = callPackage ../development/libraries/libivykis { };\n\n  liblastfmSF = callPackage ../development/libraries/liblastfmSF { };\n\n  liblastfm = callPackage ../development/libraries/liblastfm { };\n\n  liblqr1 = callPackage ../development/libraries/liblqr-1 { };\n\n  liblockfile = callPackage ../development/libraries/liblockfile { };\n\n  liblogging = callPackage ../development/libraries/liblogging { };\n\n  libmcrypt = callPackage ../development/libraries/libmcrypt {};\n\n  libmhash = callPackage ../development/libraries/libmhash {};\n\n  libmodbus = callPackage ../development/libraries/libmodbus {};\n\n  libmtp = callPackage ../development/libraries/libmtp { };\n\n  libmsgpack = callPackage ../development/libraries/libmsgpack { };\n\n  libnatspec = callPackage ../development/libraries/libnatspec { };\n\n  libnfc = callPackage ../development/libraries/libnfc { };\n\n  libnfsidmap = callPackage ../development/libraries/libnfsidmap { };\n\n  libnice = callPackage ../development/libraries/libnice { };\n\n  liboping = callPackage ../development/libraries/liboping { };\n\n  libplist = callPackage ../development/libraries/libplist { };\n\n  libQGLViewer = callPackage ../development/libraries/libqglviewer { };\n\n  libre = callPackage ../development/libraries/libre {};\n  librem = callPackage ../development/libraries/librem {};\n\n  libresample = callPackage ../development/libraries/libresample {};\n\n  librevenge = callPackage ../development/libraries/librevenge {};\n\n  librevisa = callPackage ../development/libraries/librevisa { };\n\n  libsamplerate = callPackage ../development/libraries/libsamplerate { };\n\n  libspectre = callPackage ../development/libraries/libspectre { };\n\n  libgsf = callPackage ../development/libraries/libgsf { };\n\n  libiconv = callPackage ../development/libraries/libiconv { };\n\n  libiconvOrEmpty = if libiconvOrNull == null then [] else [libiconv];\n\n  libiconvOrNull =\n    if gcc.libc or null != null || stdenv.isGlibc\n    then null\n    else libiconv;\n\n  # The logic behind this attribute is broken: libiconvOrNull==null does\n  # NOT imply libiconv=glibc! On Darwin, for example, we have a native\n  # libiconv library which is not glibc.\n  libiconvOrLibc = if libiconvOrNull == null then gcc.libc else libiconv;\n\n  # On non-GNU systems we need GNU Gettext for libintl.\n  libintlOrEmpty = stdenv.lib.optional (!stdenv.isLinux) gettext;\n\n  libid3tag = callPackage ../development/libraries/libid3tag { };\n\n  libidn = callPackage ../development/libraries/libidn { };\n\n  libiec61883 = callPackage ../development/libraries/libiec61883 { };\n\n  libinfinity = callPackage ../development/libraries/libinfinity {\n    inherit (gnome) gtkdoc;\n  };\n\n  libiptcdata = callPackage ../development/libraries/libiptcdata { };\n\n  libjpeg_original = callPackage ../development/libraries/libjpeg { };\n  libjpeg_turbo = callPackage ../development/libraries/libjpeg-turbo { };\n  libjpeg = if (stdenv.isLinux) then libjpeg_turbo else libjpeg_original; # some problems, both on FreeBSD and Darwin\n\n  libjpeg62 = callPackage ../development/libraries/libjpeg/62.nix {\n    libtool = libtool_1_5;\n  };\n\n  libjson_rpc_cpp = callPackage ../development/libraries/libjson-rpc-cpp { };\n\n  libkate = callPackage ../development/libraries/libkate { };\n\n  libksba = callPackage ../development/libraries/libksba { };\n\n  libmad = callPackage ../development/libraries/libmad { };\n\n  libmatchbox = callPackage ../development/libraries/libmatchbox { };\n\n  libmatthew_java = callPackage ../development/libraries/java/libmatthew-java { };\n\n  libmatroska = callPackage ../development/libraries/libmatroska { };\n\n  libmcs = callPackage ../development/libraries/libmcs { };\n\n  libmemcached = callPackage ../development/libraries/libmemcached { };\n\n  libmicrohttpd = callPackage ../development/libraries/libmicrohttpd { };\n\n  libmikmod = callPackage ../development/libraries/libmikmod {\n    # resolve the \"stray '@' in program\" errors\n    stdenv = if stdenv.isDarwin\n      then overrideGCC stdenv gccApple\n      else stdenv;\n  };\n\n  libmilter = callPackage ../development/libraries/libmilter { };\n\n  libmkv = callPackage ../development/libraries/libmkv { };\n\n  libmms = callPackage ../development/libraries/libmms { };\n\n  libmowgli = callPackage ../development/libraries/libmowgli { };\n\n  libmng = callPackage ../development/libraries/libmng { };\n\n  libmnl = callPackage ../development/libraries/libmnl { };\n\n  libmodplug = callPackage ../development/libraries/libmodplug {};\n\n  libmpcdec = callPackage ../development/libraries/libmpcdec { };\n\n  libmp3splt = callPackage ../development/libraries/libmp3splt { };\n\n  libmrss = callPackage ../development/libraries/libmrss { };\n\n  libmsn = callPackage ../development/libraries/libmsn { };\n\n  libmspack = callPackage ../development/libraries/libmspack { };\n\n  libmusclecard = callPackage ../development/libraries/libmusclecard { };\n\n  libmusicbrainz2 = callPackage ../development/libraries/libmusicbrainz/2.x.nix { };\n\n  libmusicbrainz3 = callPackage ../development/libraries/libmusicbrainz { };\n\n  libmusicbrainz5 = callPackage ../development/libraries/libmusicbrainz/5.x.nix { };\n\n  libmusicbrainz = libmusicbrainz3;\n\n  libmwaw = callPackage ../development/libraries/libmwaw { };\n  libmwaw_02 = callPackage ../development/libraries/libmwaw/0.2.nix { };\n\n  libmx = callPackage ../development/libraries/libmx { };\n\n  libnet = callPackage ../development/libraries/libnet { };\n\n  libnetfilter_conntrack = callPackage ../development/libraries/libnetfilter_conntrack { };\n\n  libnetfilter_queue = callPackage ../development/libraries/libnetfilter_queue { };\n\n  libnfnetlink = callPackage ../development/libraries/libnfnetlink { };\n\n  libnftnl = callPackage ../development/libraries/libnftnl { };\n\n  libnih = callPackage ../development/libraries/libnih { };\n\n  libnova = callPackage ../development/libraries/libnova { };\n\n  libnxml = callPackage ../development/libraries/libnxml { };\n\n  libodfgen = callPackage ../development/libraries/libodfgen { };\n\n  libofa = callPackage ../development/libraries/libofa { };\n\n  libofx = callPackage ../development/libraries/libofx { };\n\n  libogg = callPackage ../development/libraries/libogg { };\n\n  liboggz = callPackage ../development/libraries/liboggz { };\n\n  liboil = callPackage ../development/libraries/liboil { };\n\n  liboop = callPackage ../development/libraries/liboop { };\n\n  libopus = callPackage ../development/libraries/libopus { };\n\n  libosinfo = callPackage ../development/libraries/libosinfo {};\n\n  libosip = callPackage ../development/libraries/osip {};\n\n  libosip_3 = callPackage ../development/libraries/osip/3.nix {};\n\n  libotr = callPackage ../development/libraries/libotr {\n    libgcrypt = libgcrypt_1_6;\n  };\n\n  libotr_3_2 = callPackage ../development/libraries/libotr/3.2.nix { };\n\n  libp11 = callPackage ../development/libraries/libp11 { };\n\n  libpar2 = callPackage ../development/libraries/libpar2 { };\n\n  libpcap = callPackage ../development/libraries/libpcap { };\n\n  libpipeline = callPackage ../development/libraries/libpipeline { };\n\n  libpng = callPackage ../development/libraries/libpng { };\n  libpng_apng = libpng.override { apngSupport = true; };\n  libpng12 = callPackage ../development/libraries/libpng/12.nix { };\n  libpng15 = callPackage ../development/libraries/libpng/15.nix { };\n\n  libpaper = callPackage ../development/libraries/libpaper { };\n\n  libproxy = callPackage ../development/libraries/libproxy {\n    stdenv = if stdenv.isDarwin\n      then overrideGCC stdenv gcc\n      else stdenv;\n  };\n\n  libpseudo = callPackage ../development/libraries/libpseudo { };\n\n  libpwquality = callPackage ../development/libraries/libpwquality { };\n\n  libqalculate = callPackage ../development/libraries/libqalculate { };\n\n  librsvg = callPackage ../development/libraries/librsvg {\n    gtk2 = null; gtk3 = null; # neither gtk version by default\n  };\n\n  librsync = callPackage ../development/libraries/librsync { };\n\n  libsearpc = callPackage ../development/libraries/libsearpc { };\n\n  libsigcxx = callPackage ../development/libraries/libsigcxx { };\n\n  libsigcxx12 = callPackage ../development/libraries/libsigcxx/1.2.nix { };\n\n  libsigsegv = callPackage ../development/libraries/libsigsegv { };\n\n  # To bootstrap SBCL, I need CLisp 2.44.1; it needs libsigsegv 2.5\n  libsigsegv_25 = callPackage ../development/libraries/libsigsegv/2.5.nix { };\n\n  libsndfile = callPackage ../development/libraries/libsndfile { };\n\n  libsodium = callPackage ../development/libraries/libsodium { };\n\n  libsoup = callPackage ../development/libraries/libsoup { };\n\n  libssh = callPackage ../development/libraries/libssh { };\n\n  libssh2 = callPackage ../development/libraries/libssh2 { };\n\n  libstartup_notification = callPackage ../development/libraries/startup-notification { };\n\n  libspatialindex = callPackage ../development/libraries/libspatialindex { };\n\n  libspatialite = callPackage ../development/libraries/libspatialite { };\n\n  libtar = callPackage ../development/libraries/libtar { };\n\n  libtasn1 = callPackage ../development/libraries/libtasn1 { };\n\n  libtheora = callPackage ../development/libraries/libtheora { };\n\n  libtiff = callPackage ../development/libraries/libtiff { };\n\n  libtiger = callPackage ../development/libraries/libtiger { };\n\n  libtommath = callPackage ../development/libraries/libtommath { };\n\n  libtorrentRasterbar = callPackage ../development/libraries/libtorrent-rasterbar {\n    # fix \"unrecognized option -arch\" error\n    stdenv = if stdenv.isDarwin\n      then clangStdenv\n      else stdenv;\n  };\n\n  libtoxcore = callPackage ../development/libraries/libtoxcore { };\n\n  libtsm = callPackage ../development/libraries/libtsm { };\n\n  libtunepimp = callPackage ../development/libraries/libtunepimp { };\n\n  libtxc_dxtn = callPackage ../development/libraries/libtxc_dxtn { };\n\n  libtxc_dxtn_s2tc = callPackage ../development/libraries/libtxc_dxtn_s2tc { };\n\n  libgeotiff = callPackage ../development/libraries/libgeotiff { };\n\n  libunistring = callPackage ../development/libraries/libunistring { };\n\n  libupnp = callPackage ../development/libraries/pupnp { };\n\n  giflib = callPackage ../development/libraries/giflib { };\n  giflib_4_1 = callPackage ../development/libraries/giflib/4.1.nix { };\n\n  libungif = callPackage ../development/libraries/giflib/libungif.nix { };\n\n  libunibreak = callPackage ../development/libraries/libunibreak { };\n\n  libunique = callPackage ../development/libraries/libunique/default.nix { };\n\n  liburcu = callPackage ../development/libraries/liburcu { };\n\n  libusb = callPackage ../development/libraries/libusb {};\n\n  libusb1 = callPackage ../development/libraries/libusb1 {\n    stdenv = if stdenv.isDarwin\n      then clangStdenv\n      else stdenv;\n  };\n\n  libunwind = callPackage ../development/libraries/libunwind { };\n\n  libuvVersions = callPackage ../development/libraries/libuv { };\n\n  libv4l = lowPrio (v4l_utils.override {\n    withQt4 = false;\n  });\n\n  libva = callPackage ../development/libraries/libva { };\n\n  libvdpau = callPackage ../development/libraries/libvdpau { };\n\n  libvirt = callPackage ../development/libraries/libvirt { };\n\n  libvirt-glib = callPackage ../development/libraries/libvirt-glib { };\n\n  libvisio = callPackage ../development/libraries/libvisio { };\n\n  libvisual = callPackage ../development/libraries/libvisual { };\n\n  libvncserver = callPackage ../development/libraries/libvncserver {};\n\n  libviper = callPackage ../development/libraries/libviper { };\n\n  libvpx = callPackage ../development/libraries/libvpx { };\n\n  libvterm = callPackage ../development/libraries/libvterm { };\n\n  libvorbis = callPackage ../development/libraries/libvorbis { };\n\n  libwebp = callPackage ../development/libraries/libwebp { };\n\n  libwmf = callPackage ../development/libraries/libwmf { };\n\n  libwnck = libwnck2;\n  libwnck2 = callPackage ../development/libraries/libwnck { };\n  libwnck3 = callPackage ../development/libraries/libwnck/3.x.nix { };\n\n  libwpd = callPackage ../development/libraries/libwpd { };\n\n  libwpd_08 = callPackage ../development/libraries/libwpd/0.8.nix { };\n\n  libwpg = callPackage ../development/libraries/libwpg { };\n\n  libx86 = builderDefsPackage ../development/libraries/libx86 {};\n\n  libxdg_basedir = callPackage ../development/libraries/libxdg-basedir { };\n\n  libxkbcommon = callPackage ../development/libraries/libxkbcommon { };\n\n  libxklavier = callPackage ../development/libraries/libxklavier { };\n\n  libxmi = callPackage ../development/libraries/libxmi { };\n\n  libxml2 = callPackage ../development/libraries/libxml2 {\n    pythonSupport = false;\n  };\n\n  libxml2Python = lowPrio (libxml2.override {\n    pythonSupport = true;\n  });\n\n  libxmlxx = callPackage ../development/libraries/libxmlxx { };\n\n  libxmp = callPackage ../development/libraries/libxmp { };\n\n  libxslt = callPackage ../development/libraries/libxslt { };\n\n  libixp_for_wmii = lowPrio (import ../development/libraries/libixp_for_wmii {\n    inherit fetchurl stdenv;\n  });\n\n  libyaml = callPackage ../development/libraries/libyaml { };\n\n  libyamlcpp = callPackage ../development/libraries/libyaml-cpp { };\n  libyamlcpp03 = callPackage ../development/libraries/libyaml-cpp/0.3.x.nix { };\n\n  libyubikey = callPackage ../development/libraries/libyubikey {};\n\n  libzip = callPackage ../development/libraries/libzip { };\n\n  libzdb = callPackage ../development/libraries/libzdb { };\n\n  libzrtpcpp = callPackage ../development/libraries/libzrtpcpp { };\n  libzrtpcpp_1_6 = callPackage ../development/libraries/libzrtpcpp/1.6.nix {\n    ccrtp = ccrtp_1_8;\n  };\n\n  libwacom = callPackage ../development/libraries/libwacom { };\n\n  lightning = callPackage ../development/libraries/lightning { };\n\n  lirc = callPackage ../development/libraries/lirc { };\n\n  liquidwar = builderDefsPackage ../games/liquidwar {\n    inherit (xlibs) xproto libX11 libXrender;\n    inherit gmp mesa libjpeg\n      expat gettext perl\n      SDL SDL_image SDL_mixer SDL_ttf\n      curl sqlite\n      libogg libvorbis libcaca csound cunit\n      ;\n    guile = guile_1_8;\n    libpng = libpng15; # 0.0.13 needs libpng 1.2--1.5\n  };\n\n  log4cpp = callPackage ../development/libraries/log4cpp { };\n\n  log4cxx = callPackage ../development/libraries/log4cxx { };\n\n  log4cplus = callPackage ../development/libraries/log4cplus { };\n\n  loudmouth = callPackage ../development/libraries/loudmouth { };\n\n  lzo = callPackage ../development/libraries/lzo { };\n\n  mdds_0_7_1 = callPackage ../development/libraries/mdds/0.7.1.nix { };\n  mdds = callPackage ../development/libraries/mdds { };\n\n  # failed to build\n  mediastreamer = callPackage ../development/libraries/mediastreamer { };\n\n  menu-cache = callPackage ../development/libraries/menu-cache { };\n\n  mesaSupported = lib.elem system lib.platforms.mesaPlatforms;\n\n  mesaDarwinOr = alternative: if stdenv.isDarwin\n    then callPackage ../development/libraries/mesa-darwin { }\n    else alternative;\n  mesa_noglu = mesaDarwinOr (callPackage ../development/libraries/mesa {\n    # makes it slower, but during runtime we link against just mesa_drivers\n    # through /run/opengl-driver*, which is overriden according to config.grsecurity\n    grsecEnabled = true;\n  });\n  mesa_glu =  mesaDarwinOr (callPackage ../development/libraries/mesa-glu { });\n  mesa_drivers = mesaDarwinOr (\n    let mo = mesa_noglu.override {\n      grsecEnabled = config.grsecurity or false;\n    };\n    in mo.drivers\n  );\n  mesa = mesaDarwinOr (buildEnv {\n    name = \"mesa-${mesa_noglu.version}\";\n    paths = [ mesa_noglu mesa_glu ];\n  });\n\n  metaEnvironment = recurseIntoAttrs (let callPackage = newScope pkgs.metaEnvironment; in rec {\n    sdfLibrary    = callPackage ../development/libraries/sdf-library { aterm = aterm28; };\n    toolbuslib    = callPackage ../development/libraries/toolbuslib { aterm = aterm28; inherit (windows) w32api; };\n    cLibrary      = callPackage ../development/libraries/c-library { aterm = aterm28; };\n    errorSupport  = callPackage ../development/libraries/error-support { aterm = aterm28; };\n    ptSupport     = callPackage ../development/libraries/pt-support { aterm = aterm28; };\n    ptableSupport = callPackage ../development/libraries/ptable-support { aterm = aterm28; };\n    configSupport = callPackage ../development/libraries/config-support { aterm = aterm28; };\n    asfSupport    = callPackage ../development/libraries/asf-support { aterm = aterm28; };\n    tideSupport   = callPackage ../development/libraries/tide-support { aterm = aterm28; };\n    rstoreSupport = callPackage ../development/libraries/rstore-support { aterm = aterm28; };\n    sdfSupport    = callPackage ../development/libraries/sdf-support { aterm = aterm28; };\n    sglr          = callPackage ../development/libraries/sglr { aterm = aterm28; };\n    ascSupport    = callPackage ../development/libraries/asc-support { aterm = aterm28; };\n    pgen          = callPackage ../development/libraries/pgen { aterm = aterm28; };\n  });\n\n  ming = callPackage ../development/libraries/ming { };\n\n  minizip = callPackage ../development/libraries/minizip { };\n\n  minmay = callPackage ../development/libraries/minmay { };\n\n  miro = callPackage ../applications/video/miro {\n    inherit (pythonPackages) pywebkitgtk pysqlite pycurl mutagen;\n  };\n\n  mkvtoolnix = callPackage ../applications/video/mkvtoolnix { };\n\n  mlt-qt4 = callPackage ../development/libraries/mlt {\n    qt = qt4;\n    SDL = SDL_pulseaudio;\n  };\n\n  mlt-qt5 = callPackage ../development/libraries/mlt {\n    qt = qt5;\n    SDL = SDL_pulseaudio;\n  };\n\n  movit = callPackage ../development/libraries/movit { };\n\n  mps = callPackage ../development/libraries/mps { };\n\n  libmpeg2 = callPackage ../development/libraries/libmpeg2 { };\n\n  mpeg2dec = libmpeg2;\n\n  msilbc = callPackage ../development/libraries/msilbc { };\n\n  mp4v2 = callPackage ../development/libraries/mp4v2 { };\n\n  mpc = callPackage ../development/libraries/mpc { };\n\n  mpich2 = callPackage ../development/libraries/mpich2 { };\n\n  mtdev = callPackage ../development/libraries/mtdev { };\n\n  mtpfs = callPackage ../tools/filesystems/mtpfs { };\n\n  mu = callPackage ../tools/networking/mu {\n    texinfo = texinfo4;\n  };\n\n  muparser = callPackage ../development/libraries/muparser { };\n\n  mygpoclient = callPackage ../development/python-modules/mygpoclient { };\n\n  mygui = callPackage ../development/libraries/mygui {};\n\n  myguiSvn = callPackage ../development/libraries/mygui/svn.nix {};\n\n  mysocketw = callPackage ../development/libraries/mysocketw { };\n\n  mythes = callPackage ../development/libraries/mythes { };\n\n  nanomsg = callPackage ../development/libraries/nanomsg { };\n\n  ncurses = callPackage ../development/libraries/ncurses {\n    unicode = system != \"i686-cygwin\";\n  };\n\n  neon = callPackage ../development/libraries/neon {\n    compressionSupport = true;\n    sslSupport = true;\n  };\n\n  nethack = builderDefsPackage (import ../games/nethack) {\n    inherit ncurses flex bison;\n  };\n\n  nettle = callPackage ../development/libraries/nettle { };\n\n  newt = callPackage ../development/libraries/newt { };\n\n  nix-plugins = callPackage ../development/libraries/nix-plugins {\n    nix = pkgs.nixUnstable;\n  };\n\n  nspr = callPackage ../development/libraries/nspr { };\n\n  nss = lowPrio (callPackage ../development/libraries/nss { });\n\n  nssTools = callPackage ../development/libraries/nss {\n    includeTools = true;\n  };\n\n  ntrack = callPackage ../development/libraries/ntrack { };\n\n  nvidia-texture-tools = callPackage ../development/libraries/nvidia-texture-tools { };\n\n  ode = builderDefsPackage (import ../development/libraries/ode) { };\n\n  ogre = callPackage ../development/libraries/ogre {};\n\n  ogrepaged = callPackage ../development/libraries/ogrepaged { };\n\n  oniguruma = callPackage ../development/libraries/oniguruma { };\n\n  openal = callPackage ../development/libraries/openal { };\n\n  # added because I hope that it has been easier to compile on x86 (for blender)\n  openalSoft = callPackage ../development/libraries/openal-soft { };\n\n  openbabel = callPackage ../development/libraries/openbabel { };\n\n  opencascade = callPackage ../development/libraries/opencascade { };\n\n  opencascade_6_5 = callPackage ../development/libraries/opencascade/6.5.nix {\n    automake = automake111x;\n    ftgl = ftgl212;\n  };\n\n  opencascade_oce = callPackage ../development/libraries/opencascade/oce.nix { };\n\n  opencsg = callPackage ../development/libraries/opencsg { };\n\n  openct = callPackage ../development/libraries/openct { };\n\n  opencv = callPackage ../development/libraries/opencv { };\n\n  opencv_2_1 = callPackage ../development/libraries/opencv/2.1.nix {\n    libpng = libpng12;\n  };\n\n  # this ctl version is needed by openexr_viewers\n  openexr_ctl = callPackage ../development/libraries/openexr_ctl { };\n\n  openexr = callPackage ../development/libraries/openexr { };\n\n  openldap = callPackage ../development/libraries/openldap { };\n\n  openlierox = callPackage ../games/openlierox { };\n\n  libopensc_dnie = callPackage ../development/libraries/libopensc-dnie { };\n\n  opencolorio = callPackage ../development/libraries/opencolorio { };\n\n  ois = callPackage ../development/libraries/ois {};\n\n  opal = callPackage ../development/libraries/opal {};\n\n  openjpeg = callPackage ../development/libraries/openjpeg { lcms = lcms2; };\n\n  openscenegraph = callPackage ../development/libraries/openscenegraph {\n    giflib = giflib_4_1;\n    ffmpeg = ffmpeg_0_10;\n  };\n\n  openspades = callPackage ../games/openspades {};\n\n  libressl = callPackage ../development/libraries/libressl { };\n\n  boringssl = callPackage ../development/libraries/boringssl { };\n\n  openssl = callPackage ../development/libraries/openssl {\n    fetchurl = fetchurlBoot;\n    cryptodevHeaders = linuxPackages.cryptodev.override {\n      fetchurl = fetchurlBoot;\n      onlyHeaders = true;\n    };\n  };\n\n  ortp = callPackage ../development/libraries/ortp {\n    srtp = srtp_linphone;\n  };\n\n  p11_kit = callPackage ../development/libraries/p11-kit { };\n\n  paperkey = callPackage ../tools/security/paperkey { };\n\n  pangoxsl = callPackage ../development/libraries/pangoxsl { };\n\n  pcl = callPackage ../development/libraries/pcl {\n    vtk = vtkWithQt4;\n  };\n\n  pcre = callPackage ../development/libraries/pcre {\n    unicodeSupport = config.pcre.unicode or true;\n  };\n\n  pdf2xml = callPackage ../development/libraries/pdf2xml {} ;\n\n  phonon = callPackage ../development/libraries/phonon { };\n\n  phonon_backend_gstreamer = callPackage ../development/libraries/phonon-backend-gstreamer { };\n\n  phonon_backend_vlc = callPackage ../development/libraries/phonon-backend-vlc { };\n\n  physfs = callPackage ../development/libraries/physfs { };\n\n  pkcs11helper = callPackage ../development/libraries/pkcs11helper { };\n\n  plib = callPackage ../development/libraries/plib { };\n\n  pocketsphinx = callPackage ../development/libraries/pocketsphinx { };\n\n  podofo = callPackage ../development/libraries/podofo { };\n\n  polkit = callPackage ../development/libraries/polkit {\n    spidermonkey = spidermonkey_185;\n  };\n\n  polkit_qt_1 = callPackage ../development/libraries/polkit-qt-1 { };\n\n  policykit = callPackage ../development/libraries/policykit { };\n\n  poppler = callPackage ../development/libraries/poppler { lcms = lcms2; };\n  popplerQt4 = poppler.poppler_qt4;\n\n  popt = callPackage ../development/libraries/popt { };\n\n  portaudio = callPackage ../development/libraries/portaudio {\n    # resolves a variety of compile-time errors\n    stdenv = if stdenv.isDarwin\n      then clangStdenv\n      else stdenv;\n  };\n\n  portaudioSVN = callPackage ../development/libraries/portaudio/svn-head.nix { };\n\n  portmidi = callPackage ../development/libraries/portmidi {};\n\n  prison = callPackage ../development/libraries/prison { };\n\n  proj = callPackage ../development/libraries/proj { };\n\n  postgis = callPackage ../development/libraries/postgis { };\n\n  protobuf = callPackage ../development/libraries/protobuf { };\n\n  protobufc = callPackage ../development/libraries/protobufc { };\n\n  pth = callPackage ../development/libraries/pth { };\n\n  ptlib = callPackage ../development/libraries/ptlib {};\n\n  re2 = callPackage ../development/libraries/re2 { };\n\n  qca2 = callPackage ../development/libraries/qca2 {};\n\n  qca2_ossl = callPackage ../development/libraries/qca2/ossl.nix {};\n\n  qimageblitz = callPackage ../development/libraries/qimageblitz {};\n\n  qjson = callPackage ../development/libraries/qjson { };\n\n  qoauth = callPackage ../development/libraries/qoauth { };\n\n  qt3 = callPackage ../development/libraries/qt-3 {\n    openglSupport = mesaSupported;\n    libpng = libpng12;\n  };\n\n  qt4 = pkgs.kde4.qt4;\n\n  qt48 = callPackage ../development/libraries/qt-4.x/4.8 {\n    # GNOME dependencies are not used unless gtkStyle == true\n    mesa = mesa_noglu;\n    inherit (pkgs.gnome) libgnomeui GConf gnome_vfs;\n    cups = if stdenv.isLinux then cups else null;\n\n    # resolve unrecognised flag '-fconstant-cfstrings' errors\n    stdenv = if stdenv.isDarwin\n      then clangStdenv\n      else stdenv;\n  };\n\n  qt48Full = qt48.override {\n    docs = true;\n    demos = true;\n    examples = true;\n    developerBuild = true;\n  };\n\n  qt4SDK = qtcreator.override {\n    sdkBuild = true;\n    qtLib = qt48Full;\n  };\n\n  qt53Full = qt53.override {\n    buildDocs = true;\n    buildExamples = true;\n    buildTests = true;\n    developerBuild = true;\n  };\n\n  qt53 = callPackage ../development/libraries/qt-5/qt-5.3.nix {\n    mesa = mesa_noglu;\n    cups = if stdenv.isLinux then cups else null;\n    # GNOME dependencies are not used unless gtkStyle == true\n    inherit (gnome) libgnomeui GConf gnome_vfs;\n    bison = bison2; # error: too few arguments to function 'int yylex(...\n  };\n\n  qt5 = callPackage ../development/libraries/qt-5 {\n    mesa = mesa_noglu;\n    cups = if stdenv.isLinux then cups else null;\n    # GNOME dependencies are not used unless gtkStyle == true\n    inherit (gnome) libgnomeui GConf gnome_vfs;\n    bison = bison2; # error: too few arguments to function 'int yylex(...\n  };\n\n  qt5Full = qt5.override {\n    buildDocs = true;\n    buildExamples = true;\n    buildTests = true;\n    developerBuild = true;\n  };\n\n  qt5SDK = qtcreator.override {\n    sdkBuild = true;\n    qtLib = qt5Full;\n  };\n\n  qtcreator = callPackage ../development/qtcreator {\n    qtLib = qt48.override { developerBuild = true; };\n  };\n\n  qtscriptgenerator = callPackage ../development/libraries/qtscriptgenerator { };\n\n  quesoglc = callPackage ../development/libraries/quesoglc { };\n\n  qwt = callPackage ../development/libraries/qwt {};\n\n  qwt6 = callPackage ../development/libraries/qwt/6.nix { };\n\n  rabbitmq-c = callPackage ../development/libraries/rabbitmq-c {};\n\n  rabbitmq-java-client = callPackage ../development/libraries/rabbitmq-java-client {};\n\n  raul = callPackage ../development/libraries/audio/raul { };\n\n  readline = readline6; # 6.2 works, 6.3 breaks python, parted\n\n  readline4 = callPackage ../development/libraries/readline/readline4.nix { };\n\n  readline5 = callPackage ../development/libraries/readline/readline5.nix { };\n\n  readline6 = callPackage ../development/libraries/readline/readline6.nix { };\n\n  readline63 = callPackage ../development/libraries/readline/readline6.3.nix { };\n\n  librdf_raptor = callPackage ../development/libraries/librdf/raptor.nix { };\n\n  librdf_raptor2 = callPackage ../development/libraries/librdf/raptor2.nix { };\n\n  librdf_rasqal = callPackage ../development/libraries/librdf/rasqal.nix { };\n\n  librdf_redland = callPackage ../development/libraries/librdf/redland.nix { };\n\n  librdf = callPackage ../development/libraries/librdf { };\n\n  lilv = callPackage ../development/libraries/audio/lilv { };\n\n  lv2 = callPackage ../development/libraries/audio/lv2 { };\n\n  lvtk = callPackage ../development/libraries/audio/lvtk { };\n\n  qrupdate = callPackage ../development/libraries/qrupdate { };\n\n  redland = pkgs.librdf_redland;\n\n  rhino = callPackage ../development/libraries/java/rhino {\n    javac = gcj;\n    jvm = gcj;\n  };\n\n  rlog = callPackage ../development/libraries/rlog { };\n\n  rubberband = callPackage ../development/libraries/rubberband {\n    fftw = fftwSinglePrec;\n    inherit (vamp) vampSDK;\n  };\n\n  sbc = callPackage ../development/libraries/sbc { };\n\n  schroedinger = callPackage ../development/libraries/schroedinger { };\n\n  SDL = callPackage ../development/libraries/SDL {\n    openglSupport = mesaSupported;\n    alsaSupport = (!stdenv.isDarwin);\n    x11Support = true;\n    pulseaudioSupport = stdenv.isDarwin; # better go through ALSA\n\n    # resolve the unrecognized -fpascal-strings option error\n    stdenv = if stdenv.isDarwin\n      then clangStdenv\n      else stdenv;\n  };\n\n  # Fixes major problems with choppy sound in MLT / Kdenlive / Shotcut\n  SDL_pulseaudio = SDL.override { pulseaudioSupport = true; };\n\n  SDL_gfx = callPackage ../development/libraries/SDL_gfx { };\n\n  SDL_image = callPackage ../development/libraries/SDL_image {\n    # provide an Objective-C compiler\n    stdenv = if stdenv.isDarwin\n      then clangStdenv\n      else stdenv;\n  };\n\n  SDL_mixer = callPackage ../development/libraries/SDL_mixer { };\n\n  SDL_net = callPackage ../development/libraries/SDL_net { };\n\n  SDL_sound = callPackage ../development/libraries/SDL_sound { };\n\n  SDL_ttf = callPackage ../development/libraries/SDL_ttf { };\n\n  SDL2 = callPackage ../development/libraries/SDL2 {\n    openglSupport = mesaSupported;\n    alsaSupport = true;\n    x11Support = true;\n    pulseaudioSupport = false; # better go through ALSA\n  };\n\n  SDL2_image = callPackage ../development/libraries/SDL2_image { };\n\n  SDL2_mixer = callPackage ../development/libraries/SDL2_mixer { };\n\n  SDL2_net = callPackage ../development/libraries/SDL2_net { };\n\n  SDL2_gfx = callPackage ../development/libraries/SDL2_gfx { };\n\n  serd = callPackage ../development/libraries/serd {};\n\n  serf = callPackage ../development/libraries/serf {};\n\n  silgraphite = callPackage ../development/libraries/silgraphite {};\n  graphite2 = callPackage ../development/libraries/silgraphite/graphite2.nix {};\n\n  simgear = callPackage ../development/libraries/simgear { };\n\n  sfml_git = callPackage ../development/libraries/sfml { };\n\n  skalibs = callPackage ../development/libraries/skalibs { };\n\n  slang = callPackage ../development/libraries/slang { };\n\n  slibGuile = callPackage ../development/libraries/slib {\n    scheme = guile_1_8;\n    texinfo = texinfo4; # otherwise erros: must be after `@defun' to use `@defunx'\n  };\n\n  smpeg = callPackage ../development/libraries/smpeg { };\n\n  snack = callPackage ../development/libraries/snack {\n        # optional\n  };\n\n  snappy = callPackage ../development/libraries/snappy { };\n\n  sodium = callPackage ../development/libraries/sodium {};\n\n  sofia_sip = callPackage ../development/libraries/sofia-sip { };\n\n  soprano = callPackage ../development/libraries/soprano { };\n\n  soqt = callPackage ../development/libraries/soqt { };\n\n  sord = callPackage ../development/libraries/sord {};\n\n  spandsp = callPackage ../development/libraries/spandsp {};\n\n  speechd = callPackage ../development/libraries/speechd { };\n\n  speech_tools = callPackage ../development/libraries/speech-tools {};\n\n  speex = callPackage ../development/libraries/speex { };\n\n  sphinxbase = callPackage ../development/libraries/sphinxbase { };\n\n  spice = callPackage ../development/libraries/spice {\n    celt = celt_0_5_1;\n    inherit (xlibs) libXrandr libXfixes libXext libXrender libXinerama;\n    inherit (pythonPackages) pyparsing;\n  };\n\n  spice_gtk = callPackage ../development/libraries/spice-gtk { };\n\n  spice_protocol = callPackage ../development/libraries/spice-protocol { };\n\n  sratom = callPackage ../development/libraries/audio/sratom { };\n\n  srtp = callPackage ../development/libraries/srtp {};\n\n  srtp_linphone = callPackage ../development/libraries/srtp/linphone.nix { };\n\n  sqlite = lowPrio (callPackage ../development/libraries/sqlite {\n    readline = null;\n    ncurses = null;\n  });\n\n  sqliteInteractive = appendToName \"interactive\" (sqlite.override {\n    inherit readline ncurses;\n  });\n\n  sqlcipher = lowPrio (callPackage ../development/libraries/sqlcipher {\n    readline = null;\n    ncurses = null;\n  });\n\n  stfl = callPackage ../development/libraries/stfl {\n    stdenv = if stdenv.isDarwin\n      then overrideGCC stdenv gccApple\n      else stdenv;\n  };\n\n  stlink = callPackage ../development/tools/misc/stlink { };\n\n  steghide = callPackage ../tools/security/steghide {};\n\n  stepmania = callPackage ../games/stepmania {};\n\n  stlport = callPackage ../development/libraries/stlport { };\n\n  strigi = callPackage ../development/libraries/strigi { clucene_core = clucene_core_2; };\n\n  subtitleeditor = callPackage ../applications/video/subtitleeditor { };\n\n  suil = callPackage ../development/libraries/audio/suil { };\n\n  suitesparse = callPackage ../development/libraries/suitesparse { };\n\n  sutils = callPackage ../tools/misc/sutils { };\n\n  sword = callPackage ../development/libraries/sword { };\n\n  szip = callPackage ../development/libraries/szip { };\n\n  t1lib = callPackage ../development/libraries/t1lib { };\n\n  taglib = callPackage ../development/libraries/taglib { };\n\n  taglib_extras = callPackage ../development/libraries/taglib-extras { };\n\n  talloc = callPackage ../development/libraries/talloc { };\n\n  tclap = callPackage ../development/libraries/tclap {};\n\n  tclgpg = callPackage ../development/libraries/tclgpg { };\n\n  tcllib = callPackage ../development/libraries/tcllib { };\n\n  tcltls = callPackage ../development/libraries/tcltls { };\n\n  tdb = callPackage ../development/libraries/tdb { };\n\n  tecla = callPackage ../development/libraries/tecla { };\n\n  telepathy_glib = callPackage ../development/libraries/telepathy/glib { };\n\n  telepathy_farstream = callPackage ../development/libraries/telepathy/farstream {};\n\n  telepathy_qt = callPackage ../development/libraries/telepathy/qt { };\n\n  thrift = callPackage ../development/libraries/thrift { };\n\n  tinyxml = tinyxml2;\n\n  tinyxml2 = callPackage ../development/libraries/tinyxml/2.6.2.nix { };\n\n  tk = callPackage ../development/libraries/tk { };\n\n  tnt = callPackage ../development/libraries/tnt { };\n\n  tokyocabinet = callPackage ../development/libraries/tokyo-cabinet { };\n  tokyotyrant = callPackage ../development/libraries/tokyo-tyrant { };\n\n  tremor = callPackage ../development/libraries/tremor { };\n\n  unicap = callPackage ../development/libraries/unicap {};\n\n  tsocks = callPackage ../development/libraries/tsocks { };\n\n  unixODBC = callPackage ../development/libraries/unixODBC { };\n\n  unixODBCDrivers = recurseIntoAttrs (import ../development/libraries/unixODBCDrivers {\n    inherit fetchurl stdenv unixODBC glibc libtool openssl zlib;\n    inherit postgresql mysql sqlite;\n  });\n\n  urt = callPackage ../development/libraries/urt { };\n\n  ustr = callPackage ../development/libraries/ustr { };\n\n  usbredir = callPackage ../development/libraries/usbredir {\n    libusb = libusb1;\n  };\n\n  ucommon = callPackage ../development/libraries/ucommon { };\n\n  v8 = callPackage ../development/libraries/v8 {\n    inherit (pythonPackages) gyp;\n  };\n\n  vaapiIntel = callPackage ../development/libraries/vaapi-intel { };\n\n  vaapiVdpau = callPackage ../development/libraries/vaapi-vdpau { };\n\n  vamp = callPackage ../development/libraries/audio/vamp { };\n\n  vcdimager = callPackage ../development/libraries/vcdimager { };\n\n  vigra = callPackage ../development/libraries/vigra {\n    inherit (pkgs.pythonPackages) numpy;\n  };\n\n  vlock = callPackage ../misc/screensavers/vlock { };\n\n  vmime = callPackage ../development/libraries/vmime { };\n\n  vrpn = callPackage ../development/libraries/vrpn { };\n\n  vtk = callPackage ../development/libraries/vtk { };\n\n  vtkWithQt4 = vtk.override { qtLib = qt4; };\n\n  vxl = callPackage ../development/libraries/vxl {\n    libpng = libpng12;\n  };\n\n  wayland = callPackage ../development/libraries/wayland { };\n\n  webkit = webkitgtk;\n\n  webkitgtk = callPackage ../development/libraries/webkitgtk {\n    harfbuzz = harfbuzz.override {\n      withIcu = true;\n    };\n    gst-plugins-base = gst_all_1.gst-plugins-base;\n  };\n\n  webkitgtk2 = webkitgtk.override {\n    withGtk2 = true;\n    enableIntrospection = false;\n  };\n\n  wildmidi = callPackage ../development/libraries/wildmidi { };\n\n  wvstreams = callPackage ../development/libraries/wvstreams { };\n\n  wxGTK = wxGTK28;\n\n  wxGTK28 = callPackage ../development/libraries/wxGTK-2.8 {\n    inherit (gnome) GConf;\n    withMesa = lib.elem system lib.platforms.mesaPlatforms;\n  };\n\n  wxGTK29 = callPackage ../development/libraries/wxGTK-2.9/default.nix {\n    inherit (gnome) GConf;\n    withMesa = lib.elem system lib.platforms.mesaPlatforms;\n\n    # use for Objective-C++ compiler\n    stdenv = if stdenv.isDarwin\n      then clangStdenv\n      else stdenv;\n  };\n\n  wxGTK30 = callPackage ../development/libraries/wxGTK-3.0/default.nix {\n    inherit (gnome) GConf;\n    withMesa = lib.elem system lib.platforms.mesaPlatforms;\n\n    # use for Objective-C++ compiler\n    stdenv = if stdenv.isDarwin\n      then clangStdenv\n      else stdenv;\n  };\n\n  wtk = callPackage ../development/libraries/wtk { };\n\n  x264 = callPackage ../development/libraries/x264 { };\n\n  xapian = callPackage ../development/libraries/xapian { };\n\n  xapianBindings = callPackage ../development/libraries/xapian/bindings {  # TODO perl php Java, tcl, C#, python\n  };\n\n  xapian10 = callPackage ../development/libraries/xapian/1.0.x.nix { };\n\n  xapianBindings10 = callPackage ../development/libraries/xapian/bindings/1.0.x.nix {  # TODO perl php Java, tcl, C#, python\n  };\n\n  Xaw3d = callPackage ../development/libraries/Xaw3d { };\n\n  xbase = callPackage ../development/libraries/xbase { };\n\n  xcb-util-cursor = callPackage ../development/libraries/xcb-util-cursor { };\n\n  xdo = callPackage ../tools/misc/xdo { };\n\n  xineLib = callPackage ../development/libraries/xine-lib {\n    ffmpeg = ffmpeg_1;\n  };\n\n  xautolock = callPackage ../misc/screensavers/xautolock { };\n\n  xercesc = callPackage ../development/libraries/xercesc {};\n\n  xlibsWrapper = callPackage ../development/libraries/xlibs-wrapper {\n    packages = [\n      freetype fontconfig xlibs.xproto xlibs.libX11 xlibs.libXt\n      xlibs.libXft xlibs.libXext xlibs.libSM xlibs.libICE\n      xlibs.xextproto\n    ];\n  };\n\n  xmlrpc_c = callPackage ../development/libraries/xmlrpc-c { };\n\n  xmlsec = callPackage ../development/libraries/xmlsec { };\n\n  xvidcore = callPackage ../development/libraries/xvidcore { };\n\n  xylib = callPackage ../development/libraries/xylib { };\n\n  yajl = callPackage ../development/libraries/yajl { };\n\n  zangband = builderDefsPackage (import ../games/zangband) {\n    inherit ncurses flex bison autoconf automake m4 coreutils;\n  };\n\n  zeitgeist = callPackage ../development/libraries/zeitgeist { };\n\n  zlib = callPackage ../development/libraries/zlib {\n    fetchurl = fetchurlBoot;\n  };\n\n  zlibStatic = lowPrio (appendToName \"static\" (callPackage ../development/libraries/zlib {\n    static = true;\n  }));\n\n  zeromq2 = callPackage ../development/libraries/zeromq/2.x.nix {};\n  zeromq3 = callPackage ../development/libraries/zeromq/3.x.nix {};\n  zeromq4 = callPackage ../development/libraries/zeromq/4.x.nix {};\n\n  zziplib = callPackage ../development/libraries/zziplib { };\n\n\n  ### DEVELOPMENT / LIBRARIES / JAVA\n\n  atermjava = callPackage ../development/libraries/java/aterm {\n    stdenv = overrideInStdenv stdenv [gnumake380];\n  };\n\n  commonsFileUpload = callPackage ../development/libraries/java/jakarta-commons/file-upload { };\n\n  fastjar = callPackage ../development/tools/java/fastjar { };\n\n  httpunit = callPackage ../development/libraries/java/httpunit { };\n\n  gwtdragdrop = callPackage ../development/libraries/java/gwt-dragdrop { };\n\n  gwtwidgets = callPackage ../development/libraries/java/gwt-widgets { };\n\n  jakartabcel = callPackage ../development/libraries/java/jakarta-bcel {\n    regexp = jakartaregexp;\n  };\n\n  jakartaregexp = callPackage ../development/libraries/java/jakarta-regexp { };\n\n  javaCup = callPackage ../development/libraries/java/cup { };\n\n  javasvn = callPackage ../development/libraries/java/javasvn { };\n\n  jclasslib = callPackage ../development/tools/java/jclasslib { };\n\n  jdom = callPackage ../development/libraries/java/jdom { };\n\n  jflex = callPackage ../development/libraries/java/jflex { };\n\n  jjtraveler = callPackage ../development/libraries/java/jjtraveler {\n    stdenv = overrideInStdenv stdenv [gnumake380];\n  };\n\n  junit = callPackage ../development/libraries/java/junit { antBuild = releaseTools.antBuild; };\n\n  junixsocket = callPackage ../development/libraries/java/junixsocket { };\n\n  jzmq = callPackage ../development/libraries/java/jzmq { };\n\n  lucene = callPackage ../development/libraries/java/lucene { };\n\n  mockobjects = callPackage ../development/libraries/java/mockobjects { };\n\n  saxon = callPackage ../development/libraries/java/saxon { };\n\n  saxonb = callPackage ../development/libraries/java/saxon/default8.nix { };\n\n  sharedobjects = callPackage ../development/libraries/java/shared-objects {\n    stdenv = overrideInStdenv stdenv [gnumake380];\n  };\n\n  smack = callPackage ../development/libraries/java/smack { };\n\n  swt = callPackage ../development/libraries/java/swt {\n    inherit (gnome) libsoup;\n  };\n\n\n  ### DEVELOPMENT / LIBRARIES / JAVASCRIPT\n\n  jquery_ui = callPackage ../development/libraries/javascript/jquery-ui { };\n\n  yuicompressor = callPackage ../development/tools/yuicompressor { };\n\n  ### DEVELOPMENT / LISP MODULES\n\n  asdf = callPackage ../development/lisp-modules/asdf {\n    texLive = null;\n  };\n\n  clwrapperFunction = callPackage ../development/lisp-modules/clwrapper;\n\n  wrapLisp = lisp: clwrapperFunction { inherit lisp; };\n\n  lispPackagesFor = clwrapper: callPackage ../development/lisp-modules/lisp-packages.nix {\n    inherit clwrapper;\n  };\n\n  lispPackagesClisp = lispPackagesFor (wrapLisp clisp);\n  lispPackagesSBCL = lispPackagesFor (wrapLisp sbcl);\n  lispPackages = recurseIntoAttrs lispPackagesSBCL;\n\n\n  ### DEVELOPMENT / PERL MODULES\n\n  buildPerlPackage = import ../development/perl-modules/generic perl;\n\n  perlPackages = recurseIntoAttrs (import ./perl-packages.nix {\n    inherit pkgs;\n    overrides = (config.perlPackageOverrides or (p: {})) pkgs;\n  });\n\n  perl514Packages = import ./perl-packages.nix {\n    pkgs = pkgs // {\n      perl = perl514;\n      buildPerlPackage = import ../development/perl-modules/generic perl514;\n    };\n    overrides = (config.perl514PackageOverrides or (p: {})) pkgs;\n  };\n\n  perlXMLParser = perlPackages.XMLParser;\n\n  ack = perlPackages.ack;\n\n  perlArchiveCpio = perlPackages.ArchiveCpio;\n\n  perlcritic = perlPackages.PerlCritic;\n\n  planetary_annihilation = callPackage ../games/planetaryannihilation { };\n\n\n  ### DEVELOPMENT / PYTHON MODULES\n\n  # python function with default python interpreter\n  buildPythonPackage = pythonPackages.buildPythonPackage;\n\n  # `nix-env -i python-nose` installs for 2.7, the default python.\n  # Therefore we do not recurse into attributes here, in contrast to\n  # python27Packages. `nix-env -iA python26Packages.nose` works\n  # regardless.\n  python26Packages = import ./python-packages.nix {\n    inherit pkgs;\n    python = python26;\n  };\n\n  python27Packages = lib.hiPrioSet (recurseIntoAttrs (import ./python-packages.nix {\n    inherit pkgs;\n    python = python27;\n  }));\n\n  python32Packages = import ./python-packages.nix {\n    inherit pkgs;\n    python = python32;\n  };\n\n  python33Packages = recurseIntoAttrs (import ./python-packages.nix {\n    inherit pkgs;\n    python = python33;\n  });\n\n  python34Packages = recurseIntoAttrs (import ./python-packages.nix {\n    inherit pkgs;\n    python = python34;\n  });\n\n  pypyPackages = recurseIntoAttrs (import ./python-packages.nix {\n    inherit pkgs;\n    python = pypy;\n  });\n\n  foursuite = callPackage ../development/python-modules/4suite { };\n\n  bsddb3 = callPackage ../development/python-modules/bsddb3 { };\n\n  ecdsa = callPackage ../development/python-modules/ecdsa { };\n\n  numeric = callPackage ../development/python-modules/numeric { };\n\n  pil = pythonPackages.pil;\n\n  psyco = callPackage ../development/python-modules/psyco { };\n\n  pycairo = pythonPackages.pycairo;\n\n  pycapnp = pythonPackages.pycapnp;\n\n  pycrypto = pythonPackages.pycrypto;\n\n  pycups = callPackage ../development/python-modules/pycups { };\n\n  pyexiv2 = callPackage ../development/python-modules/pyexiv2 { };\n\n  pygame = callPackage ../development/python-modules/pygame { };\n\n  pygobject = pythonPackages.pygobject;\n\n  pygobject3 = pythonPackages.pygobject3;\n\n  pygtk = pythonPackages.pygtk;\n\n  pyGtkGlade = pythonPackages.pyGtkGlade;\n\n  pylint = callPackage ../development/python-modules/pylint { };\n\n  pyopenssl = builderDefsPackage (import ../development/python-modules/pyopenssl) {\n    inherit python openssl;\n  };\n\n  rhpl = callPackage ../development/python-modules/rhpl { };\n\n  sip = callPackage ../development/python-modules/sip { };\n\n  pyqt4 = callPackage ../development/python-modules/pyqt/4.x.nix {\n    stdenv = if stdenv.isDarwin\n      then clangStdenv\n      else stdenv;\n  };\n\n  pysideApiextractor = callPackage ../development/python-modules/pyside/apiextractor.nix { };\n\n  pysideGeneratorrunner = callPackage ../development/python-modules/pyside/generatorrunner.nix { };\n\n  pyside = callPackage ../development/python-modules/pyside { };\n\n  pysideTools = callPackage ../development/python-modules/pyside/tools.nix { };\n\n  pysideShiboken = callPackage ../development/python-modules/pyside/shiboken.nix { };\n\n  pyx = callPackage ../development/python-modules/pyx { };\n\n  pyxml = callPackage ../development/python-modules/pyxml { };\n\n  rbtools = callPackage ../development/python-modules/rbtools { };\n\n  setuptools = pythonPackages.setuptools;\n\n  slowaes = callPackage ../development/python-modules/slowaes { };\n\n  wxPython = pythonPackages.wxPython;\n  wxPython28 = pythonPackages.wxPython28;\n\n  twisted = pythonPackages.twisted;\n\n  ZopeInterface = pythonPackages.zope_interface;\n\n  ### DEVELOPMENT / R MODULES\n\n  R = callPackage ../applications/science/math/R {\n    inherit (xlibs) libX11 libXt;\n    texLive = texLiveAggregationFun { paths = [ texLive texLiveExtra ]; };\n    withRecommendedPackages = false;\n  };\n\n  rWrapper = callPackage ../development/r-modules/wrapper.nix {\n    # Those packages are usually installed as part of the R build.\n    recommendedPackages = with rPackages; [ MASS lattice Matrix nlme\n      survival boot cluster codetools foreign KernSmooth rpart class\n      nnet spatial mgcv ];\n    # Override this attribute to register additional libraries.\n    packages = [];\n  };\n\n  rPackages = import ../development/r-modules/cran-packages.nix {\n    inherit pkgs;\n    overrides = (config.rPackageOverrides or (p: {})) pkgs;\n  };\n\n  ### SERVERS\n\n  rdf4store = callPackage ../servers/http/4store { };\n\n  apacheHttpd = pkgs.apacheHttpd_2_2;\n\n  apacheHttpd_2_2 = callPackage ../servers/http/apache-httpd/2.2.nix {\n    sslSupport = true;\n  };\n\n  apacheHttpd_2_4 = lowPrio (callPackage ../servers/http/apache-httpd/2.4.nix {\n    sslSupport = true;\n  });\n\n  apcupsd = callPackage ../servers/apcupsd { };\n\n  sabnzbd = callPackage ../servers/sabnzbd { };\n\n  bind = callPackage ../servers/dns/bind { };\n\n  bird = callPackage ../servers/bird { };\n\n  couchdb = callPackage ../servers/http/couchdb {\n    spidermonkey = spidermonkey_185;\n    python = python27;\n    sphinx = python27Packages.sphinx;\n    erlang = erlangR16;\n  };\n\n  dico = callPackage ../servers/dico { };\n\n  dict = callPackage ../servers/dict {\n      libmaa = callPackage ../servers/dict/libmaa.nix {};\n  };\n\n  dictdDBs = recurseIntoAttrs (import ../servers/dict/dictd-db.nix {\n    inherit builderDefs;\n  });\n\n  dictDBCollector = import ../servers/dict/dictd-db-collector.nix {\n    inherit stdenv lib dict;\n  };\n\n  dictdWiktionary = callPackage ../servers/dict/dictd-wiktionary.nix {};\n\n  dictdWordnet = callPackage ../servers/dict/dictd-wordnet.nix {};\n\n  diod = callPackage ../servers/diod { };\n\n  dovecot = dovecot21;\n\n  dovecot21 = callPackage ../servers/mail/dovecot { };\n\n  dovecot22 = callPackage ../servers/mail/dovecot/2.2.x.nix { };\n\n  dovecot_pigeonhole = callPackage ../servers/mail/dovecot-pigeonhole { };\n\n  etcd = callPackage ../servers/etcd { };\n\n  ejabberd = callPackage ../servers/xmpp/ejabberd {\n    erlang = erlangR16;\n  };\n\n  elasticmq = callPackage ../servers/elasticmq { };\n\n  etcdctl = callPackage ../development/tools/etcdctl { };\n\n  fcgiwrap = callPackage ../servers/fcgiwrap { };\n\n  felix = callPackage ../servers/felix { };\n\n  felix_remoteshell = callPackage ../servers/felix/remoteshell.nix { };\n\n  fingerd_bsd = callPackage ../servers/fingerd/bsd-fingerd { };\n\n  firebird = callPackage ../servers/firebird { icu = null; };\n  firebirdSuper = callPackage ../servers/firebird { superServer = true; };\n\n  fleet = callPackage ../servers/fleet { };\n\n  freepops = callPackage ../servers/mail/freepops { };\n\n  freeswitch = callPackage ../servers/sip/freeswitch { };\n\n  ghostOne = callPackage ../servers/games/ghost-one {\n    boost = boost144.override { taggedLayout = true; };\n  };\n\n  ircdHybrid = callPackage ../servers/irc/ircd-hybrid { };\n\n  jboss = callPackage ../servers/http/jboss { };\n\n  jboss_mysql_jdbc = callPackage ../servers/http/jboss/jdbc/mysql { };\n\n  jetty = callPackage ../servers/http/jetty { };\n\n  jetty61 = callPackage ../servers/http/jetty/6.1 { };\n\n  joseki = callPackage ../servers/http/joseki {};\n\n  leafnode = callPackage ../servers/news/leafnode { };\n\n  lighttpd = callPackage ../servers/http/lighttpd { };\n\n  mailman = callPackage ../servers/mail/mailman { };\n\n  mediatomb = callPackage ../servers/mediatomb { };\n\n  memcached = callPackage ../servers/memcached {};\n\n  mod_dnssd = callPackage ../servers/http/apache-modules/mod_dnssd/default.nix { };\n\n  mod_evasive = callPackage ../servers/http/apache-modules/mod_evasive { };\n\n  mod_python = callPackage ../servers/http/apache-modules/mod_python { };\n\n  mod_fastcgi = callPackage ../servers/http/apache-modules/mod_fastcgi { };\n\n  mod_wsgi = callPackage ../servers/http/apache-modules/mod_wsgi { };\n\n  mpd = callPackage ../servers/mpd {\n    aacSupport    = config.mpd.aacSupport or true;\n    ffmpegSupport = config.mpd.ffmpegSupport or true;\n  };\n\n  mpd_clientlib = callPackage ../servers/mpd/clientlib.nix { };\n\n  miniHttpd = callPackage ../servers/http/mini-httpd {};\n\n  mlmmj = callPackage ../servers/mail/mlmmj { };\n\n  myserver = callPackage ../servers/http/myserver { };\n\n  nginx = callPackage ../servers/http/nginx {\n    rtmp        = true;\n    fullWebDAV  = true;\n    syslog      = true;\n    moreheaders = true;\n  };\n\n  ngircd = callPackage ../servers/irc/ngircd { };\n\n  nix-binary-cache = callPackage ../servers/http/nix-binary-cache {};\n\n  nsd = callPackage ../servers/dns/nsd { };\n\n  nsq = callPackage ../servers/nsq { };\n\n  openresty = callPackage ../servers/http/openresty { };\n\n  opensmtpd = callPackage ../servers/mail/opensmtpd { };\n\n  petidomo = callPackage ../servers/mail/petidomo { };\n\n  popa3d = callPackage ../servers/mail/popa3d { };\n\n  postfix = callPackage ../servers/mail/postfix { };\n\n  postfix211 = callPackage ../servers/mail/postfix/2.11.nix { };\n\n  pulseaudio = callPackage ../servers/pulseaudio {\n    gconf = gnome.GConf;\n    # The following are disabled in the default build, because if this\n    # functionality is desired, they are only needed in the PulseAudio\n    # server.\n    bluez = null;\n    avahi = null;\n  };\n  pulseaudioFull = pulseaudio.override {\n    bluez = bluez5;\n    avahi = avahi;\n    jackaudioSupport = true;\n    x11Support = true;\n  };\n\n  tomcat_connectors = callPackage ../servers/http/apache-modules/tomcat-connectors { };\n\n  pies = callPackage ../servers/pies { };\n\n  portmap = callPackage ../servers/portmap { };\n\n  rpcbind = callPackage ../servers/rpcbind { };\n\n  #monetdb = callPackage ../servers/sql/monetdb { };\n\n  mariadb = callPackage ../servers/sql/mariadb {};\n\n  mongodb = callPackage ../servers/nosql/mongodb { };\n\n  riak = callPackage ../servers/nosql/riak/1.3.1.nix { };\n\n  influxdb = callPackage ../servers/nosql/influxdb { };\n\n  mysql51 = import ../servers/sql/mysql/5.1.x.nix {\n    inherit fetchurl ncurses zlib perl openssl stdenv;\n    ps = procps; /* !!! Linux only */\n  };\n\n  mysql55 = callPackage ../servers/sql/mysql/5.5.x.nix { };\n\n  mysql = mysql51;\n\n  mysql_jdbc = callPackage ../servers/sql/mysql/jdbc { };\n\n  nagios = callPackage ../servers/monitoring/nagios { };\n\n  munin = callPackage ../servers/monitoring/munin { };\n\n  nagiosPluginsOfficial = callPackage ../servers/monitoring/nagios/plugins/official-2.x.nix { };\n\n  neo4j = callPackage ../servers/nosql/neo4j { };\n\n  net_snmp = callPackage ../servers/monitoring/net-snmp { };\n\n  riemann = callPackage ../servers/monitoring/riemann { };\n\n  oidentd = callPackage ../servers/identd/oidentd { };\n\n  openfire = callPackage ../servers/xmpp/openfire { };\n\n  oracleXE = callPackage ../servers/sql/oracle-xe { };\n\n  OVMF = callPackage ../applications/virtualization/OVMF { };\n\n  postgresql = postgresql92;\n\n  postgresql84 = callPackage ../servers/sql/postgresql/8.4.x.nix { };\n\n  postgresql90 = callPackage ../servers/sql/postgresql/9.0.x.nix { };\n\n  postgresql91 = callPackage ../servers/sql/postgresql/9.1.x.nix { };\n\n  postgresql92 = callPackage ../servers/sql/postgresql/9.2.x.nix { };\n\n  postgresql93 = callPackage ../servers/sql/postgresql/9.3.x.nix { };\n\n  postgresql_jdbc = callPackage ../servers/sql/postgresql/jdbc { };\n\n  psqlodbc = callPackage ../servers/sql/postgresql/psqlodbc { };\n\n  pyIRCt = builderDefsPackage (import ../servers/xmpp/pyIRCt) {\n    inherit xmpppy pythonIRClib python makeWrapper;\n  };\n\n  pyMAILt = builderDefsPackage (import ../servers/xmpp/pyMAILt) {\n    inherit xmpppy python makeWrapper fetchcvs;\n  };\n\n  qpid-cpp = callPackage ../servers/amqp/qpid-cpp { };\n\n  rabbitmq_server = callPackage ../servers/amqp/rabbitmq-server { };\n\n  radius = callPackage ../servers/radius { };\n\n  redis = callPackage ../servers/nosql/redis { };\n\n  redstore = callPackage ../servers/http/redstore { };\n\n  restund = callPackage ../servers/restund {};\n\n  rethinkdb = callPackage ../servers/nosql/rethinkdb { };\n\n  rippled = callPackage ../servers/rippled { };\n\n  s6 = callPackage ../servers/s6 { };\n\n  spamassassin = callPackage ../servers/mail/spamassassin {\n    inherit (perlPackages) HTMLParser NetDNS NetAddrIP DBFile\n      HTTPDate MailDKIM LWP IOSocketSSL;\n  };\n\n  samba = callPackage ../servers/samba { };\n\n  # A lightweight Samba, useful for non-Linux-based OSes.\n  samba_light = lowPrio (callPackage ../servers/samba {\n    pam = null;\n    fam = null;\n    cups = null;\n    acl = null;\n    openldap = null;\n    # libunwind 1.0.1 is not ported to GNU/Hurd.\n    libunwind = null;\n  });\n\n  serfdom = callPackage ../servers/serfdom { };\n\n  seyren = callPackage ../servers/monitoring/seyren { };\n\n  shishi = callPackage ../servers/shishi { };\n\n  sipwitch = callPackage ../servers/sip/sipwitch { };\n\n  spawn_fcgi = callPackage ../servers/http/spawn-fcgi { };\n\n  squids = recurseIntoAttrs( import ../servers/squid/squids.nix {\n    inherit fetchurl stdenv perl lib composableDerivation\n      openldap pam db cyrus_sasl kerberos libcap expat libxml2 libtool\n      openssl;\n  });\n  squid = squids.squid31; # has ipv6 support\n\n  thttpd = callPackage ../servers/http/thttpd { };\n\n  storm = callPackage ../servers/computing/storm { };\n\n  tomcat5 = callPackage ../servers/http/tomcat/5.0.nix { };\n\n  tomcat6 = callPackage ../servers/http/tomcat/6.0.nix { };\n\n  tomcat_mysql_jdbc = callPackage ../servers/http/tomcat/jdbc/mysql { };\n\n  axis2 = callPackage ../servers/http/tomcat/axis2 { };\n\n  unifi = callPackage ../servers/unifi { };\n\n  virtuoso6 = callPackage ../servers/sql/virtuoso/6.x.nix { };\n\n  virtuoso7 = callPackage ../servers/sql/virtuoso/7.x.nix { };\n\n  virtuoso = virtuoso6;\n\n  vsftpd = callPackage ../servers/ftp/vsftpd { };\n\n  winstone = callPackage ../servers/http/winstone { };\n\n  xinetd = callPackage ../servers/xinetd { };\n\n  xquartz = callPackage ../servers/x11/xquartz { };\n  quartz-wm = callPackage ../servers/x11/quartz-wm { stdenv = clangStdenv; };\n\n  xorg = recurseIntoAttrs (import ../servers/x11/xorg/default.nix {\n    inherit clangStdenv fetchurl fetchgit fetchpatch stdenv pkgconfig intltool freetype fontconfig\n      libxslt expat libpng zlib perl mesa_drivers spice_protocol\n      dbus libuuid openssl gperf m4\n      autoconf automake libtool xmlto asciidoc flex bison python mtdev pixman;\n    mesa = mesa_noglu;\n    udev = if stdenv.isLinux then udev else null;\n    libdrm = if stdenv.isLinux then libdrm else null;\n  } // {\n    xf86videointel-testing = callPackage ../servers/x11/xorg/xf86-video-intel-testing.nix { };\n  });\n\n  xorgReplacements = callPackage ../servers/x11/xorg/replacements.nix { };\n\n  xorgVideoUnichrome = callPackage ../servers/x11/xorg/unichrome/default.nix { };\n\n  yaws = callPackage ../servers/http/yaws { };\n\n  zabbix = recurseIntoAttrs (import ../servers/monitoring/zabbix {\n    inherit fetchurl stdenv pkgconfig postgresql curl openssl zlib;\n  });\n\n  zabbix20 = callPackage ../servers/monitoring/zabbix/2.0.nix { };\n  zabbix22 = callPackage ../servers/monitoring/zabbix/2.2.nix { };\n\n\n  ### OS-SPECIFIC\n\n  afuse = callPackage ../os-specific/linux/afuse { };\n\n  amdUcode = callPackage ../os-specific/linux/microcode/amd.nix { };\n\n  autofs5 = callPackage ../os-specific/linux/autofs/autofs-v5.nix { };\n\n  _915resolution = callPackage ../os-specific/linux/915resolution { };\n\n  nfsUtils = callPackage ../os-specific/linux/nfs-utils { };\n\n  acpi = callPackage ../os-specific/linux/acpi { };\n\n  acpid = callPackage ../os-specific/linux/acpid { };\n\n  acpitool = callPackage ../os-specific/linux/acpitool { };\n\n  alienfx = callPackage ../os-specific/linux/alienfx { };\n\n  alsaLib = callPackage ../os-specific/linux/alsa-lib { };\n\n  alsaPlugins = callPackage ../os-specific/linux/alsa-plugins {\n    jack2 = null;\n  };\n\n  alsaPluginWrapper = callPackage ../os-specific/linux/alsa-plugins/wrapper.nix { };\n\n  alsaUtils = callPackage ../os-specific/linux/alsa-utils { };\n  alsaOss = callPackage ../os-specific/linux/alsa-oss { };\n\n  microcode2ucode = callPackage ../os-specific/linux/microcode/converter.nix { };\n\n  microcodeIntel = callPackage ../os-specific/linux/microcode/intel.nix { };\n\n  apparmor = callPackage ../os-specific/linux/apparmor {\n    inherit (perlPackages) LocaleGettext TermReadKey RpcXML;\n    bison = bison2;\n  };\n\n  atop = callPackage ../os-specific/linux/atop { };\n\n  audit = callPackage ../os-specific/linux/audit { };\n\n  b43Firmware_5_1_138 = callPackage ../os-specific/linux/firmware/b43-firmware/5.1.138.nix { };\n\n  b43FirmwareCutter = callPackage ../os-specific/linux/firmware/b43-firmware-cutter { };\n\n  batctl = callPackage ../os-specific/linux/batman-adv/batctl.nix { };\n\n  bluez4 = callPackage ../os-specific/linux/bluez {\n    pygobject = pygobject3;\n  };\n\n  bluez5 = lowPrio (callPackage ../os-specific/linux/bluez/bluez5.nix { });\n\n  bluez = bluez4;\n\n  inherit (pythonPackages) bedup;\n\n  beret = callPackage ../games/beret { };\n\n  bridge_utils = callPackage ../os-specific/linux/bridge-utils { };\n\n  busybox = callPackage ../os-specific/linux/busybox { };\n\n  checkpolicy = callPackage ../os-specific/linux/checkpolicy { };\n\n  checksec = callPackage ../os-specific/linux/checksec { };\n\n  cifs_utils = callPackage ../os-specific/linux/cifs-utils { };\n\n  conky = callPackage ../os-specific/linux/conky {\n    mpdSupport   = config.conky.mpdSupport   or true;\n    x11Support   = config.conky.x11Support   or false;\n    xdamage      = config.conky.xdamage      or false;\n    wireless     = config.conky.wireless     or false;\n    luaSupport   = config.conky.luaSupport   or false;\n    rss          = config.conky.rss          or false;\n    weatherMetar = config.conky.weatherMetar or false;\n    weatherXoap  = config.conky.weatherXoap  or false;\n  };\n\n  cpufrequtils = callPackage ../os-specific/linux/cpufrequtils { };\n\n  cryopid = callPackage ../os-specific/linux/cryopid { };\n\n  criu = callPackage ../os-specific/linux/criu { };\n\n  cryptsetup = callPackage ../os-specific/linux/cryptsetup { };\n\n  cramfsswap = callPackage ../os-specific/linux/cramfsswap { };\n\n  darwin = rec {\n    cctools = forceNativeDrv (callPackage ../os-specific/darwin/cctools-port {\n      cross = assert crossSystem != null; crossSystem;\n      inherit maloader;\n      xctoolchain = xcode.toolchain;\n    });\n\n    maloader = callPackage ../os-specific/darwin/maloader {\n      inherit opencflite;\n    };\n\n    opencflite = callPackage ../os-specific/darwin/opencflite {};\n\n    xcode = callPackage ../os-specific/darwin/xcode {};\n  };\n\n  devicemapper = lvm2;\n\n  disk_indicator = callPackage ../os-specific/linux/disk-indicator { };\n\n  dmidecode = callPackage ../os-specific/linux/dmidecode { };\n\n  dmtcp = callPackage ../os-specific/linux/dmtcp { };\n\n  dietlibc = callPackage ../os-specific/linux/dietlibc { };\n\n  directvnc = builderDefsPackage ../os-specific/linux/directvnc {\n    inherit libjpeg pkgconfig zlib directfb;\n    inherit (xlibs) xproto;\n  };\n\n  dmraid = callPackage ../os-specific/linux/dmraid { };\n\n  drbd = callPackage ../os-specific/linux/drbd { };\n\n  dstat = callPackage ../os-specific/linux/dstat {\n    # pythonFull includes the \"curses\" standard library module, for pretty\n    # dstat color output\n    python = pythonFull;\n  };\n\n  libossp_uuid = callPackage ../development/libraries/libossp-uuid { };\n\n  libuuid =\n    if crossSystem != null && crossSystem.config == \"i586-pc-gnu\"\n    then (utillinux // {\n      crossDrv = lib.overrideDerivation utillinux.crossDrv (args: {\n        # `libblkid' fails to build on GNU/Hurd.\n        configureFlags = args.configureFlags\n          + \" --disable-libblkid --disable-mount --disable-libmount\"\n          + \" --disable-fsck --enable-static --disable-partx\";\n        doCheck = false;\n        CPPFLAGS =                    # ugly hack for ugly software!\n          lib.concatStringsSep \" \"\n            (map (v: \"-D${v}=4096\")\n                 [ \"PATH_MAX\" \"MAXPATHLEN\" \"MAXHOSTNAMELEN\" ]);\n      });\n    })\n    else if stdenv.isLinux\n    then utillinux\n    else null;\n\n  e3cfsprogs = callPackage ../os-specific/linux/e3cfsprogs { };\n\n  ebtables = callPackage ../os-specific/linux/ebtables { };\n\n  eject = utillinux;\n\n  ffado = callPackage ../os-specific/linux/ffado { };\n\n  fbterm = callPackage ../os-specific/linux/fbterm { };\n\n  firejail = callPackage ../os-specific/linux/firejail {};\n\n  fuse = callPackage ../os-specific/linux/fuse { };\n\n  fxload = callPackage ../os-specific/linux/fxload { };\n\n  gfxtablet = callPackage ../os-specific/linux/gfxtablet {};\n\n  gpm = callPackage ../servers/gpm { };\n\n  gradm = callPackage ../os-specific/linux/gradm {\n    flex = flex_2_5_35;\n  };\n\n  hdparm = callPackage ../os-specific/linux/hdparm { };\n\n  hibernate = callPackage ../os-specific/linux/hibernate { };\n\n  hostapd = callPackage ../os-specific/linux/hostapd { };\n\n  htop =\n    if stdenv.isLinux then\n      callPackage ../os-specific/linux/htop { }\n    else if stdenv.isDarwin then\n      callPackage ../os-specific/darwin/htop { }\n    else null;\n\n  # GNU/Hurd core packages.\n  gnu = recurseIntoAttrs (callPackage ../os-specific/gnu {\n    inherit platform crossSystem;\n  });\n\n  hwdata = callPackage ../os-specific/linux/hwdata { };\n\n  i7z = callPackage ../os-specific/linux/i7z { };\n\n  ifplugd = callPackage ../os-specific/linux/ifplugd { };\n\n  iomelt = callPackage ../os-specific/linux/iomelt { };\n\n  iotop = callPackage ../os-specific/linux/iotop { };\n\n  iproute = callPackage ../os-specific/linux/iproute { };\n\n  iputils = callPackage ../os-specific/linux/iputils {\n    sp = spCompat;\n    inherit (perlPackages) SGMLSpm;\n  };\n\n  iptables = callPackage ../os-specific/linux/iptables { };\n\n  iw = callPackage ../os-specific/linux/iw { };\n\n  jujuutils = callPackage ../os-specific/linux/jujuutils { };\n\n  kbd = callPackage ../os-specific/linux/kbd { };\n\n  kmscon = callPackage ../os-specific/linux/kmscon { };\n\n  latencytop = callPackage ../os-specific/linux/latencytop { };\n\n  ldm = callPackage ../os-specific/linux/ldm { };\n\n  libaio = callPackage ../os-specific/linux/libaio { };\n\n  libatasmart = callPackage ../os-specific/linux/libatasmart { };\n\n  libcgroup = callPackage ../os-specific/linux/libcgroup { };\n\n  libnl = callPackage ../os-specific/linux/libnl { };\n  libnl_3_2_19 = callPackage ../os-specific/linux/libnl/3.2.19.nix { };\n\n  linuxConsoleTools = callPackage ../os-specific/linux/consoletools { };\n\n  # -- Linux kernel expressions ------------------------------------------------\n\n  linuxHeaders = linuxHeaders_3_7;\n\n  linuxHeaders24Cross = forceNativeDrv (import ../os-specific/linux/kernel-headers/2.4.nix {\n    inherit stdenv fetchurl perl;\n    cross = assert crossSystem != null; crossSystem;\n  });\n\n  linuxHeaders26Cross = forceNativeDrv (import ../os-specific/linux/kernel-headers/2.6.32.nix {\n    inherit stdenv fetchurl perl;\n    cross = assert crossSystem != null; crossSystem;\n  });\n\n  linuxHeaders_3_7 = callPackage ../os-specific/linux/kernel-headers/3.7.nix { };\n\n  linuxHeaders_3_14 = callPackage ../os-specific/linux/kernel-headers/3.14.nix { };\n\n  # We can choose:\n  linuxHeadersCrossChooser = ver : if ver == \"2.4\" then linuxHeaders24Cross\n    else if ver == \"2.6\" then linuxHeaders26Cross\n    else throw \"Unknown linux kernel version\";\n\n  linuxHeadersCross = assert crossSystem != null;\n    linuxHeadersCrossChooser crossSystem.platform.kernelMajor;\n\n  kernelPatches = callPackage ../os-specific/linux/kernel/patches.nix { };\n\n  linux_3_2 = makeOverridable (import ../os-specific/linux/kernel/linux-3.2.nix) {\n    inherit fetchurl stdenv perl buildLinux;\n    kernelPatches = [];\n  };\n\n  linux_3_2_xen = lowPrio (linux_3_2.override {\n    extraConfig = ''\n      XEN_DOM0 y\n    '';\n  });\n\n  linux_3_4 = makeOverridable (import ../os-specific/linux/kernel/linux-3.4.nix) {\n    inherit fetchurl stdenv perl buildLinux;\n    kernelPatches = lib.optionals ((platform.kernelArch or null) == \"mips\")\n      [ kernelPatches.mips_fpureg_emu\n        kernelPatches.mips_fpu_sigill\n      ];\n  };\n\n  linux_3_6_rpi = makeOverridable (import ../os-specific/linux/kernel/linux-rpi-3.6.nix) {\n    inherit fetchurl stdenv perl buildLinux;\n  };\n\n  linux_3_10 = makeOverridable (import ../os-specific/linux/kernel/linux-3.10.nix) {\n    inherit fetchurl stdenv perl buildLinux;\n    kernelPatches = lib.optionals ((platform.kernelArch or null) == \"mips\")\n      [ kernelPatches.mips_fpureg_emu\n        kernelPatches.mips_fpu_sigill\n        kernelPatches.mips_ext3_n32\n      ];\n  };\n\n  linux_3_12 = makeOverridable (import ../os-specific/linux/kernel/linux-3.12.nix) {\n    inherit fetchurl stdenv perl buildLinux;\n    kernelPatches = lib.optionals ((platform.kernelArch or null) == \"mips\")\n      [ kernelPatches.mips_fpureg_emu\n        kernelPatches.mips_fpu_sigill\n        kernelPatches.mips_ext3_n32\n      ];\n  };\n\n  linux_3_14 = makeOverridable (import ../os-specific/linux/kernel/linux-3.14.nix) {\n    inherit fetchurl stdenv perl buildLinux;\n    kernelPatches = lib.optionals ((platform.kernelArch or null) == \"mips\")\n      [ kernelPatches.mips_fpureg_emu\n        kernelPatches.mips_fpu_sigill\n        kernelPatches.mips_ext3_n32\n      ];\n  };\n\n  linux_3_15 = makeOverridable (import ../os-specific/linux/kernel/linux-3.15.nix) {\n    inherit fetchurl stdenv perl buildLinux;\n    kernelPatches = lib.optionals ((platform.kernelArch or null) == \"mips\")\n      [ kernelPatches.mips_fpureg_emu\n        kernelPatches.mips_fpu_sigill\n        kernelPatches.mips_ext3_n32\n      ];\n  };\n\n  linux_3_16 = makeOverridable (import ../os-specific/linux/kernel/linux-3.16.nix) {\n    inherit fetchurl stdenv perl buildLinux;\n    kernelPatches = lib.optionals ((platform.kernelArch or null) == \"mips\")\n      [ kernelPatches.mips_fpureg_emu\n        kernelPatches.mips_fpu_sigill\n        kernelPatches.mips_ext3_n32\n      ];\n  };\n\n  linux_testing = makeOverridable (import ../os-specific/linux/kernel/linux-testing.nix) {\n    inherit fetchurl stdenv perl buildLinux;\n    kernelPatches = lib.optionals ((platform.kernelArch or null) == \"mips\")\n      [ kernelPatches.mips_fpureg_emu\n        kernelPatches.mips_fpu_sigill\n        kernelPatches.mips_ext3_n32\n      ];\n  };\n\n  /* grsec configuration\n\n     We build several flavors of 'default' grsec kernels. These are\n     built by default with Hydra. If the user selects a matching\n     'default' flavor, then the pre-canned package set can be\n     chosen. Typically, users will make very basic choices like\n     'security' + 'server' or 'performance' + 'desktop' with\n     virtualisation support. These will then be picked.\n\n     Note: Xen guest kernels are included for e.g. NixOps deployments\n     to EC2, where Xen is the Hypervisor.\n  */\n\n  grFlavors = import ../build-support/grsecurity/flavors.nix;\n\n  mkGrsecurity = opts:\n    (import ../build-support/grsecurity {\n      grsecOptions = opts;\n      inherit pkgs lib;\n    });\n\n  grKernel  = opts: (mkGrsecurity opts).grsecKernel;\n  grPackage = opts: recurseIntoAttrs (mkGrsecurity opts).grsecPackage;\n\n  # Stable kernels\n  linux_grsec_stable_desktop    = grKernel grFlavors.linux_grsec_stable_desktop;\n  linux_grsec_stable_server     = grKernel grFlavors.linux_grsec_stable_server;\n  linux_grsec_stable_server_xen = grKernel grFlavors.linux_grsec_stable_server_xen;\n\n  # Testing kernels\n  linux_grsec_testing_desktop = grKernel grFlavors.linux_grsec_testing_desktop;\n  linux_grsec_testing_server  = grKernel grFlavors.linux_grsec_testing_server;\n  linux_grsec_testing_server_xen = grKernel grFlavors.linux_grsec_testing_server_xen;\n\n  /* Linux kernel modules are inherently tied to a specific kernel.  So\n     rather than provide specific instances of those packages for a\n     specific kernel, we have a function that builds those packages\n     for a specific kernel.  This function can then be called for\n     whatever kernel you're using. */\n\n  linuxPackagesFor = kernel: self: let callPackage = newScope self; in {\n    inherit kernel;\n\n    acpi_call = callPackage ../os-specific/linux/acpi-call {};\n\n    batman_adv = callPackage ../os-specific/linux/batman-adv {};\n\n    bbswitch = callPackage ../os-specific/linux/bbswitch {};\n\n    ati_drivers_x11 = callPackage ../os-specific/linux/ati-drivers { };\n\n    blcr = callPackage ../os-specific/linux/blcr { };\n\n    cryptodev = callPackage ../os-specific/linux/cryptodev { };\n\n    cpupower = callPackage ../os-specific/linux/cpupower { };\n\n    e1000e = callPackage ../os-specific/linux/e1000e {};\n\n    v4l2loopback = callPackage ../os-specific/linux/v4l2loopback { };\n\n    frandom = callPackage ../os-specific/linux/frandom { };\n\n    ktap = callPackage ../os-specific/linux/ktap { };\n\n    lttng-modules = callPackage ../os-specific/linux/lttng-modules { };\n\n    broadcom_sta = callPackage ../os-specific/linux/broadcom-sta/default.nix { };\n\n    nvidiabl = callPackage ../os-specific/linux/nvidiabl { };\n\n    nvidia_x11 = callPackage ../os-specific/linux/nvidia-x11 { };\n\n    nvidia_x11_legacy173 = callPackage ../os-specific/linux/nvidia-x11/legacy173.nix { };\n    nvidia_x11_legacy304 = callPackage ../os-specific/linux/nvidia-x11/legacy304.nix { };\n\n    openafsClient = callPackage ../servers/openafs-client { };\n\n    openiscsi = callPackage ../os-specific/linux/open-iscsi { };\n\n    wis_go7007 = callPackage ../os-specific/linux/wis-go7007 { };\n\n    kernelHeaders = callPackage ../os-specific/linux/kernel-headers { };\n\n    klibc = callPackage ../os-specific/linux/klibc { };\n\n    klibcShrunk = lowPrio (callPackage ../os-specific/linux/klibc/shrunk.nix { });\n\n\n    /* compiles but has to be integrated into the kernel somehow\n       Let's have it uncommented and finish it..\n    */\n    ndiswrapper = callPackage ../os-specific/linux/ndiswrapper { };\n\n    netatop = callPackage ../os-specific/linux/netatop { };\n\n    perf = callPackage ../os-specific/linux/kernel/perf.nix { };\n\n    psmouse_alps = callPackage ../os-specific/linux/psmouse-alps { };\n\n    spl = callPackage ../os-specific/linux/spl { };\n    spl_git = callPackage ../os-specific/linux/spl/git.nix { };\n\n    sysdig = callPackage ../os-specific/linux/sysdig {};\n\n    tp_smapi = callPackage ../os-specific/linux/tp_smapi { };\n\n    v86d = callPackage ../os-specific/linux/v86d { };\n\n    virtualbox = callPackage ../applications/virtualization/virtualbox {\n      stdenv = stdenv_32bit;\n      inherit (gnome) libIDL;\n      enableExtensionPack = config.virtualbox.enableExtensionPack or false;\n    };\n\n    virtualboxGuestAdditions = callPackage ../applications/virtualization/virtualbox/guest-additions { };\n\n    zfs = callPackage ../os-specific/linux/zfs { };\n    zfs_git = callPackage ../os-specific/linux/zfs/git.nix { };\n  };\n\n  # The current default kernel / kernel modules.\n  linux = linuxPackages.kernel;\n  linuxPackages = linuxPackages_3_12;\n\n  # Update this when adding the newest kernel major version!\n  linux_latest = pkgs.linux_3_16;\n  linuxPackages_latest = pkgs.linuxPackages_3_16;\n\n  # Build the kernel modules for the some of the kernels.\n  linuxPackages_3_2 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_2 linuxPackages_3_2);\n  linuxPackages_3_2_xen = linuxPackagesFor pkgs.linux_3_2_xen linuxPackages_3_2_xen;\n  linuxPackages_3_4 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_4 linuxPackages_3_4);\n  linuxPackages_3_6_rpi = linuxPackagesFor pkgs.linux_3_6_rpi linuxPackages_3_6_rpi;\n  linuxPackages_3_10 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_10 linuxPackages_3_10);\n  linuxPackages_3_10_tuxonice = linuxPackagesFor pkgs.linux_3_10_tuxonice linuxPackages_3_10_tuxonice;\n  linuxPackages_3_12 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_12 linuxPackages_3_12);\n  linuxPackages_3_14 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_14 linuxPackages_3_14);\n  linuxPackages_3_15 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_15 linuxPackages_3_15);\n  linuxPackages_3_16 = recurseIntoAttrs (linuxPackagesFor pkgs.linux_3_16 linuxPackages_3_16);\n  linuxPackages_testing = recurseIntoAttrs (linuxPackagesFor pkgs.linux_testing linuxPackages_testing);\n\n  # grsecurity flavors\n  # Stable kernels\n  linuxPackages_grsec_stable_desktop    = grPackage grFlavors.linux_grsec_stable_desktop;\n  linuxPackages_grsec_stable_server     = grPackage grFlavors.linux_grsec_stable_server;\n  linuxPackages_grsec_stable_server_xen = grPackage grFlavors.linux_grsec_stable_server_xen;\n\n  # Testing kernels\n  linuxPackages_grsec_testing_desktop = grPackage grFlavors.linux_grsec_testing_desktop;\n  linuxPackages_grsec_testing_server  = grPackage grFlavors.linux_grsec_testing_server;\n  linuxPackages_grsec_testing_server_xen = grPackage grFlavors.linux_grsec_testing_server_xen;\n\n  # A function to build a manually-configured kernel\n  linuxManualConfig = pkgs.buildLinux;\n  buildLinux = import ../os-specific/linux/kernel/manual-config.nix {\n    inherit (pkgs) stdenv runCommand nettools bc perl kmod writeTextFile ubootChooser;\n  };\n\n  keyutils = callPackage ../os-specific/linux/keyutils { };\n\n  libselinux = callPackage ../os-specific/linux/libselinux { };\n\n  libsemanage = callPackage ../os-specific/linux/libsemanage { };\n\n  libraw = callPackage ../development/libraries/libraw { };\n\n  libraw1394 = callPackage ../development/libraries/libraw1394 { };\n\n  libsexy = callPackage ../development/libraries/libsexy { };\n\n  libsepol = callPackage ../os-specific/linux/libsepol { };\n\n  libsmbios = callPackage ../os-specific/linux/libsmbios { };\n\n  lm_sensors = callPackage ../os-specific/linux/lm-sensors { };\n\n  lockdep = callPackage ../os-specific/linux/lockdep { };\n\n  lsiutil = callPackage ../os-specific/linux/lsiutil { };\n\n  kmod = callPackage ../os-specific/linux/kmod { };\n\n  kmod-blacklist-ubuntu = callPackage ../os-specific/linux/kmod-blacklist-ubuntu { };\n\n  kvm = qemu_kvm;\n\n  libcap = callPackage ../os-specific/linux/libcap { };\n\n  libcap_progs = callPackage ../os-specific/linux/libcap/progs.nix { };\n\n  libcap_pam = callPackage ../os-specific/linux/libcap/pam.nix { };\n\n  libcap_manpages = callPackage ../os-specific/linux/libcap/man.nix { };\n\n  libcap_ng = callPackage ../os-specific/linux/libcap-ng { };\n\n  libnscd = callPackage ../os-specific/linux/libnscd { };\n\n  libnotify = callPackage ../development/libraries/libnotify { };\n\n  libvolume_id = callPackage ../os-specific/linux/libvolume_id { };\n\n  lsscsi = callPackage ../os-specific/linux/lsscsi { };\n\n  lvm2 = callPackage ../os-specific/linux/lvm2 { };\n\n  mdadm = callPackage ../os-specific/linux/mdadm { };\n\n  mingetty = callPackage ../os-specific/linux/mingetty { };\n\n  module_init_tools = callPackage ../os-specific/linux/module-init-tools { };\n\n  aggregateModules = modules:\n    callPackage ../os-specific/linux/kmod/aggregator.nix {\n      inherit modules;\n    };\n\n  multipath_tools = callPackage ../os-specific/linux/multipath-tools { };\n\n  musl = callPackage ../os-specific/linux/musl { };\n\n  nettools = callPackage ../os-specific/linux/net-tools { };\n\n  neverball = callPackage ../games/neverball {\n    libpng = libpng15;\n  };\n\n  nftables = callPackage ../os-specific/linux/nftables { };\n\n  numactl = callPackage ../os-specific/linux/numactl { };\n\n  gocode = callPackage ../development/tools/gocode { };\n\n  gogoclient = callPackage ../os-specific/linux/gogoclient { };\n\n  nss_ldap = callPackage ../os-specific/linux/nss_ldap { };\n\n  pam = callPackage ../os-specific/linux/pam { };\n\n  # pam_bioapi ( see http://www.thinkwiki.org/wiki/How_to_enable_the_fingerprint_reader )\n\n  pam_ccreds = callPackage ../os-specific/linux/pam_ccreds { };\n\n  pam_console = callPackage ../os-specific/linux/pam_console {\n    libtool = libtool_1_5;\n  };\n\n  pam_devperm = callPackage ../os-specific/linux/pam_devperm { };\n\n  pam_krb5 = callPackage ../os-specific/linux/pam_krb5 { };\n\n  pam_ldap = callPackage ../os-specific/linux/pam_ldap { };\n\n  pam_login = callPackage ../os-specific/linux/pam_login { };\n\n  pam_ssh_agent_auth = callPackage ../os-specific/linux/pam_ssh_agent_auth { };\n\n  pam_usb = callPackage ../os-specific/linux/pam_usb { };\n\n  paxctl = callPackage ../os-specific/linux/paxctl { };\n\n  pax-utils = callPackage ../os-specific/linux/pax-utils { };\n\n  pcmciaUtils = callPackage ../os-specific/linux/pcmciautils {\n    firmware = config.pcmciaUtils.firmware or [];\n    config = config.pcmciaUtils.config or null;\n  };\n\n  plymouth = callPackage ../os-specific/linux/plymouth {\n    automake = automake113x;\n  };\n\n  pmount = callPackage ../os-specific/linux/pmount { };\n\n  pmutils = callPackage ../os-specific/linux/pm-utils { };\n\n  pmtools = callPackage ../os-specific/linux/pmtools { };\n\n  policycoreutils = callPackage ../os-specific/linux/policycoreutils { };\n\n  powertop = callPackage ../os-specific/linux/powertop { };\n\n  prayer = callPackage ../servers/prayer { };\n\n  procps = procps-ng;\n\n  procps-old = lowPrio (callPackage ../os-specific/linux/procps { });\n\n  procps-ng = callPackage ../os-specific/linux/procps-ng { };\n\n  watch = callPackage ../os-specific/linux/procps/watch.nix { };\n\n  qemu_kvm = lowPrio (qemu.override { x86Only = true; });\n\n  firmwareLinuxNonfree = callPackage ../os-specific/linux/firmware/firmware-linux-nonfree { };\n\n  radeontools = callPackage ../os-specific/linux/radeontools { };\n\n  raspberrypifw = callPackage ../os-specific/linux/firmware/raspberrypi {};\n\n  regionset = callPackage ../os-specific/linux/regionset { };\n\n  rfkill = callPackage ../os-specific/linux/rfkill { };\n\n  rfkill_udev = callPackage ../os-specific/linux/rfkill/udev.nix { };\n\n  rtkit = callPackage ../os-specific/linux/rtkit { };\n\n  sdparm = callPackage ../os-specific/linux/sdparm { };\n\n  sepolgen = callPackage ../os-specific/linux/sepolgen { };\n\n  setools = callPackage ../os-specific/linux/setools { };\n\n  shadow = callPackage ../os-specific/linux/shadow { };\n\n  statifier = builderDefsPackage (import ../os-specific/linux/statifier) { };\n\n  sysdig = callPackage ../os-specific/linux/sysdig {\n    kernel = null;\n  }; # pkgs.sysdig is a client, for a driver look at linuxPackagesFor\n\n  sysfsutils = callPackage ../os-specific/linux/sysfsutils { };\n\n  sysprof = callPackage ../development/tools/profiling/sysprof {\n    inherit (gnome) libglade;\n  };\n\n  # Provided with sysfsutils.\n  libsysfs = sysfsutils;\n  systool = sysfsutils;\n\n  sysklogd = callPackage ../os-specific/linux/sysklogd { };\n\n  syslinux = callPackage ../os-specific/linux/syslinux { };\n\n  sysstat = callPackage ../os-specific/linux/sysstat { };\n\n  systemd = callPackage ../os-specific/linux/systemd {\n    linuxHeaders = linuxHeaders_3_14;\n  };\n\n  systemtap = callPackage ../development/tools/profiling/systemtap {\n    inherit (gnome) libglademm;\n  };\n\n  # In nixos, you can set systemd.package = pkgs.systemd_with_lvm2 to get\n  # LVM2 working in systemd.\n  systemd_with_lvm2 = pkgs.lib.overrideDerivation pkgs.systemd (p: {\n      name = p.name + \"-with-lvm2\";\n      postInstall = p.postInstall + ''\n        cp \"${pkgs.lvm2}/lib/systemd/system-generators/\"* $out/lib/systemd/system-generators\n      '';\n  });\n\n  sysvinit = callPackage ../os-specific/linux/sysvinit { };\n\n  sysvtools = callPackage ../os-specific/linux/sysvinit {\n    withoutInitTools = true;\n  };\n\n  # FIXME: `tcp-wrapper' is actually not OS-specific.\n  tcp_wrappers = callPackage ../os-specific/linux/tcp-wrappers { };\n\n  trackballs = callPackage ../games/trackballs {\n    debug = false;\n    guile = guile_1_8;\n  };\n\n  tunctl = callPackage ../os-specific/linux/tunctl { };\n\n  ubootChooser = name : if name == \"upstream\" then ubootUpstream\n    else if name == \"sheevaplug\" then ubootSheevaplug\n    else if name == \"guruplug\" then ubootGuruplug\n    else if name == \"nanonote\" then ubootNanonote\n    else throw \"Unknown uboot\";\n\n  ubootUpstream = callPackage ../misc/uboot { };\n\n  ubootSheevaplug = callPackage ../misc/uboot/sheevaplug.nix { };\n\n  ubootNanonote = callPackage ../misc/uboot/nanonote.nix { };\n\n  ubootGuruplug = callPackage ../misc/uboot/guruplug.nix { };\n\n  uclibc = callPackage ../os-specific/linux/uclibc { };\n\n  uclibcCross = lowPrio (callPackage ../os-specific/linux/uclibc {\n    inherit fetchurl stdenv libiconv;\n    linuxHeaders = linuxHeadersCross;\n    gccCross = gccCrossStageStatic;\n    cross = assert crossSystem != null; crossSystem;\n  });\n\n  udev145 = callPackage ../os-specific/linux/udev/145.nix { };\n  udev = pkgs.systemd;\n\n  udisks1 = callPackage ../os-specific/linux/udisks/1-default.nix { };\n  udisks2 = callPackage ../os-specific/linux/udisks/2-default.nix { };\n  udisks = udisks1;\n\n  udisks_glue = callPackage ../os-specific/linux/udisks-glue { };\n\n  untie = callPackage ../os-specific/linux/untie { };\n\n  upower = callPackage ../os-specific/linux/upower { };\n\n  upower_99 = callPackage ../os-specific/linux/upower/0.99.nix { };\n\n  upstart = callPackage ../os-specific/linux/upstart { };\n\n  usbutils = callPackage ../os-specific/linux/usbutils { };\n\n  usermount = callPackage ../os-specific/linux/usermount { };\n\n  utillinux = lowPrio (callPackage ../os-specific/linux/util-linux {\n    ncurses = null;\n    perl = null;\n  });\n\n  utillinuxCurses = utillinux.override {\n    inherit ncurses perl;\n  };\n\n  v4l_utils = callPackage ../os-specific/linux/v4l-utils {\n    withQt4 = true;\n  };\n\n  windows = rec {\n    cygwinSetup = callPackage ../os-specific/windows/cygwin-setup { };\n\n    jom = callPackage ../os-specific/windows/jom { };\n\n    w32api = callPackage ../os-specific/windows/w32api {\n      gccCross = gccCrossStageStatic;\n      binutilsCross = binutilsCross;\n    };\n\n    w32api_headers = w32api.override {\n      onlyHeaders = true;\n    };\n\n    mingw_runtime = callPackage ../os-specific/windows/mingwrt {\n      gccCross = gccCrossMingw2;\n      binutilsCross = binutilsCross;\n    };\n\n    mingw_runtime_headers = mingw_runtime.override {\n      onlyHeaders = true;\n    };\n\n    mingw_headers1 = buildEnv {\n      name = \"mingw-headers-1\";\n      paths = [ w32api_headers mingw_runtime_headers ];\n    };\n\n    mingw_headers2 = buildEnv {\n      name = \"mingw-headers-2\";\n      paths = [ w32api mingw_runtime_headers ];\n    };\n\n    mingw_headers3 = buildEnv {\n      name = \"mingw-headers-3\";\n      paths = [ w32api mingw_runtime ];\n    };\n\n    mingw_w64 = callPackage ../os-specific/windows/mingw-w64 {\n      gccCross = gccCrossStageStatic;\n      binutilsCross = binutilsCross;\n    };\n\n    mingw_w64_headers = callPackage ../os-specific/windows/mingw-w64 {\n      onlyHeaders = true;\n    };\n\n    mingw_w64_pthreads = callPackage ../os-specific/windows/mingw-w64 {\n      onlyPthreads = true;\n    };\n\n    pthreads = callPackage ../os-specific/windows/pthread-w32 {\n      mingw_headers = mingw_headers3;\n    };\n\n    wxMSW = callPackage ../os-specific/windows/wxMSW-2.8 { };\n  };\n\n  wesnoth = callPackage ../games/wesnoth {\n    lua = lua5;\n  };\n\n  wirelesstools = callPackage ../os-specific/linux/wireless-tools { };\n\n  wpa_supplicant = callPackage ../os-specific/linux/wpa_supplicant { };\n\n  wpa_supplicant_gui = callPackage ../os-specific/linux/wpa_supplicant/gui.nix { };\n\n  xf86_input_mtrack = callPackage ../os-specific/linux/xf86-input-mtrack {\n    inherit (xorg) utilmacros xproto inputproto xorgserver;\n  };\n\n  xf86_input_multitouch =\n    callPackage ../os-specific/linux/xf86-input-multitouch { };\n\n  xf86_input_wacom = callPackage ../os-specific/linux/xf86-input-wacom { };\n\n  xf86_video_nested = callPackage ../os-specific/linux/xf86-video-nested {\n    inherit (xorg) fontsproto renderproto utilmacros xorgserver;\n  };\n\n  xf86_video_nouveau = xorg.xf86videonouveau;\n\n  xmoto = builderDefsPackage (import ../games/xmoto) {\n    inherit chipmunk sqlite curl zlib bzip2 libjpeg libpng\n      freeglut mesa SDL SDL_mixer SDL_image SDL_net SDL_ttf\n      lua5 ode libxdg_basedir libxml2;\n  };\n\n  xorg_sys_opengl = callPackage ../os-specific/linux/opengl/xorg-sys { };\n\n  zd1211fw = callPackage ../os-specific/linux/firmware/zd1211 { };\n\n\n  ### DATA\n\n  andagii = callPackage ../data/fonts/andagii {};\n\n  anonymousPro = callPackage ../data/fonts/anonymous-pro {};\n\n  arkpandora_ttf = builderDefsPackage (import ../data/fonts/arkpandora) { };\n\n  aurulent-sans = callPackage ../data/fonts/aurulent-sans { };\n\n  bakoma_ttf = callPackage ../data/fonts/bakoma-ttf { };\n\n  cacert = callPackage ../data/misc/cacert { };\n\n  cantarell_fonts = callPackage ../data/fonts/cantarell-fonts { };\n\n  corefonts = callPackage ../data/fonts/corefonts { };\n\n  wrapFonts = paths : ((import ../data/fonts/fontWrap) {\n    inherit fetchurl stdenv builderDefs paths;\n    inherit (xorg) mkfontdir mkfontscale;\n  });\n\n  clearlyU = callPackage ../data/fonts/clearlyU { };\n\n  cm_unicode = callPackage ../data/fonts/cm-unicode {};\n\n  dejavu_fonts = callPackage ../data/fonts/dejavu-fonts {\n    inherit (perlPackages) FontTTF;\n  };\n\n  docbook5 = callPackage ../data/sgml+xml/schemas/docbook-5.0 { };\n\n  docbook_sgml_dtd_31 = callPackage ../data/sgml+xml/schemas/sgml-dtd/docbook/3.1.nix { };\n\n  docbook_sgml_dtd_41 = callPackage ../data/sgml+xml/schemas/sgml-dtd/docbook/4.1.nix { };\n\n  docbook_xml_dtd_412 = callPackage ../data/sgml+xml/schemas/xml-dtd/docbook/4.1.2.nix { };\n\n  docbook_xml_dtd_42 = callPackage ../data/sgml+xml/schemas/xml-dtd/docbook/4.2.nix { };\n\n  docbook_xml_dtd_43 = callPackage ../data/sgml+xml/schemas/xml-dtd/docbook/4.3.nix { };\n\n  docbook_xml_dtd_45 = callPackage ../data/sgml+xml/schemas/xml-dtd/docbook/4.5.nix { };\n\n  docbook_xml_ebnf_dtd = callPackage ../data/sgml+xml/schemas/xml-dtd/docbook-ebnf { };\n\n  docbook_xml_xslt = docbook_xsl;\n\n  docbook_xsl = callPackage ../data/sgml+xml/stylesheets/xslt/docbook-xsl { };\n\n  docbook5_xsl = docbook_xsl_ns;\n\n  docbook_xsl_ns = callPackage ../data/sgml+xml/stylesheets/xslt/docbook-xsl-ns { };\n\n  dosemu_fonts = callPackage ../data/fonts/dosemu-fonts { };\n\n  eb-garamond = callPackage ../data/fonts/eb-garamond { };\n\n  fira = callPackage ../data/fonts/fira { };\n\n  freefont_ttf = callPackage ../data/fonts/freefont-ttf { };\n\n  freepats = callPackage ../data/misc/freepats { };\n\n  gentium = callPackage ../data/fonts/gentium {};\n\n  gnome_user_docs = callPackage ../data/documentation/gnome-user-docs { };\n\n  inherit (gnome3) gsettings_desktop_schemas;\n\n  hicolor_icon_theme = callPackage ../data/icons/hicolor-icon-theme { };\n\n  inconsolata = callPackage ../data/fonts/inconsolata {};\n\n  ipafont = callPackage ../data/fonts/ipafont {};\n\n  junicode = callPackage ../data/fonts/junicode { };\n\n  kochi-substitute = callPackage ../data/fonts/kochi-substitute {};\n\n  kochi-substitute-naga10 = callPackage ../data/fonts/kochi-substitute-naga10 {};\n\n  liberation_ttf = callPackage ../data/fonts/redhat-liberation-fonts { };\n\n  libertine = builderDefsPackage (import ../data/fonts/libertine) {\n    inherit fetchurl fontforge lib;\n  };\n\n  lmmath = callPackage ../data/fonts/lmodern/lmmath.nix {};\n\n  lmodern = callPackage ../data/fonts/lmodern { };\n\n  lohit-fonts = callPackage ../data/fonts/lohit-fonts { };\n\n  manpages = callPackage ../data/documentation/man-pages { };\n\n  miscfiles = callPackage ../data/misc/miscfiles { };\n\n  mobile_broadband_provider_info = callPackage ../data/misc/mobile-broadband-provider-info { };\n\n  mph_2b_damase = callPackage ../data/fonts/mph-2b-damase { };\n\n  nafees = callPackage ../data/fonts/nafees { };\n\n  oldstandard = callPackage ../data/fonts/oldstandard { };\n\n  opensans-ttf = callPackage ../data/fonts/opensans-ttf { };\n\n  poly = callPackage ../data/fonts/poly { };\n\n  posix_man_pages = callPackage ../data/documentation/man-pages-posix { };\n\n  pthreadmanpages = callPackage ../data/documentation/pthread-man-pages { };\n\n  shared_mime_info = callPackage ../data/misc/shared-mime-info { };\n\n  shared_desktop_ontologies = callPackage ../data/misc/shared-desktop-ontologies { };\n\n  stdmanpages = callPackage ../data/documentation/std-man-pages { };\n\n  symbola = callPackage ../data/fonts/symbola { };\n\n  iana_etc = callPackage ../data/misc/iana-etc { };\n\n  poppler_data = callPackage ../data/misc/poppler-data { };\n\n  r3rs = callPackage ../data/documentation/rnrs/r3rs.nix { };\n\n  r4rs = callPackage ../data/documentation/rnrs/r4rs.nix { };\n\n  r5rs = callPackage ../data/documentation/rnrs/r5rs.nix { };\n\n  source-code-pro = callPackage ../data/fonts/source-code-pro {};\n\n  source-sans-pro = callPackage ../data/fonts/source-sans-pro { };\n\n  source-serif-pro = callPackage ../data/fonts/source-serif-pro { };\n\n  source-han-sans-japanese = callPackage ../data/fonts/source-han-sans/japanese.nix {};\n  source-han-sans-korean = callPackage ../data/fonts/source-han-sans/korean.nix {};\n  source-han-sans-simplified-chinese = callPackage ../data/fonts/source-han-sans/simplified-chinese.nix {};\n  source-han-sans-traditional-chinese = callPackage ../data/fonts/source-han-sans/traditional-chinese.nix {};\n\n  tango-icon-theme = callPackage ../data/icons/tango-icon-theme { };\n\n  themes = name: import (../data/misc/themes + (\"/\" + name + \".nix\")) {\n    inherit fetchurl;\n  };\n\n  theano = callPackage ../data/fonts/theano { };\n\n  tempora_lgc = callPackage ../data/fonts/tempora-lgc { };\n\n  terminus_font = callPackage ../data/fonts/terminus-font { };\n\n  tipa = callPackage ../data/fonts/tipa { };\n\n  ttf_bitstream_vera = callPackage ../data/fonts/ttf-bitstream-vera { };\n\n  tzdata = callPackage ../data/misc/tzdata { };\n\n  ubuntu_font_family = callPackage ../data/fonts/ubuntu-font-family { };\n\n  ucsFonts = callPackage ../data/fonts/ucs-fonts { };\n\n  unifont = callPackage ../data/fonts/unifont { };\n\n  vistafonts = callPackage ../data/fonts/vista-fonts { };\n\n  wqy_microhei = callPackage ../data/fonts/wqy-microhei { };\n\n  wqy_zenhei = callPackage ../data/fonts/wqy-zenhei { };\n\n  xhtml1 = callPackage ../data/sgml+xml/schemas/xml-dtd/xhtml1 { };\n\n  xkeyboard_config = xorg.xkeyboardconfig;\n\n\n  ### APPLICATIONS\n\n  a2jmidid = callPackage ../applications/audio/a2jmidid { };\n\n  aangifte2006 = callPackage_i686 ../applications/taxes/aangifte-2006 { };\n\n  aangifte2007 = callPackage_i686 ../applications/taxes/aangifte-2007 { };\n\n  aangifte2008 = callPackage_i686 ../applications/taxes/aangifte-2008 { };\n\n  aangifte2009 = callPackage_i686 ../applications/taxes/aangifte-2009 { };\n\n  aangifte2010 = callPackage_i686 ../applications/taxes/aangifte-2010 { };\n\n  aangifte2011 = callPackage_i686 ../applications/taxes/aangifte-2011 { };\n\n  aangifte2012 = callPackage_i686 ../applications/taxes/aangifte-2012 { };\n\n  aangifte2013 = callPackage_i686 ../applications/taxes/aangifte-2013 { };\n\n  abcde = callPackage ../applications/audio/abcde {\n    inherit (perlPackages) DigestSHA MusicBrainz MusicBrainzDiscID;\n    libcdio = libcdio082;\n  };\n\n  abiword = callPackage ../applications/office/abiword {\n    inherit (gnome) libglade libgnomecanvas;\n  };\n\n  abook = callPackage ../applications/misc/abook { };\n\n  adobe-reader = callPackage_i686 ../applications/misc/adobe-reader { };\n\n  aewan = callPackage ../applications/editors/aewan { };\n\n  alchemy = callPackage ../applications/graphics/alchemy { };\n\n  ams-lv2 = callPackage ../applications/audio/ams-lv2 { };\n\n  amsn = callPackage ../applications/networking/instant-messengers/amsn { };\n\n  antiword = callPackage ../applications/office/antiword {};\n\n  ardour = ardour3;\n\n  ardour3 =  lowPrio (callPackage ../applications/audio/ardour {\n    inherit (gnome) libgnomecanvas libgnomecanvasmm;\n  });\n\n  arora = callPackage ../applications/networking/browsers/arora { };\n\n  atom = callPackage ../applications/editors/atom {\n    gconf = gnome.GConf;\n  };\n\n  aseprite = callPackage ../applications/editors/aseprite {\n    giflib = giflib_4_1;\n  };\n\n  audacious = callPackage ../applications/audio/audacious { };\n\n  audacity = callPackage ../applications/audio/audacity {\n    ffmpeg = ffmpeg_0_10;\n  };\n\n  milkytracker = callPackage ../applications/audio/milkytracker { };\n\n  aumix = callPackage ../applications/audio/aumix {\n    gtkGUI = false;\n  };\n\n  autopanosiftc = callPackage ../applications/graphics/autopanosiftc { };\n\n  avidemux = callPackage ../applications/video/avidemux { };\n\n  avogadro = callPackage ../applications/science/chemistry/avogadro {\n    eigen = eigen2;\n  };\n\n  avrdudess = callPackage ../applications/misc/avrdudess { };\n\n  avxsynth = callPackage ../applications/video/avxsynth { };\n\n  awesome-3-4 = callPackage ../applications/window-managers/awesome/3.4.nix {\n    lua = lua5;\n    cairo = cairo.override { xcbSupport = true; };\n  };\n  awesome-3-5 = callPackage ../applications/window-managers/awesome {\n    lua   = lua5_1;\n    cairo = cairo.override { xcbSupport = true; };\n  };\n  awesome = awesome-3-5;\n\n  inherit (gnome3) baobab;\n\n  bar = callPackage ../applications/window-managers/bar { };\n\n  baresip = callPackage ../applications/networking/instant-messengers/baresip {\n    ffmpeg = ffmpeg_1;\n  };\n\n  batik = callPackage ../applications/graphics/batik { };\n\n  bazaar = callPackage ../applications/version-management/bazaar { };\n\n  bazaarTools = builderDefsPackage (import ../applications/version-management/bazaar/tools.nix) {\n    inherit bazaar;\n  };\n\n  beast = callPackage ../applications/audio/beast {\n    inherit (gnome) libgnomecanvas libart_lgpl;\n    guile = guile_1_8;\n  };\n\n  bibletime = callPackage ../applications/misc/bibletime { };\n\n  bitcoin = callPackage ../applications/misc/bitcoin { };\n\n  bitlbee = callPackage ../applications/networking/instant-messengers/bitlbee {\n    gnutls = gnutls;\n    libotr = libotr_3_2;\n  };\n\n  blender = callPackage  ../applications/misc/blender {\n    python = python34;\n  };\n\n  bristol = callPackage ../applications/audio/bristol { };\n\n  bspwm = callPackage ../applications/window-managers/bspwm { };\n\n  bvi = callPackage ../applications/editors/bvi { };\n\n  calf = callPackage ../applications/audio/calf {\n      inherit (gnome) libglade;\n  };\n\n  calibre = callPackage ../applications/misc/calibre {\n    inherit (pythonPackages) pyqt5 sip_4_16;\n  };\n\n  camlistore = callPackage ../applications/misc/camlistore { };\n\n  carrier = builderDefsPackage (import ../applications/networking/instant-messengers/carrier/2.5.0.nix) {\n    inherit fetchurl stdenv pkgconfig perl perlXMLParser libxml2 openssl nss\n      gtkspell aspell gettext ncurses avahi dbus dbus_glib python\n      libtool automake autoconf gstreamer;\n    inherit gtk glib;\n    inherit (gnome) startupnotification GConf ;\n    inherit (xlibs) libXScrnSaver scrnsaverproto libX11 xproto kbproto;\n  };\n  funpidgin = carrier;\n\n  cc1394 = callPackage ../applications/video/cc1394 { };\n\n  cddiscid = callPackage ../applications/audio/cd-discid { };\n\n  cdparanoia = cdparanoiaIII;\n\n  cdparanoiaIII = callPackage ../applications/audio/cdparanoia { };\n\n  cdrtools = callPackage ../applications/misc/cdrtools { };\n\n  centerim = callPackage ../applications/networking/instant-messengers/centerim { };\n\n  cgit = callPackage ../applications/version-management/git-and-tools/cgit { };\n\n  cgminer = callPackage ../applications/misc/cgminer {\n    amdappsdk = amdappsdk28;\n  };\n\n  chatzilla = callPackage ../applications/networking/irc/chatzilla { };\n\n  chromium = lowPrio (callPackage ../applications/networking/browsers/chromium {\n    channel = \"stable\";\n    pulseSupport = config.pulseaudio or true;\n    enablePepperFlash = config.chromium.enablePepperFlash or false;\n    enablePepperPDF = config.chromium.enablePepperPDF or false;\n  });\n\n  chromiumBeta = lowPrio (chromium.override { channel = \"beta\"; });\n  chromiumBetaWrapper = lowPrio (wrapChromium chromiumBeta);\n\n  chromiumDev = lowPrio (chromium.override { channel = \"dev\"; });\n  chromiumDevWrapper = lowPrio (wrapChromium chromiumDev);\n\n  chromiumWrapper = wrapChromium chromium;\n\n  cinelerra = callPackage ../applications/video/cinelerra { };\n\n  clipit = callPackage ../applications/misc/clipit { };\n\n  cmus = callPackage ../applications/audio/cmus { };\n\n  compiz = callPackage ../applications/window-managers/compiz {\n    inherit (gnome) GConf ORBit2 metacity;\n    boost = boost149; # https://bugs.launchpad.net/compiz/+bug/1131864\n  };\n\n  coriander = callPackage ../applications/video/coriander {\n    inherit (gnome) libgnomeui GConf;\n  };\n\n  csound = callPackage ../applications/audio/csound { };\n\n  cinepaint = callPackage ../applications/graphics/cinepaint {\n    fltk = fltk13;\n    libpng = libpng12;\n  };\n\n  codeblocks = callPackage ../applications/editors/codeblocks { };\n  codeblocksFull = callPackage ../applications/editors/codeblocks { contribPlugins = true; };\n\n  codeville = builderDefsPackage (import ../applications/version-management/codeville/0.8.0.nix) {\n    inherit makeWrapper;\n    python = pythonFull;\n  };\n\n  comical = callPackage ../applications/graphics/comical { };\n\n  conkeror = callPackage ../applications/networking/browsers/conkeror { };\n\n  conkerorWrapper = wrapFirefox {\n    browser = conkeror;\n    browserName = \"conkeror\";\n    desktopName = \"Conkeror\";\n  };\n\n  cuneiform = builderDefsPackage (import ../tools/graphics/cuneiform) {\n    inherit cmake patchelf;\n    imagemagick = imagemagick;\n  };\n\n  cvs = callPackage ../applications/version-management/cvs { };\n\n  cvsps = callPackage ../applications/version-management/cvsps { };\n\n  cvs2svn = callPackage ../applications/version-management/cvs2svn { };\n\n  d4x = callPackage ../applications/misc/d4x { };\n\n  darcs = with haskellPackages_ghc783; callPackage ../applications/version-management/darcs {\n    cabal = cabal.override {\n      extension = self : super : {\n        isLibrary = false;\n        configureFlags = \"-f-library \" + super.configureFlags or \"\";\n      };\n    };\n  };\n\n  darktable = callPackage ../applications/graphics/darktable {\n    inherit (gnome) GConf libglade;\n  };\n\n  dd-agent = callPackage ../tools/networking/dd-agent { inherit (pythonPackages) tornado; };\n\n  dia = callPackage ../applications/graphics/dia {\n    inherit (pkgs.gnome) libart_lgpl libgnomeui;\n  };\n\n  diffuse = callPackage ../applications/version-management/diffuse { };\n\n  distrho = callPackage ../applications/audio/distrho {};\n\n  djvulibre = callPackage ../applications/misc/djvulibre { };\n\n  djvu2pdf = callPackage ../tools/typesetting/djvu2pdf { };\n\n  djview = callPackage ../applications/graphics/djview { };\n  djview4 = pkgs.djview;\n\n  dmenu = callPackage ../applications/misc/dmenu {\n    enableXft = config.dmenu.enableXft or false;\n  };\n\n  dmtx = builderDefsPackage (import ../tools/graphics/dmtx) {\n    inherit libpng libtiff libjpeg imagemagick librsvg\n      pkgconfig bzip2 zlib libtool freetype fontconfig\n      ghostscript jasper xz;\n    inherit (xlibs) libX11;\n  };\n\n  docker = callPackage ../applications/virtualization/docker { };\n\n  doodle = callPackage ../applications/search/doodle { };\n\n  dunst = callPackage ../applications/misc/dunst { };\n\n  dvb_apps  = callPackage ../applications/video/dvb-apps { };\n\n  dvdauthor = callPackage ../applications/video/dvdauthor { };\n\n  dwb = callPackage ../applications/networking/browsers/dwb { dconf = gnome3.dconf; };\n\n  dwbWrapper = wrapFirefox\n    { browser = dwb; browserName = \"dwb\"; desktopName = \"dwb\";\n    };\n\n  dwm = callPackage ../applications/window-managers/dwm {\n    patches = config.dwm.patches or [];\n  };\n\n  dzen2 = callPackage ../applications/window-managers/dzen2 { };\n\n  eaglemode = callPackage ../applications/misc/eaglemode { };\n\n  eclipses = recurseIntoAttrs (callPackage ../applications/editors/eclipse { });\n\n  ed = callPackage ../applications/editors/ed { };\n\n  ekho = callPackage ../applications/audio/ekho { };\n\n  electrum = callPackage ../applications/misc/electrum { };\n\n  elinks = callPackage ../applications/networking/browsers/elinks { };\n\n  elvis = callPackage ../applications/editors/elvis { };\n\n  emacs = emacs24;\n\n  emacs24 = callPackage ../applications/editors/emacs-24 {\n    # use override to enable additional features\n    libXaw = xlibs.libXaw;\n    Xaw3d = null;\n    gconf = null;\n    librsvg = null;\n    alsaLib = null;\n    imagemagick = null;\n  };\n\n  emacs24-nox = lowPrio (appendToName \"nox\" (emacs24.override {\n    withX = false;\n  }));\n\n  emacs24Macport = lowPrio (callPackage ../applications/editors/emacs-24/macport.nix {\n    stdenv = pkgs.clangStdenv;\n  });\n\n  emacsPackages = emacs: self: let callPackage = newScope self; in rec {\n    inherit emacs;\n\n    autoComplete = callPackage ../applications/editors/emacs-modes/auto-complete { };\n\n    bbdb = callPackage ../applications/editors/emacs-modes/bbdb { };\n\n    bbdb3 = callPackage ../applications/editors/emacs-modes/bbdb/3.nix {};\n\n    cedet = callPackage ../applications/editors/emacs-modes/cedet { };\n\n    calfw = callPackage ../applications/editors/emacs-modes/calfw { };\n\n    coffee = callPackage ../applications/editors/emacs-modes/coffee { };\n\n    colorTheme = callPackage ../applications/editors/emacs-modes/color-theme { };\n\n    colorThemeSolarized = callPackage ../applications/editors/emacs-modes/color-theme-solarized { };\n\n    cryptol = callPackage ../applications/editors/emacs-modes/cryptol { };\n\n    cua = callPackage ../applications/editors/emacs-modes/cua { };\n\n    darcsum = callPackage ../applications/editors/emacs-modes/darcsum { };\n\n    # ecb = callPackage ../applications/editors/emacs-modes/ecb { };\n\n    jabber = callPackage ../applications/editors/emacs-modes/jabber { };\n\n    emacsClangCompleteAsync = callPackage ../applications/editors/emacs-modes/emacs-clang-complete-async { };\n\n    emacsSessionManagement = callPackage ../applications/editors/emacs-modes/session-management-for-emacs { };\n\n    emacsw3m = callPackage ../applications/editors/emacs-modes/emacs-w3m { };\n\n    emms = callPackage ../applications/editors/emacs-modes/emms { };\n\n    ess = callPackage ../applications/editors/emacs-modes/ess { };\n\n    flymakeCursor = callPackage ../applications/editors/emacs-modes/flymake-cursor { };\n\n    gh = callPackage ../applications/editors/emacs-modes/gh { };\n\n    graphvizDot = callPackage ../applications/editors/emacs-modes/graphviz-dot { };\n\n    gist = callPackage ../applications/editors/emacs-modes/gist { };\n\n    idris = callPackage ../applications/editors/emacs-modes/idris { };\n\n    jade = callPackage ../applications/editors/emacs-modes/jade { };\n\n    jdee = callPackage ../applications/editors/emacs-modes/jdee {\n      # Requires Emacs 23, for `avl-tree'.\n    };\n\n    js2 = callPackage ../applications/editors/emacs-modes/js2 { };\n\n    stratego = callPackage ../applications/editors/emacs-modes/stratego { };\n\n    haskellMode = callPackage ../applications/editors/emacs-modes/haskell { };\n\n    ocamlMode = callPackage ../applications/editors/emacs-modes/ocaml { };\n\n    structuredHaskellMode = callPackage ../applications/editors/emacs-modes/structured-haskell-mode {\n      inherit (haskellPackages) cabal haskellSrcExts;\n    };\n\n    tuaregMode = callPackage ../applications/editors/emacs-modes/tuareg { };\n\n    hol_light_mode = callPackage ../applications/editors/emacs-modes/hol_light { };\n\n    htmlize = callPackage ../applications/editors/emacs-modes/htmlize { };\n\n    logito = callPackage ../applications/editors/emacs-modes/logito { };\n\n    loremIpsum = callPackage ../applications/editors/emacs-modes/lorem-ipsum { };\n\n    magit = callPackage ../applications/editors/emacs-modes/magit { };\n\n    maudeMode = callPackage ../applications/editors/emacs-modes/maude { };\n\n    metaweblog = callPackage ../applications/editors/emacs-modes/metaweblog { };\n\n    notmuch = lowPrio (callPackage ../applications/networking/mailreaders/notmuch { });\n\n    offlineimap = callPackage ../applications/editors/emacs-modes/offlineimap {};\n\n    # This is usually a newer version of Org-Mode than that found in GNU Emacs, so\n    # we want it to have higher precedence.\n    org = hiPrio (callPackage ../applications/editors/emacs-modes/org { });\n\n    org2blog = callPackage ../applications/editors/emacs-modes/org2blog { };\n\n    pcache = callPackage ../applications/editors/emacs-modes/pcache { };\n\n    phpMode = callPackage ../applications/editors/emacs-modes/php { };\n\n    prologMode = callPackage ../applications/editors/emacs-modes/prolog { };\n\n    proofgeneral_4_2 = callPackage ../applications/editors/emacs-modes/proofgeneral/4.2.nix {\n      texinfo = texinfo4 ;\n      texLive = pkgs.texLiveAggregationFun {\n        paths = [ pkgs.texLive pkgs.texLiveCMSuper ];\n      };\n    };\n    proofgeneral_4_3_pre = callPackage ../applications/editors/emacs-modes/proofgeneral/4.3pre.nix {\n      texinfo = texinfo4 ;\n      texLive = pkgs.texLiveAggregationFun {\n        paths = [ pkgs.texLive pkgs.texLiveCMSuper ];\n      };\n    };\n    proofgeneral = self.proofgeneral_4_2;\n\n    quack = callPackage ../applications/editors/emacs-modes/quack { };\n\n    rectMark = callPackage ../applications/editors/emacs-modes/rect-mark { };\n\n    remember = callPackage ../applications/editors/emacs-modes/remember { };\n\n    rudel = callPackage ../applications/editors/emacs-modes/rudel { };\n\n    sbtMode = callPackage ../applications/editors/emacs-modes/sbt-mode { };\n\n    scalaMode1 = callPackage ../applications/editors/emacs-modes/scala-mode/v1.nix { };\n    scalaMode2 = callPackage ../applications/editors/emacs-modes/scala-mode/v2.nix { };\n\n    sunriseCommander = callPackage ../applications/editors/emacs-modes/sunrise-commander { };\n\n    writeGood = callPackage ../applications/editors/emacs-modes/writegood { };\n\n    xmlRpc = callPackage ../applications/editors/emacs-modes/xml-rpc { };\n  };\n\n  emacs24Packages = recurseIntoAttrs (emacsPackages emacs24 pkgs.emacs24Packages);\n\n  inherit (gnome3) empathy;\n\n  epdfview = callPackage ../applications/misc/epdfview { };\n\n  inherit (gnome3) epiphany;\n\n  espeak = callPackage ../applications/audio/espeak { };\n\n  espeakedit = callPackage ../applications/audio/espeak/edit.nix { };\n\n  esniper = callPackage ../applications/networking/esniper { };\n\n  etherape = callPackage ../applications/networking/sniffers/etherape {\n    inherit (gnome) gnomedocutils libgnome libglade libgnomeui scrollkeeper;\n  };\n\n  evopedia = callPackage ../applications/misc/evopedia { };\n\n  keepassx = callPackage ../applications/misc/keepassx { };\n  keepassx2 = callPackage ../applications/misc/keepassx/2.0.nix { };\n\n  inherit (gnome3) evince;\n  evolution_data_server = gnome3.evolution_data_server;\n\n  keepass = callPackage ../applications/misc/keepass { };\n\n  exrdisplay = callPackage ../applications/graphics/exrdisplay {\n    fltk = fltk20;\n  };\n\n  fbpanel = callPackage ../applications/window-managers/fbpanel { };\n\n  fbreader = callPackage ../applications/misc/fbreader { };\n\n  fetchmail = import ../applications/misc/fetchmail {\n    inherit stdenv fetchurl openssl;\n  };\n\n  fldigi = callPackage ../applications/audio/fldigi { };\n\n  fluidsynth = callPackage ../applications/audio/fluidsynth { };\n\n  fossil = callPackage ../applications/version-management/fossil { };\n\n  fribid = callPackage ../applications/networking/browsers/mozilla-plugins/fribid { };\n\n  fvwm = callPackage ../applications/window-managers/fvwm { };\n\n  geany = callPackage ../applications/editors/geany { };\n\n  gksu = callPackage ../applications/misc/gksu { };\n\n  gnuradio = callPackage ../applications/misc/gnuradio {\n    inherit (pythonPackages) lxml numpy scipy matplotlib pyopengl;\n    fftw = fftwFloat;\n  };\n\n  gnuradio-osmosdr = callPackage ../applications/misc/gnuradio-osmosdr { };\n\n  goldendict = callPackage ../applications/misc/goldendict { };\n\n  google-musicmanager = callPackage ../applications/audio/google-musicmanager { };\n\n  gpicview = callPackage ../applications/graphics/gpicview { };\n\n  gqrx = callPackage ../applications/misc/gqrx { };\n\n  grass = import ../applications/misc/grass {\n    inherit (xlibs) libXmu libXext libXp libX11 libXt libSM libICE libXpm\n      libXaw libXrender;\n    inherit config composableDerivation stdenv fetchurl\n      lib flex bison cairo fontconfig\n      gdal zlib ncurses gdbm proj pkgconfig swig\n      blas liblapack libjpeg libpng mysql unixODBC mesa postgresql python\n      readline sqlite tcl tk libtiff freetype makeWrapper wxGTK;\n    fftw = fftwSinglePrec;\n    ffmpeg = ffmpeg_0_10;\n    motif = lesstif;\n    opendwg = libdwg;\n    wxPython = wxPython28;\n  };\n\n  grip = callPackage ../applications/misc/grip {\n    inherit (gnome) libgnome libgnomeui vte;\n  };\n\n  gtimelog = pythonPackages.gtimelog;\n\n  inherit (gnome3) gucharmap;\n\n  guitarix = callPackage ../applications/audio/guitarix {\n    fftw = fftwSinglePrec;\n  };\n\n  photivo = callPackage ../applications/graphics/photivo { };\n\n  wavesurfer = callPackage ../applications/misc/audio/wavesurfer { };\n\n  wireshark = callPackage ../applications/networking/sniffers/wireshark { };\n\n  wvdial = callPackage ../os-specific/linux/wvdial { };\n\n  fbida = callPackage ../applications/graphics/fbida { };\n\n  fdupes = callPackage ../tools/misc/fdupes { };\n\n  feh = callPackage ../applications/graphics/feh { };\n\n  filezilla = callPackage ../applications/networking/ftp/filezilla { };\n\n  firefox13Pkgs = callPackage ../applications/networking/browsers/firefox/13.0.nix {\n    inherit (gnome) libIDL;\n  };\n\n  firefox13Wrapper = wrapFirefox { browser = firefox13Pkgs.firefox; };\n\n  firefox30Pkgs = callPackage ../applications/networking/browsers/firefox/30.nix {\n    inherit (gnome) libIDL;\n    inherit (pythonPackages) pysqlite;\n    libpng = libpng_apng;\n  };\n\n  firefox = callPackage ../applications/networking/browsers/firefox {\n    inherit (gnome) libIDL;\n    inherit (pythonPackages) pysqlite;\n  };\n\n  firefoxWrapper = wrapFirefox { browser = pkgs.firefox; };\n\n  firefox-bin = callPackage ../applications/networking/browsers/firefox-bin {\n    gconf = pkgs.gnome.GConf;\n    inherit (pkgs.gnome) libgnome libgnomeui;\n    inherit (pkgs.xlibs) libX11 libXScrnSaver libXext\n      libXinerama libXrender libXt;\n  };\n\n  flac = callPackage ../applications/audio/flac { };\n\n  flashplayer = callPackage ../applications/networking/browsers/mozilla-plugins/flashplayer-11 {\n    debug = config.flashplayer.debug or false;\n  };\n\n  fluxbox = callPackage ../applications/window-managers/fluxbox { };\n\n  freecad = callPackage ../applications/graphics/freecad {\n    opencascade = opencascade_6_5;\n    inherit (pythonPackages) matplotlib pycollada;\n  };\n\n  freemind = callPackage ../applications/misc/freemind {\n    jdk = jdk;\n    jre = jdk;\n  };\n\n  freenet = callPackage ../applications/networking/p2p/freenet { };\n\n  freepv = callPackage ../applications/graphics/freepv { };\n\n  xfontsel = callPackage ../applications/misc/xfontsel { };\n  xlsfonts = callPackage ../applications/misc/xlsfonts { };\n\n  freerdp = callPackage ../applications/networking/remote/freerdp {\n    ffmpeg = ffmpeg_1;\n  };\n\n  freerdpUnstable = callPackage ../applications/networking/remote/freerdp/unstable.nix { };\n\n  freicoin = callPackage ../applications/misc/freicoin { };\n\n  fspot = callPackage ../applications/graphics/f-spot {\n    inherit (gnome) libgnome libgnomeui;\n    gtksharp = gtksharp1;\n  };\n\n  fuze = callPackage ../applications/networking/instant-messengers/fuze {};\n\n  gcolor2 = callPackage ../applications/graphics/gcolor2 { };\n\n  get_iplayer = callPackage ../applications/misc/get_iplayer {};\n\n  gimp_2_8 = callPackage ../applications/graphics/gimp/2.8.nix {\n    inherit (gnome) libart_lgpl;\n    webkit = null;\n    lcms = lcms2;\n    wrapPython = pythonPackages.wrapPython;\n  };\n\n  gimp = gimp_2_8;\n\n  gimpPlugins = recurseIntoAttrs (import ../applications/graphics/gimp/plugins {\n    inherit pkgs gimp;\n  });\n\n  gitAndTools = recurseIntoAttrs (import ../applications/version-management/git-and-tools {\n    inherit pkgs;\n  });\n  git = gitAndTools.git;\n  gitFull = gitAndTools.gitFull;\n  gitSVN = gitAndTools.gitSVN;\n\n  gitRepo = callPackage ../applications/version-management/git-repo {\n    python = python27;\n  };\n\n  gitolite = callPackage ../applications/version-management/gitolite { };\n\n  inherit (gnome3) gitg;\n\n  giv = callPackage ../applications/graphics/giv {\n    pcre = pcre.override { unicodeSupport = true; };\n  };\n\n  gmrun = callPackage ../applications/misc/gmrun {};\n\n  gnucash = callPackage ../applications/office/gnucash {\n    inherit (gnome2) libgnomeui libgtkhtml gtkhtml libbonoboui libgnomeprint libglade libart_lgpl;\n    gconf = gnome2.GConf;\n    guile = guile_1_8;\n    slibGuile = slibGuile.override { scheme = guile_1_8; };\n    goffice = goffice_0_8;\n  };\n\n  goffice_0_8 = callPackage ../desktops/gnome-3/3.10/misc/goffice/0.8.nix {\n    inherit (gnome2) libglade libgnomeui;\n    gconf = gnome2.GConf;\n    libart = gnome2.libart_lgpl;\n  }; # latest version: gnome3.goffice\n\n  ideas = recurseIntoAttrs (  (callPackage ../applications/editors/idea { })\n                           // (callPackage ../applications/editors/idea/pycharm.nix { }));\n\n  libquvi = callPackage ../applications/video/quvi/library.nix { };\n\n  mi2ly = callPackage ../applications/audio/mi2ly {};\n\n  praat = callPackage ../applications/audio/praat { };\n\n  quvi = callPackage ../applications/video/quvi/tool.nix { };\n\n  quvi_scripts = callPackage ../applications/video/quvi/scripts.nix { };\n\n  qjackctl = callPackage ../applications/audio/qjackctl { };\n\n  gkrellm = callPackage ../applications/misc/gkrellm { };\n\n  gmu = callPackage ../applications/audio/gmu { };\n\n  gnash = callPackage ../applications/video/gnash {\n    inherit (gnome) gtkglext;\n  };\n\n  gnome_mplayer = callPackage ../applications/video/gnome-mplayer {\n    inherit (gnome) GConf;\n  };\n\n  gnumeric = callPackage ../applications/office/gnumeric {\n    inherit (gnome3) goffice gnome_icon_theme;\n  };\n\n  gnunet = callPackage ../applications/networking/p2p/gnunet {\n    libgcrypt = libgcrypt_1_6;\n  };\n\n  gnunet_svn = lowPrio (callPackage ../applications/networking/p2p/gnunet/svn.nix {\n    libgcrypt = libgcrypt_1_6;\n  });\n\n  gocr = callPackage ../applications/graphics/gocr { };\n\n  gobby5 = callPackage ../applications/editors/gobby {\n    inherit (gnome) gtksourceview;\n  };\n\n  gphoto2 = callPackage ../applications/misc/gphoto2 { };\n\n  gphoto2fs = builderDefsPackage ../applications/misc/gphoto2/gphotofs.nix {\n    inherit libgphoto2 fuse pkgconfig glib libtool;\n  };\n\n  graphicsmagick = callPackage ../applications/graphics/graphicsmagick { };\n  graphicsmagick_q16 = callPackage ../applications/graphics/graphicsmagick { quantumdepth = 16; };\n\n  graphicsmagick137 = callPackage ../applications/graphics/graphicsmagick/1.3.7.nix {\n    libpng = libpng12;\n  };\n\n  gtkpod = callPackage ../applications/audio/gtkpod {\n    inherit (gnome) libglade;\n  };\n\n  jbidwatcher = callPackage ../applications/misc/jbidwatcher {\n    java = if stdenv.isLinux then jre else jdk;\n  };\n\n  qrdecode = builderDefsPackage (import ../tools/graphics/qrdecode) {\n    libpng = libpng12;\n    opencv = opencv_2_1;\n  };\n\n  qrencode = callPackage ../tools/graphics/qrencode { };\n\n  gecko_mediaplayer = callPackage ../applications/networking/browsers/mozilla-plugins/gecko-mediaplayer {\n    inherit (gnome) GConf;\n    browser = firefox;\n  };\n\n  geeqie = callPackage ../applications/graphics/geeqie { };\n\n  gigedit = callPackage ../applications/audio/gigedit { };\n\n  gqview = callPackage ../applications/graphics/gqview { };\n\n  gmpc = callPackage ../applications/audio/gmpc { };\n\n  gmtk = callPackage ../applications/networking/browsers/mozilla-plugins/gmtk {\n    inherit (gnome) GConf;\n  };\n\n  googleearth = callPackage_i686 ../applications/misc/googleearth { };\n\n  google_talk_plugin = callPackage ../applications/networking/browsers/mozilla-plugins/google-talk-plugin {\n    libpng = libpng12;\n  };\n\n  gosmore = builderDefsPackage ../applications/misc/gosmore {\n    inherit fetchsvn curl pkgconfig libxml2 gtk;\n  };\n\n  gpsbabel = callPackage ../applications/misc/gpsbabel { };\n\n  gpscorrelate = callPackage ../applications/misc/gpscorrelate { };\n\n  gpsd = callPackage ../servers/gpsd { };\n\n  guitone = callPackage ../applications/version-management/guitone { };\n\n  gv = callPackage ../applications/misc/gv { };\n\n  guvcview = callPackage ../os-specific/linux/guvcview { };\n\n  hello = callPackage ../applications/misc/hello/ex-2 { };\n\n  herbstluftwm = callPackage ../applications/window-managers/herbstluftwm { };\n\n  hexchat = callPackage ../applications/networking/irc/hexchat { };\n\n  hexedit = callPackage ../applications/editors/hexedit { };\n\n  hipchat = callPackage ../applications/networking/instant-messengers/hipchat { };\n\n  homebank = callPackage ../applications/office/homebank { };\n\n  htmldoc = callPackage ../applications/misc/htmldoc {\n    fltk = fltk13;\n  };\n\n  hugin = callPackage ../applications/graphics/hugin { };\n\n  hydrogen = callPackage ../applications/audio/hydrogen { };\n\n  i3 = callPackage ../applications/window-managers/i3 { };\n\n  i3lock = callPackage ../applications/window-managers/i3/lock.nix {\n    inherit (xorg) libxkbfile;\n    cairo = cairo.override { xcbSupport = true; };\n  };\n\n  i3minator = callPackage ../tools/misc/i3minator { };\n\n  i3status = callPackage ../applications/window-managers/i3/status.nix { };\n\n  i810switch = callPackage ../os-specific/linux/i810switch { };\n\n  icewm = callPackage ../applications/window-managers/icewm { };\n\n  id3v2 = callPackage ../applications/audio/id3v2 { };\n\n  ifenslave = callPackage ../os-specific/linux/ifenslave { };\n\n  ii = callPackage ../applications/networking/irc/ii { };\n\n  ike = callPackage ../applications/ike { };\n\n  ikiwiki = callPackage ../applications/misc/ikiwiki {\n    inherit (perlPackages) TextMarkdown URI HTMLParser HTMLScrubber\n      HTMLTemplate TimeDate CGISession DBFile CGIFormBuilder LocaleGettext\n      RpcXML XMLSimple PerlMagick YAML YAMLLibYAML HTMLTree Filechdir\n      AuthenPassphrase NetOpenIDConsumer LWPxParanoidAgent CryptSSLeay;\n  };\n\n  imagemagick = callPackage ../applications/graphics/ImageMagick {\n    tetex = null;\n    librsvg = null;\n  };\n\n  imagemagickBig = lowPrio (callPackage ../applications/graphics/ImageMagick { });\n\n  # Impressive, formerly known as \"KeyJNote\".\n  impressive = callPackage ../applications/office/impressive {\n    # XXX These are the PyOpenGL dependencies, which we need here.\n    inherit (pythonPackages) pyopengl;\n  };\n\n  inferno = callPackage_i686 ../applications/inferno { };\n\n  inkscape = callPackage ../applications/graphics/inkscape {\n    inherit (pythonPackages) lxml;\n    lcms = lcms2;\n  };\n\n  ion3 = callPackage ../applications/window-managers/ion-3 {\n    lua = lua5;\n  };\n\n  ipe = callPackage ../applications/graphics/ipe { };\n\n  iptraf = callPackage ../applications/networking/iptraf { };\n\n  irssi = callPackage ../applications/networking/irc/irssi {\n    # compile with gccApple on darwin to support the -no-cpp-precompile flag\n    stdenv = if stdenv.isDarwin\n      then stdenvAdapters.overrideGCC stdenv gccApple\n      else stdenv;\n  };\n\n  irssi_fish = callPackage ../applications/networking/irc/irssi/fish { };\n\n  irssi_otr = callPackage ../applications/networking/irc/irssi/otr { };\n\n  bip = callPackage ../applications/networking/irc/bip { };\n\n  jack_capture = callPackage ../applications/audio/jack-capture { };\n\n  jack_oscrolloscope = callPackage ../applications/audio/jack-oscrolloscope { };\n\n  jack_rack = callPackage ../applications/audio/jack-rack { };\n\n  jackmeter = callPackage ../applications/audio/jackmeter { };\n\n  jalv = callPackage ../applications/audio/jalv { };\n\n  jedit = callPackage ../applications/editors/jedit { };\n\n  jigdo = callPackage ../applications/misc/jigdo { };\n\n  jitsi = callPackage ../applications/networking/instant-messengers/jitsi { };\n\n  joe = callPackage ../applications/editors/joe { };\n\n  jbrout = callPackage ../applications/graphics/jbrout {\n    inherit (pythonPackages) lxml;\n  };\n\n  jwm = callPackage ../applications/window-managers/jwm { };\n\n  k3d = callPackage ../applications/graphics/k3d {\n    inherit (pkgs.gnome2) gtkglext;\n  };\n\n  keepnote = callPackage ../applications/office/keepnote {\n    pygtk = pyGtkGlade;\n  };\n\n  kermit = callPackage ../tools/misc/kermit { };\n\n  keymon = callPackage ../applications/video/key-mon { };\n\n  kino = callPackage ../applications/video/kino {\n    inherit (gnome) libglade;\n  };\n\n  lame = callPackage ../applications/audio/lame { };\n\n  larswm = callPackage ../applications/window-managers/larswm { };\n\n  lash = callPackage ../applications/audio/lash { };\n\n  ladspaH = callPackage ../applications/audio/ladspa-plugins/ladspah.nix { };\n\n  ladspaPlugins = callPackage ../applications/audio/ladspa-plugins {\n    fftw = fftwSinglePrec;\n  };\n\n  caps = callPackage ../applications/audio/caps { };\n\n  lastwatch = callPackage ../applications/audio/lastwatch { };\n\n  lastfmsubmitd = callPackage ../applications/audio/lastfmsubmitd { };\n\n  lbdb = callPackage ../tools/misc/lbdb { };\n\n  lci = callPackage ../applications/science/logic/lci {};\n\n  ldcpp = callPackage ../applications/networking/p2p/ldcpp {\n    inherit (gnome) libglade;\n  };\n\n  librecad = callPackage ../applications/misc/librecad { };\n\n  librecad2 = callPackage ../applications/misc/librecad/2.0.nix { };\n\n  libreoffice = callPackage ../applications/office/libreoffice {\n    inherit (perlPackages) ArchiveZip CompressZlib;\n    inherit (gnome) GConf ORBit2 gnome_vfs;\n    zip = zip.override { enableNLS = false; };\n    boost = boost155;\n    jdk = openjdk;\n    fontsConf = makeFontsConf {\n      fontDirectories = [\n        freefont_ttf xorg.fontmiscmisc xorg.fontbhttf\n      ];\n    };\n    clucene_core = clucene_core_2;\n    lcms = lcms2;\n    harfbuzz = harfbuzz.override {\n      withIcu = true; withGraphite2 = true;\n    };\n  };\n\n  liferea = callPackage ../applications/networking/newsreaders/liferea { };\n\n  lingot = callPackage ../applications/audio/lingot {\n    inherit (gnome) libglade;\n  };\n\n  links = callPackage ../applications/networking/browsers/links { };\n\n  ledger = callPackage ../applications/office/ledger/2.6.3.nix { };\n  ledger3 = callPackage ../applications/office/ledger/3.0.nix { };\n\n  lighttable = callPackage ../applications/editors/lighttable {};\n\n  links2 = callPackage ../applications/networking/browsers/links2 { };\n\n  linphone = callPackage ../applications/networking/instant-messengers/linphone rec {\n    inherit (gnome) libglade;\n    libexosip = libexosip_3;\n    libosip = libosip_3;\n  };\n\n  linuxsampler = callPackage ../applications/audio/linuxsampler {\n    bison = bison2;\n  };\n\n  llpp = callPackage ../applications/misc/llpp { inherit (ocamlPackages) lablgl; };\n\n  lmms = callPackage ../applications/audio/lmms { };\n\n  lrzsz = callPackage ../tools/misc/lrzsz { };\n\n  luminanceHDR = callPackage ../applications/graphics/luminance-hdr { };\n\n  lxdvdrip = callPackage ../applications/video/lxdvdrip { };\n\n  handbrake = callPackage ../applications/video/handbrake { };\n\n  lynx = callPackage ../applications/networking/browsers/lynx { };\n\n  lyx = callPackage ../applications/misc/lyx { };\n\n  makeself = callPackage ../applications/misc/makeself { };\n\n  matchbox = callPackage ../applications/window-managers/matchbox { };\n\n  mcpp = callPackage ../development/compilers/mcpp { };\n\n  mda_lv2 = callPackage ../applications/audio/mda-lv2 { };\n\n  meld = callPackage ../applications/version-management/meld {\n    inherit (gnome) scrollkeeper;\n    pygtk = pyGtkGlade;\n  };\n\n  mcomix = callPackage ../applications/graphics/mcomix { };\n\n  mercurial = callPackage ../applications/version-management/mercurial {\n    inherit (pythonPackages) curses docutils;\n    guiSupport = false; # use mercurialFull to get hgk GUI\n  };\n\n  mercurialFull = appendToName \"full\" (pkgs.mercurial.override { guiSupport = true; });\n\n  merkaartor = callPackage ../applications/misc/merkaartor { };\n\n  meshlab = callPackage ../applications/graphics/meshlab { };\n\n  mhwaveedit = callPackage ../applications/audio/mhwaveedit {};\n\n  mid2key = callPackage ../applications/audio/mid2key { };\n\n  midori = callPackage ../applications/networking/browsers/midori { };\n\n  midoriWrapper = wrapFirefox\n    { browser = midori; browserName = \"midori\"; desktopName = \"Midori\";\n      icon = \"${midori}/share/icons/hicolor/22x22/apps/midori.png\";\n    };\n\n  mikmod = callPackage ../applications/audio/mikmod { };\n\n  minicom = callPackage ../tools/misc/minicom { };\n\n  minimodem = callPackage ../applications/audio/minimodem { };\n\n  minidjvu = callPackage ../applications/graphics/minidjvu { };\n\n  mirage = callPackage ../applications/graphics/mirage {};\n\n  mixxx = callPackage ../applications/audio/mixxx {\n    inherit (vamp) vampSDK;\n  };\n\n  mmex = callPackage ../applications/office/mmex { };\n\n  moc = callPackage ../applications/audio/moc { };\n\n  monkeysAudio = callPackage ../applications/audio/monkeys-audio { };\n\n  monodevelop = callPackage ../applications/editors/monodevelop {\n    inherit (gnome) gnome_vfs libbonobo libglade libgnome GConf;\n    mozilla = firefox;\n    gtksharp = gtksharp2;\n  };\n\n  monodoc = callPackage ../applications/editors/monodoc {\n    gtksharp = gtksharp1;\n  };\n\n  monotone = callPackage ../applications/version-management/monotone {\n    lua = lua5;\n    boost = boost149;\n  };\n\n  monotoneViz = builderDefsPackage (import ../applications/version-management/monotone-viz/mtn-head.nix) {\n    inherit ocaml graphviz pkgconfig autoconf automake libtool glib gtk;\n    inherit (ocamlPackages) lablgtk;\n    inherit (gnome) libgnomecanvas;\n  };\n\n  mopidy = callPackage ../applications/audio/mopidy { };\n\n  mopidy-spotify = callPackage ../applications/audio/mopidy-spotify { };\n\n  mopidy-moped = callPackage ../applications/audio/mopidy-moped { };\n\n  mozilla = callPackage ../applications/networking/browsers/mozilla {\n    inherit (gnome) libIDL;\n  };\n\n  mozplugger = builderDefsPackage (import ../applications/networking/browsers/mozilla-plugins/mozplugger) {\n    inherit firefox;\n    inherit (xlibs) libX11 xproto;\n  };\n\n  easytag = callPackage ../applications/audio/easytag { };\n\n  mp3info = callPackage ../applications/audio/mp3info { };\n\n  mp3splt = callPackage ../applications/audio/mp3splt { };\n\n  mpc123 = callPackage ../applications/audio/mpc123 { };\n\n  mpg123 = callPackage ../applications/audio/mpg123 { };\n\n  mpg321 = callPackage ../applications/audio/mpg321 { };\n\n  mpc_cli = callPackage ../applications/audio/mpc { };\n\n  ncmpc = callPackage ../applications/audio/ncmpc { };\n\n  ncmpcpp = callPackage ../applications/audio/ncmpcpp { };\n\n  normalize = callPackage ../applications/audio/normalize { };\n\n  mplayer = callPackage ../applications/video/mplayer {\n    pulseSupport = config.pulseaudio or false;\n    vdpauSupport = config.mplayer.vdpauSupport or false;\n  };\n\n  mplayer2 = callPackage ../applications/video/mplayer2 {\n    ffmpeg = libav_9; # see https://trac.macports.org/ticket/44386\n  };\n\n  MPlayerPlugin = browser:\n    import ../applications/networking/browsers/mozilla-plugins/mplayerplug-in {\n      inherit browser;\n      inherit fetchurl stdenv pkgconfig gettext;\n      inherit (xlibs) libXpm;\n      # !!! should depend on MPlayer\n    };\n\n  mpv = callPackage ../applications/video/mpv {\n    lua = lua5_1;\n    bs2bSupport = true;\n    quviSupport = true;\n    cacaSupport = true;\n  };\n\n  mrxvt = callPackage ../applications/misc/mrxvt { };\n\n  multisync = callPackage ../applications/misc/multisync {\n    inherit (gnome) ORBit2 libbonobo libgnomeui GConf;\n  };\n\n  mumble = callPackage ../applications/networking/mumble {\n    avahi = avahi.override {\n      withLibdnssdCompat = true;\n    };\n    jackSupport = config.mumble.jackSupport or false;\n    speechdSupport = config.mumble.speechdSupport or false;\n  };\n\n  murmur = callPackage ../applications/networking/mumble/murmur.nix {\n    avahi = avahi.override {\n      withLibdnssdCompat = true;\n    };\n    iceSupport = config.murmur.iceSupport or true;\n  };\n\n  mutt = callPackage ../applications/networking/mailreaders/mutt { };\n\n  pcmanfm = callPackage ../applications/misc/pcmanfm { };\n\n  ruby_gpgme = callPackage ../development/libraries/ruby_gpgme {\n    ruby = ruby19;\n    hoe = rubyLibs.hoe;\n  };\n\n  ruby_ncursesw_sup = callPackage ../development/libraries/ruby_ncursesw_sup { };\n\n  shotcut = callPackage ../applications/video/shotcut { mlt = mlt-qt5; };\n\n  smplayer = callPackage ../applications/video/smplayer { };\n\n  sup = with rubyLibs; callPackage ../applications/networking/mailreaders/sup {\n    ruby = ruby19.override {\n      cursesSupport = true;\n    };\n\n    inherit gettext highline iconv locale lockfile\n      text trollop xapian_ruby which;\n\n    rmail_sup = \"\"; # missing\n    unicode = \"\";\n\n    # See https://github.com/NixOS/nixpkgs/issues/1804 and\n    # https://github.com/NixOS/nixpkgs/issues/2146\n    bundler = pkgs.lib.overrideDerivation pkgs.rubyLibs.bundler (\n      oldAttrs: {\n        dontPatchShebangs = 1;\n      }\n    );\n    chronic      = chronic;\n    gpgme        = ruby_gpgme;\n    mime_types   = mime_types;\n    ncursesw_sup = ruby_ncursesw_sup;\n    rake         = rake;\n  };\n\n  synfigstudio = callPackage ../applications/graphics/synfigstudio {\n    fontsConf = makeFontsConf { fontDirectories = [ freefont_ttf ]; };\n  };\n\n  sxhkd = callPackage ../applications/window-managers/sxhkd { };\n\n  msmtp = callPackage ../applications/networking/msmtp { };\n\n  imapfilter = callPackage ../applications/networking/mailreaders/imapfilter.nix {\n    lua = lua5;\n };\n\n  mupdf = callPackage ../applications/misc/mupdf { };\n\n  mypaint = callPackage ../applications/graphics/mypaint { };\n\n  mythtv = callPackage ../applications/video/mythtv { };\n\n  tvtime = callPackage ../applications/video/tvtime {\n    kernel = linux;\n  };\n\n  nano = callPackage ../applications/editors/nano { };\n\n  navipowm = callPackage ../applications/misc/navipowm { };\n\n  navit = callPackage ../applications/misc/navit { };\n\n  netbeans = callPackage ../applications/editors/netbeans { };\n\n  ncdu = callPackage ../tools/misc/ncdu { };\n\n  ncdc = callPackage ../applications/networking/p2p/ncdc { };\n\n  nedit = callPackage ../applications/editors/nedit {\n    motif = lesstif;\n  };\n\n  netsurfBrowser = netsurf.browser;\n  netsurf = recurseIntoAttrs (import ../applications/networking/browsers/netsurf { inherit pkgs; });\n\n  notmuch = callPackage ../applications/networking/mailreaders/notmuch {\n    # use emacsPackages.notmuch if you want emacs support\n    emacs = null;\n  };\n\n  nova = callPackage ../applications/virtualization/nova { };\n\n  novaclient = callPackage ../applications/virtualization/nova/client.nix { };\n\n  nspluginwrapper = callPackage ../applications/networking/browsers/mozilla-plugins/nspluginwrapper {};\n\n  nvi = callPackage ../applications/editors/nvi { };\n\n  nvpy = callPackage ../applications/editors/nvpy { };\n\n  obconf = callPackage ../tools/X11/obconf {\n    inherit (gnome) libglade;\n  };\n\n  ocrad = callPackage ../applications/graphics/ocrad { };\n\n  offrss = callPackage ../applications/networking/offrss { };\n\n  ogmtools = callPackage ../applications/video/ogmtools { };\n\n  omxplayer = callPackage ../applications/video/omxplayer { };\n\n  oneteam = callPackage ../applications/networking/instant-messengers/oneteam {};\n\n  openbox = callPackage ../applications/window-managers/openbox { };\n\n  openimageio = callPackage ../applications/graphics/openimageio { };\n\n  openjump = callPackage ../applications/misc/openjump { };\n\n  openscad = callPackage ../applications/graphics/openscad {};\n\n  opera = callPackage ../applications/networking/browsers/opera {\n    inherit (pkgs.kde4) kdelibs;\n  };\n\n  opusfile = callPackage ../applications/audio/opusfile { };\n\n  opusTools = callPackage ../applications/audio/opus-tools { };\n\n  pamixer = callPackage ../applications/audio/pamixer { };\n\n  pan = callPackage ../applications/networking/newsreaders/pan {\n    spellChecking = false;\n  };\n\n  panotools = callPackage ../applications/graphics/panotools { };\n\n  pavucontrol = callPackage ../applications/audio/pavucontrol { };\n\n  paraview = callPackage ../applications/graphics/paraview { };\n\n  pencil = callPackage ../applications/graphics/pencil { };\n\n  petrifoo = callPackage ../applications/audio/petrifoo {\n    inherit (gnome) libgnomecanvas;\n  };\n\n  pdftk = callPackage ../tools/typesetting/pdftk { };\n  pdfgrep  = callPackage ../tools/typesetting/pdfgrep { };\n\n  pianobar = callPackage ../applications/audio/pianobar { };\n\n  pianobooster = callPackage ../applications/audio/pianobooster { };\n\n  picard = callPackage ../applications/audio/picard { };\n\n  picocom = callPackage ../tools/misc/picocom { };\n\n  pidgin = callPackage ../applications/networking/instant-messengers/pidgin {\n    openssl = if config.pidgin.openssl or true then openssl else null;\n    gnutls = if config.pidgin.gnutls or false then gnutls else null;\n    libgcrypt = if config.pidgin.gnutls or false then libgcrypt else null;\n    startupnotification = libstartup_notification;\n  };\n\n  pidginlatex = callPackage ../applications/networking/instant-messengers/pidgin-plugins/pidgin-latex {\n    imagemagick = imagemagickBig;\n  };\n\n  pidginlatexSF = builderDefsPackage\n    (import ../applications/networking/instant-messengers/pidgin-plugins/pidgin-latex/pidgin-latex-sf.nix)\n    {\n      inherit pkgconfig pidgin texLive imagemagick which glib gtk;\n    };\n\n  pidginmsnpecan = callPackage ../applications/networking/instant-messengers/pidgin-plugins/msn-pecan { };\n\n  pidginotr = callPackage ../applications/networking/instant-messengers/pidgin-plugins/otr { };\n\n  pidginsipe = callPackage ../applications/networking/instant-messengers/pidgin-plugins/sipe { };\n\n  toxprpl = callPackage ../applications/networking/instant-messengers/pidgin-plugins/tox-prpl { };\n\n  pinfo = callPackage ../applications/misc/pinfo { };\n\n  pinta = callPackage ../applications/graphics/pinta {\n    gtksharp = gtksharp2;\n  };\n\n  pommed = callPackage ../os-specific/linux/pommed {\n    inherit (xorg) libXpm;\n  };\n\n  potrace = callPackage ../applications/graphics/potrace {};\n\n  posterazor = callPackage ../applications/misc/posterazor { };\n\n  pqiv = callPackage ../applications/graphics/pqiv { };\n\n  qiv = callPackage ../applications/graphics/qiv { };\n\n  # perhaps there are better apps for this task? It's how I had configured my preivous system.\n  # And I don't want to rewrite all rules\n  procmail = callPackage ../applications/misc/procmail { };\n\n  pstree = callPackage ../applications/misc/pstree { };\n\n  pulseview = callPackage ../applications/science/electronics/pulseview { };\n\n  puredata = callPackage ../applications/audio/puredata { };\n\n  pythonmagick = callPackage ../applications/graphics/PythonMagick { };\n\n  qbittorrent = callPackage ../applications/networking/p2p/qbittorrent { };\n\n  eiskaltdcpp = callPackage ../applications/networking/p2p/eiskaltdcpp { };\n\n  qemu = callPackage ../applications/virtualization/qemu { };\n\n  qmmp = callPackage ../applications/audio/qmmp { };\n\n  qsampler = callPackage ../applications/audio/qsampler { };\n\n  qsynth = callPackage ../applications/audio/qsynth { };\n\n  qtpfsgui = callPackage ../applications/graphics/qtpfsgui { };\n\n  qtractor = callPackage ../applications/audio/qtractor { };\n\n  quodlibet = callPackage ../applications/audio/quodlibet {\n    inherit (pythonPackages) mutagen;\n  };\n\n  quodlibet-with-gst-plugins = callPackage ../applications/audio/quodlibet {\n    inherit (pythonPackages) mutagen;\n    withGstPlugins = true;\n    gst_plugins_bad = null;\n  };\n\n  rakarrack = callPackage ../applications/audio/rakarrack {\n    inherit (xorg) libXpm libXft;\n    fltk = fltk13;\n  };\n\n  rapcad = callPackage ../applications/graphics/rapcad {};\n\n  rapidsvn = callPackage ../applications/version-management/rapidsvn { };\n\n  ratpoison = callPackage ../applications/window-managers/ratpoison { };\n\n  rawtherapee = callPackage ../applications/graphics/rawtherapee {\n    fftw = fftwSinglePrec;\n  };\n\n  rcs = callPackage ../applications/version-management/rcs { };\n\n  rdesktop = callPackage ../applications/networking/remote/rdesktop { };\n\n  recode = callPackage ../tools/text/recode { };\n\n  retroshare = callPackage ../applications/networking/p2p/retroshare {\n    qt = qt4;\n  };\n\n  retroshare06 = lowPrio (callPackage ../applications/networking/p2p/retroshare/0.6.nix {\n    qt = qt4;\n  });\n\n  rsync = callPackage ../applications/networking/sync/rsync {\n    enableACLs = !(stdenv.isDarwin || stdenv.isSunOS || stdenv.isFreeBSD);\n    enableCopyDevicesPatch = (config.rsync.enableCopyDevicesPatch or false);\n  };\n\n  rtl-sdr = callPackage ../applications/misc/rtl-sdr { };\n\n  rubyripper = callPackage ../applications/audio/rubyripper {};\n\n  rxvt = callPackage ../applications/misc/rxvt { };\n\n  # = urxvt\n  rxvt_unicode = callPackage ../applications/misc/rxvt_unicode {\n    perlSupport = true;\n    gdkPixbufSupport = true;\n    unicode3Support = true;\n  };\n\n  sakura = callPackage ../applications/misc/sakura {\n    inherit (gnome) vte;\n  };\n\n  sbagen = callPackage ../applications/misc/sbagen { };\n\n  scite = callPackage ../applications/editors/scite { };\n\n  scribus = callPackage ../applications/office/scribus {\n    inherit (gnome) libart_lgpl;\n  };\n\n  seafile-client = callPackage ../applications/networking/seafile-client { };\n\n  seeks = callPackage ../tools/networking/p2p/seeks {\n    opencv = opencv_2_1;\n  };\n\n  seg3d = callPackage ../applications/graphics/seg3d {\n    wxGTK = wxGTK28.override { unicode = false; };\n  };\n\n  seq24 = callPackage ../applications/audio/seq24 { };\n\n  setbfree = callPackage ../applications/audio/setbfree { };\n\n  sflphone = callPackage ../applications/networking/instant-messengers/sflphone {\n    gtk = gtk3;\n  };\n\n  siproxd = callPackage ../applications/networking/siproxd { };\n\n  skype = callPackage_i686 ../applications/networking/instant-messengers/skype { };\n\n  skype4pidgin = callPackage ../applications/networking/instant-messengers/pidgin-plugins/skype4pidgin { };\n\n  skype_call_recorder = callPackage ../applications/networking/instant-messengers/skype-call-recorder { };\n\n  slrn = callPackage ../applications/networking/newsreaders/slrn { };\n\n  spideroak = callPackage ../applications/networking/spideroak { };\n\n  ssvnc = callPackage ../applications/networking/remote/ssvnc { };\n\n  st = callPackage ../applications/misc/st {\n    conf = config.st.conf or null;\n  };\n\n  linuxstopmotion = callPackage ../applications/video/linuxstopmotion { };\n\n  sweethome3d = recurseIntoAttrs (  (callPackage ../applications/misc/sweethome3d { })\n                                 // (callPackage ../applications/misc/sweethome3d/editors.nix {\n                                      sweethome3dApp = sweethome3d.application;\n                                    })\n                                 );\n\n  sxiv = callPackage ../applications/graphics/sxiv { };\n\n  bittorrentSync = callPackage ../applications/networking/bittorrentsync { };\n\n  dropbox = callPackage ../applications/networking/dropbox { };\n\n  dropbox-cli = callPackage ../applications/networking/dropbox-cli { };\n\n  lightdm = callPackage ../applications/display-managers/lightdm { };\n\n  lightdm_gtk_greeter = callPackage ../applications/display-managers/lightdm-gtk-greeter { };\n\n  # slic3r 0.9.10b says: \"Running Slic3r under Perl >= 5.16 is not supported nor recommended\"\n  slic3r = callPackage ../applications/misc/slic3r {\n    perlPackages = perl514Packages;\n    perl = perl514;\n  };\n\n  curaengine = callPackage ../applications/misc/curaengine { };\n\n  cura = callPackage ../applications/misc/cura { };\n\n  printrun = callPackage ../applications/misc/printrun { };\n\n  slim = callPackage ../applications/display-managers/slim {\n    libpng = libpng12;\n  };\n\n  smartdeblur = callPackage ../applications/graphics/smartdeblur { };\n\n  snd = callPackage ../applications/audio/snd { };\n\n  shntool = callPackage ../applications/audio/shntool { };\n\n  sonic_visualiser = callPackage ../applications/audio/sonic-visualiser {\n    inherit (pkgs.vamp) vampSDK;\n    inherit (pkgs.xlibs) libX11;\n    fftw = pkgs.fftwSinglePrec;\n  };\n\n  sox = callPackage ../applications/misc/audio/sox { };\n\n  soxr = callPackage ../applications/misc/audio/soxr { };\n\n  spotify = callPackage ../applications/audio/spotify {\n    inherit (gnome) GConf;\n    libpng = libpng12;\n  };\n\n  libspotify = callPackage ../development/libraries/libspotify {\n    apiKey = config.libspotify.apiKey or null;\n  };\n\n  stalonetray = callPackage ../applications/window-managers/stalonetray {};\n\n  stp = callPackage ../applications/science/logic/stp {};\n\n  stumpwm = lispPackages.stumpwm;\n\n  sublime = callPackage ../applications/editors/sublime { };\n\n  sublime3 = lowPrio (callPackage ../applications/editors/sublime3 { });\n\n  subversion = callPackage ../applications/version-management/subversion/default.nix {\n    bdbSupport = true;\n    httpServer = false;\n    httpSupport = true;\n    pythonBindings = false;\n    perlBindings = false;\n    javahlBindings = false;\n    saslSupport = false;\n    httpd = apacheHttpd;\n    sasl = cyrus_sasl;\n  };\n\n  subversionClient = appendToName \"client\" (subversion.override {\n    bdbSupport = false;\n    perlBindings = true;\n    pythonBindings = true;\n  });\n\n  surf = callPackage ../applications/misc/surf {\n    webkit = webkitgtk2;\n  };\n\n  svk = perlPackages.SVK;\n\n  swh_lv2 = callPackage ../applications/audio/swh-lv2 { };\n\n  sylpheed = callPackage ../applications/networking/mailreaders/sylpheed {\n    sslSupport = true;\n    gpgSupport = true;\n  };\n\n  symlinks = callPackage ../tools/system/symlinks { };\n\n  syncthing = callPackage ../applications/networking/syncthing { };\n\n  # linux only by now\n  synergy = callPackage ../applications/misc/synergy { };\n\n  tabbed = callPackage ../applications/window-managers/tabbed { };\n\n  tahoelafs = callPackage ../tools/networking/p2p/tahoe-lafs {\n    inherit (pythonPackages) twisted foolscap simplejson nevow zfec\n      pycryptopp sqlite3 darcsver setuptoolsTrial setuptoolsDarcs\n      numpy pyasn1 mock;\n  };\n\n  tailor = builderDefsPackage (import ../applications/version-management/tailor) {\n    inherit makeWrapper python;\n  };\n\n  tangogps = callPackage ../applications/misc/tangogps {\n    gconf = gnome.GConf;\n  };\n\n  teamspeak_client = callPackage ../applications/networking/instant-messengers/teamspeak/client.nix { };\n  teamspeak_server = callPackage ../applications/networking/instant-messengers/teamspeak/server.nix { };\n\n  taskjuggler = callPackage ../applications/misc/taskjuggler { };\n\n  taskwarrior = callPackage ../applications/misc/taskwarrior { };\n\n  taskserver = callPackage ../servers/misc/taskserver { };\n\n  telegram-cli = callPackage ../applications/networking/instant-messengers/telegram-cli/default.nix { };\n\n  telepathy_gabble = callPackage ../applications/networking/instant-messengers/telepathy/gabble { };\n\n  telepathy_haze = callPackage ../applications/networking/instant-messengers/telepathy/haze {};\n\n  telepathy_logger = callPackage ../applications/networking/instant-messengers/telepathy/logger {};\n\n  telepathy_mission_control = callPackage ../applications/networking/instant-messengers/telepathy/mission-control { };\n\n  telepathy_rakia = callPackage ../applications/networking/instant-messengers/telepathy/rakia { };\n\n  telepathy_salut = callPackage ../applications/networking/instant-messengers/telepathy/salut {};\n\n  terminator = callPackage ../applications/misc/terminator {\n    vte = gnome.vte.override { pythonSupport = true; };\n    inherit (pythonPackages) notify;\n  };\n\n  tesseract = callPackage ../applications/graphics/tesseract { };\n\n  thinkingRock = callPackage ../applications/misc/thinking-rock { };\n\n  thunderbird = callPackage ../applications/networking/mailreaders/thunderbird {\n    inherit (gnome) libIDL;\n    inherit (pythonPackages) pysqlite;\n    libpng = libpng_apng;\n  };\n\n  thunderbird-bin = callPackage ../applications/networking/mailreaders/thunderbird-bin {\n    gconf = pkgs.gnome.GConf;\n    inherit (pkgs.gnome) libgnome libgnomeui;\n    inherit (pkgs.xlibs) libX11 libXScrnSaver libXext\n      libXinerama libXrender libXt;\n  };\n\n  tig = gitAndTools.tig;\n\n  timidity = callPackage ../tools/misc/timidity { };\n\n  tint2 = callPackage ../applications/misc/tint2 { };\n\n  tkcvs = callPackage ../applications/version-management/tkcvs { };\n\n  tla = callPackage ../applications/version-management/arch { };\n\n  todo-txt-cli = callPackage ../applications/office/todo.txt-cli { };\n\n  torchat = callPackage ../applications/networking/instant-messengers/torchat {\n    wrapPython = pythonPackages.wrapPython;\n  };\n\n  toxic = callPackage ../applications/networking/instant-messengers/toxic { };\n\n  transcode = callPackage ../applications/audio/transcode { };\n\n  transmission = callPackage ../applications/networking/p2p/transmission { };\n  transmission_gtk = transmission.override { enableGTK3 = true; };\n\n  transmission_remote_gtk = callPackage ../applications/networking/p2p/transmission-remote-gtk {};\n\n  trayer = callPackage ../applications/window-managers/trayer { };\n\n  tree = callPackage ../tools/system/tree {};\n\n  tribler = callPackage ../applications/networking/p2p/tribler { };\n\n  twister = callPackage ../applications/networking/p2p/twister { };\n\n  twmn = callPackage ../applications/misc/twmn { };\n\n  twinkle = callPackage ../applications/networking/instant-messengers/twinkle { };\n\n  umurmur = callPackage ../applications/networking/umurmur { };\n\n  unison = callPackage ../applications/networking/sync/unison {\n    inherit (ocamlPackages) lablgtk;\n    enableX11 = config.unison.enableX11 or true;\n  };\n\n  uucp = callPackage ../tools/misc/uucp { };\n\n  uvccapture = callPackage ../applications/video/uvccapture { };\n\n  uwimap = callPackage ../tools/networking/uwimap { };\n\n  uzbl = callPackage ../applications/networking/browsers/uzbl {\n    webkit = webkitgtk2;\n  };\n\n  uTox = callPackage ../applications/networking/instant-messengers/utox { };\n\n  vanitygen = callPackage ../applications/misc/vanitygen { };\n\n  vbindiff = callPackage ../applications/editors/vbindiff { };\n\n  vcprompt = callPackage ../applications/version-management/vcprompt { };\n\n  vdpauinfo = callPackage ../tools/X11/vdpauinfo { };\n\n  veracity = callPackage ../applications/version-management/veracity {};\n\n  viewMtn = builderDefsPackage (import ../applications/version-management/viewmtn/0.10.nix)\n  {\n    inherit monotone cheetahTemplate highlight ctags\n      makeWrapper graphviz which python;\n    flup = pythonPackages.flup;\n  };\n\n  vim = callPackage ../applications/editors/vim { };\n\n  macvim = callPackage ../applications/editors/vim/macvim.nix { };\n\n  vimHugeX = vim_configurable;\n\n  vim_configurable = callPackage ../applications/editors/vim/configurable.nix {\n    inherit (pkgs) fetchurl fetchhg stdenv ncurses pkgconfig gettext\n      composableDerivation lib config glib gtk python perl tcl ruby;\n    inherit (pkgs.xlibs) libX11 libXext libSM libXpm libXt libXaw libXau libXmu\n      libICE;\n\n    features = \"huge\"; # one of  tiny, small, normal, big or huge\n    lua = pkgs.lua5;\n    gui = config.vim.gui or \"auto\";\n\n    # optional features by flags\n    flags = [ \"python\" \"X11\" ]; # only flag \"X11\" by now\n\n    # so that we can use gccApple if we're building on darwin\n    inherit stdenvAdapters gccApple;\n  };\n\n  vimNox = lowPrio (vim_configurable.override { source = \"vim-nox\"; });\n\n  qvim = lowPrio (callPackage ../applications/editors/vim/qvim.nix {\n    inherit (pkgs) fetchgit stdenv ncurses pkgconfig gettext\n      composableDerivation lib config python perl tcl ruby qt4;\n    inherit (pkgs.xlibs) libX11 libXext libSM libXpm libXt libXaw libXau libXmu\n      libICE;\n\n    inherit (pkgs) stdenvAdapters gccApple;\n\n    features = \"huge\"; # one of  tiny, small, normal, big or huge\n    lua = pkgs.lua5;\n    flags = [ \"python\" \"X11\" ]; # only flag \"X11\" by now\n  });\n\n  vimpc = callPackage ../applications/audio/vimpc { };\n\n  virtviewer = callPackage ../applications/virtualization/virt-viewer {\n    gtkvnc = gtkvnc.override { enableGTK3 = true; };\n    spice_gtk = spice_gtk.override { enableGTK3 = true; };\n  };\n  virtmanager = callPackage ../applications/virtualization/virt-manager {\n    inherit (gnome) gnome_python;\n    vte = gnome3.vte;\n    dconf = gnome3.dconf;\n    gtkvnc = gtkvnc.override { enableGTK3 = true; };\n    spice_gtk = spice_gtk.override { enableGTK3 = true; };\n  };\n\n  virtinst = callPackage ../applications/virtualization/virtinst {};\n\n  virtualgl = callPackage ../tools/X11/virtualgl { };\n\n  bumblebee = callPackage ../tools/X11/bumblebee { };\n\n  vkeybd = callPackage ../applications/audio/vkeybd {\n    inherit (xlibs) libX11;\n  };\n\n  vlc = callPackage ../applications/video/vlc { };\n\n  vmpk = callPackage ../applications/audio/vmpk { };\n\n  vnstat = callPackage ../applications/networking/vnstat { };\n\n  vorbisTools = callPackage ../applications/audio/vorbis-tools { };\n\n  vue = callPackage ../applications/misc/vue {\n    jre = icedtea7_jre;\n  };\n\n  vwm = callPackage ../applications/window-managers/vwm { };\n\n  vym = callPackage ../applications/misc/vym { };\n\n  w3m = callPackage ../applications/networking/browsers/w3m {\n    graphicsSupport = false;\n  };\n\n  weechat = callPackage ../applications/networking/irc/weechat { };\n\n  weechatDevel = lowPrio (callPackage ../applications/networking/irc/weechat/devel.nix { });\n\n  weston = callPackage ../applications/window-managers/weston { };\n\n  windowmaker = callPackage ../applications/window-managers/windowmaker { };\n\n  winswitch = callPackage ../tools/X11/winswitch { };\n\n  wings = callPackage ../applications/graphics/wings {\n    erlang = erlangR14;\n    esdl = esdl.override { erlang = erlangR14; };\n  };\n\n  wmname = callPackage ../applications/misc/wmname { };\n\n  wmctrl = callPackage ../tools/X11/wmctrl { };\n\n  # I'm keen on wmiimenu only  >wmii-3.5 no longer has it...\n  wmiimenu = import ../applications/window-managers/wmii31 {\n    libixp = libixp_for_wmii;\n    inherit fetchurl /* fetchhg */ stdenv gawk;\n    inherit (xlibs) libX11;\n  };\n\n  wmiiSnap = import ../applications/window-managers/wmii {\n    libixp = libixp_for_wmii;\n    inherit fetchurl /* fetchhg */ stdenv gawk;\n    inherit (xlibs) libX11 xextproto libXt libXext;\n    includeUnpack = config.stdenv.includeUnpack or false;\n  };\n\n  wordnet = callPackage ../applications/misc/wordnet { };\n\n  wrapChromium = browser: wrapFirefox {\n    inherit browser;\n    browserName = browser.packageName;\n    desktopName = \"Chromium\";\n    icon = \"${browser}/share/icons/hicolor/48x48/apps/${browser.packageName}.png\";\n  };\n\n  wrapFirefox =\n    { browser, browserName ? \"firefox\", desktopName ? \"Firefox\", nameSuffix ? \"\"\n    , icon ? \"${browser}/lib/${browser.name}/browser/icons/mozicon128.png\" }:\n    let\n      cfg = stdenv.lib.attrByPath [ browserName ] {} config;\n      enableAdobeFlash = cfg.enableAdobeFlash or false;\n      enableGnash = cfg.enableGnash or false;\n    in\n    import ../applications/networking/browsers/firefox/wrapper.nix {\n      inherit stdenv lib makeWrapper makeDesktopItem browser browserName desktopName nameSuffix icon;\n      plugins =\n         assert !(enableGnash && enableAdobeFlash);\n         ([ ]\n          ++ lib.optional enableGnash gnash\n          ++ lib.optional enableAdobeFlash flashplayer\n          ++ lib.optional (cfg.enableDjvu or false) (djview4)\n          ++ lib.optional (cfg.enableMPlayer or false) (MPlayerPlugin browser)\n          ++ lib.optional (cfg.enableGeckoMediaPlayer or false) gecko_mediaplayer\n          ++ lib.optional (supportsJDK && cfg.jre or false && jrePlugin ? mozillaPlugin) jrePlugin\n          ++ lib.optional (cfg.enableGoogleTalkPlugin or false) google_talk_plugin\n          ++ lib.optional (cfg.enableFriBIDPlugin or false) fribid\n          ++ lib.optional (cfg.enableGnomeExtensions or false) gnome3.gnome_shell\n         );\n      libs = [ gstreamer gst_plugins_base ] ++ lib.optionals (cfg.enableQuakeLive or false)\n             (with xlibs; [ stdenv.gcc libX11 libXxf86dga libXxf86vm libXext libXt alsaLib zlib ]);\n      gtk_modules = [ libcanberra ];\n    };\n\n  x11vnc = callPackage ../tools/X11/x11vnc { };\n\n  x2vnc = callPackage ../tools/X11/x2vnc { };\n\n  xaos = builderDefsPackage (import ../applications/graphics/xaos) {\n    inherit (xlibs) libXt libX11 libXext xextproto xproto;\n    inherit gsl aalib zlib intltool gettext perl;\n    libpng = libpng12;\n  };\n\n  xara = callPackage ../applications/graphics/xara { };\n\n  xawtv = callPackage ../applications/video/xawtv { };\n\n  xbindkeys = callPackage ../tools/X11/xbindkeys { };\n\n  xbmc = callPackage ../applications/video/xbmc {\n    ffmpeg = ffmpeg_1;\n  };\n\n  xca = callPackage ../applications/misc/xca { };\n\n  xcalib = callPackage ../tools/X11/xcalib { };\n\n  xcape = callPackage ../tools/X11/xcape { };\n\n  xchainkeys = callPackage ../tools/X11/xchainkeys { };\n\n  xchat = callPackage ../applications/networking/irc/xchat { };\n\n  xchm = callPackage ../applications/misc/xchm { };\n\n  xcompmgr = callPackage ../applications/window-managers/xcompmgr { };\n\n  compton = callPackage ../applications/window-managers/compton { };\n\n  xdaliclock = callPackage ../tools/misc/xdaliclock {};\n\n  xdg-user-dirs = callPackage ../tools/X11/xdg-user-dirs { };\n\n  xdg_utils = callPackage ../tools/X11/xdg-utils { };\n\n  xdotool = callPackage ../tools/X11/xdotool { };\n\n  xen = callPackage ../applications/virtualization/xen {\n    stdenv = overrideGCC stdenv gcc45;\n  };\n\n  xfe = callPackage ../applications/misc/xfe {\n    fox = fox_1_6;\n  };\n\n  xfig = callPackage ../applications/graphics/xfig { };\n\n  xineUI = callPackage ../applications/video/xine-ui { };\n\n  xneur_0_13 = callPackage ../applications/misc/xneur { };\n\n  xneur_0_8 = callPackage ../applications/misc/xneur/0.8.nix { };\n\n  xneur = xneur_0_13;\n\n  gxneur = callPackage ../applications/misc/gxneur  {\n    inherit (gnome) libglade GConf;\n  };\n\n  xournal = callPackage ../applications/graphics/xournal {\n    inherit (gnome) libgnomeprint libgnomeprintui libgnomecanvas;\n  };\n\n  xpdf = callPackage ../applications/misc/xpdf {\n    motif = lesstif;\n    base14Fonts = \"${ghostscript}/share/ghostscript/fonts\";\n  };\n\n  xkb_switch = callPackage ../tools/X11/xkb-switch { };\n\n  libxpdf = callPackage ../applications/misc/xpdf/libxpdf.nix { };\n\n  xpra = callPackage ../tools/X11/xpra { };\n\n  xrestop = callPackage ../tools/X11/xrestop { };\n\n  xscreensaver = callPackage ../misc/screensavers/xscreensaver {\n    inherit (gnome) libglade;\n  };\n\n  xsynth_dssi = callPackage ../applications/audio/xsynth-dssi { };\n\n  xterm = callPackage ../applications/misc/xterm { };\n\n  finalterm = callPackage ../applications/misc/finalterm { };\n\n  xtrace = callPackage ../tools/X11/xtrace { };\n\n  xlaunch = callPackage ../tools/X11/xlaunch { };\n\n  xmacro = callPackage ../tools/X11/xmacro { };\n\n  xmove = callPackage ../applications/misc/xmove { };\n\n  xmp = callPackage ../applications/audio/xmp { };\n\n  xnee = callPackage ../tools/X11/xnee {\n    # Work around \"missing separator\" error.\n    stdenv = overrideInStdenv stdenv [ gnumake381 ];\n  };\n\n  xvidcap = callPackage ../applications/video/xvidcap {\n    inherit (gnome) scrollkeeper libglade;\n  };\n\n  yate = callPackage ../applications/misc/yate { };\n\n  inherit (gnome3) yelp;\n\n  qgis = callPackage ../applications/misc/qgis {};\n\n  qtbitcointrader = callPackage ../applications/misc/qtbitcointrader { };\n\n  ykpers = callPackage ../applications/misc/ykpers {};\n\n  yoshimi = callPackage ../applications/audio/yoshimi {\n    fltk = fltk13;\n  };\n\n  zathuraCollection = recurseIntoAttrs\n    (let callPackage = newScope pkgs.zathuraCollection; in\n      import ../applications/misc/zathura {\n        inherit callPackage pkgs fetchurl;\n        useMupdf = config.zathura.useMupdf or false;\n      });\n\n  zathura = zathuraCollection.zathuraWrapper;\n\n  zed = callPackage ../applications/editors/zed { };\n\n  zeroc_ice = callPackage ../development/libraries/zeroc-ice { };\n\n  girara = callPackage ../applications/misc/girara {\n    gtk = gtk3;\n  };\n\n  zgrviewer = callPackage ../applications/graphics/zgrviewer {};\n\n  zotero = callPackage ../applications/office/zotero {\n    xulrunner = xulrunner_30;\n  };\n\n  zynaddsubfx = callPackage ../applications/audio/zynaddsubfx { };\n\n\n  ### GAMES\n\n  alienarena = callPackage ../games/alienarena { };\n\n  andyetitmoves = if stdenv.isLinux then callPackage ../games/andyetitmoves {} else null;\n\n  anki = callPackage ../games/anki { };\n\n  asc = callPackage ../games/asc {\n    lua = lua5;\n    libsigcxx = libsigcxx12;\n  };\n\n  astromenace = callPackage ../games/astromenace { };\n\n  atanks = callPackage ../games/atanks {};\n\n  ballAndPaddle = callPackage ../games/ball-and-paddle {\n    guile = guile_1_8;\n  };\n\n  bitsnbots = callPackage ../games/bitsnbots {\n    lua = lua5;\n  };\n\n  blackshades = callPackage ../games/blackshades { };\n\n  blackshadeselite = callPackage ../games/blackshadeselite { };\n\n  blobby = callPackage ../games/blobby { };\n\n  bsdgames = callPackage ../games/bsdgames { };\n\n  btanks = callPackage ../games/btanks { };\n\n  bzflag = callPackage ../games/bzflag { };\n\n  castle_combat = callPackage ../games/castle-combat { };\n\n  chessdb = callPackage ../games/chessdb { };\n\n  construoBase = lowPrio (callPackage ../games/construo {\n    mesa = null;\n    freeglut = null;\n  });\n\n  construo = construoBase.override {\n    inherit mesa freeglut;\n  };\n\n  crack_attack = callPackage ../games/crack-attack { };\n\n  crafty = callPackage ../games/crafty { };\n  craftyFull = appendToName \"full\" (crafty.override { fullVariant = true; });\n\n  crrcsim = callPackage ../games/crrcsim {};\n\n  dhewm3 = callPackage ../games/dhewm3 {};\n\n  drumkv1 = callPackage ../applications/audio/drumkv1 { };\n\n  dwarf_fortress = callPackage_i686 ../games/dwarf-fortress {\n    SDL_image = pkgsi686Linux.SDL_image.override {\n      libpng = pkgsi686Linux.libpng12;\n    };\n  };\n\n  dwarf_fortress_2014 = callPackage_i686 ../games/dwarf-fortress/df2014.nix {\n    SDL_image = pkgsi686Linux.SDL_image.override {\n      libpng = pkgsi686Linux.libpng12;\n    };\n  };\n\n  dwarf_fortress_modable = appendToName \"moddable\" (dwarf_fortress.override {\n    copyDataDirectory = true;\n  });\n\n  dwarf_fortress_2014_modable = appendToName \"moddable\" (dwarf_fortress_2014.override {\n    copyDataDirectory = true;\n  });\n\n  dwarf-therapist = callPackage ../games/dwarf-therapist { };\n\n  d1x_rebirth = callPackage ../games/d1x-rebirth { };\n\n  d2x_rebirth = callPackage ../games/d2x-rebirth { };\n\n  eboard = callPackage ../games/eboard { };\n\n  eduke32 = callPackage ../games/eduke32 { };\n\n  egoboo = callPackage ../games/egoboo { };\n\n  exult = callPackage ../games/exult { };\n\n  flightgear = callPackage ../games/flightgear { };\n\n  freeciv = callPackage ../games/freeciv { };\n\n  freeciv_gtk = callPackage ../games/freeciv {\n    gtkClient = true;\n    sdlClient = false;\n  };\n\n  freedink = callPackage ../games/freedink { };\n\n  fsg = callPackage ../games/fsg {\n    wxGTK = wxGTK28.override { unicode = false; };\n  };\n\n  gemrb = callPackage ../games/gemrb { };\n\n  gl117 = callPackage ../games/gl-117 {};\n\n  glestae = callPackage ../games/glestae {};\n\n  globulation2 = callPackage ../games/globulation {};\n\n  gltron = callPackage ../games/gltron { };\n\n  gnuchess = callPackage ../games/gnuchess { };\n\n  gnugo = callPackage ../games/gnugo { };\n\n  gparted = callPackage ../tools/misc/gparted { };\n\n  gsmartcontrol = callPackage ../tools/misc/gsmartcontrol {\n    inherit (gnome) libglademm;\n  };\n\n  gtypist = callPackage ../games/gtypist { };\n\n  hexen = callPackage ../games/hexen { };\n\n  icbm3d = callPackage ../games/icbm3d { };\n\n  ingen = callPackage ../applications/audio/ingen { };\n\n  instead = callPackage ../games/instead {\n    lua = lua5;\n  };\n\n  kobodeluxe = callPackage ../games/kobodeluxe { };\n\n  lincity = builderDefsPackage (import ../games/lincity) {\n    inherit (xlibs) libX11 libXext xextproto\n      libICE libSM xproto;\n    inherit libpng zlib;\n  };\n\n  lincity_ng = callPackage ../games/lincity/ng.nix {};\n\n  mars = callPackage ../games/mars { };\n\n  micropolis = callPackage ../games/micropolis { };\n\n  mnemosyne = callPackage ../games/mnemosyne {\n    inherit (pythonPackages) matplotlib cherrypy sqlite3;\n  };\n\n  naev = callPackage ../games/naev { };\n\n  nexuiz = callPackage ../games/nexuiz { };\n\n  njam = callPackage ../games/njam { };\n\n  oilrush = callPackage ../games/oilrush { };\n\n  openra = callPackage ../games/openra { };\n\n  openttd = callPackage ../games/openttd {\n    zlib = zlibStatic;\n  };\n\n  opentyrian = callPackage ../games/opentyrian { };\n\n  openxcom = callPackage ../games/openxcom { };\n\n  pingus = callPackage ../games/pingus {};\n\n  pioneers = callPackage ../games/pioneers { };\n\n  pong3d = callPackage ../games/pong3d { };\n\n  prboom = callPackage ../games/prboom { };\n\n  quake3demo = callPackage ../games/quake3/wrapper {\n    name = \"quake3-demo-${quake3game.name}\";\n    description = \"Demo of Quake 3 Arena, a classic first-person shooter\";\n    game = quake3game;\n    paks = [quake3demodata];\n  };\n\n  quake3demodata = callPackage ../games/quake3/demo { };\n\n  quake3game = callPackage ../games/quake3/game { };\n\n  quantumminigolf = callPackage ../games/quantumminigolf {};\n\n  racer = callPackage ../games/racer { };\n\n  residualvm = callPackage ../games/residualvm {\n    openglSupport = mesaSupported;\n  };\n\n  rigsofrods = callPackage ../games/rigsofrods {\n    mygui = myguiSvn;\n  };\n\n  rili = callPackage ../games/rili { };\n\n  rogue = callPackage ../games/rogue { };\n\n  samplv1 = callPackage ../applications/audio/samplv1 { };\n\n  sauerbraten = callPackage ../games/sauerbraten {};\n\n  scid = callPackage ../games/scid { };\n\n  scummvm = callPackage ../games/scummvm { };\n\n  scorched3d = callPackage ../games/scorched3d { };\n\n  sdlmame = callPackage ../games/sdlmame { };\n\n  sgtpuzzles = builderDefsPackage (import ../games/sgt-puzzles) {\n    inherit pkgconfig fetchsvn perl gtk;\n    inherit (xlibs) libX11;\n  };\n\n  simutrans = callPackage ../games/simutrans { };\n\n  soi = callPackage ../games/soi {};\n\n  # You still can override by passing more arguments.\n  spaceOrbit = callPackage ../games/orbit { };\n\n  spring = callPackage ../games/spring { };\n\n  springLobby = callPackage ../games/spring/springlobby.nix { };\n\n  stardust = callPackage ../games/stardust {};\n\n  steam = callPackage_i686 ../games/steam {};\n\n  steamChrootEnv = callPackage_i686 ../games/steam/chrootenv.nix {\n    zenity = gnome2.zenity;\n  };\n\n  stuntrally = callPackage ../games/stuntrally { };\n\n  superTux = callPackage ../games/super-tux { };\n\n  superTuxKart = callPackage ../games/super-tux-kart { };\n\n  synthv1 = callPackage ../applications/audio/synthv1 { };\n\n  tbe = callPackage ../games/the-butterfly-effect {};\n\n  teetertorture = callPackage ../games/teetertorture { };\n\n  teeworlds = callPackage ../games/teeworlds { };\n\n  tennix = callPackage ../games/tennix { };\n\n  tibia = callPackage ../games/tibia { };\n\n  tintin = callPackage ../games/tintin { };\n\n  tpm = callPackage ../games/thePenguinMachine { };\n\n  tremulous = callPackage ../games/tremulous { };\n\n  speed_dreams = callPackage ../games/speed-dreams {\n    # Torcs wants to make shared libraries linked with plib libraries (it provides static).\n    # i686 is the only platform I know than can do that linking without plib built with -fPIC\n    plib = plib.override { enablePIC = !stdenv.isi686; };\n    libpng = libpng12;\n  };\n\n  torcs = callPackage ../games/torcs {\n    # Torcs wants to make shared libraries linked with plib libraries (it provides static).\n    # i686 is the only platform I know than can do that linking without plib built with -fPIC\n    plib = plib.override { enablePIC = !stdenv.isi686; };\n  };\n\n  trigger = callPackage ../games/trigger { };\n\n  typespeed = callPackage ../games/typespeed { };\n\n  ufoai = callPackage ../games/ufoai { };\n\n  ultimatestunts = callPackage ../games/ultimatestunts { };\n\n  ultrastardx = callPackage ../games/ultrastardx {\n    ffmpeg = ffmpeg_0_6;\n    lua = lua5;\n  };\n\n  unvanquished = callPackage ../games/unvanquished { };\n\n  uqm = callPackage ../games/uqm { };\n\n  urbanterror = callPackage ../games/urbanterror { };\n\n  ut2004demo = callPackage ../games/ut2004demo { };\n\n  vdrift = callPackage ../games/vdrift { };\n\n  vectoroids = callPackage ../games/vectoroids { };\n\n  vessel = callPackage_i686 ../games/vessel { };\n\n  warmux = callPackage ../games/warmux { };\n\n  warsow = callPackage ../games/warsow {\n    libjpeg = libjpeg62;\n  };\n\n  warzone2100 = callPackage ../games/warzone2100 { };\n\n  widelands = callPackage ../games/widelands {\n    lua = lua5_1;\n  };\n\n  worldofgoo_demo = callPackage ../games/worldofgoo {\n    demo = true;\n  };\n\n  worldofgoo = callPackage ../games/worldofgoo { };\n\n  xboard =  callPackage ../games/xboard { };\n\n  xconq = callPackage ../games/xconq {};\n\n  # TODO: the corresponding nix file is missing\n  # xracer = callPackage ../games/xracer { };\n\n  xonotic = callPackage ../games/xonotic { };\n\n  xskat = callPackage ../games/xskat { };\n\n  xsokoban = builderDefsPackage (import ../games/xsokoban) {\n    inherit (xlibs) libX11 xproto libXpm libXt;\n  };\n\n  zdoom = callPackage ../games/zdoom { };\n\n  zod = callPackage ../games/zod { };\n\n  zoom = callPackage ../games/zoom { };\n\n  keen4 = callPackage ../games/keen4 { };\n\n  zeroad = callPackage ../games/0ad { };\n\n  ### DESKTOP ENVIRONMENTS\n\n  cinnamon = recurseIntoAttrs rec {\n    callPackage = newScope pkgs.cinnamon;\n    inherit (gnome3) gnome_common libgnomekbd gnome-menus zenity;\n\n    muffin = callPackage ../desktops/cinnamon/muffin.nix { } ;\n\n    cinnamon-control-center = callPackage ../desktops/cinnamon/cinnamon-control-center.nix{ };\n\n    cinnamon-settings-daemon = callPackage ../desktops/cinnamon/cinnamon-settings-daemon.nix{ };\n\n    cinnamon-session = callPackage ../desktops/cinnamon/cinnamon-session.nix{ } ;\n\n    cinnamon-desktop = callPackage ../desktops/cinnamon/cinnamon-desktop.nix { };\n\n    cinnamon-translations = callPackage ../desktops/cinnamon/cinnamon-translations.nix { };\n\n    cjs = callPackage ../desktops/cinnamon/cjs.nix { };\n  };\n\n  enlightenment = callPackage ../desktops/enlightenment { };\n\n  e17 = recurseIntoAttrs (\n    let callPackage = newScope pkgs.e17; in\n    import ../desktops/e17 { inherit callPackage pkgs; }\n  );\n\n  e18 = recurseIntoAttrs (\n    let callPackage = newScope pkgs.e18; in\n    import ../desktops/e18 { inherit callPackage pkgs; }\n  );\n\n  gnome2 = callPackage ../desktops/gnome-2 {\n    callPackage = pkgs.newScope pkgs.gnome2;\n    self = pkgs.gnome2;\n  }  // pkgs.gtkLibs // {\n    # Backwards compatibility;\n    inherit (pkgs) libsoup libwnck gtk_doc gnome_doc_utils;\n  };\n\n  gnome3 = recurseIntoAttrs (callPackage ../desktops/gnome-3/3.10 {\n    callPackage = pkgs.newScope pkgs.gnome3;\n    self = pkgs.gnome3;\n  });\n\n  gnome3_12 = recurseIntoAttrs (callPackage ../desktops/gnome-3/3.12 {\n    callPackage = pkgs.newScope pkgs.gnome3_12;\n  });\n\n  gnome = recurseIntoAttrs gnome2;\n\n  hsetroot = callPackage ../tools/X11/hsetroot { };\n\n  kakasi = callPackage ../tools/text/kakasi { };\n\n  kde4 = recurseIntoAttrs pkgs.kde412;\n\n  kde4_next = recurseIntoAttrs( lib.lowPrioSet pkgs.kde412 );\n\n  kde412 = kdePackagesFor (pkgs.kde412 // {\n      eigen = eigen2;\n      libusb = libusb1;\n      libcanberra = libcanberra_kde;\n    }) ../desktops/kde-4.12;\n\n  kdePackagesFor = self: dir:\n    let callPackageOrig = callPackage; in\n    let\n      callPackage = newScope self;\n      kde4 = callPackageOrig dir {\n        inherit callPackage callPackageOrig;\n      };\n    in kde4 // {\n      inherit kde4;\n\n      wrapper = callPackage ../build-support/kdewrapper {};\n\n      recurseForRelease = true;\n\n      akunambol = callPackage ../applications/networking/sync/akunambol { };\n\n      amarok = callPackage ../applications/audio/amarok { };\n\n      bangarang = callPackage ../applications/video/bangarang { };\n\n      basket = callPackage ../applications/office/basket { };\n\n      bluedevil = callPackage ../tools/bluetooth/bluedevil { };\n\n      calligra = callPackage ../applications/office/calligra { };\n\n      colord-kde = callPackage ../tools/misc/colord-kde { };\n\n      digikam = if builtins.compareVersions \"4.9\" kde4.release == 1 then\n          callPackage ../applications/graphics/digikam/2.nix { }\n        else\n          callPackage ../applications/graphics/digikam { };\n\n      eventlist = callPackage ../applications/office/eventlist {};\n\n      k3b = callPackage ../applications/misc/k3b { };\n\n      kadu = callPackage ../applications/networking/instant-messengers/kadu { };\n\n      kbibtex = callPackage ../applications/office/kbibtex { };\n\n      kde_gtk_config = callPackage ../tools/misc/kde-gtk-config { };\n\n      kde_wacomtablet = callPackage ../applications/misc/kde-wacomtablet { };\n\n      kdeconnect = callPackage ../applications/misc/kdeconnect { };\n\n      kdenlive = callPackage ../applications/video/kdenlive { mlt = mlt-qt4; };\n\n      kdesvn = callPackage ../applications/version-management/kdesvn { };\n\n      kdevelop = callPackage ../applications/editors/kdevelop { };\n\n      kdevplatform = callPackage ../development/libraries/kdevplatform { };\n\n      kdiff3 = callPackage ../tools/text/kdiff3 { };\n\n      kile = callPackage ../applications/editors/kile { };\n\n      kmplayer = callPackage ../applications/video/kmplayer { };\n\n      kmymoney = callPackage ../applications/office/kmymoney { };\n\n      kipi_plugins = callPackage ../applications/graphics/kipi-plugins { };\n\n      konversation = callPackage ../applications/networking/irc/konversation { };\n\n      kvirc = callPackage ../applications/networking/irc/kvirc { };\n\n      krename = callPackage ../applications/misc/krename { };\n\n      krusader = callPackage ../applications/misc/krusader { };\n\n      ksshaskpass = callPackage ../tools/security/ksshaskpass {};\n\n      ktorrent = callPackage ../applications/networking/p2p/ktorrent { };\n\n      kuickshow = callPackage ../applications/graphics/kuickshow { };\n\n      libalkimia = callPackage ../development/libraries/libalkimia { };\n\n      libktorrent = callPackage ../development/libraries/libktorrent { };\n\n      libkvkontakte = callPackage ../development/libraries/libkvkontakte { };\n\n      liblikeback = callPackage ../development/libraries/liblikeback { };\n\n      libmm-qt = callPackage ../development/libraries/libmm-qt { };\n\n      libnm-qt = callPackage ../development/libraries/libnm-qt { };\n\n      networkmanagement = callPackage ../tools/networking/networkmanagement { };\n\n      partitionManager = callPackage ../tools/misc/partition-manager { };\n\n      plasma-nm = callPackage ../tools/networking/plasma-nm { };\n\n      polkit_kde_agent = callPackage ../tools/security/polkit-kde-agent { };\n\n      psi = callPackage ../applications/networking/instant-messengers/psi { };\n\n      qtcurve = callPackage ../misc/themes/qtcurve { };\n\n      quassel = callPackage ../applications/networking/irc/quassel { dconf = gnome3.dconf; };\n\n      quasselWithoutKDE = (self.quassel.override {\n        withKDE = false;\n        tag = \"-without-kde\";\n      });\n\n      quasselDaemon = (self.quassel.override {\n        monolithic = false;\n        daemon = true;\n        tag = \"-daemon\";\n      });\n\n      quasselClient = (self.quassel.override {\n        monolithic = false;\n        client = true;\n        tag = \"-client\";\n      });\n\n      quasselClientWithoutKDE = (self.quasselClient.override {\n        withKDE = false;\n        tag = \"-client-without-kde\";\n      });\n\n      rekonq = callPackage ../applications/networking/browsers/rekonq { };\n\n      kwebkitpart = callPackage ../applications/networking/browsers/kwebkitpart { };\n\n      rsibreak = callPackage ../applications/misc/rsibreak { };\n\n      semnotes = callPackage ../applications/misc/semnotes { };\n\n      skrooge = callPackage ../applications/office/skrooge { };\n\n      telepathy = callPackage ../applications/networking/instant-messengers/telepathy/kde {};\n\n      yakuake = callPackage ../applications/misc/yakuake { };\n\n      zanshin = callPackage ../applications/office/zanshin { };\n\n      kwooty = callPackage ../applications/networking/newsreaders/kwooty { };\n    };\n\n  redshift = callPackage ../applications/misc/redshift {\n    inherit (xorg) libX11 libXrandr libxcb randrproto libXxf86vm\n      xf86vidmodeproto;\n    inherit (gnome) GConf;\n    inherit (pythonPackages) pyxdg;\n    geoclue = geoclue2;\n  };\n\n  oxygen_gtk = callPackage ../misc/themes/gtk2/oxygen-gtk { };\n\n  gtk_engines = callPackage ../misc/themes/gtk2/gtk-engines { };\n\n  gtk-engine-murrine = callPackage ../misc/themes/gtk2/gtk-engine-murrine { };\n\n  gnome_themes_standard = gnome3.gnome_themes_standard;\n\n  mate-icon-theme = callPackage ../misc/themes/mate-icon-theme { };\n\n  mate-themes = callPackage ../misc/themes/mate-themes { };\n\n  xfce = xfce4_10;\n  xfce4_10 = recurseIntoAttrs (import ../desktops/xfce { inherit pkgs newScope; });\n\n\n  ### SCIENCE\n\n  ### SCIENCE/GEOMETRY\n\n  drgeo = builderDefsPackage (import ../applications/science/geometry/drgeo) {\n    inherit (gnome) libglade;\n    inherit libxml2 perl intltool libtool pkgconfig gtk;\n    guile = guile_1_8;\n  };\n\n  tetgen = callPackage ../applications/science/geometry/tetgen { };\n\n\n  ### SCIENCE/BIOLOGY\n\n  alliance = callPackage ../applications/science/electronics/alliance {\n    motif = lesstif;\n  };\n\n  arb = callPackage ../applications/science/biology/arb {\n    lesstif = lesstif93;\n  };\n\n  archimedes = callPackage ../applications/science/electronics/archimedes { };\n\n  biolib = callPackage ../development/libraries/science/biology/biolib { };\n\n  emboss = callPackage ../applications/science/biology/emboss { };\n\n  mrbayes = callPackage ../applications/science/biology/mrbayes { };\n\n  ncbiCTools = builderDefsPackage ../development/libraries/ncbi {\n    inherit tcsh mesa lesstif;\n    inherit (xlibs) libX11 libXaw xproto libXt libSM libICE\n      libXmu libXext;\n  };\n\n  ncbi_tools = callPackage ../applications/science/biology/ncbi-tools { };\n\n  paml = callPackage ../applications/science/biology/paml { };\n\n  pal2nal = callPackage ../applications/science/biology/pal2nal { };\n\n  plink = callPackage ../applications/science/biology/plink/default.nix { };\n\n\n  ### SCIENCE/MATH\n\n  arpack = callPackage ../development/libraries/science/math/arpack { };\n\n  atlas = callPackage ../development/libraries/science/math/atlas {\n    # The build process measures CPU capabilities and optimizes the\n    # library to perform best on that particular machine. That is a\n    # great feature, but it's of limited use with pre-built binaries\n    # coming from a central build farm.\n    tolerateCpuTimingInaccuracy = true;\n  };\n\n  blas = callPackage ../development/libraries/science/math/blas { };\n\n  content = builderDefsPackage ../applications/science/math/content {\n    inherit mesa lesstif;\n    inherit (xlibs) libX11 libXaw xproto libXt libSM libICE\n      libXmu libXext libXcursor;\n  };\n\n  jags = callPackage ../applications/science/math/jags { };\n\n  liblapack = callPackage ../development/libraries/science/math/liblapack { };\n  liblapack_3_5_0 = callPackage ../development/libraries/science/math/liblapack/3.5.0.nix { };\n\n  liblbfgs = callPackage ../development/libraries/science/math/liblbfgs { };\n\n  openblas = callPackage ../development/libraries/science/math/openblas { };\n  openblas_0_2_10 = callPackage ../development/libraries/science/math/openblas/0.2.10.nix { \n    liblapack = liblapack_3_5_0;\n  };\n\n  mathematica = callPackage ../applications/science/math/mathematica { };\n\n  sage = callPackage ../applications/science/math/sage { };\n\n  ### SCIENCE/MOLECULAR-DYNAMICS\n\n  gromacs = callPackage ../applications/science/molecular-dynamics/gromacs {\n    singlePrec = true;\n    fftw = fftwSinglePrec;\n    cmake = cmakeCurses;\n  };\n\n  gromacsDouble = lowPrio (callPackage ../applications/science/molecular-dynamics/gromacs {\n    singlePrec = false;\n    fftw = fftw;\n    cmake = cmakeCurses;\n  });\n\n\n  ### SCIENCE/LOGIC\n\n  abc-verifier = callPackage ../applications/science/logic/abc {};\n\n  alt-ergo = callPackage ../applications/science/logic/alt-ergo {};\n\n  coq = callPackage ../applications/science/logic/coq {\n    inherit (ocamlPackages) findlib lablgtk;\n    camlp5 = ocamlPackages.camlp5_transitional;\n  };\n\n  coq_HEAD = callPackage ../applications/science/logic/coq/HEAD.nix {\n    inherit (ocamlPackages) findlib lablgtk;\n    camlp5 = ocamlPackages.camlp5_transitional;\n  };\n\n  coq_8_3 = callPackage ../applications/science/logic/coq/8.3.nix {\n    inherit (ocamlPackages) findlib lablgtk;\n    camlp5 = ocamlPackages.camlp5_transitional;\n  };\n\n  cvc3 = callPackage ../applications/science/logic/cvc3 {};\n\n  ekrhyper = callPackage ../applications/science/logic/ekrhyper {};\n\n  eprover = callPackage ../applications/science/logic/eprover {\n    texLive = texLiveAggregationFun {\n      paths = [\n        texLive texLiveExtra\n      ];\n    };\n  };\n\n  ginac = callPackage ../applications/science/math/ginac { };\n\n  hol = callPackage ../applications/science/logic/hol { };\n\n  hol_light = callPackage ../applications/science/logic/hol_light {\n    inherit (ocamlPackages) findlib;\n    camlp5 = ocamlPackages.camlp5_strict;\n  };\n\n  isabelle = import ../applications/science/logic/isabelle {\n    inherit (pkgs) stdenv fetchurl nettools perl polyml;\n    inherit (pkgs.emacs24Packages) proofgeneral;\n  };\n\n  iprover = callPackage ../applications/science/logic/iprover {};\n\n  leo2 = callPackage ../applications/science/logic/leo2 {};\n\n  logisim = callPackage ../applications/science/logic/logisim {};\n\n  ltl2ba = callPackage ../applications/science/logic/ltl2ba {};\n\n  matita = callPackage ../applications/science/logic/matita {\n    ocaml = ocaml_3_11_2;\n    inherit (ocamlPackages_3_11_2) findlib lablgtk ocaml_expat gmetadom ocaml_http\n            lablgtkmathview ocaml_mysql ocaml_sqlite3 ocamlnet camlzip ocaml_pcre;\n    ulex08 = ocamlPackages_3_11_2.ulex08.override { camlp5 = ocamlPackages_3_11_2.camlp5_5_transitional; };\n  };\n\n  matita_130312 = lowPrio (callPackage ../applications/science/logic/matita/130312.nix {\n    inherit (ocamlPackages) findlib lablgtk ocaml_expat gmetadom ocaml_http\n            ocaml_mysql ocamlnet ulex08 camlzip ocaml_pcre;\n  });\n\n  minisat = callPackage ../applications/science/logic/minisat {};\n\n  opensmt = callPackage ../applications/science/logic/opensmt { };\n\n  otter = callPackage ../applications/science/logic/otter {};\n\n  picosat = callPackage ../applications/science/logic/picosat {};\n\n  prooftree = callPackage ../applications/science/logic/prooftree {\n    inherit (ocamlPackages) findlib lablgtk;\n    camlp5 = ocamlPackages.camlp5_transitional;\n  };\n\n  prover9 = callPackage ../applications/science/logic/prover9 { };\n\n  satallax = callPackage ../applications/science/logic/satallax {};\n\n  spass = callPackage ../applications/science/logic/spass {};\n\n  ssreflect = callPackage ../applications/science/logic/ssreflect {\n    camlp5 = ocamlPackages.camlp5_transitional;\n  };\n\n  tptp = callPackage ../applications/science/logic/tptp {};\n\n  twelf = callPackage ../applications/science/logic/twelf {\n    smlnj = if stdenv.isDarwin\n      then smlnjBootstrap\n      else smlnj;\n  };\n\n  verifast = callPackage ../applications/science/logic/verifast {};\n\n  why3 = callPackage ../applications/science/logic/why3 {};\n\n  yices = callPackage ../applications/science/logic/yices {};\n\n  z3 = callPackage ../applications/science/logic/z3 {};\n\n  boolector   = boolector15;\n  boolector15 = callPackage ../applications/science/logic/boolector {};\n  boolector16 = lowPrio (callPackage ../applications/science/logic/boolector {\n    useV16 = true;\n  });\n\n  ### SCIENCE / ELECTRONICS\n\n  eagle = callPackage_i686 ../applications/science/electronics/eagle { };\n\n  caneda = callPackage ../applications/science/electronics/caneda { };\n\n  gtkwave = callPackage ../applications/science/electronics/gtkwave { };\n\n  kicad = callPackage ../applications/science/electronics/kicad {\n    wxGTK = wxGTK29;\n  };\n\n  ngspice = callPackage ../applications/science/electronics/ngspice { };\n\n  qucs = callPackage ../applications/science/electronics/qucs { };\n\n  xoscope = callPackage ../applications/science/electronics/xoscope { };\n\n\n  ### SCIENCE / MATH\n\n  ecm = callPackage ../applications/science/math/ecm { };\n\n  eukleides = callPackage ../applications/science/math/eukleides {\n    texinfo = texinfo4;\n  };\n\n  fricas = callPackage ../applications/science/math/fricas { };\n\n  gap = callPackage ../applications/science/math/gap { };\n\n  maxima = callPackage ../applications/science/math/maxima { };\n\n  wxmaxima = callPackage ../applications/science/math/wxmaxima { };\n\n  pari = callPackage ../applications/science/math/pari {};\n\n  pspp = callPackage ../applications/science/math/pssp {\n    inherit (gnome) libglade gtksourceview;\n  };\n\n  singular = callPackage ../applications/science/math/singular {};\n\n  scilab = callPackage ../applications/science/math/scilab {\n    withXaw3d = false;\n    withTk = true;\n    withGtk = false;\n    withOCaml = true;\n    withX = true;\n  };\n\n  msieve = callPackage ../applications/science/math/msieve { };\n\n  weka = callPackage ../applications/science/math/weka { };\n\n  yad = callPackage ../tools/misc/yad { };\n\n  yacas = callPackage ../applications/science/math/yacas { };\n\n  speedcrunch = callPackage ../applications/science/math/speedcrunch {\n    qt = qt4;\n    cmake = cmakeCurses;\n  };\n\n\n  ### SCIENCE / MISC\n\n  boinc = callPackage ../applications/science/misc/boinc { };\n\n  celestia = callPackage ../applications/science/astronomy/celestia {\n    lua = lua5_1;\n    inherit (xlibs) libXmu;\n    inherit (pkgs.gnome) gtkglext;\n  };\n\n  fityk = callPackage ../applications/science/misc/fityk { };\n\n  gravit = callPackage ../applications/science/astronomy/gravit { };\n\n  golly = callPackage ../applications/science/misc/golly { };\n\n  megam = callPackage ../applications/science/misc/megam { };\n\n  root = callPackage ../applications/science/misc/root { };\n\n  simgrid = callPackage ../applications/science/misc/simgrid { };\n\n  spyder = callPackage ../applications/science/spyder {\n    inherit (pythonPackages) pyflakes rope sphinx numpy scipy matplotlib; # recommended\n    inherit (pythonPackages) ipython pep8; # optional\n    inherit pylint;\n  };\n\n  stellarium = callPackage ../applications/science/astronomy/stellarium { };\n\n  tulip = callPackage ../applications/science/misc/tulip { };\n\n  vite = callPackage ../applications/science/misc/vite { };\n\n  xplanet = callPackage ../applications/science/astronomy/xplanet { };\n\n  ### MISC\n\n  atari800 = callPackage ../misc/emulators/atari800 { };\n\n  ataripp = callPackage ../misc/emulators/atari++ { };\n\n  auctex = callPackage ../tools/typesetting/tex/auctex { };\n\n  beep = callPackage ../misc/beep { };\n\n  cups = callPackage ../misc/cups { libusb = libusb1; };\n\n  cups_pdf_filter = callPackage ../misc/cups/pdf-filter.nix { };\n\n  gutenprint = callPackage ../misc/drivers/gutenprint { };\n\n  gutenprintBin = callPackage ../misc/drivers/gutenprint/bin.nix { };\n\n  cupsBjnp = callPackage ../misc/cups/drivers/cups-bjnp { };\n\n  darcnes = callPackage ../misc/emulators/darcnes { };\n\n  dbacl = callPackage ../tools/misc/dbacl { };\n\n  dblatex = callPackage ../tools/typesetting/tex/dblatex {\n    enableAllFeatures = false;\n  };\n\n  dblatexFull = appendToName \"full\" (dblatex.override {\n    enableAllFeatures = true;\n  });\n\n  dosbox = callPackage ../misc/emulators/dosbox { };\n\n  dpkg = callPackage ../tools/package-management/dpkg { };\n\n  ekiga = newScope pkgs.gnome ../applications/networking/instant-messengers/ekiga { };\n\n  emulationstation = callPackage ../misc/emulators/emulationstation { };\n\n  electricsheep = callPackage ../misc/screensavers/electricsheep { };\n\n  fakenes = callPackage ../misc/emulators/fakenes { };\n\n  fceux = callPackage ../misc/emulators/fceux { };\n\n  foldingathome = callPackage ../misc/foldingathome { };\n\n  foo2zjs = callPackage ../misc/drivers/foo2zjs {};\n\n  foomatic_filters = callPackage ../misc/drivers/foomatic-filters {};\n\n  freestyle = callPackage ../misc/freestyle { };\n\n  gajim = callPackage ../applications/networking/instant-messengers/gajim { };\n\n  gammu = callPackage ../applications/misc/gammu { };\n\n  gensgs = callPackage_i686 ../misc/emulators/gens-gs { };\n\n  ghostscript = callPackage ../misc/ghostscript {\n    x11Support = false;\n    cupsSupport = config.ghostscript.cups or (!stdenv.isDarwin);\n    gnuFork = config.ghostscript.gnu or false;\n  };\n\n  ghostscriptX = appendToName \"with-X\" (ghostscript.override {\n    x11Support = true;\n  });\n\n  guix = callPackage ../tools/package-management/guix { };\n\n  gxemul = callPackage ../misc/gxemul { };\n\n  hatari = callPackage ../misc/emulators/hatari { };\n\n  hplip = callPackage ../misc/drivers/hplip { };\n\n  hplipWithPlugin = hplip.override { withPlugin = true; };\n\n  # using the new configuration style proposal which is unstable\n  jack1 = callPackage ../misc/jackaudio/jack1.nix { };\n\n  jack2 = callPackage ../misc/jackaudio { };\n\n  keynav = callPackage ../tools/X11/keynav { };\n\n  lazylist = callPackage ../tools/typesetting/tex/lazylist { };\n\n  lilypond = callPackage ../misc/lilypond { guile = guile_1_8; };\n\n  martyr = callPackage ../development/libraries/martyr { };\n\n  maven = maven3;\n  maven3 = callPackage ../misc/maven { jdk = openjdk; };\n\n  mess = callPackage ../misc/emulators/mess {\n    inherit (pkgs.gnome) GConf;\n  };\n\n  mupen64plus = callPackage ../misc/emulators/mupen64plus { };\n\n  mupen64plus1_5 = callPackage ../misc/emulators/mupen64plus/1.5.nix { };\n\n  nix = nixStable;\n\n  nixStable = callPackage ../tools/package-management/nix {\n    storeDir = config.nix.storeDir or \"/nix/store\";\n    stateDir = config.nix.stateDir or \"/nix/var\";\n  };\n\n  nixUnstable = callPackage ../tools/package-management/nix/unstable.nix {\n    storeDir = config.nix.storeDir or \"/nix/store\";\n    stateDir = config.nix.stateDir or \"/nix/var\";\n  };\n\n  nixops = callPackage ../tools/package-management/nixops { };\n\n  nix-prefetch-scripts = callPackage ../tools/package-management/nix-prefetch-scripts { };\n\n  nix-repl = callPackage ../tools/package-management/nix-repl { };\n\n  nut = callPackage ../applications/misc/nut { };\n\n  solfege = callPackage ../misc/solfege {\n      pysqlite = pkgs.pythonPackages.sqlite3;\n  };\n\n  disnix = callPackage ../tools/package-management/disnix { };\n\n  dysnomia = callPackage ../tools/package-management/disnix/dysnomia {\n    enableApacheWebApplication = config.disnix.enableApacheWebApplication or false;\n    enableAxis2WebService = config.disnix.enableAxis2WebService or false;\n    enableEjabberdDump = config.disnix.enableEjabberdDump or false;\n    enableMySQLDatabase = config.disnix.enableMySQLDatabase or false;\n    enablePostgreSQLDatabase = config.disnix.enablePostgreSQLDatabase or false;\n    enableSubversionRepository = config.disnix.enableSubversionRepository or false;\n    enableTomcatWebApplication = config.disnix.enableTomcatWebApplication or false;\n  };\n\n  disnixos = callPackage ../tools/package-management/disnix/disnixos { };\n\n  DisnixWebService = callPackage ../tools/package-management/disnix/DisnixWebService { };\n\n  latex2html = callPackage ../tools/typesetting/tex/latex2html/default.nix {\n    tex = tetex;\n  };\n\n  lkproof = callPackage ../tools/typesetting/tex/lkproof { };\n\n  mysqlWorkbench = newScope gnome ../applications/misc/mysql-workbench {\n    lua = lua5;\n    inherit (pythonPackages) pexpect paramiko;\n  };\n\n  robomongo = callPackage ../applications/misc/robomongo { };\n\n  opkg = callPackage ../tools/package-management/opkg { };\n\n  pgadmin = callPackage ../applications/misc/pgadmin { };\n\n  pgf = pgf2;\n\n  # Keep the old PGF since some documents don't render properly with\n  # the new one.\n  pgf1 = callPackage ../tools/typesetting/tex/pgf/1.x.nix { };\n\n  pgf2 = callPackage ../tools/typesetting/tex/pgf/2.x.nix { };\n\n  pgfplots = callPackage ../tools/typesetting/tex/pgfplots { };\n\n  pjsip = callPackage ../applications/networking/pjsip { };\n\n  polytable = callPackage ../tools/typesetting/tex/polytable { };\n\n  PPSSPP = callPackage ../misc/emulators/ppsspp { };\n\n  uae = callPackage ../misc/emulators/uae { };\n\n  putty = callPackage ../applications/networking/remote/putty { };\n\n  retroarch = callPackage ../misc/emulators/retroarch { };\n\n  rssglx = callPackage ../misc/screensavers/rss-glx { };\n\n  xlockmore = callPackage ../misc/screensavers/xlockmore { };\n\n  samsungUnifiedLinuxDriver = import ../misc/cups/drivers/samsung {\n    inherit fetchurl stdenv;\n    inherit cups ghostscript glibc patchelf;\n    gcc = import ../development/compilers/gcc/4.4 {\n      inherit stdenv fetchurl gmp mpfr noSysDirs gettext which;\n      texinfo = texinfo4;\n      profiledCompiler = true;\n    };\n  };\n\n  saneBackends = callPackage ../applications/graphics/sane/backends.nix {\n    gt68xxFirmware = config.sane.gt68xxFirmware or null;\n    snapscanFirmware = config.sane.snapscanFirmware or null;\n    hotplugSupport = config.sane.hotplugSupport or true;\n    libusb = libusb1;\n  };\n\n  saneBackendsGit = callPackage ../applications/graphics/sane/backends-git.nix {\n    gt68xxFirmware = config.sane.gt68xxFirmware or null;\n    snapscanFirmware = config.sane.snapscanFirmware or null;\n    hotplugSupport = config.sane.hotplugSupport or true;\n  };\n\n  mkSaneConfig = callPackage ../applications/graphics/sane/config.nix { };\n\n  saneFrontends = callPackage ../applications/graphics/sane/frontends.nix { };\n\n  seafile-shared = callPackage ../misc/seafile-shared { };\n\n  slock = callPackage ../misc/screensavers/slock { };\n\n  sourceAndTags = import ../misc/source-and-tags {\n    inherit pkgs stdenv unzip lib ctags;\n    hasktags = haskellPackages.hasktags;\n  };\n\n  splix = callPackage ../misc/cups/drivers/splix { };\n\n  streamripper = callPackage ../applications/audio/streamripper { };\n\n  sqsh = callPackage ../development/tools/sqsh { };\n\n  tetex = callPackage ../tools/typesetting/tex/tetex { libpng = libpng12; };\n\n  tex4ht = callPackage ../tools/typesetting/tex/tex4ht { };\n\n  texFunctions = import ../tools/typesetting/tex/nix pkgs;\n\n  texLive = builderDefsPackage (import ../tools/typesetting/tex/texlive) {\n    inherit builderDefs zlib bzip2 ncurses libpng ed lesstif ruby potrace\n      gd t1lib freetype icu perl expat curl xz pkgconfig zziplib texinfo\n      libjpeg bison python fontconfig flex poppler libpaper graphite2\n      makeWrapper;\n    inherit (xlibs) libXaw libX11 xproto libXt libXpm\n      libXmu libXext xextproto libSM libICE;\n    ghostscript = ghostscriptX;\n    harfbuzz = harfbuzz.override {\n      withIcu = true; withGraphite2 = true;\n    };\n  };\n\n  texLiveFull = lib.setName \"texlive-full\" (texLiveAggregationFun {\n    paths = [ texLive texLiveExtra lmodern texLiveCMSuper texLiveLatexXColor\n              texLivePGF texLiveBeamer texLiveModerncv tipa tex4ht texinfo\n              texLiveModerntimeline ];\n  });\n\n  /* Look in configurations/misc/raskin.nix for usage example (around revisions\n  where TeXLive was added)\n\n  (texLiveAggregationFun {\n    paths = [texLive texLiveExtra texLiveCMSuper\n      texLiveBeamer\n    ];\n  })\n\n  You need to use texLiveAggregationFun to regenerate, say, ls-R (TeX-related file list)\n  Just installing a few packages doesn't work.\n  */\n  texLiveAggregationFun = params:\n    builderDefsPackage (import ../tools/typesetting/tex/texlive/aggregate.nix)\n      ({inherit poppler perl makeWrapper;} // params);\n\n  texDisser = callPackage ../tools/typesetting/tex/disser {};\n\n  texLiveContext = builderDefsPackage (import ../tools/typesetting/tex/texlive/context.nix) {\n    inherit texLive;\n  };\n\n  texLiveExtra = builderDefsPackage (import ../tools/typesetting/tex/texlive/extra.nix) {\n    inherit texLive xz;\n  };\n\n  texLiveCMSuper = builderDefsPackage (import ../tools/typesetting/tex/texlive/cm-super.nix) {\n    inherit texLive;\n  };\n\n  texLiveLatexXColor = builderDefsPackage (import ../tools/typesetting/tex/texlive/xcolor.nix) {\n    inherit texLive;\n  };\n\n  texLivePGF = builderDefsPackage (import ../tools/typesetting/tex/texlive/pgf.nix) {\n    inherit texLiveLatexXColor texLive;\n  };\n\n  texLiveBeamer = builderDefsPackage (import ../tools/typesetting/tex/texlive/beamer.nix) {\n    inherit texLiveLatexXColor texLivePGF texLive;\n  };\n\n  texLiveModerncv = builderDefsPackage (import ../tools/typesetting/tex/texlive/moderncv.nix) {\n    inherit texLive unzip;\n  };\n\n  texLiveModerntimeline = builderDefsPackage (import ../tools/typesetting/tex/texlive/moderntimeline.nix) {\n    inherit texLive unzip;\n  };\n\n  thermald = callPackage ../tools/system/thermald { };\n\n  thinkfan = callPackage ../tools/system/thinkfan { };\n\n  vice = callPackage ../misc/emulators/vice {\n    libX11 = xlibs.libX11;\n    giflib = giflib_4_1;\n  };\n\n  viewnior = callPackage ../applications/graphics/viewnior { };\n\n  vimPlugins = recurseIntoAttrs (callPackage ../misc/vim-plugins { });\n\n  vimprobable2 = callPackage ../applications/networking/browsers/vimprobable2 {\n    webkit = webkitgtk2;\n  };\n\n  vimprobable2Wrapper = wrapFirefox\n    { browser = vimprobable2; browserName = \"vimprobable2\"; desktopName = \"Vimprobable2\";\n    };\n\n  vimb = callPackage ../applications/networking/browsers/vimb {\n    webkit = webkitgtk2;\n  };\n\n  vimbWrapper = wrapFirefox {\n    browser = vimb;\n    browserName = \"vimb\";\n    desktopName = \"Vimb\";\n  };\n\n  VisualBoyAdvance = callPackage ../misc/emulators/VisualBoyAdvance { };\n\n  # Wine cannot be built in 64-bit; use a 32-bit build instead.\n  wineStable = callPackage_i686 ../misc/emulators/wine/stable.nix {\n    bison = bison2;\n  };\n\n  wineUnstable = lowPrio (callPackage_i686 ../misc/emulators/wine/unstable.nix {\n    bison = bison2;\n  });\n\n  wine = wineStable;\n\n  winetricks = callPackage ../misc/emulators/wine/winetricks.nix {\n    inherit (gnome2) zenity;\n  };\n\n  wxmupen64plus = callPackage ../misc/emulators/wxmupen64plus { };\n\n  x2x = callPackage ../tools/X11/x2x { };\n\n  xboxdrv = callPackage ../misc/drivers/xboxdrv { };\n\n  xinput_calibrator = callPackage ../tools/X11/xinput_calibrator {\n    inherit (xlibs) libXi inputproto;\n  };\n\n  xosd = callPackage ../misc/xosd { };\n\n  xsane = callPackage ../applications/graphics/sane/xsane.nix {\n    libpng = libpng12;\n    saneBackends = saneBackends;\n  };\n\n  yafc = callPackage ../applications/networking/yafc { };\n\n  yandex-disk = callPackage ../tools/filesystems/yandex-disk { };\n\n  myEnvFun = import ../misc/my-env {\n    inherit substituteAll pkgs;\n    inherit (stdenv) mkDerivation;\n  };\n\n  # patoline requires a rather large ocaml compilation environment.\n  # this is why it is build as an environment and not just a normal package.\n  # remark : the emacs mode is also installed, but you have to adjust your load-path.\n  PatolineEnv = pack: myEnvFun {\n      name = \"patoline\";\n      buildInputs = [ stdenv ncurses mesa freeglut libzip gcc\n                                   pack.ocaml pack.findlib pack.camomile\n                                   pack.dypgen pack.ocaml_sqlite3 pack.camlzip\n                                   pack.lablgtk pack.camlimages pack.ocaml_cairo\n                                   pack.lablgl pack.ocamlnet pack.cryptokit\n                                   pack.ocaml_pcre pack.patoline\n                                   ];\n    # this is to circumvent the bug with libgcc_s.so.1 which is\n    # not found when using thread\n    extraCmds = ''\n       LD_LIBRARY_PATH=\\$LD_LIBRARY_PATH:${gcc.gcc}/lib\n       export LD_LIBRARY_PATH\n    '';\n  };\n\n  patoline = PatolineEnv ocamlPackages_4_00_1;\n\n  znc = callPackage ../applications/networking/znc { };\n\n  zncModules = recurseIntoAttrs (\n    callPackage ../applications/networking/znc/modules.nix { }\n  );\n\n  zsnes = callPackage_i686 ../misc/emulators/zsnes { };\n\n  snes9x-gtk = callPackage ../misc/emulators/snes9x-gtk { };\n\n  misc = import ../misc/misc.nix { inherit pkgs stdenv; };\n\n  bullet = callPackage ../development/libraries/bullet {};\n\n  dart = callPackage ../development/interpreters/dart { };\n\n  httrack = callPackage ../tools/backup/httrack { };\n\n  mg = callPackage ../applications/editors/mg { };\n\n\n  # Attributes for backward compatibility.\n  adobeReader = adobe-reader;\n  asciidocFull = asciidoc-full;  # added 2014-06-22\n  lttngTools = lttng-tools;  # added 2014-07-31\n  lttngUst = lttng-ust;  # added 2014-07-31\n\n\n}; in self; in pkgs\n"
  },
  {
    "path": "data/simple-pretty.nix",
    "content": "{\n  a = 3;\n  b = 4;\n  c = {\n    inherit ({ a = 3; }) a;\n    e = 4;\n    f = 5;\n  };\n  d = if true\n    then { a = 1; b = 2; c = 3; }\n    else if false\n      then null\n      else {\n        inherit ({\n          a = 3;\n          b = 4;\n          cdefgads = 5;\n        }) cdefgads;\n      };\n  f = x: x;\n  list = [\n    1\n    2\n    (f 3)\n    ((x: x) 3)\n    [ 4 5 ]\n  ];\n}\n"
  },
  {
    "path": "data/simple.nix",
    "content": "{ a = 3; b = 4; c = { inherit ({a = 3; }) a; e = 4; f = 5; }; d = if true then { a = 1; b = 2; c = 3; } else if false then null else { inherit ({a = 3; b = 4; cdefgads = 5; }) cdefgads; }; f = x: x; list = [ 1 2 (f 3) ((x: x) 3) [ 4 5 ] ]; }"
  },
  {
    "path": "default.nix",
    "content": "{\n# For current default and explicitly supported GHCs https://search.nixos.org/packages?query=ghc&from=0&size=500&channel=unstable, Nixpkgs implicitly supports older minor versions also, until the configuration departs from compatibility with them.\n# Compiler in a form ghc8101 <- GHC 8.10.1, just remove spaces and dots\n  compiler    ? \"ghc947\"\n\n# Deafult.nix is a unit package abstraciton that allows to abstract over packages even in monorepos:\n# Example: pass --arg cabalName --arg packageRoot \"./subprojectDir\", or map default.nix over a list of tiples for subprojects.\n# cabalName is package resulting name: by default and on error resolves in haskellPackages.developPackage to project root directory name by default, but outside the haskellPackages.developPackage as you see below packageRoot can be different\n, cabalName ? \"hnix\"\n, packageRoot ? pkgs.nix-gitignore.gitignoreSource [ ] ./.\n\n# This settings expose most of the Nixpkgs Haskell.lib API: https://github.com/NixOS/nixpkgs/blob/master/pkgs/development/haskell-modules/lib.nix\n\n# Some of these options implicitly enable other options they require, and some counterpoint options clash, obviously\n\n# Don't fail at configure time if there are multiple versions of the same package in the (recursive) dependencies of the package being built. Will delay failures, if any, to compile time.\n, allowInconsistentDependencies ? false\n# Escape the version bounds from the cabal file. You may want to avoid this function.\n, doJailbreak ? false\n# Nix dependency checking, compilation and execution of test suites listed in the package description file.\n# TODO(srk): 2023-11-21\n# needs moving of the hnix-store-remote test harness to hnix-store-tests\n, doCheck     ? false\n\n# Just produce a SDist src tarball\n, sdistTarball ? false\n# The strict packaging process as used on Hackage. Tests consistency of the Cabal file.\n, buildFromSdist ? true\n# Allow a shell environment to be requested\n, returnShellEnv ? false\n\n# Turn all warn into err with {-Wall,-Werror}\n, failOnAllWarnings ? false\n# `failOnAllWarnings` + `buildFromSdist`\n, buildStrictly ? false\n\n#  2020-06-02: NOTE: enableDeadCodeElimination = true: On GHC =< 8.8.3 macOS build falls due to https://gitlab.haskell.org/ghc/ghc/issues/17283\n, enableDeadCodeElimination ? false\n# Disabled GHC code optimizations make build/tolling/dev loops faster.\n# Works also for Haskel IDE Engine and GHCID.\n# Enable optimizations for production use, and to pass benchmarks.\n, disableOptimization ? true\n# Use faster `gold` ELF linker from GNU binutils instead of older&slower but more versatile GNU linker. Is not available by default since macOS does not have it.\n, linkWithGold ? false\n\n# Provide an inventory of performance events and timings for the execution. Provides informaiton in an absolute sense. Nothing is timestamped.\n, enableLibraryProfiling ? false\n, enableExecutableProfiling ? false\n# Include tracing information & abilities. Tracing records the chronology, often with timestamps and is extensive in time\n, doTracing   ? false\n# Include DWARF debugging information & abilities\n, enableDWARFDebugging ? true\n# Strip results from all debugging symbols\n, doStrip ? false\n\n# Nixpkgs expects shared libraries\n, enableSharedLibraries ? true\n# Ability to make static libraries\n, enableStaticLibraries ? false\n# Make hybrid executable that is also a shared library\n, enableSharedExecutables ? false\n# link executables statically against haskell libs to reduce closure size\n, justStaticExecutables ? false\n, enableSeparateBinOutput ? false\n\n# checkUnusedPackages: is `failOnAllWarnings` + `cabal sdist` + post-build dep check.\n# Currently uses `packunused` or GHC 8.8 internals, later switches into GHC internal feature.\n# Adds a post-build check to verify that dependencies declared in the cabal file are actually used.\n, checkUnusedPackages ? false\n# Generation and installation of haddock API documentation\n, doHaddock   ? false\n#\tGenerate hyperlinked source code for documentation using HsColour, and have Haddock documentation link to it.\n, doHyperlinkSource ? false\n# Generation and installation of a coverage report. See https://wiki.haskell.org/Haskell_program_coverage\n, doCoverage  ? false\n# doBenchmark: Dependency checking + compilation and execution for benchmarks listed in the package description file.\n, doBenchmark ? false\n# For binaries named in `executableNamesToShellComplete` list, generate and bundle-into package an automatically loaded shell complettions\n, generateOptparseApplicativeCompletions ? false\n, executableNamesToShellComplete ? [ \"hnix\" ]\n\n\n# Include Hoogle executable and DB into derivation\n, withHoogle  ? false\n\n\n# Nix by default updates and uses locally configured nixpkgs-unstable channel\n# Nixpkgs revision options:\n#   `rev` vals in order of freshness -> cache & stability:\n#   { master\n#   , <commitHash>\n#   , haskell-updates  # Haskell development branch in Nixpkgs, can be inconsistent. Weekly merged into the upstream\n#   , nixpkgs-unstable  # Default branch on Nix installation, default for non NixOS\n#   , nixos-unstable  # nixpkgs-unstable that passes a bunch of base tests\n#   , nixos-20.03  # Last stable release, gets almost no updates to recipes, gets only required backports\n#   ...\n#   }\n, rev ? \"c757e9bd77b16ca2e03c89bf8bc9ecb28e0c06ad\"\n, pkgs ?\n    if builtins.compareVersions builtins.nixVersion \"2.0\" > 0\n      then\n        if ((rev == \"\") || (rev == \"default\") || (rev == \"local\"))\n          then import <nixpkgs> {}\n          # Do not guard with hash, so the project is able to use current channels (rolling `rev`) of Nixpkgs\n          else import (builtins.fetchTarball \"https://github.com/NixOS/nixpkgs/archive/${rev}.tar.gz\") {}\n        // {\n          # Try to build dependencies even if they are marked broken.\n          # config.allowBroken = true;\n        }\n      else abort \"Requires Nix >= 2.0\"\n\n, mkDerivation   ? null\n, inNixShell ? false\n}:\n\nlet\n\n  hlib = pkgs.haskell.lib;\n  lib = pkgs.lib;\n\n  getDefaultGHC = \"ghc${\n      (\n        # Remove '.' from the string 8.8.4 -> 884\n        lib.stringAsChars (c: if c == \".\" then \"\" else c)\n          # Get default GHC version,\n          (lib.getVersion pkgs.haskellPackages.ghc)\n      )\n    }\";\n\n  compilerPackage =\n    if ((compiler == \"\") || (compiler == \"default\"))\n      then getDefaultGHC\n      else compiler;\n\n  haskellPackages = pkgs.haskell.packages.${compilerPackage};\n\n  # Application of functions from this list to the package in code here happens \n  # in the reverse order (from the tail). Some options depend on & override others, \n  # so if enabling options caused Nix error or not expected result - change the order, \n  # and please do not change this order without proper testing.\n  listSwitchFunc =\n    [\n      { switch = sdistTarball;                           function = hlib.sdistTarball; }\n      { switch = buildFromSdist;                         function = hlib.buildFromSdist; }\n      { switch = buildStrictly;                          function = hlib.buildStrictly; }\n      { switch = disableOptimization;                    function = hlib.disableOptimization; }\n      { switch = doJailbreak;                            function = hlib.doJailBreak; }\n      { switch = doStrip;                                function = hlib.doStrip; }\n      { switch = enableDWARFDebugging;                   function = hlib.enableDWARFDebugging; }\n      { switch = linkWithGold;                           function = hlib.linkWithGold; }\n      { switch = failOnAllWarnings;                      function = hlib.failOnAllWarnings; }\n      { switch = justStaticExecutables;                  function = hlib.justStaticExecutables; }\n      { switch = checkUnusedPackages;                    function = hlib.checkUnusedPackages {}; }\n      { switch = generateOptparseApplicativeCompletions; function = hlib.generateOptparseApplicativeCompletions executableNamesToShellComplete; }\n      { switch = doHyperlinkSource;                      function = hlib.doHyperlinkSource; }\n    ];\n\n  # Function that applies enabled option to the package, used in the fold.\n  onSwitchApplyFunc = set: object:\n    if set.switch\n      then set.function object\n      else object;\n\n  # General description of package\n  package = haskellPackages.developPackage {\n    name = cabalName;\n    # Do not include into closure the files listed in .gitignore\n    root = packageRoot;\n\n    overrides = self: super: {\n      hnix-store-core = super.hnix-store-core_0_6_1_0;\n      hnix-store-remote = super.hnix-store-remote_0_6_0_0;\n      hnix-store-nar = super.hnix-store-nar or self.hnix-store-nar;\n    };\n\n    modifier = drv: hlib.overrideCabal drv (attrs: {\n      buildTools = (attrs.buildTools or []) ++ [\n        haskellPackages.cabal-install\n      ];\n\n      testHaskellDepends = attrs.testHaskellDepends ++ [\n        pkgs.nix\n        haskellPackages.criterion\n      ];\n\n      # Declare that the header set arguments as according Haskell.lib switches\n      inherit allowInconsistentDependencies;\n      inherit doCheck;\n      inherit enableDeadCodeElimination;\n      inherit enableLibraryProfiling;\n      inherit enableExecutableProfiling;\n      inherit enableSharedLibraries;\n      inherit enableStaticLibraries;\n      inherit enableSharedExecutables;\n      inherit enableSeparateBinOutput;\n      inherit doBenchmark;\n      inherit doCoverage;\n      inherit doHaddock;\n\n      configureFlags = lib.optional doTracing  \"--flags=tracing\";\n\n      passthru = {\n        nixpkgs = pkgs;\n      };\n    });\n\n    inherit returnShellEnv withHoogle;\n  };\n\n  # One part of Haskell.lib options are argument switches, those are in `inherit`ed list.\n  # Other part - are function wrappers over pkg. Fold allows to compose those.\n  # composePackage = foldr (if switch then function) (package) ([{switch,function}]) == (functionN .. (function1 package))\n  composedPackage = lib.foldr (onSwitchApplyFunc) package listSwitchFunc;\nin \n  # when returnShellEnv is enable, package is an shell env, we do not apply switch function. \n  if returnShellEnv then package else composedPackage\n\n"
  },
  {
    "path": "doc/grammar.y",
    "content": "%glr-parser\n%pure-parser\n%locations\n%error-verbose\n%defines\n/* %no-lines */\n%parse-param { void * scanner }\n%parse-param { nix::ParseData * data }\n%lex-param { void * scanner }\n%lex-param { nix::ParseData * data }\n%expect 1\n%expect-rr 1\n\n%code requires {\n\n#ifndef BISON_HEADER\n#define BISON_HEADER\n\n#include \"util.hh\"\n\n#include \"nixexpr.hh\"\n#include \"eval.hh\"\n\nnamespace nix {\n\n    struct ParseData\n    {\n        EvalState & state;\n        SymbolTable & symbols;\n        Expr * result;\n        Path basePath;\n        Symbol path;\n        string error;\n        Symbol sLetBody;\n        ParseData(EvalState & state)\n            : state(state)\n            , symbols(state.symbols)\n            , sLetBody(symbols.create(\"<let-body>\"))\n            { };\n    };\n\n}\n\n#define YY_DECL int yylex \\\n    (YYSTYPE * yylval_param, YYLTYPE * yylloc_param, yyscan_t yyscanner, nix::ParseData * data)\n\n#endif\n\n}\n\n%{\n\n#include \"parser-tab.hh\"\n#include \"lexer-tab.hh\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\nYY_DECL;\n\nusing namespace nix;\n\n\nnamespace nix {\n\n\nstatic void dupAttr(const AttrPath & attrPath, const Pos & pos, const Pos & prevPos)\n{\n    throw ParseError(format(\"attribute `%1%' at %2% already defined at %3%\")\n        % showAttrPath(attrPath) % pos % prevPos);\n}\n\n\nstatic void dupAttr(Symbol attr, const Pos & pos, const Pos & prevPos)\n{\n    throw ParseError(format(\"attribute `%1%' at %2% already defined at %3%\")\n        % attr % pos % prevPos);\n}\n\n\nstatic void addAttr(ExprAttrs * attrs, AttrPath & attrPath,\n    Expr * e, const Pos & pos)\n{\n    AttrPath::iterator i;\n    // All attrpaths have at least one attr\n    assert(!attrPath.empty());\n    for (i = attrPath.begin(); i + 1 < attrPath.end(); i++) {\n        if (i->symbol.set()) {\n            ExprAttrs::AttrDefs::iterator j = attrs->attrs.find(i->symbol);\n            if (j != attrs->attrs.end()) {\n                if (!j->second.inherited) {\n                    ExprAttrs * attrs2 = dynamic_cast<ExprAttrs *>(j->second.e);\n                    if (!attrs2) dupAttr(attrPath, pos, j->second.pos);\n                    attrs = attrs2;\n                } else\n                    dupAttr(attrPath, pos, j->second.pos);\n            } else {\n                ExprAttrs * nested = new ExprAttrs;\n                attrs->attrs[i->symbol] = ExprAttrs::AttrDef(nested, pos);\n                attrs = nested;\n            }\n        } else {\n            ExprAttrs *nested = new ExprAttrs;\n            attrs->dynamicAttrs.push_back(ExprAttrs::DynamicAttrDef(i->expr, nested, pos));\n            attrs = nested;\n        }\n    }\n    if (i->symbol.set()) {\n        ExprAttrs::AttrDefs::iterator j = attrs->attrs.find(i->symbol);\n        if (j != attrs->attrs.end()) {\n            dupAttr(attrPath, pos, j->second.pos);\n        } else {\n            attrs->attrs[i->symbol] = ExprAttrs::AttrDef(e, pos);\n            e->setName(i->symbol);\n        }\n    } else {\n        attrs->dynamicAttrs.push_back(ExprAttrs::DynamicAttrDef(i->expr, e, pos));\n    }\n}\n\n\nstatic void addFormal(const Pos & pos, Formals * formals, const Formal & formal)\n{\n    if (formals->argNames.find(formal.name) != formals->argNames.end())\n        throw ParseError(format(\"duplicate formal function argument `%1%' at %2%\")\n            % formal.name % pos);\n    formals->formals.push_front(formal);\n    formals->argNames.insert(formal.name);\n}\n\n\nstatic Expr * stripIndentation(const Pos & pos, SymbolTable & symbols, vector<Expr *> & es)\n{\n    if (es.empty()) return new ExprString(symbols.create(\"\"));\n\n    /* Figure out the minimum indentation.  Note that by design\n       whitespace-only final lines are not taken into account.  (So\n       the \" \" in \"\\n ''\" is ignored, but the \" \" in \"\\n foo''\" is.) */\n    bool atStartOfLine = true; /* = seen only whitespace in the current line */\n    unsigned int minIndent = 1000000;\n    unsigned int curIndent = 0;\n    foreach (vector<Expr *>::iterator, i, es) {\n        ExprIndStr * e = dynamic_cast<ExprIndStr *>(*i);\n        if (!e) {\n            /* Anti-quotations end the current start-of-line whitespace. */\n            if (atStartOfLine) {\n                atStartOfLine = false;\n                if (curIndent < minIndent) minIndent = curIndent;\n            }\n            continue;\n        }\n        for (unsigned int j = 0; j < e->s.size(); ++j) {\n            if (atStartOfLine) {\n                if (e->s[j] == ' ')\n                    curIndent++;\n                else if (e->s[j] == '\\n') {\n                    /* Empty line, doesn't influence minimum\n                       indentation. */\n                    curIndent = 0;\n                } else {\n                    atStartOfLine = false;\n                    if (curIndent < minIndent) minIndent = curIndent;\n                }\n            } else if (e->s[j] == '\\n') {\n                atStartOfLine = true;\n                curIndent = 0;\n            }\n        }\n    }\n\n    /* Strip spaces from each line. */\n    vector<Expr *> * es2 = new vector<Expr *>;\n    atStartOfLine = true;\n    unsigned int curDropped = 0;\n    unsigned int n = es.size();\n    for (vector<Expr *>::iterator i = es.begin(); i != es.end(); ++i, --n) {\n        ExprIndStr * e = dynamic_cast<ExprIndStr *>(*i);\n        if (!e) {\n            atStartOfLine = false;\n            curDropped = 0;\n            es2->push_back(*i);\n            continue;\n        }\n\n        string s2;\n        for (unsigned int j = 0; j < e->s.size(); ++j) {\n            if (atStartOfLine) {\n                if (e->s[j] == ' ') {\n                    if (curDropped++ >= minIndent)\n                        s2 += e->s[j];\n                }\n                else if (e->s[j] == '\\n') {\n                    curDropped = 0;\n                    s2 += e->s[j];\n                } else {\n                    atStartOfLine = false;\n                    curDropped = 0;\n                    s2 += e->s[j];\n                }\n            } else {\n                s2 += e->s[j];\n                if (e->s[j] == '\\n') atStartOfLine = true;\n            }\n        }\n\n        /* Remove the last line if it is empty and consists only of\n           spaces. */\n        if (n == 1) {\n            string::size_type p = s2.find_last_of('\\n');\n            if (p != string::npos && s2.find_first_not_of(' ', p + 1) == string::npos)\n                s2 = string(s2, 0, p + 1);\n        }\n\n        es2->push_back(new ExprString(symbols.create(s2)));\n    }\n\n    /* If this is a single string, then don't do a concatenation. */\n    return es2->size() == 1 && dynamic_cast<ExprString *>((*es2)[0]) ? (*es2)[0] : new ExprConcatStrings(pos, true, es2);\n}\n\n\nvoid backToString(yyscan_t scanner);\nvoid backToIndString(yyscan_t scanner);\n\n\nstatic inline Pos makeCurPos(const YYLTYPE & loc, ParseData * data)\n{\n    return Pos(data->path, loc.first_line, loc.first_column);\n}\n\n#define CUR_POS makeCurPos(*yylocp, data)\n\n\n}\n\n\nvoid yyerror(YYLTYPE * loc, yyscan_t scanner, ParseData * data, const char * error)\n{\n    data->error = (format(\"%1%, at %2%\")\n        % error % makeCurPos(*loc, data)).str();\n}\n\n\n%}\n\n%union {\n  // !!! We're probably leaking stuff here.\n  nix::Expr * e;\n  nix::ExprList * list;\n  nix::ExprAttrs * attrs;\n  nix::Formals * formals;\n  nix::Formal * formal;\n  nix::NixInt n;\n  const char * id; // !!! -> Symbol\n  char * path;\n  char * uri;\n  std::vector<nix::AttrName> * attrNames;\n  std::vector<nix::Expr *> * string_parts;\n}\n\n%type <e> start expr expr_function expr_if expr_op\n%type <e> expr_app expr_select expr_simple\n%type <list> expr_list\n%type <attrs> binds\n%type <formals> formals\n%type <formal> formal\n%type <attrNames> attrs attrpath\n%type <string_parts> string_parts_interpolated ind_string_parts\n%type <e> string_parts string_attr\n%type <id> attr\n%token <id> ID ATTRPATH\n%token <e> STR IND_STR\n%token <n> INT\n%token <path> PATH SPATH\n%token <uri> URI\n%token IF THEN ELSE ASSERT WITH LET IN REC INHERIT EQ NEQ AND OR IMPL OR_KW\n%token DOLLAR_CURLY /* == ${ */\n%token IND_STRING_OPEN IND_STRING_CLOSE\n%token ELLIPSIS\n\n%nonassoc IMPL\n%left OR\n%left AND\n%nonassoc EQ NEQ\n%left '<' '>' LEQ GEQ\n%right UPDATE\n%left NOT\n%left '+' '-'\n%left '*' '/'\n%right CONCAT\n%nonassoc '?'\n%nonassoc '~'\n%nonassoc NEGATE\n\n%%\n\nstart: expr { data->result = $1; };\n\nexpr: expr_function;\n\nexpr_function\n  : ID ':' expr_function\n    { $$ = new ExprLambda(CUR_POS, data->symbols.create($1), false, 0, $3); }\n  | '{' formals '}' ':' expr_function\n    { $$ = new ExprLambda(CUR_POS, data->symbols.create(\"\"), true, $2, $5); }\n  | '{' formals '}' '@' ID ':' expr_function\n    { $$ = new ExprLambda(CUR_POS, data->symbols.create($5), true, $2, $7); }\n  | ID '@' '{' formals '}' ':' expr_function\n    { $$ = new ExprLambda(CUR_POS, data->symbols.create($1), true, $4, $7); }\n  | ASSERT expr ';' expr_function\n    { $$ = new ExprAssert(CUR_POS, $2, $4); }\n  | WITH expr ';' expr_function\n    { $$ = new ExprWith(CUR_POS, $2, $4); }\n  | LET binds IN expr_function\n    { if (!$2->dynamicAttrs.empty())\n        throw ParseError(format(\"dynamic attributes not allowed in let at %1%\")\n            % CUR_POS);\n      $$ = new ExprLet($2, $4);\n    }\n  | expr_if\n  ;\n\nexpr_if\n  : IF expr THEN expr ELSE expr { $$ = new ExprIf($2, $4, $6); }\n  | expr_op\n  ;\n\nexpr_op\n  : '!' expr_op %prec NOT { $$ = new ExprOpNot($2); }\n  | '-' expr_op %prec NEGATE { $$ = new ExprApp(CUR_POS, new ExprApp(new ExprVar(data->symbols.create(\"__sub\")), new ExprInt(0)), $2); }\n  | expr_op EQ expr_op { $$ = new ExprOpEq($1, $3); }\n  | expr_op NEQ expr_op { $$ = new ExprOpNEq($1, $3); }\n  | expr_op '<' expr_op { $$ = new ExprApp(CUR_POS, new ExprApp(new ExprVar(data->symbols.create(\"__lessThan\")), $1), $3); }\n  | expr_op LEQ expr_op { $$ = new ExprOpNot(new ExprApp(CUR_POS, new ExprApp(new ExprVar(data->symbols.create(\"__lessThan\")), $3), $1)); }\n  | expr_op '>' expr_op { $$ = new ExprApp(CUR_POS, new ExprApp(new ExprVar(data->symbols.create(\"__lessThan\")), $3), $1); }\n  | expr_op GEQ expr_op { $$ = new ExprOpNot(new ExprApp(CUR_POS, new ExprApp(new ExprVar(data->symbols.create(\"__lessThan\")), $1), $3)); }\n  | expr_op AND expr_op { $$ = new ExprOpAnd(CUR_POS, $1, $3); }\n  | expr_op OR expr_op { $$ = new ExprOpOr(CUR_POS, $1, $3); }\n  | expr_op IMPL expr_op { $$ = new ExprOpImpl(CUR_POS, $1, $3); }\n  | expr_op UPDATE expr_op { $$ = new ExprOpUpdate(CUR_POS, $1, $3); }\n  | expr_op '?' attrpath { $$ = new ExprOpHasAttr($1, *$3); }\n  | expr_op '+' expr_op\n    { vector<Expr *> * l = new vector<Expr *>;\n      l->push_back($1);\n      l->push_back($3);\n      $$ = new ExprConcatStrings(CUR_POS, false, l);\n    }\n  | expr_op '-' expr_op { $$ = new ExprApp(CUR_POS, new ExprApp(new ExprVar(data->symbols.create(\"__sub\")), $1), $3); }\n  | expr_op '*' expr_op { $$ = new ExprApp(CUR_POS, new ExprApp(new ExprVar(data->symbols.create(\"__mul\")), $1), $3); }\n  | expr_op '/' expr_op { $$ = new ExprApp(CUR_POS, new ExprApp(new ExprVar(data->symbols.create(\"__div\")), $1), $3); }\n  | expr_op CONCAT expr_op { $$ = new ExprOpConcatLists(CUR_POS, $1, $3); }\n  | expr_app\n  ;\n\nexpr_app\n  : expr_app expr_select\n    { $$ = new ExprApp(CUR_POS, $1, $2); }\n  | expr_select { $$ = $1; }\n  ;\n\nexpr_select\n  : expr_simple '.' attrpath\n    { $$ = new ExprSelect(CUR_POS, $1, *$3, 0); }\n  | expr_simple '.' attrpath OR_KW expr_select\n    { $$ = new ExprSelect(CUR_POS, $1, *$3, $5); }\n  | /* Backwards compatibility: because Nixpkgs has a rarely used\n       function named ‘or’, allow stuff like ‘map or [...]’. */\n    expr_simple OR_KW\n    { $$ = new ExprApp(CUR_POS, $1, new ExprVar(CUR_POS, data->symbols.create(\"or\"))); }\n  | expr_simple { $$ = $1; }\n  ;\n\nexpr_simple\n  : ID {\n      if (strcmp($1, \"__curPos\") == 0)\n          $$ = new ExprPos(CUR_POS);\n      else\n          $$ = new ExprVar(CUR_POS, data->symbols.create($1));\n  }\n  | INT { $$ = new ExprInt($1); }\n  | '\"' string_parts '\"' { $$ = $2; }\n  | IND_STRING_OPEN ind_string_parts IND_STRING_CLOSE {\n      $$ = stripIndentation(CUR_POS, data->symbols, *$2);\n  }\n  | PATH { $$ = new ExprPath(absPath($1, data->basePath)); }\n  | SPATH {\n      string path($1 + 1, strlen($1) - 2);\n      $$ = new ExprApp(CUR_POS,\n          new ExprApp(new ExprVar(data->symbols.create(\"__findFile\")),\n              new ExprVar(data->symbols.create(\"nixPath\"))),\n          new ExprString(data->symbols.create(path)));\n  }\n  | URI { $$ = new ExprString(data->symbols.create($1)); }\n  | '(' expr ')' { $$ = $2; }\n  /* Let expressions `let {..., body = ...}' are just desugared\n     into `(rec {..., body = ...}).body'. */\n  | LET '{' binds '}'\n    { $3->recursive = true; $$ = new ExprSelect(noPos, $3, data->symbols.create(\"body\")); }\n  | REC '{' binds '}'\n    { $3->recursive = true; $$ = $3; }\n  | '{' binds '}'\n    { $$ = $2; }\n  | '[' expr_list ']' { $$ = $2; }\n  ;\n\nstring_parts\n  : STR\n  | string_parts_interpolated { $$ = new ExprConcatStrings(CUR_POS, true, $1); }\n  | { $$ = new ExprString(data->symbols.create(\"\")); }\n  ;\n\nstring_parts_interpolated\n  : string_parts_interpolated STR { $$ = $1; $1->push_back($2); }\n  | string_parts_interpolated DOLLAR_CURLY expr '}' { backToString(scanner); $$ = $1; $1->push_back($3); }\n  | STR DOLLAR_CURLY expr '}'\n    {\n      backToString(scanner);\n      $$ = new vector<Expr *>;\n      $$->push_back($1);\n      $$->push_back($3);\n    }\n  | DOLLAR_CURLY expr '}'\n    {\n      backToString(scanner);\n      $$ = new vector<Expr *>;\n      $$->push_back($2);\n    }\n  ;\n\nind_string_parts\n  : ind_string_parts IND_STR { $$ = $1; $1->push_back($2); }\n  | ind_string_parts DOLLAR_CURLY expr '}' { backToIndString(scanner); $$ = $1; $1->push_back($3); }\n  | { $$ = new vector<Expr *>; }\n  ;\n\nbinds\n  : binds attrpath '=' expr ';' { $$ = $1; addAttr($$, *$2, $4, makeCurPos(@2, data)); }\n  | binds INHERIT attrs ';'\n    { $$ = $1;\n      foreach (AttrPath::iterator, i, *$3) {\n          if ($$->attrs.find(i->symbol) != $$->attrs.end())\n              dupAttr(i->symbol, makeCurPos(@3, data), $$->attrs[i->symbol].pos);\n          Pos pos = makeCurPos(@3, data);\n          $$->attrs[i->symbol] = ExprAttrs::AttrDef(new ExprVar(CUR_POS, i->symbol), pos, true);\n      }\n    }\n  | binds INHERIT '(' expr ')' attrs ';'\n    { $$ = $1;\n      /* !!! Should ensure sharing of the expression in $4. */\n      foreach (AttrPath::iterator, i, *$6) {\n          if ($$->attrs.find(i->symbol) != $$->attrs.end())\n              dupAttr(i->symbol, makeCurPos(@6, data), $$->attrs[i->symbol].pos);\n          $$->attrs[i->symbol] = ExprAttrs::AttrDef(new ExprSelect(CUR_POS, $4, i->symbol), makeCurPos(@6, data));\n      }\n    }\n  | { $$ = new ExprAttrs; }\n  ;\n\nattrs\n  : attrs attr { $$ = $1; $1->push_back(AttrName(data->symbols.create($2))); }\n  | attrs string_attr\n    { $$ = $1;\n      ExprString *str = dynamic_cast<ExprString *>($2);\n      if (str) {\n          $$->push_back(AttrName(str->s));\n          delete str;\n      } else\n        throw ParseError(format(\"dynamic attributes not allowed in inherit at %1%\")\n            % makeCurPos(@2, data));\n    }\n  | { $$ = new AttrPath; }\n  ;\n\nattrpath\n  : attrpath '.' attr { $$ = $1; $1->push_back(AttrName(data->symbols.create($3))); }\n  | attrpath '.' string_attr\n    { $$ = $1;\n      ExprString *str = dynamic_cast<ExprString *>($3);\n      if (str) {\n          $$->push_back(AttrName(str->s));\n          delete str;\n      } else\n          $$->push_back(AttrName(static_cast<ExprConcatStrings *>($3)));\n    }\n  | attr { $$ = new vector<AttrName>; $$->push_back(AttrName(data->symbols.create($1))); }\n  | string_attr\n    { $$ = new vector<AttrName>;\n      ExprString *str = dynamic_cast<ExprString *>($1);\n      if (str) {\n          $$->push_back(AttrName(str->s));\n          delete str;\n      } else\n          $$->push_back(AttrName(static_cast<ExprConcatStrings *>($1)));\n    }\n  ;\n\nattr\n  : ID { $$ = $1; }\n  | OR_KW { $$ = \"or\"; }\n  ;\n\nstring_attr\n  : '\"' string_parts '\"' { $$ = $2; }\n  | DOLLAR_CURLY expr '}' { $$ = new ExprConcatStrings(CUR_POS, true, new vector<Expr*>(1, $2)); }\n  ;\n\nexpr_list\n  : expr_list expr_select { $$ = $1; $1->elems.push_back($2); /* !!! dangerous */ }\n  | { $$ = new ExprList; }\n  ;\n\nformals\n  : formal ',' formals\n    { $$ = $3; addFormal(CUR_POS, $$, *$1); }\n  | formal\n    { $$ = new Formals; addFormal(CUR_POS, $$, *$1); $$->ellipsis = false; }\n  |\n    { $$ = new Formals; $$->ellipsis = false; }\n  | ELLIPSIS\n    { $$ = new Formals; $$->ellipsis = true; }\n  ;\n\nformal\n  : ID { $$ = new Formal(data->symbols.create($1), 0); }\n  | ID '?' expr { $$ = new Formal(data->symbols.create($1), $3); }\n  ;\n\n%%\n\n\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <fcntl.h>\n#include <unistd.h>\n\n#include <eval.hh>\n\n\nnamespace nix {\n\n\nExpr * EvalState::parse(const char * text,\n    const Path & path, const Path & basePath, StaticEnv & staticEnv)\n{\n    yyscan_t scanner;\n    ParseData data(*this);\n    data.basePath = basePath;\n    data.path = data.symbols.create(path);\n\n    yylex_init(&scanner);\n    yy_scan_string(text, scanner);\n    int res = yyparse(scanner, &data);\n    yylex_destroy(scanner);\n\n    if (res) throw ParseError(data.error);\n\n    data.result->bindVars(staticEnv);\n\n    return data.result;\n}\n\n\nPath resolveExprPath(Path path)\n{\n    assert(path[0] == '/');\n\n    /* If `path' is a symlink, follow it.  This is so that relative\n       path references work. */\n    struct stat st;\n    while (true) {\n        if (lstat(path.c_str(), &st))\n            throw SysError(format(\"getting status of `%1%'\") % path);\n        if (!S_ISLNK(st.st_mode)) break;\n        path = absPath(readLink(path), dirOf(path));\n    }\n\n    /* If `path' refers to a directory, append `/default.nix'. */\n    if (S_ISDIR(st.st_mode))\n        path = canonPath(path + \"/default.nix\");\n\n    return path;\n}\n\n\nExpr * EvalState::parseExprFromFile(const Path & path)\n{\n    return parseExprFromFile(path, staticBaseEnv);\n}\n\n\nExpr * EvalState::parseExprFromFile(const Path & path, StaticEnv & staticEnv)\n{\n    return parse(readFile(path).c_str(), path, dirOf(path), staticEnv);\n}\n\n\nExpr * EvalState::parseExprFromString(const string & s, const Path & basePath, StaticEnv & staticEnv)\n{\n    return parse(s.c_str(), \"(string)\", basePath, staticEnv);\n}\n\n\nExpr * EvalState::parseExprFromString(const string & s, const Path & basePath)\n{\n    return parseExprFromString(s, basePath, staticBaseEnv);\n}\n\n\nvoid EvalState::addToSearchPath(const string & s, bool warn)\n{\n    size_t pos = s.find('=');\n    string prefix;\n    Path path;\n    if (pos == string::npos) {\n        path = s;\n    } else {\n        prefix = string(s, 0, pos);\n        path = string(s, pos + 1);\n    }\n\n    path = absPath(path);\n    if (pathExists(path)) {\n        debug(format(\"adding path `%1%' to the search path\") % path);\n        searchPath.push_back(std::pair<string, Path>(prefix, path));\n    } else if (warn)\n        printMsg(lvlError, format(\"warning: Nix search path entry `%1%' does not exist, ignoring\") % path);\n}\n\n\nPath EvalState::findFile(const string & path)\n{\n    return findFile(searchPath, path);\n}\n\n\nPath EvalState::findFile(SearchPath & searchPath, const string & path)\n{\n    foreach (SearchPath::iterator, i, searchPath) {\n        Path res;\n        if (i->first.empty())\n            res = i->second + \"/\" + path;\n        else {\n            if (path.compare(0, i->first.size(), i->first) != 0 ||\n                (path.size() > i->first.size() && path[i->first.size()] != '/'))\n                continue;\n            res = i->second +\n                (path.size() == i->first.size() ? \"\" : \"/\" + string(path, i->first.size()));\n        }\n        if (pathExists(res)) return canonPath(res);\n    }\n    throw ThrownError(format(\"file `%1%' was not found in the Nix search path (add it using $NIX_PATH or -I)\") % path);\n}\n\n\n}\n"
  },
  {
    "path": "doc/lexer.l",
    "content": "%option reentrant bison-bridge bison-locations\n%option noyywrap\n%option never-interactive\n\n\n%x STRING\n%x IND_STRING\n\n\n%{\n#include \"nixexpr.hh\"\n#include \"parser-tab.hh\"\n\nusing namespace nix;\n\nnamespace nix {\n\n\nstatic void initLoc(YYLTYPE * loc)\n{\n    loc->first_line = loc->last_line = 1;\n    loc->first_column = loc->last_column = 1;\n}\n\n\nstatic void adjustLoc(YYLTYPE * loc, const char * s, size_t len)\n{\n    loc->first_line = loc->last_line;\n    loc->first_column = loc->last_column;\n\n    while (len--) {\n       switch (*s++) {\n       case '\\r':\n           if (*s == '\\n') /* cr/lf */\n               s++;\n           /* fall through */\n       case '\\n':\n           ++loc->last_line;\n           loc->last_column = 1;\n           break;\n       default:\n           ++loc->last_column;\n       }\n    }\n}\n\n\nstatic Expr * unescapeStr(SymbolTable & symbols, const char * s)\n{\n    string t;\n    char c;\n    while ((c = *s++)) {\n        if (c == '\\\\') {\n            assert(*s);\n            c = *s++;\n            if (c == 'n') t += '\\n';\n            else if (c == 'r') t += '\\r';\n            else if (c == 't') t += '\\t';\n            else t += c;\n        }\n        else if (c == '\\r') {\n            /* Normalise CR and CR/LF into LF. */\n            t += '\\n';\n            if (*s == '\\n') s++; /* cr/lf */\n        }\n        else t += c;\n    }\n    return new ExprString(symbols.create(t));\n}\n\n\n}\n\n#define YY_USER_INIT initLoc(yylloc)\n#define YY_USER_ACTION adjustLoc(yylloc, yytext, yyleng);\n\n%}\n\n\nID          [a-zA-Z\\_][a-zA-Z0-9\\_\\'\\-]*\nINT         [0-9]+\nPATH        [a-zA-Z0-9\\.\\_\\-\\+]*(\\/[a-zA-Z0-9\\.\\_\\-\\+]+)+\nSPATH       \\<[a-zA-Z0-9\\.\\_\\-\\+]+(\\/[a-zA-Z0-9\\.\\_\\-\\+]+)*\\>\nURI         [a-zA-Z][a-zA-Z0-9\\+\\-\\.]*\\:[a-zA-Z0-9\\%\\/\\?\\:\\@\\&\\=\\+\\$\\,\\-\\_\\.\\!\\~\\*\\']+\n\n\n%%\n\n\nif          { return IF; }\nthen        { return THEN; }\nelse        { return ELSE; }\nassert      { return ASSERT; }\nwith        { return WITH; }\nlet         { return LET; }\nin          { return IN; }\nrec         { return REC; }\ninherit     { return INHERIT; }\nor          { return OR_KW; }\n\\.\\.\\.      { return ELLIPSIS; }\n\n\\=\\=        { return EQ; }\n\\!\\=        { return NEQ; }\n\\<\\=        { return LEQ; }\n\\>\\=        { return GEQ; }\n\\&\\&        { return AND; }\n\\|\\|        { return OR; }\n\\-\\>        { return IMPL; }\n\\/\\/        { return UPDATE; }\n\\+\\+        { return CONCAT; }\n\n{ID}        { yylval->id = strdup(yytext); return ID; }\n{INT}       { errno = 0;\n              yylval->n = strtol(yytext, 0, 10);\n              if (errno != 0)\n                  throw ParseError(format(\"invalid integer `%1%'\") % yytext);\n              return INT;\n            }\n\n\\$\\{        { return DOLLAR_CURLY; }\n\n\\\"          { BEGIN(STRING); return '\"'; }\n<STRING>([^\\$\\\"\\\\]|\\$[^\\{\\\"]|\\\\.)+ {\n              /* !!! Not quite right: we want a follow restriction on\n                 \"$\", it shouldn't be followed by a \"{\".  Right now\n                 \"$\\\"\" will be consumed as part of a string, rather\n                 than a \"$\" followed by the string terminator.\n                 Disallow \"$\\\"\" for now. */\n              yylval->e = unescapeStr(data->symbols, yytext);\n              return STR;\n            }\n<STRING>\\$\\{  { BEGIN(INITIAL); return DOLLAR_CURLY; }\n<STRING>\\\"  { BEGIN(INITIAL); return '\"'; }\n<STRING>.   return yytext[0]; /* just in case: shouldn't be reached */\n\n\\'\\'(\\ *\\n)?     { BEGIN(IND_STRING); return IND_STRING_OPEN; }\n<IND_STRING>([^\\$\\']|\\$[^\\{\\']|\\'[^\\'\\$])+ {\n                   yylval->e = new ExprIndStr(yytext);\n                   return IND_STR;\n                 }\n<IND_STRING>\\'\\'\\$ {\n                   yylval->e = new ExprIndStr(\"$\");\n                   return IND_STR;\n                 }\n<IND_STRING>\\'\\'\\' {\n                   yylval->e = new ExprIndStr(\"''\");\n                   return IND_STR;\n                 }\n<IND_STRING>\\'\\'\\\\. {\n                   yylval->e = unescapeStr(data->symbols, yytext + 2);\n                   return IND_STR;\n                 }\n<IND_STRING>\\$\\{ { BEGIN(INITIAL); return DOLLAR_CURLY; }\n<IND_STRING>\\'\\' { BEGIN(INITIAL); return IND_STRING_CLOSE; }\n<IND_STRING>\\'   {\n                   yylval->e = new ExprIndStr(\"'\");\n                   return IND_STR;\n                 }\n<IND_STRING>.    return yytext[0]; /* just in case: shouldn't be reached */\n\n{PATH}      { yylval->path = strdup(yytext); return PATH; }\n{SPATH}     { yylval->path = strdup(yytext); return SPATH; }\n{URI}       { yylval->uri = strdup(yytext); return URI; }\n\n[ \\t\\r\\n]+    /* eat up whitespace */\n\\#[^\\r\\n]*    /* single-line comments */\n\\/\\*([^*]|\\*[^\\/])*\\*\\/  /* long comments */\n\n.           return yytext[0];\n\n\n%%\n\n\nnamespace nix {\n\n/* Horrible, disgusting hack: allow the parser to set the scanner\n   start condition back to STRING.  Necessary in interpolations like\n   \"foo${expr}bar\"; after the close brace we have to go back to the\n   STRING state. */\nvoid backToString(yyscan_t scanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t *) scanner;\n    BEGIN(STRING);\n}\n\nvoid backToIndString(yyscan_t scanner)\n{\n    struct yyguts_t * yyg = (struct yyguts_t *) scanner;\n    BEGIN(IND_STRING);\n}\n\n}\n"
  },
  {
    "path": "flake.nix",
    "content": "{\n  description = \"A Haskell re-implementation of the Nix expression language\";\n\n  inputs = {\n    nixpkgs.follows = \"haskellNix/nixpkgs-unstable\";\n    nix.url = \"github:NixOS/nix\";\n    haskellNix.url = \"github:input-output-hk/haskell.nix\";\n    flake-utils.url = \"github:numtide/flake-utils\";\n  };\n\n  outputs = { self, nixpkgs, nix, flake-utils, haskellNix }:\n    flake-utils.lib.eachDefaultSystem (system:\n      let\n        pkgs = import nixpkgs {\n          inherit system overlays;\n          inherit (haskellNix) config;\n        };\n        flake = pkgs.hnix.flake {\n        };\n        overlays = [ haskellNix.overlay\n          (final: prev: {\n            hnix =\n              final.haskell-nix.project' {\n                src = ./.;\n                supportHpack = true;\n                compiler-nix-name = \"ghc910\";\n                # packageRoot = pkgs.runCommand \"hnix-src\" {} ''\n                #   cp -r ${./.} $out\n                #   chmod -R +w $out\n                #   cp -r ${nix} $out/data/nix\n                # '';\n                shell = {\n                  tools = {\n                    cabal = {};\n                    hlint = {};\n                    haskell-language-server = {};\n                  };\n                  buildInputs = with pkgs; [\n                    haskellPackages.fourmolu\n                    pkg-config\n                    shellcheck\n                    shfmt\n                    lefthook\n                  ];\n                  withHoogle = false;\n                };\n                modules = [{\n                  packages.hnix.doCheck = false;\n                  # enableLibraryProfiling = true;\n                  # enableProfiling = true;\n                }];\n              };\n          })\n        ];\n      in flake // {\n        packages.default = flake.packages.\"hnix:exe:hnix\";\n\n        checks = (flake.checks or {}) // {\n          formatting = pkgs.runCommand \"check-formatting\" {\n            nativeBuildInputs = [\n              pkgs.haskellPackages.fourmolu\n              pkgs.findutils\n            ];\n          } ''\n            cd ${./.}\n            find src main tests benchmarks -name '*.hs' \\\n              -exec fourmolu --mode check {} +\n            touch $out\n          '';\n\n          hlint = pkgs.runCommand \"check-hlint\" {\n            nativeBuildInputs = [ pkgs.hlint ];\n          } ''\n            cd ${./.}\n            hlint src/ main/ tests/ benchmarks/\n            touch $out\n          '';\n\n          shellcheck = pkgs.runCommand \"check-shellcheck\" {\n            nativeBuildInputs = [ pkgs.shellcheck ];\n          } ''\n            cd ${./.}\n            shellcheck build.sh\n            touch $out\n          '';\n\n          shell-formatting = pkgs.runCommand \"check-shell-formatting\" {\n            nativeBuildInputs = [ pkgs.shfmt ];\n          } ''\n            cd ${./.}\n            shfmt -d build.sh\n            touch $out\n          '';\n        };\n      });\n}\n\n"
  },
  {
    "path": "hnix.cabal",
    "content": "cabal-version:  2.2\nname:           hnix\nversion:        0.17.0\nsynopsis:       Haskell implementation of the Nix language\ndescription:    Haskell implementation of the Nix language.\ncategory:       System, Data, Nix\nhomepage:       https://github.com/haskell-nix/hnix#readme\nbug-reports:    https://github.com/haskell-nix/hnix/issues\nauthor:         John Wiegley\nmaintainer:     johnw@newartisans.com\nlicense:        BSD-3-Clause\nlicense-file:   License\nbuild-type:     Simple\ndata-dir:       data/\nextra-source-files:\n  ChangeLog.md\n  ReadMe.md\n  License\n  data/nix/tests/lang/binary-data\n  data/nix/tests/lang/data\n  data/nix/tests/lang/dir1/a.nix\n  data/nix/tests/lang/dir2/a.nix\n  data/nix/tests/lang/dir2/b.nix\n  data/nix/tests/lang/dir3/a.nix\n  data/nix/tests/lang/dir3/b.nix\n  data/nix/tests/lang/dir3/c.nix\n  data/nix/tests/lang/dir4/a.nix\n  data/nix/tests/lang/dir4/c.nix\n  data/nix/tests/lang/eval-fail-abort.nix\n  data/nix/tests/lang/eval-fail-assert.nix\n  data/nix/tests/lang/eval-fail-bad-antiquote-1.nix\n  data/nix/tests/lang/eval-fail-bad-antiquote-2.nix\n  data/nix/tests/lang/eval-fail-bad-antiquote-3.nix\n  data/nix/tests/lang/eval-fail-blackhole.nix\n  data/nix/tests/lang/eval-fail-deepseq.nix\n  data/nix/tests/lang/eval-fail-hashfile-missing.nix\n  data/nix/tests/lang/eval-fail-missing-arg.nix\n  data/nix/tests/lang/eval-fail-path-slash.nix\n  data/nix/tests/lang/eval-fail-remove.nix\n  data/nix/tests/lang/eval-fail-scope-5.nix\n  data/nix/tests/lang/eval-fail-seq.nix\n  data/nix/tests/lang/eval-fail-substring.nix\n  data/nix/tests/lang/eval-fail-to-path.nix\n  data/nix/tests/lang/eval-fail-undeclared-arg.nix\n  data/nix/tests/lang/eval-okay-any-all.exp\n  data/nix/tests/lang/eval-okay-any-all.nix\n  data/nix/tests/lang/eval-okay-arithmetic.exp\n  data/nix/tests/lang/eval-okay-arithmetic.nix\n  data/nix/tests/lang/eval-okay-attrnames.exp\n  data/nix/tests/lang/eval-okay-attrnames.nix\n  data/nix/tests/lang/eval-okay-attrs2.exp\n  data/nix/tests/lang/eval-okay-attrs2.nix\n  data/nix/tests/lang/eval-okay-attrs3.exp\n  data/nix/tests/lang/eval-okay-attrs3.nix\n  data/nix/tests/lang/eval-okay-attrs4.exp\n  data/nix/tests/lang/eval-okay-attrs4.nix\n  data/nix/tests/lang/eval-okay-attrs5.exp\n  data/nix/tests/lang/eval-okay-attrs5.nix\n  data/nix/tests/lang/eval-okay-attrs.exp\n  data/nix/tests/lang/eval-okay-attrs.nix\n  data/nix/tests/lang/eval-okay-autoargs.exp\n  data/nix/tests/lang/eval-okay-autoargs.flags\n  data/nix/tests/lang/eval-okay-autoargs.nix\n  data/nix/tests/lang/eval-okay-backslash-newline-1.exp\n  data/nix/tests/lang/eval-okay-backslash-newline-1.nix\n  data/nix/tests/lang/eval-okay-backslash-newline-2.exp\n  data/nix/tests/lang/eval-okay-backslash-newline-2.nix\n  data/nix/tests/lang/eval-okay-builtins-add.exp\n  data/nix/tests/lang/eval-okay-builtins-add.nix\n  data/nix/tests/lang/eval-okay-builtins.exp\n  data/nix/tests/lang/eval-okay-builtins.nix\n  data/nix/tests/lang/eval-okay-callable-attrs.exp\n  data/nix/tests/lang/eval-okay-callable-attrs.nix\n  data/nix/tests/lang/eval-okay-catattrs.exp\n  data/nix/tests/lang/eval-okay-catattrs.nix\n  data/nix/tests/lang/eval-okay-closure.exp.xml\n  data/nix/tests/lang/eval-okay-closure.nix\n  data/nix/tests/lang/eval-okay-comments.exp\n  data/nix/tests/lang/eval-okay-comments.nix\n  data/nix/tests/lang/eval-okay-concat.exp\n  data/nix/tests/lang/eval-okay-concatmap.exp\n  data/nix/tests/lang/eval-okay-concatmap.nix\n  data/nix/tests/lang/eval-okay-concat.nix\n  data/nix/tests/lang/eval-okay-concatstringssep.exp\n  data/nix/tests/lang/eval-okay-concatstringssep.nix\n  data/nix/tests/lang/eval-okay-context.exp\n  data/nix/tests/lang/eval-okay-context-introspection.exp\n  data/nix/tests/lang/eval-okay-context-introspection.nix\n  data/nix/tests/lang/eval-okay-context.nix\n  data/nix/tests/lang/eval-okay-curpos.exp\n  data/nix/tests/lang/eval-okay-curpos.nix\n  data/nix/tests/lang/eval-okay-deepseq.exp\n  data/nix/tests/lang/eval-okay-deepseq.nix\n  data/nix/tests/lang/eval-okay-delayed-with.exp\n  data/nix/tests/lang/eval-okay-delayed-with-inherit.exp\n  data/nix/tests/lang/eval-okay-delayed-with-inherit.nix\n  data/nix/tests/lang/eval-okay-delayed-with.nix\n  data/nix/tests/lang/eval-okay-dynamic-attrs-2.exp\n  data/nix/tests/lang/eval-okay-dynamic-attrs-2.nix\n  data/nix/tests/lang/eval-okay-dynamic-attrs-bare.exp\n  data/nix/tests/lang/eval-okay-dynamic-attrs-bare.nix\n  data/nix/tests/lang/eval-okay-dynamic-attrs.exp\n  data/nix/tests/lang/eval-okay-dynamic-attrs.nix\n  data/nix/tests/lang/eval-okay-elem.exp\n  data/nix/tests/lang/eval-okay-elem.nix\n  data/nix/tests/lang/eval-okay-empty-args.exp\n  data/nix/tests/lang/eval-okay-empty-args.nix\n  data/nix/tests/lang/eval-okay-eq-derivations.exp\n  data/nix/tests/lang/eval-okay-eq-derivations.nix\n  data/nix/tests/lang/eval-okay-eq.exp.disabled\n  data/nix/tests/lang/eval-okay-eq.nix\n  data/nix/tests/lang/eval-okay-filter.exp\n  data/nix/tests/lang/eval-okay-filter.nix\n  data/nix/tests/lang/eval-okay-flatten.exp\n  data/nix/tests/lang/eval-okay-flatten.nix\n  data/nix/tests/lang/eval-okay-float.exp\n  data/nix/tests/lang/eval-okay-float.nix\n  data/nix/tests/lang/eval-okay-fromjson.exp\n  data/nix/tests/lang/eval-okay-fromjson.nix\n  data/nix/tests/lang/eval-okay-fromTOML.exp\n  data/nix/tests/lang/eval-okay-fromTOML.nix\n  data/nix/tests/lang/eval-okay-functionargs.exp.xml\n  data/nix/tests/lang/eval-okay-functionargs.nix\n  data/nix/tests/lang/eval-okay-getattrpos.exp\n  data/nix/tests/lang/eval-okay-getattrpos.nix\n  data/nix/tests/lang/eval-okay-getattrpos-undefined.exp\n  data/nix/tests/lang/eval-okay-getattrpos-undefined.nix\n  data/nix/tests/lang/eval-okay-getenv.exp\n  data/nix/tests/lang/eval-okay-getenv.nix\n  data/nix/tests/lang/eval-okay-hash.exp\n  data/nix/tests/lang/eval-okay-hashfile.exp\n  data/nix/tests/lang/eval-okay-hashfile.nix\n  data/nix/tests/lang/eval-okay-hashstring.exp\n  data/nix/tests/lang/eval-okay-hashstring.nix\n  data/nix/tests/lang/eval-okay-if.exp\n  data/nix/tests/lang/eval-okay-if.nix\n  data/nix/tests/lang/eval-okay-import.exp\n  data/nix/tests/lang/eval-okay-import.nix\n  data/nix/tests/lang/eval-okay-ind-string.exp\n  data/nix/tests/lang/eval-okay-ind-string.nix\n  data/nix/tests/lang/eval-okay-let.exp\n  data/nix/tests/lang/eval-okay-let.nix\n  data/nix/tests/lang/eval-okay-list.exp\n  data/nix/tests/lang/eval-okay-list.nix\n  data/nix/tests/lang/eval-okay-listtoattrs.exp\n  data/nix/tests/lang/eval-okay-listtoattrs.nix\n  data/nix/tests/lang/eval-okay-logic.exp\n  data/nix/tests/lang/eval-okay-logic.nix\n  data/nix/tests/lang/eval-okay-mapattrs.exp\n  data/nix/tests/lang/eval-okay-mapattrs.nix\n  data/nix/tests/lang/eval-okay-map.exp\n  data/nix/tests/lang/eval-okay-map.nix\n  data/nix/tests/lang/eval-okay-nested-with.exp\n  data/nix/tests/lang/eval-okay-nested-with.nix\n  data/nix/tests/lang/eval-okay-new-let.exp\n  data/nix/tests/lang/eval-okay-new-let.nix\n  data/nix/tests/lang/eval-okay-null-dynamic-attrs.exp\n  data/nix/tests/lang/eval-okay-null-dynamic-attrs.nix\n  data/nix/tests/lang/eval-okay-overrides.exp\n  data/nix/tests/lang/eval-okay-overrides.nix\n  data/nix/tests/lang/eval-okay-partition.exp\n  data/nix/tests/lang/eval-okay-partition.nix\n  data/nix/tests/lang/eval-okay-pathexists.exp\n  data/nix/tests/lang/eval-okay-pathexists.nix\n  data/nix/tests/lang/eval-okay-path.nix\n  data/nix/tests/lang/eval-okay-patterns.exp\n  data/nix/tests/lang/eval-okay-patterns.nix\n  data/nix/tests/lang/eval-okay-readDir.exp\n  data/nix/tests/lang/eval-okay-readDir.nix\n  data/nix/tests/lang/eval-okay-readfile.exp\n  data/nix/tests/lang/eval-okay-readfile.nix\n  data/nix/tests/lang/eval-okay-redefine-builtin.exp\n  data/nix/tests/lang/eval-okay-redefine-builtin.nix\n  data/nix/tests/lang/eval-okay-regex-match.exp\n  data/nix/tests/lang/eval-okay-regex-match.nix\n  data/nix/tests/lang/eval-okay-regex-split.exp\n  data/nix/tests/lang/eval-okay-regex-split.nix\n  data/nix/tests/lang/eval-okay-remove.exp\n  data/nix/tests/lang/eval-okay-remove.nix\n  data/nix/tests/lang/eval-okay-replacestrings.exp\n  data/nix/tests/lang/eval-okay-replacestrings.nix\n  data/nix/tests/lang/eval-okay-scope-1.exp\n  data/nix/tests/lang/eval-okay-scope-1.nix\n  data/nix/tests/lang/eval-okay-scope-2.exp\n  data/nix/tests/lang/eval-okay-scope-2.nix\n  data/nix/tests/lang/eval-okay-scope-3.exp\n  data/nix/tests/lang/eval-okay-scope-3.nix\n  data/nix/tests/lang/eval-okay-scope-4.exp\n  data/nix/tests/lang/eval-okay-scope-4.nix\n  data/nix/tests/lang/eval-okay-scope-6.exp\n  data/nix/tests/lang/eval-okay-scope-6.nix\n  data/nix/tests/lang/eval-okay-scope-7.exp\n  data/nix/tests/lang/eval-okay-scope-7.nix\n  data/nix/tests/lang/eval-okay-search-path.exp\n  data/nix/tests/lang/eval-okay-search-path.flags\n  data/nix/tests/lang/eval-okay-search-path.nix\n  data/nix/tests/lang/eval-okay-seq.exp\n  data/nix/tests/lang/eval-okay-seq.nix\n  data/nix/tests/lang/eval-okay-sort.exp\n  data/nix/tests/lang/eval-okay-sort.nix\n  data/nix/tests/lang/eval-okay-splitversion.exp\n  data/nix/tests/lang/eval-okay-splitversion.nix\n  data/nix/tests/lang/eval-okay-string.exp\n  data/nix/tests/lang/eval-okay-string.nix\n  data/nix/tests/lang/eval-okay-strings-as-attrs-names.exp\n  data/nix/tests/lang/eval-okay-strings-as-attrs-names.nix\n  data/nix/tests/lang/eval-okay-substring.exp\n  data/nix/tests/lang/eval-okay-substring.nix\n  data/nix/tests/lang/eval-okay-tail-call-1.exp-disabled\n  data/nix/tests/lang/eval-okay-tail-call-1.nix\n  data/nix/tests/lang/eval-okay-tojson.exp\n  data/nix/tests/lang/eval-okay-tojson.nix\n  data/nix/tests/lang/eval-okay-toxml2.exp\n  data/nix/tests/lang/eval-okay-toxml2.nix\n  data/nix/tests/lang/eval-okay-toxml.exp\n  data/nix/tests/lang/eval-okay-toxml.nix\n  data/nix/tests/lang/eval-okay-tryeval.exp\n  data/nix/tests/lang/eval-okay-tryeval.nix\n  data/nix/tests/lang/eval-okay-types.exp\n  data/nix/tests/lang/eval-okay-types.nix\n  data/nix/tests/lang/eval-okay-versions.exp\n  data/nix/tests/lang/eval-okay-versions.nix\n  data/nix/tests/lang/eval-okay-with.exp\n  data/nix/tests/lang/eval-okay-with.nix\n  data/nix/tests/lang/eval-okay-xml.exp.xml\n  data/nix/tests/lang/eval-okay-xml.nix\n  data/nix/tests/lang/imported2.nix\n  data/nix/tests/lang/imported.nix\n  data/nix/tests/lang/lib.nix\n  data/nix/tests/lang/parse-fail-dup-attrs-1.nix\n  data/nix/tests/lang/parse-fail-dup-attrs-2.nix\n  data/nix/tests/lang/parse-fail-dup-attrs-3.nix\n  data/nix/tests/lang/parse-fail-dup-attrs-4.nix\n  data/nix/tests/lang/parse-fail-dup-attrs-7.nix\n  data/nix/tests/lang/parse-fail-dup-formals.nix\n  data/nix/tests/lang/parse-fail-mixed-nested-attrs1.nix\n  data/nix/tests/lang/parse-fail-mixed-nested-attrs2.nix\n  data/nix/tests/lang/parse-fail-patterns-1.nix\n  data/nix/tests/lang/parse-fail-regression-20060610.nix\n  data/nix/tests/lang/parse-fail-uft8.nix\n  data/nix/tests/lang/parse-fail-undef-var-2.nix\n  data/nix/tests/lang/parse-fail-undef-var.nix\n  data/nix/tests/lang/parse-okay-1.nix\n  data/nix/tests/lang/parse-okay-crlf.nix\n  data/nix/tests/lang/parse-okay-dup-attrs-5.nix\n  data/nix/tests/lang/parse-okay-dup-attrs-6.nix\n  data/nix/tests/lang/parse-okay-mixed-nested-attrs-1.nix\n  data/nix/tests/lang/parse-okay-mixed-nested-attrs-2.nix\n  data/nix/tests/lang/parse-okay-mixed-nested-attrs-3.nix\n  data/nix/tests/lang/parse-okay-regression-20041027.nix\n  data/nix/tests/lang/parse-okay-regression-751.nix\n  data/nix/tests/lang/parse-okay-subversion.nix\n  data/nix/tests/lang/parse-okay-url.nix\n  data/nix/tests/lang/readDir/bar\n  data/nix/tests/lang/readDir/foo/git-hates-directories\n  data/nixpkgs-all-packages.nix\n  data/let-comments.nix\n  data/let-comments-multiline.nix\n  data/simple-pretty.nix\n  data/simple.nix\n  data/nixpkgs-all-packages-pretty.nix\n  data/let.nix\n  tests/eval-compare/builtins.appendContext.nix\n  tests/eval-compare/builtins.eq-bottom-00.nix\n  tests/eval-compare/builtins.fetchurl-01.nix\n  tests/eval-compare/builtins.fromJSON-01.nix\n  tests/eval-compare/builtins.getContext.nix\n  tests/eval-compare/builtins.lessThan-01.nix\n  tests/eval-compare/builtins.mapAttrs-01.nix\n  tests/eval-compare/builtins.pathExists.nix\n  tests/eval-compare/builtins.replaceStrings-01.nix\n  tests/eval-compare/builtins.split-01.nix\n  tests/eval-compare/builtins.split-02.nix\n  tests/eval-compare/builtins.split-03.nix\n  tests/eval-compare/builtins.split-04.nix\n  tests/eval-compare/builtins.string.store.nix\n  tests/eval-compare/builtins.toJSON.nix\n  tests/eval-compare/current-system.nix\n  tests/eval-compare/ellipsis.nix\n  tests/eval-compare/ind-string-01.nix\n  tests/eval-compare/ind-string-02.nix\n  tests/eval-compare/ind-string-03.nix\n  tests/eval-compare/ind-string-04.nix\n  tests/eval-compare/ind-string-05.nix\n  tests/eval-compare/ind-string-06.nix\n  tests/eval-compare/ind-string-07.nix\n  tests/eval-compare/ind-string-08.nix\n  tests/eval-compare/ind-string-09.nix\n  tests/eval-compare/ind-string-10.nix\n  tests/eval-compare/ind-string-11.nix\n  tests/eval-compare/ind-string-12.nix\n  tests/eval-compare/ind-string-13.nix\n  tests/eval-compare/ind-string-14.nix\n  tests/eval-compare/ind-string-15.nix\n  tests/eval-compare/ind-string-16.nix\n  tests/eval-compare/ind-string-17.nix\n  tests/eval-compare/paths-01.nix\n  tests/eval-compare/placeholder.nix\n  tests/files/attrs.nix\n  tests/files/callLibs.nix\n  tests/files/eighty.nix\n  tests/files/file.nix\n  tests/files/file2.nix\n  tests/files/findFile.nix\n  tests/files/force.nix\n  tests/files/goodbye.nix\n  tests/files/hello.nix\n  tests/files/hello2.nix\n  tests/files/if-then.nix\n  tests/files/lint.nix\n  tests/files/loop.nix\n  tests/files/test.nix\n  tests/files/with.nix\n\nsource-repository head\n  type: git\n  location: https://github.com/haskell-nix/hnix\n\nflag optimize\n  description: Enable all optimization flags\n  manual: True\n  default: True\n\nflag profiling\n  description: Enable profiling\n  manual: True\n  default: False\n\ncommon shared\n  default-language: Haskell2010\n  default-extensions:\n      NoImplicitPrelude\n    , OverloadedStrings\n    , DeriveGeneric\n    , DeriveDataTypeable\n    , DeriveFunctor\n    , DeriveFoldable\n    , DeriveTraversable\n    , DeriveLift\n    , FlexibleContexts\n    , FlexibleInstances\n    , ScopedTypeVariables\n    , StandaloneDeriving\n    , TypeApplications\n    , TypeSynonymInstances\n    , InstanceSigs\n    , MultiParamTypeClasses\n    , TupleSections\n    , LambdaCase\n    , BangPatterns\n    , ViewPatterns\n  build-depends:\n      base >= 4.12 && < 5\n    , data-default-class >= 0.1.2 && < 0.3\n    , data-fix >= 0.3.0 && < 0.4\n    , exceptions >= 0.10.0 && < 0.11\n    , filepath >= 1.4.2 && < 1.6\n    , optparse-applicative >= 0.14.3 && < 0.19\n    , relude >= 1.0.0 && < 1.3\n    , serialise >= 0.2.1 && < 0.3\n    , template-haskell >= 2.13 && < 2.23\n    , time >= 1.8.0 && < 1.9 || >= 1.9.3 && < 1.13\n  ghc-options:\n    -Wall\n    -Wno-incomplete-uni-patterns\n    -fprint-potential-instances\n  if flag(optimize)\n    default-extensions:\n      ApplicativeDo\n    ghc-options:\n      -O2\n      -fexpose-all-unfoldings\n      -fspecialise-aggressively\n  -- if !flag(profiling)\n  --   build-depends:\n  --       ghc-datasize\n\nlibrary\n  import: shared\n  exposed-modules:\n    Nix\n    Nix.Prelude\n    Nix.Utils\n    Nix.Atoms\n    Nix.Builtins\n    Nix.Cache\n    Nix.Cited\n    Nix.Cited.Basic\n    Nix.Context\n    Nix.Convert\n    Nix.Effects\n    Nix.Effects.Basic\n    Nix.Effects.Derivation\n    Nix.Eval\n    Nix.Exec\n    Nix.Expr\n    Nix.Expr.Shorthands\n    Nix.Expr.Strings\n    Nix.Expr.Types\n    Nix.Expr.Types.Annotated\n    Nix.Frames\n    Nix.Fresh\n    Nix.Fresh.Basic\n    Nix.Json\n    Nix.Lint\n    Nix.Normal\n    Nix.Options\n    Nix.Options.Parser\n    Nix.Parser\n    Nix.Pretty\n    Nix.Reduce\n    Nix.Render\n    Nix.Render.Frame\n    Nix.Scope\n    Nix.Standard\n    Nix.String\n    Nix.String.Coerce\n    Nix.TH\n    Nix.Thunk\n    Nix.Thunk.Basic\n    Nix.Type.Assumption\n    Nix.Type.Env\n    Nix.Type.Infer\n    Nix.Type.Type\n    Nix.Utils.Fix1\n    Nix.Value\n    Nix.Value.Equal\n    Nix.Value.Monad\n    Nix.Var\n    Nix.XML\n  other-modules:\n    Paths_hnix\n    Nix.Unused\n  autogen-modules:\n    Paths_hnix\n  hs-source-dirs:\n    src\n  build-depends:\n      aeson >= 1.4.2 && < 1.6 || >= 2.0 && < 2.3\n    , array >= 0.4 && < 0.7\n    , base16-bytestring >= 0.1.1 && < 1.1\n    , binary >= 0.8.5 && < 0.9\n    , bytestring >= 0.10.8 && < 0.13\n    , crypton\n    , cryptonite\n    , memory\n    , comonad >= 5.0.4 && < 5.2\n    , containers >= 0.5.11.0 && < 0.8\n    , deepseq >= 1.4.3 && <1.6\n    , dependent-sum >= 0.7 && < 0.8\n    , deriving-compat >= 0.3 && < 0.7\n    , directory >= 1.3.1 && < 1.5\n    , extra >= 1.7 && < 1.9\n    , free >= 5.1 && < 5.3\n    , gitrev >= 1.1.0 && < 1.4\n    , hashable >= 1.2.5 && < 1.5\n    , hashing >= 0.1.0 && < 0.2\n    , hnix-store-core >= 0.6.0 && < 0.9\n    , hnix-store-nar >= 0.1.0 && < 0.2\n    , hnix-store-remote >= 0.6.0 && < 0.9\n    , http-client >= 0.5.14 && < 0.6 || >= 0.6.4 && < 0.8\n    , http-client-tls >= 0.3.5 && < 0.4\n    , http-types >= 0.12.2 && < 0.14\n    , lens-family >= 1.2.2 && < 2.2\n    , lens-family-core >= 1.2.2 && < 2.2\n    , lens-family-th >= 0.5.0 && < 0.6\n    , logict >= 0.6.0 && < 0.7 || >= 0.7.0.2 && < 0.9\n    , megaparsec >= 7.0 && < 9.6\n    , monad-control >= 1.0.2 && < 1.1\n    , monadlist >= 0.0.2 && < 0.1\n    , mtl >= 2.2.2 && < 2.4\n    , neat-interpolation >= 0.4 && < 0.7\n    , parser-combinators >= 1.0.1 && < 1.4\n    , pretty-show >= 1.9.5 && < 1.11\n    , prettyprinter >= 1.7.0 && < 1.8\n    , process >= 1.6.3 && < 1.7\n    , ref-tf >= 0.5 && < 0.6\n    , regex-tdfa >= 1.2.3 && < 1.4\n    , scientific >= 0.3.6 && < 0.5\n    , semialign >= 1.2 && < 1.4\n    , some >= 1.0.1 && < 1.1\n    , split >= 0.2.3 && < 0.3\n    , syb >= 0.7 && < 0.8\n    -- provides:\n    --   * compat instances for old versions of TH for old GHCs\n    --   * orphan instances for TH missing instances\n    -- aka Lift Text, Bytestring, Vector, Containers,\n    -- we use Lift Text particulrarly for GHC 8.6\n    , th-lift-instances >= 0.1 && < 0.2\n    , text >= 1.2.3 && < 2.2\n    , these >= 1.0.1 && < 1.3\n    , transformers >= 0.5.5 && < 0.7\n    , transformers-base >= 0.4.5 && < 0.5\n    , unix-compat >= 0.4.3 && < 0.8\n    , unordered-containers >= 0.2.14 && < 0.3\n    , vector >= 0.12.0 && < 0.14\n    , xml >= 1.3.14 && < 1.4\n\nexecutable hnix\n  import: shared\n  hs-source-dirs:\n    main\n  main-is: Main.hs\n  other-modules:\n    Repl\n    Paths_hnix\n  autogen-modules:\n    Paths_hnix\n  build-depends:\n      hnix\n    , aeson\n    , comonad\n    , containers\n    , deepseq\n    , free\n    , haskeline >= 0.8.0.0 && < 0.9\n    , pretty-show\n    , prettyprinter\n    , ref-tf\n    , repline >= 0.4.0.0 && < 0.5\n  if impl(ghc < 8.10)\n    -- GHC < 8.10 comes with haskeline < 0.8, which we don't support.\n    -- To simplify CI, we just disable the component.\n    buildable: False\n\ntest-suite hnix-tests\n  import: shared\n  type: exitcode-stdio-1.0\n  main-is: Main.hs\n  other-modules:\n    EvalTests\n    NixLanguageTests\n    ParserTests\n    PrettyParseTests\n    PrettyTests\n    ReduceExprTests\n    TestCommon\n  hs-source-dirs:\n    tests\n  build-depends:\n      hnix\n    , Diff\n    , Glob\n    , containers\n    , directory\n    , hedgehog\n    , megaparsec\n    , neat-interpolation\n    , pretty-show\n    , prettyprinter\n    , process\n    , split\n    , tasty\n    , tasty-hedgehog\n    , tasty-hunit\n    , tasty-th\n    , unix-compat\n\nbenchmark hnix-benchmarks\n  import: shared\n  type: exitcode-stdio-1.0\n  main-is: Main.hs\n  other-modules:\n    ParserBench\n  hs-source-dirs:\n    benchmarks\n  build-depends:\n    hnix\n    , criterion\n"
  },
  {
    "path": "hydra.json",
    "content": "{\n  \"enabled\": 1,\n  \"hidden\": true,\n  \"description\": \"Jobsets\",\n  \"nixexprinput\": \"src\",\n  \"nixexprpath\": \"jobsets.nix\",\n  \"checkinterval\": 300,\n  \"schedulingshares\": 100,\n  \"enableemail\": false,\n  \"emailoverride\": \"\",\n  \"keepnr\": 10,\n  \"inputs\": {\n    \"src\": {\n      \"type\": \"git\",\n      \"value\": \"https://github.com/haskell-nix/hnix.git master 1\",\n      \"emailresponsible\": false\n    },\n    \"nixpkgs\": {\n      \"type\": \"git\",\n      \"value\": \"https://github.com/NixOS/nixpkgs-channels nixos-unstable\",\n      \"emailresponsible\": false\n    },\n    \"prs\": {\n      \"type\": \"githubpulls\",\n      \"value\": \"haskell-nix hnix\",\n      \"emailresponsible\": false\n    }\n  }\n}\n"
  },
  {
    "path": "jobsets.nix",
    "content": "{ prs }:\n\nlet\n  self = import ./. {};\n  pkgs = self.nixpkgs;\n  mkFetchGithub = value: {\n    inherit value;\n    type = \"git\";\n    emailresponsible = false;\n  };\nin\nwith pkgs.lib;\nlet\n  defaults = jobs: {\n    inherit (jobs) description;\n    enabled = 1;\n    hidden = false;\n    keepnr = 10;\n    schedulingshares = 100;\n    checkinterval = 120;\n    enableemail = false;\n    emailoverride = \"\";\n    nixexprinput = \"hnix\";\n    nixexprpath = \"release.nix\";\n    inputs = jobs.inputs // {\n      nixpkgs = {\n        type = \"git\";\n        value = \"https://github.com/NixOS/nixpkgs-channels nixos-unstable\";\n        emailresponsible = false;\n      };\n    };\n  };\n  branchJobset = branch: defaults {\n    description = \"hnix-${branch}\";\n    inputs = {\n      hnix = {\n        value = \"https://github.com/haskell-nix/hnix ${branch}\";\n        type = \"git\";\n        emailresponsible = false;\n      };\n    };\n  };\n  makePr = num: info: {\n    name = \"hnix-pr-${num}\";\n    value = defaults {\n      description = \"#${num}: ${info.title}\";\n      inputs = {\n        hnix = {\n          #NOTE: This should really use \"pull/${num}/merge\"; however, GitHub's\n          #status checks only operate on PR heads.  This creates a race\n          #condition, which can currently only be solved by requiring PRs to be\n          #up to date before they're merged.  See\n          #https://github.com/isaacs/github/issues/1002\n          value = \"https://github.com/haskell-nix/hnix pull/${num}/head 1\";\n          type = \"git\";\n          emailresponsible = false;\n        };\n      };\n    };\n  };\n  processedPrs = mapAttrs' makePr (builtins.fromJSON (builtins.readFile prs));\n  jobsetsAttrs = processedPrs //\n    genAttrs [\"master\" \"pending\"] branchJobset;\nin {\n  jobsets = pkgs.writeText \"spec.json\" (builtins.toJSON jobsetsAttrs);\n}\n"
  },
  {
    "path": "lefthook.yml",
    "content": "pre-commit:\n  parallel: true\n  commands:\n    fourmolu:\n      glob: \"*.hs\"\n      run: \"command -v fourmolu > /dev/null && fourmolu --mode check {staged_files} || echo 'fourmolu not found (run: nix develop)'\"\n    hlint:\n      glob: \"*.hs\"\n      run: \"command -v hlint > /dev/null && hlint {staged_files} || echo 'hlint not found (run: nix develop)'\"\n    shellcheck:\n      glob: \"*.sh\"\n      run: \"command -v shellcheck > /dev/null && shellcheck {staged_files} || echo 'shellcheck not found (run: nix develop)'\"\n    shfmt:\n      glob: \"*.sh\"\n      run: \"command -v shfmt > /dev/null && shfmt -d {staged_files} || echo 'shfmt not found (run: nix develop)'\"\n\npre-push:\n  parallel: true\n  commands:\n    cabal-build-and-test:\n      glob: \"*.{hs,cabal}\"\n      run: \"cabal v2-build --ghc-options=-Werror 2>&1 && cabal v2-test 2>&1\"\n    nix-check:\n      glob: \"*.{hs,nix,cabal}\"\n      run: \"nix flake check --no-warn-dirty --allow-import-from-derivation 2>&1\"\n"
  },
  {
    "path": "main/Main.hs",
    "content": "{-# LANGUAGE MultiWayIf #-}\n{-# LANGUAGE RecordWildCards #-}\n{-# LANGUAGE TypeFamilies #-}\n\nmodule Main (main) where\n\nimport Control.Comonad (extract)\nimport qualified Control.Exception as Exception\nimport Control.Monad.Catch\nimport Control.Monad.Free\nimport Control.Monad.Ref (MonadRef (readRef))\nimport qualified Data.HashMap.Lazy as M\nimport qualified Data.Map as Map\nimport qualified Data.Text.IO as Text\nimport Data.Time\nimport GHC.Err (errorWithoutStackTrace)\nimport Nix hiding (force)\nimport Nix.Convert\nimport Nix.Eval\nimport Nix.Json\nimport Nix.Options.Parser\nimport Nix.Prelude\nimport Nix.Standard\nimport Nix.Thunk.Basic\nimport Nix.Type.Env (Env (..))\nimport qualified Nix.Type.Infer as HM\nimport Nix.Type.Type (Scheme)\nimport Nix.Value.Monad\nimport Options.Applicative hiding (ParserResult (..))\nimport Prettyprinter hiding (list)\nimport Prettyprinter.Render.Text (renderIO)\nimport Relude as Prelude (force)\nimport qualified Repl\nimport System.IO (hPutStrLn)\nimport Text.Show.Pretty (ppShow)\n\nmain :: IO ()\nmain =\n    do\n        currentTime <- getCurrentTime\n        opts <- execParser $ nixOptionsInfo currentTime\n\n        main' opts\n\nmain' :: Options -> IO ()\nmain' opts@Options{..} = runWithBasicEffectsIO opts execContentsFilesOrRepl\n  where\n    --  2021-07-15: NOTE: This logic should be weaved stronger through CLI options logic (OptParse-Applicative code)\n    -- As this logic is not stated in the CLI documentation, for example. So user has no knowledge of these.\n    execContentsFilesOrRepl :: StdIO\n    execContentsFilesOrRepl =\n        fromMaybe\n            loadFromCliFilePathList\n            $ loadBinaryCacheFile\n                <|> loadLiteralExpression\n                <|> loadExpressionFromFile\n      where\n        -- \\| The base case: read expressions from the last CLI directive (@[FILE]@) listed on the command line.\n        loadFromCliFilePathList :: StdIO\n        loadFromCliFilePathList =\n            case getFilePaths of\n                [] -> runRepl\n                [\"-\"] -> readExpressionFromStdin\n                _paths -> processSeveralFiles (coerce _paths)\n          where\n            -- \\| Fall back to running the REPL\n            runRepl = withEmptyNixContext Repl.main\n\n            readExpressionFromStdin =\n                processExpr =<< liftIO Text.getContents\n\n        processSeveralFiles :: [Path] -> StdIO\n        processSeveralFiles = traverse_ processFile\n          where\n            processFile path = handleResult (pure path) =<< parseNixFileLoc path\n\n        -- \\|  The `--read` option: load expression from a serialized file.\n        loadBinaryCacheFile :: Maybe StdIO\n        loadBinaryCacheFile =\n            ( \\(binaryCacheFile :: Path) ->\n                do\n                    let file = replaceExtension binaryCacheFile \"nixc\"\n                    processCLIOptions (pure file) =<< liftIO (readCache binaryCacheFile)\n            )\n                <$> getReadFrom\n\n        -- \\| The `--expr` option: read expression from the argument string\n        loadLiteralExpression :: Maybe StdIO\n        loadLiteralExpression = processExpr <$> getExpression\n\n        -- \\| The `--file` argument: read expressions from the files listed in the argument file\n        loadExpressionFromFile :: Maybe StdIO\n        loadExpressionFromFile =\n            -- We can start use Text as in the base case, requires changing Path -> Text\n            -- But that is a gradual process:\n            -- https://github.com/haskell-nix/hnix/issues/912\n            (processSeveralFiles . (coerce . toString <$>) . lines <=< liftIO)\n                . ( \\case\n                        \"-\" -> Text.getContents\n                        _fp -> readFile _fp\n                  )\n                <$> getFromFile\n\n    processExpr :: Text -> StdIO\n    processExpr = handleResult mempty . parseNixTextLoc\n\n    withEmptyNixContext = withNixContext mempty\n\n    --  2021-07-15: NOTE: @handleResult@ & @process@ - have atrocious size & compexity, they need to be decomposed & refactored.\n    handleResult mpath =\n        either\n            ( \\err ->\n                bool\n                    errorWithoutStackTrace\n                    (liftIO . hPutStrLn stderr)\n                    isIgnoreErrors\n                    $ \"Parse failed: \" <> show err\n            )\n            ( \\expr ->\n                do\n                    when isCheck $\n                        do\n                            expr' <- liftIO $ reduceExpr mpath expr\n                            either\n                                (\\err -> errorWithoutStackTrace $ \"Type error: \" <> ppShow err)\n                                ( liftIO\n                                    . putStrLn\n                                    . (<>) \"Type of expression: \"\n                                    . ppShow\n                                    . maybeToMonoid\n                                    . Map.lookup @VarName @[Scheme] \"it\"\n                                    . coerce\n                                )\n                                $ HM.inferTop mempty\n                                $ curry one \"it\"\n                                $ stripAnnotation expr'\n\n                    -- liftIO $ putStrLn $ runST $\n                    --     runLintM opts . renderSymbolic =<< lint opts expr\n\n                    catch (processCLIOptions mpath expr) $\n                        \\case\n                            NixException frames ->\n                                errorWithoutStackTrace . show\n                                    =<< renderFrames\n                                        @StdVal\n                                        @StdThun\n                                        frames\n\n                    when isRepl $\n                        withEmptyNixContext $\n                            bool\n                                Repl.main\n                                ((Repl.main' . pure) =<< nixEvalExprLoc (coerce mpath) expr)\n                                isEvaluate\n            )\n\n    --  2021-07-15: NOTE: Logic of CLI Option processing is scattered over several functions, needs to be consolicated.\n    processCLIOptions :: Maybe Path -> NExprLoc -> StdIO\n    processCLIOptions mpath expr\n        | isEvaluate =\n            if\n                | isTrace -> evaluateExprWith nixTracingEvalExprLoc expr\n                | Just path <- getReduce -> evaluateExprWith (reduction path . coerce) expr\n                | null getArg || null getArgstr -> evaluateExprWith nixEvalExprLoc expr\n                | otherwise -> processResult printer <=< nixEvalExprLoc (coerce mpath) $ expr\n        | isXml = fail \"Rendering expression trees to XML is not yet implemented\"\n        | isJson = fail \"Rendering expression trees to JSON is not implemented\"\n        | getVerbosity >= DebugInfo = liftIO . putStr . ppShow . stripAnnotation $ expr\n        | isCache, Just path <- mpath = liftIO . writeCache (replaceExtension path \"nixc\") $ expr\n        | isParseOnly = void . liftIO . Exception.evaluate . force $ expr\n        | otherwise =\n            liftIO\n                . renderIO\n                    stdout\n                . layoutPretty (LayoutOptions $ AvailablePerLine 80 0.4)\n                . prettyNix\n                . stripAnnotation\n                $ expr\n      where\n        evaluateExprWith evaluator = evaluateExpression (coerce mpath) evaluator printer\n\n        printer ::\n            StdVal ->\n            StdIO\n        printer\n            | isFinder = findAttrs <=< fromValue @(AttrSet StdVal)\n            | otherwise = printer'\n          where\n            -- 2021-05-27: NOTE: With naive fix of the #941\n            -- This is overall a naive printer implementation, as options should interact/respect one another.\n            -- A nice question: \"Should respect one another to what degree?\": Go full combinator way, for which\n            -- old Nix CLI is nototrious for (and that would mean to reimplement the old Nix CLI),\n            -- OR: https://github.com/haskell-nix/hnix/issues/172 and have some sane standart/default behaviour for (most) keys.\n            printer'\n                | isXml = out (ignoreContext . toXML) normalForm\n                | isJson = out (ignoreContext . mempty . toJSONNixString) normalForm\n                | isStrict = out (show . prettyNValue) normalForm\n                | isValues = out (show . prettyNValueProv) removeEffects\n                | otherwise = out (show . prettyNValue) removeEffects\n              where\n                out ::\n                    (b -> Text) ->\n                    (a -> StandardIO b) ->\n                    a ->\n                    StdIO\n                out transform val = liftIO . Text.putStrLn . transform <=< val\n\n            findAttrs ::\n                AttrSet StdVal ->\n                StdIO\n            findAttrs = go mempty\n              where\n                go :: Text -> AttrSet StdVal -> StdIO\n                go prefix s =\n                    traverse_\n                        ( \\(k, mv) ->\n                            do\n                                let\n                                    path = prefix <> k\n                                    (report, descend) = filterEntry path k\n                                when report $\n                                    do\n                                        liftIO $ Text.putStrLn path\n                                        when descend $\n                                            maybe\n                                                stub\n                                                ( \\case\n                                                    NVSet _ s' -> go (path <> \".\") s'\n                                                    _ -> stub\n                                                )\n                                                mv\n                        )\n                        =<< traverse\n                            ( \\(k, nv) ->\n                                (k,)\n                                    <$> free\n                                        ( \\(StdThunk (extract -> Thunk _ _ ref)) ->\n                                            do\n                                                let\n                                                    path = prefix <> k\n                                                    (_, descend) = filterEntry path k\n\n                                                val <- readRef @StandardIO ref\n                                                bool\n                                                    (pure Nothing)\n                                                    (forceEntry path nv)\n                                                    ( descend\n                                                        && deferred\n                                                            (const False)\n                                                            (const True)\n                                                            val\n                                                    )\n                                        )\n                                        (pure . pure . Free)\n                                        nv\n                            )\n                            (sortWith fst $ M.toList $ M.mapKeys coerce s)\n                  where\n                    filterEntry path k = case (path, k) of\n                        (\"stdenv\", \"stdenv\") -> (True, True)\n                        (_, \"stdenv\") -> (False, False)\n                        (_, \"out\") -> (True, False)\n                        (_, \"src\") -> (True, False)\n                        (_, \"mirrorsFile\") -> (True, False)\n                        (_, \"buildPhase\") -> (True, False)\n                        (_, \"builder\") -> (False, False)\n                        (_, \"drvPath\") -> (False, False)\n                        (_, \"outPath\") -> (False, False)\n                        (_, \"__impureHostDeps\") -> (False, False)\n                        (_, \"__sandboxProfile\") -> (False, False)\n                        (\"pkgs\", \"pkgs\") -> (True, True)\n                        (_, \"pkgs\") -> (False, False)\n                        (_, \"drvAttrs\") -> (False, False)\n                        _ -> (True, True)\n\n                    forceEntry ::\n                        (MonadValue a StandardIO) =>\n                        Text ->\n                        a ->\n                        StandardIO (Maybe a)\n                    forceEntry k v =\n                        catch\n                            (pure <$> demand v)\n                            fun\n                      where\n                        fun :: NixException -> StandardIO (Maybe a)\n                        fun (coerce -> frames) =\n                            do\n                                liftIO\n                                    . Text.putStrLn\n                                    . ((\"Exception forcing \" <> k <> \": \") <>)\n                                    . show\n                                    =<< renderFrames\n                                        @StdVal\n                                        @StdThun\n                                        frames\n                                pure Nothing\n\n    reduction path mpathToContext annExpr =\n        do\n            eres <-\n                withNixContext\n                    mpathToContext\n                    $ reducingEvalExpr\n                        evalContent\n                        mpathToContext\n                        annExpr\n            handleReduced path eres\n\n    handleReduced ::\n        (MonadThrow m, MonadIO m) =>\n        Path ->\n        (NExprLoc, Either SomeException (NValue t f m)) ->\n        m (NValue t f m)\n    handleReduced (coerce -> path) (expr', eres) =\n        do\n            liftIO $\n                do\n                    putStrLn $ \"Wrote sifted expression tree to \" <> path\n                    writeFile path $ show $ prettyNix $ stripAnnotation expr'\n            either throwM pure eres\n"
  },
  {
    "path": "main/Repl.hs",
    "content": "{- This code was authored by:\n\n     Stephen Diehl\n     Kwang Yul Seo <kwangyul.seo@gmail.com>\n\n   It was made available under the MIT license. See the src/Nix/Type\n   directory for more details.\n-}\n{-# LANGUAGE MultiWayIf #-}\n\nmodule Repl (\n    main,\n    main',\n) where\n\nimport Nix hiding (exec)\nimport Nix.Prelude hiding (state)\nimport Nix.Scope\nimport Nix.Value.Monad (demand)\n\nimport Data.Char (isSpace)\nimport qualified Data.HashMap.Lazy as M\nimport Data.List (dropWhileEnd)\nimport qualified Data.Text as Text\nimport qualified Data.Text.IO as Text\nimport Data.Version (showVersion)\nimport Paths_hnix (version)\n\nimport Control.Monad.Catch\n\nimport Prettyprinter (\n    Doc,\n    space,\n )\nimport qualified Prettyprinter\nimport qualified Prettyprinter.Render.Text as Prettyprinter\n\nimport System.Console.Haskeline.Completion (\n    Completion (isFinished),\n    completeWordWithPrev,\n    listFiles,\n    simpleCompletion,\n )\nimport System.Console.Repline (\n    Cmd,\n    CompleterStyle (Prefix),\n    CompletionFunc,\n    ExitDecision (Exit),\n    HaskelineT,\n    MultiLine (MultiLine, SingleLine),\n    evalRepl,\n )\nimport qualified System.Console.Repline as Console\nimport qualified System.Exit as Exit\nimport qualified System.IO.Error as Error\n\n-- | Repl entry point\nmain :: (MonadNix e t f m, MonadIO m, MonadMask m) => m ()\nmain = main' Nothing\n\n{- | Principled version allowing to pass initial value for context.\n\nPassed value is stored in context with \"input\" key.\n-}\nmain' :: (MonadNix e t f m, MonadIO m, MonadMask m) => Maybe (NValue t f m) -> m ()\nmain' iniVal =\n    do\n        s <- initState iniVal\n\n        evalStateT\n            ( evalRepl\n                banner\n                (cmd . fromString)\n                options\n                (pure commandPrefix)\n                (pure \"paste\")\n                completion\n                (rcFile *> greeter)\n                finalizer\n            )\n            s\n  where\n    commandPrefix = ':'\n\n    banner =\n        pure . \\case\n            SingleLine -> \"hnix> \"\n            MultiLine -> \"| \"\n\n    greeter =\n        liftIO $\n            putStrLn $\n                \"Welcome to hnix \"\n                    <> showVersion version\n                    <> \". For help type :help\\n\"\n    finalizer = do\n        liftIO $ putStrLn \"Goodbye.\"\n        pure Exit\n\n    rcFile =\n        do\n            f <- liftIO $ readFile \".hnixrc\" `catch` handleMissing\n\n            traverse_\n                ( ( \\case\n                        (prefixedCommand : xs) | Text.head prefixedCommand == commandPrefix ->\n                            do\n                                let\n                                    arguments = unwords xs\n                                    command = Text.tail prefixedCommand\n                                optMatcher command options arguments\n                        x -> cmd $ unwords x\n                  )\n                    . words\n                )\n                (lines f)\n\n    handleMissing e\n        | Error.isDoesNotExistError e = stub\n        | otherwise = throwM e\n\n    -- Replicated and slightly adjusted `optMatcher` from `System.Console.Repline`\n    -- which doesn't export it.\n    --  * @MonadIO m@ instead of @MonadHaskeline m@\n    --  * @putStrLn@ instead of @outputStrLn@\n    optMatcher ::\n        (MonadIO m) =>\n        Text ->\n        Console.Options m ->\n        Text ->\n        m ()\n    optMatcher s [] _ = liftIO $ Text.putStrLn $ \"No such command :\" <> s\n    optMatcher s ((x, m) : xs) args\n        | s `Text.isPrefixOf` fromString x = m $ toString args\n        | otherwise = optMatcher s xs args\n\n-- * Types\n\ndata IState t f m = IState\n    { replIt :: Maybe NExprLoc\n    -- ^ Last expression entered\n    , replCtx :: Scope (NValue t f m)\n    -- ^ Scope. Value environment.\n    , replCfg :: ReplConfig\n    -- ^ REPL configuration\n    }\n    deriving (Eq, Show)\n\ndata ReplConfig = ReplConfig\n    { cfgDebug :: Bool\n    , cfgStrict :: Bool\n    , cfgValues :: Bool\n    }\n    deriving (Eq, Show)\n\ndefReplConfig :: ReplConfig\ndefReplConfig =\n    ReplConfig\n        { cfgDebug = False\n        , cfgStrict = False\n        , cfgValues = False\n        }\n\n-- | Create initial IState for REPL\ninitState :: (MonadNix e t f m) => Maybe (NValue t f m) -> m (IState t f m)\ninitState mIni = do\n    builtins <- evalText \"builtins\"\n\n    let\n        scope =\n            coerce $\n                M.fromList $\n                    (\"builtins\", builtins) : fmap (\"input\",) (maybeToList mIni)\n\n    opts <- askOptions\n\n    pure $\n        IState\n            Nothing\n            scope\n            defReplConfig\n                { cfgStrict = isStrict opts\n                , cfgValues = isValues opts\n                }\n  where\n    evalText :: (MonadNix e t f m) => Text -> m (NValue t f m)\n    evalText expr =\n        either\n            (\\e -> fail $ toString $ \"Impossible happened: Unable to parse expression - '\" <> expr <> \"' fail was \" <> show e)\n            evalExprLoc\n            (parseNixTextLoc expr)\n\ntype Repl e t f m = HaskelineT (StateT (IState t f m) m)\n\n-- * Execution\n\nexec ::\n    forall e t f m.\n    (MonadNix e t f m, MonadIO m) =>\n    Bool ->\n    Text ->\n    Repl e t f m (Maybe (NValue t f m))\nexec update source =\n    do\n        -- Get the current interpreter state\n        state <- get\n\n        when (cfgDebug $ replCfg state) $ liftIO $ print state\n\n        -- Parser ( returns AST as `NExprLoc` )\n        case parseExprOrBinding source of\n            (Left err, _) ->\n                do\n                    liftIO $ print err\n                    pure Nothing\n            (Right expr, isBinding) ->\n                do\n                    -- Type Inference ( returns Typing Environment )\n                    --\n                    -- import qualified Nix.Type.Env                  as Env\n                    -- import           Nix.Type.Infer\n                    --\n                    -- let tyctx' = inferTop mempty [(\"repl\", stripAnnotation expr)]\n                    -- liftIO $ print tyctx'\n\n                    mVal <- lift $ lift $ try $ pushScope (replCtx state) (evalExprLoc expr)\n\n                    either\n                        ( \\(NixException frames) ->\n                            do\n                                lift $ lift $ liftIO . print =<< renderFrames @(NValue t f m) @t frames\n                                pure Nothing\n                        )\n                        ( \\val ->\n                            do\n                                -- Update the interpreter state\n                                when (update && isBinding) $ do\n                                    -- Set `replIt` to last entered expression\n                                    put state{replIt = pure expr}\n\n                                    -- If the result value is a set, update our context with it\n                                    case val of\n                                        NVSet _ (coerce -> scope) -> put state{replCtx = scope <> replCtx state}\n                                        _ -> stub\n\n                                pure $ pure val\n                        )\n                        mVal\n  where\n    -- If parsing fails, turn the input into singleton attribute set\n    -- and try again.\n    --\n    -- This allows us to handle assignments like @a = 42@\n    -- which get turned into @{ a = 42; }@\n    parseExprOrBinding i =\n        either\n            ( \\e ->\n                either\n                    (const (Left e, False)) -- return the first parsing failure\n                    (\\e' -> (pure e', True))\n                    (parseNixTextLoc $ toAttrSet i)\n            )\n            (\\expr -> (pure expr, False))\n            (parseNixTextLoc i)\n\n    toAttrSet i =\n        \"{\" <> i <> whenFalse \";\" (Text.isSuffixOf \";\" i) <> \"}\"\n\ncmd ::\n    (MonadNix e t f m, MonadIO m) =>\n    Text ->\n    Repl e t f m ()\ncmd source =\n    do\n        mVal <- exec True source\n        maybe\n            stub\n            printValue\n            mVal\n\nprintValue ::\n    (MonadNix e t f m, MonadIO m) =>\n    NValue t f m ->\n    Repl e t f m ()\nprintValue val = do\n    cfg <- replCfg <$> get\n    let\n        g :: (MonadIO m) => Doc ann0 -> m ()\n        g = liftIO . print\n\n    lift $\n        lift $\n            ( if\n                | cfgStrict cfg -> g . prettyNValue <=< normalForm\n                | cfgValues cfg -> g . prettyNValueProv <=< removeEffects\n                | otherwise -> g . prettyNValue <=< removeEffects\n            )\n                val\n\n-- * Commands\n\n-- | @:browse@ command\nbrowse ::\n    (MonadNix e t f m, MonadIO m) =>\n    Text ->\n    Repl e t f m ()\nbrowse _ =\n    do\n        state <- get\n        traverse_\n            ( \\(k, v) ->\n                do\n                    liftIO $ Text.putStr $ coerce k <> \" = \"\n                    printValue v\n            )\n            (M.toList $ coerce $ replCtx state)\n\n-- | @:load@ command\nload ::\n    (MonadNix e t f m, MonadIO m) =>\n    Path ->\n    Repl e t f m ()\nload path =\n    do\n        contents <-\n            liftIO $\n                readFile $\n                    trim path\n        void $ exec True contents\n  where\n    trim :: Path -> Path\n    trim = coerce . dropWhileEnd isSpace . dropWhile isSpace . coerce\n\n-- | @:type@ command\ntypeof ::\n    (MonadNix e t f m, MonadIO m) =>\n    Text ->\n    Repl e t f m ()\ntypeof src = do\n    state <- get\n    mVal <-\n        maybe\n            (exec False src)\n            (pure . pure)\n            (M.lookup (coerce src) (coerce $ replCtx state))\n\n    traverse_ printValueType mVal\n  where\n    printValueType = liftIO . Text.putStrLn <=< lift . lift . showValueType\n\n-- | @:quit@ command\nquit :: (MonadNix e t f m, MonadIO m) => a -> Repl e t f m ()\nquit _ = liftIO Exit.exitSuccess\n\n-- | @:set@ command\nsetConfig :: (MonadNix e t f m, MonadIO m) => Text -> Repl e t f m ()\nsetConfig args =\n    handlePresence\n        (liftIO $ Text.putStrLn \"No option to set specified\")\n        ( \\(x : _xs) ->\n            case filter ((== x) . helpSetOptionName) helpSetOptions of\n                [opt] -> modify (\\s -> s{replCfg = helpSetOptionFunction opt (replCfg s)})\n                _ -> liftIO $ Text.putStrLn \"No such option\"\n        )\n        $ words args\n\n-- * Interactive Shell\n\n-- | Prefix tab completer\ndefaultMatcher :: (MonadIO m) => [(String, CompletionFunc m)]\ndefaultMatcher =\n    one (\":load\", Console.fileCompleter)\n\ncompletion ::\n    (MonadNix e t f m, MonadIO m) =>\n    CompleterStyle (StateT (IState t f m) m)\ncompletion =\n    System.Console.Repline.Prefix\n        (completeWordWithPrev (pure '\\\\') separators completeFunc)\n        defaultMatcher\n  where\n    separators :: String\n    separators = \" \\t[(,=+*&|}#?>:\"\n\n{- | Main completion function\n\nHeavily inspired by Dhall Repl, with `algebraicComplete`\nadjusted to monadic variant able to `demand` thunks.\n-}\ncompleteFunc ::\n    forall e t f m.\n    (MonadNix e t f m, MonadIO m) =>\n    -- 2021-04-02: So far conversiton to Text here is not productive,\n    -- since Haskeline uses String of all this.\n    String ->\n    String ->\n    (StateT (IState t f m) m) [Completion]\ncompleteFunc reversedPrev word\n    -- Commands\n    | reversedPrev == \":\" =\n        pure . listCompletion $\n            toString . helpOptionName\n                <$> (helpOptions :: HelpOptions e t f m)\n    -- Files\n    | any (`isPrefixOf` word) [\"/\", \"./\", \"../\", \"~/\"] =\n        listFiles word\n    -- Attributes of sets in REPL context\n    | var : subFields <- Text.split (== '.') (fromString word)\n    , isPresent subFields =\n        do\n            state <- get\n            maybe\n                stub\n                ( \\binding ->\n                    do\n                        candidates <- lift $ algebraicComplete subFields binding\n                        pure $\n                            notFinished\n                                <$> listCompletion\n                                    ( toString . (var <>)\n                                        <$> candidates\n                                    )\n                )\n                (M.lookup (coerce var) $ coerce $ replCtx state)\n\n    -- Builtins, context variables\n    | otherwise =\n        do\n            state <- get\n            let\n                scopeHashMap :: HashMap VarName (NValue t f m)\n                scopeHashMap = coerce $ replCtx state\n                contextKeys :: [VarName]\n                contextKeys = M.keys scopeHashMap\n                builtins :: AttrSet (NValue t f m)\n                (Just (NVSet _ builtins)) = M.lookup \"builtins\" scopeHashMap\n                shortBuiltins :: [VarName]\n                shortBuiltins = M.keys builtins\n\n            pure $\n                listCompletion $\n                    toString\n                        <$> one \"__includes\"\n                            <> contextKeys\n                            <> shortBuiltins\n  where\n    listCompletion = fmap simpleCompletion . filter (word `isPrefixOf`)\n\n    notFinished x = x{isFinished = False}\n\n    algebraicComplete ::\n        (MonadNix e t f m) =>\n        [Text] ->\n        NValue t f m ->\n        m [Text]\n    algebraicComplete subFields val =\n        let\n            keys = fmap (\".\" <>) . M.keys\n\n            withMap m =\n                case subFields of\n                    [] -> pure $ keys m\n                    -- Stop on last subField (we care about the keys at this level)\n                    [_] -> pure $ keys m\n                    f : fs ->\n                        maybe\n                            stub\n                            ( (<<$>>)\n                                ((\".\" <> f) <>)\n                                . algebraicComplete fs\n                                <=< demand\n                            )\n                            (M.lookup (coerce f) m)\n         in\n            case val of\n                NVSet _ xs -> withMap (M.mapKeys coerce xs)\n                _ -> stub\n\n{- | HelpOption inspired by Dhall Repl\nwith `Doc` instead of String for syntax and doc\n-}\ndata HelpOption e t f m = HelpOption\n    { helpOptionName :: Text\n    , helpOptionSyntax :: Doc ()\n    , helpOptionDoc :: Doc ()\n    , helpOptionFunction :: Cmd (Repl e t f m)\n    }\n\ntype HelpOptions e t f m = [HelpOption e t f m]\n\nhelpOptions :: (MonadNix e t f m, MonadIO m) => HelpOptions e t f m\nhelpOptions =\n    [ HelpOption\n        \"help\"\n        mempty\n        \"Print help text\"\n        (help helpOptions . fromString)\n    , HelpOption\n        \"paste\"\n        mempty\n        \"Enter multi-line mode\"\n        (error \"Unreachable\")\n    , HelpOption\n        \"load\"\n        \"FILENAME\"\n        \"Load .nix file into scope\"\n        (load . fromString)\n    , HelpOption\n        \"browse\"\n        mempty\n        \"Browse bindings in interpreter context\"\n        (browse . fromString)\n    , HelpOption\n        \"type\"\n        \"EXPRESSION\"\n        \"Evaluate expression or binding from context and print the type of the result value\"\n        (typeof . fromString)\n    , HelpOption\n        \"quit\"\n        mempty\n        \"Quit interpreter\"\n        quit\n    , HelpOption\n        \"set\"\n        mempty\n        ( \"Set REPL option\"\n            <> Prettyprinter.line\n            <> \"Available options:\"\n            <> Prettyprinter.line\n            <> renderSetOptions helpSetOptions\n        )\n        (setConfig . fromString)\n    ]\n\n-- | Options for :set\ndata HelpSetOption = HelpSetOption\n    { helpSetOptionName :: Text\n    , helpSetOptionSyntax :: Doc ()\n    , helpSetOptionDoc :: Doc ()\n    , helpSetOptionFunction :: ReplConfig -> ReplConfig\n    }\n\nhelpSetOptions :: [HelpSetOption]\nhelpSetOptions =\n    [ HelpSetOption\n        \"strict\"\n        mempty\n        \"Enable strict evaluation of REPL expressions\"\n        (\\x -> x{cfgStrict = True})\n    , HelpSetOption\n        \"lazy\"\n        mempty\n        \"Disable strict evaluation of REPL expressions\"\n        (\\x -> x{cfgStrict = False})\n    , HelpSetOption\n        \"values\"\n        mempty\n        \"Enable printing of value provenance information\"\n        (\\x -> x{cfgValues = True})\n    , HelpSetOption\n        \"novalues\"\n        mempty\n        \"Disable printing of value provenance information\"\n        (\\x -> x{cfgValues = False})\n    , HelpSetOption\n        \"debug\"\n        mempty\n        \"Enable printing of REPL debug information\"\n        (\\x -> x{cfgDebug = True})\n    , HelpSetOption\n        \"nodebug\"\n        mempty\n        \"Disable REPL debugging\"\n        (\\x -> x{cfgDebug = False})\n    ]\n\nrenderSetOptions :: [HelpSetOption] -> Doc ()\nrenderSetOptions so =\n    Prettyprinter.indent 4 $\n        Prettyprinter.vsep $\n            ( \\h ->\n                Prettyprinter.pretty (helpSetOptionName h)\n                    <> space\n                    <> helpSetOptionSyntax h\n                    <> Prettyprinter.line\n                    <> Prettyprinter.indent 4 (helpSetOptionDoc h)\n            )\n                <$> so\n\nhelp ::\n    (MonadNix e t f m, MonadIO m) =>\n    HelpOptions e t f m ->\n    Text ->\n    Repl e t f m ()\nhelp hs _ = do\n    liftIO $ putStrLn \"Available commands:\\n\"\n    traverse_\n        ( \\h ->\n            liftIO\n                . Text.putStrLn\n                . Prettyprinter.renderStrict\n                . Prettyprinter.layoutPretty Prettyprinter.defaultLayoutOptions\n                $ \":\"\n                    <> Prettyprinter.pretty (helpOptionName h)\n                    <> space\n                    <> helpOptionSyntax h\n                    <> Prettyprinter.line\n                    <> Prettyprinter.indent 4 (helpOptionDoc h)\n        )\n        hs\n\noptions ::\n    (MonadNix e t f m, MonadIO m) =>\n    Console.Options (Repl e t f m)\noptions = (\\h -> (toString $ helpOptionName h, helpOptionFunction h)) <$> helpOptions\n"
  },
  {
    "path": "release.nix",
    "content": "{}:\nlet matrix = [\n      { compiler = \"ghc863\"; doStrict = false; doTracing = false; }\n      { compiler = \"ghc863\"; doStrict = false; doTracing = true;  }\n\n      { compiler = \"ghc844\"; doStrict = false; doTracing = false; }\n      { compiler = \"ghc844\"; doStrict = false; doTracing = true;  }\n\n      # Broken\n      # { compiler = \"ghc802\"; doStrict = false; doTracing = false; }\n      # { compiler = \"ghc802\"; doStrict = false; doTracing = true;  }\n\n      # Deprecated\n      # { compiler = \"ghc822\"; doStrict = true;  doTracing = false; }\n      # { compiler = \"ghc822\"; doStrict = true;  doTracing = true;  }\n\n      # Broken\n      # { compiler = \"ghcjs\";  doStrict = false; doTracing = false; }\n    ];\n    boolToString = x: if x then \"true\" else \"false\";\n    nameForConfig = {compiler, doStrict, doTracing}: builtins.concatStringsSep \"-\"\n      [ compiler (boolToString doStrict) (boolToString doTracing) ];\nin builtins.listToAttrs (map (args: { name = nameForConfig args; value = import ./. args; }) matrix)\n"
  },
  {
    "path": "shell.nix",
    "content": "attrs@{...}:\nlet defaultAttrs = {\n  # Defaults are put in this form deliberately. Details: #748\n  withHoogle = true;\n  returnShellEnv = true;\n  compiler = \"ghc947\";\n};\nin (import ./. (defaultAttrs // attrs))\n"
  },
  {
    "path": "src/Nix/Atoms.hs",
    "content": "{-# LANGUAGE CPP #-}\n{-# LANGUAGE DeriveAnyClass #-}\n\nmodule Nix.Atoms where\n\nimport Codec.Serialise (Serialise)\nimport Nix.Prelude\n\nimport Data.Aeson.Types (\n    FromJSON,\n    ToJSON,\n )\nimport Data.Binary (Binary)\nimport Data.Data (Data)\nimport Data.Fixed (mod')\n\n--  2021-08-01: NOTE: Check the order effectiveness of NAtom constructors.\n\n{- | Atoms are values that evaluate to themselves.\nIn other words - this is a constructors that are literals in Nix.\nThis means that\nthey appear in both the parsed AST (in the form of literals) and\nthe evaluated form as themselves.\nOnce HNix parsed or evaluated into atom - that is a literal\nfurther after, for any further evaluation it is in all cases stays\nconstantly itself.\n\"atom\", Ancient Greek \\( atomos \\) - \"indivisible\" particle,\nindivisible expression.\n-}\ndata NAtom\n    = -- | An URI like @https://example.com@.\n      NURI Text\n    | -- | An integer. The c nix implementation currently only supports\n      --       integers that fit in the range of 'Int64'.\n      NInt Integer\n    | -- | A floating point number\n      NFloat Float\n    | -- | Booleans. @false@ or @true@.\n      NBool Bool\n    | -- | Null values. There's only one of this variant: @null@.\n      NNull\n    deriving\n        ( Eq\n        , Ord\n        , Generic\n        , Typeable\n        , Data\n        , Show\n        , Read\n        , NFData\n        , Hashable\n        )\n\ninstance Serialise NAtom\n\ninstance Binary NAtom\ninstance ToJSON NAtom\ninstance FromJSON NAtom\n\n-- | Translate an atom into its Nix representation.\natomText :: NAtom -> Text\natomText (NURI t) = t\natomText (NInt i) = show i\natomText (NFloat f) = showNixFloat f\n  where\n    showNixFloat :: Float -> Text\n    showNixFloat x =\n        bool\n            (show x)\n            (show (truncate x :: Int))\n            (x `mod'` 1 == 0)\natomText (NBool b) = if b then \"true\" else \"false\"\natomText NNull = \"null\"\n"
  },
  {
    "path": "src/Nix/Builtins.hs",
    "content": "{-# LANGUAGE AllowAmbiguousTypes #-}\n{-# LANGUAGE CPP #-}\n{-# LANGUAGE ConstraintKinds #-}\n{-# LANGUAGE FunctionalDependencies #-}\n{-# LANGUAGE KindSignatures #-}\n{-# LANGUAGE MonoLocalBinds #-}\n{-# LANGUAGE MultiWayIf #-}\n-- 2021-07-05: Due to hashing Haskell IT system situation, in HNix we currently ended-up with 2 hash package dependencies @{hashing, cryptonite}@\n{-# LANGUAGE PackageImports #-}\n{-# LANGUAGE PartialTypeSignatures #-}\n{-# LANGUAGE PatternSynonyms #-}\n{-# LANGUAGE QuasiQuotes #-}\n{-# LANGUAGE TemplateHaskell #-}\n{-# LANGUAGE UndecidableInstances #-}\n{-# OPTIONS_GHC -fno-warn-name-shadowing #-}\n\n-- | Code that implements Nix builtins. Lists the functions that are built into the Nix expression evaluator. Some built-ins (aka `derivation`), are always in the scope, so they can be accessed by the name. To keap the namespace clean, most built-ins are inside the `builtins` scope - a set that contains all what is a built-in.\nmodule Nix.Builtins (\n    withNixContext,\n    builtins,\n)\nwhere\n\nimport Control.Monad (foldM)\nimport Control.Monad.Catch (MonadCatch (catch))\nimport Control.Monad.ListM (sortByM)\nimport qualified Data.Aeson as A\nimport GHC.Exception (ErrorCall (ErrorCall))\nimport Nix.Prelude\nimport \"hashing\" Crypto.Hash\nimport qualified \"hashing\" Crypto.Hash.MD5 as MD5\nimport qualified \"hashing\" Crypto.Hash.SHA1 as SHA1\nimport qualified \"hashing\" Crypto.Hash.SHA256 as SHA256\nimport qualified \"hashing\" Crypto.Hash.SHA512 as SHA512\n#if MIN_VERSION_aeson(2,0,0)\nimport qualified Data.Aeson.Key                as AKM\nimport qualified Data.Aeson.KeyMap             as AKM\n#endif\nimport Data.Align (alignWith)\nimport Data.Array\nimport Data.Bits\nimport qualified Data.ByteString as B\nimport Data.ByteString.Base16 as Base16\nimport Data.Char (isDigit)\nimport Data.Fix (foldFix)\nimport Data.Foldable (foldrM)\nimport qualified Data.HashMap.Lazy as M\nimport qualified Data.HashSet as HS\nimport Data.List (partition)\nimport Data.Scientific\nimport qualified Data.Set as S\nimport qualified Data.Text as Text\nimport qualified Data.Text.Lazy.Builder as Builder\nimport Data.Text.Read (decimal)\nimport Data.These (These, fromThese)\nimport qualified Data.Time.Clock.POSIX as Time\nimport qualified Data.Vector as V\nimport NeatInterpolation (text)\nimport Nix.Atoms\nimport Nix.Convert\nimport Nix.Effects\nimport Nix.Effects.Basic (fetchTarball)\nimport qualified Nix.Eval as Eval\nimport Nix.Exec\nimport Nix.Expr.Types\nimport Nix.Frames\nimport Nix.Json\nimport Nix.Normal\nimport Nix.Options\nimport Nix.Parser\nimport Nix.Render\nimport Nix.Scope\nimport Nix.String\nimport Nix.String.Coerce\nimport Nix.Value\nimport Nix.Value.Equal\nimport Nix.Value.Monad\nimport Nix.XML\nimport System.Nix.Base32 as Base32\nimport System.PosixCompat.Files (\n    isDirectory,\n    isRegularFile,\n    isSymbolicLink,\n )\nimport Text.Regex.TDFA (\n    Regex,\n    makeRegex,\n    matchAllText,\n    matchOnceText,\n )\nimport qualified Text.Show\n\n-- This is a big module. There is recursive reuse:\n-- @builtins -> builtinsList -> scopedImport -> withNixContext -> builtins@,\n-- since @builtins@ is self-recursive: aka we ship @builtins.builtins.builtins...@.\n\n-- * Internal\n\n-- ** Nix Builtins Haskell type level\n\nnewtype Prim m a = Prim (m a)\n\ndata BuiltinType = Normal | TopLevel\ndata Builtin v\n    = Builtin\n    { _kind :: BuiltinType\n    , mapping :: (VarName, v)\n    }\n\n-- *** @class ToBuiltin@ and its instances\n\n-- | Types that support conversion to nix in a particular monad\nclass ToBuiltin t f m a | a -> m where\n    toBuiltin :: Text -> a -> m (NValue t f m)\n\ninstance\n    ( MonadNix e t f m\n    , ToValue a m (NValue t f m)\n    ) =>\n    ToBuiltin t f m (Prim m a)\n    where\n    toBuiltin _ p = toValue @a @m =<< coerce p\n\ninstance\n    ( MonadNix e t f m\n    , FromValue a m (Deeper (NValue t f m))\n    , ToBuiltin t f m b\n    ) =>\n    ToBuiltin t f m (a -> b)\n    where\n    toBuiltin name f =\n        pure $ NVBuiltin (coerce name) $ toBuiltin name . f <=< fromValue . Deeper\n\n-- *** @WValue@ closure wrapper to have @Ord@\n\n-- We wrap values solely to provide an Ord instance for genericClosure\nnewtype WValue t f m = WValue (NValue t f m)\n\ninstance (NVConstraint f) => Eq (WValue t f m) where\n    WValue (NVConstant (NFloat x)) == WValue (NVConstant (NInt y)) =\n        x == fromInteger y\n    WValue (NVConstant (NInt x)) == WValue (NVConstant (NFloat y)) =\n        fromInteger x == y\n    WValue (NVConstant (NInt x)) == WValue (NVConstant (NInt y)) = x == y\n    WValue (NVConstant (NFloat x)) == WValue (NVConstant (NFloat y)) = x == y\n    WValue (NVPath x) == WValue (NVPath y) = x == y\n    WValue (NVStr x) == WValue (NVStr y) =\n        ignoreContext x == ignoreContext y\n    _ == _ = False\n\ninstance (NVConstraint f) => Ord (WValue t f m) where\n    WValue (NVConstant (NFloat x)) <= WValue (NVConstant (NInt y)) =\n        x <= fromInteger y\n    WValue (NVConstant (NInt x)) <= WValue (NVConstant (NFloat y)) =\n        fromInteger x <= y\n    WValue (NVConstant (NInt x)) <= WValue (NVConstant (NInt y)) = x <= y\n    WValue (NVConstant (NFloat x)) <= WValue (NVConstant (NFloat y)) = x <= y\n    WValue (NVPath x) <= WValue (NVPath y) = x <= y\n    WValue (NVStr x) <= WValue (NVStr y) =\n        ignoreContext x <= ignoreContext y\n    _ <= _ = False\n\n-- ** Helpers\n\npattern NVBool :: (MonadNix e t f m) => Bool -> NValue t f m\npattern NVBool a = NVConstant (NBool a)\n\ndata NixPathEntryType\n    = PathEntryPath\n    | PathEntryURI\n    deriving (Show, Eq)\n\n{- | @NIX_PATH@ is colon-separated, but can also contain URLs, which have a colon\n(i.e. @https://...@)\n-}\nuriAwareSplit :: Text -> [(Text, NixPathEntryType)]\nuriAwareSplit txt =\n    case Text.break (== ':') txt of\n        (e1, e2)\n            | Text.null e2 -> one (e1, PathEntryPath)\n            | \"://\" `Text.isPrefixOf` e2 ->\n                let ((suffix, _) : path) = uriAwareSplit (Text.drop 3 e2)\n                 in (e1 <> \"://\" <> suffix, PathEntryURI) : path\n            | otherwise -> (e1, PathEntryPath) : uriAwareSplit (Text.drop 1 e2)\n\nfoldNixPath ::\n    forall e t f m r.\n    (MonadNix e t f m) =>\n    r ->\n    (Path -> Maybe Text -> NixPathEntryType -> r -> m r) ->\n    m r\nfoldNixPath z f =\n    do\n        mres <- lookupVar \"__includes\"\n        dirs <-\n            maybe\n                stub\n                ((fromValue . Deeper) <=< demand)\n                mres\n        mPath <- getEnvVar \"NIX_PATH\"\n        mDataDir <- getEnvVar \"NIX_DATA_DIR\"\n        dataDir <-\n            maybe\n                getDataDir\n                (pure . coerce . toString)\n                mDataDir\n\n        foldrM\n            fun\n            z\n            $ (fromInclude . ignoreContext <$> dirs)\n                <> uriAwareSplit `whenJust` mPath\n                <> one (fromInclude $ \"nix=\" <> fromString (coerce dataDir) <> \"/nix/corepkgs\")\n  where\n    fromInclude :: Text -> (Text, NixPathEntryType)\n    fromInclude x =\n        (x,) $\n            bool\n                PathEntryPath\n                PathEntryURI\n                (\"://\" `Text.isInfixOf` x)\n\n    fun :: (Text, NixPathEntryType) -> r -> m r\n    fun (x, ty) rest =\n        case Text.splitOn \"=\" x of\n            [p] -> f (coerce $ toString p) mempty ty rest\n            [n, p] -> f (coerce $ toString p) (pure n) ty rest\n            _ -> throwError $ ErrorCall $ \"Unexpected entry in NIX_PATH: \" <> show x\n\nattrsetGet :: (MonadNix e t f m) => VarName -> AttrSet (NValue t f m) -> m (NValue t f m)\nattrsetGet k s =\n    maybe\n        (throwError $ ErrorCall $ toString @Text $ \"Attribute '\" <> coerce k <> \"' required\")\n        pure\n        (M.lookup k s)\n\ndata VersionComponent\n    = -- | The string \"pre\"\n      VersionComponentPre\n    | -- | A string other than \"pre\"\n      VersionComponentString !Text\n    | -- | A number\n      VersionComponentNumber !Integer\n    deriving (Read, Eq, Ord)\n\ninstance Show VersionComponent where\n    show =\n        \\case\n            VersionComponentPre -> \"pre\"\n            VersionComponentString s -> show s\n            VersionComponentNumber n -> show n\n\nsplitVersion :: Text -> [VersionComponent]\nsplitVersion s =\n    ( \\(x, xs) ->\n        if\n            | isRight eDigitsPart ->\n                either\n                    (\\e -> error $ \"splitVersion: did hit impossible: '\" <> fromString e <> \"' while parsing '\" <> s <> \"'.\")\n                    ( \\res ->\n                        one (VersionComponentNumber $ fst res)\n                            <> splitVersion (snd res)\n                    )\n                    eDigitsPart\n            | x `elem` separators -> splitVersion xs\n            | otherwise -> one charsPart <> splitVersion rest2\n    )\n        `whenJust` Text.uncons s\n  where\n    -- \\| Based on https://github.com/NixOS/nix/blob/4ee4fda521137fed6af0446948b3877e0c5db803/src/libexpr/names.cc#L44\n    separators :: String\n    separators = \".-\"\n\n    eDigitsPart :: Either String (Integer, Text)\n    eDigitsPart = decimal @Integer $ s\n\n    (charsSpan, rest2) =\n        Text.span\n            (\\c -> not $ isDigit c || c `elem` separators)\n            s\n\n    charsPart :: VersionComponent\n    charsPart =\n        case charsSpan of\n            \"pre\" -> VersionComponentPre\n            xs' -> VersionComponentString xs'\n\ncompareVersions :: Text -> Text -> Ordering\ncompareVersions s1 s2 =\n    fold $ (alignWith cmp `on` splitVersion) s1 s2\n  where\n    cmp :: These VersionComponent VersionComponent -> Ordering\n    cmp = uncurry compare . join fromThese (VersionComponentString mempty)\n\nsplitDrvName :: Text -> (Text, Text)\nsplitDrvName s =\n    both (Text.intercalate sep) (namePieces, versionPieces)\n  where\n    sep = \"-\"\n    pieces :: [Text]\n    pieces = Text.splitOn sep s\n    isFirstVersionPiece :: Text -> Bool\n    isFirstVersionPiece p =\n        maybe\n            False\n            (isDigit . fst)\n            (Text.uncons p)\n    -- Like 'break', but always puts the first item into the first result\n    -- list\n    breakAfterFirstItem :: (a -> Bool) -> [a] -> ([a], [a])\n    breakAfterFirstItem f =\n        handlePresence\n            mempty\n            (\\(h : t) -> let (a, b) = break f t in (h : a, b))\n    (namePieces, versionPieces) =\n        breakAfterFirstItem isFirstVersionPiece pieces\n\nsplitMatches ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    Int ->\n    [[(ByteString, (Int, Int))]] ->\n    ByteString ->\n    [NValue t f m]\nsplitMatches _ [] haystack = one $ thunkStr haystack\nsplitMatches _ ([] : _) _ =\n    fail \"Fail in splitMatches: this should never happen!\"\nsplitMatches numDropped (((_, (start, len)) : captures) : mts) haystack =\n    thunkStr before\n        : caps\n        : splitMatches\n            (numDropped + relStart + len)\n            mts\n            (B.drop len rest)\n  where\n    relStart = max 0 start - numDropped\n    (before, rest) = B.splitAt relStart haystack\n    caps :: NValue t f m\n    caps = NVList (f <$> captures)\n    f :: (ByteString, (Int, b)) -> NValue t f m\n    f (a, (s, _)) =\n        bool\n            NVNull\n            (thunkStr a)\n            (s >= 0)\n\nthunkStr :: (NVConstraint f) => ByteString -> NValue t f m\nthunkStr s = mkNVStrWithoutContext $ decodeUtf8 s\n\nhasKind ::\n    forall a e t f m.\n    (MonadNix e t f m, FromValue a m (NValue t f m)) =>\n    NValue t f m ->\n    m (NValue t f m)\nhasKind =\n    inHaskMay\n        (isJust @a)\n\nabsolutePathFromValue :: (MonadNix e t f m) => NValue t f m -> m Path\nabsolutePathFromValue =\n    \\case\n        NVStr ns ->\n            do\n                let\n                    path = coerce . toString $ ignoreContext ns\n\n                when (not (isAbsolute path)) $ throwError $ ErrorCall $ \"string \" <> show path <> \" doesn't represent an absolute path\"\n                pure path\n        NVPath path -> pure path\n        v -> throwError $ ErrorCall $ \"expected a path, got \" <> show v\n\ndata FileType\n    = FileTypeRegular\n    | FileTypeDirectory\n    | FileTypeSymlink\n    | FileTypeUnknown\n    deriving (Show, Read, Eq, Ord)\n\ninstance (Convertible e t f m) => ToValue FileType m (NValue t f m) where\n    toValue =\n        toValue\n            . mkNixStringWithoutContext\n            . \\case\n                FileTypeRegular -> \"regular\" :: Text\n                FileTypeDirectory -> \"directory\"\n                FileTypeSymlink -> \"symlink\"\n                FileTypeUnknown -> \"unknown\"\n\n-- ** Builtin functions\n\nderivationNix ::\n    forall e t f m.\n    (MonadNix e t f m, Scoped (NValue t f m) m) =>\n    m (NValue t f m)\nderivationNix =\n    foldFix\n        Eval.eval\n        $$( do\n                -- This is compiled in so that we only parse it once at compile-time.\n                let Right expr =\n                        parseNixText\n                            [text|\n      drvAttrs @ { outputs ? [ \"out\" ], ... }:\n\n      let\n\n        strict = derivationStrict drvAttrs;\n\n        commonAttrs = drvAttrs\n          // (builtins.listToAttrs outputsList)\n          // { all = map (x: x.value) outputsList;\n               inherit drvAttrs;\n             };\n\n        outputToAttrListElement = outputName:\n          { name = outputName;\n            value = commonAttrs // {\n              outPath = builtins.getAttr outputName strict;\n              drvPath = strict.drvPath;\n              type = \"derivation\";\n              inherit outputName;\n            };\n          };\n\n        outputsList = map outputToAttrListElement outputs;\n\n      in (builtins.head outputsList).value|]\n                [||expr||]\n          )\n\nnixPathNix :: forall e t f m. (MonadNix e t f m) => m (NValue t f m)\nnixPathNix =\n    fmap\n        NVList\n        $ foldNixPath mempty\n        $ \\p mn ty rest ->\n            pure $\n                pure\n                    ( NVSet\n                        mempty\n                        ( M.fromList\n                            [ case ty of\n                                PathEntryPath -> (\"path\", NVPath p)\n                                PathEntryURI -> (\"uri\", mkNVStrWithoutContext $ fromString $ coerce p)\n                            , (\"prefix\", mkNVStrWithoutContext $ maybeToMonoid mn)\n                            ]\n                        )\n                    )\n                    <> rest\n\ntoStringNix :: (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\ntoStringNix = toValue <=< coerceAnyToNixString callFunc DontCopyToStore\n\nhasAttrNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nhasAttrNix x y =\n    do\n        (coerce -> key) <- fromStringNoContext =<< fromValue x\n        (aset, _) <- fromValue @(AttrSet (NValue t f m), PositionSet) y\n\n        toValue $ M.member key aset\n\nhasContextNix :: (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nhasContextNix = inHask hasContext\n\ngetAttrNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\ngetAttrNix x y =\n    do\n        (coerce -> key) <- fromStringNoContext =<< fromValue x\n        (aset, _) <- fromValue @(AttrSet (NValue t f m), PositionSet) y\n\n        attrsetGet key aset\n\nunsafeDiscardOutputDependencyNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    m (NValue t f m)\nunsafeDiscardOutputDependencyNix nv =\n    do\n        (nc, ns) <- (getStringContext &&& ignoreContext) <$> fromValue nv\n        toValue $ mkNixString (HS.map discard nc) ns\n  where\n    discard :: StringContext -> StringContext\n    discard (StringContext AllOutputs a) = StringContext DirectPath a\n    discard x = x\n\nunsafeGetAttrPosNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nunsafeGetAttrPosNix nvX nvY =\n    do\n        x <- demand nvX\n        y <- demand nvY\n\n        case (x, y) of\n            (NVStr ns, NVSet apos _) ->\n                maybe\n                    (pure NVNull)\n                    toValue\n                    (M.lookup @VarName (coerce $ ignoreContext ns) apos)\n            _xy -> throwError $ ErrorCall $ \"Invalid types for builtins.unsafeGetAttrPosNix: \" <> show _xy\n\n-- This function is a bit special in that it doesn't care about the contents\n-- of the list.\nlengthNix ::\n    forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nlengthNix = inHask (length :: [NValue t f m] -> Int)\n\naddNix ::\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\naddNix nvX nvY =\n    do\n        x' <- demand nvX\n        y' <- demand nvY\n\n        case (x', y') of\n            (NVConstant (NInt x), NVConstant (NInt y)) -> toValue (x + y :: Integer)\n            (NVConstant (NFloat x), NVConstant (NInt y)) -> toValue $ x + fromInteger y\n            (NVConstant (NInt x), NVConstant (NFloat y)) -> toValue $ fromInteger x + y\n            (NVConstant (NFloat x), NVConstant (NFloat y)) -> toValue $ x + y\n            (_x, _y) -> throwError $ Addition _x _y\n\nmulNix ::\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nmulNix nvX nvY =\n    do\n        x' <- demand nvX\n        y' <- demand nvY\n\n        case (x', y') of\n            (NVConstant (NInt x), NVConstant (NInt y)) -> toValue (x * y :: Integer)\n            (NVConstant (NFloat x), NVConstant (NInt y)) -> toValue (x * fromInteger y)\n            (NVConstant (NInt x), NVConstant (NFloat y)) -> toValue (fromInteger x * y)\n            (NVConstant (NFloat x), NVConstant (NFloat y)) -> toValue (x * y)\n            (_x, _y) -> throwError $ Multiplication _x _y\n\ndivNix ::\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\ndivNix nvX nvY =\n    do\n        x' <- demand nvX\n        y' <- demand nvY\n        case (x', y') of\n            (NVConstant (NInt x), NVConstant (NInt y)) | y /= 0 -> toValue (floor (fromInteger x / fromInteger y :: Double) :: Integer)\n            (NVConstant (NFloat x), NVConstant (NInt y)) | y /= 0 -> toValue $ x / fromInteger y\n            (NVConstant (NInt x), NVConstant (NFloat y)) | y /= 0 -> toValue $ fromInteger x / y\n            (NVConstant (NFloat x), NVConstant (NFloat y)) | y /= 0 -> toValue $ x / y\n            (_x, _y) -> throwError $ Division _x _y\n\nanyNix ::\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nanyNix f = toValue <=< anyMNix fromValue <=< traverse (callFunc f) <=< fromValue\n  where\n    anyMNix :: (Monad m) => (a -> m Bool) -> [a] -> m Bool\n    anyMNix _ [] = pure False\n    anyMNix p (x : xs) =\n        bool\n            (anyMNix p xs)\n            (pure True)\n            =<< p x\n\nallNix ::\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nallNix f = toValue <=< allMNix fromValue <=< traverse (callFunc f) <=< fromValue\n  where\n    allMNix :: (Monad m) => (a -> m Bool) -> [a] -> m Bool\n    allMNix _ [] = pure True\n    allMNix p (x : xs) =\n        bool\n            (pure False)\n            (allMNix p xs)\n            =<< p x\n\nfoldl'Nix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nfoldl'Nix f z xs = foldM go z =<< fromValue @[NValue t f m] xs\n  where\n    go b a = (`callFunc` a) =<< callFunc f b\n\nheadNix :: forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nheadNix =\n    maybe\n        (throwError $ ErrorCall \"builtins.head: empty list\")\n        pure\n        . viaNonEmpty head\n        <=< fromValue @[NValue t f m]\n\ntailNix :: forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\ntailNix =\n    maybe\n        (throwError $ ErrorCall \"builtins.tail: empty list\")\n        (pure . NVList)\n        . viaNonEmpty tail\n        <=< fromValue @[NValue t f m]\n\nsplitVersionNix :: (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nsplitVersionNix v =\n    do\n        version <- fromStringNoContext =<< fromValue v\n        pure $\n            NVList $\n                mkNVStrWithoutContext . show\n                    <$> splitVersion version\n\ncompareVersionsNix ::\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\ncompareVersionsNix t1 t2 =\n    do\n        s1 <- mkText t1\n        s2 <- mkText t2\n\n        let\n            cmpVers =\n                case compareVersions s1 s2 of\n                    LT -> -1\n                    EQ -> 0\n                    GT -> 1\n\n        pure $ NVConstant $ NInt cmpVers\n  where\n    mkText = fromStringNoContext <=< fromValue\n\nparseDrvNameNix ::\n    forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nparseDrvNameNix drvname =\n    do\n        s <- fromStringNoContext =<< fromValue drvname\n\n        let\n            (name :: Text, version :: Text) = splitDrvName s\n\n        toValue @(AttrSet (NValue t f m)) $\n            M.fromList\n                [\n                    ( \"name\" :: VarName\n                    , mkNVStr name\n                    )\n                ,\n                    ( \"version\"\n                    , mkNVStr version\n                    )\n                ]\n  where\n    mkNVStr = mkNVStrWithoutContext\n\nmatchNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nmatchNix pat str =\n    do\n        p <- fromStringNoContext =<< fromValue pat\n        ns <- fromValue str\n\n        -- NOTE: 2018-11-19: Currently prim_match in nix/src/libexpr/primops.cc\n        -- ignores the context of its second argument. This is probably a bug but we're\n        -- going to preserve the behavior here until it is fixed upstream.\n        -- Relevant issue: https://github.com/NixOS/nix/issues/2547\n        let\n            s = ignoreContext ns\n            re = makeRegex p :: Regex\n            mkMatch t =\n                bool\n                    (pure NVNull)\n                    (toValue $ mkNixStringWithoutContext t)\n                    (not $ Text.null t)\n\n        case matchOnceText re s of\n            Just (\"\", sarr, \"\") ->\n                do\n                    let submatches = fst <$> elems sarr\n                    NVList\n                        <$> traverse\n                            mkMatch\n                            ( case submatches of\n                                [] -> mempty\n                                [a] -> one a\n                                _ : xs -> xs -- return only the matched groups, drop the full string\n                            )\n            _ -> pure NVNull\n\nsplitNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nsplitNix pat str =\n    do\n        p <- fromStringNoContext =<< fromValue pat\n        ns <- fromValue str\n        -- NOTE: Currently prim_split in nix/src/libexpr/primops.cc ignores the\n        -- context of its second argument. This is probably a bug but we're\n        -- going to preserve the behavior here until it is fixed upstream.\n        -- Relevant issue: https://github.com/NixOS/nix/issues/2547\n        let\n            s = ignoreContext ns\n            regex = makeRegex p :: Regex\n            haystack = encodeUtf8 s\n\n        pure $ NVList $ splitMatches 0 (elems <$> matchAllText regex haystack) haystack\n\nsubstringNix :: forall e t f m. (MonadNix e t f m) => Int -> Int -> NixString -> Prim m NixString\nsubstringNix start len str =\n    Prim $\n        bool\n            (throwError $ ErrorCall $ \"builtins.substring: negative start position: \" <> show start)\n            (pure $ modifyNixContents (take . Text.drop start) str)\n            (start >= 0)\n  where\n    take =\n        bool\n            id -- NOTE: negative values of 'len' are OK, and mean \"take everything\"\n            (Text.take len)\n            (len >= 0)\n\nattrNamesNix ::\n    forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nattrNamesNix =\n    coersion\n        . inHask @(AttrSet (NValue t f m))\n            (fmap (mkNixStringWithoutContext . coerce) . sort . M.keys)\n  where\n    coersion = fmap (coerce :: CoerceDeeperToNValue t f m)\n\nattrValuesNix ::\n    forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nattrValuesNix nvattrs =\n    do\n        attrs <- fromValue @(AttrSet (NValue t f m)) nvattrs\n        toValue $\n            snd\n                <$> sortOn\n                    (fst @VarName @(NValue t f m))\n                    (M.toList attrs)\n\nmapNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nmapNix f =\n    inHaskM @[NValue t f m]\n        ( traverse\n            ( defer\n                . withFrame Debug (ErrorCall \"While applying f in map:\\n\")\n                . callFunc f\n            )\n        )\n\nmapAttrsNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nmapAttrsNix f xs =\n    do\n        nixAttrset <- fromValue @(AttrSet (NValue t f m)) xs\n        let\n            keyVals = M.toList nixAttrset\n            keys = fst <$> keyVals\n\n            applyFunToKeyVal (key, val) =\n                do\n                    runFunForKey <- callFunc f $ mkNVStrWithoutContext (coerce key)\n                    callFunc runFunForKey val\n\n        newVals <-\n            traverse\n                (defer @(NValue t f m) . withFrame Debug (ErrorCall \"While applying f in mapAttrs:\\n\") . applyFunToKeyVal)\n                keyVals\n\n        toValue $ M.fromList $ zip keys newVals\n\nfilterNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nfilterNix f =\n    inHaskM\n        (filterM fh)\n  where\n    fh :: NValue t f m -> m Bool\n    fh = fromValue <=< callFunc f\n\ncatAttrsNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\ncatAttrsNix attrName xs =\n    do\n        n <- fromStringNoContext =<< fromValue attrName\n        l <- fromValue @[NValue t f m] xs\n\n        NVList . catMaybes\n            <$> traverse\n                (fmap (M.lookup @VarName $ coerce n) . fromValue <=< demand)\n                l\n\nbaseNameOfNix :: (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nbaseNameOfNix x =\n    do\n        ns <- coerceStringlikeToNixString DontCopyToStore x\n        pure $\n            NVStr $\n                modifyNixContents\n                    (fromString . coerce takeFileName . toString)\n                    ns\n\nbitAndNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nbitAndNix x y =\n    do\n        a <- fromValue @Integer x\n        b <- fromValue @Integer y\n\n        toValue $ a .&. b\n\nbitOrNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nbitOrNix x y =\n    do\n        a <- fromValue @Integer x\n        b <- fromValue @Integer y\n\n        toValue $ a .|. b\n\nbitXorNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nbitXorNix x y =\n    do\n        a <- fromValue @Integer x\n        b <- fromValue @Integer y\n\n        toValue $ a `xor` b\n\nbuiltinsBuiltinNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    m (NValue t f m)\nbuiltinsBuiltinNix = throwError $ ErrorCall \"HNix does not provide builtins.builtins at the moment. Using builtins directly should be preferred\"\n\n-- a safer version of `attrsetGet`\nattrGetOr ::\n    forall e t f m v a.\n    (MonadNix e t f m, FromValue v m (NValue t f m)) =>\n    a ->\n    (v -> m a) ->\n    VarName ->\n    AttrSet (NValue t f m) ->\n    m a\nattrGetOr fallback fun name attrs =\n    maybe\n        (pure fallback)\n        (fun <=< fromValue)\n        (M.lookup name attrs)\n\n--  NOTE: It is a part of the implementation taken from:\n--  https://github.com/haskell-nix/hnix/pull/755\n--  look there for `sha256` and/or `filterSource`\npathNix :: forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\npathNix arg =\n    do\n        attrs <- fromValue @(AttrSet (NValue t f m)) arg\n        path <- fmap (coerce . toString) $ fromStringNoContext =<< coerceToPath =<< attrsetGet \"path\" attrs\n\n        -- TODO: Fail on extra args\n        -- XXX: This is a very common pattern, we could factor it out\n        name <- toText <$> attrGetOr (takeFileName path) (fmap (coerce . toString) . fromStringNoContext) \"name\" attrs\n        recursive <- attrGetOr True pure \"recursive\" attrs\n\n        Right (coerce . toText . coerce @StorePath @String -> s) <- addToStore name (NarFile path) recursive False\n        -- TODO: Ensure that s matches sha256 when not empty\n        pure $ NVStr $ mkNixStringWithSingletonContext (StringContext DirectPath s) s\n  where\n    coerceToPath = coerceToString callFunc DontCopyToStore CoerceAny\n\ndirOfNix :: (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\ndirOfNix nvdir =\n    do\n        dir <- demand nvdir\n\n        case dir of\n            NVStr ns -> pure $ NVStr $ modifyNixContents (fromString . coerce takeDirectory . toString) ns\n            NVPath path -> pure $ NVPath $ takeDirectory path\n            v -> throwError $ ErrorCall $ \"dirOf: expected string or path, got \" <> show v\n\n-- jww (2018-04-28): This should only be a string argument, and not coerced?\nunsafeDiscardStringContextNix ::\n    (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nunsafeDiscardStringContextNix =\n    inHask (mkNixStringWithoutContext . ignoreContext)\n\n-- | Evaluate `a` to WHNF to collect its topmost effect.\nseqNix ::\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nseqNix a b = b <$ demand a\n\n-- | Evaluate 'a' to NF to collect all of its effects, therefore data cycles are ignored.\ndeepSeqNix ::\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\ndeepSeqNix a b = b <$ normalForm_ a\n\nelemNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nelemNix x = inHaskM (anyMNix $ valueEqM x)\n  where\n    anyMNix :: (Monad m) => (a -> m Bool) -> [a] -> m Bool\n    anyMNix p =\n        handlePresence\n            (pure False)\n            ( \\(x : xss) ->\n                bool\n                    (anyMNix p xss)\n                    (pure True)\n                    =<< p x\n            )\n\nelemAtNix ::\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nelemAtNix xs n =\n    do\n        n' <- fromValue n\n        xs' <- fromValue xs\n        maybe\n            (throwError $ ErrorCall $ \"builtins.elem: Index \" <> show n' <> \" too large for list of length \" <> show (length xs'))\n            pure\n            (xs' !!? n')\n\ngenListNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\ngenListNix f nixN =\n    do\n        n <- fromValue @Integer nixN\n        bool\n            (throwError $ ErrorCall $ \"builtins.genList: Expected a non-negative number, got \" <> show n)\n            (toValue =<< traverse (defer . callFunc f <=< toValue) [0 .. n - 1])\n            (n >= 0)\n\ngenericClosureNix ::\n    forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\ngenericClosureNix c =\n    do\n        s <- fromValue @(AttrSet (NValue t f m)) c\n\n        case (M.lookup \"startSet\" s, M.lookup \"operator\" s) of\n            (Nothing, Nothing) -> throwError $ ErrorCall \"builtins.genericClosure: Attributes 'startSet' and 'operator' required\"\n            (Nothing, Just _) -> throwError $ ErrorCall \"builtins.genericClosure: Attribute 'startSet' required\"\n            (Just _, Nothing) -> throwError $ ErrorCall \"builtins.genericClosure: Attribute 'operator' required\"\n            (Just startSet, Just operator) ->\n                do\n                    ss <- fromValue @[NValue t f m] =<< demand startSet\n                    op <- demand operator\n                    let\n                        go ::\n                            Set (WValue t f m) ->\n                            [NValue t f m] ->\n                            m (Set (WValue t f m), [NValue t f m])\n                        go ks [] = pure (ks, mempty)\n                        go ks (t : ts) =\n                            do\n                                v <- demand t\n                                k <- demand =<< attrsetGet \"key\" =<< fromValue @(AttrSet (NValue t f m)) v\n\n                                bool\n                                    ( do\n                                        checkComparable k $\n                                            handlePresence\n                                                k\n                                                (\\(WValue j : _) -> j)\n                                                (S.toList ks)\n\n                                        (<<$>>) (v :) . go (S.insert (WValue k) ks) . (<>) ts =<< fromValue @[NValue t f m] =<< callFunc op v\n                                    )\n                                    (go ks ts)\n                                    (S.member (WValue k) ks)\n\n                    toValue @[NValue t f m] =<< snd <$> go mempty ss\n\n{- | Takes:\n1. List of strings to match.\n2. List of strings to replace corresponding match occurance. (arg 1 & 2 lists matched by index)\n3. String to process\n-> returns the string with requested replacements.\n\nExample:\nbuiltins.replaceStrings [\"ll\" \"e\"] [\" \" \"i\"] \"Hello world\" == \"Hi o world\".\n-}\nreplaceStringsNix ::\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nreplaceStringsNix tfrom tto ts =\n    do\n        -- NixStrings have context - remember\n        (fromKeys :: [NixString]) <- fromValue (Deeper tfrom)\n        (toVals :: [NixString]) <- fromValue (Deeper tto)\n        (string :: NixString) <- fromValue ts\n\n        when (length fromKeys /= length toVals) $ throwError $ ErrorCall \"builtins.replaceStrings: Arguments `from`&`to` construct a key-value map, so the number of their elements must always match.\"\n\n        let\n            --  2021-02-18: NOTE: if there is no match - the process does not changes the context, simply slides along the string.\n            --  So it isbe more effective to pass the context as the first argument.\n            --  And moreover, the `passOneCharNgo` passively passes the context, to context can be removed from it and inherited directly.\n            --  Then the solution would've been elegant, but the Nix bug prevents elegant implementation.\n            go ctx input output =\n                maybe\n                    -- Passively pass the chars\n                    passOneChar\n                    replace\n                    maybePrefixMatch\n              where\n                -- When prefix matched something - returns (match, replacement, remainder)\n                maybePrefixMatch :: Maybe (Text, NixString, Text)\n                maybePrefixMatch = formMatchReplaceTailInfo <$> find ((`Text.isPrefixOf` input) . fst) fromKeysToValsMap\n                  where\n                    formMatchReplaceTailInfo (m, r) = (m, r, Text.drop (Text.length m) input)\n\n                    fromKeysToValsMap = zip (ignoreContext <$> fromKeys) toVals\n\n                -- Not passing args => It is constant that gets embedded into `go` => It is simple `go` tail recursion\n                passOneChar =\n                    maybe\n                        (finish ctx output) -- The base case - there is no chars left to process -> finish\n                        (\\(c, i) -> go ctx i (output <> Builder.singleton c)) -- If there are chars - pass one char & continue\n                        (Text.uncons input) -- chip first char\n\n                --  2021-02-18: NOTE: rly?: toStrict . toLazyText\n                --  Maybe `text-builder`, `text-show`?\n                finish ctx output = mkNixString ctx (toStrict $ Builder.toLazyText output)\n\n                replace (key, replacementNS, unprocessedInput) = replaceWithNixBug unprocessedInput updatedOutput\n                  where\n                    replaceWithNixBug =\n                        bool\n                            (go updatedCtx) -- tail recursion\n                            -- Allowing match on \"\" is a inherited bug of Nix,\n                            -- when \"\" is checked - it always matches. And so - when it checks - it always insers a replacement, and then process simply passesthrough the char that was under match.\n                            --\n                            -- repl> builtins.replaceStrings [\"\" \"e\"] [\" \" \"i\"] \"Hello world\"\n                            -- \" H e l l o   w o r l d \"\n                            -- repl> builtins.replaceStrings [\"ll\" \"\"] [\" \" \"i\"] \"Hello world\"\n                            -- \"iHie ioi iwioirilidi\"\n                            --  2021-02-18: NOTE: There is no tests for this\n                            bugPassOneChar -- augmented recursion\n                            isNixBugCase\n\n                    isNixBugCase = key == mempty\n\n                    updatedOutput = output <> replacement\n                    updatedCtx = ctx <> replacementCtx\n\n                    replacement = Builder.fromText $ ignoreContext replacementNS\n                    replacementCtx = getStringContext replacementNS\n\n                    -- The bug modifies the content => bug demands `pass` to be a real function =>\n                    -- `go` calls `pass` function && `pass` calls `go` function\n                    -- => mutual recusion case, so placed separately.\n                    bugPassOneChar input output =\n                        maybe\n                            (finish updatedCtx output) -- The base case - there is no chars left to process -> finish\n                            (\\(c, i) -> go updatedCtx i $ output <> Builder.singleton c) -- If there are chars - pass one char & continue\n                            (Text.uncons input) -- chip first char\n        toValue $ go (getStringContext string) (ignoreContext string) mempty\n\nremoveAttrsNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nremoveAttrsNix set v =\n    do\n        (m, p) <- fromValue @(AttrSet (NValue t f m), PositionSet) set\n        (nsToRemove :: [NixString]) <- fromValue $ Deeper v\n        (coerce -> toRemove) <- traverse fromStringNoContext nsToRemove\n        toValue (fun m toRemove, fun p toRemove)\n  where\n    fun :: forall k v. (Eq k, Hashable k) => HashMap k v -> [k] -> HashMap k v\n    fun = foldl' (flip M.delete)\n\nintersectAttrsNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nintersectAttrsNix set1 set2 =\n    do\n        (s1, p1) <- fromValue @(AttrSet (NValue t f m), PositionSet) set1\n        (s2, p2) <- fromValue @(AttrSet (NValue t f m), PositionSet) set2\n\n        pure $ NVSet (p2 `M.intersection` p1) (s2 `M.intersection` s1)\n\nfunctionArgsNix ::\n    forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nfunctionArgsNix nvfun =\n    do\n        fun <- demand nvfun\n        case fun of\n            NVClosure p _ ->\n                toValue @(AttrSet (NValue t f m)) $\n                    NVBool\n                        <$> case p of\n                            Param name -> one (name, False)\n                            ParamSet _ _ pset -> isJust <$> M.fromList pset\n            _v -> throwError $ ErrorCall $ \"builtins.functionArgs: expected function, got \" <> show _v\n\ntoFileNix ::\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\ntoFileNix name s =\n    do\n        name' <- fromStringNoContext =<< fromValue name\n        s' <- fromValue s\n        mres <-\n            toFile_\n                (coerce $ toString name')\n                (ignoreContext s')\n\n        let\n            storepath = coerce (fromString @Text) mres\n            sc = StringContext DirectPath storepath\n\n        toValue $ mkNixStringWithSingletonContext sc storepath\n\ntoPathNix :: (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\ntoPathNix = inHask @Path id\n\npathExistsNix :: (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\npathExistsNix nvpath =\n    do\n        path <- demand nvpath\n        toValue\n            =<< case path of\n                NVPath p -> doesPathExist p\n                NVStr ns -> doesPathExist $ coerce $ toString $ ignoreContext ns\n                _v -> throwError $ ErrorCall $ \"builtins.pathExists: expected path, got \" <> show _v\n\nisPathNix ::\n    forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nisPathNix = hasKind @Path\n\nisAttrsNix ::\n    forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nisAttrsNix = hasKind @(AttrSet (NValue t f m))\n\nisListNix ::\n    forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nisListNix = hasKind @[NValue t f m]\n\nisIntNix ::\n    forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nisIntNix = hasKind @Int\n\nisFloatNix ::\n    forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nisFloatNix = hasKind @Float\n\nisBoolNix ::\n    forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nisBoolNix = hasKind @Bool\n\nisNullNix ::\n    forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nisNullNix = hasKind @()\n\n-- isString cannot use `hasKind` because it coerces derivationNixs to strings.\nisStringNix :: (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nisStringNix nv =\n    do\n        v <- demand nv\n\n        toValue $\n            case v of\n                NVStr{} -> True\n                _ -> False\n\nisFunctionNix :: (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nisFunctionNix nv =\n    do\n        v <- demand nv\n\n        toValue $\n            case v of\n                NVClosure{} -> True\n                _ -> False\n\nthrowNix :: (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nthrowNix =\n    throwError . ErrorCall . toString . ignoreContext\n        <=< coerceStringlikeToNixString CopyToStore\n\n{- | Implementation of Nix @import@ clause.\n\nBecause Nix @import@s work strictly\n(import gets fully evaluated befor bringing it into the scope it was called from)\n- that property raises a requirement for execution phase of the interpreter go into evaluation phase\n& then also go into parsing phase on the imports.\nSo it is not possible (more precise - not practical) to do a full parse Nix code phase fully & then go into evaluation phase.\nAs it is not possible to \"import them lazily\", as import is strict & it is not possible to establish\nwhat imports whould be needed up until where it would be determined & they import strictly\n-}\nimportNix ::\n    forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nimportNix = scopedImportNix $ NVSet mempty mempty\n\n{- | @scopedImport scope path@\nAn undocumented secret powerful function.\n\nAt the same time it is strongly forbidden to be used, as prolonged use of it would bring devastating consequences.\nAs it is essentially allows rewriting(redefinition) paradigm.\n\nAllows to import the environment into the scope of a file expression that gets imported.\nIt is as if the contents at @path@ were given to @import@ wrapped as: @with scope; path@\nmeaning:\n\n> -- Nix pseudocode:\n> import (with scope; path)\n\nFor example, it allows to use itself as:\n> bar = scopedImport pkgs ./bar.nix;\n> -- & declare @./bar.nix@ without a header, so as:\n> stdenv.mkDerivation { ... buildInputs = [ libfoo ]; }\n\nBut that breaks the evaluation/execution sharing of the @import@s.\n\nFunction also allows to redefine or extend the builtins.\n\nFor instance, to trace all calls to function ‘map’:\n\n>  let\n>    overrides = {\n>      map = f: xs: builtins.trace \"call of map!\" (map f xs);\n\n>      # Propagate override by calls to import&scopedImport.\n>      import = fn: scopedImport overrides fn;\n>      scopedImport = attrs: fn: scopedImport (overrides // attrs) fn;\n\n>      # Update ‘builtins’.\n>      builtins = builtins // overrides;\n>    };\n>  in scopedImport overrides ./bla.nix\n\nIn the related matter the function can be added and passed around as builtin.\n-}\nscopedImportNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nscopedImportNix asetArg pathArg =\n    do\n        (coerce -> scope) <- fromValue @(AttrSet (NValue t f m)) asetArg\n        p <- fromValue pathArg\n\n        path <- pathToDefaultNix @t @f @m p\n        path' <-\n            maybe\n                ( do\n                    traceM \"No known current directory\"\n                    pure path\n                )\n                ( \\res ->\n                    do\n                        p' <- fromValue @Path =<< demand res\n\n                        traceM $ \"Current file being evaluated is: \" <> show p'\n                        pure $ takeDirectory p' </> path\n                )\n                =<< lookupVar \"__cur_file\"\n\n        clearScopes @(NValue t f m) $\n            withNixContext (pure path') $\n                pushScope scope $\n                    importPath @t @f @m path'\n\ngetEnvNix :: (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\ngetEnvNix v =\n    (toValue . mkNixStringWithoutContext . maybeToMonoid) =<< getEnvVar =<< fromStringNoContext =<< fromValue v\n\nsortNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nsortNix comp =\n    inHaskM (sortByM cmp)\n  where\n    cmp :: NValue t f m -> NValue t f m -> m Ordering\n    cmp a b =\n        bool\n            ( fmap\n                (bool EQ GT)\n                (compare b a)\n            )\n            (pure LT)\n            =<< compare a b\n      where\n        compare :: NValue t f m -> NValue t f m -> m Bool\n        compare a2 a1 = fromValue =<< (`callFunc` a1) =<< callFunc comp a2\n\nlessThanNix ::\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nlessThanNix ta tb =\n    do\n        va <- demand ta\n        vb <- demand tb\n\n        let\n            badType = throwError $ ErrorCall $ \"builtins.lessThan: expected two numbers or two strings, got '\" <> show va <> \"' and '\" <> show vb <> \"'.\"\n\n        NVBool\n            <$> case (va, vb) of\n                (NVConstant ca, NVConstant cb) ->\n                    case (ca, cb) of\n                        (NInt a, NInt b) -> pure $ a < b\n                        (NInt a, NFloat b) -> pure $ fromInteger a < b\n                        (NFloat a, NInt b) -> pure $ a < fromInteger b\n                        (NFloat a, NFloat b) -> pure $ a < b\n                        _ -> badType\n                (NVStr a, NVStr b) -> pure $ ignoreContext a < ignoreContext b\n                _ -> badType\n\n-- | Helper function, generalization of @concat@ operations.\nconcatWith ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    (NValue t f m -> m (NValue t f m)) ->\n    NValue t f m ->\n    m (NValue t f m)\nconcatWith f =\n    toValue\n        . concat\n        <=< traverse\n            (fromValue @[NValue t f m] <=< f)\n        <=< fromValue @[NValue t f m]\n\n{- | Nix function of Haskell:\n> concat :: [[a]] -> [a]\n\nConcatenate a list of lists into a single list.\n-}\nconcatListsNix ::\n    forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nconcatListsNix = concatWith demand\n\n{- | Nix function of Haskell:\n> concatMap :: Foldable t => (a -> [b]) -> t a -> [b]\n-}\nconcatMapNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nconcatMapNix f = concatWith (callFunc f)\n\nlistToAttrsNix ::\n    forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nlistToAttrsNix lst =\n    do\n        l <- fromValue @[NValue t f m] lst\n        fmap\n            (NVSet mempty . M.fromList . reverse)\n            ( traverse\n                ( \\nvattrset ->\n                    do\n                        a <- fromValue @(AttrSet (NValue t f m)) =<< demand nvattrset\n                        (coerce -> name) <- fromStringNoContext =<< fromValue =<< demand =<< attrsetGet \"name\" a\n                        val <- attrsetGet \"value\" a\n\n                        pure (name, val)\n                )\n                l\n            )\n\n-- prim_hashString from nix/src/libexpr/primops.cc\n-- fail if context in the algo arg\n-- propagate context from the s arg\n\n-- | The result coming out of hashString is base16 encoded\nhashStringNix ::\n    forall e t f m. (MonadNix e t f m) => NixString -> NixString -> Prim m NixString\nhashStringNix nsAlgo ns =\n    Prim $\n        do\n            algo <- fromStringNoContext nsAlgo\n            let\n                f g = pure $ modifyNixContents g ns\n\n            case algo of\n                --  2021-03-04: Pattern can not be taken-out because hashes represented as different types\n                \"md5\" -> f (show . mkHash @MD5.MD5)\n                \"sha1\" -> f (show . mkHash @SHA1.SHA1)\n                \"sha256\" -> f (show . mkHash @SHA256.SHA256)\n                \"sha512\" -> f (show . mkHash @SHA512.SHA512)\n                _ -> throwError $ ErrorCall $ \"builtins.hashString: expected \\\"md5\\\", \\\"sha1\\\", \\\"sha256\\\", or \\\"sha512\\\", got \" <> show algo\n  where\n    -- This intermidiary `a` is only needed because of the type application\n    mkHash :: (Show a, HashAlgorithm a) => Text -> a\n    mkHash s = hash $ encodeUtf8 s\n\n{- | hashFileNix\nuse hashStringNix to hash file content\n-}\nhashFileNix ::\n    forall e t f m. (MonadNix e t f m) => NixString -> Path -> Prim m NixString\nhashFileNix nsAlgo nvfilepath = Prim $ hash =<< fileContent\n  where\n    hash = outPrim . hashStringNix nsAlgo\n    outPrim (Prim x) = x\n    fileContent :: m NixString\n    fileContent = mkNixStringWithoutContext <$> Nix.Render.readFile nvfilepath\n\n{- | groupByNix\nGroups elements of list together by the string returned from the function f called on\neach element. It returns an attribute set where each attribute value contains the\nelements of list that are mapped to the same corresponding attribute name returned by f.\n-}\ngroupByNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\ngroupByNix nvfun nvlist = do\n    list <- demand nvlist\n    fun <- demand nvfun\n    (f, l) <- extractP (fun, list)\n    NVSet mempty\n        . fmap (NVList . reverse)\n        . M.fromListWith (<>)\n        <$> traverse (app f) l\n  where\n    app f x = do\n        name <- fromValue @Text =<< f x\n        pure (VarName name, one x)\n    extractP (NVBuiltin _ f, NVList l) = pure (f, l)\n    extractP (NVClosure _ f, NVList l) = pure (f, l)\n    extractP _v =\n        throwError $\n            ErrorCall $\n                \"builtins.groupBy: expected function and list, got \"\n                    <> show _v\n\n{- FOURMOLU_DISABLE -}\nplaceHolderNix :: forall t f m e . MonadNix e t f m => NValue t f m -> m (NValue t f m)\nplaceHolderNix p =\n  do\n    t <- fromStringNoContext =<< fromValue p\n    h <-\n      coerce @(Prim m NixString) @(m NixString) $\n        (hashStringNix `on` mkNixStringWithoutContext)\n          \"sha256\"\n          (\"nix-output:\" <> t)\n    toValue\n      $ mkNixStringWithoutContext\n      $ Text.cons '/'\n      $ Base32.encode\n      -- Please, stop Text -> Bytestring here after migration to Text\n      $ case Base16.decode (bytes h) of -- The result coming out of hashString is base16 encoded\n#if MIN_VERSION_base16_bytestring(1,0,0)\n        -- Please, stop Text -> String here after migration to Text\n        Left e -> error $ \"Couldn't Base16 decode the text: '\" <> body h <> \"'.\\nThe Left fail content: '\" <> show e <> \"'.\"\n        Right d -> d\n#else\n        (d, \"\") -> d\n        (_, e) -> error $ \"Couldn't Base16 decode the text: '\" <> body h <> \"'.\\nUndecodable remainder: '\" <> show e <> \"'.\"\n#endif\n    where\n      bytes :: NixString -> ByteString\n      bytes = encodeUtf8 . body\n\n      body = ignoreContext\n{- FOURMOLU_ENABLE -}\n\nreadFileNix :: (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nreadFileNix = toValue <=< Nix.Render.readFile <=< absolutePathFromValue <=< demand\n\nfindFileNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nfindFileNix nvaset nvfilepath =\n    do\n        aset <- demand nvaset\n        filePath <- demand nvfilepath\n\n        case (aset, filePath) of\n            (NVList x, NVStr ns) ->\n                do\n                    mres <- findPath @t @f @m x $ coerce $ toString $ ignoreContext ns\n\n                    pure $ NVPath mres\n            (NVList _, _y) -> throwError $ ErrorCall $ \"expected a string, got \" <> show _y\n            (_x, NVStr _) -> throwError $ ErrorCall $ \"expected a list, got \" <> show _x\n            (_x, _y) -> throwError $ ErrorCall $ \"Invalid types for builtins.findFile: \" <> show (_x, _y)\n\nreadDirNix ::\n    forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nreadDirNix nvpath =\n    do\n        path <- absolutePathFromValue =<< demand nvpath\n        items <- listDirectory path\n\n        let\n            -- \\| Function indeed binds filepaths as keys ('VarNames') in Nix attrset.\n            detectFileTypes :: Path -> m (VarName, FileType)\n            detectFileTypes item =\n                do\n                    s <- getSymbolicLinkStatus $ path </> item\n                    let\n                        t =\n                            if\n                                | isRegularFile s -> FileTypeRegular\n                                | isDirectory s -> FileTypeDirectory\n                                | isSymbolicLink s -> FileTypeSymlink\n                                | otherwise -> FileTypeUnknown\n\n                    pure (coerce @(String -> Text) fromString item, t)\n\n        itemsWithTypes <-\n            traverse\n                detectFileTypes\n                items\n\n        (coerce :: CoerceDeeperToNValue t f m) <$> toValue (M.fromList itemsWithTypes)\n\n{- FOURMOLU_DISABLE -}\nfromJSONNix\n  :: forall e t f m . MonadNix e t f m => NValue t f m -> m (NValue t f m)\nfromJSONNix nvjson =\n  do\n    j <- demand nvjson\n    jText <- fromStringNoContext =<< fromValue j\n\n    either\n      (\\ jsonError -> throwError $ ErrorCall $ \"builtins.fromJSON: \" <> jsonError)\n      jsonToNValue\n      -- do we really need to marshall Text -> ByteString -> Aeson.Value (that is a Text)\n      (A.eitherDecodeStrict' @A.Value $ encodeUtf8 jText)\n\n where\n  jsonToNValue :: (A.Value -> m (NValue t f m))\n  jsonToNValue =\n    \\case\n      A.Object m ->\n        traverseToNValue\n          (NVSet mempty)\n#if MIN_VERSION_aeson(2,0,0)\n          (M.mapKeys (coerce . AKM.toText)  $ AKM.toHashMap m)\n#else\n          (M.mapKeys coerce m)\n#endif\n      A.Array  l -> traverseToNValue NVList (V.toList l)\n      A.String s -> pure $ mkNVStrWithoutContext s\n      A.Number n ->\n        pure $\n          NVConstant $\n            either\n              NFloat\n              NInt\n              (floatingOrInteger n)\n      A.Bool   b -> pure $ NVBool b\n      A.Null     -> pure NVNull\n   where\n    traverseToNValue :: Traversable t0 => (t0 (NValue t f m) -> b) -> t0 A.Value -> m b\n    traverseToNValue f v = f <$> traverse jsonToNValue v\n{- FOURMOLU_ENABLE -}\n\ntoJSONNix :: (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\ntoJSONNix = (fmap NVStr . toJSONNixString) <=< demand\n\ntoXMLNix :: (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\ntoXMLNix = (fmap (NVStr . toXML) . normalForm) <=< demand\n\ntypeOfNix :: (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\ntypeOfNix nvv =\n    do\n        v <- demand nvv\n        let\n            detectType =\n                case v of\n                    NVConstant a ->\n                        case a of\n                            NURI _ -> \"string\"\n                            NInt _ -> \"int\"\n                            NFloat _ -> \"float\"\n                            NBool _ -> \"bool\"\n                            NNull -> \"null\"\n                    NVStr _ -> \"string\"\n                    NVList _ -> \"list\"\n                    NVSet _ _ -> \"set\"\n                    NVClosure{} -> \"lambda\"\n                    NVPath _ -> \"path\"\n                    NVBuiltin _ _ -> \"lambda\"\n                    _ -> error \"Pattern synonyms obscure complete patterns\"\n\n        toValue $ mkNixStringWithoutContext detectType\n\ntryEvalNix ::\n    forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\ntryEvalNix e =\n    (`catch` (pure . onError))\n        (onSuccess <$> demand e)\n  where\n    onSuccess v =\n        NVSet\n            mempty\n            $ M.fromList\n                [ (\"success\", NVBool True)\n                , (\"value\", v)\n                ]\n\n    onError :: SomeException -> NValue t f m\n    onError _ =\n        NVSet\n            mempty\n            $ M.fromList\n            $ (,NVBool False)\n                <$> [ \"success\"\n                    , \"value\"\n                    ]\n\ntraceNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\ntraceNix msg action =\n    do\n        traceEffect @t @f @m . toString . ignoreContext =<< fromValue msg\n        pure action\n\n-- Please, can function remember fail context\naddErrorContextNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m -> -- action\n    m (NValue t f m)\naddErrorContextNix _ = pure\n\nexecNix ::\n    forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nexecNix xs =\n    -- 2018-11-19: NOTE: Still need to do something with the context here\n    -- See prim_exec in nix/src/libexpr/primops.cc\n    -- Requires the implementation of EvalState::realiseContext\n    (exec . fmap ignoreContext) =<< traverse (coerceStringlikeToNixString DontCopyToStore) =<< fromValue @[NValue t f m] xs\n\nfetchurlNix ::\n    forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nfetchurlNix =\n    ( \\case\n        NVSet _ s -> fetch (M.lookup \"sha256\" s) =<< demand =<< attrsetGet \"url\" s\n        v@NVStr{} -> fetch Nothing v\n        v -> throwError $ ErrorCall $ \"builtins.fetchurl: Expected URI or set, got \" <> show v\n    )\n        <=< demand\n  where\n    --  2022-01-21: NOTE: Needs to check the hash match.\n    fetch :: Maybe (NValue t f m) -> NValue t f m -> m (NValue t f m)\n    fetch _msha =\n        \\case\n            NVStr ns ->\n                either -- msha\n                    throwError\n                    toValue\n                    =<< getURL\n                    =<< maybe\n                        (throwError $ ErrorCall \"builtins.fetchurl: unsupported arguments to url\")\n                        pure\n                        (getStringNoContext ns)\n            v -> throwError $ ErrorCall $ \"builtins.fetchurl: Expected URI or string, got \" <> show v\n\npartitionNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\npartitionNix f nvlst =\n    do\n        let\n            match t = (,t) <$> (fromValue =<< callFunc f t)\n        selection <- traverse match =<< fromValue @[NValue t f m] nvlst\n\n        let\n            (right, wrong) = partition fst selection\n            makeSide = NVList . fmap snd\n\n        toValue @(AttrSet (NValue t f m)) $\n            M.fromList\n                [ (\"right\", makeSide right)\n                , (\"wrong\", makeSide wrong)\n                ]\n\ncurrentSystemNix :: (MonadNix e t f m) => m (NValue t f m)\ncurrentSystemNix =\n    do\n        os <- getCurrentSystemOS\n        arch <- getCurrentSystemArch\n\n        pure $ mkNVStrWithoutContext $ arch <> \"-\" <> os\n\ncurrentTimeNix :: (MonadNix e t f m) => m (NValue t f m)\ncurrentTimeNix =\n    do\n        opts <- askOptions\n        toValue @Integer $ round $ Time.utcTimeToPOSIXSeconds $ getTime opts\n\nderivationStrictNix :: (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\nderivationStrictNix = derivationStrict\n\ngetRecursiveSizeNix :: (MonadIntrospect m, NVConstraint f) => a -> m (NValue t f m)\ngetRecursiveSizeNix = fmap (NVConstant . NInt . fromIntegral) . recursiveSize\n\ngetContextNix ::\n    forall e t f m. (MonadNix e t f m) => NValue t f m -> m (NValue t f m)\ngetContextNix =\n    \\case\n        (NVStr ns) ->\n            NVSet mempty <$> traverseToValue (getNixLikeContext $ toNixLikeContext $ getStringContext ns)\n        x -> throwError $ ErrorCall $ \"Invalid type for builtins.getContext: \" <> show x\n        <=< demand\n\nappendContextNix ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nappendContextNix tx ty =\n    do\n        x <- demand tx\n        y <- demand ty\n\n        case (x, y) of\n            (NVStr ns, NVSet _ attrs) ->\n                do\n                    let\n                        getPathNOuts :: NValue t f m -> m NixLikeContextValue\n                        getPathNOuts tx =\n                            do\n                                x <- demand tx\n\n                                case x of\n                                    NVSet _ atts ->\n                                        do\n                                            -- TODO: Fail for unexpected keys.\n\n                                            let\n                                                getK :: VarName -> m Bool\n                                                getK k =\n                                                    maybe\n                                                        (pure False)\n                                                        (fromValue <=< demand)\n                                                        $ M.lookup k atts\n\n                                                getOutputs :: m [Text]\n                                                getOutputs =\n                                                    maybe\n                                                        stub\n                                                        ( \\touts ->\n                                                            do\n                                                                outs <- demand touts\n\n                                                                case outs of\n                                                                    NVList vs -> traverse (fmap ignoreContext . fromValue) vs\n                                                                    _x -> throwError $ ErrorCall $ \"Invalid types for context value outputs in builtins.appendContext: \" <> show _x\n                                                        )\n                                                        (M.lookup \"outputs\" atts)\n\n                                            path <- getK \"path\"\n                                            allOutputs <- getK \"allOutputs\"\n\n                                            NixLikeContextValue path allOutputs <$> getOutputs\n                                    _x -> throwError $ ErrorCall $ \"Invalid types for context value in builtins.appendContext: \" <> show _x\n                        addContext :: HashMap VarName NixLikeContextValue -> NixString\n                        addContext newContextValues =\n                            mkNixString\n                                ( fromNixLikeContext\n                                    $ NixLikeContext\n                                    $ M.unionWith\n                                        (<>)\n                                        newContextValues\n                                    $ getNixLikeContext\n                                    $ toNixLikeContext\n                                    $ getStringContext ns\n                                )\n                                $ ignoreContext ns\n\n                    toValue . addContext =<< traverse getPathNOuts attrs\n            _xy -> throwError $ ErrorCall $ \"Invalid types for builtins.appendContext: \" <> show _xy\n\nnixVersionNix :: (MonadNix e t f m) => m (NValue t f m)\nnixVersionNix = toValue $ mkNixStringWithoutContext \"2.3\"\n\nlangVersionNix :: (MonadNix e t f m) => m (NValue t f m)\nlangVersionNix = toValue (5 :: Int)\n\n-- ** @builtinsList@\n\nbuiltinsList :: forall e t f m. (MonadNix e t f m) => m [Builtin (NValue t f m)]\nbuiltinsList =\n    sequenceA\n        [ add TopLevel \"abort\" throwNix -- for now\n        , add TopLevel \"baseNameOf\" baseNameOfNix\n        , add0 TopLevel \"derivation\" derivationNix\n        , add TopLevel \"derivationStrict\" derivationStrictNix\n        , add TopLevel \"dirOf\" dirOfNix\n        , add TopLevel \"import\" importNix\n        , add TopLevel \"isNull\" isNullNix\n        , add2 TopLevel \"map\" mapNix\n        , add2 TopLevel \"mapAttrs\" mapAttrsNix\n        , add TopLevel \"placeholder\" placeHolderNix\n        , add2 TopLevel \"removeAttrs\" removeAttrsNix\n        , add2 TopLevel \"scopedImport\" scopedImportNix\n        , add TopLevel \"throw\" throwNix\n        , add TopLevel \"toString\" toStringNix\n        , add2 TopLevel \"trace\" traceNix\n        , add0 Normal \"nixVersion\" nixVersionNix\n        , add0 Normal \"langVersion\" langVersionNix\n        , add2 Normal \"add\" addNix\n        , add2 Normal \"addErrorContext\" addErrorContextNix\n        , add2 Normal \"all\" allNix\n        , add2 Normal \"any\" anyNix\n        , add2 Normal \"appendContext\" appendContextNix\n        , add Normal \"attrNames\" attrNamesNix\n        , add Normal \"attrValues\" attrValuesNix\n        , add2 Normal \"bitAnd\" bitAndNix\n        , add2 Normal \"bitOr\" bitOrNix\n        , add2 Normal \"bitXor\" bitXorNix\n        , add0 Normal \"builtins\" builtinsBuiltinNix\n        , add2 Normal \"catAttrs\" catAttrsNix\n        , add' Normal \"ceil\" (arity1 (ceiling @Float @Integer))\n        , add2 Normal \"compareVersions\" compareVersionsNix\n        , add Normal \"concatLists\" concatListsNix\n        , add2 Normal \"concatMap\" concatMapNix\n        , add' Normal \"concatStringsSep\" (arity2 intercalateNixString)\n        , add0 Normal \"currentSystem\" currentSystemNix\n        , add0 Normal \"currentTime\" currentTimeNix\n        , add2 Normal \"deepSeq\" deepSeqNix\n        , add2 Normal \"div\" divNix\n        , add2 Normal \"elem\" elemNix\n        , add2 Normal \"elemAt\" elemAtNix\n        , add Normal \"exec\" execNix\n        , add0 Normal \"false\" (pure $ NVBool False)\n        , -- , add  Normal   \"fetchGit\"         fetchGit\n          -- , add  Normal   \"fetchMercurial\"   fetchMercurial\n          add Normal \"fetchTarball\" fetchTarball\n        , add Normal \"fetchurl\" fetchurlNix\n        , add2 Normal \"filter\" filterNix\n        , -- , add  Normal   \"filterSource\"     filterSource\n          add2 Normal \"findFile\" findFileNix\n        , add' Normal \"floor\" (arity1 (floor @Float @Integer))\n        , add3 Normal \"foldl'\" foldl'Nix\n        , add Normal \"fromJSON\" fromJSONNix\n        , -- , add  Normal   \"fromTOML\"         fromTOML\n          add Normal \"functionArgs\" functionArgsNix\n        , add Normal \"genericClosure\" genericClosureNix\n        , add2 Normal \"genList\" genListNix\n        , add2 Normal \"getAttr\" getAttrNix\n        , add Normal \"getContext\" getContextNix\n        , add Normal \"getEnv\" getEnvNix\n        , add2 Normal \"groupBy\" groupByNix\n        , add2 Normal \"hasAttr\" hasAttrNix\n        , add Normal \"hasContext\" hasContextNix\n        , add' Normal \"hashString\" (hashStringNix @e @t @f @m)\n        , add' Normal \"hashFile\" hashFileNix\n        , add Normal \"head\" headNix\n        , add2 Normal \"intersectAttrs\" intersectAttrsNix\n        , add Normal \"isAttrs\" isAttrsNix\n        , add Normal \"isBool\" isBoolNix\n        , add Normal \"isFloat\" isFloatNix\n        , add Normal \"isFunction\" isFunctionNix\n        , add Normal \"isInt\" isIntNix\n        , add Normal \"isList\" isListNix\n        , add Normal \"isString\" isStringNix\n        , add Normal \"isPath\" isPathNix\n        , add Normal \"length\" lengthNix\n        , add2 Normal \"lessThan\" lessThanNix\n        , add Normal \"listToAttrs\" listToAttrsNix\n        , add2 Normal \"match\" matchNix\n        , add2 Normal \"mul\" mulNix\n        , add0 Normal \"nixPath\" nixPathNix\n        , add0 Normal \"null\" (pure NVNull)\n        , add Normal \"parseDrvName\" parseDrvNameNix\n        , add2 Normal \"partition\" partitionNix\n        , add Normal \"path\" pathNix\n        , add Normal \"pathExists\" pathExistsNix\n        , add Normal \"readDir\" readDirNix\n        , add Normal \"readFile\" readFileNix\n        , add3 Normal \"replaceStrings\" replaceStringsNix\n        , add2 Normal \"seq\" seqNix\n        , add2 Normal \"sort\" sortNix\n        , add2 Normal \"split\" splitNix\n        , add Normal \"splitVersion\" splitVersionNix\n        , add0 Normal \"storeDir\" (pure $ mkNVStrWithoutContext \"/nix/store\")\n        , -- , add  Normal   \"storePath\"        storePath\n          add' Normal \"stringLength\" (arity1 $ Text.length . ignoreContext)\n        , add' Normal \"sub\" (arity2 ((-) @Integer))\n        , add' Normal \"substring\" substringNix\n        , add Normal \"tail\" tailNix\n        , add2 Normal \"toFile\" toFileNix\n        , add Normal \"toJSON\" toJSONNix\n        , add Normal \"toPath\" toPathNix -- Deprecated in Nix: https://github.com/NixOS/nix/pull/2524\n        , add Normal \"toXML\" toXMLNix\n        , add0 Normal \"true\" (pure $ NVBool True)\n        , add Normal \"tryEval\" tryEvalNix\n        , add Normal \"typeOf\" typeOfNix\n        , add Normal \"unsafeDiscardOutputDependency\" unsafeDiscardOutputDependencyNix\n        , add Normal \"unsafeDiscardStringContext\" unsafeDiscardStringContextNix\n        , add2 Normal \"unsafeGetAttrPos\" unsafeGetAttrPosNix\n        , add Normal \"valueSize\" getRecursiveSizeNix\n        ]\n  where\n    arity0 :: a -> Prim m a\n    arity0 = Prim . pure\n\n    arity1 :: (a -> b) -> (a -> Prim m b)\n    arity1 g = arity0 . g\n\n    arity2 :: (a -> b -> c) -> (a -> b -> Prim m c)\n    arity2 f = arity1 . f\n\n    mkBuiltin :: BuiltinType -> VarName -> m (NValue t f m) -> m (Builtin (NValue t f m))\n    mkBuiltin t n v = wrap t n <$> mkThunk n v\n      where\n        wrap :: BuiltinType -> VarName -> v -> Builtin v\n        wrap t n f = Builtin t (n, f)\n\n        mkThunk :: VarName -> m (NValue t f m) -> m (NValue t f m)\n        mkThunk n = defer . withFrame Info (ErrorCall $ \"While calling builtin \" <> toString n <> \"\\n\")\n\n    hAdd ::\n        ( VarName ->\n          fun ->\n          m (NValue t f m)\n        ) ->\n        BuiltinType ->\n        VarName ->\n        fun ->\n        m (Builtin (NValue t f m))\n    hAdd f t n v = mkBuiltin t n $ f n v\n\n    add0 ::\n        BuiltinType ->\n        VarName ->\n        m (NValue t f m) ->\n        m (Builtin (NValue t f m))\n    add0 = hAdd (\\_ x -> x)\n\n    add ::\n        BuiltinType ->\n        VarName ->\n        ( NValue t f m ->\n          m (NValue t f m)\n        ) ->\n        m (Builtin (NValue t f m))\n    add = hAdd builtin\n\n    add2 ::\n        BuiltinType ->\n        VarName ->\n        ( NValue t f m ->\n          NValue t f m ->\n          m (NValue t f m)\n        ) ->\n        m (Builtin (NValue t f m))\n    add2 = hAdd builtin2\n\n    add3 ::\n        BuiltinType ->\n        VarName ->\n        ( NValue t f m ->\n          NValue t f m ->\n          NValue t f m ->\n          m (NValue t f m)\n        ) ->\n        m (Builtin (NValue t f m))\n    add3 = hAdd builtin3\n\n    add' ::\n        (ToBuiltin t f m a) =>\n        BuiltinType ->\n        VarName ->\n        a ->\n        m (Builtin (NValue t f m))\n    add' = hAdd (toBuiltin . coerce)\n\n-- * Exported\n\n-- | Evaluate expression in the default context.\nwithNixContext ::\n    forall e t f m r.\n    (MonadNix e t f m, Has e Options) =>\n    Maybe Path ->\n    m r ->\n    m r\nwithNixContext mpath action =\n    do\n        base <- builtins\n        opts <- askOptions\n\n        pushScope\n            (one (\"__includes\", NVList $ mkNVStrWithoutContext . fromString . coerce <$> getInclude opts))\n            ( pushScopes\n                base\n                $ maybe\n                    id\n                    ( \\path act ->\n                        do\n                            traceM $ \"Setting __cur_file = \" <> show path\n                            pushScope (one (\"__cur_file\", NVPath path)) act\n                    )\n                    mpath\n                    action\n            )\n\nbuiltins ::\n    forall e t f m.\n    ( MonadNix e t f m\n    , Scoped (NValue t f m) m\n    ) =>\n    m (Scopes m (NValue t f m))\nbuiltins =\n    do\n        ref <- defer $ NVSet mempty <$> buildMap\n        (`pushScope` askScopes) . coerce . M.fromList . (one (\"builtins\", ref) <>) =<< topLevelBuiltins\n  where\n    buildMap :: m (HashMap VarName (NValue t f m))\n    buildMap = M.fromList . (mapping <$>) <$> builtinsList\n\n    topLevelBuiltins :: m [(VarName, NValue t f m)]\n    topLevelBuiltins = mapping <<$>> fullBuiltinsList\n\n    fullBuiltinsList :: m [Builtin (NValue t f m)]\n    fullBuiltinsList = nameBuiltins <<$>> builtinsList\n      where\n        nameBuiltins :: Builtin v -> Builtin v\n        nameBuiltins b@(Builtin TopLevel _) = b\n        nameBuiltins (Builtin Normal nB) =\n            Builtin TopLevel $ first (coerce @(Text -> Text) (\"__\" <>)) nB\n"
  },
  {
    "path": "src/Nix/Cache.hs",
    "content": "{-# LANGUAGE CPP #-}\n\n-- | Reading and writing Nix cache files\nmodule Nix.Cache where\n\n{- FOURMOLU_DISABLE -}\nimport           Nix.Prelude\nimport qualified Data.ByteString.Lazy          as BSL\nimport           Nix.Expr.Types.Annotated\n\n#if defined (__linux__)\n-- This is about: https://hackage.haskell.org/package/compact\n#define USE_COMPACT 1\n#endif\n\n#ifdef USE_COMPACT\nimport qualified Data.Compact                  as C\nimport qualified Data.Compact.Serialize        as C\n#endif\nimport qualified Codec.Serialise               as S\n\nreadCache :: Path -> IO NExprLoc\nreadCache path = do\n#if USE_COMPACT\n  eres <- C.unsafeReadCompact path\n  either\n    (\\ err  -> fail $ \"Error reading cache file: \" <> err)\n    (\\ expr -> pure $ C.getCompact expr)\n    eres\n#else\n  eres <- S.deserialiseOrFail <$> BSL.readFile (coerce path)\n  either\n    (\\ err  -> fail $ \"Error reading cache file: \" <> show err)\n    pure\n    eres\n#endif\n\nwriteCache :: Path -> NExprLoc -> IO ()\nwriteCache path expr =\n#ifdef USE_COMPACT\n  C.writeCompact path =<< C.compact expr\n#else\n  BSL.writeFile (coerce path) (S.serialise expr)\n#endif\n"
  },
  {
    "path": "src/Nix/Cited/Basic.hs",
    "content": "{-# LANGUAGE GeneralizedNewtypeDeriving #-}\n{-# LANGUAGE PatternSynonyms #-}\n{-# LANGUAGE UndecidableInstances #-}\n\nmodule Nix.Cited.Basic where\n\nimport Control.Comonad (Comonad)\nimport Control.Comonad.Env (ComonadEnv)\nimport Control.Monad.Catch hiding (catchJust)\nimport Nix.Cited\nimport Nix.Eval as Eval (\n    EvalFrame (EvaluatingExpr, ForcingExpr),\n )\nimport Nix.Exec\nimport Nix.Expr.Types.Annotated\nimport Nix.Frames\nimport Nix.Options\nimport Nix.Prelude\nimport Nix.Thunk\nimport Nix.Value\n\n-- * data type @Cited@\n\nnewtype Cited t f m a = Cited (NCited m (NValue t f m) a)\n    deriving\n        ( Generic\n        , Typeable\n        , Functor\n        , Applicative\n        , Foldable\n        , Traversable\n        , Comonad\n        , ComonadEnv [Provenance m (NValue t f m)]\n        )\n\n-- ** Helpers\n\n{- | @Cited@ pattern.\n> pattern CitedP m a = Cited (NCited m a)\n-}\npattern CitedP ::\n    [Provenance m (NValue t f m)] ->\n    a ->\n    Cited t f m a\npattern CitedP m a = Cited (NCited m a)\n\n{-# COMPLETE CitedP #-}\n\n{- | Take:\n1. Provenence info.\n2. Value (like thunk)\n-> Produce cited value (thunk)\n-}\ncite ::\n    (Functor m) =>\n    [Provenance m (NValue t f m)] ->\n    m a ->\n    m (Cited t f m a)\ncite v = fmap (Cited . NCited v)\n\n-- ** instances\n\ninstance HasCitations1 m (NValue t f m) (Cited t f m) where\n    citations1 (Cited c) = citations c\n    addProvenance1 x (Cited c) = Cited $ addProvenance x c\n\ninstance\n    ( Has e Options\n    , Framed e m\n    , MonadThunk t m v\n    , Typeable m\n    , Typeable f\n    , Typeable u\n    , MonadCatch m\n    ) =>\n    MonadThunk (Cited u f m t) m v\n    where\n    thunk :: m v -> m (Cited u f m t)\n    thunk mv =\n        do\n            opts <- askOptions\n\n            bool\n                (cite mempty)\n                ( \\mt ->\n                    do\n                        frames <- askFrames\n\n                        -- Gather the current evaluation context at the time of thunk\n                        -- creation, and record it along with the thunk.\n                        let\n                            fun :: SomeException -> [Provenance m (NValue u f m)]\n                            fun (fromException -> Just (EvaluatingExpr scope (Ann s e))) =\n                                one $ Provenance scope $ AnnF s (Nothing <$ e)\n                            fun _ = mempty\n\n                            ps :: [Provenance m (NValue u f m)]\n                            ps = foldMap (fun . frame) frames\n\n                        cite ps mt\n                )\n                (isThunks opts)\n                (thunk mv)\n\n    thunkId :: Cited u f m t -> ThunkId m\n    thunkId (CitedP _ t) = thunkId @_ @m t\n\n    query :: m v -> Cited u f m t -> m v\n    query m (CitedP _ t) = query m t\n\n    -- \\| The ThunkLoop exception is thrown as an exception with MonadThrow,\n    --   which does not capture the current stack frame information to provide\n    --   it in a NixException, so we catch and re-throw it here using\n    --   'throwError' from Frames.hs.\n    force :: Cited u f m t -> m v\n    force (CitedP ps t) = handleDisplayProvenance ps $ force t\n\n    forceEff :: Cited u f m t -> m v\n    forceEff (CitedP ps t) = handleDisplayProvenance ps $ forceEff t\n\n    further :: Cited u f m t -> m (Cited u f m t)\n    further (CitedP ps t) = cite ps $ further t\n\n-- ** Kleisli functor HOFs\n\n-- Please, do not use MonadThunkF for MonadThunk, later uses more straight-forward specialized line of functions.\ninstance\n    ( Has e Options\n    , Framed e m\n    , MonadThunkF t m v\n    , Typeable m\n    , Typeable f\n    , Typeable u\n    , MonadCatch m\n    ) =>\n    MonadThunkF (Cited u f m t) m v\n    where\n    queryF :: (v -> m r) -> m r -> Cited u f m t -> m r\n    queryF k m (CitedP _ t) = queryF k m t\n\n    forceF :: (v -> m r) -> Cited u f m t -> m r\n    forceF k (CitedP ps t) = handleDisplayProvenance ps $ forceF k t\n\n    forceEffF :: (v -> m r) -> Cited u f m t -> m r\n    forceEffF k (CitedP ps t) = handleDisplayProvenance ps $ forceEffF k t\n\n    furtherF :: (m v -> m v) -> Cited u f m t -> m (Cited u f m t)\n    furtherF k (CitedP ps t) = cite ps $ furtherF k t\n\n-- * Representation\n\nhandleDisplayProvenance ::\n    ( MonadCatch m\n    , Typeable m\n    , Typeable v\n    , Has e Frames\n    , MonadReader e m\n    ) =>\n    [Provenance m v] ->\n    m a ->\n    m a\nhandleDisplayProvenance ps f =\n    catch\n        (displayProvenance ps f)\n        (throwError @ThunkLoop)\n\ndisplayProvenance ::\n    ( MonadThrow m\n    , MonadReader e m\n    , Has e Frames\n    , Typeable m\n    , Typeable v\n    ) =>\n    [Provenance m v] ->\n    m a ->\n    m a\ndisplayProvenance =\n    handlePresence\n        id\n        ( \\(Provenance scope e@(AnnF s _) : _) ->\n            withFrame Info $ ForcingExpr scope $ wrapExprLoc s e\n        )\n"
  },
  {
    "path": "src/Nix/Cited.hs",
    "content": "{-# LANGUAGE DeriveAnyClass #-}\n{-# LANGUAGE TemplateHaskell #-}\n{-# OPTIONS_GHC -Wno-missing-signatures #-}\n\nmodule Nix.Cited where\n\nimport Control.Comonad\nimport Control.Comonad.Env\nimport Lens.Family2.TH\nimport Nix.Prelude\n\nimport Control.Monad.Free (Free (Free, Pure))\nimport Nix.Expr.Types.Annotated\nimport Nix.Scope\nimport Nix.Value (NValue, NValue' (NValue'))\n\ndata Provenance m v\n    = Provenance\n    { getLexicalScope :: Scopes m v\n    , --  2021-11-09: NOTE: Better name?\n      getOriginExpr :: NExprLocF (Maybe v)\n    -- ^ When calling the function x: x + 2 with argument x = 3, the\n    --     'originExpr' for the resulting value will be 3 + 2, while the\n    --     'contextExpr' will be @(x: x + 2) 3@, preserving not only the\n    --     result of the call, but what was called and with what arguments.\n    }\n    deriving (Generic, Typeable, Show)\n\ndata NCited m v a\n    = NCited\n    { getProvenance :: [Provenance m v]\n    , getCited :: a\n    }\n    deriving (Generic, Typeable, Functor, Foldable, Traversable, Show)\n\ninstance Applicative (NCited m v) where\n    pure = NCited mempty\n    (<*>) (NCited xs f) (NCited ys x) = NCited (xs <> ys) (f x)\n\ninstance Comonad (NCited m v) where\n    duplicate p = NCited (getProvenance p) p\n    extract = getCited\n\ninstance ComonadEnv [Provenance m v] (NCited m v) where\n    ask = getProvenance\n\n$(makeLenses ''Provenance)\n$(makeLenses ''NCited)\n\nclass HasCitations1 m v f where\n    citations1 :: f a -> [Provenance m v]\n    addProvenance1 :: Provenance m v -> f a -> f a\n\nclass HasCitations m v a where\n    citations :: a -> [Provenance m v]\n    addProvenance :: Provenance m v -> a -> a\n\ninstance HasCitations m v (NCited m v a) where\n    citations = getProvenance\n    addProvenance x (NCited p v) = NCited (x : p) v\n\ninstance\n    (HasCitations1 m v f) =>\n    HasCitations m v (NValue' t f m a)\n    where\n    citations (NValue' f) = citations1 f\n    addProvenance x (NValue' f) = NValue' $ addProvenance1 x f\n\ninstance\n    (HasCitations1 m v f, HasCitations m v t) =>\n    HasCitations m v (NValue t f m)\n    where\n    citations (Pure t) = citations t\n    citations (Free v) = citations v\n    addProvenance x (Pure t) = Pure $ addProvenance x t\n    addProvenance x (Free v) = Free $ addProvenance x v\n"
  },
  {
    "path": "src/Nix/Context.hs",
    "content": "module Nix.Context where\n\nimport Nix.Expr.Types.Annotated (\n    SrcSpan,\n    nullSpan,\n )\nimport Nix.Frames (Frames)\nimport Nix.Options (Options)\nimport Nix.Prelude\nimport Nix.Scope (Scopes)\n\n--  2021-07-18: NOTE: It should be Options -> Scopes -> Frames -> Source(span)\ndata Context m t\n    = Context\n    { getOptions :: Options\n    , getScopes :: Scopes m t\n    , getSource :: SrcSpan\n    , getFrames :: Frames\n    }\n\ninstance Has (Context m t) (Scopes m t) where\n    hasLens f a = (\\x -> a{getScopes = x}) <$> f (getScopes a)\n\ninstance Has (Context m t) SrcSpan where\n    hasLens f a = (\\x -> a{getSource = x}) <$> f (getSource a)\n\ninstance Has (Context m t) Frames where\n    hasLens f a = (\\x -> a{getFrames = x}) <$> f (getFrames a)\n\ninstance Has (Context m t) Options where\n    hasLens f a = (\\x -> a{getOptions = x}) <$> f (getOptions a)\n\nnewContext :: Options -> Context m t\nnewContext o = Context o mempty nullSpan mempty\n"
  },
  {
    "path": "src/Nix/Convert.hs",
    "content": "{-# LANGUAGE AllowAmbiguousTypes #-}\n{-# LANGUAGE ConstraintKinds #-}\n{-# LANGUAGE IncoherentInstances #-}\n{-# LANGUAGE TypeFamilies #-}\n{-# LANGUAGE UndecidableInstances #-}\n{-# OPTIONS_GHC -fno-warn-name-shadowing #-}\n\n{- | Although there are a lot of instances in this file, really it's just a\n  combinatorial explosion of the following combinations:\n\n  - Several Haskell types being converted to/from Nix wrappers\n  - Several types of Nix wrappers\n  - Whether to be shallow or deep while unwrapping\n-}\nmodule Nix.Convert where\n\nimport Control.Monad.Free\nimport qualified Data.HashMap.Lazy as M\nimport Nix.Atoms\nimport Nix.Effects\nimport Nix.Expr.Types\nimport Nix.Frames\nimport Nix.Prelude\nimport Nix.String\nimport Nix.Thunk (MonadThunk (force))\nimport Nix.Value\nimport Nix.Value.Monad\n\nnewtype Deeper a = Deeper a\n    deriving (Typeable, Functor, Foldable, Traversable)\n\ntype CoerceDeeperToNValue t f m = Deeper (NValue t f m) -> NValue t f m\ntype CoerceDeeperToNValue' t f m = Deeper (NValue' t f m (NValue t f m)) -> NValue' t f m (NValue t f m)\n\n{-\n\nIMPORTANT NOTE\n\nWe used to have Text instances of FromValue, ToValue, FromNix, and ToNix.\nHowever, we're removing these instances because they are dangerous due to the\nfact that they hide the way string contexts are handled. It's better to have to\nexplicitly handle string context in a way that is appropriate for the situation.\n\nDo not add these instances back!\n\n-}\n\ntype Convertible e t f m =\n    (Framed e m, MonadDataErrorContext t f m, MonadThunk t m (NValue t f m))\n\n-- | Transform Nix -> Hask. Run function. Convert Hask -> Nix.\ninHask :: forall a1 a2 v b m. (Monad m, FromValue a1 m v, ToValue a2 m b) => (a1 -> a2) -> v -> m b\ninHask f = toValue . f <=< fromValue\n\ninHaskM :: forall a1 a2 v b m. (Monad m, FromValue a1 m v, ToValue a2 m b) => (a1 -> m a2) -> v -> m b\ninHaskM f = toValue <=< f <=< fromValue\n\n-- | Maybe transform Nix -> Hask. Run function. Convert Hask -> Nix.\ninHaskMay :: forall a1 a2 v b m. (Monad m, FromValue a1 m v, ToValue a2 m b) => (Maybe a1 -> a2) -> v -> m b\ninHaskMay f = toValue . f <=< fromValueMay\n\n-- * FromValue\n\nclass FromValue a m v where\n    fromValue :: v -> m a\n    fromValueMay :: v -> m (Maybe a)\n\ntraverseFromValue ::\n    ( Applicative m\n    , Traversable t\n    , FromValue b m a\n    ) =>\n    t a ->\n    m (Maybe (t b))\ntraverseFromValue = traverse2 fromValueMay\n\ntraverseToValue ::\n    ( Traversable t\n    , Applicative f\n    , ToValue a f b\n    ) =>\n    t a ->\n    f (t b)\ntraverseToValue = traverse toValue\n\n-- Please, hide these helper function from export, to be sure they get optimized away.\nfromMayToValue ::\n    forall t f m a e.\n    ( Convertible e t f m\n    , FromValue a m (NValue' t f m (NValue t f m))\n    ) =>\n    ValueType ->\n    NValue' t f m (NValue t f m) ->\n    m a\nfromMayToValue t v =\n    maybe\n        (throwError $ Expectation @t @f @m t (Free v))\n        pure\n        =<< fromValueMay v\n\nfromMayToDeeperValue ::\n    forall t f m a e m1.\n    ( Convertible e t f m\n    , FromValue (m1 a) m (Deeper (NValue' t f m (NValue t f m)))\n    ) =>\n    ValueType ->\n    Deeper (NValue' t f m (NValue t f m)) ->\n    m (m1 a)\nfromMayToDeeperValue t v =\n    maybe\n        (throwError $ Expectation @t @f @m t $ Free $ (coerce :: CoerceDeeperToNValue' t f m) v)\n        pure\n        =<< fromValueMay v\n\ninstance\n    ( Convertible e t f m\n    , MonadValue (NValue t f m) m\n    , FromValue a m (NValue' t f m (NValue t f m))\n    ) =>\n    FromValue a m (NValue t f m)\n    where\n    fromValueMay =\n        free\n            (fromValueMay <=< force)\n            fromValueMay\n            <=< demand\n\n    fromValue =\n        free\n            (fromValue <=< force)\n            fromValue\n            <=< demand\n\ninstance\n    ( Convertible e t f m\n    , MonadValue (NValue t f m) m\n    , FromValue a m (Deeper (NValue' t f m (NValue t f m)))\n    ) =>\n    FromValue a m (Deeper (NValue t f m))\n    where\n    fromValueMay :: Deeper (NValue t f m) -> m (Maybe a)\n    fromValueMay (Deeper v) =\n        free\n            ((fromValueMay . Deeper) <=< force) -- these places are complex in types\n            (fromValueMay . Deeper)\n            =<< demand v\n\n    fromValue (Deeper v) =\n        free\n            ((fromValue . Deeper) <=< force)\n            (fromValue . Deeper)\n            =<< demand v\n\ninstance\n    (Convertible e t f m) =>\n    FromValue () m (NValue' t f m (NValue t f m))\n    where\n    fromValueMay =\n        pure\n            . \\case\n                NVConstant' NNull -> stub\n                _ -> mempty\n\n    fromValue = fromMayToValue TNull\n\ninstance\n    (Convertible e t f m) =>\n    FromValue Bool m (NValue' t f m (NValue t f m))\n    where\n    fromValueMay =\n        pure\n            . \\case\n                NVConstant' (NBool b) -> pure b\n                _ -> Nothing\n\n    fromValue = fromMayToValue TBool\n\ninstance\n    (Convertible e t f m) =>\n    FromValue Int m (NValue' t f m (NValue t f m))\n    where\n    fromValueMay =\n        pure\n            . \\case\n                NVConstant' (NInt b) -> pure $ fromInteger b\n                _ -> Nothing\n\n    fromValue = fromMayToValue TInt\n\ninstance\n    (Convertible e t f m) =>\n    FromValue Integer m (NValue' t f m (NValue t f m))\n    where\n    fromValueMay =\n        pure\n            . \\case\n                NVConstant' (NInt b) -> pure b\n                _ -> Nothing\n\n    fromValue = fromMayToValue TInt\n\ninstance\n    (Convertible e t f m) =>\n    FromValue Float m (NValue' t f m (NValue t f m))\n    where\n    fromValueMay =\n        pure\n            . \\case\n                NVConstant' (NFloat b) -> pure b\n                NVConstant' (NInt i) -> pure $ fromInteger i\n                _ -> Nothing\n\n    fromValue = fromMayToValue TFloat\n\ninstance\n    ( Convertible e t f m\n    , MonadValue (NValue t f m) m\n    , MonadEffects t f m\n    ) =>\n    FromValue NixString m (NValue' t f m (NValue t f m))\n    where\n    fromValueMay =\n        \\case\n            NVStr' ns -> pure $ pure ns\n            NVPath' p ->\n                (\\path -> pure $ mkNixStringWithSingletonContext (StringContext DirectPath path) path) . fromString . coerce\n                    <$> addPath p\n            NVSet' _ s ->\n                maybe\n                    stub\n                    fromValueMay\n                    (M.lookup \"outPath\" s)\n            _ -> stub\n\n    --  2021-07-18: NOTE: There may be cases where conversion wrongly marks the content to have a context.\n    --  See: https://github.com/haskell-nix/hnix/pull/958#issuecomment-881949183 thread.\n    fromValue = fromMayToValue $ TString HasContext\n\ninstance\n    (Convertible e t f m) =>\n    FromValue ByteString m (NValue' t f m (NValue t f m))\n    where\n    fromValueMay =\n        pure\n            . \\case\n                NVStr' ns -> encodeUtf8 <$> getStringNoContext ns\n                _ -> mempty\n\n    fromValue = fromMayToValue $ TString mempty\n\ninstance\n    (Convertible e t f m) =>\n    FromValue Text m (NValue' t f m (NValue t f m))\n    where\n    fromValueMay =\n        pure\n            . \\case\n                NVStr' ns -> getStringNoContext ns\n                _ -> mempty\n\n    fromValue = fromMayToValue $ TString mempty\n\ninstance\n    ( Convertible e t f m\n    , MonadValue (NValue t f m) m\n    ) =>\n    FromValue Path m (NValue' t f m (NValue t f m))\n    where\n    fromValueMay =\n        \\case\n            NVPath' p -> pure $ pure $ coerce p\n            NVStr' ns -> pure $ coerce . toString <$> getStringNoContext ns\n            NVSet' _ s ->\n                maybe\n                    stub\n                    (fromValueMay @Path)\n                    (M.lookup \"outPath\" s)\n            _ -> stub\n\n    fromValue = fromMayToValue TPath\n\ninstance\n    (Convertible e t f m) =>\n    FromValue [NValue t f m] m (NValue' t f m (NValue t f m))\n    where\n    fromValueMay =\n        pure\n            . \\case\n                NVList' l -> pure l\n                _ -> mempty\n\n    fromValue = fromMayToValue TList\n\ninstance\n    ( Convertible e t f m\n    , FromValue a m (NValue t f m)\n    ) =>\n    FromValue [a] m (Deeper (NValue' t f m (NValue t f m)))\n    where\n    fromValueMay =\n        \\case\n            Deeper (NVList' l) -> traverseFromValue l\n            _ -> stub\n\n    fromValue = fromMayToDeeperValue TList\n\ninstance\n    (Convertible e t f m) =>\n    FromValue (AttrSet (NValue t f m)) m (NValue' t f m (NValue t f m))\n    where\n    fromValueMay =\n        pure\n            . \\case\n                NVSet' _ s -> pure s\n                _ -> mempty\n\n    fromValue = fromMayToValue TSet\n\ninstance\n    ( Convertible e t f m\n    , FromValue a m (NValue t f m)\n    ) =>\n    FromValue (AttrSet a) m (Deeper (NValue' t f m (NValue t f m)))\n    where\n    fromValueMay =\n        \\case\n            Deeper (NVSet' _ s) -> traverseFromValue s\n            _ -> stub\n\n    fromValue = fromMayToDeeperValue TSet\n\ninstance\n    (Convertible e t f m) =>\n    FromValue\n        (AttrSet (NValue t f m), PositionSet)\n        m\n        (NValue' t f m (NValue t f m))\n    where\n    fromValueMay =\n        pure\n            . \\case\n                NVSet' p s -> pure (s, p)\n                _ -> mempty\n\n    fromValue = fromMayToValue TSet\n\ninstance\n    ( Convertible e t f m\n    , FromValue a m (NValue t f m)\n    ) =>\n    FromValue\n        (AttrSet a, PositionSet)\n        m\n        (Deeper (NValue' t f m (NValue t f m)))\n    where\n    fromValueMay =\n        \\case\n            Deeper (NVSet' p s) -> (,p) <<$>> traverseFromValue s\n            _ -> stub\n\n    fromValue = fromMayToDeeperValue TSet\n\n-- This instance needs IncoherentInstances, and only because of ToBuiltin\ninstance\n    ( Convertible e t f m\n    , FromValue a m (NValue' t f m (NValue t f m))\n    ) =>\n    FromValue a m (Deeper (NValue' t f m (NValue t f m)))\n    where\n    fromValueMay = fromValueMay . (coerce :: CoerceDeeperToNValue' t f m)\n    fromValue = fromValue . (coerce :: CoerceDeeperToNValue' t f m)\n\n-- * ToValue\n\nclass ToValue a m v where\n    toValue :: a -> m v\n\ninstance\n    ( Convertible e t f m\n    , ToValue a m (NValue' t f m (NValue t f m))\n    ) =>\n    ToValue a m (NValue t f m)\n    where\n    toValue v = Free <$> toValue v\n\ninstance\n    ( Convertible e t f m\n    , ToValue a m (Deeper (NValue' t f m (NValue t f m)))\n    ) =>\n    ToValue a m (Deeper (NValue t f m))\n    where\n    toValue v = Free <<$>> toValue v\n\ninstance\n    (Convertible e t f m) =>\n    ToValue () m (NValue' t f m (NValue t f m))\n    where\n    toValue = const $ pure NVNull'\n\ninstance\n    (Convertible e t f m) =>\n    ToValue Bool m (NValue' t f m (NValue t f m))\n    where\n    toValue = pure . NVConstant' . NBool\n\ninstance\n    (Convertible e t f m) =>\n    ToValue Int m (NValue' t f m (NValue t f m))\n    where\n    toValue = pure . NVConstant' . NInt . toInteger\n\ninstance\n    (Convertible e t f m) =>\n    ToValue Integer m (NValue' t f m (NValue t f m))\n    where\n    toValue = pure . NVConstant' . NInt\n\ninstance\n    (Convertible e t f m) =>\n    ToValue Float m (NValue' t f m (NValue t f m))\n    where\n    toValue = pure . NVConstant' . NFloat\n\ninstance\n    (Convertible e t f m) =>\n    ToValue NixString m (NValue' t f m (NValue t f m))\n    where\n    toValue = pure . NVStr'\n\ninstance\n    (Convertible e t f m) =>\n    ToValue ByteString m (NValue' t f m (NValue t f m))\n    where\n    toValue = pure . NVStr' . mkNixStringWithoutContext . decodeUtf8\n\ninstance\n    (Convertible e t f m) =>\n    ToValue Text m (NValue' t f m (NValue t f m))\n    where\n    toValue = pure . NVStr' . mkNixStringWithoutContext\n\ninstance\n    (Convertible e t f m) =>\n    ToValue Path m (NValue' t f m (NValue t f m))\n    where\n    toValue = pure . NVPath'\n\ninstance\n    (Convertible e t f m) =>\n    ToValue StorePath m (NValue' t f m (NValue t f m))\n    where\n    toValue = toValue @Path . coerce\n\ninstance\n    (Convertible e t f m) =>\n    ToValue NSourcePos m (NValue' t f m (NValue t f m))\n    where\n    toValue (NSourcePos f l c) = do\n        f' <- toValue $ mkNixStringWithoutContext $ fromString $ coerce f\n        l' <- toValue $ unPos $ coerce l\n        c' <- toValue $ unPos $ coerce c\n        let pos = M.fromList [(\"file\" :: VarName, f'), (\"line\", l'), (\"column\", c')]\n        pure $ NVSet' mempty pos\n\n-- | With 'ToValue', we can always act recursively\ninstance\n    (Convertible e t f m) =>\n    ToValue [NValue t f m] m (NValue' t f m (NValue t f m))\n    where\n    toValue = pure . NVList'\n\ninstance\n    ( Convertible e t f m\n    , ToValue a m (NValue t f m)\n    ) =>\n    ToValue [a] m (Deeper (NValue' t f m (NValue t f m)))\n    where\n    toValue l = Deeper . NVList' <$> traverseToValue l\n\ninstance\n    (Convertible e t f m) =>\n    ToValue (AttrSet (NValue t f m)) m (NValue' t f m (NValue t f m))\n    where\n    toValue s = pure $ NVSet' mempty s\n\ninstance\n    (Convertible e t f m, ToValue a m (NValue t f m)) =>\n    ToValue (AttrSet a) m (Deeper (NValue' t f m (NValue t f m)))\n    where\n    toValue s =\n        liftA2\n            (\\v s -> Deeper $ NVSet' s v)\n            (traverseToValue s)\n            stub\n\ninstance\n    (Convertible e t f m) =>\n    ToValue\n        (AttrSet (NValue t f m), PositionSet)\n        m\n        (NValue' t f m (NValue t f m))\n    where\n    toValue (s, p) = pure $ NVSet' p s\n\ninstance\n    (Convertible e t f m, ToValue a m (NValue t f m)) =>\n    ToValue\n        (AttrSet a, PositionSet)\n        m\n        (Deeper (NValue' t f m (NValue t f m)))\n    where\n    toValue (s, p) =\n        liftA2\n            (\\v s -> Deeper $ NVSet' s v)\n            (traverseToValue s)\n            (pure p)\n\ninstance\n    (Convertible e t f m) =>\n    ToValue NixLikeContextValue m (NValue' t f m (NValue t f m))\n    where\n    toValue nlcv = do\n        let\n            g f =\n                bool\n                    (pure Nothing)\n                    (pure <$> toValue True)\n                    (f nlcv)\n        path <- g nlcvPath\n        allOutputs <- g nlcvAllOutputs\n        outputs <- do\n            let\n                outputs = mkNixStringWithoutContext <$> nlcvOutputs nlcv\n\n            ts :: [NValue t f m] <- traverseToValue outputs\n            handlePresence\n                (pure Nothing)\n                (fmap pure . toValue)\n                ts\n        pure $\n            NVSet' mempty $\n                M.fromList $\n                    catMaybes\n                        [ (\"path\",) <$> path\n                        , (\"allOutputs\",) <$> allOutputs\n                        , (\"outputs\",) <$> outputs\n                        ]\n\ninstance (Convertible e t f m) => ToValue () m (NExprF (NValue t f m)) where\n    toValue = const . pure . NConstant $ NNull\n\ninstance (Convertible e t f m) => ToValue Bool m (NExprF (NValue t f m)) where\n    toValue = pure . NConstant . NBool\n"
  },
  {
    "path": "src/Nix/Effects/Basic.hs",
    "content": "{-# LANGUAGE CPP #-}\n\nmodule Nix.Effects.Basic where\n\nimport Control.Monad (foldM)\nimport qualified Data.HashMap.Lazy as M\nimport Data.List.Split (splitOn)\nimport qualified Data.Text as Text\nimport GHC.Exception (ErrorCall (ErrorCall))\nimport Nix.Convert\nimport Nix.Effects\nimport Nix.Exec (\n    MonadNix,\n    evalExprLoc,\n    nixInstantiateExpr,\n )\nimport Nix.Expr.Types\nimport Nix.Expr.Types.Annotated\nimport Nix.Frames\nimport Nix.Parser\nimport Nix.Prelude\nimport Nix.Render\nimport Nix.Scope\nimport Nix.String\nimport Nix.Value\nimport Nix.Value.Monad\nimport Prettyprinter (fillSep)\n\n#ifdef MIN_VERSION_ghc_datasize\nimport           GHC.DataSize\n#endif\n\ndefaultToAbsolutePath :: forall e t f m. (MonadNix e t f m) => Path -> m Path\ndefaultToAbsolutePath origPath =\n    do\n        origPathExpanded <- expandHomePath origPath\n        fmap\n            removeDotDotIndirections\n            . canonicalizePath\n            =<< bool\n                ( fmap\n                    (<///> origPathExpanded)\n                    $ maybe\n                        getCurrentDirectory\n                        ( ( \\case\n                                NVPath s -> pure $ takeDirectory s\n                                val -> throwError $ ErrorCall $ \"when resolving relative path, __cur_file is in scope, but is not a path; it is: \" <> show val\n                          )\n                            <=< demand\n                        )\n                        =<< lookupVar \"__cur_file\"\n                )\n                (pure origPathExpanded)\n                (isAbsolute origPathExpanded)\n\nexpandHomePath :: (MonadFile m) => Path -> m Path\nexpandHomePath (coerce -> ('~' : xs)) = (<> coerce xs) <$> getHomeDirectory\nexpandHomePath p = pure p\n\n{- | Incorrectly normalize paths by rewriting patterns like @a/b/..@ to @a@.\n  This is incorrect on POSIX systems, because if @b@ is a symlink, its\n  parent may be a different directory from @a@. See the discussion at\n  https://hackage.haskell.org/package/directory-1.3.1.5/docs/System-Directory.html#v:canonicalizePath\n-}\nremoveDotDotIndirections :: Path -> Path\nremoveDotDotIndirections = coerce . intercalate \"/\" . go mempty . splitOn \"/\" . coerce\n  where\n    go s [] = reverse s\n    go (_ : s) (\"..\" : rest) = go s rest\n    go s (this : rest) = go (this : s) rest\n\ninfixr 9 <///>\n(<///>) :: Path -> Path -> Path\nx <///> y\n    | isAbsolute y || \".\" `isPrefixOf` coerce y = x </> y\n    | otherwise = joinByLargestOverlap x y\n  where\n    joinByLargestOverlap :: Path -> Path -> Path\n    joinByLargestOverlap (splitDirectories -> xs) (splitDirectories -> ys) =\n        joinPath $\n            case [xs <> drop (length tx) ys | tx <- tails xs, tx `elem` inits ys] of\n                (r : _) -> r\n                [] -> xs\n\ndefaultFindEnvPath :: (MonadNix e t f m) => String -> m Path\ndefaultFindEnvPath = findEnvPathM . coerce\n\nfindEnvPathM :: forall e t f m. (MonadNix e t f m) => Path -> m Path\nfindEnvPathM name =\n    maybe\n        (fail \"impossible\")\n        ( \\v ->\n            do\n                l <- fromValue @[NValue t f m] =<< demand v\n                findPathBy nixFilePath l name\n        )\n        =<< lookupVar \"__nixPath\"\n  where\n    nixFilePath :: (MonadEffects t f m) => Path -> m (Maybe Path)\n    nixFilePath path =\n        do\n            absPath <- toAbsolutePath @t @f path\n            isDir <- doesDirectoryExist absPath\n            absFile <-\n                bool\n                    (pure absPath)\n                    (toAbsolutePath @t @f $ absPath </> \"default.nix\")\n                    isDir\n\n            (pure absFile `whenTrue`) <$> doesFileExist absFile\n\nfindPathBy ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    (Path -> m (Maybe Path)) ->\n    [NValue t f m] ->\n    Path ->\n    m Path\nfindPathBy finder ls name =\n    maybe\n        (throwError $ ErrorCall $ \"file ''\" <> coerce name <> \"'' was not found in the Nix search path (add it's using $NIX_PATH or -I)\")\n        pure\n        =<< foldM fun mempty ls\n  where\n    fun ::\n        (MonadNix e t f m) =>\n        Maybe Path ->\n        NValue t f m ->\n        m (Maybe Path)\n    fun =\n        maybe\n            ( \\nv ->\n                do\n                    (s :: HashMap VarName (NValue t f m)) <- fromValue =<< demand nv\n                    p <- resolvePath s\n                    path <- fromValue =<< demand p\n\n                    maybe\n                        (tryPath path mempty)\n                        ( \\nv' ->\n                            do\n                                mns <- fromValueMay @NixString =<< demand nv'\n                                tryPath path $\n                                    whenJust\n                                        ( \\nsPfx ->\n                                            let pfx = ignoreContext nsPfx\n                                             in pure $ coerce $ toString pfx `whenFalse` Text.null pfx\n                                        )\n                                        mns\n                        )\n                        (M.lookup \"prefix\" s)\n            )\n            (const . pure . pure)\n\n    tryPath :: Path -> Maybe Path -> m (Maybe Path)\n    tryPath p (Just n)\n        | n' : ns <- splitDirectories name\n        , n == n' =\n            finder $ p <///> joinPath ns\n    tryPath p _ = finder $ p <///> name\n\n    resolvePath :: HashMap VarName (NValue t f m) -> m (NValue t f m)\n    resolvePath s =\n        maybe\n            ( maybe\n                (throwError $ ErrorCall $ \"__nixPath must be a list of attr sets with 'path' elements, but received: \" <> show s)\n                (defer . fetchTarball)\n                (M.lookup \"uri\" s)\n            )\n            pure\n            (M.lookup \"path\" s)\n\nfetchTarball ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    m (NValue t f m)\nfetchTarball =\n    \\case\n        NVSet _ s ->\n            maybe\n                (throwError $ ErrorCall \"builtins.fetchTarball: Missing url attribute\")\n                (fetchFromString (M.lookup \"sha256\" s) <=< demand)\n                (M.lookup \"url\" s)\n        v@NVStr{} -> fetchFromString Nothing v\n        v -> throwError $ ErrorCall $ \"builtins.fetchTarball: Expected URI or set, got \" <> show v\n        <=< demand\n  where\n    fetchFromString ::\n        Maybe (NValue t f m) ->\n        NValue t f m ->\n        m (NValue t f m)\n    fetchFromString msha =\n        \\case\n            NVStr ns -> fetch (ignoreContext ns) msha\n            v -> throwError $ ErrorCall $ \"builtins.fetchTarball: Expected URI or string, got \" <> show v\n\n    {- jww (2018-04-11): This should be written using pipes in another module\n        fetch :: Text -> Maybe (NThunk m) -> m (NValue t f m)\n        fetch uri msha = case takeExtension uri of\n            \".tgz\" -> undefined\n            \".gz\"  -> undefined\n            \".bz2\" -> undefined\n            \".xz\"  -> undefined\n            \".tar\" -> undefined\n            ext -> throwError $ ErrorCall $ \"builtins.fetchTarball: Unsupported extension '\"\n                      <> ext <> \"'\"\n    -}\n\n    fetch :: Text -> Maybe (NValue t f m) -> m (NValue t f m)\n    fetch uri =\n        maybe\n            ( nixInstantiateExpr $\n                \"builtins.fetchTarball \\\"\" <> uri <> \"\\\"\"\n            )\n            ( \\v ->\n                do\n                    nsSha <- fromValue =<< demand v\n\n                    let sha = ignoreContext nsSha\n\n                    nixInstantiateExpr $\n                        \"builtins.fetchTarball { \" <> \"url    = \\\"\" <> uri <> \"\\\"; \" <> \"sha256 = \\\"\" <> sha <> \"\\\"; }\"\n            )\n\ndefaultFindPath :: (MonadNix e t f m) => [NValue t f m] -> Path -> m Path\ndefaultFindPath = findPathM\n\nfindPathM ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    [NValue t f m] ->\n    Path ->\n    m Path\nfindPathM = findPathBy existingPath\n  where\n    existingPath :: (MonadEffects t f m) => Path -> m (Maybe Path)\n    existingPath path =\n        do\n            apath <- toAbsolutePath @t @f path\n            doesExist <- doesPathExist apath\n            pure $ pure apath `whenTrue` doesExist\n\ndefaultImportPath ::\n    (MonadNix e t f m, MonadState (HashMap Path NExprLoc, b) m) =>\n    Path ->\n    m (NValue t f m)\ndefaultImportPath path =\n    do\n        traceM $ \"Importing file \" <> coerce path\n        withFrame\n            Info\n            (ErrorCall $ \"While importing file \" <> show path)\n            $ evalExprLoc\n                =<< ( maybe\n                        ( either\n                            (\\err -> throwError $ ErrorCall . show $ fillSep [\"Parse during import failed:\", err])\n                            ( \\expr ->\n                                do\n                                    modify $ first $ M.insert path expr\n                                    pure expr\n                            )\n                            =<< parseNixFileLoc path\n                        )\n                        pure -- return expr\n                        . M.lookup path\n                    )\n                =<< gets fst\n\ndefaultPathToDefaultNix :: (MonadNix e t f m) => Path -> m Path\ndefaultPathToDefaultNix = pathToDefaultNixFile\n\n-- Given a path, determine the nix file to load\npathToDefaultNixFile :: (MonadFile m) => Path -> m Path\npathToDefaultNixFile p =\n    do\n        isDir <- doesDirectoryExist p\n        pure $ p </> \"default.nix\" `whenTrue` isDir\n\ndefaultTraceEffect :: (MonadPutStr m) => String -> m ()\ndefaultTraceEffect = Nix.Effects.putStrLn\n"
  },
  {
    "path": "src/Nix/Effects/Derivation.hs",
    "content": "{-# LANGUAGE CPP #-}\n{-# LANGUAGE DataKinds #-}\n{-# LANGUAGE ExistentialQuantification #-}\n{-# LANGUAGE NamedFieldPuns #-}\n-- 2021-07-05: Due to hashing Haskell IT system situation, in HNix we currently ended-up with 2 hash package dependencies @{hashing, cryptonite}@\n{-# LANGUAGE PackageImports #-}\n{-# LANGUAGE RecordWildCards #-}\n{-# LANGUAGE TypeApplications #-}\n\nmodule Nix.Effects.Derivation (defaultDerivationStrict) where\n\nimport Data.ByteArray (convert)\nimport Data.ByteArray.Encoding (Base (Base16), convertToBase)\nimport Data.Char (\n    isAlphaNum,\n    isAscii,\n )\nimport Data.Default.Class (def)\nimport Data.Foldable (foldl)\nimport qualified Data.HashMap.Lazy as M\nimport qualified Data.HashMap.Strict as MS (insert)\nimport qualified Data.HashSet as S\nimport qualified Data.Map.Strict as Map\nimport qualified Data.Set as Set\nimport qualified Data.Text as Text\nimport GHC.Exception (ErrorCall (ErrorCall))\nimport Nix.Prelude hiding (readFile)\n\nimport Text.Megaparsec\nimport Text.Megaparsec.Char\n\nimport qualified System.Nix.Base32 as Base32\nimport qualified \"cryptonite\" Crypto.Hash as Hash\n\nimport Nix.Atoms\nimport Nix.Convert\nimport Nix.Effects\nimport Nix.Exec (\n    MonadNix,\n    callFunc,\n )\nimport Nix.Expr.Types hiding (Recursive)\nimport Nix.Frames\nimport Nix.Json (toJSONNixString)\nimport Nix.Render\nimport Nix.String\nimport Nix.String.Coerce\nimport Nix.Value\nimport Nix.Value.Monad\n\nimport Data.Dependent.Sum (DSum (..))\nimport qualified Data.Dependent.Sum as DSum\nimport qualified System.Nix.Hash as Store\nimport qualified System.Nix.StorePath as Store\nimport qualified \"crypton\" Crypto.Hash as CryptonHash\n\n-- Type for fixed-output derivation hash digest\n-- Digest comes from crypton (Crypto.Hash.Digest)\ntype HashDigest = DSum Store.HashAlgo CryptonHash.Digest\n\n-- Helper functions to work with HashDigest\nhashDigestAlgoText :: HashDigest -> Text\nhashDigestAlgoText (hashAlgo DSum.:=> _) = Store.algoToText hashAlgo\n\nhashDigestText :: HashDigest -> Text\nhashDigestText (_ DSum.:=> hashDigest) = Store.encodeDigestWith Store.NixBase32 hashDigest\n\n--  2021-07-17: NOTE: Derivation consists of @\"keys\"@ @\"vals\"@ (of text), so underlining type boundary currently stops here.\ndata Derivation = Derivation\n    { name :: Text\n    , outputs :: Map Text Text\n    , inputs :: (Set Text, Map Text [Text])\n    , platform :: Text\n    , builder :: Text -- should be typed as a store path\n    , args :: [Text]\n    , env :: Map Text Text\n    , mFixed :: Maybe HashDigest -- Opaque type for hash digest\n    , hashMode :: HashMode\n    , useJson :: Bool\n    }\n    deriving (Show)\n\ndata HashMode = Flat | Recursive\n    deriving (Show, Eq)\n\nmakeStorePathName :: (Framed e m) => Text -> m Store.StorePathName\nmakeStorePathName name = case Store.mkStorePathName name of\n    Left err -> throwError $ ErrorCall $ \"Invalid name '\" <> show name <> \"' for use in a store path: \" <> show err\n    Right spname -> pure spname\n\nparsePath :: (Framed e m) => Text -> m Store.StorePath\nparsePath p = case Store.parsePath def (encodeUtf8 p) of\n    Left err -> throwError $ ErrorCall $ \"Cannot parse store path \" <> show p <> \":\\n\" <> show err\n    Right path -> pure path\n\nwriteDerivation :: (Framed e m, MonadStore m) => Derivation -> m Store.StorePath\nwriteDerivation drv@Derivation{inputs, name} = do\n    let (inputSrcs, inputDrvs) = inputs\n    referencePaths <- traverse parsePath (Set.toList $ inputSrcs <> Set.fromList (fst <$> Map.toList inputDrvs))\n    let references = S.fromList $ fmap (StorePath . fromString . decodeUtf8 . Store.storePathToRawFilePath def) referencePaths\n    path <- addTextToStore (Text.append name \".drv\") (unparseDrv drv) references False\n    parsePath $ fromString $ coerce path\n\n{- | Traverse the graph of inputDrvs to replace fixed output derivations with their fixed output hash.\nthis avoids propagating changes to their .drv when the output hash stays the same.\n-}\nhashDerivationModulo :: (MonadNix e t f m, MonadState (b, KeyMap Text) m) => Derivation -> m (Hash.Digest Hash.SHA256)\nhashDerivationModulo\n    Derivation\n        { mFixed = Just digest\n        , outputs = _outputs\n        , hashMode\n        , name = _name\n        } =\n        do\n            -- For fixed-output derivations, hash a special string encoding the content address\n            -- Format: \"fixed:out:<hashMode>:<hashAlgo>:<hash>\"\n            -- This allows multiple derivations to share the same hash if they produce the same output\n            let algoText = hashDigestAlgoText digest\n            let hashText = hashDigestText digest\n            let modePrefix = case hashMode of\n                    Recursive -> \"r:\"\n                    Flat -> mempty\n            let toHash = \"fixed:out:\" <> modePrefix <> algoText <> \":\" <> hashText\n            pure $ Hash.hash @ByteString @Hash.SHA256 $ encodeUtf8 toHash\nhashDerivationModulo\n    drv@Derivation\n        { inputs =\n            ( inputSrcs\n                , inputDrvs\n                )\n        } =\n        do\n            cache <- gets snd\n            inputsModulo <-\n                Map.fromList\n                    <$> traverse\n                        ( \\(path, outs) ->\n                            maybe\n                                ( do\n                                    drv' <- readDerivation $ coerce $ toString path\n                                    digestValue <- hashDerivationModulo drv'\n                                    -- Convert digest to base32 for Nix store paths (get raw bytes, not hex string)\n                                    let hashBytes = convert digestValue :: ByteString\n                                    let hash = Base32.encode hashBytes\n                                    pure (hash, outs)\n                                )\n                                (\\hash -> pure (hash, outs))\n                                (M.lookup path cache)\n                        )\n                        (Map.toList inputDrvs)\n            pure $ Hash.hash @ByteString @Hash.SHA256 $ encodeUtf8 $ unparseDrv $ drv{inputs = (inputSrcs, inputsModulo)}\n\nunparseDrv :: Derivation -> Text\nunparseDrv Derivation{..} =\n    Text.append\n        \"Derive\"\n        $ parens\n            [ -- outputs: [(\"out\", \"/nix/store/.....-out\", \"\", \"\"), ...]\n              serializeList $\n                produceOutputInfo <$> Map.toList outputs\n            , -- inputDrvs\n              serializeList $\n                ( \\(path, outs) ->\n                    parens [s path, serializeList $ s <$> sort outs]\n                )\n                    <$> Map.toList (snd inputs)\n            , -- inputSrcs\n              serializeList $ s <$> Set.toList (fst inputs)\n            , s platform\n            , s builder\n            , -- run script args\n              serializeList $ s <$> args\n            , -- env (key value pairs)\n              serializeList $ (\\(k, v) -> parens [s k, s v]) <$> Map.toList env\n            ]\n  where\n    produceOutputInfo (outputName, outputPath) =\n        parens $\n            (s <$>) $\n                ([outputName, outputPath] <>) $\n                    maybe\n                        [mempty, mempty]\n                        ( \\digest ->\n                            let algoText = hashDigestAlgoText digest\n                                hashText = hashDigestText digest\n                                modePrefix = if hashMode == Recursive then \"r:\" else mempty\n                                hashType = modePrefix <> algoText\n                             in [hashType, hashText]\n                        )\n                        mFixed\n    parens :: [Text] -> Text\n    parens ts = Text.concat [\"(\", Text.intercalate \",\" ts, \")\"]\n\n    serializeList :: [Text] -> Text\n    serializeList ls = Text.concat [\"[\", Text.intercalate \",\" ls, \"]\"]\n\n    s = Text.cons '\\\"' . (`Text.snoc` '\\\"') . Text.concatMap escape\n\n    escape :: Char -> Text\n    escape '\\\\' = \"\\\\\\\\\"\n    escape '\\\"' = \"\\\\\\\"\"\n    escape '\\n' = \"\\\\n\"\n    escape '\\r' = \"\\\\r\"\n    escape '\\t' = \"\\\\t\"\n    escape c = one c\n\nreadDerivation :: (Framed e m, MonadFile m) => Path -> m Derivation\nreadDerivation path = do\n    content <- readFile path\n    either\n        (\\err -> throwError $ ErrorCall $ \"Failed to parse \" <> show path <> \":\\n\" <> show err)\n        pure\n        (parse derivationParser (coerce path) content)\n\nderivationParser :: Parsec () Text Derivation\nderivationParser = do\n    _ <- \"Derive(\"\n    fullOutputs <-\n        serializeList $\n            (\\[n, p, ht, h] -> (n, p, ht, h)) <$> parens s\n    _ <- \",\"\n    inputDrvs <-\n        Map.fromList\n            <$> serializeList\n                (liftA2 (,) (\"(\" *> s <* \",\") (serializeList s <* \")\"))\n    _ <- \",\"\n    inputSrcs <- Set.fromList <$> serializeList s\n    _ <- \",\"\n    platform <- s\n    _ <- \",\"\n    builder <- s\n    _ <- \",\"\n    args <- serializeList s\n    _ <- \",\"\n    env <- fmap Map.fromList $ serializeList $ (\\[a, b] -> (a, b)) <$> parens s\n    _ <- \")\"\n    eof\n\n    let outputs = Map.fromList $ (\\(a, b, _, _) -> (a, b)) <$> fullOutputs\n    let (mFixed, hashMode) = parseFixed fullOutputs\n    let name = mempty -- FIXME (extract from file path ?)\n    let useJson = one \"__json\" == Map.keys env\n\n    pure $ Derivation{inputs = (inputSrcs, inputDrvs), ..}\n  where\n    s :: Parsec () Text Text\n    s = fmap fromString $ string \"\\\"\" *> manyTill (escaped <|> regular) (string \"\\\"\")\n    escaped =\n        char '\\\\'\n            *> ( '\\n' <$ string \"n\"\n                    <|> '\\r' <$ string \"r\"\n                    <|> '\\t' <$ string \"t\"\n                    <|> anySingle\n               )\n    regular = noneOf ['\\\\', '\"']\n\n    wrap o c p =\n        string o *> sepBy p (string \",\") <* string c\n\n    parens :: Parsec () Text a -> Parsec () Text [a]\n    parens = wrap \"(\" \")\"\n    serializeList :: Parsec () Text a -> Parsec () Text [a]\n    serializeList = wrap \"[\" \"]\"\n\n    parseFixed :: [(Text, Text, Text, Text)] -> (Maybe HashDigest, HashMode)\n    parseFixed fullOutputs = case fullOutputs of\n        [(\"out\", _path, rht, hash)]\n            | rht /= mempty && hash /= mempty ->\n                let\n                    (hashType, hashMode) = case Text.splitOn \":\" rht of\n                        [\"r\", ht] -> (ht, Recursive)\n                        [ht] -> (ht, Flat)\n                        _ -> error $ \"Unsupported hash type for output of fixed-output derivation in .drv file: \" <> show fullOutputs\n                 in\n                    case Store.mkNamedDigest hashType hash of\n                        Left err -> error $ show $ \"Unsupported hash \" <> show (hashType <> \":\" <> hash) <> \" in .drv file: \" <> err\n                        Right digest -> (Just digest, hashMode)\n        _ -> (Nothing, Flat)\n\ndefaultDerivationStrict :: forall e t f m b. (MonadNix e t f m, MonadState (b, KeyMap Text) m) => NValue t f m -> m (NValue t f m)\ndefaultDerivationStrict val = do\n    s <- M.mapKeys coerce <$> fromValue @(AttrSet (NValue t f m)) val\n    (drv, ctx) <- runWithStringContextT' $ buildDerivationWithContext s\n    drvName <- makeStorePathName $ name drv\n    let\n        inputs = toStorePaths ctx\n        ifNotJsonModEnv f =\n            bool\n                f\n                id\n                (useJson drv)\n                (env drv)\n\n    -- Compute the output paths, and add them to the environment if needed.\n    -- Also add the inputs, just computed from the strings contexts.\n    drv' <- case mFixed drv of\n        Just digest -> do\n            -- Fixed-output derivation: output path is content-addressed\n            outputPath <- makeFixedOutputPath drvName digest (hashMode drv)\n            let outputs' = one (\"out\", outputPath)\n            pure $\n                drv\n                    { inputs\n                    , outputs = outputs'\n                    , env = ifNotJsonModEnv (outputs' <>)\n                    }\n        Nothing -> do\n            hash <-\n                hashDerivationModulo $\n                    drv\n                        { inputs\n                        , -- , outputs = Map.map (const \"\") (outputs drv)  -- not needed, this is already the case\n                          env =\n                            ifNotJsonModEnv\n                                ( \\baseEnv ->\n                                    foldl'\n                                        (\\m k -> Map.insert k mempty m)\n                                        baseEnv\n                                        (Map.keys $ outputs drv)\n                                )\n                        }\n            outputs' <- sequenceA $ Map.mapWithKey (\\o _ -> makeOutputPath o hash drvName) $ outputs drv\n            pure $\n                drv\n                    { inputs\n                    , outputs = outputs'\n                    , env = ifNotJsonModEnv (outputs' <>)\n                    }\n\n    (coerce @Text @VarName -> drvPath) <- pathToText <$> writeDerivation drv'\n\n    -- Memoize here, as it may be our last chance in case of readonly stores.\n    digestValue <- hashDerivationModulo drv'\n    -- Convert digest to base32 for Nix store paths (get raw bytes, not hex string)\n    let drvHashBytes = convert digestValue :: ByteString\n    let drvHash = Base32.encode drvHashBytes\n    modify $ second $ MS.insert (coerce drvPath) drvHash\n\n    let\n        outputsWithContext =\n            Map.mapWithKey\n                (\\out (coerce -> path) -> mkNixStringWithSingletonContext (StringContext (DerivationOutput out) drvPath) path)\n                (outputs drv')\n        drvPathWithContext = mkNixStringWithSingletonContext (StringContext AllOutputs drvPath) drvPath\n        attrSet = NVStr <$> M.fromList ((\"drvPath\", drvPathWithContext) : Map.toList outputsWithContext)\n    -- TODO: Add location information for all the entries.\n    --              here --v\n    pure $ NVSet mempty $ M.mapKeys coerce attrSet\n  where\n    pathToText = decodeUtf8 . Store.storePathToRawFilePath def\n\n    makeFixedOutputPath :: (Framed e m) => Store.StorePathName -> HashDigest -> HashMode -> m Text\n    makeFixedOutputPath name digest mode = do\n        -- For fixed-output derivations, the output path is computed from the content hash\n        -- Format: \"fixed:out:<hashMode>:<hashAlgo>:<hash>:/nix/store:<name>\"\n        let algoText = hashDigestAlgoText digest\n        let hashText = hashDigestText digest\n        let modePrefix = case mode of\n                Recursive -> \"r:\"\n                Flat -> mempty\n        let toHash = \"fixed:out:\" <> modePrefix <> algoText <> \":\" <> hashText <> \":/nix/store:\" <> Store.unStorePathName name\n        -- Use SHA256 to compute the store path hash\n        let hashPart = Store.mkStorePathHashPart @CryptonHash.SHA256 (encodeUtf8 toHash)\n        let hashBase32 = Base32.encode $ Store.unStorePathHashPart hashPart\n        pure $ \"/nix/store/\" <> hashBase32 <> \"-\" <> Store.unStorePathName name\n\n    makeOutputPath o h n = do\n        name <- makeStorePathName $ Store.unStorePathName n <> if o == \"out\" then mempty else \"-\" <> o\n        -- Compute the output path hash according to Nix's algorithm:\n        -- For non-fixed outputs, hash = sha256(\"output:<outputName>:sha256:<drv_modulo_hex>:/nix/store:<outputPathName>\")\n        -- where outputPathName is the base name for \"out\", or base name + \"-\" + output name for other outputs\n        -- Convert the hash digest to hex string (lowercase)\n        let drvHashHex = decodeUtf8 (convertToBase Base16 h :: ByteString)\n        -- The final name in the hash input must match the output-specific name (same as 'name')\n        -- This is critical: Nix's makeOutputPath uses outputPathName(drvName, outputName) here\n        let toHash = \"output:\" <> o <> \":sha256:\" <> drvHashHex <> \":/nix/store:\" <> Store.unStorePathName name\n        -- Use hnix-store-core's mkStorePathHashPart which handles truncation and returns raw bytes\n        -- Use crypton's SHA256 (compatible with hnix-store-core)\n        let hashPart = Store.mkStorePathHashPart @CryptonHash.SHA256 (encodeUtf8 toHash)\n        -- Extract raw bytes and base32-encode using Nix base32\n        let hashText = Base32.encode $ Store.unStorePathHashPart hashPart\n        -- Build the store path\n        pure $ \"/nix/store/\" <> hashText <> \"-\" <> Store.unStorePathName name\n\n    toStorePaths :: HashSet StringContext -> (Set Text, Map Text [Text])\n    toStorePaths = foldl (flip addToInputs) mempty\n\n    addToInputs :: (Bifunctor p) => StringContext -> p (Set Text) (Map Text [Text]) -> p (Set Text) (Map Text [Text])\n    addToInputs (StringContext kind (coerce -> path)) =\n        case kind of\n            DirectPath -> first $ Set.insert path\n            DerivationOutput o -> second $ Map.insertWith (<>) path $ one o\n            AllOutputs ->\n                -- TODO: recursive lookup. See prim_derivationStrict\n                -- XXX: When is this really used ?\n                error \"Not implemented: derivations depending on a .drv file are not yet supported.\"\n\n{- | Build a derivation in a context collecting string contexts.\nThis is complex from a typing standpoint, but it allows to perform the\nfull computation without worrying too much about all the string's contexts.\n-}\nbuildDerivationWithContext :: forall e t f m. (MonadNix e t f m) => KeyMap (NValue t f m) -> WithStringContextT m Derivation\nbuildDerivationWithContext drvAttrs = do\n    -- Parse name first, so we can add an informative frame\n    drvName <- getAttr \"name\" $ assertDrvStoreName <=< extractNixString\n    withFrame' Info (ErrorCall $ \"While evaluating derivation \" <> show drvName) $ do\n        useJson <- getAttrOr \"__structuredAttrs\" False pure\n        ignoreNulls <- getAttrOr \"__ignoreNulls\" False pure\n\n        args <- getAttrOr \"args\" mempty $ traverse (extractNixString <=< fromValue')\n        builder <- getAttr \"builder\" extractNixString\n        platform <- getAttr \"system\" $ assertNonNull <=< extractNoCtx\n        mHash <- getAttrOr \"outputHash\" mempty $ (pure . pure) <=< extractNoCtx\n        hashMode <- getAttrOr \"outputHashMode\" Flat $ parseHashMode <=< extractNoCtx\n        outputs <- getAttrOr \"outputs\" (one \"out\") $ traverse (extractNoCtx <=< fromValue')\n\n        mFixedOutput <-\n            maybe\n                (pure Nothing)\n                ( \\hash -> do\n                    when (outputs /= one \"out\") $ lift $ throwError $ ErrorCall \"Multiple outputs are not supported for fixed-output derivations\"\n                    hashType <- getAttr \"outputHashAlgo\" extractNoCtx\n                    -- mkNamedDigest returns Either String (DSum HashAlgo Digest)\n                    digest <- lift $ either (throwError . ErrorCall) pure $ Store.mkNamedDigest hashType hash\n                    pure $ Just digest\n                )\n                mHash\n\n        -- filter out null values if needed.\n        attrs <-\n            lift $\n                bool\n                    (pure drvAttrs)\n                    ( M.mapMaybe id\n                        <$> traverse\n                            ( fmap\n                                ( \\case\n                                    NVConstant NNull -> Nothing\n                                    _value -> Just _value\n                                )\n                                . demand\n                            )\n                            drvAttrs\n                    )\n                    ignoreNulls\n\n        env <-\n            if useJson\n                then do\n                    jsonString :: NixString <-\n                        lift $\n                            toJSONNixString $\n                                NVSet mempty $\n                                    M.mapKeys coerce $\n                                        deleteKeys [\"args\", \"__ignoreNulls\", \"__structuredAttrs\"] attrs\n                    rawString :: Text <- extractNixString jsonString\n                    pure $ one (\"__json\", rawString)\n                else\n                    traverse (extractNixString <=< lift . coerceAnyToNixString callFunc CopyToStore) $\n                        Map.fromList $\n                            M.toList $\n                                deleteKeys [\"args\", \"__ignoreNulls\"] attrs\n\n        pure $\n            Derivation\n                { platform\n                , builder\n                , args\n                , env\n                , hashMode\n                , useJson\n                , name = drvName\n                , outputs = Map.fromList $ (,mempty) <$> outputs\n                , mFixed = mFixedOutput\n                , inputs = mempty -- stub for now\n                }\n  where\n    -- common functions, lifted to WithStringContextT\n\n    fromValue' :: (FromValue a m (NValue' t f m (NValue t f m)), MonadNix e t f m) => NValue t f m -> WithStringContextT m a\n    fromValue' = lift . fromValue\n\n    withFrame' :: (Framed e m, Exception s) => NixLevel -> s -> WithStringContextT m a -> WithStringContextT m a\n    withFrame' level f = join . lift . withFrame level f . pure\n\n    -- shortcuts to get the (forced) value of an KeyMap field\n\n    getAttrOr' ::\n        forall v a.\n        (MonadNix e t f m, FromValue v m (NValue' t f m (NValue t f m))) =>\n        Text ->\n        m a ->\n        (v -> WithStringContextT m a) ->\n        WithStringContextT m a\n    getAttrOr' n d f = case M.lookup n drvAttrs of\n        Nothing -> lift d\n        Just v ->\n            withFrame' Info (ErrorCall $ \"While evaluating attribute '\" <> show n <> \"'\") $\n                f =<< fromValue' v\n\n    getAttrOr n = getAttrOr' n . pure\n\n    getAttr n = getAttrOr' n (throwError $ ErrorCall $ \"Required attribute '\" <> show n <> \"' not found.\")\n\n    -- Test validity for fields\n\n    assertDrvStoreName :: (MonadNix e t f m) => Text -> WithStringContextT m Text\n    assertDrvStoreName name = lift $ do\n        let invalid c = not $ isAscii c && (isAlphaNum c || c `elem` (\"+-._?=\" :: String)) -- isAlphaNum allows non-ascii chars.\n        let failWith reason = throwError $ ErrorCall $ \"Store name \" <> show name <> \" \" <> reason\n        when (\".\" `Text.isPrefixOf` name) $ failWith \"cannot start with a period\"\n        when (Text.length name > 211) $ failWith \"must be no longer than 211 characters\"\n        when (Text.any invalid name) $ failWith \"contains some invalid character\"\n        when (\".drv\" `Text.isSuffixOf` name) $ failWith \"is not allowed to end in '.drv'\"\n        pure name\n\n    extractNoCtx :: (MonadNix e t f m) => NixString -> WithStringContextT m Text\n    extractNoCtx ns =\n        maybe\n            (lift $ throwError $ ErrorCall $ \"The string \" <> show ns <> \" is not allowed to have a context.\")\n            pure\n            (getStringNoContext ns)\n\n    assertNonNull :: (MonadNix e t f m) => Text -> WithStringContextT m Text\n    assertNonNull t = do\n        when (Text.null t) $ lift $ throwError $ ErrorCall \"Value must not be empty\"\n        pure t\n\n    parseHashMode :: (MonadNix e t f m) => Text -> WithStringContextT m HashMode\n    parseHashMode = \\case\n        \"flat\" -> pure Flat\n        \"recursive\" -> pure Recursive\n        other -> lift $ throwError $ ErrorCall $ \"Hash mode \" <> show other <> \" is not valid. It must be either 'flat' or 'recursive'\"\n\n    -- Other helpers\n\n    deleteKeys :: [Text] -> KeyMap a -> KeyMap a\n    deleteKeys keys attrSet = foldl' (flip M.delete) attrSet keys\n"
  },
  {
    "path": "src/Nix/Effects.hs",
    "content": "{-# LANGUAGE AllowAmbiguousTypes #-}\n{-# LANGUAGE CPP #-}\n{-# LANGUAGE DataKinds #-}\n{-# LANGUAGE DefaultSignatures #-}\n{-# LANGUAGE GeneralizedNewtypeDeriving #-}\n{-# LANGUAGE TypeFamilies #-}\n{-# LANGUAGE TypeOperators #-}\n{-# LANGUAGE UndecidableInstances #-}\n{-# OPTIONS_GHC -Wno-orphans #-}\n\nmodule Nix.Effects where\n\nimport qualified Data.HashSet as HS\nimport qualified Data.Text as Text\nimport GHC.Exception (ErrorCall (ErrorCall))\nimport Network.HTTP.Client hiding (Proxy, path)\nimport Network.HTTP.Client.TLS\nimport Network.HTTP.Types\nimport Nix.Expr.Types.Annotated\nimport Nix.Frames hiding (Proxy)\nimport Nix.Parser\nimport Nix.Prelude hiding (\n    print,\n    putStrLn,\n )\nimport qualified Nix.Prelude as Prelude\nimport Nix.Render\nimport Nix.Utils.Fix1\nimport Nix.Value\nimport qualified Paths_hnix\nimport System.Exit\nimport qualified System.Info\nimport System.Process\n\nimport Data.Default.Class (def)\nimport Data.Some.Newtype (Some (..))\nimport qualified System.Nix.Hash as Store.Hash\nimport qualified System.Nix.Nar as Store.Nar\nimport qualified System.Nix.Store.Remote as Store.Remote\nimport qualified System.Nix.StorePath as Store\n\n-- | A path into the nix store\nnewtype StorePath = StorePath Path\n    deriving (Eq, Ord, Show, Hashable)\n\n-- All of the following type classes defer to the underlying 'm'.\n\n-- * @class MonadEffects t f m@\n\nclass\n    ( MonadFile m\n    , MonadStore m\n    , MonadPutStr m\n    , MonadHttp m\n    , MonadEnv m\n    , MonadPaths m\n    , MonadInstantiate m\n    , MonadExec m\n    , MonadIntrospect m\n    ) =>\n    MonadEffects t f m\n    where\n    -- | Determine the absolute path in the current context.\n    toAbsolutePath :: Path -> m Path\n\n    findEnvPath :: String -> m Path\n\n    -- | Having an explicit list of sets corresponding to the @NIX_PATH@ and a file path try to find an existing path.\n    findPath :: [NValue t f m] -> Path -> m Path\n\n    importPath :: Path -> m (NValue t f m)\n    pathToDefaultNix :: Path -> m Path\n\n    derivationStrict :: NValue t f m -> m (NValue t f m)\n\n    --  2021-04-01: for trace, so leaving String here\n    traceEffect :: String -> m ()\n\n-- ** Instances\n\ninstance\n    ( MonadFix1T t m\n    , MonadStore m\n    ) =>\n    MonadStore (Fix1T t m)\n    where\n    addToStore a b c d = lift $ addToStore a b c d\n    addTextToStore' a b c d = lift $ addTextToStore' a b c d\n\n-- * @class MonadIntrospect m@\n\nclass\n    (Monad m) =>\n    MonadIntrospect m\n    where\n    recursiveSize :: a -> m Word\n    default recursiveSize :: (MonadTrans t, MonadIntrospect m', m ~ t m') => a -> m Word\n    recursiveSize = lift . recursiveSize\n\n-- ** Instances\n\n{- FOURMOLU_DISABLE -}\ninstance MonadIntrospect IO where\n  recursiveSize =\n#ifdef MIN_VERSION_ghc_datasize\n    recursiveSize\n#else\n    const $ pure 0\n#endif\n{- FOURMOLU_ENABLE -}\n\nderiving instance\n    (MonadIntrospect (t (Fix1 t))) =>\n    MonadIntrospect (Fix1 t)\n\nderiving instance\n    (MonadIntrospect (t (Fix1T t m) m)) =>\n    MonadIntrospect (Fix1T t m)\n\n-- * @class MonadExec m@\n\nclass\n    (Monad m) =>\n    MonadExec m\n    where\n    exec' :: [Text] -> m (Either ErrorCall NExprLoc)\n    default exec' ::\n        (MonadTrans t, MonadExec m', m ~ t m') =>\n        [Text] ->\n        m (Either ErrorCall NExprLoc)\n    exec' = lift . exec'\n\n-- ** Instances\n\ninstance MonadExec IO where\n    exec' = \\case\n        [] -> pure $ Left $ ErrorCall \"exec: missing program\"\n        (prog : args) -> do\n            (exitCode, out, _) <- liftIO $ readProcessWithExitCode (toString prog) (toString <$> args) mempty\n            let\n                t = Text.strip $ fromString out\n                emsg = \"program[\" <> prog <> \"] args=\" <> show args\n            case exitCode of\n                ExitSuccess ->\n                    pure $\n                        if Text.null t\n                            then Left $ ErrorCall $ toString $ \"exec has no output :\" <> emsg\n                            else\n                                either\n                                    (\\err -> Left $ ErrorCall $ toString $ \"Error parsing output of exec: \" <> show err <> \" \" <> emsg)\n                                    pure\n                                    (parseNixTextLoc t)\n                err -> pure $ Left $ ErrorCall $ toString $ \"exec  failed: \" <> show err <> \" \" <> emsg\n\nderiving instance\n    (MonadExec (t (Fix1 t))) =>\n    MonadExec (Fix1 t)\n\nderiving instance\n    (MonadExec (t (Fix1T t m) m)) =>\n    MonadExec (Fix1T t m)\n\n-- * @class MonadInstantiate m@\n\nclass\n    (Monad m) =>\n    MonadInstantiate m\n    where\n    instantiateExpr :: Text -> m (Either ErrorCall NExprLoc)\n    default instantiateExpr :: (MonadTrans t, MonadInstantiate m', m ~ t m') => Text -> m (Either ErrorCall NExprLoc)\n    instantiateExpr = lift . instantiateExpr\n\n-- ** Instances\n\ninstance MonadInstantiate IO where\n    instantiateExpr expr =\n        do\n            traceM $\n                \"Executing: \" <> show [\"nix-instantiate\", \"--eval\", \"--expr \", expr]\n\n            (exitCode, out, err) <-\n                readProcessWithExitCode\n                    \"nix-instantiate\"\n                    [\"--eval\", \"--expr\", toString expr]\n                    mempty\n\n            pure $\n                case exitCode of\n                    ExitSuccess ->\n                        either\n                            (\\e -> Left $ ErrorCall $ \"Error parsing output of nix-instantiate: \" <> show e)\n                            pure\n                            (parseNixTextLoc $ fromString out)\n                    status -> Left $ ErrorCall $ \"nix-instantiate failed: \" <> show status <> \": \" <> err\n\nderiving instance\n    (MonadInstantiate (t (Fix1 t))) =>\n    MonadInstantiate (Fix1 t)\n\nderiving instance\n    (MonadInstantiate (t (Fix1T t m) m)) =>\n    MonadInstantiate (Fix1T t m)\n\n-- * @class MonadEnv m@\n\nclass\n    (Monad m) =>\n    MonadEnv m\n    where\n    getEnvVar :: Text -> m (Maybe Text)\n    default getEnvVar :: (MonadTrans t, MonadEnv m', m ~ t m') => Text -> m (Maybe Text)\n    getEnvVar = lift . getEnvVar\n\n    getCurrentSystemOS :: m Text\n    default getCurrentSystemOS :: (MonadTrans t, MonadEnv m', m ~ t m') => m Text\n    getCurrentSystemOS = lift getCurrentSystemOS\n\n    getCurrentSystemArch :: m Text\n    default getCurrentSystemArch :: (MonadTrans t, MonadEnv m', m ~ t m') => m Text\n    getCurrentSystemArch = lift getCurrentSystemArch\n\n-- ** Instances\n\ninstance MonadEnv IO where\n    getEnvVar = (<<$>>) fromString . lookupEnv . toString\n\n    getCurrentSystemOS = pure $ fromString System.Info.os\n\n    -- Invert the conversion done by GHC_CONVERT_CPU in GHC's aclocal.m4\n    getCurrentSystemArch = pure $ fromString $ case System.Info.arch of\n        \"i386\" -> \"i686\"\n        arch -> arch\n\nderiving instance\n    (MonadEnv (t (Fix1 t))) =>\n    MonadEnv (Fix1 t)\n\nderiving instance\n    (MonadEnv (t (Fix1T t m) m)) =>\n    MonadEnv (Fix1T t m)\n\n-- * @class MonadPaths m@\n\nclass\n    (Monad m) =>\n    MonadPaths m\n    where\n    getDataDir :: m Path\n    default getDataDir :: (MonadTrans t, MonadPaths m', m ~ t m') => m Path\n    getDataDir = lift getDataDir\n\n-- ** Instances\n\ninstance MonadPaths IO where\n    getDataDir = coerce Paths_hnix.getDataDir\n\nderiving instance\n    (MonadPaths (t (Fix1 t))) =>\n    MonadPaths (Fix1 t)\n\nderiving instance\n    (MonadPaths (t (Fix1T t m) m)) =>\n    MonadPaths (Fix1T t m)\n\n-- * @class MonadHttp m@\n\nclass\n    (Monad m) =>\n    MonadHttp m\n    where\n    getURL :: Text -> m (Either ErrorCall StorePath)\n    default getURL :: (MonadTrans t, MonadHttp m', m ~ t m') => Text -> m (Either ErrorCall StorePath)\n    getURL = lift . getURL\n\nbaseNameOf :: Text -> Text\nbaseNameOf a = Text.takeWhileEnd (/= '/') $ Text.dropWhileEnd (== '/') a\n\n-- conversion from Store.StorePath to Effects.StorePath, different type with the same name.\ntoStorePath :: Store.StorePath -> StorePath\ntoStorePath = StorePath . coerce . decodeUtf8 @FilePath @ByteString . Store.storePathToRawFilePath def\n\n-- ** Instances\n\ninstance MonadHttp IO where\n    getURL url =\n        do\n            let urlstr = toString url\n            traceM $ \"fetching HTTP URL: \" <> urlstr\n            req <- parseRequest urlstr\n            manager <-\n                bool\n                    (newManager defaultManagerSettings)\n                    newTlsManager\n                    (secure req)\n            response <- httpLbs (req{method = \"GET\"}) manager\n            let status = statusCode $ responseStatus response\n            let body = responseBody response\n            -- let digest::Hash.Digest Hash.SHA256 = Hash.hash $ (B.concat . BL.toChunks) body\n            let name = baseNameOf url\n            bool\n                (pure $ Left $ ErrorCall $ \"fail, got \" <> show status <> \" when fetching url = \" <> urlstr)\n                -- using addTextToStore' result in different hash from the addToStore.\n                -- see https://github.com/haskell-nix/hnix/pull/1051#issuecomment-1031380804\n                (addToStore name (NarText $ toStrict body) False False)\n                (status == 200)\n\nderiving instance\n    (MonadHttp (t (Fix1 t))) =>\n    MonadHttp (Fix1 t)\n\nderiving instance\n    (MonadHttp (t (Fix1T t m) m)) =>\n    MonadHttp (Fix1T t m)\n\n-- * @class MonadPutStr m@\n\nclass\n    (Monad m, MonadIO m) =>\n    MonadPutStr m\n    where\n    -- TODO: Should this be used *only* when the Nix to be evaluated invokes a\n    -- `trace` operation?\n    --  2021-04-01: Due to trace operation here, leaving it as String.\n    putStr :: String -> m ()\n    default putStr :: (MonadTrans t, MonadPutStr m', m ~ t m') => String -> m ()\n    putStr = lift . Prelude.putStr\n\n-- ** Instances\n\ninstance MonadPutStr IO where\n    putStr = Prelude.putStr\n\nderiving instance\n    (MonadPutStr (t (Fix1 t))) =>\n    MonadPutStr (Fix1 t)\n\nderiving instance\n    (MonadPutStr (t (Fix1T t m) m)) =>\n    MonadPutStr (Fix1T t m)\n\n-- ** Functions\n\nputStrLn :: (MonadPutStr m) => String -> m ()\nputStrLn = Nix.Effects.putStr . (<> \"\\n\")\n\nprint :: (MonadPutStr m, Show a) => a -> m ()\nprint = putStrLn . show\n\n-- * Store effects\n\n-- ** Data type synonyms\n\ntype RecursiveFlag = Bool\ntype RepairFlag = Bool\ntype StorePathName = Text\ntype PathFilter m = Path -> m Bool\ntype StorePathSet = HS.HashSet StorePath\n\n-- ** @class MonadStore m@\n\ndata NarContent = NarFile Path | NarText ByteString\n\n-- | convert NarContent to NarSource needed in the store API\ntoNarSource :: (MonadIO m) => NarContent -> Store.Nar.NarSource m\ntoNarSource (NarFile path) = Store.Nar.dumpPath $ coerce path\ntoNarSource (NarText text) = Store.Nar.dumpString text\n\nclass\n    (Monad m) =>\n    MonadStore m\n    where\n    -- | Copy the contents of a local path(Or pure text) to the store.  The resulting store\n    --     path is returned.  Note: This does not support yet support the expected\n    --     `filter` function that allows excluding some files.\n    addToStore :: StorePathName -> NarContent -> RecursiveFlag -> RepairFlag -> m (Either ErrorCall StorePath)\n    default addToStore :: (MonadTrans t, MonadStore m', m ~ t m') => StorePathName -> NarContent -> RecursiveFlag -> RepairFlag -> m (Either ErrorCall StorePath)\n    addToStore a b c d = lift $ addToStore a b c d\n\n    -- | Like addToStore, but the contents written to the output path is a\n    --     regular file containing the given string.\n    addTextToStore' :: StorePathName -> Text -> StorePathSet -> RepairFlag -> m (Either ErrorCall StorePath)\n    default addTextToStore' :: (MonadTrans t, MonadStore m', m ~ t m') => StorePathName -> Text -> StorePathSet -> RepairFlag -> m (Either ErrorCall StorePath)\n    addTextToStore' a b c d = lift $ addTextToStore' a b c d\n\n-- *** Instances\n\ninstance MonadStore IO where\n    addToStore name content recursive repair =\n        case Store.mkStorePathName name of\n            Left err -> pure $ Left $ ErrorCall $ \"String '\" <> show name <> \"' is not a valid path name: \" <> show err\n            Right pathName -> do\n                let ingestionMethod =\n                        if recursive\n                            then Store.Remote.FileIngestionMethod_FileRecursive\n                            else Store.Remote.FileIngestionMethod_Flat\n                    repairMode =\n                        if repair\n                            then Store.Remote.RepairMode_DoRepair\n                            else Store.Remote.RepairMode_DontRepair\n                    -- Use Some constructor with HashAlgo_SHA256\n                    hashAlgo = Some Store.Hash.HashAlgo_SHA256\n                res <-\n                    Store.Remote.runStore $\n                        Store.Remote.addToStore\n                            pathName\n                            (toNarSource content)\n                            ingestionMethod\n                            hashAlgo\n                            repairMode\n                either\n                    Left -- err\n                    (pure . toStorePath) -- store path\n                    <$> parseStoreResult \"addToStore\" res\n\n    addTextToStore' name text references repair =\n        case Store.mkStorePathName name of\n            Left err -> pure $ Left $ ErrorCall $ \"String '\" <> show name <> \"' is not a valid path name: \" <> show err\n            Right pathName -> do\n                let storeText = Store.Remote.StoreText pathName text\n                    repairMode =\n                        if repair\n                            then Store.Remote.RepairMode_DoRepair\n                            else Store.Remote.RepairMode_DontRepair\n                    -- Convert our StorePathSet (HashSet of StorePath) to HashSet of Store.StorePath\n                    storeDir = Store.StoreDir \"/nix/store\"\n                    storeRefs = HS.map (\\(StorePath p) -> Store.parsePath storeDir (encodeUtf8 $ toText p)) references\n                    -- Filter out any parse failures and extract successful paths\n                    validRefs = HS.fromList $ rights $ HS.toList storeRefs\n                res <- Store.Remote.runStore $ Store.Remote.addTextToStore storeText validRefs repairMode\n                either\n                    Left -- err\n                    (pure . toStorePath) -- path\n                    <$> parseStoreResult \"addTextToStore\" res\n\n-- ** Functions\n\n-- Import DList type (it's re-exported as part of the Run type signature)\nparseStoreResult :: (Monad m) => Text -> (Either Store.Remote.RemoteStoreError a, loggers) -> m (Either ErrorCall a)\nparseStoreResult name (res, _logs) =\n    pure $\n        either\n            (\\err -> Left $ ErrorCall $ \"Failed to execute '\" <> toString name <> \"': \" <> show err)\n            pure\n            res\n\naddTextToStore :: (Framed e m, MonadStore m) => StorePathName -> Text -> StorePathSet -> RepairFlag -> m StorePath\naddTextToStore a b c d =\n    either\n        throwError\n        pure\n        =<< addTextToStore' a b c d\n\n--  2021-10-30: NOTE: Misleading name, please rename.\n\n-- | Add @Path@ into the Nix Store\naddPath :: (Framed e m, MonadStore m) => Path -> m StorePath\naddPath p =\n    either\n        throwError\n        pure\n        =<< addToStore (fromString $ coerce takeFileName p) (NarFile p) True False\n\ntoFile_ :: (Framed e m, MonadStore m) => Path -> Text -> m StorePath\ntoFile_ p contents = addTextToStore (fromString $ coerce p) contents mempty False\n"
  },
  {
    "path": "src/Nix/Eval.hs",
    "content": "{-# LANGUAGE AllowAmbiguousTypes #-}\n{-# LANGUAGE ConstraintKinds #-}\n{-# LANGUAGE RankNTypes #-}\n\nmodule Nix.Eval where\n\nimport Control.Monad (foldM)\nimport Control.Monad.Fix (MonadFix)\nimport qualified Data.HashMap.Lazy as M\nimport Data.List (partition)\nimport Data.Semialign.Indexed (ialignWith)\nimport Data.These (These (..))\nimport GHC.Exception (ErrorCall (ErrorCall))\nimport Nix.Atoms\nimport Nix.Convert\nimport Nix.Expr.Strings (runAntiquoted)\nimport Nix.Expr.Types\nimport Nix.Expr.Types.Annotated\nimport Nix.Frames\nimport Nix.Prelude\nimport Nix.Scope\nimport Nix.String\nimport Nix.Value.Monad\nimport Relude.Extra (set)\n\nclass (Show v, Monad m) => MonadEval v m where\n    freeVariable :: VarName -> m v\n    synHole :: VarName -> m v\n    attrMissing :: NonEmpty VarName -> Maybe v -> m v\n    evaledSym :: VarName -> v -> m v\n    evalCurPos :: m v\n    evalConstant :: NAtom -> m v\n    evalString :: NString (m v) -> m v\n    evalLiteralPath :: Path -> m v\n    evalEnvPath :: Path -> m v\n    evalUnary :: NUnaryOp -> v -> m v\n\n    evalBinary :: NBinaryOp -> v -> m v -> m v\n    -- ^ The second argument is an action because operators such as boolean &&\n    --     and || may not evaluate the second argument.\n\n    evalWith :: m v -> m v -> m v\n    evalIf :: v -> m v -> m v -> m v\n    evalAssert :: v -> m v -> m v\n    evalApp :: v -> m v -> m v\n    evalAbs ::\n        Params (m v) ->\n        ( forall a.\n          m v ->\n          ( AttrSet (m v) ->\n            m v ->\n            m (a, v)\n          ) ->\n          m (a, v)\n        ) ->\n        m v\n\n    {-\n      evalSelect     :: v -> NonEmpty Text -> Maybe (m v) -> m v\n      evalHasAttr    :: v -> NonEmpty Text -> m v\n\n      -- | This and the following methods are intended to allow things like\n      --   adding provenance information.\n      evalListElem   :: [m v] -> Int -> m v -> m v\n      evalList       :: [v] -> m v\n      evalSetElem    :: AttrSet (m v) -> Text -> m v -> m v\n      evalSet        :: AttrSet v -> PositionSet -> m v\n      evalRecSetElem :: AttrSet (m v) -> Text -> m v -> m v\n      evalRecSet     :: AttrSet v -> PositionSet -> m v\n      evalLetElem    :: Text -> m v -> m v\n      evalLet        :: m v -> m v\n    -}\n    evalError :: (Exception s) => s -> m a\n\ntype MonadNixEval v m =\n    ( MonadEval v m\n    , Scoped v m\n    , MonadValue v m\n    , MonadFix m\n    , ToValue Bool m v\n    , ToValue [v] m v\n    , FromValue NixString m v\n    , ToValue (AttrSet v, PositionSet) m v\n    , FromValue (AttrSet v, PositionSet) m v\n    )\n\ndata EvalFrame m v\n    = EvaluatingExpr (Scopes m v) NExprLoc\n    | ForcingExpr (Scopes m v) NExprLoc\n    | Calling VarName SrcSpan\n    | SynHole (SynHoleInfo m v)\n    deriving (Show, Typeable)\n\ninstance (Typeable m, Typeable v) => Exception (EvalFrame m v)\n\ndata SynHoleInfo m v = SynHoleInfo\n    { _synHoleInfo_expr :: NExprLoc\n    , _synHoleInfo_scope :: Scopes m v\n    }\n    deriving (Show, Typeable)\n\ninstance (Typeable m, Typeable v) => Exception (SynHoleInfo m v)\n\n-- jww (2019-03-18): By deferring only those things which must wait until\n-- context of us, this can be written as:\n-- eval :: forall v m . MonadNixEval v m => NExprF v -> m v\neval :: forall v m. (MonadNixEval v m) => NExprF (m v) -> m v\neval (NSym \"__curPos\") = evalCurPos\neval (NSym var) =\n    do\n        mVal <- lookupVar var\n        maybe\n            (freeVariable var)\n            (evaledSym var <=< demand)\n            mVal\neval (NConstant x) = evalConstant x\neval (NStr str) = evalString str\neval (NLiteralPath p) = evalLiteralPath p\neval (NEnvPath p) = evalEnvPath p\neval (NUnary op arg) = evalUnary op =<< arg\neval (NApp fun arg) =\n    do\n        f <- fun\n        scope <- askScopes\n        evalApp f $ withScopes scope arg\neval (NBinary op larg rarg) =\n    do\n        lav <- larg\n        evalBinary op lav rarg\neval (NSelect alt aset attr) =\n    do\n        let useAltOrReportMissing (s, ks) = fromMaybe (attrMissing ks $ pure s) alt\n\n        eAttr <- evalSelect aset attr\n        either useAltOrReportMissing id (coerce eAttr)\neval (NHasAttr aset attr) =\n    do\n        eAttr <- evalSelect aset attr\n        toValue $ isRight eAttr\neval (NList l) =\n    do\n        scope <- askScopes\n        toValue =<< traverse (defer @v @m . withScopes @v scope) l\neval (NSet r binds) =\n    do\n        attrSet <- evalBinds (r == Recursive) $ desugarBinds (eval . NSet mempty) binds\n        toValue attrSet\neval (NLet binds body) =\n    do\n        (attrSet, _) <- evalBinds True binds\n        pushScope (coerce attrSet) body\neval (NIf cond t f) =\n    do\n        v <- cond\n        evalIf v t f\neval (NWith scope body) = evalWith scope body\neval (NAssert cond body) =\n    do\n        x <- cond\n        evalAssert x body\neval (NAbs params body) = do\n    -- It is the environment at the definition site, not the call site, that\n    -- needs to be used when evaluating the body and default arguments, hence we\n    -- defer here so the present scope is restored when the parameters and body\n    -- are forced during application.\n    curScope <- askScopes\n    let\n        withCurScope = withScopes curScope\n\n        fun :: m v -> (AttrSet (m v) -> m v -> m r) -> m r\n        fun arg k =\n            withCurScope $\n                do\n                    (coerce -> newScopeToAdd) <- buildArgument params arg\n                    pushScope\n                        newScopeToAdd\n                        $ k\n                            (coerce $ withCurScope . inform <$> newScopeToAdd)\n                            body\n\n    evalAbs\n        params\n        fun\neval (NSynHole name) = synHole name\n\n{- | If you know that the 'scope' action will result in an 'AttrSet v', then\n  this implementation may be used as an implementation for 'evalWith'.\n-}\nevalWithAttrSet :: forall v m. (MonadNixEval v m) => m v -> m v -> m v\nevalWithAttrSet aset body = do\n    scopes <- askScopes\n    -- The scope is deliberately wrapped in a thunk here, since it is demanded\n    -- each time a name is looked up within the weak scope, and we want to be\n    -- sure the action it evaluates is to force a thunk, so its value is only\n    -- computed once.\n    deferredAset <- defer $ withScopes scopes aset\n    let weakscope = coerce . fst <$> (fromValue @(AttrSet v, PositionSet) =<< demand deferredAset)\n\n    pushWeakScope weakscope body\n\nattrSetAlter ::\n    forall v m.\n    (MonadNixEval v m) =>\n    [VarName] ->\n    NSourcePos ->\n    AttrSet (m v) ->\n    PositionSet ->\n    m v ->\n    m (AttrSet (m v), PositionSet)\nattrSetAlter ks' pos m' p' val =\n    swap <$> go p' m' ks'\n  where\n    -- This `go` does traverse in disquise. Notice how it traverses `ks`.\n    go ::\n        PositionSet ->\n        AttrSet (m v) ->\n        [VarName] ->\n        m (PositionSet, AttrSet (m v))\n    go _ _ [] = evalError @v $ ErrorCall \"invalid selector with no components\"\n    go p m (k : ks) =\n        bool\n            (pure $ insertVal val)\n            ( maybe\n                (recurse mempty mempty)\n                ( \\x ->\n                    do\n                        --  2021-10-12: NOTE: swapping sourcewide into (PositionSet, AttrSet) would optimize code and remove this `swap`\n                        (swap -> (sp, st)) <- fromValue @(AttrSet v, PositionSet) =<< x\n                        recurse sp $ demand <$> st\n                )\n                ((`M.lookup` m) k)\n            )\n            (isPresent ks)\n      where\n        insertVal :: m v -> (PositionSet, AttrSet (m v))\n        insertVal v =\n            ( insertPos\n            , insertV v\n            )\n          where\n            insertV v' = M.insert k v' m\n            insertPos = M.insert k pos p\n\n        recurse ::\n            PositionSet ->\n            AttrSet (m v) ->\n            m\n                ( PositionSet\n                , AttrSet (m v)\n                )\n        recurse p'' m'' =\n            insertVal . ((toValue @(AttrSet v, PositionSet)) <=< ((,mempty) <$>) . sequenceA . snd) <$> go p'' m'' ks\n\ndesugarBinds :: forall r. ([Binding r] -> r) -> [Binding r] -> [Binding r]\ndesugarBinds embed = (`evalState` mempty) . traverse (findBinding <=< collect)\n  where\n    collect ::\n        Binding r ->\n        State\n            (AttrSet (NSourcePos, [Binding r]))\n            (Either VarName (Binding r))\n    collect (NamedVar (StaticKey x :| y : ys) val oldPosition) =\n        do\n            modify updateBindingInformation\n            pure $ Left x\n      where\n        updateBindingInformation ::\n            AttrSet (NSourcePos, [Binding r]) ->\n            AttrSet (NSourcePos, [Binding r])\n        updateBindingInformation =\n            M.insert x\n                =<< maybe\n                    (mkBindingSingleton oldPosition)\n                    (\\(foundPosition, newBindings) -> second (<> newBindings) $ mkBindingSingleton foundPosition)\n                    . M.lookup x\n        mkBindingSingleton :: NSourcePos -> (NSourcePos, [Binding r])\n        mkBindingSingleton np = (np, one $ bindValAt np)\n          where\n            bindValAt :: NSourcePos -> Binding r\n            bindValAt = NamedVar (y :| ys) val\n    collect x = pure $ pure x\n\n    findBinding ::\n        Either VarName (Binding r) ->\n        State (AttrSet (NSourcePos, [Binding r])) (Binding r)\n    findBinding =\n        either\n            ( \\x ->\n                maybe\n                    (error $ \"No binding \" <> show x)\n                    (\\(p, v) -> pure $ NamedVar (one $ StaticKey x) (embed v) p)\n                    =<< gets (M.lookup x)\n            )\n            pure\n\nevalBinds ::\n    forall v m.\n    (MonadNixEval v m) =>\n    --  2021-07-19: NOTE: Recutsivity data type\n    Bool ->\n    [Binding (m v)] ->\n    --  2021-07-19: NOTE: AttrSet is a Scope\n    m (AttrSet v, PositionSet)\nevalBinds isRecursive binds =\n    do\n        scope <- askScopes\n\n        buildResult scope . fold =<< (`traverse` moveOverridesLast binds) (applyBindToAdt scope)\n  where\n    buildResult ::\n        Scopes m v ->\n        [([VarName], NSourcePos, m v)] ->\n        m (AttrSet v, PositionSet)\n    buildResult scopes bindings =\n        do\n            (coerce -> scope, p) <- foldM insert mempty bindings\n            res <-\n                bool\n                    (traverse mkThunk)\n                    (loebM . fmap encapsulate)\n                    isRecursive\n                    scope\n\n            pure (coerce res, p)\n      where\n        insert :: (AttrSet (m v), PositionSet) -> ([VarName], NSourcePos, m v) -> m (AttrSet (m v), PositionSet)\n        insert (m, p) (path, pos, value) = attrSetAlter path pos m p value\n\n        mkThunk = defer . withScopes scopes\n\n        encapsulate f attrs = mkThunk $ pushScope attrs f\n\n    applyBindToAdt :: Scopes m v -> Binding (m v) -> m [([VarName], NSourcePos, m v)]\n    applyBindToAdt _ (NamedVar (StaticKey \"__overrides\" :| []) finalValue pos) =\n        do\n            (o', p') <- fromValue =<< finalValue\n            -- jww (2018-05-09): What to do with the key position here?\n            pure $\n                ( \\(k, v) ->\n                    ( one k\n                    , fromMaybe pos $ M.lookup k p'\n                    , demand v\n                    )\n                )\n                    <$> M.toList o'\n    applyBindToAdt _ (NamedVar pathExpr finalValue pos) =\n        ( \\case\n            -- When there are no path segments, e.g. `${null} = 5;`, we don't\n            -- bind anything\n            ([], _, _) -> mempty\n            result -> one result\n        )\n            <$> processAttrSetKeys pathExpr\n      where\n        processAttrSetKeys :: NAttrPath (m v) -> m ([VarName], NSourcePos, m v)\n        processAttrSetKeys (h :| t) =\n            maybe\n                -- Empty attrset - return a stub.\n                (pure (mempty, nullPos, toValue @(AttrSet v, PositionSet) mempty))\n                ( \\k ->\n                    handlePresence\n                        -- No more keys in the attrset - return the result\n                        (pure (one k, pos, finalValue))\n                        -- There are unprocessed keys in attrset - recurse appending the results\n                        ( \\(x : xs) ->\n                            do\n                                (restOfPath, _, v) <- processAttrSetKeys (x :| xs)\n                                pure (k : restOfPath, pos, v)\n                        )\n                        t\n                )\n                =<< evalSetterKeyName h\n    applyBindToAdt scopes (Inherit ms names pos) =\n        pure $ processScope <$> names\n      where\n        processScope ::\n            VarName ->\n            ([VarName], NSourcePos, m v)\n        processScope var =\n            ( one var\n            , pos\n            , maybe\n                (attrMissing (one var) Nothing)\n                demand\n                =<< maybe\n                    (withScopes scopes $ lookupVar var)\n                    ( \\s ->\n                        do\n                            (coerce -> scope, _) <- fromValue @(AttrSet v, PositionSet) =<< s\n\n                            clearScopes $ pushScope @v scope $ lookupVar var\n                    )\n                    ms\n            )\n\n    moveOverridesLast =\n        uncurry (<>)\n            . partition\n                ( \\case\n                    NamedVar (StaticKey \"__overrides\" :| []) _ _ -> False\n                    _ -> True\n                )\n\nevalSelect ::\n    forall v m.\n    (MonadNixEval v m) =>\n    m v ->\n    NAttrPath (m v) ->\n    m (Either (v, NonEmpty VarName) (m v))\nevalSelect aset attr =\n    do\n        s <- aset\n        path <- traverse evalGetterKeyName attr\n\n        extract path s\n  where\n    extract :: NonEmpty VarName -> v -> m (Either (v, NonEmpty VarName) (m v))\n    extract path@(k :| ks) x =\n        maybe\n            left\n            ( maybe\n                left\n                ( handlePresence\n                    (pure . pure)\n                    (\\(y : ys) -> (extract (y :| ys) =<<))\n                    ks\n                    . demand\n                )\n                . M.lookup k\n                . fst\n            )\n            =<< fromValueMay @(AttrSet v, PositionSet) x\n      where\n        left :: m (Either (v, NonEmpty VarName) b)\n        left = pure $ Left (x, path)\n\n{- | Evaluate a component of an attribute path in a context where we are\n*retrieving* a value\n-}\nevalGetterKeyName ::\n    forall v m.\n    (MonadEval v m, FromValue NixString m v) =>\n    NKeyName (m v) ->\n    m VarName\nevalGetterKeyName =\n    maybe\n        (evalError @v $ ErrorCall \"value is null while a string was expected\")\n        pure\n        <=< evalSetterKeyName\n\n{- | Evaluate a component of an attribute path in a context where we are\n*binding* a value\n-}\nevalSetterKeyName ::\n    (MonadEval v m, FromValue NixString m v) =>\n    NKeyName (m v) ->\n    m (Maybe VarName)\nevalSetterKeyName =\n    \\case\n        StaticKey k -> pure $ pure k\n        DynamicKey k ->\n            coerce . ignoreContext <<$>> runAntiquoted \"\\n\" assembleString (fromValueMay =<<) k\n\nassembleString ::\n    forall v m.\n    (MonadEval v m, FromValue NixString m v) =>\n    NString (m v) ->\n    m (Maybe NixString)\nassembleString = fromParts . stringParts\n  where\n    fromParts :: [Antiquoted Text (m v)] -> m (Maybe NixString)\n    fromParts xs = fold <<$>> traverse2 fun xs\n\n    fun :: Antiquoted Text (m v) -> m (Maybe NixString)\n    fun =\n        runAntiquoted\n            \"\\n\"\n            (pure . pure . mkNixStringWithoutContext)\n            (fromValueMay =<<)\n\nbuildArgument ::\n    forall v m. (MonadNixEval v m) => Params (m v) -> m v -> m (AttrSet v)\nbuildArgument params arg =\n    do\n        scope <- askScopes\n        let\n            argThunk = defer $ withScopes scope arg\n        case params of\n            Param name -> one . (name,) <$> argThunk\n            ParamSet mname variadic pset ->\n                do\n                    (args, _) <- fromValue @(AttrSet v, PositionSet) =<< arg\n                    let\n                        inject =\n                            maybe\n                                id\n                                (`M.insert` const argThunk) -- why insert into const? Thunk value getting magic point?\n                                mname\n                    loebM\n                        $ inject\n                        $ M.mapMaybe\n                            id\n                        $ ialignWith\n                            (assemble scope variadic)\n                            args\n                        $ M.fromList pset\n  where\n    assemble ::\n        Scopes m v ->\n        Variadic ->\n        VarName ->\n        These v (Maybe (m v)) ->\n        Maybe (AttrSet v -> m v)\n    assemble _ Variadic _ (This _) = Nothing\n    assemble scope _ k t =\n        pure $\n            case t of\n                That Nothing -> const $ evalError @v $ ErrorCall $ \"Missing value for parameter: ''\" <> show k\n                That (Just f) -> coerce $ defer . withScopes scope . (`pushScope` f)\n                This _ -> const $ evalError @v $ ErrorCall $ \"Unexpected parameter: \" <> show k\n                These x _ -> const $ pure x\n\n{- | Add source positions to @NExprLoc@.\n\nTakes @NExprLoc@, by itself takes source position informatoin, does transformation,\nreturns @NExprLoc@ with source positions.\n\nActually:\n\n> => (NExprLoc -> m a)\n> -> NExprLoc -> m a\n-}\naddSourcePositions ::\n    (MonadReader e m, Has e SrcSpan) => Transform NExprLocF (m a)\naddSourcePositions f (v@(Ann ann _) :: NExprLoc) =\n    local (set hasLens ann) $ f v\n\naddStackFrames ::\n    forall v e m a.\n    (Scoped v m, Framed e m, Typeable v, Typeable m) =>\n    TransformF NExprLoc (m a)\naddStackFrames f v =\n    do\n        scopes <- askScopes\n\n        -- sectioning gives GHC optimization\n        -- If opimization question would arrive again, check the @(`withFrameInfo` f v) $ EvaluatingExpr scopes v@\n        -- for possible @scopes@ implementation @v@ type arguments sharing between runs.\n        (`withFrameInfo` f v) $ (`EvaluatingExpr` v) scopes\n  where\n    withFrameInfo = withFrame Info\n\nevalWithMetaInfo ::\n    forall e v m.\n    (MonadNixEval v m, Framed e m, Has e SrcSpan, Typeable m, Typeable v) =>\n    NExprLoc ->\n    m v\nevalWithMetaInfo =\n    adi addMetaInfo evalContent\n\n-- | Add source positions & frame context system.\naddMetaInfo ::\n    forall v m e a.\n    (Framed e m, Scoped v m, Has e SrcSpan, Typeable m, Typeable v) =>\n    TransformF NExprLoc (m a)\naddMetaInfo = addStackFrames @v . addSourcePositions\n\n-- | Takes annotated expression. Strip from annotation. Evaluate.\nevalContent ::\n    (MonadNixEval v m) =>\n    AnnF ann NExprF (m v) ->\n    m v\nevalContent = eval . stripAnnF\n"
  },
  {
    "path": "src/Nix/Exec.hs",
    "content": "{-# LANGUAGE AllowAmbiguousTypes #-}\n{-# LANGUAGE CPP #-}\n{-# LANGUAGE ConstraintKinds #-}\n{-# LANGUAGE PartialTypeSignatures #-}\n{-# LANGUAGE RankNTypes #-}\n{-# LANGUAGE TypeFamilies #-}\n{-# LANGUAGE UndecidableInstances #-}\n{-# OPTIONS_GHC -Wno-orphans #-}\n{-# OPTIONS_GHC -fno-warn-name-shadowing #-}\n\nmodule Nix.Exec where\n\nimport Control.Monad.Catch hiding (catchJust)\nimport Control.Monad.Fix\nimport Data.Fix\nimport qualified Data.HashMap.Lazy as M\nimport qualified Data.List.NonEmpty as NE\nimport qualified Data.Text as Text\nimport GHC.Exception (ErrorCall (ErrorCall))\nimport Nix.Atoms\nimport Nix.Cited\nimport Nix.Convert\nimport Nix.Effects\nimport Nix.Eval as Eval\nimport Nix.Expr.Types\nimport Nix.Expr.Types.Annotated\nimport Nix.Frames\nimport Nix.Options\nimport Nix.Prelude hiding (\n    print,\n    putStr,\n    putStrLn,\n )\nimport Nix.Pretty\nimport Nix.Render\nimport Nix.Scope\nimport Nix.String\nimport Nix.String.Coerce\nimport Nix.Thunk\nimport Nix.Value\nimport Nix.Value.Equal\nimport Nix.Value.Monad\nimport Prettyprinter\nimport qualified Text.Show.Pretty as PS\n\n#ifdef MIN_VERSION_ghc_datasize \nimport           GHC.DataSize\n#endif\n\ntype MonadCited t f m =\n    ( HasCitations m (NValue t f m) t\n    , HasCitations1 m (NValue t f m) f\n    , MonadDataContext f m\n    )\n\nmkNVConstantWithProvenance ::\n    (MonadCited t f m) =>\n    Scopes m (NValue t f m) ->\n    SrcSpan ->\n    NAtom ->\n    NValue t f m\nmkNVConstantWithProvenance scopes span x =\n    addProvenance (Provenance scopes . NConstantAnnF span $ x) $ NVConstant x\n\nmkNVStrWithProvenance ::\n    (MonadCited t f m) =>\n    Scopes m (NValue t f m) ->\n    SrcSpan ->\n    NixString ->\n    NValue t f m\nmkNVStrWithProvenance scopes span x =\n    addProvenance (Provenance scopes . NStrAnnF span . DoubleQuoted . one . Plain . ignoreContext $ x) $ NVStr x\n\nmkNVPathWithProvenance ::\n    (MonadCited t f m) =>\n    Scopes m (NValue t f m) ->\n    SrcSpan ->\n    Path ->\n    Path ->\n    NValue t f m\nmkNVPathWithProvenance scope span lit real =\n    addProvenance (Provenance scope . NLiteralPathAnnF span $ lit) $ NVPath real\n\nmkNVClosureWithProvenance ::\n    (MonadCited t f m) =>\n    Scopes m (NValue t f m) ->\n    SrcSpan ->\n    Params () ->\n    (NValue t f m -> m (NValue t f m)) ->\n    NValue t f m\nmkNVClosureWithProvenance scopes span x f =\n    addProvenance (Provenance scopes $ NAbsAnnF span (Nothing <$ x) Nothing) $ NVClosure x f\n\nmkNVUnaryOpWithProvenance ::\n    (MonadCited t f m) =>\n    Scopes m (NValue t f m) ->\n    SrcSpan ->\n    NUnaryOp ->\n    Maybe (NValue t f m) ->\n    NValue t f m ->\n    NValue t f m\nmkNVUnaryOpWithProvenance scope span op val =\n    addProvenance (Provenance scope $ NUnaryAnnF span op val)\n\nmkNVAppOpWithProvenance ::\n    (MonadCited t f m) =>\n    Scopes m (NValue t f m) ->\n    SrcSpan ->\n    Maybe (NValue t f m) ->\n    Maybe (NValue t f m) ->\n    NValue t f m ->\n    NValue t f m\nmkNVAppOpWithProvenance scope span lval rval =\n    addProvenance (Provenance scope $ NAppAnnF span lval rval)\n\nmkNVBinaryOpWithProvenance ::\n    (MonadCited t f m) =>\n    Scopes m (NValue t f m) ->\n    SrcSpan ->\n    NBinaryOp ->\n    Maybe (NValue t f m) ->\n    Maybe (NValue t f m) ->\n    NValue t f m ->\n    NValue t f m\nmkNVBinaryOpWithProvenance scope span op lval rval =\n    addProvenance (Provenance scope $ NBinaryAnnF span op lval rval)\n\ntype MonadCitedThunks t f m =\n    ( MonadThunk t m (NValue t f m)\n    , MonadDataErrorContext t f m\n    , HasCitations m (NValue t f m) t\n    , HasCitations1 m (NValue t f m) f\n    )\n\ntype MonadNix e t f m =\n    ( Has e SrcSpan\n    , Has e Options\n    , Scoped (NValue t f m) m\n    , Framed e m\n    , MonadFix m\n    , MonadCatch m\n    , MonadThrow m\n    , Alternative m\n    , MonadEffects t f m\n    , MonadCitedThunks t f m\n    , MonadValue (NValue t f m) m\n    )\n\ndata ExecFrame t f m = Assertion SrcSpan (NValue t f m)\n    deriving (Show, Typeable)\n\ninstance (MonadDataErrorContext t f m) => Exception (ExecFrame t f m)\n\nnverr :: forall e t f s m a. (MonadNix e t f m, Exception s) => s -> m a\nnverr = evalError @(NValue t f m)\n\naskSpan :: forall e m. (MonadReader e m, Has e SrcSpan) => m SrcSpan\naskSpan = askLocal\n\nwrapExprLoc :: SrcSpan -> NExprLocF r -> NExprLoc\nwrapExprLoc span x = Fix $ NSymAnn span \"<?>\" <$ x\n{-# INLINE wrapExprLoc #-}\n\n--  2021-01-07: NOTE: This instance belongs to be beside MonadEval type class.\n-- Currently instance is stuck in orphanage between the requirements to be MonadEval, aka Eval stage, and emposed requirement to be MonadNix (Execution stage). MonadNix constraint tries to put the cart before horse and seems superflous, since Eval in Nix also needs and can throw exceptions. It is between `nverr` and `evalError`.\ninstance (MonadNix e t f m) => MonadEval (NValue t f m) m where\n    freeVariable var =\n        nverr @e @t @f $ ErrorCall $ toString @Text $ \"Undefined variable '\" <> coerce var <> \"'\"\n\n    synHole name =\n        do\n            span <- askSpan\n            scope <- askScopes\n            evalError @(NValue t f m) $\n                SynHole $\n                    SynHoleInfo\n                        { _synHoleInfo_expr = NSynHoleAnn span name\n                        , _synHoleInfo_scope = scope\n                        }\n\n    attrMissing ks ms =\n        evalError @(NValue t f m) $\n            ErrorCall $\n                toString $\n                    maybe\n                        (\"Inheriting unknown attribute: \" <> attr)\n                        (\\s -> \"Could not look up attribute \" <> attr <> \" in \" <> show (prettyNValue s))\n                        ms\n      where\n        attr = Text.intercalate \".\" $ NE.toList $ coerce ks\n\n    evalCurPos =\n        do\n            scope <- askScopes\n            span@(SrcSpan delta _) <- askSpan\n            addProvenance @_ @_ @(NValue t f m)\n                (Provenance scope . NSymAnnF span $ coerce @Text \"__curPos\")\n                <$> toValue delta\n\n    evaledSym name val =\n        do\n            scope <- askScopes\n            span <- askSpan\n            pure $\n                addProvenance @_ @_ @(NValue t f m)\n                    (Provenance scope $ NSymAnnF span name)\n                    val\n\n    evalConstant c =\n        do\n            scope <- askScopes\n            span <- askSpan\n            pure $ mkNVConstantWithProvenance scope span c\n\n    evalString =\n        maybe\n            (nverr $ ErrorCall \"Failed to assemble string\")\n            ( \\ns ->\n                do\n                    scope <- askScopes\n                    span <- askSpan\n                    pure $ mkNVStrWithProvenance scope span ns\n            )\n            <=< assembleString\n\n    evalLiteralPath p =\n        do\n            scope <- askScopes\n            span <- askSpan\n            mkNVPathWithProvenance scope span p <$> toAbsolutePath @t @f @m p\n\n    evalEnvPath p =\n        do\n            scope <- askScopes\n            span <- askSpan\n            mkNVPathWithProvenance scope span p <$> findEnvPath @t @f @m (coerce p)\n\n    evalUnary op arg =\n        do\n            scope <- askScopes\n            span <- askSpan\n            execUnaryOp scope span op arg\n\n    evalBinary op larg rarg =\n        do\n            scope <- askScopes\n            span <- askSpan\n            execBinaryOp scope span op larg rarg\n\n    evalWith c b =\n        do\n            scope <- askScopes\n            span <- askSpan\n            let f = join $ addProvenance . Provenance scope . NWithAnnF span Nothing . pure\n            f <$> evalWithAttrSet c b\n\n    evalIf c tVal fVal =\n        do\n            scope <- askScopes\n            span <- askSpan\n            bl <- fromValue c\n\n            let\n                fun x y = addProvenance (Provenance scope $ NIfAnnF span (pure c) x y)\n                falseVal = (fun Nothing =<< pure) <$> fVal\n                trueVal = (flip fun Nothing =<< pure) <$> tVal\n\n            bool\n                falseVal\n                trueVal\n                bl\n\n    evalAssert c body =\n        do\n            span <- askSpan\n            b <- fromValue c\n            bool\n                (nverr $ Assertion span c)\n                ( do\n                    scope <- askScopes\n                    join (addProvenance . Provenance scope . NAssertAnnF span (pure c) . pure) <$> body\n                )\n                b\n\n    evalApp f x =\n        do\n            scope <- askScopes\n            span <- askSpan\n            mkNVAppOpWithProvenance scope span (pure f) Nothing <$> (callFunc f =<< defer x)\n\n    evalAbs ::\n        Params (m (NValue t f m)) ->\n        ( forall a.\n          m (NValue t f m) ->\n          ( AttrSet (m (NValue t f m)) ->\n            m (NValue t f m) ->\n            m (a, NValue t f m)\n          ) ->\n          m (a, NValue t f m)\n        ) ->\n        m (NValue t f m)\n    evalAbs p k =\n        do\n            scope <- askScopes\n            span <- askSpan\n            pure $ mkNVClosureWithProvenance scope span (void p) (fmap snd . flip (k @()) (const (fmap (mempty,))) . pure)\n\n    evalError = throwError\n\ninfixl 1 `callFunc`\ncallFunc ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\ncallFunc fun arg =\n    do\n        frames <- askFrames\n        when (length frames > 2000) $ throwError $ ErrorCall \"Function call stack exhausted\"\n\n        fun' <- demand fun\n        case fun' of\n            NVBuiltin name f ->\n                do\n                    span <- askSpan\n                    withFrame Info ((Calling @m @(NValue t f m)) name span) $ f arg -- Is this cool?\n            NVClosure _params f -> f arg\n            (NVSet _ m)\n                | Just f <- M.lookup \"__functor\" m ->\n                    (`callFunc` arg) =<< (`callFunc` fun') f\n            _x -> throwError $ ErrorCall $ \"Attempt to call non-function: \" <> show _x\n\nexecUnaryOp ::\n    forall e t f m.\n    (Framed e m, MonadCited t f m, Show t) =>\n    Scopes m (NValue t f m) ->\n    SrcSpan ->\n    NUnaryOp ->\n    NValue t f m ->\n    m (NValue t f m)\nexecUnaryOp scope span op arg =\n    case arg of\n        NVConstant c ->\n            case (op, c) of\n                (NNeg, NInt i) -> mkUnaryOp NInt negate i\n                (NNeg, NFloat f) -> mkUnaryOp NFloat negate f\n                (NNot, NBool b) -> mkUnaryOp NBool not b\n                _seq ->\n                    throwError $ ErrorCall $ \"unsupported argument type for unary operator \" <> show _seq\n        _x ->\n            throwError $ ErrorCall $ \"argument to unary operator must evaluate to an atomic type: \" <> show _x\n  where\n    mkUnaryOp :: (a -> NAtom) -> (a -> a) -> a -> m (NValue t f m)\n    mkUnaryOp c b a = pure . mkNVUnaryOpWithProvenance scope span op (pure arg) . NVConstant $ c (b a)\n\nexecBinaryOp ::\n    forall e t f m.\n    (MonadNix e t f m, MonadEval (NValue t f m) m) =>\n    Scopes m (NValue t f m) ->\n    SrcSpan ->\n    NBinaryOp ->\n    NValue t f m ->\n    m (NValue t f m) ->\n    m (NValue t f m)\nexecBinaryOp scope span op lval rarg =\n    case op of\n        NEq -> helperEq id\n        NNEq -> helperEq not\n        NOr -> helperLogic flip True\n        NAnd -> helperLogic id False\n        NImpl -> helperLogic id True\n        _ ->\n            do\n                rval <- rarg\n                rval' <- demand rval\n                lval' <- demand lval\n\n                execBinaryOpForced scope span op lval' rval'\n  where\n    helperEq :: (Bool -> Bool) -> m (NValue t f m)\n    helperEq flag =\n        do\n            rval <- rarg\n            eq <- valueEqM lval rval\n            boolOp rval $ flag eq\n\n    helperLogic flp flag =\n        flp\n            bool\n            (bypass flag)\n            ( do\n                rval <- rarg\n                x <- fromValue rval\n                boolOp rval x\n            )\n            =<< fromValue lval\n\n    boolOp rval = toBoolOp $ pure rval\n\n    bypass = toBoolOp Nothing\n\n    toBoolOp :: Maybe (NValue t f m) -> Bool -> m (NValue t f m)\n    toBoolOp r b =\n        pure $ mkNVBinaryOpWithProvenance scope span op (pure lval) r $ NVConstant $ NBool b\n\nexecBinaryOpForced ::\n    forall e t f m.\n    (MonadNix e t f m, MonadEval (NValue t f m) m) =>\n    Scopes m (NValue t f m) ->\n    SrcSpan ->\n    NBinaryOp ->\n    NValue t f m ->\n    NValue t f m ->\n    m (NValue t f m)\nexecBinaryOpForced scope span op lval rval =\n    case op of\n        NLt -> mkCmpOp (<)\n        NLte -> mkCmpOp (<=)\n        NGt -> mkCmpOp (>)\n        NGte -> mkCmpOp (>=)\n        NMinus -> mkBinNumOp (-)\n        NMult -> mkBinNumOp (*)\n        NDiv -> mkBinNumOp' div (/)\n        NConcat ->\n            case (lval, rval) of\n                (NVList ls, NVList rs) -> pure $ mkListP $ ls <> rs\n                _ -> unsupportedTypes\n        NUpdate ->\n            case (lval, rval) of\n                (NVSet lp ls, NVSet rp rs) -> pure $ mkSetP (rp <> lp) (rs <> ls)\n                (NVSet lp ls, NVConstant NNull) -> pure $ mkSetP lp ls\n                (NVConstant NNull, NVSet rp rs) -> pure $ mkSetP rp rs\n                _ -> unsupportedTypes\n        NPlus ->\n            case (lval, rval) of\n                (NVConstant _, NVConstant _) -> mkBinNumOp (+)\n                (NVStr ls, NVStr rs) -> pure $ mkStrP (ls <> rs)\n                (NVStr ls, NVPath p) ->\n                    mkStrP . (ls <>)\n                        <$> coercePathToNixString CopyToStore p\n                (NVPath ls, NVStr rs) ->\n                    maybe\n                        (throwError $ ErrorCall \"A string that refers to a store path cannot be appended to a path.\") -- data/nix/src/libexpr/eval.cc:1412\n                        (\\rs2 -> mkPathP <$> toAbsolutePath @t @f (ls <> coerce (toString rs2)))\n                        (getStringNoContext rs)\n                (NVPath ls, NVPath rs) -> mkPathP <$> toAbsolutePath @t @f (ls <> rs)\n                (ls@NVSet{}, NVStr rs) ->\n                    mkStrP . (<> rs)\n                        <$> coerceAnyToNixString callFunc DontCopyToStore ls\n                (NVStr ls, rs@NVSet{}) ->\n                    mkStrP . (ls <>)\n                        <$> coerceAnyToNixString callFunc DontCopyToStore rs\n                _ -> unsupportedTypes\n        _other -> shouldBeAlreadyHandled\n  where\n    addProv :: NValue t f m -> NValue t f m\n    addProv =\n        mkNVBinaryOpWithProvenance scope span op (pure lval) (pure rval)\n\n    mkBoolP :: Bool -> m (NValue t f m)\n    mkBoolP = pure . addProv . NVConstant . NBool\n\n    mkIntP :: Integer -> m (NValue t f m)\n    mkIntP = pure . addProv . NVConstant . NInt\n\n    mkFloatP :: Float -> m (NValue t f m)\n    mkFloatP = pure . addProv . NVConstant . NFloat\n\n    mkListP :: [NValue t f m] -> NValue t f m\n    mkListP = addProv . NVList\n\n    mkStrP :: NixString -> NValue t f m\n    mkStrP = addProv . NVStr\n\n    mkPathP :: Path -> NValue t f m\n    mkPathP = addProv . NVPath\n\n    mkSetP :: (PositionSet -> AttrSet (NValue t f m) -> NValue t f m)\n    mkSetP x s = addProv $ NVSet x s\n\n    mkCmpOp :: (forall a. (Ord a) => a -> a -> Bool) -> m (NValue t f m)\n    mkCmpOp op = case (lval, rval) of\n        (NVConstant l, NVConstant r) -> mkBoolP $ l `op` r\n        (NVStr l, NVStr r) -> mkBoolP $ l `op` r\n        _ -> unsupportedTypes\n\n    mkBinNumOp :: (forall a. (Num a) => a -> a -> a) -> m (NValue t f m)\n    mkBinNumOp op = mkBinNumOp' op op\n\n    mkBinNumOp' ::\n        (Integer -> Integer -> Integer) ->\n        (Float -> Float -> Float) ->\n        m (NValue t f m)\n    mkBinNumOp' intOp floatOp =\n        case (lval, rval) of\n            (NVConstant l, NVConstant r) ->\n                case (l, r) of\n                    (NInt li, NInt ri) -> mkIntP $ li `intOp` ri\n                    (NInt li, NFloat rf) -> mkFloatP $ fromInteger li `floatOp` rf\n                    (NFloat lf, NInt ri) -> mkFloatP $ lf `floatOp` fromInteger ri\n                    (NFloat lf, NFloat rf) -> mkFloatP $ lf `floatOp` rf\n                    _ -> unsupportedTypes\n            _ -> unsupportedTypes\n\n    unsupportedTypes = throwError $ ErrorCall $ \"Unsupported argument types for binary operator \" <> show op <> \": \" <> show lval <> \", \" <> show rval\n\n    shouldBeAlreadyHandled = throwError $ ErrorCall $ \"This cannot happen: operator \" <> show op <> \" should have been handled in execBinaryOp.\"\n\n-- This function is here, rather than in 'Nix.String', because of the need to\n-- use 'throwError'.\nfromStringNoContext ::\n    (Framed e m) =>\n    NixString ->\n    m Text\nfromStringNoContext ns =\n    maybe\n        (throwError $ ErrorCall $ \"expected string with no context, but got \" <> show ns)\n        pure\n        (getStringNoContext ns)\n\naddTracing ::\n    ( MonadNix e t f m\n    , Has e Options\n    , Alternative n\n    , MonadReader Int n\n    , MonadFail n\n    ) =>\n    Alg NExprLocF (m a) ->\n    Alg NExprLocF (n (m a))\naddTracing k v = do\n    depth <- ask\n    guard $ depth < 2000\n    local succ $ do\n        v'@(AnnF span x) <- sequenceA v\n        pure $ do\n            opts <- askOptions\n            let\n                rendered =\n                    bool\n                        (prettyNix $ Fix $ Fix (NSym \"?\") <$ x)\n                        (pretty $ PS.ppShow $ void x)\n                        (getVerbosity opts >= Chatty)\n                msg x = pretty (\"eval: \" <> replicate depth ' ') <> x\n            loc <- renderLocation span $ msg rendered <> \" ...\\n\"\n            putStr $ show loc\n            res <- k v'\n            print $ msg rendered <> \" ...done\"\n            pure res\n\nevalWithTracingAndMetaInfo ::\n    forall e t f m.\n    (MonadNix e t f m) =>\n    NExprLoc ->\n    ReaderT Int m (m (NValue t f m))\nevalWithTracingAndMetaInfo =\n    adi\n        addMetaInfo\n        (addTracing Eval.evalContent)\n  where\n    addMetaInfo :: (NExprLoc -> ReaderT r m a) -> NExprLoc -> ReaderT r m a\n    addMetaInfo = (ReaderT .) . flip . (Eval.addMetaInfo .) . flip . (runReaderT .)\n\nevalExprLoc :: forall e t f m. (MonadNix e t f m) => NExprLoc -> m (NValue t f m)\nevalExprLoc expr =\n    do\n        opts <- askOptions\n        let\n            pTracedAdi =\n                bool\n                    Eval.evalWithMetaInfo\n                    (join . (`runReaderT` (0 :: Int)) . evalWithTracingAndMetaInfo)\n                    (isTrace opts)\n        pTracedAdi expr\n\nexec :: (MonadNix e t f m, MonadInstantiate m) => [Text] -> m (NValue t f m)\nexec args = either throwError evalExprLoc =<< exec' args\n\n-- Please, delete `nix` from the name\nnixInstantiateExpr ::\n    (MonadNix e t f m, MonadInstantiate m) => Text -> m (NValue t f m)\nnixInstantiateExpr s = either throwError evalExprLoc =<< instantiateExpr s\n"
  },
  {
    "path": "src/Nix/Expr/Shorthands.hs",
    "content": "{- | Shorthands for making Nix expressions.\n\nFunctions with an @F@ suffix return a more general type (base functor @F a@) without the outer\n'Fix' wrapper that creates @a@.\n-}\nmodule Nix.Expr.Shorthands where\n\nimport Data.Fix\nimport Nix.Atoms\nimport Nix.Expr.Types\nimport Nix.Prelude\n\n-- * Basic expression builders\n\n-- | Put @NAtom@ as expression\nmkConst :: NAtom -> NExpr\nmkConst = Fix . NConstant\n\n-- | Put null.\nmkNull :: NExpr\nmkNull = Fix mkNullF\n\n-- | Put boolean.\nmkBool :: Bool -> NExpr\nmkBool = Fix . mkBoolF\n\n-- | Put integer.\nmkInt :: Integer -> NExpr\nmkInt = Fix . mkIntF\n\n-- | Put floating point number.\nmkFloat :: Float -> NExpr\nmkFloat = Fix . mkFloatF\n\n-- | Put a regular (double-quoted) string.\nmkStr :: Text -> NExpr\nmkStr =\n    Fix\n        . NStr\n        . DoubleQuoted\n        . whenText\n            mempty\n            (one . Plain)\n\n-- | Put an indented string.\nmkIndentedStr :: Int -> Text -> NExpr\nmkIndentedStr w =\n    Fix\n        . NStr\n        . Indented w\n        . whenText\n            mempty\n            (one . Plain)\n\n-- | Put a path. Use @True@ if the path should be read from the environment, else use @False@.\nmkPath :: Bool -> FilePath -> NExpr\nmkPath b = Fix . mkPathF b\n\n-- | Put a path expression which pulls from the @NIX_PATH@ @env@ variable.\nmkEnvPath :: FilePath -> NExpr\nmkEnvPath = Fix . mkEnvPathF\n\n-- | Put a path which references a relative path.\nmkRelPath :: FilePath -> NExpr\nmkRelPath = Fix . mkRelPathF\n\n-- | Put a variable (symbol).\nmkSym :: Text -> NExpr\nmkSym = Fix . mkSymF\n\n-- | Put syntactic hole.\nmkSynHole :: Text -> NExpr\nmkSynHole = Fix . mkSynHoleF\n\nmkSelector :: Text -> NAttrPath NExpr\nmkSelector = one . StaticKey . coerce\n\n{- | Put a binary operator.\n @since\n-}\nmkApp :: NExpr -> NExpr -> NExpr\nmkApp a = Fix . NApp a\n\n-- | Put an unary operator.\n\n--  @since 0.15.0\nmkOp :: NUnaryOp -> NExpr -> NExpr\nmkOp op = Fix . NUnary op\n\n-- | Logical negation: @not@.\nmkNot :: NExpr -> NExpr\nmkNot = mkOp NNot\n\n{- | Number negation: @-@.\n\nNegation in the language works with integers and floating point.\n @since 0.15.0\n-}\nmkNeg :: NExpr -> NExpr\nmkNeg = mkOp NNeg\n\n{- | Put a binary operator.\n @since 0.15.0\n-}\nmkOp2 :: NBinaryOp -> NExpr -> NExpr -> NExpr\nmkOp2 op a = Fix . NBinary op a\n\n{- | > { x }\n @since 0.15.0\n-}\nmkParamSet :: [(Text, Maybe NExpr)] -> Params NExpr\nmkParamSet pset = mkGeneralParamSet Nothing pset False\n\n{- | > { x, ... }\n @since 0.15.0\n-}\nmkVariadicParamSet :: [(Text, Maybe NExpr)] -> Params NExpr\nmkVariadicParamSet pset = mkGeneralParamSet Nothing pset True\n\n{- | > s@{ x }\n @since 0.15.0\n-}\nmkNamedParamSet :: Text -> [(Text, Maybe NExpr)] -> Params NExpr\nmkNamedParamSet name pset = mkGeneralParamSet (pure name) pset False\n\n{- | > s@{ x, ... }\n @since 0.15.0\n-}\nmkNamedVariadicParamSet :: Text -> [(Text, Maybe NExpr)] -> Params NExpr\nmkNamedVariadicParamSet name params = mkGeneralParamSet (pure name) params True\n\n{- | Args:\n\n1. Maybe name:\n\n> Nothing  ->   {}\n> Just \"s\" -> s@{}\n\n2. key:expr pairs\n\n3. Is variadic or not:\n\n> True  -> {...}\n> False -> {}\n @since 0.15.0\n-}\nmkGeneralParamSet :: Maybe Text -> [(Text, Maybe NExpr)] -> Bool -> Params NExpr\nmkGeneralParamSet mname params variadic = ParamSet (coerce mname) (Variadic `whenTrue` variadic) (coerce params)\n\n-- | > rec { .. }\nmkRecSet :: [Binding NExpr] -> NExpr\nmkRecSet = mkSet Recursive\n\n{- | Put a non-recursive set.\n\n> { .. }\n-}\nmkNonRecSet :: [Binding NExpr] -> NExpr\nmkNonRecSet = mkSet mempty\n\n-- | General set builder function.\nmkSet :: Recursivity -> [Binding NExpr] -> NExpr\nmkSet r = Fix . NSet r\n\n{- | Empty set.\n\nMonoid. Use @//@ operation (shorthand $//) to extend the set.\n @since 0.15.0\n-}\nemptySet :: NExpr\nemptySet = mkNonRecSet mempty\n\n-- | Put a list.\nmkList :: [NExpr] -> NExpr\nmkList = Fix . NList\n\n--  @since 0.15.0\nemptyList :: NExpr\nemptyList = mkList mempty\n\n{- | Wrap in a @let@.\n\n(Evaluate the second argument after introducing the bindings.)\n\n+------------------------+-----------------+\n| Haskell                | Nix             |\n+========================+=================+\n| @mkLets bindings expr@ | @let bindings;@ |\n|                        | @in expr@       |\n+------------------------+-----------------+\n-}\nmkLets :: [Binding NExpr] -> NExpr -> NExpr\nmkLets bindings = Fix . NLet bindings\n\n{- | Create a @whith@:\n1st expr - what to bring into the scope.\n2nd - expression that recieves the scope extention.\n\n+--------------------+-------------------+\n| Haskell            | Nix               |\n+====================+===================+\n| @mkWith body main@ | @with body; expr@ |\n+--------------------+-------------------+\n-}\nmkWith :: NExpr -> NExpr -> NExpr\nmkWith e = Fix . NWith e\n\n{- | Create an @assert@:\n1st expr - asserting itself, must return @true@.\n2nd - main expression to evaluated after assertion.\n\n+-----------------------+----------------------+\n| Haskell               | Nix                  |\n+=======================+======================+\n| @mkAssert check eval@ | @assert check; eval@ |\n+-----------------------+----------------------+\n-}\nmkAssert :: NExpr -> NExpr -> NExpr\nmkAssert e = Fix . NAssert e\n\n{- | Put:\n\n> if expr1\n>   then expr2\n>   else expr3\n-}\nmkIf :: NExpr -> NExpr -> NExpr -> NExpr\nmkIf e1 e2 = Fix . NIf e1 e2\n\n{- | Lambda function, analog of Haskell's @\\\\ x -> x@:\n\n+-----------------------+-----------+\n| Haskell               | Nix       |\n+=======================+===========+\n| @ mkFunction x expr @ | @x: expr@ |\n+-----------------------+-----------+\n-}\nmkFunction :: Params NExpr -> NExpr -> NExpr\nmkFunction params = Fix . NAbs params\n\n{- | General dot-reference with optional alternative if the key does not exist.\n @since 0.15.0\n-}\ngetRefOrDefault :: Maybe NExpr -> NExpr -> Text -> NExpr\ngetRefOrDefault alt obj = Fix . NSelect alt obj . mkSelector\n\n-- ** Base functor builders for basic expressions builders *sic\n\n-- | Unfixed @mkNull@.\nmkNullF :: NExprF a\nmkNullF = NConstant NNull\n\n-- | Unfixed @mkBool@.\nmkBoolF :: Bool -> NExprF a\nmkBoolF = NConstant . NBool\n\n-- | Unfixed @mkInt@.\nmkIntF :: Integer -> NExprF a\nmkIntF = NConstant . NInt\n\n-- | Unfixed @mkFloat@.\nmkFloatF :: Float -> NExprF a\nmkFloatF = NConstant . NFloat\n\n-- | Unfixed @mkPath@.\nmkPathF :: Bool -> FilePath -> NExprF a\nmkPathF False = NLiteralPath . coerce\nmkPathF True = NEnvPath . coerce\n\n-- | Unfixed @mkEnvPath@.\nmkEnvPathF :: FilePath -> NExprF a\nmkEnvPathF = mkPathF True\n\n-- | Unfixed @mkRelPath@.\nmkRelPathF :: FilePath -> NExprF a\nmkRelPathF = mkPathF False\n\n-- | Unfixed @mkSym@.\nmkSymF :: Text -> NExprF a\nmkSymF = NSym . coerce\n\n-- | Unfixed @mkSynHole@.\nmkSynHoleF :: Text -> NExprF a\nmkSynHoleF = NSynHole . coerce\n\n-- * Other\n\n-- (org this better/make a better name for section(s))\n\n{- | An `inherit` clause with an expression to pull from.\n\n+------------------------+--------------------+------------+\n| Hask                   | Nix                | pseudocode |\n+========================+====================+============+\n| @inheritFrom x [a, b]@ | @inherit (x) a b;@ | @a = x.a;@ |\n|                        |                    | @b = x.b;@ |\n+------------------------+--------------------+------------+\n-}\ninheritFrom :: e -> [VarName] -> Binding e\ninheritFrom expr ks = Inherit (pure expr) ks nullPos\n\n{- | An `inherit` clause without an expression to pull from.\n\n+----------------------+----------------+------------------+\n| Hask                 | Nix            | pseudocode       |\n+======================+================+==================+\n| @inheritFrom [a, b]@ | @inherit a b;@ | @a = outside.a;@ |\n|                      |                | @b = outside.b;@ |\n+----------------------+----------------+------------------+\n-}\ninherit :: [VarName] -> Binding e\ninherit ks = Inherit Nothing ks nullPos\n\n-- | Nix @=@ (bind operator).\n($=) :: Text -> NExpr -> Binding NExpr\n($=) = bindTo\n\ninfixr 2 $=\n\n-- | Shorthand for producing a binding of a name to an expression: Nix's @=@.\nbindTo :: Text -> NExpr -> Binding NExpr\nbindTo name x = NamedVar (mkSelector name) x nullPos\n\n{- | Append a list of bindings to a set or let expression.\nFor example:\nadding      `[a = 1, b = 2]`\nto       `let               c = 3; in 4`\nproduces `let a = 1; b = 2; c = 3; in 4`.\n-}\nappendBindings :: [Binding NExpr] -> NExpr -> NExpr\nappendBindings newBindings (Fix e) =\n    case e of\n        NLet bindings e' -> mkLets (bindings <> newBindings) e'\n        NSet recur bindings -> Fix $ NSet recur (bindings <> newBindings)\n        _ -> error \"Can only append bindings to a set or a let\"\n\n-- | Applies a transformation to the body of a Nix function.\nmodifyFunctionBody :: (NExpr -> NExpr) -> NExpr -> NExpr\nmodifyFunctionBody transform (Fix (NAbs params body)) = mkFunction params $ transform body\nmodifyFunctionBody _ _ = error \"Not a function\"\n\n-- | A @let@ statement with multiple assignments.\nletsE :: [(Text, NExpr)] -> NExpr -> NExpr\nletsE pairs = mkLets $ uncurry ($=) <$> pairs\n\n-- | Wrapper for a single-variable @let@.\nletE :: Text -> NExpr -> NExpr -> NExpr\nletE varName varExpr = letsE $ one (varName, varExpr)\n\n-- | Make a non-recursive attribute set.\nattrsE :: [(Text, NExpr)] -> NExpr\nattrsE pairs = mkNonRecSet $ uncurry ($=) <$> pairs\n\n-- | Make a recursive attribute set.\nrecAttrsE :: [(Text, NExpr)] -> NExpr\nrecAttrsE pairs = mkRecSet $ uncurry ($=) <$> pairs\n\n-- * Nix binary operators\n\n(@@)\n    , ($==)\n    , ($!=)\n    , ($<)\n    , ($<=)\n    , ($>)\n    , ($>=)\n    , ($&&)\n    , ($||)\n    , ($->)\n    , ($//)\n    , ($+)\n    , ($-)\n    , ($*)\n    , ($/)\n    , ($++) ::\n        NExpr -> NExpr -> NExpr\n\n--  2021-07-10: NOTE: Probably the presedence of some operators is still needs to be tweaked.\n\n-- | Dot-reference into an attribute set: @attrSet.k@\n(@.) :: NExpr -> Text -> NExpr\n(@.) = getRefOrDefault Nothing\n\ninfix 9 @.\n\n{- | Dot-reference into an attribute set with alternative if the key does not exist.\n\n> s.x or y\n @since 0.15.0\n-}\n(@.<|>) :: NExpr -> Text -> NExpr -> NExpr\n(@.<|>) obj name alt = getRefOrDefault (pure alt) obj name\n\ninfix 9 @.<|>\n\n-- | Function application (@' '@ in @f x@)\n(@@) = mkApp\n\ninfixl 8 @@\n\n-- | List concatenation: @++@\n($++) = mkOp2 NConcat\n\ninfixr 7 $++\n\n-- | Multiplication: @*@\n($*) = mkOp2 NMult\n\ninfixl 6 $*\n\n-- | Division: @/@\n($/) = mkOp2 NDiv\n\ninfixl 6 $/\n\n-- | Addition: @+@\n($+) = mkOp2 NPlus\n\ninfixl 5 $+\n\n-- | Subtraction: @-@\n($-) = mkOp2 NMinus\n\ninfixl 5 $-\n\n-- | Extend/override the left attr set, with the right one: @//@\n($//) = mkOp2 NUpdate\n\ninfixr 5 $//\n\n-- | Greater than: @>@\n($>) = mkOp2 NGt\n\ninfix 4 $>\n\n-- | Greater than OR equal: @>=@\ninfix 4 $>=\n\n($>=) = mkOp2 NGte\n\n-- | Less than OR equal: @<=@\n($<=) = mkOp2 NLte\n\ninfix 4 $<=\n\n-- | Less than: @<@\n($<) = mkOp2 NLt\n\ninfix 4 $<\n\n-- | Equality: @==@\n($==) = mkOp2 NEq\n\ninfix 3 $==\n\n-- | Inequality: @!=@\n($!=) = mkOp2 NNEq\n\ninfix 3 $!=\n\n-- | AND: @&&@\n($&&) = mkOp2 NAnd\n\ninfixl 2 $&&\n\n-- | OR: @||@\n($||) = mkOp2 NOr\n\ninfixl 2 $||\n\n-- | Logical implication: @->@\n($->) = mkOp2 NImpl\n\ninfix 1 $->\n\n{- | Lambda function, analog of Haskell's @\\\\ x -> x@:\n\n+---------------+-----------+\n| Haskell       | Nix       |\n+===============+===========+\n| @x ==> expr @ | @x: expr@ |\n+---------------+-----------+\n-}\n(==>) :: Params NExpr -> NExpr -> NExpr\n(==>) = mkFunction\n\ninfixr 1 ==>\n\n-- * Under deprecation\n\n-- NOTE: Remove after 2023-07\n\n{- | __@Deprecated@__: Please, use `mkOp`\nPut an unary operator.\n-}\nmkOper :: NUnaryOp -> NExpr -> NExpr\nmkOper = mkOp\n\n-- NOTE: Remove after 2023-07\n\n{- | __@Deprecated@__: Please, use `mkOp2`\n| Put a binary operator.\n-}\nmkOper2 :: NBinaryOp -> NExpr -> NExpr -> NExpr\nmkOper2 = mkOp2\n\n-- NOTE: Remove after 2023-07\n\n{- | __@Deprecated@__: Please, use `mkOp2`\n| Nix binary operator builder.\n-}\nmkBinop :: NBinaryOp -> NExpr -> NExpr -> NExpr\nmkBinop = mkOp2\n\n-- NOTE: Remove after 2023-07\n\n{- | __@Deprecated@__: Please, use:\n  * `mkParamSet` is for closed sets;\n  * `mkVariadicSet` is for variadic;\n  * `mkGeneralParamSet` a general constructor.\n-}\nmkParamset :: [(Text, Maybe NExpr)] -> Bool -> Params NExpr\nmkParamset params variadic = ParamSet Nothing (Variadic `whenTrue` variadic) (coerce params)\n"
  },
  {
    "path": "src/Nix/Expr/Strings.hs",
    "content": "-- | Functions for manipulating nix strings.\nmodule Nix.Expr.Strings where\n\nimport Nix.Prelude\nimport Relude.Unsafe as Unsafe\n\n-- Please, switch things to NonEmpty\nimport Data.List (\n    dropWhileEnd,\n    lookup,\n    minimum,\n )\nimport qualified Data.Text as T\nimport Nix.Expr.Types\n\n-- | Merge adjacent @Plain@ values with @<>@.\nmergePlain :: [Antiquoted Text r] -> [Antiquoted Text r]\nmergePlain [] = mempty\nmergePlain (Plain a : EscapedNewline : Plain b : xs) =\n    mergePlain (Plain (a <> \"\\n\" <> b) : xs)\nmergePlain (Plain a : Plain b : xs) = mergePlain (Plain (a <> b) : xs)\nmergePlain (x : xs) = x : mergePlain xs\n\n{- | Remove 'Plain' values equal to 'mempty', as they don't have any\ninformational content.\n-}\nremoveEmptyPlains :: [Antiquoted Text r] -> [Antiquoted Text r]\nremoveEmptyPlains = filter f\n  where\n    f (Plain x) = x /= mempty\n    f _ = True\n\n-- trimEnd xs\n--     | null xs = xs\n--     | otherwise = case last xs of\n--           Plain x -> init xs <> [Plain (T.dropWhileEnd (== ' ') x)]\n--           _ -> xs\n\n-- | Equivalent to case splitting on 'Antiquoted' strings.\nrunAntiquoted :: v -> (v -> a) -> (r -> a) -> Antiquoted v r -> a\nrunAntiquoted _ f _ (Plain v) = f v\nrunAntiquoted nl f _ EscapedNewline = f nl\nrunAntiquoted _ _ k (Antiquoted r) = k r\n\n-- | Split a stream representing a string with antiquotes on line breaks.\nsplitLines :: forall r. [Antiquoted Text r] -> [[Antiquoted Text r]]\nsplitLines = uncurry (flip (:)) . go\n  where\n    go :: [Antiquoted Text r] -> ([[Antiquoted Text r]], [Antiquoted Text r])\n    go (Plain t : xs) = (one (Plain l) <>) <$> foldr f (go xs) ls\n      where\n        (l : ls) = T.split (== '\\n') t\n        f prefix (finished, current) = ((Plain prefix : current) : finished, mempty)\n    go (Antiquoted a : xs) = (one (Antiquoted a) <>) <$> go xs\n    go (EscapedNewline : xs) = (one EscapedNewline <>) <$> go xs\n    go [] = mempty\n\n{- | Join a stream of strings containing antiquotes again. This is the inverse\nof 'splitLines'.\n-}\nunsplitLines :: [[Antiquoted Text r]] -> [Antiquoted Text r]\nunsplitLines = intercalate $ one $ Plain \"\\n\"\n\n-- | Form an indented string by stripping spaces equal to the minimal indent.\nstripIndent :: [Antiquoted Text r] -> NString r\nstripIndent [] = Indented 0 mempty\nstripIndent xs =\n    Indented\n        minIndent\n        ( removeEmptyPlains\n            $ mergePlain\n            $ (snd <$>)\n            $ dropWhileEnd\n                cleanup\n            $ pairWithLast\n            $ unsplitLines ls'\n        )\n  where\n    pairWithLast ys =\n        zip\n            ( handlePresence\n                Nothing\n                (pure . Unsafe.last)\n                <$> inits ys\n            )\n            ys\n\n    ls = stripEmptyOpening $ splitLines xs\n    ls' = dropSpaces minIndent <$> ls\n\n    minIndent =\n        handlePresence\n            0\n            (minimum . (countSpaces . mergePlain <$>))\n            (stripEmptyLines ls)\n\n    stripEmptyLines = filter $ \\case\n        [Plain t] -> not $ T.null $ T.strip t\n        _ -> True\n\n    stripEmptyOpening ([Plain t] : ts) | T.null (T.strip t) = ts\n    stripEmptyOpening ts = ts\n\n    countSpaces (Antiquoted _ : _) = 0\n    countSpaces (EscapedNewline : _) = 0\n    countSpaces (Plain t : _) = T.length . T.takeWhile (== ' ') $ t\n    countSpaces [] = 0\n\n    dropSpaces 0 x = x\n    dropSpaces n (Plain t : cs) = Plain (T.drop n t) : cs\n    dropSpaces _ _ = fail \"stripIndent: impossible\"\n\n    cleanup (Nothing, Plain y) = T.all (== ' ') y\n    cleanup (Just (Plain x), Plain y) | \"\\n\" `T.isSuffixOf` x = T.all (== ' ') y\n    cleanup _ = False\n\nescapeCodes :: [(Char, Char)]\nescapeCodes =\n    [('\\n', 'n'), ('\\r', 'r'), ('\\t', 't'), ('\"', '\"'), ('$', '$'), ('\\\\', '\\\\')]\n\nfromEscapeCode :: Char -> Maybe Char\nfromEscapeCode = (`lookup` (swap <$> escapeCodes))\n\ntoEscapeCode :: Char -> Maybe Char\ntoEscapeCode = (`lookup` escapeCodes)\n\nescapeMap :: [(Text, Text)]\nescapeMap =\n    [(\"\\n\", \"\\\\n\"), (\"\\r\", \"\\\\r\"), (\"\\t\", \"\\\\t\"), (\"\\\"\", \"\\\\\\\"\"), (\"${\", \"\\\\${\"), (\"\\\\\", \"\\\\\\\\\")]\n\nescapeString :: Text -> Text\nescapeString = applyAll (fmap (uncurry T.replace) escapeMap)\n"
  },
  {
    "path": "src/Nix/Expr/Types/Annotated.hs",
    "content": "{-# LANGUAGE CPP #-}\n{-# LANGUAGE DeriveAnyClass #-}\n{-# LANGUAGE KindSignatures #-}\n{-# LANGUAGE PatternSynonyms #-}\n{-# LANGUAGE RankNTypes #-}\n{-# LANGUAGE TemplateHaskell #-}\n\n-- | The source location annotated nix expression type and supporting types.\nmodule Nix.Expr.Types.Annotated (\n    module Nix.Expr.Types.Annotated,\n    module Data.Functor.Compose,\n)\nwhere\n\nimport Codec.Serialise\nimport Control.DeepSeq\nimport Data.Aeson (\n    FromJSON (..),\n    ToJSON (..),\n )\nimport Data.Aeson.TH\nimport Data.Binary (Binary (..))\nimport Data.Data\nimport Data.Eq.Deriving\nimport Data.Fix (\n    Fix (..),\n    unfoldFix,\n )\nimport Data.Functor.Compose\nimport Data.Hashable.Lifted\nimport Data.Ord.Deriving\nimport GHC.Generics\nimport Nix.Atoms\nimport Nix.Expr.Types\nimport Nix.Prelude\nimport Text.Read.Deriving\nimport Text.Show.Deriving\n\n-- * data type @SrcSpan@ - a zone in a source file\n\n-- | Demarcation of a chunk in a source file.\ndata SrcSpan = SrcSpan\n    { getSpanBegin :: NSourcePos\n    , getSpanEnd :: NSourcePos\n    }\n    deriving (Ord, Eq, Generic, Typeable, Data, Show, NFData, Hashable)\n\n-- ** Instances\n\ninstance Semigroup SrcSpan where\n    s1 <> s2 =\n        SrcSpan\n            (on min getSpanBegin s1 s2)\n            (on max getSpanEnd s1 s2)\n\ninstance Binary SrcSpan\ninstance ToJSON SrcSpan\ninstance FromJSON SrcSpan\n\ninstance Serialise SrcSpan\n\n-- * data type @Ann@\n\n--  2021-08-02: NOTE: Annotation needs to be after what is annotated.\n\n{- | A type constructor applied to a type along with an annotation\n\nIntended to be used with 'Fix':\n@type MyType = Fix (Compose (AnnUnit Annotation) F)@\n-}\ndata AnnUnit ann expr = AnnUnit\n    { annotation :: ann\n    , annotated :: expr\n    }\n    deriving\n        ( Eq\n        , Ord\n        , Data\n        , Typeable\n        , Hashable\n        , Generic\n        , Generic1\n        , NFData\n        , Functor\n        , Foldable\n        , Traversable\n        , Show\n        , Read\n        )\n\ntype AnnF ann f = Compose (AnnUnit ann) f\n\n-- | Pattern: @(Compose (AnnUnit _ _))@.\npattern AnnF ::\n    ann ->\n    f a ->\n    Compose (AnnUnit ann) f a\npattern AnnF ann f = Compose (AnnUnit ann f)\n\n{-# COMPLETE AnnF #-}\n\ntype Ann ann f = Fix (AnnF ann f)\n\n{- | Pattern: @Fix (Compose (AnnUnit _ _))@.\nFix composes units of (annotations & the annotated) into one object.\nGiving annotated expression.\n-}\npattern Ann ::\n    forall ann (f :: Type -> Type).\n    ann ->\n    f (Ann ann f) ->\n    Ann ann f\npattern Ann ann a = Fix (AnnF ann a)\n\n{-# COMPLETE Ann #-}\n\nannUnitToAnn :: AnnUnit ann (f (Ann ann f)) -> Ann ann f\nannUnitToAnn (AnnUnit ann a) = Ann ann a\n\n-- ** Instances\n\ninstance (NFData ann) => NFData1 (AnnUnit ann)\n\ninstance (Binary ann, Binary a) => Binary (AnnUnit ann a)\n\n$(deriveEq1 ''AnnUnit)\n$(deriveEq2 ''AnnUnit)\n$(deriveOrd1 ''AnnUnit)\n$(deriveOrd2 ''AnnUnit)\n$(deriveRead1 ''AnnUnit)\n$(deriveRead2 ''AnnUnit)\n$(deriveShow1 ''AnnUnit)\n$(deriveShow2 ''AnnUnit)\n$(deriveJSON1 defaultOptions ''AnnUnit)\n$(deriveJSON2 defaultOptions ''AnnUnit)\n\ninstance (Hashable ann) => Hashable1 (AnnUnit ann)\n\ninstance (Serialise ann, Serialise a) => Serialise (AnnUnit ann a)\n\n-- ** @NExprLoc{,F}@ - annotated Nix expression\n\ntype NExprLocF = AnnF SrcSpan NExprF\n\ninstance (Serialise r) => Serialise (NExprLocF r) where\n    encode (AnnF ann a) = encode ann <> encode a\n    decode =\n        liftA2\n            AnnF\n            decode\n            decode\n\ninstance (Binary r) => Binary (NExprLocF r)\n\n-- | Annotated Nix expression (each subexpression direct to its source location).\ntype NExprLoc = Fix NExprLocF\n\ninstance Serialise NExprLoc\n\ninstance Binary NExprLoc\n\n-- * Other\n\nstripAnnF :: AnnF ann f r -> f r\nstripAnnF = annotated . getCompose\n\nstripAnnotation :: (Functor f) => Ann ann f -> Fix f\nstripAnnotation = unfoldFix (stripAnnF . unFix)\n\nannNUnary :: AnnUnit SrcSpan NUnaryOp -> NExprLoc -> NExprLoc\nannNUnary (AnnUnit s1 u) e1@(Ann s2 _) = NUnaryAnn (s1 <> s2) u e1\n{-# INLINE annNUnary #-}\n\nannNBinary :: AnnUnit SrcSpan NBinaryOp -> NExprLoc -> NExprLoc -> NExprLoc\nannNBinary (AnnUnit s1 b) e1@(Ann s2 _) e2@(Ann s3 _) = NBinaryAnn (s1 <> s2 <> s3) b e1 e2\n\nannNSelect ::\n    Maybe NExprLoc -> NExprLoc -> AnnUnit SrcSpan (NAttrPath NExprLoc) -> NExprLoc\nannNSelect Nothing e2@(Ann s2 _) (AnnUnit s1 ats) = NSelectAnn (s2 <> s1) Nothing e2 ats\nannNSelect (Just e3@(Ann s3 _)) e2@(Ann s2 _) (AnnUnit s1 ats) = NSelectAnn (s3 <> s2 <> s1) (pure e3) e2 ats\n\nannNHasAttr :: NExprLoc -> AnnUnit SrcSpan (NAttrPath NExprLoc) -> NExprLoc\nannNHasAttr e1@(Ann s1 _) (AnnUnit s2 ats) = NHasAttrAnn (s1 <> s2) e1 ats\n\nannNApp :: NExprLoc -> NExprLoc -> NExprLoc\nannNApp e1@(Ann s1 _) e2@(Ann s2 _) = NAppAnn (s1 <> s2) e1 e2\n\nannNAbs :: AnnUnit SrcSpan (Params NExprLoc) -> NExprLoc -> NExprLoc\nannNAbs (AnnUnit s1 ps) e1@(Ann s2 _) = NAbsAnn (s1 <> s2) ps e1\n\nannNStr :: AnnUnit SrcSpan (NString NExprLoc) -> NExprLoc\nannNStr (AnnUnit s1 s) = NStrAnn s1 s\n\ndeltaInfo :: NSourcePos -> (Text, Int, Int)\ndeltaInfo (NSourcePos fp l c) = (fromString $ coerce fp, unPos $ coerce l, unPos $ coerce c)\n\nannNNull :: NExprLoc\nannNNull = NConstantAnn nullSpan NNull\n{-# INLINE annNNull #-}\n\nnullSpan :: SrcSpan\nnullSpan = SrcSpan nullPos nullPos\n{-# INLINE nullSpan #-}\n\n-- ** Patterns\n\n-- *** Patterns to match on 'NExprLocF' constructions (for 'SrcSpan'-based annotations).\n\npattern NConstantAnnF :: SrcSpan -> NAtom -> NExprLocF r\npattern NConstantAnnF ann x = AnnF ann (NConstant x)\n\npattern NStrAnnF :: SrcSpan -> NString r -> NExprLocF r\npattern NStrAnnF ann x = AnnF ann (NStr x)\n\npattern NSymAnnF :: SrcSpan -> VarName -> NExprLocF r\npattern NSymAnnF ann x = AnnF ann (NSym x)\n\npattern NListAnnF :: SrcSpan -> [r] -> NExprLocF r\npattern NListAnnF ann x = AnnF ann (NList x)\n\npattern NSetAnnF :: SrcSpan -> Recursivity -> [Binding r] -> NExprLocF r\npattern NSetAnnF ann rec x = AnnF ann (NSet rec x)\n\npattern NLiteralPathAnnF :: SrcSpan -> Path -> NExprLocF r\npattern NLiteralPathAnnF ann x = AnnF ann (NLiteralPath x)\n\npattern NEnvPathAnnF :: SrcSpan -> Path -> NExprLocF r\npattern NEnvPathAnnF ann x = AnnF ann (NEnvPath x)\n\npattern NUnaryAnnF :: SrcSpan -> NUnaryOp -> r -> NExprLocF r\npattern NUnaryAnnF ann op x = AnnF ann (NUnary op x)\n\npattern NAppAnnF :: SrcSpan -> r -> r -> NExprLocF r\npattern NAppAnnF ann x y = AnnF ann (NApp x y)\n\npattern NBinaryAnnF :: SrcSpan -> NBinaryOp -> r -> r -> NExprLocF r\npattern NBinaryAnnF ann op x y = AnnF ann (NBinary op x y)\n\npattern NSelectAnnF :: SrcSpan -> Maybe r -> r -> NAttrPath r -> NExprLocF r\npattern NSelectAnnF ann v x p = AnnF ann (NSelect v x p)\n\npattern NHasAttrAnnF :: SrcSpan -> r -> NAttrPath r -> NExprLocF r\npattern NHasAttrAnnF ann x p = AnnF ann (NHasAttr x p)\n\npattern NAbsAnnF :: SrcSpan -> Params r -> r -> NExprLocF r\npattern NAbsAnnF ann x b = AnnF ann (NAbs x b)\n\npattern NLetAnnF :: SrcSpan -> [Binding r] -> r -> NExprLocF r\npattern NLetAnnF ann x b = AnnF ann (NLet x b)\n\npattern NIfAnnF :: SrcSpan -> r -> r -> r -> NExprLocF r\npattern NIfAnnF ann c t e = AnnF ann (NIf c t e)\n\npattern NWithAnnF :: SrcSpan -> r -> r -> NExprLocF r\npattern NWithAnnF ann x y = AnnF ann (NWith x y)\n\npattern NAssertAnnF :: SrcSpan -> r -> r -> NExprLocF r\npattern NAssertAnnF ann x y = AnnF ann (NAssert x y)\n\npattern NSynHoleAnnF :: SrcSpan -> VarName -> NExprLocF r\npattern NSynHoleAnnF ann x = AnnF ann (NSynHole x)\n{-# COMPLETE NConstantAnnF, NStrAnnF, NSymAnnF, NListAnnF, NSetAnnF, NLiteralPathAnnF, NEnvPathAnnF, NUnaryAnnF, NBinaryAnnF, NSelectAnnF, NHasAttrAnnF, NAbsAnnF, NLetAnnF, NIfAnnF, NWithAnnF, NAssertAnnF, NSynHoleAnnF #-}\n\n-- *** Patterns to match on 'NExprLoc' constructions (for 'SrcSpan'-based annotations).\n\npattern NConstantAnn :: SrcSpan -> NAtom -> NExprLoc\npattern NConstantAnn ann x = Ann ann (NConstant x)\n\npattern NStrAnn :: SrcSpan -> NString NExprLoc -> NExprLoc\npattern NStrAnn ann x = Ann ann (NStr x)\n\npattern NSymAnn :: SrcSpan -> VarName -> NExprLoc\npattern NSymAnn ann x = Ann ann (NSym x)\n\npattern NListAnn :: SrcSpan -> [NExprLoc] -> NExprLoc\npattern NListAnn ann x = Ann ann (NList x)\n\npattern NSetAnn :: SrcSpan -> Recursivity -> [Binding NExprLoc] -> NExprLoc\npattern NSetAnn ann rec x = Ann ann (NSet rec x)\n\npattern NLiteralPathAnn :: SrcSpan -> Path -> NExprLoc\npattern NLiteralPathAnn ann x = Ann ann (NLiteralPath x)\n\npattern NEnvPathAnn :: SrcSpan -> Path -> NExprLoc\npattern NEnvPathAnn ann x = Ann ann (NEnvPath x)\n\npattern NUnaryAnn :: SrcSpan -> NUnaryOp -> NExprLoc -> NExprLoc\npattern NUnaryAnn ann op x = Ann ann (NUnary op x)\n\npattern NAppAnn :: SrcSpan -> NExprLoc -> NExprLoc -> NExprLoc\npattern NAppAnn ann x y = Ann ann (NApp x y)\n\npattern NBinaryAnn :: SrcSpan -> NBinaryOp -> NExprLoc -> NExprLoc -> NExprLoc\npattern NBinaryAnn ann op x y = Ann ann (NBinary op x y)\n\npattern NSelectAnn :: SrcSpan -> Maybe NExprLoc -> NExprLoc -> NAttrPath NExprLoc -> NExprLoc\npattern NSelectAnn ann v x p = Ann ann (NSelect v x p)\n\npattern NHasAttrAnn :: SrcSpan -> NExprLoc -> NAttrPath NExprLoc -> NExprLoc\npattern NHasAttrAnn ann x p = Ann ann (NHasAttr x p)\n\npattern NAbsAnn :: SrcSpan -> Params NExprLoc -> NExprLoc -> NExprLoc\npattern NAbsAnn ann x b = Ann ann (NAbs x b)\n\npattern NLetAnn :: SrcSpan -> [Binding NExprLoc] -> NExprLoc -> NExprLoc\npattern NLetAnn ann x b = Ann ann (NLet x b)\n\npattern NIfAnn :: SrcSpan -> NExprLoc -> NExprLoc -> NExprLoc -> NExprLoc\npattern NIfAnn ann c t e = Ann ann (NIf c t e)\n\npattern NWithAnn :: SrcSpan -> NExprLoc -> NExprLoc -> NExprLoc\npattern NWithAnn ann x y = Ann ann (NWith x y)\n\npattern NAssertAnn :: SrcSpan -> NExprLoc -> NExprLoc -> NExprLoc\npattern NAssertAnn ann x y = Ann ann (NAssert x y)\n\npattern NSynHoleAnn :: SrcSpan -> VarName -> NExprLoc\npattern NSynHoleAnn ann x = Ann ann (NSynHole x)\n{-# COMPLETE NConstantAnn, NStrAnn, NSymAnn, NListAnn, NSetAnn, NLiteralPathAnn, NEnvPathAnn, NUnaryAnn, NBinaryAnn, NSelectAnn, NHasAttrAnn, NAbsAnn, NLetAnn, NIfAnn, NWithAnn, NAssertAnn, NSynHoleAnn #-}\n"
  },
  {
    "path": "src/Nix/Expr/Types.hs",
    "content": "{-# LANGUAGE CPP #-}\n{-# LANGUAGE ConstraintKinds #-}\n{-# LANGUAGE DeriveAnyClass #-}\n{-# LANGUAGE FunctionalDependencies #-}\n{-# LANGUAGE RankNTypes #-}\n{-# LANGUAGE TemplateHaskell #-}\n{-# LANGUAGE TypeFamilies #-}\n{-# OPTIONS_GHC -Wno-missing-signatures #-}\n{-# OPTIONS_GHC -Wno-name-shadowing #-}\n{-# OPTIONS_GHC -Wno-orphans #-}\n\n{- | The Nix expression type and supporting types.\n\n[Brief introduction of the Nix expression language.](https://nixos.org/nix/manual/#ch-expression-language)\n\nThis module is a beginning of a deep embedding (term) of a Nix language into Haskell.\n[Brief on shallow & deep embedding.](https://web.archive.org/web/20201112031804/https://alessandrovermeulen.me/2013/07/13/the-difference-between-shallow-and-deep-embedding/)\n\n(additiona info for dev): Big use of TemplateHaskell in the module requires proper (top-down) organization of declarations.\n-}\nmodule Nix.Expr.Types (\n    module Nix.Expr.Types,\n    SourcePos (..),\n    unPos,\n    mkPos,\n)\nwhere\n\nimport Codec.Serialise (Serialise)\nimport qualified Codec.Serialise as Serialise\nimport Control.DeepSeq (NFData1 (..))\nimport Data.Aeson\nimport Data.Aeson.TH (deriveJSON2)\nimport Data.Binary (Binary)\nimport qualified Data.Binary as Binary\nimport Data.Data\nimport Data.Eq.Deriving (deriveEq1, deriveEq2)\nimport Data.Fix (Fix (..))\nimport Data.Functor.Classes\nimport qualified Data.HashMap.Lazy as MapL\nimport Data.Hashable.Lifted\nimport qualified Data.List.NonEmpty as NE\nimport Data.Ord.Deriving (deriveOrd1, deriveOrd2)\nimport qualified Data.Set as Set\nimport Data.Traversable (fmapDefault, foldMapDefault)\nimport GHC.Generics\nimport qualified Language.Haskell.TH.Syntax as TH\nimport Lens.Family2\nimport Lens.Family2.TH\nimport Nix.Atoms\nimport Nix.Prelude\nimport Text.Megaparsec.Pos (\n    Pos,\n    SourcePos (SourcePos),\n    mkPos,\n    unPos,\n )\nimport Text.Read.Deriving (deriveRead1, deriveRead2)\nimport qualified Text.Show\nimport Text.Show.Deriving (deriveShow1, deriveShow2)\nimport qualified Type.Reflection as Reflection\n#if !MIN_VERSION_text(1,2,4)\n-- NOTE: Remove package @th-lift-instances@ removing this\nimport           Instances.TH.Lift              ()  -- importing Lift Text for GHC 8.6\n#endif\n\n-- * utils\n\nnewtype NPos = NPos Pos\n    deriving\n        ( Eq\n        , Ord\n        , Read\n        , Show\n        , Data\n        , NFData\n        , Generic\n        )\n\ninstance Semigroup NPos where\n    (NPos x) <> (NPos y) = NPos (x <> y)\n\n{- | Represents source positions.\nSource line & column positions change intensively during parsing,\nso they are declared strict to avoid memory leaks.\n\nThe data type is a reimplementation of 'Text.Megaparsec.Pos' 'SourcePos'.\n-}\ndata NSourcePos\n    = NSourcePos\n    { getSourceName :: Path\n    -- ^ Name of source file\n    , getSourceLine :: !NPos\n    -- ^ Line number\n    , getSourceColumn :: !NPos\n    -- ^ Column number\n    }\n    deriving\n        ( Eq\n        , Ord\n        , Read\n        , Show\n        , Data\n        , NFData\n        , Generic\n        )\n\n-- | Helper for 'SourcePos' -> 'NSourcePos' coersion.\ntoNSourcePos :: SourcePos -> NSourcePos\ntoNSourcePos (SourcePos f l c) =\n    NSourcePos (coerce f) (coerce l) (coerce c)\n\n-- | Helper for 'NSourcePos' -> 'SourcePos' coersion.\ntoSourcePos :: NSourcePos -> SourcePos\ntoSourcePos (NSourcePos f l c) =\n    SourcePos (coerce f) (coerce l) (coerce c)\n\n--  2021-07-16: NOTE: Should replace @ParamSet@ List\n\n-- | > Hashmap VarName -- type synonym\ntype AttrSet = HashMap VarName\n\n{- | Holds file positionng information for abstrations.\nA type synonym for @HashMap VarName NSourcePos@.\n-}\ntype PositionSet = AttrSet NSourcePos\n\n-- ** Additional N{,Source}Pos instances\n\n-- Placed here because TH inference depends on declaration sequence.\n\ninstance Serialise NPos where\n    encode = Serialise.encode . unPos . coerce\n    decode = coerce . mkPos <$> Serialise.decode\n\ninstance Serialise NSourcePos where\n    encode (NSourcePos f l c) =\n        coerce $\n            Serialise.encode f\n                <> Serialise.encode l\n                <> Serialise.encode c\n    decode =\n        liftA3\n            NSourcePos\n            Serialise.decode\n            Serialise.decode\n            Serialise.decode\n\ninstance Hashable NPos where\n    hashWithSalt salt = hashWithSalt salt . unPos . coerce\n\ninstance Hashable NSourcePos where\n    hashWithSalt salt (NSourcePos f l c) =\n        salt\n            `hashWithSalt` f\n            `hashWithSalt` l\n            `hashWithSalt` c\n\ninstance Binary NPos where\n    put = (Binary.put @Int) . unPos . coerce\n    get = coerce . mkPos <$> Binary.get\ninstance Binary NSourcePos\n\ninstance ToJSON NPos where\n    toJSON = toJSON . unPos . coerce\ninstance ToJSON NSourcePos\n\ninstance FromJSON NPos where\n    parseJSON = coerce . fmap mkPos . parseJSON\ninstance FromJSON NSourcePos\n\n-- * Components of Nix expressions\n\n-- NExpr is a composition of\n--   * direct reuse of the Haskell types (list, Path, Text)\n--   * NAtom\n--   * Types in this section\n--   * Fixpoint nature\n\n-- ** newtype VarName\n\nnewtype VarName = VarName Text\n    deriving\n        ( Eq\n        , Ord\n        , Generic\n        , Typeable\n        , Data\n        , NFData\n        , Serialise\n        , Binary\n        , ToJSON\n        , FromJSON\n        , Show\n        , Read\n        , Hashable\n        )\n\ninstance IsString VarName where\n    fromString = coerce . fromString @Text\n\ninstance ToString VarName where\n    toString = toString @Text . coerce\n\n-- ** data Params\n\n-- *** utils\n\n-- This uses an association list because nix XML serialization preserves the\n-- order of the param set.\ntype ParamSet r = [(VarName, Maybe r)]\n\ndata Variadic = Closed | Variadic\n    deriving\n        ( Eq\n        , Ord\n        , Generic\n        , Typeable\n        , Data\n        , NFData\n        , Serialise\n        , Binary\n        , ToJSON\n        , FromJSON\n        , Show\n        , Read\n        , Hashable\n        )\n\ninstance Semigroup Variadic where\n    (<>) Closed Closed = Closed\n    (<>) _ _ = Variadic\n\ninstance Monoid Variadic where\n    mempty = Closed\n\n-- *** data Params\n\n{- | @Params@ represents all the ways the formal parameters to a\nfunction can be represented.\n-}\ndata Params r\n    = -- | For functions with a single named argument, such as @x: x + 1@.\n      --\n      --       > Param \"x\"                                  ~  x\n      Param !VarName\n    | -- | Explicit parameters (argument must be a set). Might specify a name to\n      --       bind to the set in the function body. The bool indicates whether it is\n      --       variadic or not.\n      --\n      --       > ParamSet  Nothing   False [(\"x\",Nothing)]  ~  { x }\n      --       > ParamSet (pure \"s\") True  [(\"x\", pure y)]  ~  s@{ x ? y, ... }\n      ParamSet !(Maybe VarName) !Variadic !(ParamSet r)\n    deriving\n        ( Eq\n        , Ord\n        , Generic\n        , Generic1\n        , Typeable\n        , Data\n        , NFData\n        , NFData1\n        , Serialise\n        , Binary\n        , ToJSON\n        , ToJSON1\n        , FromJSON\n        , FromJSON1\n        , Functor\n        , Foldable\n        , Traversable\n        , Show\n        , Read\n        , Hashable\n        )\n\ninstance IsString (Params r) where\n    fromString = Param . fromString\n\n$(deriveShow1 ''Params)\n$(deriveRead1 ''Params)\n$(deriveEq1 ''Params)\n$(deriveOrd1 ''Params)\n\nderiving instance Hashable1 Params\n\n-- *** lens traversals\n\n$(makeTraversals ''Params)\n\n-- ** data Antiquoted\n\n{- | 'Antiquoted' represents an expression that is either\nantiquoted (surrounded by ${...}) or plain (not antiquoted).\n-}\ndata Antiquoted (v :: Type) (r :: Type)\n    = Plain !v\n    | -- | 'EscapedNewline' corresponds to the special newline form\n      --\n      --       > ''\\n\n      --\n      --       in an indented string. It is equivalent to a single newline character:\n      --\n      --       > ''''\\n''  ≡  \"\\n\"\n      EscapedNewline\n    | Antiquoted !r\n    deriving\n        ( Eq\n        , Ord\n        , Generic\n        , Generic1\n        , Typeable\n        , Data\n        , NFData\n        , NFData1\n        , Serialise\n        , Binary\n        , ToJSON\n        , ToJSON1\n        , FromJSON\n        , FromJSON1\n        , Functor\n        , Foldable\n        , Traversable\n        , Show\n        , Read\n        , Hashable\n        )\n\n$(deriveShow1 ''Antiquoted)\n$(deriveShow2 ''Antiquoted)\n$(deriveRead1 ''Antiquoted)\n$(deriveRead2 ''Antiquoted)\n$(deriveEq1 ''Antiquoted)\n$(deriveEq2 ''Antiquoted)\n$(deriveOrd1 ''Antiquoted)\n$(deriveOrd2 ''Antiquoted)\n$(deriveJSON2 defaultOptions ''Antiquoted)\n\ninstance Hashable2 Antiquoted where\n    liftHashWithSalt2 ha _ salt (Plain a) = ha (salt `hashWithSalt` (0 :: Int)) a\n    liftHashWithSalt2 _ _ salt EscapedNewline = salt `hashWithSalt` (1 :: Int)\n    liftHashWithSalt2 _ hb salt (Antiquoted b) = hb (salt `hashWithSalt` (2 :: Int)) b\n\nderiving instance (Hashable v) => Hashable1 (Antiquoted (v :: Type))\n\n-- *** lens traversals\n\n$(makeTraversals ''Antiquoted)\n\n-- ** data NString\n\n{- | An 'NString' is a list of things that are either a plain string\nor an antiquoted expression. After the antiquotes have been evaluated,\nthe final string is constructed by concatenating all the parts.\n-}\ndata NString r\n    = -- | Strings wrapped with double-quotes (__@\"@__) can contain literal newline\n      --       characters, but the newlines are preserved and no indentation is stripped.\n      --\n      --       > DoubleQuoted [Plain \"x\",Antiquoted y]   ~  \"x${y}\"\n      DoubleQuoted ![Antiquoted Text r]\n    | -- | Strings wrapped with two single quotes (__@''@__) can contain newlines, and\n      --       their indentation will be stripped, but the amount stripped is\n      --       remembered.\n      --\n      --       > Indented 1 [Plain \"x\"]                  ~  '' x''\n      --       >\n      --       > Indented 0 [EscapedNewline]             ~  ''''\\n''\n      --       >\n      --       > Indented 0 [Plain \"x\\n \",Antiquoted y]  ~  ''\n      --       >                                            x\n      --       >                                             ${y}''\n      Indented !Int ![Antiquoted Text r]\n    deriving\n        ( Eq\n        , Ord\n        , Generic\n        , Generic1\n        , Typeable\n        , Data\n        , NFData\n        , NFData1\n        , Serialise\n        , Binary\n        , ToJSON\n        , ToJSON1\n        , FromJSON\n        , FromJSON1\n        , Functor\n        , Foldable\n        , Traversable\n        , Show\n        , Read\n        , Hashable\n        )\n\n-- | For the the 'IsString' instance, we use a plain doublequoted string.\ninstance IsString (NString r) where\n    fromString \"\" = DoubleQuoted mempty\n    fromString string = DoubleQuoted $ one $ Plain $ fromString string\n\n$(deriveShow1 ''NString)\n$(deriveRead1 ''NString)\n$(deriveEq1 ''NString)\n$(deriveOrd1 ''NString)\n\nderiving instance Hashable1 NString\n\n-- *** lens traversals\n\n$(makeTraversals ''NString)\n\n-- ** data NKeyName\n\n{- | A 'KeyName' is something that can appear on the left side of an\nequals sign. For example, @a@ is a 'KeyName' in @{ a = 3; }@, @let a = 3;\nin ...@, @{}.a@ or @{} ? a@.\n\nNix supports both static keynames (just an identifier) and dynamic\nidentifiers. Dynamic identifiers can be either a string (e.g.:\n@{ \"a\" = 3; }@) or an antiquotation (e.g.: @let a = \"example\";\nin { ${a} = 3; }.example@).\n\nNote: There are some places where a dynamic keyname is not allowed.\nIn particular, those include:\n\n  * The RHS of a @binding@ inside @let@: @let ${\"a\"} = 3; in ...@\n    produces a syntax fail.\n  * The attribute names of an 'inherit': @inherit ${\"a\"};@ is forbidden.\n\nNote: In Nix, a simple string without antiquotes such as @\"foo\"@ is\nallowed even if the context requires a static keyname, but the\nparser still considers it a 'DynamicKey' for simplicity.\n-}\ndata NKeyName r\n    = -- |\n      --       > DynamicKey (Plain (DoubleQuoted [Plain \"x\"]))     ~  \"x\"\n      --       > DynamicKey (Antiquoted x)                         ~  ${x}\n      --       > DynamicKey (Plain (DoubleQuoted [Antiquoted x]))  ~  \"${x}\"\n      DynamicKey !(Antiquoted (NString r) r)\n    | -- |\n      --       > StaticKey \"x\"                                     ~  x\n      StaticKey !VarName\n    deriving\n        ( Eq\n        , Ord\n        , Generic\n        , Typeable\n        , Data\n        , NFData\n        , Serialise\n        , Binary\n        , ToJSON\n        , FromJSON\n        , Show\n        , Read\n        , Hashable\n        )\n\ninstance NFData1 NKeyName where\n    liftRnf _ (StaticKey !_) = mempty\n    liftRnf _ (DynamicKey (Plain !_)) = mempty\n    liftRnf _ (DynamicKey EscapedNewline) = mempty\n    liftRnf k (DynamicKey (Antiquoted r)) = k r\n\n-- | Most key names are just static text, so this instance is convenient.\ninstance IsString (NKeyName r) where\n    fromString = StaticKey . fromString\n\ninstance Eq1 NKeyName where\n    liftEq eq (DynamicKey a) (DynamicKey b) = liftEq2 (liftEq eq) eq a b\n    liftEq _ (StaticKey a) (StaticKey b) = a == b\n    liftEq _ _ _ = False\n\n-- | @since 0.10.1\ninstance Ord1 NKeyName where\n    liftCompare cmp (DynamicKey a) (DynamicKey b) = liftCompare2 (liftCompare cmp) cmp a b\n    liftCompare _ (DynamicKey _) (StaticKey _) = LT\n    liftCompare _ (StaticKey _) (DynamicKey _) = GT\n    liftCompare _ (StaticKey a) (StaticKey b) = compare a b\n\ninstance Hashable1 NKeyName where\n    liftHashWithSalt h salt (DynamicKey a) =\n        liftHashWithSalt2 (liftHashWithSalt h) h (salt `hashWithSalt` (0 :: Int)) a\n    liftHashWithSalt _ salt (StaticKey n) =\n        salt `hashWithSalt` (1 :: Int) `hashWithSalt` n\n\n-- Deriving this instance automatically is not possible because @r@\n-- occurs not only as last argument in @Antiquoted (NString r) r@\ninstance Show1 NKeyName where\n    liftShowsPrec sp sl p = \\case\n        DynamicKey a ->\n            showsUnaryWith\n                (liftShowsPrec2 (liftShowsPrec sp sl) (liftShowList sp sl) sp sl)\n                \"DynamicKey\"\n                p\n                a\n        StaticKey t -> showsUnaryWith Text.Show.showsPrec \"StaticKey\" p t\n\n-- Deriving this instance automatically is not possible because @r@\n-- occurs not only as last argument in @Antiquoted (NString r) r@\ninstance Functor NKeyName where\n    fmap = fmapDefault\n\n-- Deriving this instance automatically is not possible because @r@\n-- occurs not only as last argument in @Antiquoted (NString r) r@\ninstance Foldable NKeyName where\n    foldMap = foldMapDefault\n\n-- Deriving this instance automatically is not possible because @r@\n-- occurs not only as last argument in @Antiquoted (NString r) r@\ninstance Traversable NKeyName where\n    traverse f = \\case\n        DynamicKey (Plain str) -> DynamicKey . Plain <$> traverse f str\n        DynamicKey (Antiquoted e) -> DynamicKey . Antiquoted <$> f e\n        DynamicKey EscapedNewline -> pure $ DynamicKey EscapedNewline\n        StaticKey key -> pure $ StaticKey key\n\n-- *** lens traversals\n\n$(makeTraversals ''NKeyName)\n\n-- ** type NAttrPath\n\n{- | A selector (for example in a @let@ or an attribute set) is made up\nof strung-together key names.\n\n> StaticKey \"x\" :| [DynamicKey (Antiquoted y)]  ~  x.${y}\n-}\ntype NAttrPath r = NonEmpty (NKeyName r)\n\n-- ** data Binding\n\n#if !MIN_VERSION_hashable(1,3,1)\n-- Required by Hashable Binding deriving. There was none of this Hashable instance before mentioned version, remove this in year >2022\ninstance Hashable1 NonEmpty\n#endif\n\n-- | A single line of the bindings section of a let expression or of a set.\ndata Binding r\n    = -- | An explicit naming.\n      --\n      --       > NamedVar (StaticKey \"x\" :| [StaticKey \"y\"]) z NSourcePos{}  ~  x.y = z;\n      NamedVar !(NAttrPath r) !r !NSourcePos\n    | -- | Inheriting an attribute (binding) into the attribute set from the other scope (attribute set). No denoted scope means to inherit from the closest outside scope.\n      --\n      --       +----------------------------------------------------------------+--------------------+-----------------------+\n      --       | Hask                                                           | Nix                | pseudocode            |\n      --       +================================================================+====================+=======================+\n      --       | @Inherit Nothing  [StaticKey \"a\"] NSourcePos{}@                | @inherit a;@       | @a = outside.a;@      |\n      --       +----------------------------------------------------------------+--------------------+-----------------------+\n      --       | @Inherit (pure x) [StaticKey \"a\"] NSourcePos{}@                | @inherit (x) a;@   | @a = x.a;@            |\n      --       +----------------------------------------------------------------+--------------------+-----------------------+\n      --       | @Inherit (pure x) [StaticKey \"a\", StaticKey \"b\"] NSourcePos{}@ | @inherit (x) a b;@ | @a = x.a;@            |\n      --       |                                                                |                    | @b = x.b;@            |\n      --       +----------------------------------------------------------------+--------------------+-----------------------+\n      --\n      --       (2021-07-07 use details):\n      --       Inherits the position of the first name through @unsafeGetAttrPos@. The position of the scope inherited from else - the position of the first member of the binds list.\n      Inherit !(Maybe r) ![VarName] !NSourcePos\n    deriving\n        ( Eq\n        , Ord\n        , Generic\n        , Generic1\n        , Typeable\n        , Data\n        , NFData\n        , NFData1\n        , Serialise\n        , Binary\n        , ToJSON\n        , FromJSON\n        , Functor\n        , Foldable\n        , Traversable\n        , Show\n        , Hashable\n        )\n\n$(deriveShow1 ''Binding)\n$(deriveEq1 ''Binding)\n$(deriveOrd1 ''Binding)\n\n-- x $(deriveJSON1 defaultOptions ''Binding)\n\nderiving instance Hashable1 Binding\n\n-- *** lens traversals\n\n$(makeTraversals ''Binding)\n\n-- ** data Recursivity\n\n{- | Distinguishes between recursive and non-recursive. Mainly for attribute\nsets.\n-}\ndata Recursivity\n    = -- | >     { ... }\n      NonRecursive\n    | -- | > rec { ... }\n      Recursive\n    deriving\n        ( Eq\n        , Ord\n        , Enum\n        , Bounded\n        , Generic\n        , Typeable\n        , Data\n        , NFData\n        , Serialise\n        , Binary\n        , ToJSON\n        , FromJSON\n        , Show\n        , Read\n        , Hashable\n        )\n\ninstance Semigroup Recursivity where\n    (<>) NonRecursive NonRecursive = NonRecursive\n    (<>) _ _ = Recursive\n\ninstance Monoid Recursivity where\n    mempty = NonRecursive\n\n-- ** data NUnaryOp\n\n-- | There are two unary operations: logical not and integer negation.\ndata NUnaryOp\n    = -- | @-@\n      NNeg\n    | -- | @!@\n      NNot\n    deriving\n        ( Eq\n        , Ord\n        , Enum\n        , Bounded\n        , Generic\n        , Typeable\n        , Data\n        , NFData\n        , Serialise\n        , Binary\n        , ToJSON\n        , FromJSON\n        , Show\n        , Read\n        , Hashable\n        )\n\n-- *** lens traversals\n\n$(makeTraversals ''NUnaryOp)\n\n-- ** data NBinaryOp\n\n-- | Binary operators expressible in the nix language.\ndata NBinaryOp\n    = -- | Equality (@==@)\n      NEq\n    | -- | Inequality (@!=@)\n      NNEq\n    | -- | Less than (@<@)\n      NLt\n    | -- | Less than or equal (@<=@)\n      NLte\n    | -- | Greater than (@>@)\n      NGt\n    | -- | Greater than or equal (@>=@)\n      NGte\n    | -- | Logical and (@&&@)\n      NAnd\n    | -- | Logical or (@||@)\n      NOr\n    | -- | Logical implication (@->@)\n      NImpl\n    | -- | Get the left attr set, extend it with the right one & override equal keys (@//@)\n      NUpdate\n    | -- | Addition (@+@)\n      NPlus\n    | -- | Subtraction (@-@)\n      NMinus\n    | -- | Multiplication (@*@)\n      NMult\n    | -- | Division (@/@)\n      NDiv\n    | -- | List concatenation (@++@)\n      NConcat\n    deriving\n        ( Eq\n        , Ord\n        , Enum\n        , Bounded\n        , Generic\n        , Typeable\n        , Data\n        , NFData\n        , Serialise\n        , Binary\n        , ToJSON\n        , FromJSON\n        , Show\n        , Read\n        , Hashable\n        )\n\n-- *** lens traversals\n\n$(makeTraversals ''NBinaryOp)\n\n-- * data NExprF - Nix expressions, base functor\n\n{- | The main Nix expression type. As it is polimorphic, has a functor,\nwhich allows to traverse expressions and map functions over them.\nThe actual 'NExpr' type is a fixed point of this functor, defined\nbelow.\n-}\ndata NExprF r\n    = -- | Constants: ints, floats, bools, URIs, and null.\n      NConstant !NAtom\n    | -- | A string, with interpolated expressions.\n      NStr !(NString r)\n    | -- | A variable. For example, in the expression @f a@, @f@ is represented\n      --       as @NSym \"f\"@ and @a@ as @NSym \"a\"@.\n      --\n      --       > NSym \"x\"                                    ~  x\n      NSym !VarName\n    | -- | A list literal.\n      --\n      --       > NList [x,y]                                 ~  [ x y ]\n      NList ![r]\n    | -- | An attribute set literal\n      --\n      --       > NSet Recursive    [NamedVar x y _]         ~  rec { x = y; }\n      --       > NSet NonRecursive [Inherit Nothing [x] _]  ~  { inherit x; }\n      NSet !Recursivity ![Binding r]\n    | -- | A path expression, which is evaluated to a store path. The path here\n      --       can be relative, in which case it's evaluated relative to the file in\n      --       which it appears.\n      --\n      --       > NLiteralPath \"/x\"                           ~  /x\n      --       > NLiteralPath \"x/y\"                          ~  x/y\n      NLiteralPath !Path\n    | -- | A path which refers to something in the Nix search path (the NIX_PATH\n      --       environment variable. For example, @<nixpkgs/pkgs>@.\n      --\n      --       > NEnvPath \"x\"                                ~  <x>\n      NEnvPath !Path\n    | -- | Functional application (aka F.A., apply a function to an argument).\n      --\n      --       > NApp f x  ~  f x\n      NApp !r !r\n    | -- | Application of a unary operator to an expression.\n      --\n      --       > NUnary NNeg x                               ~  - x\n      --       > NUnary NNot x                               ~  ! x\n      NUnary !NUnaryOp !r\n    | -- | Application of a binary operator to two expressions.\n      --\n      --       > NBinary NPlus x y                           ~  x + y\n      --       > NBinary NApp  f x                           ~  f x\n      NBinary !NBinaryOp !r !r\n    | -- | Dot-reference into an attribute set, optionally providing an\n      --       alternative if the key doesn't exist.\n      --\n      --       > NSelect Nothing  s (x :| [])                ~  s.x\n      --       > NSelect (pure y) s (x :| [])                ~  s.x or y\n      NSelect !(Maybe r) !r !(NAttrPath r)\n    | -- | Ask if a set contains a given attribute path.\n      --\n      --       > NHasAttr s (x :| [])                        ~  s ? x\n      NHasAttr !r !(NAttrPath r)\n    | -- | A function literal (lambda abstraction).\n      --\n      --       > NAbs (Param \"x\") y                          ~  x: y\n      NAbs !(Params r) !r\n    | -- | Evaluate the second argument after introducing the bindings.\n      --\n      --       > NLet []                    x                ~  let in x\n      --       > NLet [NamedVar x y _]      z                ~  let x = y; in z\n      --       > NLet [Inherit Nothing x _] y                ~  let inherit x; in y\n      NLet ![Binding r] !r\n    | -- | If-then-else statement.\n      --\n      --       > NIf x y z                                   ~  if x then y else z\n      NIf !r !r !r\n    | -- | Evaluate an attribute set, bring its bindings into scope, and\n      --       evaluate the second argument.\n      --\n      --       > NWith x y                                   ~  with x; y\n      NWith !r !r\n    | -- | Checks that the first argument is a predicate that is @true@ before evaluating the second argument.\n      --\n      --       > NAssert x y                                 ~  assert x; y\n      NAssert !r !r\n    | -- | Syntactic hole.\n      --\n      --       See <https://github.com/haskell-nix/hnix/issues/197> for context.\n      --\n      --       > NSynHole \"x\"                                ~  ^x\n      NSynHole !VarName\n    deriving\n        ( Eq\n        , Ord\n        , Generic\n        , Generic1\n        , Typeable\n        , Data\n        , NFData\n        , NFData1\n        , Serialise\n        , Binary\n        , ToJSON\n        , FromJSON\n        , Functor\n        , Foldable\n        , Traversable\n        , Show\n        , Hashable\n        )\n\n$(deriveShow1 ''NExprF)\n$(deriveEq1 ''NExprF)\n$(deriveOrd1 ''NExprF)\n\n-- x $(deriveJSON1 defaultOptions ''NExprF)\n\nderiving instance Hashable1 NExprF\n\n-- ** lens traversals\n\n$(makeTraversals ''NExprF)\n\n-- ** type NExpr\n\n-- | The monomorphic expression type is a fixed point of the polymorphic one.\ntype NExpr = Fix NExprF\n\n{- | We make an `IsString` for expressions, where the string is interpreted\nas an identifier. This is the most common use-case...\n-}\ninstance IsString NExpr where\n    fromString = Fix . NSym . fromString\n\ninstance Serialise NExpr\n\n{- FOURMOLU_DISABLE -}\ninstance TH.Lift NExpr where\n  lift =\n    TH.dataToExpQ\n      (\\b ->\n        do\n          -- Binding on constructor ensures type match and gives type inference to TH.\n          -- Reflection is the ability of a process to examine, introspect, and modify its own structure and behavior.\n          -- Reflection is a key strategy in metaprogramming.\n          -- <https://en.wikipedia.org/wiki/Reflective_programming>\n          HRefl <-\n            Reflection.eqTypeRep\n              (Reflection.typeRep @Text)\n              (Reflection.typeOf b)\n          pure [| $(TH.lift b) |]\n      )\n#if MIN_VERSION_template_haskell(2,17,0)\n  liftTyped = TH.unsafeCodeCoerce . TH.lift\n#elif MIN_VERSION_template_haskell(2,16,0)\n  liftTyped = TH.unsafeTExpCoerce . TH.lift\n#endif\n{- FOURMOLU_ENABLE -}\n\n-- ** Methods\n\n#if __GLASGOW_HASKELL__ >= 900\nhashAt\n  :: Functor f\n  => VarName\n  -> (Maybe v -> f (Maybe v))\n  -> AttrSet v\n  -> f (AttrSet v)\n#else\nhashAt :: VarName -> Lens' (AttrSet v) (Maybe v)\n#endif\nhashAt = alterF\n  where\n    alterF ::\n        (Functor f) =>\n        VarName ->\n        (Maybe v -> f (Maybe v)) ->\n        AttrSet v ->\n        f (AttrSet v)\n    alterF (coerce -> k) f m =\n        maybe\n            (MapL.delete k m)\n            (\\v -> MapL.insert k v m)\n            <$> f (MapL.lookup k m)\n\n-- | Get the name out of the parameter (there might be none).\nparamName :: Params r -> Maybe VarName\nparamName (Param name) = pure name\nparamName (ParamSet mname _ _) = mname\n\nstringParts :: NString r -> [Antiquoted Text r]\nstringParts (DoubleQuoted parts) = parts\nstringParts (Indented _ parts) = parts\n\nstripPositionInfo :: NExpr -> NExpr\nstripPositionInfo = transport phi\n  where\n    transport f (Fix x) = Fix $ transport f <$> f x\n\n    phi (NSet recur binds) = NSet recur $ erasePositions <$> binds\n    phi (NLet binds body) = NLet (erasePositions <$> binds) body\n    phi x = x\n\n    erasePositions (NamedVar path r _pos) = NamedVar path r nullPos\n    erasePositions (Inherit ms names _pos) = Inherit ms names nullPos\n\nnullPos :: NSourcePos\nnullPos = on (NSourcePos \"<string>\") (coerce . mkPos) 1 1\n\n-- * Dead code\n\n-- ** class NExprAnn\n\nclass NExprAnn ann g | g -> ann where\n    fromNExpr :: g r -> (NExprF r, ann)\n    toNExpr :: (NExprF r, ann) -> g r\n\n-- ** Other\n\nekey ::\n    forall ann g.\n    (NExprAnn ann g) =>\n    NonEmpty VarName ->\n    NSourcePos ->\n    Lens' (Fix g) (Maybe (Fix g))\nekey keys pos f e@(Fix x)\n    | (NSet NonRecursive xs, ann) <- fromNExpr x =\n        let\n            vals :: [(Fix g, [VarName])]\n            vals =\n                do\n                    let keys' = NE.toList keys\n                    (ks, rest) <- zip (inits keys') (tails keys')\n                    handlePresence\n                        mempty\n                        ( \\(j : js) ->\n                            do\n                                NamedVar ns v _p <- xs\n                                guard $ (j : js) == (NE.toList ns ^.. traverse . _StaticKey)\n                                pure (v, rest)\n                        )\n                        ks\n         in\n            case vals of\n                ((v, []) : _) -> fromMaybe e <$> f (pure v)\n                ((v, r : rest) : _) -> ekey (r :| rest) pos f v\n                _ ->\n                    maybe\n                        e\n                        ( \\v ->\n                            let entry = NamedVar (StaticKey <$> keys) v pos\n                             in Fix $ toNExpr (NSet mempty $ one entry <> xs, ann)\n                        )\n                        <$> f Nothing\nekey _ _ f e = fromMaybe e <$> f Nothing\n\ngetFreeVars :: NExpr -> Set VarName\ngetFreeVars e =\n    case unFix e of\n        (NConstant _) -> mempty\n        (NStr string) -> mapFreeVars string\n        (NSym var) -> one var\n        (NList list) -> mapFreeVars list\n        (NSet NonRecursive bindings) -> bindFreeVars bindings\n        (NSet Recursive bindings) -> diffBetween bindFreeVars bindDefs bindings\n        (NLiteralPath _) -> mempty\n        (NEnvPath _) -> mempty\n        (NUnary _ expr) -> getFreeVars expr\n        (NApp left right) -> collectFreeVars left right\n        (NBinary _ left right) -> collectFreeVars left right\n        (NSelect orExpr expr path) ->\n            Set.unions\n                [ getFreeVars expr\n                , pathFree path\n                , getFreeVars `whenJust` orExpr\n                ]\n        (NHasAttr expr path) -> getFreeVars expr <> pathFree path\n        (NAbs (Param varname) expr) -> Set.delete varname (getFreeVars expr)\n        (NAbs (ParamSet varname _ pset) expr) ->\n            Set.difference\n                -- Include all free variables from the expression and the default arguments\n                (getFreeVars expr <> Set.unions (getFreeVars <$> mapMaybe snd pset))\n                -- But remove the argument name if existing, and all arguments in the parameter set\n                ((one `whenJust` varname) <> Set.fromList (fst <$> pset))\n        (NLet bindings expr) ->\n            Set.difference\n                (getFreeVars expr <> bindFreeVars bindings)\n                (bindDefs bindings)\n        (NIf cond th el) -> Set.unions $ getFreeVars <$> [cond, th, el]\n        -- Evaluation is needed to find out whether x is a \"real\" free variable in `with y; x`, we just include it\n        -- This also makes sense because its value can be overridden by `x: with y; x`\n        (NWith set expr) -> collectFreeVars set expr\n        (NAssert assertion expr) -> collectFreeVars assertion expr\n        (NSynHole _) -> mempty\n  where\n    diffBetween :: (a -> Set VarName) -> (a -> Set VarName) -> a -> Set VarName\n    diffBetween g f b = Set.difference (g b) (f b)\n\n    collectFreeVars :: NExpr -> NExpr -> Set VarName\n    collectFreeVars = (<>) `on` getFreeVars\n\n    bindDefs :: (Foldable t) => t (Binding NExpr) -> Set VarName\n    bindDefs = foldMap bind1Def\n      where\n        bind1Def :: Binding r -> Set VarName\n        bind1Def (Inherit Nothing _ _) = mempty\n        bind1Def (Inherit (Just _) keys _) = Set.fromList keys\n        bind1Def (NamedVar (StaticKey varname :| _) _ _) = one varname\n        bind1Def (NamedVar (DynamicKey _ :| _) _ _) = mempty\n\n    bindFreeVars :: (Foldable t) => t (Binding NExpr) -> Set VarName\n    bindFreeVars = foldMap bind1Free\n      where\n        bind1Free :: Binding NExpr -> Set VarName\n        bind1Free (Inherit Nothing keys _) = Set.fromList keys\n        bind1Free (Inherit (Just scope) _ _) = getFreeVars scope\n        bind1Free (NamedVar path expr _) = pathFree path <> getFreeVars expr\n\n    pathFree :: NAttrPath NExpr -> Set VarName\n    pathFree = foldMap mapFreeVars\n\n    mapFreeVars :: (Foldable t) => t NExpr -> Set VarName\n    mapFreeVars = foldMap getFreeVars\n"
  },
  {
    "path": "src/Nix/Expr.hs",
    "content": "-- | Wraps the expression submodules.\nmodule Nix.Expr (\n    module Nix.Expr.Types,\n    module Nix.Expr.Types.Annotated,\n    module Nix.Expr.Shorthands,\n)\nwhere\n\nimport Nix.Expr.Shorthands\nimport Nix.Expr.Types\nimport Nix.Expr.Types.Annotated\n"
  },
  {
    "path": "src/Nix/Frames.hs",
    "content": "{-# LANGUAGE ConstraintKinds #-}\n{-# LANGUAGE ExistentialQuantification #-}\n\n-- | Definitions of Frames. Frames are messages that gather and ship themself with a context related to the message. For example - the message about some exception would also gather, keep and bring with it the tracing information.\nmodule Nix.Frames (\n    NixLevel (..),\n    Frames,\n    askFrames,\n    Framed,\n    NixFrame (..),\n    NixException (..),\n    withFrame,\n    throwError,\n    module Data.Typeable,\n)\nwhere\n\nimport Control.Monad.Catch (MonadThrow (..))\nimport Data.Typeable hiding (typeOf)\nimport Nix.Prelude\nimport qualified Text.Show\n\ndata NixLevel = Fatal | Error | Warning | Info | Debug\n    deriving (Ord, Eq, Bounded, Enum, Show)\n\ndata NixFrame\n    = NixFrame\n    { frameLevel :: NixLevel\n    , frame :: SomeException\n    }\n\ninstance Show NixFrame where\n    show (NixFrame level f) =\n        \"Nix frame at level \" <> show level <> \": \" <> show f\n\ntype Frames = [NixFrame]\n\naskFrames :: forall e m. (MonadReader e m, Has e Frames) => m Frames\naskFrames = askLocal\n\ntype Framed e m = (MonadReader e m, Has e Frames, MonadThrow m)\n\nnewtype NixException = NixException Frames\n    deriving (Show)\n\ninstance Exception NixException\n\nwithFrame ::\n    forall s e m a. (Framed e m, Exception s) => NixLevel -> s -> m a -> m a\nwithFrame level f = local $ over hasLens (NixFrame level (toException f) :)\n\nthrowError ::\n    forall s e m a. (Framed e m, Exception s, MonadThrow m) => s -> m a\nthrowError err =\n    do\n        context <- askLocal\n        traceM \"Throwing fail...\"\n        throwM $ NixException $ NixFrame Error (toException err) : context\n"
  },
  {
    "path": "src/Nix/Fresh/Basic.hs",
    "content": "{-# LANGUAGE CPP #-}\n{-# OPTIONS_GHC -Wno-orphans #-}\n\nmodule Nix.Fresh.Basic where\n\n#if !MIN_VERSION_base(4,13,0)\nimport           Control.Monad.Fail ( MonadFail )\n#endif\nimport Nix.Effects\nimport Nix.Fresh\nimport Nix.Prelude\nimport Nix.Render\nimport Nix.Value\n\ntype StdIdT = FreshIdT Int\n\n-- NOTE: These would be removed by: https://github.com/haskell-nix/hnix/pull/804\ninstance (MonadFail m, MonadFile m) => MonadFile (StdIdT m)\ninstance (MonadIntrospect m) => MonadIntrospect (StdIdT m)\ninstance (MonadStore m) => MonadStore (StdIdT m)\ninstance (MonadPutStr m) => MonadPutStr (StdIdT m)\ninstance (MonadHttp m) => MonadHttp (StdIdT m)\ninstance (MonadEnv m) => MonadEnv (StdIdT m)\ninstance (MonadPaths m) => MonadPaths (StdIdT m)\ninstance (MonadInstantiate m) => MonadInstantiate (StdIdT m)\ninstance (MonadExec m) => MonadExec (StdIdT m)\n\ninstance\n    (MonadEffects t f m, MonadDataContext f m) =>\n    MonadEffects t f (StdIdT m)\n    where\n    toAbsolutePath :: Path -> StdIdT m Path\n    toAbsolutePath = lift . toAbsolutePath @t @f @m\n\n    findEnvPath :: String -> StdIdT m Path\n    findEnvPath = lift . findEnvPath @t @f @m\n\n    findPath :: [NValue t f (StdIdT m)] -> Path -> StdIdT m Path\n    findPath vs path =\n        do\n            i <- FreshIdT ask\n            lift $ findPath @t @f @m (unliftNValue (`runFreshIdT` i) <$> vs) path\n\n    importPath :: Path -> StdIdT m (NValue t f (StdIdT m))\n    importPath path =\n        do\n            i <- FreshIdT ask\n            lift $ liftNValue (`runFreshIdT` i) <$> (importPath @t @f @m $ path)\n\n    pathToDefaultNix :: Path -> StdIdT m Path\n    pathToDefaultNix = lift . pathToDefaultNix @t @f @m\n\n    derivationStrict :: NValue t f (StdIdT m) -> StdIdT m (NValue t f (StdIdT m))\n    derivationStrict v =\n        do\n            i <- FreshIdT ask\n            let\n                fresh :: FreshIdT Int m a -> m a\n                fresh = (`runFreshIdT` i)\n            lift $ liftNValue fresh <$> (derivationStrict @t @f @m . unliftNValue fresh $ v)\n\n    traceEffect :: String -> StdIdT m ()\n    traceEffect = lift . traceEffect @t @f @m\n"
  },
  {
    "path": "src/Nix/Fresh.hs",
    "content": "{-# LANGUAGE CPP #-}\n{-# LANGUAGE GeneralizedNewtypeDeriving #-}\n{-# LANGUAGE TypeFamilies #-}\n{-# LANGUAGE UndecidableInstances #-}\n{-# OPTIONS_GHC -Wno-orphans #-}\n\nmodule Nix.Fresh where\n\nimport Control.Monad.Base (MonadBase (..))\nimport Control.Monad.Catch (\n    MonadCatch,\n    MonadMask,\n    MonadThrow,\n )\nimport Control.Monad.Fix (MonadFix)\nimport Control.Monad.Ref (\n    MonadAtomicRef (..),\n    MonadRef (Ref),\n )\nimport Nix.Prelude\n\nimport Nix.Thunk\n\nnewtype FreshIdT i m a = FreshIdT (ReaderT (Ref m i) m a)\n    deriving\n        ( Functor\n        , Applicative\n        , Alternative\n        , Monad\n        , MonadFail\n        , MonadPlus\n        , MonadFix\n        , MonadRef\n        , MonadAtomicRef\n        , MonadIO\n        , MonadCatch\n        , MonadThrow\n        , MonadMask\n        )\n\ninstance MonadTrans (FreshIdT i) where\n    lift = FreshIdT . lift\n\ninstance (MonadBase b m) => MonadBase b (FreshIdT i m) where\n    liftBase = FreshIdT . liftBase\n\ninstance\n    ( MonadAtomicRef m\n    , Eq i\n    , Ord i\n    , Show i\n    , Enum i\n    , Typeable i\n    ) =>\n    MonadThunkId (FreshIdT i m)\n    where\n    type ThunkId (FreshIdT i m) = i\n    freshId = FreshIdT $ do\n        v <- ask\n        atomicModifyRef v (\\i -> (succ i, i))\n\nrunFreshIdT :: (Functor m) => FreshIdT i m a -> Ref m i -> m a\nrunFreshIdT = runReaderT . coerce\n"
  },
  {
    "path": "src/Nix/Json.hs",
    "content": "{-# LANGUAGE CPP #-}\n\nmodule Nix.Json where\n\nimport qualified Data.Aeson as A\nimport qualified Data.Aeson.Encoding as A\nimport qualified Data.HashMap.Strict as HM\nimport qualified Data.Vector as V\nimport Nix.Prelude\n{- FOURMOLU_DISABLE -}\n#if MIN_VERSION_aeson(2,0,0)\nimport qualified Data.Aeson.Key                as AKM\nimport qualified Data.Aeson.KeyMap             as AKM\n#endif\n{- FOURMOLU_ENABLE -}\nimport Nix.Atoms\nimport Nix.Effects\nimport Nix.Exec\nimport Nix.Expr.Types\nimport Nix.Frames\nimport Nix.String\nimport Nix.Value\nimport Nix.Value.Monad\n\n{- FOURMOLU_DISABLE -}\n-- This was moved from Utils.\ntoEncodingSorted :: A.Value -> A.Encoding\ntoEncodingSorted = \\case\n  A.Object m ->\n    A.pairs\n      . foldMap\n      (\\(k, v) -> A.pair k $ toEncodingSorted v)\n      . sortWith fst $\n#if MIN_VERSION_aeson(2,0,0)\n          AKM.toList\n#else\n          HM.toList\n#endif\n            m\n  A.Array l -> A.list toEncodingSorted $ V.toList l\n  v         -> A.toEncoding v\n{- FOURMOLU_ENABLE -}\n\ntoJSONNixString :: (MonadNix e t f m) => NValue t f m -> m NixString\ntoJSONNixString =\n    runWithStringContextT\n        . fmap\n            ( decodeUtf8\n                -- This is completely not optimal, but seems we do not have better encoding analog (except for @unsafe*@), Aeson gatekeeps through this.\n                . A.encodingToLazyByteString\n                . toEncodingSorted\n            )\n        . toJSON\n\n{- FOURMOLU_DISABLE -}\ntoJSON :: MonadNix e t f m => NValue t f m -> WithStringContextT m A.Value\ntoJSON = \\case\n  NVConstant (NInt   n) -> pure $ A.toJSON n\n  NVConstant (NFloat n) -> pure $ A.toJSON n\n  NVConstant (NBool  b) -> pure $ A.toJSON b\n  NVConstant NNull      -> pure   A.Null\n  NVStr      ns         -> A.toJSON <$> extractNixString ns\n  NVList l -> A.Array . V.fromList <$> traverse intoJson l\n  NVSet _ m ->\n    maybe\n      (A.Object <$> traverse intoJson kmap)\n      intoJson\n      (lkup \"outPath\" kmap)\n   where\n#if MIN_VERSION_aeson(2,0,0)\n    lkup = AKM.lookup\n    kmap = AKM.fromHashMap $ HM.mapKeys (AKM.fromText . coerce) m\n#else\n    lkup = HM.lookup\n    kmap = HM.mapKeys (coerce @VarName @Text) m\n#endif\n  NVPath p ->\n    do\n      fp <- lift $ coerce <$> addPath p\n      addSingletonStringContext $ StringContext DirectPath $ fromString fp\n      pure $ A.toJSON fp\n  v -> lift $ throwError $ CoercionToJson v\n\n where\n  intoJson :: MonadNix e t f m => NValue t f m -> WithStringContextT m A.Value\n  intoJson nv = join $ lift $ toJSON <$> demand nv\n{- FOURMOLU_ENABLE -}\n"
  },
  {
    "path": "src/Nix/Lint.hs",
    "content": "{-# LANGUAGE CPP #-}\n{-# LANGUAGE ConstraintKinds #-}\n{-# LANGUAGE DataKinds #-}\n{-# LANGUAGE GeneralizedNewtypeDeriving #-}\n{-# LANGUAGE TypeFamilies #-}\n{-# LANGUAGE UndecidableInstances #-}\n{-# OPTIONS_GHC -Wno-missing-methods #-}\n{-# OPTIONS_GHC -fno-warn-name-shadowing #-}\n\nmodule Nix.Lint where\n\nimport Control.Exception (throw)\nimport Control.Monad (foldM)\nimport Control.Monad.Catch\nimport Control.Monad.Fix\nimport Control.Monad.Ref\nimport Control.Monad.ST\nimport qualified Data.HashMap.Lazy as M\nimport GHC.Exception (ErrorCall (ErrorCall))\nimport Nix.Prelude\n\n-- Plese, use NonEmpty\nimport Data.List (intersect)\nimport qualified Data.List.NonEmpty as NE\nimport qualified Data.Text as Text\nimport Nix.Atoms\nimport Nix.Context\nimport Nix.Convert\nimport Nix.Eval (MonadEval (..))\nimport qualified Nix.Eval as Eval\nimport Nix.Expr.Types\nimport Nix.Expr.Types.Annotated\nimport Nix.Frames\nimport Nix.Fresh\nimport Nix.Options\nimport Nix.Scope\nimport Nix.String\nimport Nix.Thunk\nimport Nix.Thunk.Basic\nimport Nix.Value.Monad\nimport qualified Text.Show\n\ndata TAtom\n    = TInt\n    | TFloat\n    | TBool\n    | TNull\n    deriving (Show, Eq, Ord)\n\ndata NTypeF (m :: Type -> Type) r\n    = TConstant [TAtom]\n    | TStr\n    | TList r\n    | TSet (Maybe (AttrSet r))\n    | TClosure (Params ())\n    | TPath\n    | TBuiltin Text (Symbolic m -> m r)\n    deriving (Functor)\n\ncompareTypes :: NTypeF m r -> NTypeF m r -> Ordering\ncompareTypes (TConstant _) (TConstant _) = EQ\ncompareTypes (TConstant _) _ = LT\ncompareTypes _ (TConstant _) = GT\ncompareTypes TStr TStr = EQ\ncompareTypes TStr _ = LT\ncompareTypes _ TStr = GT\ncompareTypes (TList _) (TList _) = EQ\ncompareTypes (TList _) _ = LT\ncompareTypes _ (TList _) = GT\ncompareTypes (TSet _) (TSet _) = EQ\ncompareTypes (TSet _) _ = LT\ncompareTypes _ (TSet _) = GT\ncompareTypes TClosure{} TClosure{} = EQ\ncompareTypes TClosure{} _ = LT\ncompareTypes _ TClosure{} = GT\ncompareTypes TPath TPath = EQ\ncompareTypes TPath _ = LT\ncompareTypes _ TPath = GT\ncompareTypes (TBuiltin _ _) (TBuiltin _ _) = EQ\n\ndata NSymbolicF r\n    = NAny\n    | NMany [r]\n    deriving (Show, Eq, Ord, Functor, Foldable, Traversable)\n\ntype SThunk (m :: Type -> Type) = NThunkF m (Symbolic m)\n\ntype SValue (m :: Type -> Type) = Ref m (NSymbolicF (NTypeF m (Symbolic m)))\n\ndata Symbolic m = SV {getSV :: SValue m} | ST {getST :: SThunk m}\n\ninstance Show (Symbolic m) where\n    show _ = \"<symbolic>\"\n\neveryPossible ::\n    (MonadAtomicRef m) =>\n    m (Symbolic m)\neveryPossible = packSymbolic NAny\n\nmkSymbolic ::\n    (MonadAtomicRef m) =>\n    [NTypeF m (Symbolic m)] ->\n    m (Symbolic m)\nmkSymbolic = packSymbolic . NMany\n\nmkSymbolic1 ::\n    (MonadAtomicRef m) =>\n    NTypeF m (Symbolic m) ->\n    m (Symbolic m)\nmkSymbolic1 = mkSymbolic . one\n\npackSymbolic ::\n    (MonadAtomicRef m) =>\n    NSymbolicF (NTypeF m (Symbolic m)) ->\n    m (Symbolic m)\npackSymbolic = fmap SV . newRef\n\nunpackSymbolic ::\n    (MonadAtomicRef m, MonadThunkId m, MonadCatch m) =>\n    Symbolic m ->\n    m (NSymbolicF (NTypeF m (Symbolic m)))\nunpackSymbolic = readRef . getSV <=< demand\n\ntype MonadLint e m =\n    ( Scoped (Symbolic m) m\n    , Framed e m\n    , MonadAtomicRef m\n    , MonadCatch m\n    , MonadThunkId m\n    )\n\nsymerr :: forall e m a. (MonadLint e m) => Text -> m a\nsymerr = evalError @(Symbolic m) . ErrorCall . toString\n\nrenderSymbolic :: (MonadLint e m) => Symbolic m -> m Text\nrenderSymbolic =\n    ( \\case\n        NAny -> pure \"<any>\"\n        NMany xs ->\n            Text.intercalate \", \"\n                <$> traverse\n                    ( \\case\n                        TConstant ys ->\n                            pure $\n                                Text.intercalate\n                                    \", \"\n                                    ( fmap\n                                        ( \\case\n                                            TInt -> \"int\"\n                                            TFloat -> \"float\"\n                                            TBool -> \"bool\"\n                                            TNull -> \"null\"\n                                        )\n                                        ys\n                                    )\n                        TStr -> pure \"string\"\n                        TList r ->\n                            fmap brackets $ renderSymbolic =<< demand r\n                        TSet Nothing -> pure \"<any set>\"\n                        TSet (Just s) ->\n                            braces . show <$> traverse (renderSymbolic <=< demand) s\n                        f@(TClosure p) ->\n                            do\n                                (args, sym) <-\n                                    do\n                                        f' <- mkSymbolic1 f\n                                        lintApp (NAbs p mempty) f' everyPossible\n                                args' <- traverse renderSymbolic args\n                                sym' <- renderSymbolic sym\n                                pure $ parens $ show args' <> \" -> \" <> sym'\n                        TPath -> pure \"path\"\n                        TBuiltin _n _f -> pure \"<builtin function>\"\n                    )\n                    xs\n    )\n        <=< unpackSymbolic\n  where\n    between a b c = a <> b <> c\n    parens = between \"(\" \")\"\n    brackets = between \"[\" \"]\"\n    braces = between \"{\" \"}\"\n\n-- This function is order and uniqueness preserving (of types).\nmerge ::\n    forall e m.\n    (MonadLint e m) =>\n    NExprF () ->\n    [NTypeF m (Symbolic m)] ->\n    [NTypeF m (Symbolic m)] ->\n    m [NTypeF m (Symbolic m)]\nmerge context = go\n  where\n    go ::\n        [NTypeF m (Symbolic m)] ->\n        [NTypeF m (Symbolic m)] ->\n        m [NTypeF m (Symbolic m)]\n    go [] _ = stub\n    go _ [] = stub\n    go xxs@(x : xs) yys@(y : ys) = case (x, y) of\n        (TStr, TStr) -> (one TStr <>) <$> rest\n        (TPath, TPath) -> (one TPath <>) <$> rest\n        (TConstant ls, TConstant rs) ->\n            (one (TConstant (ls `intersect` rs)) <>) <$> rest\n        (TList l, TList r) ->\n            do\n                l' <- demand l\n                r' <- demand r\n                m <- defer $ unify context l' r'\n                (one (TList m) <>) <$> rest\n        (TSet x, TSet Nothing) -> (one (TSet x) <>) <$> rest\n        (TSet Nothing, TSet x) -> (one (TSet x) <>) <$> rest\n        (TSet (Just l), TSet (Just r)) -> do\n            hm <-\n                sequenceA $\n                    M.intersectionWith\n                        ( \\i j ->\n                            do\n                                i'' <- i\n                                j'' <- j\n                                defer $ unify context i'' j''\n                        )\n                        (fmap demand l)\n                        (fmap demand r)\n            handlePresence\n                id\n                (const ((one (TSet $ pure hm) <>) <$>))\n                hm\n                rest\n        (TClosure{}, TClosure{}) ->\n            throwError $ ErrorCall \"Cannot unify functions\"\n        (TBuiltin _ _, TBuiltin _ _) ->\n            throwError $ ErrorCall \"Cannot unify builtin functions\"\n        _\n            | compareTypes x y == LT -> go xs yys\n            | compareTypes x y == GT -> go xxs ys\n            | otherwise -> error \"impossible\"\n      where\n        rest :: m [NTypeF m (Symbolic m)]\n        rest = go xs ys\n\n{-\n    mergeFunctions pl nl fl pr fr xs ys = do\n        m <- sequenceA $ M.intersectionWith\n            (\\i j -> i >>= \\i' -> j >>= \\j' -> case (i', j') of\n                    (Nothing, Nothing) -> stub\n                    (_, Nothing) -> stub\n                    (Nothing, _) -> stub\n                    (Just i'', Just j'') ->\n                        pure . pure <$> unify context i'' j'')\n            (pure <$> pl) (pure <$> pr)\n        let Just m' = sequenceA $ M.filter isJust m\n        if M.null m'\n            then go xs ys\n            else do\n                g <- unify context fl fr\n                (TClosure (ParamSet m' False nl) g :)\n                    <$> go xs ys\n-}\n\n-- | Result @== NMany []@ -> @unify@ fails.\nunify ::\n    forall e m a.\n    (MonadLint e m) =>\n    NExprF a ->\n    Symbolic m ->\n    Symbolic m ->\n    m (Symbolic m)\nunify (void -> context) (SV x) (SV y) = do\n    x' <- readRef x\n    y' <- readRef y\n    case (x', y') of\n        (NAny, _) ->\n            do\n                writeRef x y'\n                pure $ SV y\n        (_, NAny) ->\n            do\n                writeRef y x'\n                pure $ SV x\n        (NMany xs, NMany ys) ->\n            handlePresence\n                ( -- x' <- renderSymbolic (Symbolic x)\n                  -- y' <- renderSymbolic (Symbolic y)\n                  throwError $ ErrorCall \"Cannot unify \"\n                  -- <> show x' <> \" with \" <> show y'\n                  --  <> \" in context: \" <> show context\n                )\n                ( \\m ->\n                    do\n                        let\n                            nm = NMany m\n                        writeRef x nm\n                        writeRef y nm\n                        packSymbolic nm\n                )\n                =<< merge context xs ys\nunify _ _ _ = error \"The unexpected hath transpired!\"\n\n-- These aren't worth defining yet, because once we move to Hindley-Milner,\n-- we're not going to be managing Symbolic values this way anymore.\n\ninstance ToValue Bool m (Symbolic m)\n\ninstance ToValue [Symbolic m] m (Symbolic m)\n\ninstance FromValue NixString m (Symbolic m)\n\ninstance FromValue (AttrSet (Symbolic m), PositionSet) m (Symbolic m)\n\ninstance ToValue (AttrSet (Symbolic m), PositionSet) m (Symbolic m)\n\ninstance\n    (MonadThunkId m, MonadAtomicRef m, MonadCatch m) =>\n    MonadValue (Symbolic m) m\n    where\n    defer :: m (Symbolic m) -> m (Symbolic m)\n    defer = fmap ST . thunk\n\n    demand :: Symbolic m -> m (Symbolic m)\n    demand (ST v) = demand =<< force v\n    demand (SV v) = pure (SV v)\n\ninstance\n    (MonadThunkId m, MonadAtomicRef m, MonadCatch m) =>\n    MonadValueF (Symbolic m) m\n    where\n    demandF :: (Symbolic m -> m r) -> Symbolic m -> m r\n    demandF f (ST v) = demandF f =<< force v\n    demandF f (SV v) = f (SV v)\n\ninstance (MonadLint e m) => MonadEval (Symbolic m) m where\n    freeVariable var = symerr $ \"Undefined variable '\" <> coerce var <> \"'\"\n\n    attrMissing ks ms =\n        evalError @(Symbolic m) . ErrorCall . toString $\n            maybe\n                (\"Inheriting unknown attribute: \" <> attr)\n                (\\s -> \"Could not look up attribute \" <> attr <> \" in \" <> show s)\n                ms\n      where\n        attr = Text.intercalate \".\" $ NE.toList $ coerce ks\n\n    evalCurPos =\n        do\n            f <- mkSymbolic1 TPath\n            l <- mkSymbolic1 $ TConstant $ one TInt\n            c <- mkSymbolic1 $ TConstant $ one TInt\n            mkSymbolic1 $ TSet . pure $ M.fromList [(\"file\", f), (\"line\", l), (\"col\", c)]\n\n    evalConstant c = mkSymbolic1 $ fun c\n      where\n        fun =\n            \\case\n                NURI _ -> TStr\n                NInt _ -> TConstant $ one TInt\n                NFloat _ -> TConstant $ one TFloat\n                NBool _ -> TConstant $ one TBool\n                NNull -> TConstant $ one TNull\n\n    evalString = const $ mkSymbolic1 TStr\n    evalLiteralPath = const $ mkSymbolic1 TPath\n    evalEnvPath = const $ mkSymbolic1 TPath\n\n    evalUnary op arg =\n        unify (NUnary op arg) arg =<< mkSymbolic1 (TConstant [TInt, TBool])\n\n    evalBinary = lintBinaryOp\n\n    -- The scope is deliberately wrapped in a thunk here, since it is evaluated\n    -- each time a name is looked up within the weak scope, and we want to be\n    -- sure the action it evaluates is to force a thunk, so its value is only\n    -- computed once.\n    evalWith scope body =\n        do\n            s <- unpackSymbolic =<< demand =<< defer scope\n\n            pushWeakScope\n                ( case s of\n                    NMany [TSet (Just (coerce -> scope))] -> pure scope\n                    NMany [TSet Nothing] -> error \"NYI: with unknown\"\n                    _ -> throwError $ ErrorCall \"scope must be a set in with statement\"\n                )\n                body\n\n    evalIf cond t f =\n        do\n            t' <- t\n            f' <- f\n            let e = unify (NIf cond t' f')\n            e t' f' <* (e cond =<< mkSymbolic1 (TConstant $ one TBool))\n\n    evalAssert cond body =\n        do\n            body' <- body\n            body' <$ (unify (NAssert cond body') cond =<< mkSymbolic1 (TConstant $ one TBool))\n\n    evalApp = (fmap snd .) . lintApp (join NApp mempty)\n    evalAbs params _ = mkSymbolic1 (TClosure $ void params)\n\n    evalError = throwError\n\n{- FOURMOLU_DISABLE -}\nlintBinaryOp\n  :: forall e m\n   . (MonadLint e m, MonadEval (Symbolic m) m)\n  => NBinaryOp\n  -> Symbolic m\n  -> m (Symbolic m)\n  -> m (Symbolic m)\nlintBinaryOp op lsym rarg =\n  do\n    rsym <- rarg\n    y    <- defer everyPossible\n\n    check lsym rsym $\n      case op of\n        NEq     -> [TConstant [TInt, TBool, TNull], TStr, TList y]\n        NNEq    -> [TConstant [TInt, TBool, TNull], TStr, TList y]\n\n        NLt     -> one $ TConstant [TInt, TBool, TNull]\n        NLte    -> one $ TConstant [TInt, TBool, TNull]\n        NGt     -> one $ TConstant [TInt, TBool, TNull]\n        NGte    -> one $ TConstant [TInt, TBool, TNull]\n\n        NAnd    -> one $ TConstant $ one TBool\n        NOr     -> one $ TConstant $ one TBool\n        NImpl   -> one $ TConstant $ one TBool\n\n        -- jww (2018-04-01): NYI: Allow Path + Str\n        NPlus   -> [TConstant $ one TInt, TStr, TPath]\n        NMinus  -> one $ TConstant $ one TInt\n        NMult   -> one $ TConstant $ one TInt\n        NDiv    -> one $ TConstant $ one TInt\n\n        NUpdate -> one $ TSet mempty\n\n        NConcat -> one $ TList y\n#if __GLASGOW_HASKELL__ < 810\n        _ -> fail \"Should not be possible\"  -- symerr or this fun signature should be changed to work in type scope\n#endif\n\n\n\n where\n  check lsym rsym xs =\n    do\n      let\n        contextUnify = unify $ NBinary op lsym rsym\n\n      m <- mkSymbolic xs\n      _ <- contextUnify lsym m\n      _ <- contextUnify rsym m\n      contextUnify lsym rsym\n{- FOURMOLU_ENABLE -}\n\ninfixl 1 `lintApp`\nlintApp ::\n    forall e m.\n    (MonadLint e m) =>\n    NExprF () ->\n    Symbolic m ->\n    m (Symbolic m) ->\n    m (HashMap VarName (Symbolic m), Symbolic m)\nlintApp context fun arg =\n    ( \\case\n        NAny ->\n            throwError $ ErrorCall \"Cannot apply something not known to be a function\"\n        NMany xs ->\n            do\n                (args, ys) <-\n                    unzip\n                        <$> traverse\n                            ( \\case\n                                TClosure _params ->\n                                    ( \\case\n                                        NAny -> error \"NYI\"\n                                        NMany [TSet (Just _)] -> error \"NYI\"\n                                        NMany _ -> throwError $ ErrorCall \"NYI: lintApp NMany not set\"\n                                    )\n                                        =<< unpackSymbolic\n                                        =<< arg\n                                TBuiltin _ _f -> throwError $ ErrorCall \"NYI: lintApp builtin\"\n                                TSet _m -> throwError $ ErrorCall \"NYI: lintApp Set\"\n                                _x -> throwError $ ErrorCall \"Attempt to call non-function\"\n                            )\n                            xs\n\n                y <- everyPossible\n                let firstArg = case args of\n                        (a : _) -> a\n                        [] -> error \"lintApp: impossible - traverse over non-empty list produced empty result\"\n                (firstArg,) <$> foldM (unify context) y ys\n    )\n        =<< unpackSymbolic fun\n\nnewtype Lint s a = Lint\n    {runLint :: ReaderT (Context (Lint s) (Symbolic (Lint s))) (FreshIdT Int (ST s)) a}\n    deriving\n        ( Functor\n        , Applicative\n        , Monad\n        , MonadFix\n        , MonadReader (Context (Lint s) (Symbolic (Lint s)))\n        , MonadThunkId\n        , MonadRef\n        , MonadAtomicRef\n        )\n\ninstance MonadThrow (Lint s) where\n    throwM :: forall e a. (Exception e) => e -> Lint s a\n    throwM e = Lint $ ReaderT $ const (throw e)\n\ninstance MonadCatch (Lint s) where\n    catch _m _h = Lint $ ReaderT $ const (error \"Cannot catch in 'Lint s'\")\n\nrunLintM :: Options -> Lint s a -> ST s a\nrunLintM opts action =\n    runFreshIdT ((`runReaderT` newContext opts) $ runLint action) =<< newRef (1 :: Int)\n\nsymbolicBaseEnv ::\n    (Monad m) =>\n    m (Scopes m (Symbolic m))\nsymbolicBaseEnv = stub\n\nlint :: Options -> NExprLoc -> ST s (Symbolic (Lint s))\nlint opts expr =\n    runLintM opts $\n        do\n            basis <- symbolicBaseEnv\n\n            pushScopes\n                basis\n                ( adi\n                    Eval.addSourcePositions\n                    Eval.evalContent\n                    expr\n                )\n\ninstance Scoped (Symbolic (Lint s)) (Lint s) where\n    askScopes = askScopesReader\n    clearScopes = clearScopesReader @(Lint s) @(Symbolic (Lint s))\n    pushScopes = pushScopesReader\n    lookupVar = lookupVarReader\n"
  },
  {
    "path": "src/Nix/Normal.hs",
    "content": "{-# LANGUAGE AllowAmbiguousTypes #-}\n{-# LANGUAGE ConstraintKinds #-}\n{-# LANGUAGE DataKinds #-}\n{-# LANGUAGE RankNTypes #-}\n{-# LANGUAGE TypeFamilies #-}\n\n{- | Code for normalization (reduction into a normal form) of Nix expressions.\nNix language allows recursion, so some expressions do not converge.\nAnd so do not converge into a normal form.\n-}\nmodule Nix.Normal where\n\nimport Control.Monad.Free (Free (..))\nimport Data.Set (\n    insert,\n    member,\n )\nimport Nix.Cited\nimport Nix.Frames\nimport Nix.Prelude\nimport Nix.Thunk\nimport Nix.Value\n\nnewtype NormalLoop t f m = NormalLoop (NValue t f m)\n    deriving (Show)\n\ninstance (MonadDataErrorContext t f m) => Exception (NormalLoop t f m)\n\n-- | Normalize the value as much as possible, leaving only detected cycles.\nnormalizeValue ::\n    forall e t m f.\n    ( Framed e m\n    , MonadThunk t m (NValue t f m)\n    , MonadDataErrorContext t f m\n    , Ord (ThunkId m)\n    ) =>\n    NValue t f m ->\n    m (NValue t f m)\nnormalizeValue v = run $ iterNValueM run go (fmap Free . sequenceNValue' run) v\n  where\n    start = 0 :: Int\n    maxDepth = 2000\n    table = mempty\n\n    run :: ReaderT Int (StateT (Set (ThunkId m)) m) r -> m r\n    run = (`evalStateT` table) . (`runReaderT` start)\n\n    go ::\n        ( NValue t f m ->\n          ReaderT Int (StateT (Set (ThunkId m)) m) (NValue t f m)\n        ) ->\n        t ->\n        ReaderT Int (StateT (Set (ThunkId m)) m) (NValue t f m)\n    go k tnk =\n        bool\n            ( do\n                i <- ask\n                when (i > maxDepth) $ fail $ \"Exceeded maximum normalization depth of \" <> show maxDepth <> \" levels.\"\n                (lifted . lifted)\n                    (=<< force tnk)\n                    (local (+ 1) . k)\n            )\n            (pure $ pure tnk)\n            =<< seen tnk\n      where\n        seen :: t -> ReaderT Int (StateT (Set (ThunkId m)) m) Bool\n        seen t =\n            do\n                let tnkid = thunkId t\n                lift $\n                    do\n                        thunkWasVisited <- gets $ member tnkid\n                        when (not thunkWasVisited) $ modify $ insert tnkid\n                        pure thunkWasVisited\n\n-- 2021-05-09: NOTE: This seems a bit excessive. If these functorial versions are not used for recursion schemes - just free from it.\n\n-- | Normalization HOF (functorial) version of @normalizeValue@. Accepts the special thunk operating/forcing/nirmalizing function & internalizes it.\nnormalizeValueF ::\n    forall e t m f.\n    ( Framed e m\n    , MonadThunk t m (NValue t f m)\n    , MonadDataErrorContext t f m\n    , Ord (ThunkId m)\n    ) =>\n    (forall r. t -> (NValue t f m -> m r) -> m r) ->\n    NValue t f m ->\n    m (NValue t f m)\nnormalizeValueF f = run . iterNValueM run go (fmap Free . sequenceNValue' run)\n  where\n    start = 0 :: Int\n    maxDepth = 2000\n    table = mempty\n\n    run :: ReaderT Int (StateT (Set (ThunkId m)) m) r -> m r\n    run = (`evalStateT` table) . (`runReaderT` start)\n\n    go ::\n        ( NValue t f m ->\n          ReaderT Int (StateT (Set (ThunkId m)) m) (NValue t f m)\n        ) ->\n        t ->\n        ReaderT Int (StateT (Set (ThunkId m)) m) (NValue t f m)\n    go k tnk =\n        bool\n            ( do\n                i <- ask\n                when (i > maxDepth) $ fail $ \"Exceeded maximum normalization depth of \" <> show maxDepth <> \" levels.\"\n                (lifted . lifted)\n                    (f tnk)\n                    (local (+ 1) . k)\n            )\n            (pure $ pure tnk)\n            =<< seen tnk\n      where\n        seen :: t -> ReaderT Int (StateT (Set (ThunkId m)) m) Bool\n        seen t =\n            do\n                let tnkid = thunkId t\n                lift $\n                    do\n                        thunkWasVisited <- gets $ member tnkid\n                        when (not thunkWasVisited) $ modify $ insert tnkid\n                        pure thunkWasVisited\n\n{- | Normalize value.\nDetect cycles.\nIf cycles were detected - put a stub on them.\n-}\nnormalForm ::\n    ( Framed e m\n    , MonadThunk t m (NValue t f m)\n    , MonadDataErrorContext t f m\n    , HasCitations m (NValue t f m) t\n    , HasCitations1 m (NValue t f m) f\n    , Ord (ThunkId m)\n    ) =>\n    NValue t f m ->\n    m (NValue t f m)\nnormalForm t = stubCycles <$> normalizeValue t\n\n-- | Monadic context of the result.\nnormalForm_ ::\n    ( Framed e m\n    , MonadThunk t m (NValue t f m)\n    , MonadDataErrorContext t f m\n    , Ord (ThunkId m)\n    ) =>\n    NValue t f m ->\n    m ()\nnormalForm_ t = void $ normalizeValue t\n\nopaqueVal :: (NVConstraint f) => NValue t f m\nopaqueVal = mkNVStrWithoutContext \"<cycle>\"\n\n-- | Detect cycles & stub them.\nstubCycles ::\n    forall t f m.\n    ( MonadDataContext f m\n    , HasCitations m (NValue t f m) t\n    , HasCitations1 m (NValue t f m) f\n    ) =>\n    NValue t f m ->\n    NValue t f m\nstubCycles =\n    iterNValue\n        ( \\_ t ->\n            Free $\n                NValue' $\n                    foldl'\n                        (flip $ addProvenance1 @m @(NValue t f m))\n                        cyc\n                        (citations @m @(NValue t f m) t)\n        )\n        Free\n  where\n    Free (NValue' cyc) = opaqueVal\n\nthunkStubVal :: (NVConstraint f) => NValue t f m\nthunkStubVal = mkNVStrWithoutContext thunkStubText\n\n{- | Check if thunk @t@ is computed,\nthen bind it into first arg.\nelse bind the thunk stub val.\n-}\nbindComputedThunkOrStub ::\n    ( NVConstraint f\n    , MonadThunk t m (NValue t f m)\n    ) =>\n    (NValue t f m -> m a) ->\n    t ->\n    m a\nbindComputedThunkOrStub = (<=< query (pure thunkStubVal))\n\nremoveEffects ::\n    (MonadThunk t m (NValue t f m), MonadDataContext f m) =>\n    NValue t f m ->\n    m (NValue t f m)\nremoveEffects =\n    iterNValueM\n        id\n        bindComputedThunkOrStub\n        (fmap Free . sequenceNValue' id)\n\ndethunk ::\n    (MonadThunk t m (NValue t f m), MonadDataContext f m) =>\n    t ->\n    m (NValue t f m)\ndethunk = bindComputedThunkOrStub removeEffects\n"
  },
  {
    "path": "src/Nix/Options/Parser.hs",
    "content": "{-# LANGUAGE TemplateHaskell #-}\n\n-- | Code that configures presentation parser for the CLI options\nmodule Nix.Options.Parser where\n\nimport Data.Char (isDigit)\nimport qualified Data.Text as Text\nimport Data.Time (\n    UTCTime,\n    defaultTimeLocale,\n    parseTimeOrError,\n )\nimport Data.Version (showVersion)\nimport Development.GitRev (\n    gitBranch,\n    gitCommitDate,\n    gitHash,\n )\nimport GHC.Err (errorWithoutStackTrace)\nimport Nix.Options\nimport Nix.Prelude\nimport Options.Applicative hiding (ParserResult (..))\nimport Paths_hnix (version)\nimport Relude.Unsafe (read)\n\ndecodeVerbosity :: Int -> Verbosity\ndecodeVerbosity 0 = ErrorsOnly\ndecodeVerbosity 1 = Informational\ndecodeVerbosity 2 = Talkative\ndecodeVerbosity 3 = Chatty\ndecodeVerbosity 4 = DebugInfo\ndecodeVerbosity _ = Vomit\n\nargPair :: Mod OptionFields (Text, Text) -> Parser (Text, Text)\nargPair =\n    option $\n        do\n            s <- str\n            maybe\n                (errorWithoutStackTrace \"Format of --arg/--argstr in hnix is: name=expr\")\n                (pure . second Text.tail . (`Text.splitAt` s))\n                (Text.findIndex (== '=') s)\n\nnixOptions :: UTCTime -> Parser Options\nnixOptions current =\n    Options . fromMaybe Informational\n        <$> optional\n            ( option\n                ( do\n                    a <- str\n                    bool\n                        (fail \"Argument to -v/--verbose must be a number\")\n                        (pure $ decodeVerbosity $ read a)\n                        (all isDigit a)\n                )\n                ( short 'v'\n                    <> long \"verbose\"\n                    <> help \"Verbose output\"\n                )\n            )\n        <*> switch\n            ( long \"trace\"\n                <> help \"Enable tracing code (even more can be seen if built with --flags=tracing)\"\n            )\n        <*> switch\n            ( long \"thunks\"\n                <> help \"Enable reporting of thunk tracing as well as regular evaluation\"\n            )\n        <*> switch\n            ( long \"values\"\n                <> help \"Enable reporting of value provenance in error messages\"\n            )\n        <*> switch\n            ( long \"scopes\"\n                <> help \"Enable reporting of scopes in evaluation traces\"\n            )\n        <*> optional\n            ( strOption\n                ( long \"reduce\"\n                    <> help \"When done evaluating, output the evaluated part of the expression to FILE\"\n                )\n            )\n        <*> switch\n            ( long \"reduce-sets\"\n                <> help \"Reduce set members that aren't used; breaks if hasAttr is used\"\n            )\n        <*> switch\n            ( long \"reduce-lists\"\n                <> help \"Reduce list members that aren't used; breaks if elemAt is used\"\n            )\n        <*> switch\n            ( long \"parse\"\n                <> help \"Whether to parse the file (also the default right now)\"\n            )\n        <*> switch\n            ( long \"parse-only\"\n                <> help \"Whether to parse only, no pretty printing or checking\"\n            )\n        <*> switch\n            ( long \"find\"\n                <> help \"If selected, find paths within attr trees\"\n            )\n        <*> optional\n            ( strOption\n                ( long \"find-file\"\n                    <> help \"Look up the given files in Nix's search path\"\n                )\n            )\n        <*> switch\n            ( long \"strict\"\n                <> help \"When used with --eval, recursively evaluate list elements and attributes\"\n            )\n        <*> switch\n            ( long \"eval\"\n                <> help \"Whether to evaluate, or just pretty-print\"\n            )\n        <*> switch\n            ( long \"json\"\n                <> help \"Print the resulting value as an JSON representation\"\n            )\n        <*> switch\n            ( long \"xml\"\n                <> help \"Print the resulting value as an XML representation\"\n            )\n        <*> optional\n            ( strOption\n                ( short 'A'\n                    <> long \"attr\"\n                    <> help \"Select an attribute from the top-level Nix expression being evaluated\"\n                )\n            )\n        <*> many\n            ( strOption\n                ( short 'I'\n                    <> long \"include\"\n                    <> help \"Add a path to the Nix expression search path\"\n                )\n            )\n        <*> switch\n            ( long \"check\"\n                <> help \"Whether to check for syntax fails after parsing\"\n            )\n        <*> optional\n            ( strOption\n                ( long \"read\"\n                    <> help \"Read in an expression tree from a binary cache\"\n                )\n            )\n        <*> switch\n            ( long \"cache\"\n                <> help \"Write out the parsed expression tree to a binary cache\"\n            )\n        <*> switch\n            ( long \"repl\"\n                <> help \"After performing any indicated actions, enter the REPL\"\n            )\n        <*> switch\n            ( long \"ignore-fails\"\n                <> help \"Continue parsing files, even if there are fails\"\n            )\n        <*> optional\n            ( strOption\n                ( short 'E'\n                    <> long \"expr\"\n                    <> help \"Expression to parse or evaluate\"\n                )\n            )\n        <*> many\n            ( argPair\n                ( long \"arg\"\n                    <> help \"Argument to pass to an evaluated lambda\"\n                )\n            )\n        <*> many\n            ( argPair\n                ( long \"argstr\"\n                    <> help \"Argument string to pass to an evaluated lambda\"\n                )\n            )\n        <*> optional\n            ( strOption\n                ( short 'f'\n                    <> long \"file\"\n                    <> help \"Parse all of the files given in FILE; - means stdin\"\n                )\n            )\n        <*> option\n            (parseTimeOrError True defaultTimeLocale \"%Y/%m/%d %H:%M:%S\" <$> str)\n            ( long \"now\"\n                <> value current\n                <> help \"Set current time for testing purposes\"\n            )\n        <*> many\n            ( strArgument\n                ( metavar \"FILE\"\n                    <> help \"Path of file to parse\"\n                )\n            )\n\n--  2020-09-12: CLI --version option mechanism is tied to meta modules specificly generated by Cabal. It is possible to use Template Haskell to resolve the version, as also a g\nversionOpt :: Parser (a -> a)\nversionOpt = shortVersionOpt <*> debugVersionOpt\n  where\n    shortVersionOpt :: Parser (a -> a)\n    shortVersionOpt =\n        infoOption\n            (showVersion version)\n            ( long \"version\"\n                <> help \"Show release version\"\n            )\n\n    --  2020-09-13: NOTE: Does not work for direct `nix-build`s, works for `nix-shell` `cabal` builds.\n    debugVersionOpt :: Parser (a -> a)\n    debugVersionOpt =\n        infoOption\n            ( fold\n                [ \"Version: \"\n                , showVersion version\n                , \"\\nCommit: \"\n                , $(gitHash)\n                , \"\\n  date: \"\n                , $(gitCommitDate)\n                , \"\\n  branch: \"\n                , $(gitBranch)\n                ]\n            )\n            ( long \"long-version\"\n                <> help \"Show long debug version form\"\n            )\n\nnixOptionsInfo :: UTCTime -> ParserInfo Options\nnixOptionsInfo current =\n    info\n        (helper <*> versionOpt <*> nixOptions current)\n        (fullDesc <> progDesc mempty <> header \"hnix\")\n"
  },
  {
    "path": "src/Nix/Options.hs",
    "content": "{-# LANGUAGE StrictData #-}\n\n-- | Definitions & defaults for the CLI options\nmodule Nix.Options where\n\nimport Data.Time\nimport Nix.Prelude\n\n--  2021-07-15: NOTE: What these are? They need to be documented.\n-- Also need better names. Foe example, Maybes & lists names need to show their type in the name.\ndata Options\n    = Options\n    { getVerbosity :: Verbosity\n    , isTrace :: Bool\n    , isThunks :: Bool\n    , isValues :: Bool\n    , isShowScopes :: Bool\n    , getReduce :: Maybe Path\n    , isReduceSets :: Bool\n    , isReduceLists :: Bool\n    , isParse :: Bool\n    , isParseOnly :: Bool\n    , isFinder :: Bool\n    , getFindFile :: Maybe Path\n    , isStrict :: Bool\n    , isEvaluate :: Bool\n    , isJson :: Bool\n    , isXml :: Bool\n    , getAttr :: Maybe Text\n    , getInclude :: [Path]\n    , isCheck :: Bool\n    , getReadFrom :: Maybe Path\n    , isCache :: Bool\n    , isRepl :: Bool\n    , isIgnoreErrors :: Bool\n    , getExpression :: Maybe Text\n    , getArg :: [(Text, Text)]\n    , getArgstr :: [(Text, Text)]\n    , getFromFile :: Maybe Path\n    , getTime :: UTCTime\n    -- ^ The time can be set to reproduce time-dependent states.\n    , getFilePaths :: [Path]\n    }\n    deriving (Show)\n\ndefaultOptions :: UTCTime -> Options\ndefaultOptions currentTime =\n    Options\n        { getVerbosity = ErrorsOnly\n        , isTrace = False\n        , isThunks = False\n        , isValues = False\n        , isShowScopes = False\n        , getReduce = mempty\n        , isReduceSets = False\n        , isReduceLists = False\n        , isParse = False\n        , isParseOnly = False\n        , isFinder = False\n        , getFindFile = mempty\n        , isStrict = False\n        , isEvaluate = False\n        , isJson = False\n        , isXml = False\n        , getAttr = mempty\n        , getInclude = mempty\n        , isCheck = False\n        , getReadFrom = mempty\n        , isCache = False\n        , isRepl = False\n        , isIgnoreErrors = False\n        , getExpression = mempty\n        , getArg = mempty\n        , getArgstr = mempty\n        , getFromFile = mempty\n        , getTime = currentTime\n        , getFilePaths = mempty\n        }\n\ndata Verbosity\n    = ErrorsOnly\n    | Informational\n    | Talkative\n    | Chatty\n    | DebugInfo\n    | Vomit\n    deriving (Eq, Ord, Enum, Bounded, Show)\n\naskOptions :: forall e m. (MonadReader e m, Has e Options) => m Options\naskOptions = askLocal\n"
  },
  {
    "path": "src/Nix/Parser.hs",
    "content": "{-# LANGUAGE CPP #-}\n{-# LANGUAGE DeriveAnyClass #-}\n{-# OPTIONS_GHC -fno-warn-name-shadowing #-}\n\n-- | Main module for parsing Nix expressions.\nmodule Nix.Parser (\n    parseNixFile,\n    parseNixFileLoc,\n    parseNixText,\n    parseNixTextLoc,\n    parseExpr,\n    parseFromFileEx,\n    Parser,\n    parseFromText,\n    Result,\n    reservedNames,\n    NAssoc (..),\n    NOpPrecedence (..),\n    NOpName (..),\n    NSpecialOp (..),\n    NOperatorDef (..),\n    nixExpr,\n    nixExprAlgebra,\n    nixSet,\n    nixBinders,\n    nixSelector,\n    nixSym,\n    nixPath,\n    nixString,\n    nixUri,\n    nixSearchPath,\n    nixFloat,\n    nixInt,\n    nixBool,\n    nixNull,\n    whiteSpace,\n    --  2022-01-26: NOTE: Try to hide it after OperatorInfo is removed\n    NOp (..),\n    appOpDef,\n)\nwhere\n\nimport Data.Foldable (foldr1)\nimport Nix.Prelude hiding (\n    many,\n    some,\n    (<|>),\n )\n\nimport Control.Monad (msum)\nimport Control.Monad.Combinators.Expr (\n    Operator (\n        InfixL,\n        InfixN,\n        InfixR,\n        Postfix,\n        Prefix\n    ),\n    makeExprParser,\n )\nimport Data.Char (\n    isAlpha,\n    isDigit,\n    isSpace,\n )\nimport Data.Data (Data (..))\nimport Data.Fix (Fix (..))\nimport qualified Data.HashSet as HashSet\nimport Data.List.Extra (groupSort)\nimport qualified Data.Text as Text\nimport Nix.Expr.Shorthands hiding (($>))\nimport Nix.Expr.Strings (\n    escapeCodes,\n    mergePlain,\n    removeEmptyPlains,\n    stripIndent,\n )\nimport Nix.Expr.Types\nimport Nix.Expr.Types.Annotated\nimport Nix.Render (MonadFile ())\nimport Prettyprinter (\n    Doc,\n    pretty,\n )\n\n-- `parser-combinators` ships performance enhanced & MonadPlus-aware combinators.\n-- For example `some` and `many` impoted here.\nimport Text.Megaparsec hiding (\n    State,\n    (<|>),\n )\nimport Text.Megaparsec.Char (\n    char,\n    letterChar,\n    space1,\n )\nimport qualified Text.Megaparsec.Char.Lexer as Lexer\n\ntype Parser = ParsecT Void Text (State SourcePos)\n\n-- * Utils\n\n-- | Different to @isAlphaNum@\nisAlphanumeric :: Char -> Bool\nisAlphanumeric x = isAlpha x || isDigit x\n{-# INLINE isAlphanumeric #-}\n\n-- | Alternative \"<|>\" with additional preservation of 'MonadPlus' constraint.\ninfixl 3 <|>\n\n(<|>) :: (MonadPlus m) => m a -> m a -> m a\n(<|>) = mplus\n\n-- ** Annotated\n\nannotateLocation1 :: Parser a -> Parser (AnnUnit SrcSpan a)\nannotateLocation1 p =\n    do\n        begin <- getSourcePos\n        res <- p\n        end <- get -- The state set before the last whitespace\n        pure $ AnnUnit (SrcSpan (toNSourcePos begin) (toNSourcePos end)) res\n\nannotateLocation :: Parser (NExprF NExprLoc) -> Parser NExprLoc\nannotateLocation = (annUnitToAnn <$>) . annotateLocation1\n\nannotateNamedLocation :: String -> Parser (NExprF NExprLoc) -> Parser NExprLoc\nannotateNamedLocation name = annotateLocation . label name\n\n-- ** Grammar\n\nreservedNames :: HashSet VarName\nreservedNames =\n    HashSet.fromList\n        [\"let\", \"in\", \"if\", \"then\", \"else\", \"assert\", \"with\", \"rec\", \"inherit\"]\n\nreservedEnd :: Char -> Bool\nreservedEnd x =\n    isSpace x || (`elem` (\"{([})];:.\\\"',\" :: String)) x\n{-# INLINE reservedEnd #-}\n\nreserved :: Text -> Parser ()\nreserved n =\n    lexeme $ try $ chunk n *> lookAhead (void (satisfy reservedEnd) <|> eof)\n\nexprAfterSymbol :: Char -> Parser NExprLoc\nexprAfterSymbol p = symbol p *> nixExpr\n\nexprAfterReservedWord :: Text -> Parser NExprLoc\nexprAfterReservedWord word = reserved word *> nixExpr\n\n{- | A literal copy of @megaparsec@ one but with addition of the @\\r@ for Windows EOL case (@\\r\\n@).\nOverall, parser should simply @\\r\\n -> \\n@.\n-}\nskipLineComment' :: Tokens Text -> Parser ()\nskipLineComment' prefix =\n    chunk prefix *> void (takeWhileP (pure \"character\") $ \\x -> x /= '\\n' && x /= '\\r')\n\nwhiteSpace :: Parser ()\nwhiteSpace =\n    do\n        put =<< getSourcePos\n        Lexer.space space1 lineCmnt blockCmnt\n  where\n    lineCmnt = skipLineComment' \"#\"\n    blockCmnt = Lexer.skipBlockComment \"/*\" \"*/\"\n\n{- | Lexeme is a unit of the language.\nConvention is that after lexeme an arbitrary amount of empty entities (space, comments, line breaks) are allowed.\nThis lexeme definition just skips over superflous @megaparsec: lexeme@ abstraction.\n-}\nlexeme :: Parser a -> Parser a\nlexeme p = p <* whiteSpace\n\nsymbol :: Char -> Parser Char\nsymbol = lexeme . char\n\nsymbols :: Text -> Parser Text\nsymbols = lexeme . chunk\n\n-- We restrict the type of 'parens' and 'brackets' here because if they were to\n-- take a 'Parser NExprLoc' argument they would parse additional text which\n-- wouldn't be captured in the source location annotation.\n--\n-- Braces and angles in hnix don't enclose a single expression so this type\n-- restriction would not be useful.\nparens :: Parser (NExprF f) -> Parser (NExprF f)\nparens = on between symbol '(' ')'\n\nbraces :: Parser a -> Parser a\nbraces = on between symbol '{' '}'\n\nbrackets :: Parser (NExprF f) -> Parser (NExprF f)\nbrackets = on between symbol '[' ']'\n\nantiquotedIsHungryForTrailingSpaces :: Bool -> Parser (Antiquoted v NExprLoc)\nantiquotedIsHungryForTrailingSpaces hungry = Antiquoted <$> (antiStart *> nixExpr <* antiEnd)\n  where\n    antiStart :: Parser Text\n    antiStart = label \"${\" $ symbols \"${\"\n\n    antiEnd :: Parser Char\n    antiEnd =\n        label \"}\" $\n            bool\n                id\n                lexeme\n                hungry\n                (char '}')\n\nantiquotedLexeme :: Parser (Antiquoted v NExprLoc)\nantiquotedLexeme = antiquotedIsHungryForTrailingSpaces True\n\nantiquoted :: Parser (Antiquoted v NExprLoc)\nantiquoted = antiquotedIsHungryForTrailingSpaces False\n\n---------------------------------------------------------------------------------\n\n-- * Parser parts\n\n-- ** Constrants\n\nnixNull :: Parser NExprLoc\nnixNull =\n    annotateNamedLocation \"null\" $\n        mkNullF <$ reserved \"null\"\n\nnixBool :: Parser NExprLoc\nnixBool =\n    annotateNamedLocation \"bool\" $\n        on (<|>) lmkBool (True, \"true\") (False, \"false\")\n  where\n    lmkBool (b, txt) = mkBoolF b <$ reserved txt\n\ninteger :: Parser Integer\ninteger = lexeme Lexer.decimal\n\nnixInt :: Parser NExprLoc\nnixInt =\n    annotateNamedLocation \"integer\" $\n        mkIntF <$> integer\n\nfloat :: Parser Double\nfloat = lexeme Lexer.float\n\nnixFloat :: Parser NExprLoc\nnixFloat =\n    annotateNamedLocation \"float\" $\n        try $\n            mkFloatF . realToFrac <$> float\n\nnixUri :: Parser NExprLoc\nnixUri =\n    lexeme $\n        annotateLocation $\n            try $\n                do\n                    start <- letterChar\n                    protocol <-\n                        takeWhileP mempty $\n                            \\x ->\n                                isAlphanumeric x\n                                    || (`elem` (\"+-.\" :: String)) x\n                    _ <- single ':'\n                    address <-\n                        takeWhile1P mempty $\n                            \\x ->\n                                isAlphanumeric x\n                                    || (`elem` (\"%/?:@&=+$,-_.!~*'\" :: String)) x\n                    pure . NStr . DoubleQuoted . one . Plain $ start `Text.cons` protocol <> \":\" <> address\n\n-- ** Strings\n\nnixAntiquoted :: Parser a -> Parser (Antiquoted a NExprLoc)\nnixAntiquoted p =\n    label \"anti-quotation\" $\n        antiquotedLexeme\n            <|> Plain\n            <$> p\n\nescapeCode :: Parser Char\nescapeCode =\n    msum\n        [c <$ char e | (c, e) <- escapeCodes]\n        <|> anySingle\n\nstringChar ::\n    Parser () ->\n    Parser () ->\n    Parser (Antiquoted Text NExprLoc) ->\n    Parser (Antiquoted Text NExprLoc)\nstringChar end escStart esc =\n    antiquoted\n        <|> Plain\n        . one\n        <$> char '$'\n            <|> esc\n            <|> Plain\n            . fromString\n        <$> some plainChar\n  where\n    plainChar :: Parser Char\n    plainChar =\n        notFollowedBy (end <|> void (char '$') <|> escStart) *> anySingle\n\ndoubleQuoted :: Parser (NString NExprLoc)\ndoubleQuoted =\n    label \"double quoted string\" $\n        DoubleQuoted . removeEmptyPlains . mergePlain\n            <$> inQuotationMarks (many $ stringChar quotationMark (void $ char '\\\\') doubleEscape)\n  where\n    inQuotationMarks :: Parser a -> Parser a\n    inQuotationMarks expr = quotationMark *> expr <* quotationMark\n\n    quotationMark :: Parser ()\n    quotationMark = void $ char '\"'\n\n    doubleEscape :: Parser (Antiquoted Text r)\n    doubleEscape = Plain . one <$> (char '\\\\' *> escapeCode)\n\nindented :: Parser (NString NExprLoc)\nindented =\n    label \"indented string\" $\n        stripIndent\n            <$> inIndentedQuotation (many $ join stringChar indentedQuotationMark indentedEscape)\n  where\n    -- \\| Read escaping inside of the \"'' <expr> ''\"\n    indentedEscape :: Parser (Antiquoted Text r)\n    indentedEscape =\n        try $\n            do\n                indentedQuotationMark\n                Plain\n                    <$> (\"''\" <$ char '\\'' <|> \"$\" <$ char '$')\n                        <|> do\n                            c <- char '\\\\' *> escapeCode\n\n                            pure $\n                                bool\n                                    EscapedNewline\n                                    (Plain $ one c)\n                                    ('\\n' /= c)\n\n    -- \\| Enclosed into indented quatation \"'' <expr> ''\"\n    inIndentedQuotation :: Parser a -> Parser a\n    inIndentedQuotation expr = indentedQuotationMark *> expr <* indentedQuotationMark\n\n    -- \\| Symbol \"''\"\n    indentedQuotationMark :: Parser ()\n    indentedQuotationMark = label \"\\\"''\\\"\" . void $ chunk \"''\"\n\nnixString' :: Parser (NString NExprLoc)\nnixString' = label \"string\" $ lexeme $ doubleQuoted <|> indented\n\nnixString :: Parser NExprLoc\nnixString = annNStr <$> annotateLocation1 nixString'\n\n-- ** Names (variables aka symbols)\n\nidentifier :: Parser VarName\nidentifier =\n    lexeme $\n        try $\n            do\n                (coerce -> iD) <-\n                    liftA2\n                        Text.cons\n                        (satisfy (\\x -> isAlpha x || x == '_'))\n                        (takeWhileP mempty identLetter)\n                guard $ not $ iD `HashSet.member` reservedNames\n                pure iD\n  where\n    identLetter x = isAlphanumeric x || x == '_' || x == '\\'' || x == '-'\n\nnixSym :: Parser NExprLoc\nnixSym = annotateLocation $ mkSymF <$> coerce identifier\n\n-- ** ( ) parens\n\n{- | 'nixExpr' returns an expression annotated with a source position,\nhowever this position doesn't include the parsed parentheses, so remove the\n\"inner\" location annotateion and annotate again, including the parentheses.\n-}\nnixParens :: Parser NExprLoc\nnixParens =\n    annotateNamedLocation \"parens\" $\n        parens $\n            stripAnnF . unFix <$> nixExpr\n\n-- ** [ ] list\n\nnixList :: Parser NExprLoc\nnixList =\n    annotateNamedLocation \"list\" $\n        brackets $\n            NList <$> many nixTerm\n\n-- ** { } set\n\nnixBinders :: Parser [Binding NExprLoc]\nnixBinders = (inherit <|> namedVar) `endBy` symbol ';'\n  where\n    inherit =\n        do\n            -- We can't use 'reserved' here because it would consume the whitespace\n            -- after the keyword, which is not exactly the semantics of C++ Nix.\n            try $ chunk \"inherit\" *> lookAhead (void $ satisfy reservedEnd)\n            p <- getSourcePos\n            x <- whiteSpace *> optional scope\n            label \"inherited binding\" $\n                liftA2\n                    (Inherit x)\n                    (many identifier)\n                    (pure (toNSourcePos p))\n    namedVar =\n        do\n            p <- getSourcePos\n            label \"variable binding\" $\n                liftA3\n                    NamedVar\n                    (annotated <$> nixSelector)\n                    (exprAfterSymbol '=')\n                    (pure (toNSourcePos p))\n    scope = label \"inherit scope\" nixParens\n\nnixSet :: Parser NExprLoc\nnixSet =\n    annotateNamedLocation \"set\" $\n        isRec <*> braces nixBinders\n  where\n    isRec =\n        label \"recursive set\" (reserved \"rec\" $> NSet Recursive)\n            <|> pure (NSet mempty)\n\n-- ** /x/y/z literal Path\n\npathChar :: Char -> Bool\npathChar x =\n    isAlphanumeric x || (`elem` (\"._-+~\" :: String)) x\n\nslash :: Parser Char\nslash =\n    label \"slash \" $\n        try $\n            char '/' <* notFollowedBy (satisfy $ \\x -> x == '/' || x == '*' || isSpace x)\n\npathStr :: Parser Path\npathStr =\n    lexeme $\n        coerce . toString\n            <$> liftA2\n                (<>)\n                (takeWhileP mempty pathChar)\n                ( Text.concat\n                    <$> some\n                        ( liftA2\n                            Text.cons\n                            slash\n                            (takeWhile1P mempty pathChar)\n                        )\n                )\n\nnixPath :: Parser NExprLoc\nnixPath =\n    annotateNamedLocation \"path\" $\n        try $\n            mkPathF False <$> coerce pathStr\n\n-- ** <<x>> environment path\n\n{- | A path surrounded by angle brackets, indicating that it should be\nlooked up in the NIX_PATH environment variable at evaluation.\n-}\nnixSearchPath :: Parser NExprLoc\nnixSearchPath =\n    annotateNamedLocation \"spath\" $\n        mkPathF True <$> try (lexeme $ char '<' *> many (satisfy pathChar <|> slash) <* char '>')\n\n-- ** Operators\n\n--  2022-01-26: NOTE: Rename to 'literal'\nnewtype NOpName = NOpName Text\n    deriving\n        (Eq, Ord, Generic, Typeable, Data, Show, NFData)\n\ninstance IsString NOpName where\n    fromString = coerce . fromString @Text\n\ninstance ToString NOpName where\n    toString = toString @Text . coerce\n\noperator :: NOpName -> Parser Text\noperator (coerce -> op) =\n    case op of\n        c@\"-\" -> c `without` '>'\n        c@\"/\" -> c `without` '/'\n        c@\"<\" -> c `without` '='\n        c@\">\" -> c `without` '='\n        n -> symbols n\n  where\n    without :: Text -> Char -> Parser Text\n    without opChar noNextChar =\n        lexeme . try $ chunk opChar <* notFollowedBy (char noNextChar)\n\nopWithLoc :: (AnnUnit SrcSpan o -> a) -> o -> NOpName -> Parser a\nopWithLoc f op name = f . (op <$) <$> annotateLocation1 (operator name)\n\n--  2022-01-26: NOTE: Make presedence free and type safe by moving it into type level:\n--  https://youtu.be/qaPdg0mZavM?t=1757\n--  https://wiki.haskell.org/The_Monad.Reader/Issue5/Number_Param_Types\nnewtype NOpPrecedence = NOpPrecedence Int\n    deriving (Eq, Ord, Generic, Bounded, Typeable, Data, Show, NFData)\n\ninstance Enum NOpPrecedence where\n    toEnum = coerce\n    fromEnum = coerce\n\ninstance Num NOpPrecedence where\n    (+) = coerce ((+) @Int)\n    (*) = coerce ((*) @Int)\n    abs = coerce (abs @Int)\n    signum = coerce (signum @Int)\n    fromInteger = coerce (fromInteger @Int)\n    negate = coerce (negate @Int)\n\n--  2022-01-26: NOTE: This type belongs into 'Type.Expr' & be used in NExprF.\ndata NAppOp = NAppOp\n    deriving (Eq, Ord, Generic, Typeable, Data, Show, NFData)\n\n--  2022-01-26: NOTE: This type belongs into 'Type.Expr' & be used in NExprF.\ndata NSpecialOp\n    = NHasAttrOp\n    | NSelectOp\n    | -- | For special handling of internal special cases.\n      NTerm\n    deriving (Eq, Ord, Generic, Typeable, Data, Show, NFData)\n\ndata NAssoc\n    = NAssocLeft\n    | -- Nota bene: @parser-combinators@ named \"associative property\" as 'InfixN' stating it as \"non-associative property\".\n      -- Binary operators having some associativity is a basis property in mathematical algebras in use (for example, in Category theory). Having no associativity in operators makes theory mostly impossible in use and so non-associativity is not encountered in notations, therefore under 'InfixN' @parser-combinators@ meant \"associative\".\n\n      -- | Bidirectional associativity, or simply: associative property.\n      NAssoc\n    | NAssocRight\n    deriving (Eq, Ord, Generic, Typeable, Data, Show, NFData)\n\n--  2022-01-31: NOTE: This type and related typeclasses & their design, probably need a refinement.\n--\n-- In the \"Nix.Pretty\", the code probably should be well-typed to the type of operations its processes.\n-- Therefor splitting operation types into separate types there is probably needed.\n--\n-- After that:\n--\n-- > { NAssoc, NOpPrecedence, NOpName }\n--\n-- Can be formed into a type.\n--\n-- Also 'NAppDef' really has only 1 implementation, @{ NAssoc, NOpPrecedence, NOpName }@\n-- were added there only to make type uniformal.\n-- All impossible cases ideally should be unrepresentable.\n\n-- | Single operator grammar entries.\ndata NOperatorDef\n    = NAppDef NAppOp NAssoc NOpPrecedence NOpName\n    | NUnaryDef NUnaryOp NAssoc NOpPrecedence NOpName\n    | NBinaryDef NBinaryOp NAssoc NOpPrecedence NOpName\n    | NSpecialDef NSpecialOp NAssoc NOpPrecedence NOpName\n    --  2022-01-26: NOTE: Ord can be the order of evaluation of precedence (which 'Pretty' printing also accounts for).\n    deriving (Eq, Ord, Generic, Typeable, Data, Show, NFData)\n\n-- Supplied since its definition gets called/used frequently.\n\n-- | Functional application operator definition, left associative, high precedence.\nappOpDef :: NOperatorDef\nappOpDef = NAppDef NAppOp NAssocLeft 1 \" \" -- This defined as \"2\" in Nix lang spec.\n\n--  2022-01-26: NOTE: When total - make sure to hide & inline all these instances to get free solution.\n\n{- | Class to get a private free construction to abstract away the gap between the Nix operation types\n'NUnaryOp', 'NBinaryOp', 'NSpecialOp'.\nAnd in doing remove 'OperatorInfo' from existance.\n-}\nclass NOp a where\n    {-# MINIMAL getOpDef, getOpAssoc, getOpPrecedence, getOpName #-}\n\n    getOpDef :: a -> NOperatorDef\n    getOpAssoc :: a -> NAssoc\n    getOpPrecedence :: a -> NOpPrecedence\n    getOpName :: a -> NOpName\n\ninstance NOp NAppOp where\n    getOpDef NAppOp = appOpDef\n    getOpAssoc _op = fun appOpDef\n      where\n        fun (NAppDef _op assoc _prec _name) = assoc\n        fun _ = error \"Impossible happened, funapp operation should been matched.\"\n    getOpPrecedence _op = fun appOpDef\n      where\n        fun (NAppDef _op _assoc prec _name) = prec\n        fun _ = error \"Impossible happened, funapp operation should been matched.\"\n    getOpName _ = fun appOpDef\n      where\n        fun (NAppDef _op _assoc _prec name) = name\n        fun _ = error \"Impossible happened, funapp operation should been matched.\"\n\ninstance NOp NUnaryOp where\n    getOpDef =\n        \\case\n            NNeg -> NUnaryDef NNeg NAssocRight 3 \"-\"\n            NNot -> NUnaryDef NNot NAssocRight 8 \"!\"\n    getOpAssoc = fun . getOpDef\n      where\n        fun (NUnaryDef _op assoc _prec _name) = assoc\n        fun _ = error \"Impossible happened, unary operation should been matched.\"\n    getOpPrecedence = fun . getOpDef\n      where\n        fun (NUnaryDef _op _assoc prec _name) = prec\n        fun _ = error \"Impossible happened, unary operation should been matched.\"\n    getOpName = fun . getOpDef\n      where\n        fun (NUnaryDef _op _assoc _prec name) = name\n        fun _ = error \"Impossible happened, unary operation should been matched.\"\n\ninstance NOp NBinaryOp where\n    getOpDef =\n        \\case\n            NConcat -> NBinaryDef NConcat NAssocRight 5 \"++\"\n            NMult -> NBinaryDef NMult NAssocLeft 6 \"*\"\n            NDiv -> NBinaryDef NDiv NAssocLeft 6 \"/\"\n            NPlus -> NBinaryDef NPlus NAssocLeft 7 \"+\"\n            NMinus -> NBinaryDef NMinus NAssocLeft 7 \"-\"\n            NUpdate -> NBinaryDef NUpdate NAssocRight 9 \"//\"\n            NLt -> NBinaryDef NLt NAssocLeft 10 \"<\"\n            NLte -> NBinaryDef NLte NAssocLeft 10 \"<=\"\n            NGt -> NBinaryDef NGt NAssocLeft 10 \">\"\n            NGte -> NBinaryDef NGte NAssocLeft 10 \">=\"\n            NEq -> NBinaryDef NEq NAssoc 11 \"==\"\n            NNEq -> NBinaryDef NNEq NAssoc 11 \"!=\"\n            NAnd -> NBinaryDef NAnd NAssocLeft 12 \"&&\"\n            NOr -> NBinaryDef NOr NAssocLeft 13 \"||\"\n            NImpl -> NBinaryDef NImpl NAssocRight 14 \"->\"\n    getOpAssoc = fun . getOpDef\n      where\n        fun (NBinaryDef _op assoc _prec _name) = assoc\n        fun _ = error \"Impossible happened, binary operation should been matched.\"\n    getOpPrecedence = fun . getOpDef\n      where\n        fun (NBinaryDef _op _assoc prec _name) = prec\n        fun _ = error \"Impossible happened, binary operation should been matched.\"\n    getOpName = fun . getOpDef\n      where\n        fun (NBinaryDef _op _assoc _prec name) = name\n        fun _ = error \"Impossible happened, binary operation should been matched.\"\n\ninstance NOp NSpecialOp where\n    getOpDef =\n        \\case\n            NSelectOp -> NSpecialDef NSelectOp NAssocLeft 1 \".\"\n            NHasAttrOp -> NSpecialDef NHasAttrOp NAssocLeft 4 \"?\"\n            NTerm -> NSpecialDef NTerm NAssocLeft 1 \"???\"\n    getOpAssoc = fun . getOpDef\n      where\n        fun (NSpecialDef _op assoc _prec _name) = assoc\n        fun _ = error \"Impossible happened, special operation should been matched.\"\n    getOpPrecedence = fun . getOpDef\n      where\n        fun (NSpecialDef _op _assoc prec _name) = prec\n        fun _ = error \"Impossible happened, special operation should been matched.\"\n    getOpName = fun . getOpDef\n      where\n        fun (NSpecialDef _op _assoc _prec name) = name\n        fun _ = error \"Impossible happened, special operation should been matched.\"\n\ninstance NOp NOperatorDef where\n    getOpDef op = op\n    getOpAssoc = \\case\n        (NAppDef _op assoc _prec _name) -> assoc\n        (NUnaryDef _op assoc _prec _name) -> assoc\n        (NBinaryDef _op assoc _prec _name) -> assoc\n        (NSpecialDef _op assoc _prec _name) -> assoc\n    getOpPrecedence = fun . getOpDef\n      where\n        fun (NAppDef _op _assoc prec _name) = prec\n        fun (NUnaryDef _op _assoc prec _name) = prec\n        fun (NBinaryDef _op _assoc prec _name) = prec\n        fun (NSpecialDef _op _assoc prec _name) = prec\n    getOpName = fun . getOpDef\n      where\n        fun (NAppDef _op _assoc _prec name) = name\n        fun (NUnaryDef _op _assoc _prec name) = name\n        fun (NBinaryDef _op _assoc _prec name) = name\n        fun (NSpecialDef _op _assoc _prec name) = name\n\nprefix :: NUnaryOp -> Operator Parser NExprLoc\nprefix op =\n    Prefix $ manyUnaryOp $ opWithLoc annNUnary op $ getOpName op\n\n-- postfix name op = (NUnaryDef name op,\n--                    Postfix (opWithLoc annNUnary op name))\n\nmanyUnaryOp :: (MonadPlus f) => f (a -> a) -> f (a -> a)\nmanyUnaryOp f = foldr1 (.) <$> some f\n\nbinary ::\n    NBinaryOp ->\n    Operator Parser NExprLoc\nbinary op =\n    mapAssocToInfix (getOpAssoc op) $ opWithLoc annNBinary op (getOpName op)\n\nmapAssocToInfix :: NAssoc -> m (a -> a -> a) -> Operator m a\nmapAssocToInfix NAssocLeft = InfixL\nmapAssocToInfix NAssoc = InfixN\nmapAssocToInfix NAssocRight = InfixR\n\n-- ** x: y lambda function\n\n-- | Gets all of the arguments for a function.\nargExpr :: Parser (Params NExprLoc)\nargExpr =\n    msum\n        [ atLeft\n        , onlyname\n        , atRight\n        ]\n        <* symbol ':'\n  where\n    -- An argument not in curly braces. There's some potential ambiguity\n    -- in the case of, for example `x:y`. Is it a lambda function `x: y`, or\n    -- a URI `x:y`? Nix syntax says it's the latter. So we need to fail if\n    -- there's a valid URI parse here.\n    onlyname =\n        msum\n            [ nixUri *> unexpected (Label $ fromList \"valid uri\")\n            , Param <$> identifier\n            ]\n\n    -- Parameters named by an identifier on the left (`args @ {x, y}`)\n    atLeft =\n        try $\n            do\n                name <- identifier <* symbol '@'\n                (variadic, pset) <- params\n                pure $ ParamSet (pure name) variadic pset\n\n    -- Parameters named by an identifier on the right, or none (`{x, y} @ args`)\n    atRight =\n        do\n            (variadic, pset) <- params\n            name <- optional $ symbol '@' *> identifier\n            pure $ ParamSet name variadic pset\n\n    -- Return the parameters set.\n    params = braces getParams\n\n    -- Collects the parameters within curly braces. Returns the parameters and\n    -- an flag indication if the parameters are variadic.\n    getParams :: Parser (Variadic, [(VarName, Maybe NExprLoc)])\n    getParams = go mempty\n      where\n        -- Attempt to parse `...`. If this succeeds, stop and return True.\n        -- Otherwise, attempt to parse an argument, optionally with a\n        -- default. If this fails, then return what has been accumulated\n        -- so far.\n        go :: [(VarName, Maybe NExprLoc)] -> Parser (Variadic, [(VarName, Maybe NExprLoc)])\n        go acc = ((Variadic, acc) <$ symbols \"...\") <|> getMore\n          where\n            getMore :: Parser (Variadic, [(VarName, Maybe NExprLoc)])\n            getMore =\n                -- Could be nothing, in which just return what we have so far.\n                option (mempty, acc) $\n                    do\n                        -- Get an argument name and an optional default.\n                        pair <-\n                            liftA2\n                                (,)\n                                identifier\n                                (optional $ exprAfterSymbol '?')\n\n                        let args = acc <> one pair\n\n                        -- Either return this, or attempt to get a comma and restart.\n                        option (mempty, args) $ symbol ',' *> go args\n\nnixLambda :: Parser NExprLoc\nnixLambda =\n    liftA2\n        annNAbs\n        (annotateLocation1 $ try argExpr)\n        nixExpr\n\n-- ** let expression\n\nnixLet :: Parser NExprLoc\nnixLet =\n    annotateNamedLocation \"let block\" $\n        reserved \"let\" *> (letBody <|> letBinders)\n  where\n    -- \\| Expressions `let {..., body = ...}' are just desugared\n    -- into `(rec {..., body = ...}).body'.\n    letBody = (\\expr -> NSelect Nothing expr (one $ StaticKey \"body\")) <$> attrset\n      where\n        attrset = annotateLocation $ NSet Recursive <$> braces nixBinders\n    -- \\| Regular `let`\n    letBinders =\n        liftA2\n            NLet\n            nixBinders\n            (exprAfterReservedWord \"in\")\n\n-- ** if then else\n\nnixIf :: Parser NExprLoc\nnixIf =\n    annotateNamedLocation \"if\" $\n        liftA3\n            NIf\n            (reserved \"if\" *> nixExpr)\n            (exprAfterReservedWord \"then\")\n            (exprAfterReservedWord \"else\")\n\n-- ** with\n\nnixWith :: Parser NExprLoc\nnixWith =\n    annotateNamedLocation \"with\" $\n        liftA2\n            NWith\n            (exprAfterReservedWord \"with\")\n            (exprAfterSymbol ';')\n\n-- ** assert\n\nnixAssert :: Parser NExprLoc\nnixAssert =\n    annotateNamedLocation \"assert\" $\n        liftA2\n            NAssert\n            (exprAfterReservedWord \"assert\")\n            (exprAfterSymbol ';')\n\n-- ** . - reference (selector) into attr\n\nselectorDot :: Parser ()\nselectorDot = label \".\" $ try (symbol '.' *> notFollowedBy nixPath)\n\nkeyName :: Parser (NKeyName NExprLoc)\nkeyName = dynamicKey <|> staticKey\n  where\n    staticKey = StaticKey <$> identifier\n    dynamicKey = DynamicKey <$> nixAntiquoted nixString'\n\nnixSelector :: Parser (AnnUnit SrcSpan (NAttrPath NExprLoc))\nnixSelector =\n    annotateLocation1 $ fromList <$> keyName `sepBy1` selectorDot\n\nnixSelect :: Parser NExprLoc -> Parser NExprLoc\nnixSelect term =\n    do\n        res <-\n            liftA2\n                builder\n                term\n                ( optional $\n                    liftA2\n                        (flip (,))\n                        (selectorDot *> nixSelector)\n                        (optional $ reserved \"or\" *> nixTerm)\n                )\n        continues <- optional $ lookAhead selectorDot\n\n        maybe\n            id\n            (const nixSelect)\n            continues\n            (pure res)\n  where\n    builder ::\n        NExprLoc ->\n        Maybe\n            ( Maybe NExprLoc\n            , AnnUnit SrcSpan (NAttrPath NExprLoc)\n            ) ->\n        NExprLoc\n    builder t =\n        maybe\n            t\n            (uncurry (`annNSelect` t))\n\n-- ** _ - syntax hole\n\nnixSynHole :: Parser NExprLoc\nnixSynHole =\n    annotateLocation $ mkSynHoleF <$> coerce (char '^' *> identifier)\n\n-- List of Nix operation parsers with their precedence.\nopParsers :: [(NOpPrecedence, Operator Parser NExprLoc)]\nopParsers =\n    -- This is not parsed here, even though technically it's part of the\n    -- expression table. The problem is that in some cases, such as list\n    -- membership, it's also a term. And since terms are effectively the\n    -- highest precedence entities parsed by the expression parser, it ends up\n    -- working out that we parse them as a kind of \"meta-term\".\n\n    -- {-  1 -}\n    -- [ ( NSpecialDef \".\" NSelectOp NAssocLeft\n    --   , Postfix $\n    --       do\n    --         sel <- seldot *> selector\n    --         mor <- optional (reserved \"or\" *> term)\n    --         pure $ \\x -> annNSelect x sel mor)\n    -- ]\n\n    -- NApp is left associative\n    -- 2018-05-07: jwiegley: Thanks to Brent Yorgey for showing me this trick!\n    specialBuilder NAppOp (InfixL $ annNApp <$ symbols mempty)\n        <> specialBuilder NHasAttrOp (Postfix $ symbol '?' *> (flip annNHasAttr <$> nixSelector))\n        <> builder prefix\n        <> builder binary\n  where\n    specialBuilder :: (NOp t) => t -> b -> [(NOpPrecedence, b)]\n    specialBuilder op parser = one (entry op (const parser))\n\n    builder :: (Enum t, Bounded t, NOp t) => (t -> b) -> [(NOpPrecedence, b)]\n    builder tp = fmap (`entry` tp) universe\n\n    entry :: (NOp t) => t -> (t -> b) -> (NOpPrecedence, b)\n    entry op parser = (getOpPrecedence op, parser op)\n\n-- ** Expr & its constituents (Language term, expr algebra)\n\nnixTerm :: Parser NExprLoc\nnixTerm =\n    do\n        c <- try . lookAhead . satisfy $\n            \\x -> (`elem` (\"({[</\\\"'^\" :: String)) x || pathChar x\n        case c of\n            '(' -> nixSelect nixParens\n            '{' -> nixSelect nixSet\n            '[' -> nixList\n            '<' -> nixSearchPath\n            '/' -> nixPath\n            '\"' -> nixString\n            '\\'' -> nixString\n            '^' -> nixSynHole\n            _ ->\n                msum $\n                    [nixSelect nixSet | c == 'r']\n                        <> [nixPath | pathChar c]\n                        <> if isDigit c\n                            then [nixFloat, nixInt]\n                            else\n                                [nixUri | isAlpha c]\n                                    <> [nixBool | c == 't' || c == 'f']\n                                    <> [nixNull | c == 'n']\n                                    <> one (nixSelect nixSym)\n\n-- | Bundles parsers into @[[]]@ based on precedence (form is required for `megaparsec`).\nnixOperators :: [[Operator Parser NExprLoc]]\nnixOperators =\n    snd\n        <$> groupSort opParsers\n\n{- | Nix expression algebra parser.\n\"Expression algebra\" is to explain @megaparsec@ use of the term \"Expression\" (parser for language algebraic coperators without any statements (without @let@ etc.)), which is essentially an algebra inside the language.\n-}\nnixExprAlgebra :: Parser NExprLoc\nnixExprAlgebra =\n    makeExprParser\n        nixTerm\n        nixOperators\n\nnixExpr :: Parser NExprLoc\nnixExpr = keywords <|> nixLambda <|> nixExprAlgebra\n  where\n    keywords = nixLet <|> nixIf <|> nixAssert <|> nixWith\n\n-- * Parse\n\ntype Result a = Either (Doc Void) a\n\nparseWith ::\n    Parser a ->\n    Path ->\n    Text ->\n    Either (Doc Void) a\nparseWith parser file input =\n    either\n        (Left . pretty . errorBundlePretty)\n        pure\n        $ (`evalState` initialPos (coerce file))\n        $ (`runParserT` coerce file) parser input\n\nparseFromFileEx :: (MonadFile m) => Parser a -> Path -> m (Result a)\nparseFromFileEx parser file = parseWith parser file <$> readFile file\n\nparseFromText :: Parser a -> Text -> Result a\nparseFromText = (`parseWith` \"<string>\")\n\nfullContent :: Parser NExprLoc\nfullContent = whiteSpace *> nixExpr <* eof\n\nparseNixFile' :: (MonadFile m) => (Parser NExprLoc -> Parser a) -> Path -> m (Result a)\nparseNixFile' f =\n    parseFromFileEx $ f fullContent\n\nparseNixFile :: (MonadFile m) => Path -> m (Result NExpr)\nparseNixFile =\n    parseNixFile' (stripAnnotation <$>)\n\nparseNixFileLoc :: (MonadFile m) => Path -> m (Result NExprLoc)\nparseNixFileLoc =\n    parseNixFile' id\n\nparseNixText' :: (Parser NExprLoc -> Parser a) -> Text -> Result a\nparseNixText' f =\n    parseFromText $ f fullContent\n\nparseNixText :: Text -> Result NExpr\nparseNixText =\n    parseNixText' (stripAnnotation <$>)\n\nparseNixTextLoc :: Text -> Result NExprLoc\nparseNixTextLoc =\n    parseNixText' id\n\nparseExpr :: (MonadFail m) => Text -> m NExpr\nparseExpr =\n    either\n        (fail . show)\n        pure\n        . parseNixText\n"
  },
  {
    "path": "src/Nix/Prelude.hs",
    "content": "{- | This is a @Prelude@, but, please, do not put things in here,\nput them into \"Nix.Utils\". This module is a pass-through-multiplexer,\nbetween our custom code (\"Nix.Utils\") that shadows over the outside prelude that is in use (\"Relude\")\n\"Prelude\" module has a problem of being imported & used by other projects.\n\"Nix.Utils\" as a module with a regular name does not have that problem.\n-}\nmodule Nix.Prelude (\n    module Nix.Utils,\n    module Relude,\n) where\n\nimport Nix.Utils\nimport Relude hiding (\n    force,\n    pass,\n    readFile,\n    trace,\n    traceM,\n    whenJust,\n    whenNothing,\n )\n"
  },
  {
    "path": "src/Nix/Pretty.hs",
    "content": "{-# LANGUAGE AllowAmbiguousTypes #-}\n{-# LANGUAGE CPP #-}\n{-# OPTIONS_GHC -fno-warn-name-shadowing #-}\n\nmodule Nix.Pretty where\n\nimport Control.Monad.Free (Free (Free))\nimport Data.Fix (\n    Fix (..),\n    foldFix,\n )\nimport Data.HashMap.Lazy (toList)\nimport qualified Data.HashMap.Lazy as M\nimport qualified Data.HashSet as HashSet\nimport qualified Data.List.NonEmpty as NE\nimport Data.Text (\n    replace,\n    strip,\n )\nimport qualified Data.Text as Text\nimport Nix.Atoms\nimport Nix.Cited\nimport Nix.Expr.Strings\nimport Nix.Expr.Types\nimport Nix.Expr.Types.Annotated\nimport Nix.Normal\nimport Nix.Parser\nimport Nix.Prelude hiding (group, toList)\nimport Nix.String\nimport Nix.Thunk\nimport Nix.Value\nimport Prettyprinter hiding (list)\n\n{- | This type represents a pretty printed nix expression\ntogether with some information about the expression.\n-}\ndata NixDoc ann = NixDoc\n    { getDoc :: Doc ann\n    -- ^ Rendered expression. Without surrounding parenthesis.\n    , rootOp :: NOperatorDef\n    -- ^ The root operator is the operator at the root of\n    --     the expression tree. For example, in '(a * b) + c', '+' would be the root\n    --     operator. It is needed to determine if we need to wrap the expression in\n    --     parentheses.\n    , wasPath :: Bool -- This is needed so that when a path is used in a selector path\n    -- we can add brackets appropriately\n    }\n\n{- | Represent Nix antiquotes.\n\n>\n> ${ expr }\n>\n-}\nantiquote :: NixDoc ann -> Doc ann\nantiquote x = \"${\" <> getDoc x <> \"}\"\n\nmkNixDoc :: NOperatorDef -> Doc ann -> NixDoc ann\nmkNixDoc o d = NixDoc{getDoc = d, rootOp = o, wasPath = False}\n\n{- | A simple expression is never wrapped in parentheses. The expression\n  behaves as if its root operator had a precedence higher than all\n  other operators (including function application).\n-}\nsimpleExpr :: Doc ann -> NixDoc ann\nsimpleExpr =\n    mkNixDoc $ NSpecialDef NTerm NAssoc minBound \"simple expr\"\n\npathExpr :: Doc ann -> NixDoc ann\npathExpr d = (simpleExpr d){wasPath = True}\n\n{- | An expression that behaves as if its root operator had a precedence lower\n  than all other operators. That ensures that the expression is wrapped in\n  parentheses in almost always, but it's still rendered without parentheses\n  in cases where parentheses are never required (such as in the LHS of a\n  binding).\n-}\nleastPrecedence :: Doc ann -> NixDoc ann\nleastPrecedence =\n    mkNixDoc $ NSpecialDef NTerm NAssoc maxBound \"least precedence\"\n\ndata WrapMode\n    = ProcessAllWrap\n    | PrecedenceWrap\n    deriving (Eq)\n\nneedsParens ::\n    WrapMode ->\n    NOperatorDef ->\n    NOperatorDef ->\n    Bool\nneedsParens mode host sub =\n    getOpPrecedence host > getOpPrecedence sub\n        || bool\n            False\n            ( NAssoc /= getOpAssoc host\n                && on (==) getOpAssoc host sub\n                && on (==) getOpPrecedence host sub\n            )\n            (ProcessAllWrap == mode)\n\nmaybeWrapDoc :: WrapMode -> NOperatorDef -> NixDoc ann -> Doc ann\nmaybeWrapDoc mode host sub =\n    bool\n        parens\n        id\n        (needsParens mode host (rootOp sub))\n        (getDoc sub)\n\n{- | Determine if to return doc wraped into parens,\naccording the given operator.\n-}\nwrap :: NOperatorDef -> NixDoc ann -> Doc ann\nwrap = maybeWrapDoc ProcessAllWrap\n\nprecedenceWrap :: NOperatorDef -> NixDoc ann -> Doc ann\nprecedenceWrap = maybeWrapDoc PrecedenceWrap\n\n-- Used in the selector case to print a path in a selector as\n-- \"${./abc}\"\nwrapPath :: NOperatorDef -> NixDoc ann -> Doc ann\nwrapPath op sub =\n    bool\n        (wrap op sub)\n        (dquotes $ antiquote sub)\n        (wasPath sub)\n\n-- | Handle Output representation of the string escape codes.\nprettyString :: NString (NixDoc ann) -> Doc ann\nprettyString (DoubleQuoted parts) =\n    dquotes $ foldMap prettyPart parts\n  where\n    prettyPart (Plain t) = pretty $ escapeString t\n    prettyPart EscapedNewline = \"''\\\\n\"\n    prettyPart (Antiquoted r) = antiquote r\nprettyString (Indented _ parts) =\n    group $ nest 2 $ vcat [\"''\", content, \"''\"]\n  where\n    content = vsep . fmap prettyLine . stripLastIfEmpty . splitLines $ parts\n    stripLastIfEmpty :: [[Antiquoted Text r]] -> [[Antiquoted Text r]]\n    stripLastIfEmpty =\n        filter flt\n      where\n        flt :: [Antiquoted Text r] -> Bool\n        flt [Plain t] | Text.null (strip t) = False\n        flt _ = True\n\n    prettyLine :: [Antiquoted Text (NixDoc ann)] -> Doc ann\n    prettyLine =\n        hcat . fmap prettyPart\n      where\n        prettyPart :: Antiquoted Text (NixDoc ann) -> Doc ann\n        prettyPart (Plain t) =\n            pretty . replace \"${\" \"''${\" . replace \"''\" \"'''\" $ t\n        prettyPart EscapedNewline = \"\\\\n\"\n        prettyPart (Antiquoted r) = antiquote r\n\nprettyVarName :: VarName -> Doc ann\nprettyVarName = pretty @Text . coerce\n\nprettyParams :: Params (NixDoc ann) -> Doc ann\nprettyParams (Param n) = prettyVarName n\nprettyParams (ParamSet mname variadic pset) =\n    prettyParamSet variadic pset\n        <> toDoc `whenJust` mname\n  where\n    toDoc :: VarName -> Doc ann\n    toDoc (coerce -> name) =\n        (\"@\" <> pretty name) `whenFalse` Text.null name\n\nprettyParamSet :: forall ann. Variadic -> ParamSet (NixDoc ann) -> Doc ann\nprettyParamSet variadic args =\n    encloseSep\n        \"{ \"\n        (align \" }\")\n        (align \", \")\n        (fmap prettySetArg args <> one \"...\" `whenTrue` (variadic == Variadic))\n  where\n    prettySetArg :: (VarName, Maybe (NixDoc ann)) -> Doc ann\n    prettySetArg (n, maybeDef) =\n        (prettyVarName n <>) $ ((\" ? \" <>) . getDoc) `whenJust` maybeDef\n\nprettyBind :: Binding (NixDoc ann) -> Doc ann\nprettyBind (NamedVar n v _p) =\n    prettySelector n <> \" = \" <> getDoc v <> \";\"\nprettyBind (Inherit s ns _p) =\n    \"inherit \" <> scope <> align (fillSep $ prettyVarName <$> ns) <> \";\"\n  where\n    scope =\n        ((<> \" \") . parens . getDoc) `whenJust` s\n\nprettyKeyName :: NKeyName (NixDoc ann) -> Doc ann\nprettyKeyName (StaticKey key) =\n    bool\n        \"\\\"\\\"\"\n        ( bool\n            id\n            dquotes\n            (HashSet.member key reservedNames)\n            (prettyVarName key)\n        )\n        (not $ Text.null $ coerce key)\nprettyKeyName (DynamicKey key) =\n    runAntiquoted\n        (DoubleQuoted $ one $ Plain \"\\n\")\n        prettyString\n        antiquote\n        key\n\nprettySelector :: NAttrPath (NixDoc ann) -> Doc ann\nprettySelector = hcat . punctuate \".\" . fmap prettyKeyName . NE.toList\n\nprettyAtom :: NAtom -> NixDoc ann\nprettyAtom = simpleExpr . pretty . atomText\n\nprettyNix :: NExpr -> Doc ann\nprettyNix = getDoc . foldFix exprFNixDoc\n\nprettyOriginExpr ::\n    forall t f m ann.\n    (HasCitations1 m (NValue t f m) f) =>\n    NExprLocF (Maybe (NValue t f m)) ->\n    Doc ann\nprettyOriginExpr = getDoc . go\n  where\n    go :: NExprLocF (Maybe (NValue t f m)) -> NixDoc ann\n    go = exprFNixDoc . stripAnnF . fmap render\n      where\n        render :: Maybe (NValue t f m) -> NixDoc ann\n        render Nothing = simpleExpr \"_\"\n        render (Just (Free (reverse . citations @m -> p : _))) = go (getOriginExpr p)\n        render _ = simpleExpr \"?\"\n\n-- render (Just (NValue (citations -> ps))) =\n-- simpleExpr $ foldr ((\\x y -> vsep [x, y]) . parens . indent 2 . getDoc\n--                           . go . originExpr)\n--     mempty (reverse ps)\n\n{- | Takes original expression from inside provenance information.\nPrettifies that expression.\n-}\nprettyExtractFromProvenance ::\n    forall t f m ann.\n    (HasCitations1 m (NValue t f m) f) =>\n    [Provenance m (NValue t f m)] ->\n    Doc ann\nprettyExtractFromProvenance =\n    sep\n        . fmap (prettyOriginExpr . getOriginExpr)\n\nexprFNixDoc :: forall ann. NExprF (NixDoc ann) -> NixDoc ann\nexprFNixDoc = \\case\n    NConstant atom -> prettyAtom atom\n    NStr str -> simpleExpr $ prettyString str\n    NList xs ->\n        prettyContainer \"[\" (precedenceWrap appOpDef) \"]\" xs\n    NSet NonRecursive xs ->\n        prettyContainer \"{\" prettyBind \"}\" xs\n    NSet Recursive xs ->\n        prettyContainer \"rec {\" prettyBind \"}\" xs\n    NAbs args body ->\n        leastPrecedence $\n            nest 2 $\n                vsep\n                    [ prettyParams args <> \":\"\n                    , getDoc body\n                    ]\n    NApp fun arg ->\n        mkNixDoc appOpDef (wrap appOpDef fun <> \" \" <> precedenceWrap appOpDef arg)\n    NBinary op r1 r2 ->\n        mkNixDoc\n            opDef\n            $ hsep\n                [ pickWrapMode NAssocLeft r1\n                , pretty @Text $ coerce @NOpName $ getOpName op\n                , pickWrapMode NAssocRight r2\n                ]\n      where\n        opDef = getOpDef op\n\n        pickWrapMode :: NAssoc -> NixDoc ann -> Doc ann\n        pickWrapMode x =\n            bool\n                wrap\n                precedenceWrap\n                (getOpAssoc opDef /= x)\n                opDef\n    NUnary op r1 ->\n        mkNixDoc\n            opDef\n            $ pretty @Text (coerce $ getOpName op) <> wrap opDef r1\n      where\n        opDef = getOpDef op\n    NSelect o r' attr ->\n        maybe\n            (mkNixDoc selectOp)\n            (const leastPrecedence)\n            o\n            $ wrapPath selectOp (mkNixDoc selectOp (wrap appOpDef r'))\n                <> \".\"\n                <> prettySelector attr\n                <> ((\" or \" <>) . precedenceWrap appOpDef) `whenJust` o\n      where\n        selectOp :: NOperatorDef\n        selectOp = getOpDef NSelectOp\n    NHasAttr r attr ->\n        mkNixDoc hasAttrOp (wrap hasAttrOp r <> \" ? \" <> prettySelector attr)\n      where\n        hasAttrOp :: NOperatorDef\n        hasAttrOp = getOpDef NHasAttrOp\n    NEnvPath p -> simpleExpr $ pretty @String $ \"<\" <> coerce p <> \">\"\n    NLiteralPath p ->\n        pathExpr $\n            pretty @FilePath $\n                coerce $\n                    case p of\n                        \"./\" -> \"./.\"\n                        \"../\" -> \"../.\"\n                        \"..\" -> \"../.\"\n                        path ->\n                            bool\n                                (\"./\" <> path)\n                                path\n                                (any (`isPrefixOf` coerce path) [\"/\", \"~/\", \"./\", \"../\"])\n    NSym name -> simpleExpr $ prettyVarName name\n    NLet binds body ->\n        leastPrecedence $\n            group $\n                vsep\n                    [ \"let\"\n                    , indent 2 (vsep $ fmap prettyBind binds)\n                    , \"in \" <> getDoc body\n                    ]\n    NIf cond trueBody falseBody ->\n        leastPrecedence $\n            group $\n                nest 2 ifThenElse\n      where\n        ifThenElse :: Doc ann\n        ifThenElse =\n            sep\n                [ \"if \" <> getDoc cond\n                , align $ \"then \" <> getDoc trueBody\n                , align $ \"else \" <> getDoc falseBody\n                ]\n    NWith scope body ->\n        prettyAddScope \"with \" scope body\n    NAssert cond body ->\n        prettyAddScope \"assert \" cond body\n    NSynHole name -> simpleExpr $ pretty @Text (\"^\" <> coerce name)\n  where\n    prettyContainer h f t c =\n        handlePresence\n            (simpleExpr (h <> t))\n            (const $ simpleExpr $ group $ nest 2 (h <> line <> vsep (f <$> c)) <> line <> t)\n            c\n\n    prettyAddScope h c b =\n        leastPrecedence $\n            vsep\n                [h <> getDoc c <> \";\", align $ getDoc b]\n\nvalueToExpr :: forall t f m. (MonadDataContext f m) => NValue t f m -> NExpr\nvalueToExpr = iterNValueByDiscardWith thk (Fix . phi)\n  where\n    thk = Fix . NSym $ \"<expr>\"\n\n    phi :: NValue' t f m NExpr -> NExprF NExpr\n    phi (NVConstant' a) = NConstant a\n    phi (NVStr' ns) = NStr $ DoubleQuoted $ one $ Plain $ ignoreContext ns\n    phi (NVList' l) = NList l\n    phi (NVSet' p s) =\n        NSet\n            mempty\n            [ NamedVar (one $ StaticKey k) v (fromMaybe nullPos $ (`M.lookup` p) k)\n            | (k, v) <- toList s\n            ]\n    phi (NVClosure' _ _) = NSym \"<closure>\"\n    phi (NVPath' p) = NLiteralPath p\n    phi (NVBuiltin' name _) = NSym $ coerce ((mappend @Text) \"builtins.\") name\n\nprettyNValue ::\n    forall t f m ann. (MonadDataContext f m) => NValue t f m -> Doc ann\nprettyNValue = prettyNix . valueToExpr\n\n{- | During the output, which can print only representation of value,\nlazy thunks need to looked into & so - be evaluated (*sic)\nThis type is a simple manual witness \"is the thunk gets shown\".\n-}\ndata ValueOrigin = WasThunk | Value\n    deriving (Eq)\n\nprettyProv ::\n    forall t f m ann.\n    ( HasCitations m (NValue t f m) t\n    , HasCitations1 m (NValue t f m) f\n    , MonadThunk t m (NValue t f m)\n    , MonadDataContext f m\n    ) =>\n    -- | Was thunk?\n    ValueOrigin ->\n    NValue t f m ->\n    Doc ann\nprettyProv wasThunk v =\n    handlePresence\n        id\n        ( \\ps pv ->\n            fillSep\n                [ pv\n                , indent 2 $\n                    \"(\" <> (\"thunk \" `whenTrue` (wasThunk == WasThunk) <> \"from: \" <> prettyExtractFromProvenance ps) <> \")\"\n                ]\n        )\n        (citations @m @(NValue t f m) v)\n        (prettyNValue v)\n\nprettyNValueProv ::\n    forall t f m ann.\n    ( HasCitations m (NValue t f m) t\n    , HasCitations1 m (NValue t f m) f\n    , MonadThunk t m (NValue t f m)\n    , MonadDataContext f m\n    ) =>\n    NValue t f m ->\n    Doc ann\nprettyNValueProv =\n    prettyProv Value\n\nprettyNThunk ::\n    forall t f m ann.\n    ( HasCitations m (NValue t f m) t\n    , HasCitations1 m (NValue t f m) f\n    , MonadThunk t m (NValue t f m)\n    , MonadDataContext f m\n    ) =>\n    t ->\n    m (Doc ann)\nprettyNThunk t =\n    prettyProv WasThunk <$> dethunk t\n\n-- | This function is used only by the testing code.\nprintNix :: forall t f m. (MonadDataContext f m) => NValue t f m -> Text\nprintNix =\n    iterNValueByDiscardWith thunkStubText phi\n  where\n    phi :: NValue' t f m Text -> Text\n    phi (NVConstant' a) = atomText a\n    phi (NVStr' ns) = \"\\\"\" <> escapeString (ignoreContext ns) <> \"\\\"\"\n    phi (NVList' l) = \"[ \" <> unwords l <> \" ]\"\n    phi (NVSet' _ s) =\n        \"{ \"\n            <> fold\n                [ check k <> \" = \" <> v <> \"; \"\n                | (coerce -> k, v) <- sort $ toList s\n                ]\n            <> \"}\"\n      where\n        check :: Text -> Text\n        check v =\n            fromMaybe\n                v\n                (tryRead @Int <|> tryRead @Float)\n          where\n            tryRead :: forall a. (Read a, Show a) => Maybe Text\n            tryRead = fmap ((\\s -> \"\\\"\" <> s <> \"\\\"\") . show) $ readMaybe @a $ toString v\n    phi NVClosure'{} = \"<<lambda>>\"\n    phi (NVPath' fp) = fromString $ coerce fp\n    phi (NVBuiltin' name _) = \"<<builtin \" <> coerce name <> \">>\"\n"
  },
  {
    "path": "src/Nix/Reduce.hs",
    "content": "{-# LANGUAGE AllowAmbiguousTypes #-}\n{-# LANGUAGE CPP #-}\n{-# LANGUAGE ConstraintKinds #-}\n{-# LANGUAGE GeneralizedNewtypeDeriving #-}\n{-# LANGUAGE PartialTypeSignatures #-}\n{-# LANGUAGE TypeFamilies #-}\n{-# OPTIONS_GHC -fno-warn-name-shadowing #-}\n\n{- | This module provides a \"reducing\" expression evaluator, which reduces\n  away pure, non self-referential aspects of an expression tree, yielding a\n  new expression tree. It does not yet attempt to reduce everything\n  possible, and will always yield a tree with the same meaning as the\n  original. It should be seen as an opportunistic simplifier, but which\n  gives up easily if faced with any potential for ambiguity in the result.\n-}\nmodule Nix.Reduce (\n    reduceExpr,\n    reducingEvalExpr,\n) where\n\nimport Control.Monad.Catch (MonadCatch (catch))\nimport Nix.Prelude\n#if !MIN_VERSION_base(4,12,0)\nimport           Prelude                 hiding ( fail )\nimport           Control.Monad.Fail\n#endif\nimport Control.Monad.Fix (MonadFix)\nimport Data.Fix (\n    Fix (..),\n    foldFix,\n    foldFixM,\n )\nimport qualified Data.HashMap.Internal as HM (\n    fromList,\n    insert,\n    lookup,\n    singleton,\n )\nimport qualified Data.List.NonEmpty as NE\nimport Nix.Atoms\nimport Nix.Effects.Basic (pathToDefaultNixFile)\nimport Nix.Expr.Types\nimport Nix.Expr.Types.Annotated\nimport Nix.Frames\nimport Nix.Options (\n    Options,\n    askOptions,\n    isReduceLists,\n    isReduceSets,\n )\nimport Nix.Parser\nimport Nix.Scope\nimport System.Directory\nimport qualified Text.Show\n\nnewtype Reducer m a = Reducer\n    { runReducer ::\n        ReaderT\n            ( Maybe Path\n            , Scopes (Reducer m) NExprLoc\n            )\n            ( StateT\n                ( HashMap Path NExprLoc\n                , HashMap Text Text\n                )\n                m\n            )\n            a\n    }\n    deriving\n        ( Functor\n        , Applicative\n        , Alternative\n        , Monad\n        , MonadPlus\n        , MonadFix\n        , MonadIO\n        , MonadFail\n        , MonadReader (Maybe Path, Scopes (Reducer m) NExprLoc)\n        , MonadState (HashMap Path NExprLoc, HashMap Text Text)\n        )\n\nstaticImport ::\n    forall m.\n    ( MonadIO m\n    , Scoped NExprLoc m\n    , MonadFail m\n    , MonadReader (Maybe Path, Scopes m NExprLoc) m\n    , MonadState (HashMap Path NExprLoc, HashMap Text Text) m\n    ) =>\n    SrcSpan ->\n    Path ->\n    m NExprLoc\nstaticImport pann path =\n    do\n        mfile <- asks fst\n        path' <- liftIO $ pathToDefaultNixFile path\n        path'' <-\n            liftIO $\n                pathToDefaultNixFile\n                    =<< coerce\n                        canonicalizePath\n                        (maybe id ((</>) . takeDirectory) mfile path')\n\n        let\n            importIt :: m NExprLoc\n            importIt = do\n                liftIO $ putStrLn $ \"Importing file \" <> coerce path''\n\n                eres <- liftIO $ parseNixFileLoc path''\n                either\n                    (\\err -> fail $ \"Parse failed: \" <> show err)\n                    ( \\x -> do\n                        let\n                            pos = join (NSourcePos \"Reduce.hs\") $ (coerce . mkPos) 1\n                            span = join SrcSpan pos\n                            cur =\n                                NamedVar\n                                    (one $ StaticKey \"__cur_file\")\n                                    (NLiteralPathAnn pann path'')\n                                    pos\n                            x' = NLetAnn span (one cur) x\n                        modify $ first $ HM.insert path'' x'\n                        local\n                            (const (pure path'', mempty))\n                            $ do\n                                x'' <- foldFix reduce x'\n                                modify $ first $ HM.insert path'' x''\n                                pure x''\n                    )\n                    eres\n\n        imports <- gets fst\n        maybe\n            importIt\n            pure\n            (HM.lookup path'' imports)\n\n-- gatherNames :: NExprLoc -> HashSet VarName\n-- gatherNames = foldFix $ \\case\n--     NSymAnnF _ var -> S.singleton var\n--     AnnF _ x -> fold x\n\nreduceExpr ::\n    (MonadIO m, MonadFail m) => Maybe Path -> NExprLoc -> m NExprLoc\nreduceExpr mpath expr =\n    (`evalStateT` mempty)\n        . (`runReaderT` (mpath, mempty))\n        . runReducer\n        $ foldFix reduce expr\n\nreduce ::\n    forall m.\n    ( MonadIO m\n    , Scoped NExprLoc m\n    , MonadFail m\n    , MonadReader (Maybe Path, Scopes m NExprLoc) m\n    , MonadState (HashMap Path NExprLoc, HashMap Text Text) m\n    ) =>\n    NExprLocF (m NExprLoc) ->\n    m NExprLoc\n\n{- | Reduce the variable to its value if defined.\n  Leave it as it is otherwise.\n-}\nreduce (NSymAnnF ann var) =\n    fromMaybe (NSymAnn ann var) <$> lookupVar var\n-- \\| Reduce binary and integer negation.\nreduce (NUnaryAnnF uann op arg) =\n    do\n        x <- arg\n        pure $\n            case (op, x) of\n                (NNeg, NConstantAnn cann (NInt n)) -> NConstantAnn cann $ NInt $ negate n\n                (NNot, NConstantAnn cann (NBool b)) -> NConstantAnn cann $ NBool $ not b\n                _ -> NUnaryAnn uann op x\n\n-- \\| Reduce function applications.\n--\n--     * Reduce an import to the actual imported expression.\n--\n--     * Reduce a lambda function by adding its name to the local\n--       scope and recursively reducing its body.\nreduce (NAppAnnF bann fun arg) =\n    ( \\case\n        f@(NSymAnn _ \"import\") ->\n            ( \\case\n                -- NEnvPathAnn     pann origPath -> staticImport pann origPath\n                NLiteralPathAnn pann origPath -> staticImport pann origPath\n                v -> pure $ NAppAnn bann f v\n            )\n                =<< arg\n        NAbsAnn _ (Param name) body ->\n            do\n                x <- arg\n                pushScope\n                    (coerce $ HM.singleton name x)\n                    (foldFix reduce body)\n        f -> NAppAnn bann f <$> arg\n    )\n        =<< fun\n-- \\| Reduce an integer addition to its result.\nreduce (NBinaryAnnF bann op larg rarg) =\n    do\n        lval <- larg\n        rval <- rarg\n        pure $\n            case (op, lval, rval) of\n                (NPlus, NConstantAnn ann (NInt x), NConstantAnn _ (NInt y)) -> NConstantAnn ann $ NInt $ x + y\n                _ -> NBinaryAnn bann op lval rval\n\n-- \\| Reduce a select on a Set by substituting the set to the selected value.\n--\n-- Before applying this reduction, we need to ensure that:\n--\n--   1. The selected expr is indeed a set.\n--   2. The selection AttrPath is a list of StaticKeys.\n--   3. The selected AttrPath exists in the set.\nreduce base@(NSelectAnnF _ _ _ attrs)\n    | sAttrPath $ NE.toList attrs = do\n        (NSelectAnnF _ _ aset attrs) <- sequenceA base\n        inspectSet (unFix aset) attrs\n    | otherwise = sId\n  where\n    sId = reduceLayer base\n    -- The selection AttrPath is composed of StaticKeys.\n    sAttrPath (StaticKey _ : xs) = sAttrPath xs\n    sAttrPath [] = True\n    sAttrPath _ = False\n    -- Find appropriate bind in set's binds.\n    findBind [] _ = Nothing\n    findBind (x : xs) attrs@(a :| _) = case x of\n        n@(NamedVar (a' :| _) _ _) | a' == a -> pure n\n        _ -> findBind xs attrs\n    -- Follow the attrpath recursively in sets.\n    inspectSet (NSetAnnF _ NonRecursive binds) attrs = case findBind binds attrs of\n        Just (NamedVar _ e _) -> case NE.uncons attrs of\n            (_, Just attrs) -> inspectSet (unFix e) attrs\n            _ -> pure e\n        _ -> sId\n    inspectSet _ _ = sId\n\n-- reduce (NHasAttr aset attr) =\n\n-- \\| Reduce a set by inlining its binds outside of the set\n--   if none of the binds inherit the super set.\nreduce e@(NSetAnnF ann r binds) =\n    bool\n        -- Encountering a 'rec set' construction eliminates any hope of inlining\n        -- definitions.\n        mExprLoc\n        ( bool\n            (reduceLayer e)\n            mExprLoc\n            usesInherit\n        )\n        (r == NonRecursive)\n  where\n    mExprLoc :: m NExprLoc\n    mExprLoc =\n        clearScopes @NExprLoc $ NSetAnn ann r <$> traverse sequenceA binds\n\n    usesInherit =\n        any\n            ( \\case\n                Inherit{} -> True\n                _ -> False\n            )\n            binds\n\n-- Encountering a 'with' construction eliminates any hope of inlining\n-- definitions.\nreduce (NWithAnnF ann scope body) =\n    clearScopes @NExprLoc $ liftA2 (NWithAnn ann) scope body\n-- \\| Reduce a let binds section by pushing lambdas,\n--   constants and strings to the body scope.\nreduce (NLetAnnF ann binds body) =\n    do\n        binds' <- traverse sequenceA binds\n        body' <-\n            (`pushScope` body) . coerce . HM.fromList . catMaybes\n                =<< traverse\n                    ( \\case\n                        NamedVar (StaticKey name :| []) def _pos ->\n                            let\n                                defcase =\n                                    \\case\n                                        d@NAbsAnn{} -> pure (name, d)\n                                        d@NConstantAnn{} -> pure (name, d)\n                                        d@NStrAnn{} -> pure (name, d)\n                                        _ -> Nothing\n                             in\n                                defcase <$> def\n                        _ -> pure Nothing\n                    )\n                    binds\n\n        -- let names = gatherNames body'\n        -- binds' <- traverse sequenceA binds <&> \\b -> flip filter b $ \\case\n        --     NamedVar (StaticKey name _ :| []) _ ->\n        --         name `S.member` names\n        --     _ -> True\n        pure $ NLetAnn ann binds' body'\n-- where\n--   go m [] = pure m\n--   go m (x:xs) = case x of\n--       NamedVar (StaticKey name _ :| []) def -> do\n--           v <- pushScope m def\n--           go (M.insert name v m) xs\n--       _ -> go m xs\n\n-- \\| Reduce an if to the relevant path if\n--   the condition is a boolean constant.\nreduce e@(NIfAnnF _ b t f) =\n    ( \\case\n        NConstantAnn _ (NBool b') -> bool f t b'\n        _ -> reduceLayer e\n    )\n        =<< b\n-- \\| Reduce an assert atom to its encapsulated\n--   symbol if the assertion is a boolean constant.\nreduce e@(NAssertAnnF _ b body) =\n    ( \\case\n        NConstantAnn _ (NBool True) -> body\n        _ -> reduceLayer e\n    )\n        =<< b\nreduce (NAbsAnnF ann params body) = do\n    params' <- sequenceA params\n    -- Make sure that variable definitions in scope do not override function\n    -- arguments.\n    let\n        scope = coerce $\n            case params' of\n                Param name -> one (name, NSymAnn ann name)\n                ParamSet _ _ pset ->\n                    HM.fromList $ (\\(k, _) -> (k, NSymAnn ann k)) <$> pset\n    NAbsAnn ann params' <$> pushScope scope body\nreduce v = reduceLayer v\n\nreduceLayer :: (Traversable f1, Applicative f2) => f1 (f2 (Fix f1)) -> f2 (Fix f1)\nreduceLayer v = Fix <$> sequenceA v\n\n-- newtype FlaggedF f r = FlaggedF { flagged :: (IORef Bool, f r) }\nnewtype FlaggedF f r = FlaggedF (IORef Bool, f r)\n    deriving (Functor, Foldable, Traversable)\n\ninstance (Show (f r)) => Show (FlaggedF f r) where\n    show (FlaggedF (_, x)) = show x\n\ntype Flagged f = Fix (FlaggedF f)\n\nflagExprLoc :: (MonadIO n, Traversable f) => Fix f -> n (Flagged f)\nflagExprLoc = foldFixM $ \\x -> do\n    flag <- liftIO $ newIORef False\n    pure $ coerce (flag, x)\n\n-- stripFlags :: Functor f => Flagged f -> Fix f\n-- stripFlags = foldFix $ Fix . snd . flagged\n\npruneTree :: (MonadIO n) => Options -> Flagged NExprLocF -> n (Maybe NExprLoc)\npruneTree opts =\n    foldFixM $\n        \\(FlaggedF (b, Compose x)) ->\n            bool\n                Nothing\n                (annUnitToAnn <$> traverse prune x)\n                <$> liftIO (readIORef b)\n  where\n    prune :: NExprF (Maybe NExprLoc) -> Maybe (NExprF NExprLoc)\n    prune = \\case\n        NStr str -> pure $ NStr $ pruneString str\n        NHasAttr (Just aset) attr ->\n            pure $ NHasAttr aset $ pruneKeyName <$> attr\n        NAbs params (Just body) -> pure $ NAbs (pruneParams params) body\n        NList l ->\n            pure $\n                NList $\n                    bool\n                        (fromMaybe annNNull <$>)\n                        catMaybes\n                        (isReduceLists opts) -- Reduce list members that aren't used; breaks if elemAt is used\n                        l\n        NSet recur binds ->\n            pure $\n                NSet recur $\n                    bool\n                        (fromMaybe annNNull <<$>>)\n                        (mapMaybe sequenceA)\n                        (isReduceSets opts) -- Reduce set members that aren't used; breaks if hasAttr is used\n                        binds\n        NLet binds (Just body@(Ann _ x)) ->\n            pure $\n                handlePresence\n                    x\n                    (`NLet` body)\n                    (mapMaybe pruneBinding binds)\n        NSelect alt (Just aset) attr ->\n            pure $ NSelect (join alt) aset $ pruneKeyName <$> attr\n        -- If the function was never called, it means its argument was in a\n        -- thunk that was forced elsewhere.\n        NApp Nothing (Just _) -> Nothing\n        -- These are the only short-circuiting binary operators\n        NBinary NAnd (Just (Ann _ larg)) _ -> pure larg\n        NBinary NOr (Just (Ann _ larg)) _ -> pure larg\n        -- The idea behind emitted a binary operator where one side may be\n        -- invalid is that we're trying to emit what will reproduce whatever\n        -- fail the user encountered, which means providing all aspects of\n        -- the evaluation path they ultimately followed.\n        NBinary op Nothing (Just rarg) -> pure $ NBinary op annNNull rarg\n        NBinary op (Just larg) Nothing -> pure $ NBinary op larg annNNull\n        -- If the scope of a with was never referenced, it's not needed\n        NWith Nothing (Just (Ann _ body)) -> pure body\n        NAssert Nothing _ -> fail \"How can an assert be used, but its condition not?\"\n        NAssert _ (Just (Ann _ body)) -> pure body\n        NAssert (Just cond) _ -> pure $ NAssert cond annNNull\n        NIf Nothing _ _ -> fail \"How can an if be used, but its condition not?\"\n        NIf _ Nothing (Just (Ann _ f)) -> pure f\n        NIf _ (Just (Ann _ t)) Nothing -> pure t\n        x -> sequenceA x\n\n    pruneString :: NString (Maybe NExprLoc) -> NString NExprLoc\n    pruneString (DoubleQuoted xs) = DoubleQuoted $ mapMaybe pruneAntiquotedText xs\n    pruneString (Indented n xs) = Indented n $ mapMaybe pruneAntiquotedText xs\n\n    pruneAntiquotedText ::\n        Antiquoted Text (Maybe NExprLoc) -> Maybe (Antiquoted Text NExprLoc)\n    pruneAntiquotedText (Plain v) = pure $ Plain v\n    pruneAntiquotedText EscapedNewline = pure EscapedNewline\n    pruneAntiquotedText (Antiquoted (Just k)) = pure $ Antiquoted k\n    pruneAntiquotedText (Antiquoted Nothing) = Nothing\n\n    pruneAntiquoted ::\n        Antiquoted (NString (Maybe NExprLoc)) (Maybe NExprLoc) ->\n        Maybe (Antiquoted (NString NExprLoc) NExprLoc)\n    pruneAntiquoted (Plain v) = pure $ Plain $ pruneString v\n    pruneAntiquoted EscapedNewline = pure EscapedNewline\n    pruneAntiquoted (Antiquoted (Just k)) = pure $ Antiquoted k\n    pruneAntiquoted (Antiquoted Nothing) = Nothing\n\n    pruneKeyName :: NKeyName (Maybe NExprLoc) -> NKeyName NExprLoc\n    pruneKeyName (StaticKey n) = StaticKey n\n    pruneKeyName (DynamicKey k)\n        | Just k' <- pruneAntiquoted k = DynamicKey k'\n        | otherwise = StaticKey \"<unused?>\"\n\n    pruneParams :: Params (Maybe NExprLoc) -> Params NExprLoc\n    pruneParams (Param n) = Param n\n    pruneParams (ParamSet mname variadic pset) =\n        ParamSet mname variadic (reduceOrPassMode <$> pset)\n      where\n        reduceOrPassMode =\n            second $\n                bool\n                    fmap\n                    ((pure .) . maybe annNNull)\n                    (isReduceSets opts) -- Reduce set members that aren't used; breaks if hasAttr is used\n                    (fromMaybe annNNull)\n\n    pruneBinding :: Binding (Maybe NExprLoc) -> Maybe (Binding NExprLoc)\n    pruneBinding (NamedVar _ Nothing _) = Nothing\n    pruneBinding (NamedVar xs (Just x) pos) = pure $ NamedVar (pruneKeyName <$> xs) x pos\n    pruneBinding (Inherit _ [] _) = Nothing\n    pruneBinding (Inherit (join -> Nothing) _ _) = Nothing\n    pruneBinding (Inherit (join -> m) xs pos) = pure $ Inherit m xs pos\n\nreducingEvalExpr ::\n    (Framed e m, Has e Options, Exception r, MonadCatch m, MonadIO m) =>\n    (NExprLocF (m a) -> m a) ->\n    Maybe Path ->\n    NExprLoc ->\n    m (NExprLoc, Either r a)\nreducingEvalExpr eval mpath expr =\n    do\n        expr' <- flagExprLoc =<< liftIO (reduceExpr mpath expr)\n        eres <-\n            (`catch` pure . Left) $\n                pure <$> foldFix (addEvalFlags eval) expr'\n        opts <- askOptions\n        expr'' <- pruneTree opts expr'\n        pure (fromMaybe annNNull expr'', eres)\n  where\n    addEvalFlags k (FlaggedF (b, x)) = liftIO (writeIORef b True) *> k x\n\ninstance (Monad m) => Scoped NExprLoc (Reducer m) where\n    askScopes = askScopesReader\n    clearScopes = clearScopesReader @(Reducer m) @NExprLoc\n    pushScopes = pushScopesReader\n    lookupVar = lookupVarReader\n"
  },
  {
    "path": "src/Nix/Render/Frame.hs",
    "content": "{-# LANGUAGE AllowAmbiguousTypes #-}\n{-# LANGUAGE CPP #-}\n{-# LANGUAGE ConstraintKinds #-}\n{-# LANGUAGE MultiWayIf #-}\n{-# LANGUAGE TypeFamilies #-}\n\n-- | Code for rendering/representation of the messages packaged with their context (Frames).\nmodule Nix.Render.Frame where\n\nimport Data.Fix (Fix (..))\nimport GHC.Exception (ErrorCall)\nimport Nix.Eval hiding (addMetaInfo)\nimport Nix.Exec\nimport Nix.Expr.Types\nimport Nix.Expr.Types.Annotated\nimport Nix.Frames\nimport Nix.Normal\nimport Nix.Options\nimport Nix.Prelude hiding (Comparison)\nimport Nix.Pretty\nimport Nix.Render\nimport Nix.Thunk\nimport Nix.Value\nimport Prettyprinter hiding (list)\nimport Text.Megaparsec.Pos (sourcePosPretty)\nimport qualified Text.Show as Text\nimport qualified Text.Show.Pretty as PS\n\nrenderFrames ::\n    forall v t f e m ann.\n    ( MonadReader e m\n    , Has e Options\n    , MonadFile m\n    , MonadCitedThunks t f m\n    , Typeable v\n    ) =>\n    Frames ->\n    m (Doc ann)\nrenderFrames [] = stub\nrenderFrames xss@(x : xs) =\n    do\n        opts <- askOptions\n        let\n            verbosity :: Verbosity\n            verbosity = getVerbosity opts\n        renderedFrames <-\n            if\n                | verbosity <= ErrorsOnly -> render1 x\n                --  2021-10-22: NOTE: List reverse is completely conterproductive. `reverse` of list famously neest to traverse the whole list to take the last element\n                | verbosity <= Informational -> (foldMap renderPosition (reverse xs) <>) <$> render1 x\n                | otherwise -> foldMapM render1 (reverse xss)\n        pure $\n            handlePresence\n                mempty\n                vsep\n                renderedFrames\n  where\n    render1 :: NixFrame -> m [Doc ann1]\n    render1 = renderFrame @v @t @f\n\n    renderPosition :: NixFrame -> [Doc ann]\n    renderPosition =\n        whenJust\n            (\\pos -> one (\"While evaluating at \" <> pretty (sourcePosPretty $ toSourcePos pos) <> colon))\n            . framePos @v @m\n\nframePos ::\n    forall v (m :: Type -> Type).\n    (Typeable m, Typeable v) =>\n    NixFrame ->\n    Maybe NSourcePos\nframePos (NixFrame _ f) =\n    ( \\case\n        EvaluatingExpr _ (Ann (SrcSpan beg _) _) -> pure beg\n        _ -> Nothing\n    )\n        =<< fromException @(EvalFrame m v) f\n\nrenderFrame ::\n    forall v t f e m ann.\n    ( MonadReader e m\n    , Has e Options\n    , MonadFile m\n    , MonadCitedThunks t f m\n    , Typeable v\n    ) =>\n    NixFrame ->\n    m [Doc ann]\nrenderFrame (NixFrame level f)\n    | Just (e :: EvalFrame m v) <- fromException f = renderEvalFrame level e\n    | Just (e :: ThunkLoop) <- fromException f = renderThunkLoop level e\n    | Just (e :: ValueFrame t f m) <- fromException f = renderValueFrame level e\n    | Just (e :: NormalLoop t f m) <- fromException f = renderNormalLoop level e\n    | Just (e :: ExecFrame t f m) <- fromException f = renderExecFrame level e\n    | Just (e :: ErrorCall) <- fromException f = pure $ one $ pretty (Text.show e)\n    | Just (e :: SynHoleInfo m v) <- fromException f = pure $ one $ pretty (Text.show e)\n    | otherwise = fail $ \"Unrecognized frame: \" <> show f\n\nwrapExpr :: NExprF r -> NExpr\nwrapExpr x = Fix (Fix (NSym \"<?>\") <$ x)\n\nrenderEvalFrame ::\n    forall e m v ann.\n    (MonadReader e m, Has e Options, MonadFile m) =>\n    NixLevel ->\n    EvalFrame m v ->\n    m [Doc ann]\nrenderEvalFrame level f =\n    do\n        opts <- askOptions\n        let\n            addMetaInfo :: ([Doc ann] -> [Doc ann]) -> SrcSpan -> Doc ann -> m [Doc ann]\n            addMetaInfo trans loc = fmap (trans . one) . renderLocation loc\n\n        case f of\n            EvaluatingExpr scope e@(Ann loc _) ->\n                addMetaInfo\n                    (scopeInfo <>)\n                    loc\n                    =<< renderExpr level \"While evaluating\" \"Expression\" e\n              where\n                scopeInfo :: [Doc ann]\n                scopeInfo =\n                    one (pretty $ Text.show scope) `whenTrue` isShowScopes opts\n            ForcingExpr _scope e@(Ann loc _)\n                | isThunks opts ->\n                    addMetaInfo\n                        id\n                        loc\n                        =<< renderExpr level \"While forcing thunk from\" \"Forcing thunk\" e\n            Calling name loc ->\n                addMetaInfo\n                    id\n                    loc\n                    $ \"While calling `builtins.\" <> prettyVarName name <> \"`\"\n            SynHole synfo ->\n                sequenceA\n                    [ renderLocation loc\n                        =<< renderExpr level \"While evaluating\" \"Syntactic Hole\" e\n                    , pure $ pretty $ Text.show $ _synHoleInfo_scope synfo\n                    ]\n              where\n                e@(Ann loc _) = _synHoleInfo_expr synfo\n            ForcingExpr _ _ -> stub\n\nrenderExpr ::\n    (MonadReader e m, Has e Options, MonadFile m) =>\n    NixLevel ->\n    Text ->\n    Text ->\n    NExprLoc ->\n    m (Doc ann)\nrenderExpr _level longLabel shortLabel e@(Ann _ x) =\n    do\n        opts <- askOptions\n        let\n            verbosity :: Verbosity\n            verbosity = getVerbosity opts\n\n            expr :: NExpr\n            expr = stripAnnotation e\n\n            concise = prettyNix $ Fix $ Fix (NSym \"<?>\") <$ x\n\n            chatty =\n                bool\n                    (pretty $ PS.ppShow expr)\n                    (prettyNix expr)\n                    (verbosity == Chatty)\n\n        pure $\n            bool\n                (pretty shortLabel <> fillSep [\": \", concise])\n                (vsep [pretty (longLabel <> \":\\n>>>>>>>>\"), indent 2 chatty, \"<<<<<<<<\"])\n                (verbosity >= Chatty)\n\nrenderValueFrame ::\n    forall e t f m ann.\n    (MonadReader e m, Has e Options, MonadFile m, MonadCitedThunks t f m) =>\n    NixLevel ->\n    ValueFrame t f m ->\n    m [Doc ann]\nrenderValueFrame level =\n    fmap one . \\case\n        ForcingThunk _t -> pure \"ForcingThunk\" -- jww (2019-03-18): NYI\n        ConcerningValue _v -> pure \"ConcerningValue\"\n        Comparison _ _ -> pure \"Comparing\"\n        Addition _ _ -> pure \"Adding\"\n        Division _ _ -> pure \"Dividing\"\n        Multiplication _ _ -> pure \"Multiplying\"\n        Coercion x y ->\n            pure $\n                fold [desc, pretty (describeValue x), \" to \", pretty (describeValue y)]\n          where\n            desc =\n                bool\n                    \"While coercing \"\n                    \"Cannot coerce \"\n                    (level <= Error)\n        CoercionToJson v ->\n            (\"CoercionToJson \" <>) <$> dumbRenderValue v\n        CoercionFromJson _j -> pure \"CoercionFromJson\"\n        Expectation t v ->\n            (msg <>) <$> dumbRenderValue v\n          where\n            msg = \"Expected \" <> pretty (describeValue t) <> \", but saw \"\n\n--  2021-10-28: NOTE: notice it ignores `level`, `longlabel` & `shortlabel`, to underline that `dumbRenderValue` synonym was created\nrenderValue ::\n    forall e t f m ann.\n    (MonadReader e m, Has e Options, MonadFile m, MonadCitedThunks t f m) =>\n    NixLevel ->\n    Text ->\n    Text ->\n    NValue t f m ->\n    m (Doc ann)\nrenderValue _level _longLabel _shortLabel v =\n    do\n        opts <- askOptions\n        bool\n            prettyNValue\n            prettyNValueProv\n            (isValues opts)\n            <$> removeEffects v\n\ndumbRenderValue ::\n    forall e t f m ann.\n    (MonadReader e m, Has e Options, MonadFile m, MonadCitedThunks t f m) =>\n    (NValue t f m -> m (Doc ann))\ndumbRenderValue = renderValue Info mempty mempty\n\nrenderExecFrame ::\n    (MonadReader e m, Has e Options, MonadFile m, MonadCitedThunks t f m) =>\n    NixLevel ->\n    ExecFrame t f m ->\n    m [Doc ann]\nrenderExecFrame _level (Assertion ann v) =\n    fmap\n        one\n        $ renderLocation ann . fillSep . on (<>) one \"Assertion failed:\" =<< dumbRenderValue v\n\nrenderThunkLoop ::\n    (MonadReader e m, Has e Options, MonadFile m, Show (ThunkId m)) =>\n    NixLevel ->\n    ThunkLoop ->\n    m [Doc ann]\nrenderThunkLoop _level (ThunkLoop n) =\n    pure . one . pretty $ \"Infinite recursion in thunk \" <> n\n\nrenderNormalLoop ::\n    (MonadReader e m, Has e Options, MonadFile m, MonadCitedThunks t f m) =>\n    NixLevel ->\n    NormalLoop t f m ->\n    m [Doc ann]\nrenderNormalLoop _level (NormalLoop v) =\n    one . (\"Infinite recursion during normalization forcing \" <>) <$> dumbRenderValue v\n"
  },
  {
    "path": "src/Nix/Render.hs",
    "content": "{-# LANGUAGE CPP #-}\n{-# LANGUAGE ConstraintKinds #-}\n{-# LANGUAGE DefaultSignatures #-}\n{-# LANGUAGE MultiWayIf #-}\n{-# LANGUAGE TypeFamilies #-}\n{-# LANGUAGE TypeOperators #-}\n{-# LANGUAGE UndecidableInstances #-}\n\nmodule Nix.Render where\n\nimport qualified Data.Set as Set\nimport qualified Data.Text as Text\nimport Nix.Expr.Types (\n    NPos (..),\n    NSourcePos (..),\n )\nimport Nix.Expr.Types.Annotated\nimport Nix.Prelude\nimport Nix.Utils.Fix1 (\n    Fix1T,\n    MonadFix1T,\n )\nimport Prettyprinter\nimport qualified System.Directory as S\nimport qualified System.PosixCompat.Files as S\nimport Text.Megaparsec.Error\nimport Text.Megaparsec.Pos\n\nclass (MonadFail m, MonadIO m) => MonadFile m where\n    readFile :: Path -> m Text\n    default readFile :: (MonadTrans t, MonadIO m', MonadFile m', m ~ t m') => Path -> m Text\n    readFile = liftIO . Nix.Prelude.readFile\n    listDirectory :: Path -> m [Path]\n    default listDirectory :: (MonadTrans t, MonadFile m', m ~ t m') => Path -> m [Path]\n    listDirectory = lift . listDirectory\n    getCurrentDirectory :: m Path\n    default getCurrentDirectory :: (MonadTrans t, MonadFile m', m ~ t m') => m Path\n    getCurrentDirectory = lift getCurrentDirectory\n    canonicalizePath :: Path -> m Path\n    default canonicalizePath :: (MonadTrans t, MonadFile m', m ~ t m') => Path -> m Path\n    canonicalizePath = lift . canonicalizePath\n    getHomeDirectory :: m Path\n    default getHomeDirectory :: (MonadTrans t, MonadFile m', m ~ t m') => m Path\n    getHomeDirectory = lift getHomeDirectory\n    doesPathExist :: Path -> m Bool\n    default doesPathExist :: (MonadTrans t, MonadFile m', m ~ t m') => Path -> m Bool\n    doesPathExist = lift . doesPathExist\n    doesFileExist :: Path -> m Bool\n    default doesFileExist :: (MonadTrans t, MonadFile m', m ~ t m') => Path -> m Bool\n    doesFileExist = lift . doesFileExist\n    doesDirectoryExist :: Path -> m Bool\n    default doesDirectoryExist :: (MonadTrans t, MonadFile m', m ~ t m') => Path -> m Bool\n    doesDirectoryExist = lift . doesDirectoryExist\n    getSymbolicLinkStatus :: Path -> m S.FileStatus\n    default getSymbolicLinkStatus :: (MonadTrans t, MonadFile m', m ~ t m') => Path -> m S.FileStatus\n    getSymbolicLinkStatus = lift . getSymbolicLinkStatus\n\ninstance MonadFile IO where\n    readFile = Nix.Prelude.readFile\n    listDirectory = coerce S.listDirectory\n    getCurrentDirectory = coerce S.getCurrentDirectory\n    canonicalizePath = coerce S.canonicalizePath\n    getHomeDirectory = coerce S.getHomeDirectory\n    doesPathExist = coerce S.doesPathExist\n    doesFileExist = coerce S.doesFileExist\n    doesDirectoryExist = coerce S.doesDirectoryExist\n    getSymbolicLinkStatus = coerce S.getSymbolicLinkStatus\n\ninstance (MonadFix1T t m, MonadIO (Fix1T t m), MonadFail (Fix1T t m), MonadFile m) => MonadFile (Fix1T t m)\n\nposAndMsg :: NSourcePos -> Doc a -> ParseError s Void\nposAndMsg (NSourcePos _ (coerce -> lineNo) _) msg =\n    FancyError\n        (unPos lineNo)\n        (Set.fromList $ one (ErrorFail (show msg) :: ErrorFancy Void))\n\nrenderLocation :: (MonadFile m) => SrcSpan -> Doc a -> m (Doc a)\nrenderLocation (SrcSpan (NSourcePos file (coerce -> begLine) (coerce -> begCol)) (NSourcePos file' (coerce -> endLine) (coerce -> endCol))) msg\n    | file == file' && file == \"<string>\" && begLine == endLine =\n        pure $ \"In raw input string at position \" <> pretty (unPos begCol)\n    | file /= \"<string>\" && file == file' =\n        bool\n            (pure msg)\n            ( do\n                txt <- sourceContext file begLine begCol endLine endCol msg\n                pure $\n                    vsep\n                        [ \"In file \" <> errorContext file begLine begCol endLine endCol <> \":\"\n                        , txt\n                        ]\n            )\n            =<< doesFileExist file\nrenderLocation (SrcSpan beg end) msg = fail $ \"Don't know how to render range from \" <> show beg <> \" to \" <> show end <> \" for fail: \" <> show msg\n\nerrorContext :: Path -> Pos -> Pos -> Pos -> Pos -> Doc a\nerrorContext (coerce @Path @FilePath -> path) bl bc _el _ec =\n    pretty path <> \":\" <> pretty (unPos bl) <> \":\" <> pretty (unPos bc)\n\nsourceContext ::\n    (MonadFile m) => Path -> Pos -> Pos -> Pos -> Pos -> Doc a -> m (Doc a)\nsourceContext path (unPos -> begLine) (unPos -> _begCol) (unPos -> endLine) (unPos -> _endCol) msg =\n    do\n        let beg' = max 1 $ begLine - 3\n            end' = endLine + 3\n        ls <-\n            fmap pretty\n                . take (end' - beg')\n                . drop (pred beg')\n                . lines\n                <$> Nix.Render.readFile path\n        let\n            longest = Text.length $ show $ beg' + length ls - 1\n            pad :: Int -> Text\n            pad n =\n                let\n                    ns :: Text\n                    ns = show n\n                    nsp = Text.replicate (longest - Text.length ns) \" \" <> ns\n                 in\n                    if\n                        | n == begLine && n == endLine -> \"==> \" <> nsp <> \" |  \"\n                        | n >= begLine && n <= endLine -> \"  > \" <> nsp <> \" |  \"\n                        | otherwise -> \"    \" <> nsp <> \" |  \"\n            composeLine n l =\n                one (pretty (pad n) <> l)\n                    <> whenTrue\n                        ( one $\n                            pretty $\n                                Text.replicate (Text.length (pad n) - 3) \" \"\n                                    <> \"|\"\n                                    <> Text.replicate (_begCol + 1) \" \"\n                                    <> Text.replicate (_endCol - _begCol) \"^\"\n                        )\n                        (begLine == endLine && n == endLine)\n            -- XXX: Consider inserting the message here when it is small enough.\n            -- ATM some messages are so huge that they take prevalence over the source listing.\n            -- ++ [ indent (length $ pad n) msg | n == endLine ]\n\n            ls' = fold $ zipWith composeLine [beg' ..] ls\n\n        pure $ vsep $ ls' <> one (indent (Text.length $ pad begLine) msg)\n"
  },
  {
    "path": "src/Nix/Scope.hs",
    "content": "{-# LANGUAGE AllowAmbiguousTypes #-}\n{-# LANGUAGE ConstraintKinds #-}\n{-# LANGUAGE FunctionalDependencies #-}\n{-# LANGUAGE GeneralizedNewtypeDeriving #-}\n{-# LANGUAGE UndecidableInstances #-}\n\nmodule Nix.Scope where\n\nimport qualified Data.HashMap.Lazy as M\nimport Lens.Family2\nimport Nix.Expr.Types\nimport Nix.Prelude\nimport qualified Text.Show\n\n--  2021-07-19: NOTE: Scopes can gain from sequentiality, HashMap (aka AttrSet) may not be proper to it.\nnewtype Scope a = Scope (AttrSet a)\n    deriving\n        ( Eq\n        , Ord\n        , Generic\n        , Typeable\n        , NFData\n        , Read\n        , Hashable\n        , Semigroup\n        , Monoid\n        , Functor\n        , Foldable\n        , Traversable\n        , One\n        )\n\ninstance Show (Scope a) where\n    show (Scope m) = show $ M.keys m\n\nscopeLookup :: VarName -> [Scope a] -> Maybe a\nscopeLookup key = foldr fun Nothing\n  where\n    fun ::\n        Scope a ->\n        Maybe a ->\n        Maybe a\n    fun (Scope m) rest = M.lookup key m <|> rest\n\ndata Scopes m a\n    = Scopes\n    { lexicalScopes :: [Scope a]\n    , dynamicScopes :: [m (Scope a)]\n    }\n\ninstance Show (Scopes m a) where\n    show (Scopes m a) =\n        \"Scopes: \" <> show m <> \", and \" <> show (length a) <> \" with-scopes\"\n\ninstance Semigroup (Scopes m a) where\n    Scopes ls lw <> Scopes rs rw = Scopes (ls <> rs) (lw <> rw)\n\ninstance Monoid (Scopes m a) where\n    mempty = emptyScopes\n\nemptyScopes :: Scopes m a\nemptyScopes = Scopes mempty mempty\n\nclass Scoped a m | m -> a where\n    askScopes :: m (Scopes m a)\n    clearScopes :: m r -> m r\n    pushScopes :: Scopes m a -> m r -> m r\n    lookupVar :: VarName -> m (Maybe a)\n\naskScopesReader ::\n    forall m a e.\n    ( MonadReader e m\n    , Has e (Scopes m a)\n    ) =>\n    m (Scopes m a)\naskScopesReader = askLocal\n\nclearScopesReader ::\n    forall m a e r.\n    ( MonadReader e m\n    , Has e (Scopes m a)\n    ) =>\n    m r ->\n    m r\nclearScopesReader = local $ set hasLens $ emptyScopes @m @a\n\npushScope ::\n    (Scoped a m) =>\n    Scope a ->\n    m r ->\n    m r\npushScope scope = pushScopes $ Scopes (one scope) mempty\n\npushWeakScope ::\n    ( Functor m\n    , Scoped a m\n    ) =>\n    m (Scope a) ->\n    m r ->\n    m r\npushWeakScope scope = pushScopes $ Scopes mempty $ one scope\n\npushScopesReader ::\n    ( MonadReader e m\n    , Has e (Scopes m a)\n    ) =>\n    Scopes m a ->\n    m r ->\n    m r\npushScopesReader s = local $ over hasLens (s <>)\n\nlookupVarReader ::\n    forall m a e.\n    ( MonadReader e m\n    , Has e (Scopes m a)\n    ) =>\n    VarName ->\n    m (Maybe a)\nlookupVarReader k =\n    do\n        mres <- asks $ scopeLookup k . lexicalScopes @m . view hasLens\n\n        maybe\n            ( do\n                ws <- asks $ dynamicScopes . view hasLens\n\n                foldr\n                    ( \\weakscope rest ->\n                        do\n                            mres' <- M.lookup k . coerce @(Scope a) <$> weakscope\n\n                            maybe\n                                rest\n                                (pure . pure)\n                                mres'\n                    )\n                    (pure Nothing)\n                    ws\n            )\n            (pure . pure)\n            mres\n\nwithScopes ::\n    (Scoped a m) =>\n    Scopes m a ->\n    m r ->\n    m r\nwithScopes scopes = clearScopes . pushScopes scopes\n"
  },
  {
    "path": "src/Nix/Standard.hs",
    "content": "{-# LANGUAGE CPP #-}\n{-# LANGUAGE GeneralizedNewtypeDeriving #-}\n{-# LANGUAGE TypeFamilies #-}\n{-# LANGUAGE UndecidableInstances #-}\n{-# OPTIONS_GHC -Wno-orphans #-}\n\nmodule Nix.Standard where\n\nimport Control.Comonad (Comonad)\nimport Control.Comonad.Env (ComonadEnv)\nimport Control.Monad.Catch (\n    MonadCatch,\n    MonadMask,\n    MonadThrow,\n )\nimport Nix.Prelude\n#if !MIN_VERSION_base(4,13,0)\nimport           Control.Monad.Fail             ( MonadFail )\n#endif\nimport Control.Monad.Fix (MonadFix)\nimport Control.Monad.Free (Free (Free))\nimport Control.Monad.Ref (\n    MonadAtomicRef,\n    MonadRef (newRef),\n )\nimport Nix.Cited\nimport Nix.Cited.Basic\nimport Nix.Context\nimport Nix.Effects\nimport Nix.Effects.Basic\nimport Nix.Effects.Derivation\nimport Nix.Expr.Types.Annotated\nimport Nix.Fresh\nimport Nix.Fresh.Basic\nimport Nix.Options\nimport Nix.Render\nimport Nix.Scope\nimport Nix.Thunk\nimport Nix.Thunk.Basic\nimport Nix.Utils.Fix1 (Fix1T (Fix1T))\nimport Nix.Value\nimport Nix.Value.Monad\nimport qualified Text.Show\n\nnewtype StdCited m a\n    = StdCited\n        (Cited (StdThunk m) (StdCited m) m a)\n    deriving\n        ( Generic\n        , Typeable\n        , Functor\n        , Applicative\n        , Comonad\n        , ComonadEnv [Provenance m (StdValue m)]\n        , Foldable\n        , Traversable\n        )\n\nnewtype StdThunk m\n    = StdThunk\n        (StdCited m (NThunkF m (StdValue m)))\ntype StdValue' m = NValue' (StdThunk m) (StdCited m) m (StdValue m)\ntype StdValue m = NValue (StdThunk m) (StdCited m) m\ntype StandardIO = StandardT (StdIdT IO)\ntype StdVal = StdValue StandardIO\ntype StdThun = StdThunk StandardIO\ntype StdIO = StandardIO ()\n\n{- | Type alias:\n\n> Cited (StdThunk m) (StdCited m) m (NThunkF m (StdValue m))\n-}\ntype CitedStdThunk m = Cited (StdThunk m) (StdCited m) m (NThunkF m (StdValue m))\n\ninstance Show (StdThunk m) where\n    show _ = toString thunkStubText\n\ninstance HasCitations1 m (StdValue m) (StdCited m) where\n    citations1 (StdCited c) = citations1 c\n    addProvenance1 x (StdCited c) = StdCited $ addProvenance1 x c\n\ninstance HasCitations m (StdValue m) (StdThunk m) where\n    citations (StdThunk c) = citations1 c\n    addProvenance x (StdThunk c) = StdThunk $ addProvenance1 x c\n\ninstance (MonadReader (Context m (StdValue m)) m) => Scoped (StdValue m) m where\n    askScopes = askScopesReader\n    clearScopes = clearScopesReader @m @(StdValue m)\n    pushScopes = pushScopesReader\n    lookupVar = lookupVarReader\n\ninstance\n    ( MonadFix m\n    , MonadFile m\n    , MonadCatch m\n    , MonadEnv m\n    , MonadPaths m\n    , MonadExec m\n    , MonadHttp m\n    , MonadInstantiate m\n    , MonadIntrospect m\n    , MonadPlus m\n    , MonadPutStr m\n    , MonadStore m\n    , MonadAtomicRef m\n    , Typeable m\n    , Scoped (StdValue m) m\n    , MonadReader (Context m (StdValue m)) m\n    , MonadState (HashMap Path NExprLoc, HashMap Text Text) m\n    , MonadDataErrorContext (StdThunk m) (StdCited m) m\n    , MonadThunk (StdThunk m) m (StdValue m)\n    , MonadValue (StdValue m) m\n    ) =>\n    MonadEffects (StdThunk m) (StdCited m) m\n    where\n    toAbsolutePath = defaultToAbsolutePath\n    findEnvPath = defaultFindEnvPath\n    findPath = defaultFindPath\n    importPath = defaultImportPath\n    pathToDefaultNix = defaultPathToDefaultNix\n    derivationStrict = defaultDerivationStrict\n    traceEffect = defaultTraceEffect\n\n-- 2021-07-24:\n-- This instance currently is to satisfy @MonadThunk@ requirements for @normalForm@ function.\n-- As it is seen from the instance - it does superficial type class jump.\n-- It is just a type boundary for thunking.\ninstance\n    ( Typeable m\n    , MonadThunkId m\n    , MonadAtomicRef m\n    , MonadCatch m\n    , MonadReader (Context m (StdValue m)) m\n    ) =>\n    MonadThunk (StdThunk m) m (StdValue m)\n    where\n    thunkId ::\n        StdThunk m ->\n        ThunkId m\n    thunkId = thunkId @(CitedStdThunk m) . coerce\n    {-# INLINE thunkId #-}\n\n    thunk ::\n        m (StdValue m) ->\n        m (StdThunk m)\n    thunk = fmap coerce . thunk @(CitedStdThunk m)\n    {-# INLINE thunk #-}\n\n    query ::\n        m (StdValue m) ->\n        StdThunk m ->\n        m (StdValue m)\n    query b = query @(CitedStdThunk m) b . coerce\n    {-# INLINE query #-}\n\n    force ::\n        StdThunk m ->\n        m (StdValue m)\n    force = force @(CitedStdThunk m) . coerce\n    {-# INLINE force #-}\n\n    forceEff ::\n        StdThunk m ->\n        m (StdValue m)\n    forceEff = forceEff @(CitedStdThunk m) . coerce\n    {-# INLINE forceEff #-}\n\n    further ::\n        StdThunk m ->\n        m (StdThunk m)\n    further = fmap coerce . further @(CitedStdThunk m) . coerce\n    {-# INLINE further #-}\n\n-- * @instance MonadThunkF@ (Kleisli functor HOFs)\n\n-- | This is a functorized version in CPS.\n\n-- Please do not use MonadThunkF instances to define MonadThunk. as MonadThunk uses specialized functions.\ninstance\n    ( Typeable m\n    , MonadThunkId m\n    , MonadAtomicRef m\n    , MonadCatch m\n    , MonadReader (Context m (StdValue m)) m\n    ) =>\n    MonadThunkF (StdThunk m) m (StdValue m)\n    where\n    queryF ::\n        ( StdValue m ->\n          m r\n        ) ->\n        m r ->\n        StdThunk m ->\n        m r\n    queryF k b = queryF @(CitedStdThunk m) k b . coerce\n\n    forceF ::\n        ( StdValue m ->\n          m r\n        ) ->\n        StdThunk m ->\n        m r\n    forceF k = forceF @(CitedStdThunk m) k . coerce\n\n    forceEffF ::\n        ( StdValue m ->\n          m r\n        ) ->\n        StdThunk m ->\n        m r\n    forceEffF k = forceEffF @(CitedStdThunk m) k . coerce\n\n    furtherF ::\n        ( m (StdValue m) ->\n          m (StdValue m)\n        ) ->\n        StdThunk m ->\n        m (StdThunk m)\n    furtherF k = fmap coerce . furtherF @(CitedStdThunk m) k . coerce\n\n-- * @instance MonadValue (StdValue m) m@\n\ninstance\n    ( MonadAtomicRef m\n    , MonadCatch m\n    , Typeable m\n    , MonadReader (Context m (StdValue m)) m\n    , MonadThunkId m\n    ) =>\n    MonadValue (StdValue m) m\n    where\n    defer ::\n        m (StdValue m) ->\n        m (StdValue m)\n    defer = fmap (pure . coerce) . thunk @(CitedStdThunk m)\n\n    demand ::\n        StdValue m ->\n        m (StdValue m)\n    demand = go -- lock to ensure no type class jumps.\n      where\n        go :: StdValue m -> m (StdValue m)\n        go =\n            free\n                (go <=< force @(CitedStdThunk m) . coerce)\n                (pure . Free)\n\n    inform ::\n        StdValue m ->\n        m (StdValue m)\n    inform = go -- lock to ensure no type class jumps.\n      where\n        go :: StdValue m -> m (StdValue m)\n        go =\n            free\n                ((pure . coerce <$>) . (further @(CitedStdThunk m) . coerce))\n                ((Free <$>) . bindNValue' id go)\n\n-- * @instance MonadValueF (StdValue m) m@\n\ninstance\n    ( MonadAtomicRef m\n    , MonadCatch m\n    , Typeable m\n    , MonadReader (Context m (StdValue m)) m\n    , MonadThunkId m\n    ) =>\n    MonadValueF (StdValue m) m\n    where\n    demandF ::\n        ( StdValue m ->\n          m r\n        ) ->\n        StdValue m ->\n        m r\n    demandF f = f <=< demand\n\n    informF ::\n        ( m (StdValue m) ->\n          m (StdValue m)\n        ) ->\n        StdValue m ->\n        m (StdValue m)\n    informF f = f . inform\n\n{------------------------------------------------------------------------}\n\n-- jww (2019-03-22): NYI\n-- whileForcingThunk\n--   :: forall t f m s e r . (Exception s, Convertible e t f m) => s -> m r -> m r\n-- whileForcingThunk frame =\n--   withFrame Debug (ForcingThunk @t @f @m) . withFrame Debug frame\n\nnewtype StandardTF r m a\n    = StandardTF\n        ( ReaderT\n            (Context r (StdValue r))\n            (StateT (HashMap Path NExprLoc, HashMap Text Text) m)\n            a\n        )\n    deriving\n        ( Functor\n        , Applicative\n        , Alternative\n        , Monad\n        , MonadFail\n        , MonadPlus\n        , MonadFix\n        , MonadIO\n        , MonadCatch\n        , MonadThrow\n        , MonadMask\n        , MonadReader (Context r (StdValue r))\n        , MonadState (HashMap Path NExprLoc, HashMap Text Text)\n        )\n\ninstance MonadTrans (StandardTF r) where\n    lift = StandardTF . lift . lift\n    {-# INLINE lift #-}\n\ninstance\n    (MonadPutStr r, MonadPutStr m) =>\n    MonadPutStr (StandardTF r m)\ninstance\n    (MonadHttp r, MonadHttp m) =>\n    MonadHttp (StandardTF r m)\ninstance\n    (MonadEnv r, MonadEnv m) =>\n    MonadEnv (StandardTF r m)\ninstance\n    (MonadPaths r, MonadPaths m) =>\n    MonadPaths (StandardTF r m)\ninstance\n    (MonadInstantiate r, MonadInstantiate m) =>\n    MonadInstantiate (StandardTF r m)\ninstance\n    (MonadExec r, MonadExec m) =>\n    MonadExec (StandardTF r m)\ninstance\n    (MonadIntrospect r, MonadIntrospect m) =>\n    MonadIntrospect (StandardTF r m)\n\n---------------------------------------------------------------------------------\n\ntype StandardT m = Fix1T StandardTF m\n\ninstance MonadTrans (Fix1T StandardTF) where\n    lift = Fix1T . lift\n    {-# INLINE lift #-}\n\ninstance\n    (MonadThunkId m) =>\n    MonadThunkId (StandardT m)\n    where\n    type ThunkId (StandardT m) = ThunkId m\n\nmkStandardT ::\n    ReaderT\n        (Context (StandardT m) (StdValue (StandardT m)))\n        (StateT (HashMap Path NExprLoc, HashMap Text Text) m)\n        a ->\n    StandardT m a\nmkStandardT = coerce\n\nrunStandardT ::\n    StandardT m a ->\n    ReaderT\n        (Context (StandardT m) (StdValue (StandardT m)))\n        (StateT (HashMap Path NExprLoc, HashMap Text Text) m)\n        a\nrunStandardT = coerce\n\nrunWithBasicEffects ::\n    (MonadIO m, MonadAtomicRef m) =>\n    Options ->\n    StandardT (StdIdT m) a ->\n    m a\nrunWithBasicEffects opts =\n    fun . (`evalStateT` mempty) . (`runReaderT` newContext opts) . runStandardT\n  where\n    fun action =\n        runFreshIdT action =<< newRef (1 :: Int)\n\nrunWithBasicEffectsIO :: Options -> StandardIO a -> IO a\nrunWithBasicEffectsIO = runWithBasicEffects\n"
  },
  {
    "path": "src/Nix/String/Coerce.hs",
    "content": "{-# LANGUAGE CPP #-}\n\nmodule Nix.String.Coerce where\n\nimport Control.Monad.Catch (MonadThrow)\nimport qualified Data.HashMap.Lazy as M\nimport GHC.Exception (ErrorCall (ErrorCall))\nimport Nix.Atoms\nimport Nix.Effects\nimport Nix.Expr.Types (VarName)\nimport Nix.Frames\nimport Nix.Prelude\nimport Nix.String\nimport Nix.Value\nimport Nix.Value.Monad\n\n#ifdef MIN_VERSION_ghc_datasize\nimport           GHC.DataSize\n#endif\n\n-- | Data type to avoid boolean blindness on what used to be called coerceMore\ndata CoercionLevel\n    = -- | Coerce only stringlike types: strings, paths\n      CoerceStringlike\n    | -- | Coerce everything but functions\n      CoerceAny\n    deriving (Eq, Ord, Enum, Bounded)\n\n-- | Data type to avoid boolean blindness on what used to be called copyToStore\ndata CopyToStoreMode\n    = -- | Add paths to the store as they are encountered\n      CopyToStore\n    | -- | Add paths to the store as they are encountered\n      DontCopyToStore\n    deriving (Eq, Ord, Enum, Bounded)\n\n--  2021-10-30: NOTE: This seems like metafunction that really is a bunch of functions thrown together.\n-- Both code blocks are `\\case` - which means they can be or 2 functions, or just as well can be one `\\case` that goes through all of them and does not require a `CoercionLevel`. Use of function shows that - the `CoercionLevel` not once was used polymorphically.\n-- Also `CopyToStoreMode` acts only in case of `NVPath` - that is a separate function\ncoerceToString ::\n    forall e t f m.\n    ( Framed e m\n    , MonadStore m\n    , MonadThrow m\n    , MonadDataErrorContext t f m\n    , MonadValue (NValue t f m) m\n    ) =>\n    (NValue t f m -> NValue t f m -> m (NValue t f m)) ->\n    CopyToStoreMode ->\n    CoercionLevel ->\n    NValue t f m ->\n    m NixString\ncoerceToString call ctsm clevel =\n    bool\n        (coerceAnyToNixString call ctsm)\n        (coerceStringlikeToNixString ctsm)\n        (clevel == CoerceStringlike)\n\ncoerceAnyToNixString ::\n    forall e t f m.\n    ( Framed e m\n    , MonadStore m\n    , MonadThrow m\n    , MonadDataErrorContext t f m\n    , MonadValue (NValue t f m) m\n    ) =>\n    (NValue t f m -> NValue t f m -> m (NValue t f m)) ->\n    CopyToStoreMode ->\n    NValue t f m ->\n    m NixString\ncoerceAnyToNixString call ctsm = go\n  where\n    go :: NValue t f m -> m NixString\n    go x =\n        coerceAny =<< demand x\n      where\n        coerceAny :: NValue t f m -> m NixString\n        coerceAny =\n            \\case\n                -- TODO Return a singleton for \"\" and \"1\"\n                NVConstant (NBool b) ->\n                    castToNixString $ \"1\" `whenTrue` b\n                NVConstant (NInt n) ->\n                    castToNixString $ show n\n                NVConstant (NFloat n) ->\n                    castToNixString $ show n\n                NVConstant NNull ->\n                    castToNixString mempty\n                NVList l ->\n                    nixStringUnwords <$> traverse go l\n                v@(NVSet _ s) ->\n                    fromMaybe\n                        (err v)\n                        $ continueOnKey (`call` v) \"__toString\"\n                            <|> continueOnKey pure \"outPath\"\n                  where\n                    continueOnKey :: (NValue t f m -> m (NValue t f m)) -> VarName -> Maybe (m NixString)\n                    continueOnKey f = fmap (go <=< f) . (`M.lookup` s)\n                    err v' = throwError $ ErrorCall $ \"Expected a Set that has `__toString` or `outpath`, but saw: \" <> show v'\n                v -> coerceStringlike v\n          where\n            castToNixString = pure . mkNixStringWithoutContext\n\n            nixStringUnwords = intercalateNixString $ mkNixStringWithoutContext \" \"\n\n        coerceStringlike :: NValue t f m -> m NixString\n        coerceStringlike = coerceStringlikeToNixString ctsm\n\ncoerceStringlikeToNixString ::\n    forall e t f m.\n    ( Framed e m\n    , MonadStore m\n    , MonadThrow m\n    , MonadDataErrorContext t f m\n    , MonadValue (NValue t f m) m\n    ) =>\n    CopyToStoreMode ->\n    NValue t f m ->\n    m NixString\ncoerceStringlikeToNixString ctsm =\n    ( \\case\n        NVStr ns -> pure ns\n        NVPath p -> coercePathToNixString ctsm p\n        v -> throwError $ ErrorCall $ \"Expected a path or string, but saw: \" <> show v\n    )\n        <=< demand\n\n{- | Convert @Path@ into @NixString@.\nWith an additional option to store the resolved path into Nix Store.\n-}\ncoercePathToNixString :: (MonadStore m, Framed e m) => CopyToStoreMode -> Path -> m NixString\ncoercePathToNixString =\n    bool\n        (pure . mkNixStringWithoutContext . fromString . coerce)\n        ((storePathToNixString <$>) . addPath)\n        . (CopyToStore ==)\n  where\n    storePathToNixString :: StorePath -> NixString\n    storePathToNixString (fromString . coerce -> sp) =\n        (mkNixStringWithSingletonContext . StringContext DirectPath) sp sp\n"
  },
  {
    "path": "src/Nix/String.hs",
    "content": "{-# LANGUAGE GeneralizedNewtypeDeriving #-}\n\nmodule Nix.String (\n    NixString,\n    getStringContext,\n    mkNixString,\n    StringContext (..),\n    ContextFlavor (..),\n    NixLikeContext (..),\n    NixLikeContextValue (..),\n    toNixLikeContext,\n    fromNixLikeContext,\n    hasContext,\n    intercalateNixString,\n    getStringNoContext,\n    ignoreContext,\n    mkNixStringWithoutContext,\n    mkNixStringWithSingletonContext,\n    modifyNixContents,\n    WithStringContext,\n    WithStringContextT (..),\n    extractNixString,\n    addStringContext,\n    addSingletonStringContext,\n    runWithStringContextT,\n    runWithStringContextT',\n    runWithStringContext,\n    runWithStringContext',\n)\nwhere\n\nimport Control.Monad.Writer (MonadWriter (tell), WriterT (..))\nimport qualified Data.HashMap.Lazy as M\nimport qualified Data.HashSet as S\nimport qualified Data.Text as Text\nimport Nix.Expr.Types (\n    AttrSet,\n    VarName (..),\n )\nimport Nix.Prelude hiding (TVar, Type)\n\n-- * Types\n\n-- ** Context\n\n-- | A Nix 'StringContext' ...\ndata StringContext\n    = StringContext\n    { getStringContextFlavor :: !ContextFlavor\n    , getStringContextPath :: !VarName\n    }\n    deriving (Eq, Ord, Show, Generic)\n\ninstance Hashable StringContext\n\n-- | A 'ContextFlavor' describes the sum of possible derivations for string contexts\ndata ContextFlavor\n    = DirectPath\n    | AllOutputs\n    | DerivationOutput !Text\n    deriving (Show, Eq, Ord, Generic)\n\ninstance Hashable ContextFlavor\n\nnewtype NixLikeContext\n    = NixLikeContext\n    { getNixLikeContext :: AttrSet NixLikeContextValue\n    }\n    deriving (Eq, Ord, Show, Generic)\n\ndata NixLikeContextValue\n    = NixLikeContextValue\n    { nlcvPath :: !Bool\n    , nlcvAllOutputs :: !Bool\n    , nlcvOutputs :: ![Text]\n    }\n    deriving (Show, Eq, Ord, Generic)\n\ninstance Semigroup NixLikeContextValue where\n    a <> b =\n        NixLikeContextValue\n            { nlcvPath = nlcvPath a || nlcvPath b\n            , nlcvAllOutputs = nlcvAllOutputs a || nlcvAllOutputs b\n            , nlcvOutputs = nlcvOutputs a <> nlcvOutputs b\n            }\n\ninstance Monoid NixLikeContextValue where\n    mempty = NixLikeContextValue False False mempty\n\n-- ** StringContext accumulator\n\n-- | A monad for accumulating string context while producing a result string.\nnewtype WithStringContextT m a\n    = WithStringContextT\n        (WriterT (S.HashSet StringContext) m a)\n    deriving (Functor, Applicative, Monad, MonadTrans, MonadWriter (S.HashSet StringContext))\n\ntype WithStringContext = WithStringContextT Identity\n\n-- ** NixString\n\ndata NixString\n    = NixString\n    { getStringContext :: !(S.HashSet StringContext)\n    , getStringContent :: !Text\n    }\n    deriving (Eq, Ord, Show, Generic)\n\ninstance Semigroup NixString where\n    NixString s1 t1 <> NixString s2 t2 = NixString (s1 <> s2) (t1 <> t2)\n\ninstance Monoid NixString where\n    mempty = NixString mempty mempty\n\ninstance Hashable NixString\n\n-- * Functions\n\n-- ** Makers\n\n-- | Constructs NixString without a context\nmkNixStringWithoutContext :: Text -> NixString\nmkNixStringWithoutContext = NixString mempty\n\n-- | Create NixString using a singleton context\nmkNixStringWithSingletonContext ::\n    StringContext -> VarName -> NixString\nmkNixStringWithSingletonContext c s = NixString (one c) (coerce @VarName @Text s)\n\n-- | Create NixString from a Text and context\nmkNixString ::\n    S.HashSet StringContext -> Text -> NixString\nmkNixString = NixString\n\n-- ** Checkers\n\n-- | Returns True if the NixString has an associated context\nhasContext :: NixString -> Bool\nhasContext (NixString c _) = isPresent c\n\n-- ** Getters\n\nfromNixLikeContext :: NixLikeContext -> S.HashSet StringContext\nfromNixLikeContext =\n    S.fromList . (uncurry toStringContexts <=< M.toList . getNixLikeContext)\n\n-- | Extract the string contents from a NixString that has no context\ngetStringNoContext :: NixString -> Maybe Text\ngetStringNoContext (NixString c s)\n    | null c = pure s\n    | otherwise = mempty\n\n-- | Extract the string contents from a NixString even if the NixString has an associated context\nignoreContext :: NixString -> Text\nignoreContext (NixString _ s) = s\n\n-- | Get the contents of a 'NixString' and write its context into the resulting set.\nextractNixString :: (Monad m) => NixString -> WithStringContextT m Text\nextractNixString (NixString c s) =\n    WithStringContextT $\n        s <$ tell c\n\n-- ** Setters\n\n-- this really should be 2 args, then with @toStringContexts path@ laziness it would tail recurse.\n-- for now tuple dissected internaly with laziness preservation.\ntoStringContexts :: VarName -> NixLikeContextValue -> [StringContext]\ntoStringContexts path = go\n  where\n    go :: NixLikeContextValue -> [StringContext]\n    go cv =\n        case cv of\n            NixLikeContextValue True _ _ ->\n                mkLstCtxFor DirectPath cv{nlcvPath = False}\n            NixLikeContextValue _ True _ ->\n                mkLstCtxFor AllOutputs cv{nlcvAllOutputs = False}\n            NixLikeContextValue _ _ ls\n                | isPresent ls ->\n                    mkCtxFor . DerivationOutput <$> ls\n            _ -> mempty\n      where\n        mkCtxFor :: ContextFlavor -> StringContext\n        mkCtxFor context = StringContext context path\n        mkLstCtxFor :: ContextFlavor -> NixLikeContextValue -> [StringContext]\n        mkLstCtxFor t c = one (mkCtxFor t) <> go c\n\ntoNixLikeContextValue :: StringContext -> (NixLikeContextValue, VarName)\ntoNixLikeContextValue sc =\n    ( case getStringContextFlavor sc of\n        DirectPath -> NixLikeContextValue True False mempty\n        AllOutputs -> NixLikeContextValue False True mempty\n        DerivationOutput t -> NixLikeContextValue False False $ one t\n    , getStringContextPath sc\n    )\n\ntoNixLikeContext :: S.HashSet StringContext -> NixLikeContext\ntoNixLikeContext stringContext =\n    NixLikeContext $\n        S.foldr\n            fun\n            mempty\n            stringContext\n  where\n    fun :: (StringContext -> AttrSet NixLikeContextValue -> AttrSet NixLikeContextValue)\n    fun sc =\n        uncurry (M.insertWith (<>)) (swap $ toNixLikeContextValue sc)\n\n-- | Add 'StringContext's into the resulting set.\naddStringContext ::\n    (Monad m) => S.HashSet StringContext -> WithStringContextT m ()\naddStringContext = WithStringContextT . tell\n\n-- | Add a 'StringContext' into the resulting set.\naddSingletonStringContext :: (Monad m) => StringContext -> WithStringContextT m ()\naddSingletonStringContext = WithStringContextT . tell . one\n\n-- | Run an action producing a string with a context and put those into a 'NixString'.\nrunWithStringContextT :: (Monad m) => WithStringContextT m Text -> m NixString\nrunWithStringContextT (WithStringContextT m) =\n    uncurry (flip NixString) <$> runWriterT m\n\n-- | Run an action producing a string with a context and put those into a 'NixString'.\nrunWithStringContext :: WithStringContextT Identity Text -> NixString\nrunWithStringContext = runIdentity . runWithStringContextT\n\n-- ** Modifiers\n\n-- | Modify the string part of the NixString, leaving the context unchanged\nmodifyNixContents :: (Text -> Text) -> NixString -> NixString\nmodifyNixContents f (NixString c s) = NixString c (f s)\n\n{- | Run an action that manipulates nix strings, and collect the contexts encountered.\nWarning: this may be unsafe, depending on how you handle the resulting context list.\n-}\nrunWithStringContextT' :: (Monad m) => WithStringContextT m a -> m (a, S.HashSet StringContext)\nrunWithStringContextT' (WithStringContextT m) = runWriterT m\n\n{- | Run an action that manipulates nix strings, and collect the contexts encountered.\nWarning: this may be unsafe, depending on how you handle the resulting context list.\n-}\nrunWithStringContext' :: WithStringContextT Identity a -> (a, S.HashSet StringContext)\nrunWithStringContext' = runIdentity . runWithStringContextT'\n\n-- | Combine NixStrings with a separator\nintercalateNixString :: NixString -> [NixString] -> NixString\nintercalateNixString _ [] = mempty\nintercalateNixString _ [ns] = ns\nintercalateNixString sep nss =\n    uncurry NixString\n        $ mapPair\n            ( S.unions . (one (getStringContext sep) <>) . (getStringContext <$>)\n            , Text.intercalate (getStringContent sep) . (getStringContent <$>)\n            )\n        $ dup nss\n"
  },
  {
    "path": "src/Nix/TH.hs",
    "content": "{-# LANGUAGE QuasiQuotes #-}\n{-# LANGUAGE TemplateHaskell #-}\n{-# OPTIONS_GHC -Wno-missing-fields #-}\n{-# OPTIONS_GHC -Wno-type-defaults #-}\n\nmodule Nix.TH where\n\nimport Data.Fix (Fix (Fix))\nimport Data.Generics.Aliases (extQ)\nimport qualified Data.Set as Set\nimport Language.Haskell.TH\nimport Language.Haskell.TH.Quote\nimport Nix.Atoms\nimport Nix.Expr.Types\nimport Nix.Expr.Types.Annotated\nimport Nix.Parser\nimport Nix.Prelude\n\nremoveMissingNames :: Set VarName -> Q (Set VarName)\nremoveMissingNames =\n    fmap Set.fromAscList\n        . filterM (fmap isJust . lookupValueName . toString)\n        . Set.toAscList\n\nquoteExprExp :: String -> ExpQ\nquoteExprExp s = do\n    expr <- parseExpr $ fromString s\n    vars <- removeMissingNames $ getFreeVars expr\n    dataToExpQ (extQOnFreeVars metaExp vars) expr\n\nquoteExprPat :: String -> PatQ\nquoteExprPat s = do\n    expr <- parseExpr @Q $ fromString s\n    vars <- removeMissingNames $ getFreeVars expr\n    dataToPatQ (extQOnFreeVars @_ @NExprLoc @PatQ metaPat vars) expr\n\n-- | Helper function.\nextQOnFreeVars ::\n    (Typeable b, Typeable loc) =>\n    (Set VarName -> loc -> Maybe q) ->\n    Set VarName ->\n    b ->\n    Maybe q\nextQOnFreeVars f = extQ (const Nothing) . f\n\nclass ToExpr a where\n    toExpr :: a -> NExpr\n\ninstance ToExpr NExpr where\n    toExpr = id\n\ninstance ToExpr VarName where\n    toExpr = Fix . NSym\n\ninstance {-# OVERLAPPING #-} ToExpr String where\n    toExpr = Fix . NStr . fromString\n\ninstance ToExpr Text where\n    toExpr = toExpr . toString\n\ninstance ToExpr Int where\n    toExpr = Fix . NConstant . NInt . fromIntegral\n\ninstance ToExpr Bool where\n    toExpr = Fix . NConstant . NBool\n\ninstance ToExpr Integer where\n    toExpr = Fix . NConstant . NInt\n\ninstance ToExpr Float where\n    toExpr = Fix . NConstant . NFloat\n\ninstance (ToExpr a) => ToExpr [a] where\n    toExpr = Fix . NList . fmap toExpr\n\ninstance (ToExpr a) => ToExpr (NonEmpty a) where\n    toExpr = toExpr . toList\n\ninstance ToExpr () where\n    toExpr = const $ Fix $ NConstant NNull\n\ninstance (ToExpr a) => ToExpr (Maybe a) where\n    toExpr = maybe (toExpr (mempty :: ())) toExpr\n\ninstance (ToExpr a, ToExpr b) => ToExpr (Either a b) where\n    toExpr = either toExpr toExpr\n\nmetaExp :: Set VarName -> NExpr -> Maybe ExpQ\nmetaExp fvs (Fix (NSym x))\n    | x `Set.member` fvs =\n        pure [|toExpr $(varE (mkName $ toString x))|]\nmetaExp _ _ = Nothing\n\nmetaPat :: Set VarName -> NExprLoc -> Maybe PatQ\nmetaPat fvs (NSymAnn _ x)\n    | x `Set.member` fvs =\n        pure $ varP $ mkName $ toString x\nmetaPat _ _ = Nothing\n\n-- Use of @QuasiQuoter@ requires @String@.\n-- After @Text -> String@ migrations done, _maybe_ think to use @QuasiText@.\nnix :: QuasiQuoter\nnix = QuasiQuoter{quoteExp = quoteExprExp, quotePat = quoteExprPat}\n"
  },
  {
    "path": "src/Nix/Thunk/Basic.hs",
    "content": "{-# LANGUAGE ConstraintKinds #-}\n{-# LANGUAGE UndecidableInstances #-}\n{-# OPTIONS_GHC -Wno-unused-do-bind #-}\n\nmodule Nix.Thunk.Basic (\n    NThunkF (..),\n    Deferred (..),\n    deferred,\n    MonadBasicThunk,\n) where\n\nimport Control.Monad.Catch (\n    MonadCatch (..),\n    MonadThrow (throwM),\n )\nimport Control.Monad.Ref (\n    MonadAtomicRef (atomicModifyRef),\n    MonadRef (Ref, newRef, readRef, writeRef),\n )\nimport Nix.Prelude\nimport Nix.Thunk\nimport qualified Text.Show\n\n-- * Data type @Deferred@\n\n{- | Data is computed OR in a lazy thunk state which\nis still not evaluated.\n-}\ndata Deferred m v = Computed v | Deferred (m v)\n    deriving (Functor, Foldable, Traversable)\n\n-- ** Utils\n\n{- | Apply second if @Deferred@, otherwise (@Computed@) - apply first.\nAnalog of @either@ for @Deferred = Computed|Deferred@.\n-}\ndeferred :: (v -> b) -> (m v -> b) -> Deferred m v -> b\ndeferred f1 f2 =\n    \\case\n        Computed v -> f1 v\n        Deferred action -> f2 action\n{-# INLINE deferred #-}\n\n-- * Thunk references & lock handling\n\n{- | Thunk resource reference (@ref-tf: Ref m@), and as such also also hold\na @Bool@ lock flag.\n-}\ntype ThunkRef m = Ref m Bool\n\n-- | Reference (@ref-tf: Ref m v@) to a value that the thunk holds.\ntype ThunkValueRef m v = Ref m (Deferred m v)\n\n-- | @ref-tf@ lock instruction for @Ref m@ (@ThunkRef@).\nlockVal :: Bool -> (Bool, Bool)\nlockVal = (True,)\n\n-- | @ref-tf@ unlock instruction for @Ref m@ (@ThunkRef@).\nunlockVal :: Bool -> (Bool, Bool)\nunlockVal = (False,)\n\n-- | Takes @ref-tf: Ref m@ reference, returns Bool result of the operation.\nlock ::\n    ( MonadBasicThunk m\n    , MonadCatch m\n    ) =>\n    ThunkRef m ->\n    m Bool\nlock r = atomicModifyRef r lockVal\n\n-- | Takes @ref-tf: Ref m@ reference, returns Bool result of the operation.\nunlock ::\n    ( MonadBasicThunk m\n    , MonadCatch m\n    ) =>\n    ThunkRef m ->\n    m Bool\nunlock r = atomicModifyRef r unlockVal\n\n-- * Data type for thunks: @NThunkF@\n\n-- | The type of very basic thunks\ndata NThunkF m v\n    = Thunk (ThunkId m) (ThunkRef m) (ThunkValueRef m v)\n\ninstance (Eq v, Eq (ThunkId m)) => Eq (NThunkF m v) where\n    Thunk x _ _ == Thunk y _ _ = x == y\n\ninstance Show (NThunkF m v) where\n    show Thunk{} = toString thunkStubText\n\ntype MonadBasicThunk m = (MonadThunkId m, MonadAtomicRef m)\n\n-- ** @instance MonadThunk NThunkF@\n\ninstance\n    (MonadBasicThunk m, MonadCatch m) =>\n    MonadThunk (NThunkF m v) m v\n    where\n    thunkId :: NThunkF m v -> ThunkId m\n    thunkId (Thunk n _ _) = n\n\n    thunk :: m v -> m (NThunkF m v)\n    thunk action =\n        do\n            freshThunkId <- freshId\n            liftA2\n                (Thunk freshThunkId)\n                (newRef False)\n                (newRef $ Deferred action)\n\n    query :: m v -> NThunkF m v -> m v\n    query vStub (Thunk _ _ lTValRef) =\n        deferred pure (const vStub) =<< readRef lTValRef\n\n    force :: NThunkF m v -> m v\n    force = forceMain\n\n    forceEff :: NThunkF m v -> m v\n    forceEff = forceMain\n\n    further :: NThunkF m v -> m (NThunkF m v)\n    further t@(Thunk _ _ ref) =\n        const (pure t) =<< atomicModifyRef ref dup\n\n-- *** United body of `force*`\n\n{- | Always returns computed @m v@.\n\nChecks if resource is computed,\nif not - with locking evaluates the resource.\n-}\nforceMain ::\n    forall v m.\n    ( MonadBasicThunk m\n    , MonadCatch m\n    ) =>\n    NThunkF m v ->\n    m v\nforceMain (Thunk tIdV tRefV tValRefV) =\n    deferred pure computeW =<< readRef tValRefV\n  where\n    computeW :: m v -> m v\n    computeW vDefferred =\n        do\n            locked <- lock tRefV\n            bool\n                lockFailedV\n                ( do\n                    v <- vDefferred `catch` bindFailedW\n                    writeRef tValRefV $ Computed v -- Proclaim value computed\n                    unlockRef\n                    pure v\n                )\n                $ not locked\n      where\n        lockFailedV :: m a\n        lockFailedV = throwM $ ThunkLoop $ show tIdV\n\n        bindFailedW :: SomeException -> m b\n        bindFailedW (e :: SomeException) =\n            do\n                unlockRef\n                throwM e\n\n        unlockRef :: m Bool\n        unlockRef = unlock tRefV\n{-# INLINE forceMain #-} -- it is big function, but internal, and look at its use.\n\n-- ** Kleisli functor HOFs: @instance MonadThunkF NThunkF@\n\ninstance\n    (MonadBasicThunk m, MonadCatch m) =>\n    MonadThunkF (NThunkF m v) m v\n    where\n    queryF ::\n        (v -> m r) ->\n        m r ->\n        NThunkF m v ->\n        m r\n    queryF k n (Thunk _ thunkRef thunkValRef) =\n        do\n            locked <- lock thunkRef\n            bool\n                n\n                go\n                (not locked)\n      where\n        go =\n            do\n                eres <- readRef thunkValRef\n                res <-\n                    deferred\n                        k\n                        (const n)\n                        eres\n                unlockRef\n                pure res\n\n        unlockRef = unlock thunkRef\n\n    forceF ::\n        (v -> m a) ->\n        NThunkF m v ->\n        m a\n    forceF k = k <=< force\n\n    forceEffF ::\n        (v -> m r) ->\n        NThunkF m v ->\n        m r\n    forceEffF k = k <=< forceEff\n\n    furtherF ::\n        (m v -> m v) ->\n        NThunkF m v ->\n        m (NThunkF m v)\n    furtherF k t@(Thunk _ _ ref) =\n        do\n            _modifiedIt <- atomicModifyRef ref $\n                \\x ->\n                    deferred\n                        (const (x, x))\n                        (\\d -> (Deferred (k d), x))\n                        x\n            pure t\n"
  },
  {
    "path": "src/Nix/Thunk.hs",
    "content": "{-# LANGUAGE DefaultSignatures #-}\n{-# LANGUAGE FunctionalDependencies #-}\n{-# LANGUAGE TypeFamilies #-}\n{-# LANGUAGE TypeOperators #-}\n\nmodule Nix.Thunk where\n\nimport Control.Monad.Trans.Writer (WriterT)\nimport Nix.Prelude\nimport qualified Text.Show\n\n-- ** @class MonadThunkId@ & @instances@\n\nclass\n    ( Monad m\n    , Eq (ThunkId m)\n    , Ord (ThunkId m)\n    , Show (ThunkId m)\n    , Typeable (ThunkId m)\n    ) =>\n    MonadThunkId m\n    where\n    type ThunkId m :: Type\n\n    freshId :: m (ThunkId m)\n    default freshId ::\n        ( MonadThunkId m'\n        , MonadTrans t\n        , m ~ t m'\n        , ThunkId m ~ ThunkId m'\n        ) =>\n        m (ThunkId m)\n    freshId = lift freshId\n\n-- *** Instances\n\ninstance\n    (MonadThunkId m) =>\n    MonadThunkId (ReaderT r m)\n    where\n    type ThunkId (ReaderT r m) = ThunkId m\n\ninstance\n    ( Monoid w\n    , MonadThunkId m\n    ) =>\n    MonadThunkId (WriterT w m)\n    where\n    type ThunkId (WriterT w m) = ThunkId m\n\ninstance\n    (MonadThunkId m) =>\n    MonadThunkId (ExceptT e m)\n    where\n    type ThunkId (ExceptT e m) = ThunkId m\n\ninstance\n    (MonadThunkId m) =>\n    MonadThunkId (StateT s m)\n    where\n    type ThunkId (StateT s m) = ThunkId m\n\n-- ** @class MonadThunk@\n\nclass\n    (MonadThunkId m) =>\n    MonadThunk t m a\n        | t -> m\n        , t -> a\n    where\n    -- | Return thunk ID.\n    thunkId :: t -> ThunkId m\n\n    -- | Create new thunk\n    thunk :: m a -> m t\n\n    -- | Non-blocking query.\n    --     If thunk got computed\n    --     then return its value\n    --     otherwise return default value (1st arg).\n    query :: m a -> t -> m a\n\n    force :: t -> m a\n    forceEff :: t -> m a\n\n    -- | Modify the action to be performed by the thunk. For some implicits\n    --     this modifies the thunk, for others it may create a new thunk.\n    further :: t -> m t\n\n-- ** @class MonadThunk@\n\n-- | Class of Kleisli functors for easiness of customized implementation developlemnt.\nclass MonadThunkF t m a | t -> m, t -> a where\n    queryF :: (a -> m r) -> m r -> t -> m r\n    forceF :: (a -> m r) -> t -> m r\n    forceEffF :: (a -> m r) -> t -> m r\n    furtherF :: (m a -> m a) -> t -> m t\n\n-- ** @newtype ThunkLoop@\n\nnewtype ThunkLoop = ThunkLoop Text -- contains rendering of ThunkId\n    deriving (Typeable)\n\ninstance Show ThunkLoop where\n    show (ThunkLoop i) = toString $ \"ThunkLoop \" <> i\n\ninstance Exception ThunkLoop\n\n-- ** Utils\n\nthunkStubText :: Text\nthunkStubText = \"<thunk>\"\n"
  },
  {
    "path": "src/Nix/Type/Assumption.hs",
    "content": "{-# LANGUAGE TypeFamilies #-}\n\n{- | Basing on the Nix (Hindley–Milner) type system (that provides decidable type inference):\ngathering assumptions (inference evidence) about polymorphic types.\n-}\nmodule Nix.Type.Assumption (\n    Assumption (..),\n    empty,\n    lookup,\n    remove,\n    extend,\n    keys,\n    merge,\n    singleton,\n)\nwhere\n\nimport Nix.Prelude hiding (\n    Type,\n    empty,\n )\n\nimport Nix.Expr.Types\nimport Nix.Type.Type\n\nnewtype Assumption = Assumption [(VarName, Type)]\n    deriving (Eq, Show)\n\n-- We pretend that Assumptions can be inconsistent (nonunique keys),\n-- (just like people in real life).\n-- The consistency between assumptions is the inference responcibility.\ninstance Semigroup Assumption where\n    (<>) = merge\n\ninstance Monoid Assumption where\n    mempty = empty\n\ninstance One Assumption where\n    type OneItem Assumption = (VarName, Type)\n    one vt = Assumption $ one vt\n\n--  2022-01-12: NOTE: `empty` implies Alternative. Either have Alternative or use `mempty`\nempty :: Assumption\nempty = Assumption mempty\n\nextend :: Assumption -> (VarName, Type) -> Assumption\nextend a vt =\n    one (coerce vt) <> a\n\nremove :: Assumption -> VarName -> Assumption\nremove a var =\n    coerce\n        rmVar\n        a\n  where\n    rmVar :: [(VarName, Type)] -> [(VarName, Type)]\n    rmVar =\n        filter\n            ((/=) var . fst)\n\nlookup :: VarName -> Assumption -> [Type]\nlookup key a =\n    snd\n        <$> filter\n            ((==) key . fst)\n            (coerce a)\n\nmerge :: Assumption -> Assumption -> Assumption\nmerge =\n    coerce ((<>) @[(VarName, Type)])\n\nsingleton :: VarName -> Type -> Assumption\nsingleton = curry one\n\nkeys :: Assumption -> [VarName]\nkeys (Assumption a) = fst <$> a\n"
  },
  {
    "path": "src/Nix/Type/Env.hs",
    "content": "{-# LANGUAGE TypeFamilies #-}\n\nmodule Nix.Type.Env (\n    Env (..),\n    empty,\n    lookup,\n    remove,\n    extend,\n    extends,\n    merge,\n    mergeEnvs,\n    singleton,\n    keys,\n    fromList,\n    toList,\n)\nwhere\n\nimport Nix.Prelude hiding (\n    empty,\n    fromList,\n    toList,\n )\n\nimport Nix.Expr.Types\nimport Nix.Type.Type\n\nimport qualified Data.Map as Map\n\n-- * Typing Environment\n\nnewtype Env = TypeEnv (Map VarName [Scheme])\n    deriving (Eq, Show)\n\ninstance Semigroup Env where\n    -- \\| Right-biased merge (override). Analogous to @//@ in @Nix@\n    -- Since nature of environment is to update & grow.\n    (<>) = mergeRight\n\ninstance Monoid Env where\n    mempty = empty\n\ninstance One Env where\n    type OneItem Env = (VarName, Scheme)\n    one (x, y) = TypeEnv $ one (x, one y)\n\nempty :: Env\nempty = TypeEnv mempty\n\nextend :: Env -> (VarName, [Scheme]) -> Env\nextend env (x, s) = coerce (Map.insert x s) env\n\nremove :: Env -> VarName -> Env\nremove env var = TypeEnv $ Map.delete var $ coerce env\n\nextends :: Env -> [(VarName, [Scheme])] -> Env\nextends env xs = fromList xs <> coerce env\n\nlookup :: VarName -> Env -> Maybe [Scheme]\nlookup key tys = Map.lookup key $ coerce tys\n\nmerge :: Env -> Env -> Env\nmerge a b = TypeEnv $ coerce a <> coerce b\n\nmergeRight :: Env -> Env -> Env\nmergeRight = flip merge\n\nmergeEnvs :: [Env] -> Env\nmergeEnvs = foldl' (<>) mempty\n\nsingleton :: VarName -> Scheme -> Env\nsingleton = curry one\n\nkeys :: Env -> [VarName]\nkeys (TypeEnv env) = Map.keys env\n\nfromList :: [(VarName, [Scheme])] -> Env\nfromList xs = coerce $ Map.fromList xs\n\ntoList :: Env -> [(VarName, [Scheme])]\ntoList (TypeEnv env) = Map.toList env\n"
  },
  {
    "path": "src/Nix/Type/Infer.hs",
    "content": "{-# LANGUAGE AllowAmbiguousTypes #-}\n{-# LANGUAGE CPP #-}\n{-# LANGUAGE ConstraintKinds #-}\n{-# LANGUAGE ExistentialQuantification #-}\n{-# LANGUAGE GeneralizedNewtypeDeriving #-}\n{-# LANGUAGE MultiWayIf #-}\n{-# LANGUAGE RankNTypes #-}\n{-# LANGUAGE TypeFamilies #-}\n{-# OPTIONS_GHC -Wno-name-shadowing #-}\n\nmodule Nix.Type.Infer (\n    Constraint (..),\n    TypeError (..),\n    InferError (..),\n    Subst (..),\n    inferTop,\n)\nwhere\n\nimport Control.Monad.Catch (\n    MonadCatch (..),\n    MonadThrow (..),\n )\nimport Control.Monad.Except (MonadError (catchError, throwError))\nimport Control.Monad.Fix (MonadFix)\nimport Control.Monad.Logic\nimport Control.Monad.Ref (\n    MonadAtomicRef (..),\n    MonadRef (..),\n )\nimport Control.Monad.ST (\n    ST,\n    runST,\n )\nimport Data.Fix (foldFix)\nimport qualified Data.HashMap.Lazy as M\nimport Data.List (\n    delete,\n    intersect,\n    (!!),\n    (\\\\),\n )\nimport qualified Data.List as List\nimport qualified Data.Map as Map\nimport Data.Maybe (fromJust)\nimport qualified Data.Set as Set\nimport Nix.Atoms\nimport Nix.Convert\nimport Nix.Eval (MonadEval (..))\nimport qualified Nix.Eval as Eval (\n    eval,\n    evalWithAttrSet,\n )\nimport Nix.Expr.Types\nimport Nix.Fresh\nimport Nix.Prelude hiding (\n    Constraint,\n    TVar,\n    Type,\n )\nimport Nix.Scope\nimport Nix.String\nimport Nix.Type.Assumption hiding (extend)\nimport qualified Nix.Type.Assumption as Assumption\nimport Nix.Type.Env\nimport qualified Nix.Type.Env as Env\nimport Nix.Type.Type\nimport Nix.Value.Monad\n\nnormalizeScheme :: Scheme -> Scheme\nnormalizeScheme (Forall _ body) = Forall (snd <$> ord) (normtype body)\n  where\n    ord =\n        zip\n            (ordNub $ fv body)\n            (TV . fromString <$> letters)\n\n    fv (TVar a) = one a\n    fv (a :~> b) = on (<>) fv a b\n    fv (TCon _) = mempty\n    fv (TSet _ a) = foldMap fv $ M.elems a\n    fv (TList a) = foldMap fv a\n    fv (TMany ts) = foldMap fv ts\n\n    normtype (a :~> b) = normtype a :~> normtype b\n    normtype (TCon a) = TCon a\n    normtype (TSet b a) = TSet b $ normtype <$> a\n    normtype (TList a) = TList $ normtype <$> a\n    normtype (TMany ts) = TMany $ normtype <$> ts\n    normtype (TVar a) =\n        maybe\n            (error \"type variable not in signature\")\n            TVar\n            (List.lookup a ord)\n\ngeneralize :: Set.Set TVar -> Type -> Scheme\ngeneralize free t = Forall as t\n  where\n    as = Set.toList $ free `Set.difference` ftv t\n\n-- | Canonicalize and return the polymorphic toplevel type.\ncloseOver :: Type -> Scheme\ncloseOver = normalizeScheme . generalize mempty\n\n-- When `[]` becomes `NonEmpty` - function becomes just `all`\n\n-- | Check if all elements are of the same type.\nallSameType :: [Type] -> Bool\nallSameType = allSame\n  where\n    allSame :: (Eq a) => [a] -> Bool\n    allSame [] = True\n    allSame (x : xs) = all (x ==) xs\n\n-- * data type @TypeError@\n\ndata TypeError\n    = UnificationFail Type Type\n    | InfiniteType TVar Type\n    | UnboundVariables [VarName]\n    | Ambigious [Constraint]\n    | UnificationMismatch [Type] [Type]\n    deriving (Eq, Show, Ord)\n\n-- * @InferError@\n\ndata InferError\n    = TypeInferenceErrors [TypeError]\n    | TypeInferenceAborted\n    | forall s. (Exception s) => EvaluationError s\n\ntypeError :: (MonadError InferError m) => TypeError -> m ()\ntypeError err = throwError $ TypeInferenceErrors $ one err\n\n-- ** Instances\n\nderiving instance Show InferError\ninstance Exception InferError\n\ninstance Semigroup InferError where\n    (<>) = const\n\ninstance Monoid InferError where\n    mempty = TypeInferenceAborted\n\n-- * @InferState@: inference state\n\n-- | Inference state (stage).\nnewtype InferState = InferState Int\n    deriving\n        (Eq, Num, Enum, Ord)\n\ninstance Semigroup InferState where\n    (<>) = (+)\n\ninstance Monoid InferState where\n    mempty = 0\n\n-- | Initial inference state\ninitInfer :: InferState\ninitInfer = InferState 0\n\nletters :: [String]\nletters =\n    do\n        l <- [1 ..]\n        replicateM\n            l\n            ['a' .. 'z']\n\nfreshTVar :: (MonadState InferState m) => m TVar\nfreshTVar =\n    do\n        s <- get\n        put $ succ s\n        pure $ TV $ fromString $ letters !! coerce s\n\nfresh :: (MonadState InferState m) => m Type\nfresh = TVar <$> freshTVar\n\nintoFresh :: (Traversable t, MonadState InferState f) => t a -> f (t Type)\nintoFresh =\n    traverse (const fresh)\n\ninstantiate :: (MonadState InferState m) => Scheme -> m Type\ninstantiate (Forall as t) =\n    fmap ((`apply` t) . coerce . Map.fromList . zip as) (intoFresh as)\n\n-- * @Constraint@ data type\n\ndata Constraint\n    = EqConst Type Type\n    | ExpInstConst Type Scheme\n    | ImpInstConst Type (Set.Set TVar) Type\n    deriving (Show, Eq, Ord)\n\n-- * @Subst@ data type\n\n-- | Substitution of the basic type definition by a type variable.\nnewtype Subst = Subst (Map TVar Type)\n    deriving (Eq, Ord, Show, Semigroup, Monoid)\n\n-- | Compose substitutions\ncompose :: Subst -> Subst -> Subst\ncompose a@(Subst s2) (Subst s1) =\n    coerce $ --\n        apply a\n            <$> (s2 <> s1)\n\n-- * class @Substitutable@\n\nclass Substitutable a where\n    apply :: Subst -> a -> a\n\n-- ** Instances\n\ninstance Substitutable TVar where\n    apply (Subst s) a = tv\n      where\n        (TVar tv) = Map.findWithDefault (TVar a) a s\n\ninstance Substitutable Type where\n    apply _ (TCon a) = TCon a\n    apply s (TSet b a) = TSet b $ apply s <$> a\n    apply s (TList a) = TList $ apply s <$> a\n    apply (Subst s) t@(TVar a) = Map.findWithDefault t a s\n    apply s (t1 :~> t2) = ((:~>) `on` apply s) t1 t2\n    apply s (TMany ts) = TMany $ apply s <$> ts\n\ninstance Substitutable Scheme where\n    apply (Subst s) (Forall as t) = Forall as $ apply s' t\n      where\n        s' = Subst $ foldr Map.delete s as\n\ninstance Substitutable Constraint where\n    apply s (EqConst t1 t2) = on EqConst (apply s) t1 t2\n    apply s (ExpInstConst t sc) =\n        ExpInstConst\n            (apply s t)\n            (apply s sc)\n    apply s (ImpInstConst t1 ms t2) =\n        ImpInstConst\n            (apply s t1)\n            (apply s ms)\n            (apply s t2)\n\ninstance (Substitutable a) => Substitutable [a] where\n    apply = fmap . apply\n\ninstance (Ord a, Substitutable a) => Substitutable (Set.Set a) where\n    apply = Set.map . apply\n\n-- * data type @Judgment@\n\ndata Judgment s\n    = Judgment\n    { assumptions :: Assumption\n    , typeConstraints :: [Constraint]\n    , inferredType :: Type\n    }\n    deriving (Show)\n\ninferred :: Type -> Judgment s\ninferred = Judgment mempty mempty\n\n-- * @InferT@: inference monad\n\ntype InferTInternals s m a =\n    ReaderT\n        (Set.Set TVar, Scopes (InferT s m) (Judgment s))\n        (StateT InferState (ExceptT InferError m))\n        a\n\n-- | Inference monad\nnewtype InferT s m a\n    = InferT\n    { getInfer ::\n        InferTInternals s m a\n    }\n    deriving\n        ( Functor\n        , Applicative\n        , Alternative\n        , Monad\n        , MonadPlus\n        , MonadFix\n        , MonadReader (Set.Set TVar, Scopes (InferT s m) (Judgment s))\n        , MonadFail\n        , MonadState InferState\n        , MonadError InferError\n        )\n\nextendMSet :: forall s m a. (Monad m) => TVar -> InferT s m a -> InferT s m a\nextendMSet x = coerce putSetElementM\n  where\n    putSetElementM :: InferTInternals s m a -> InferTInternals s m a\n    putSetElementM = local (first . Set.insert $ x)\n\n-- ** Instances\n\ninstance MonadTrans (InferT s) where\n    lift = InferT . lift . lift . lift\n\ninstance (MonadRef m) => MonadRef (InferT s m) where\n    type Ref (InferT s m) = Ref m\n    newRef x = liftInfer $ newRef x\n    readRef x = liftInfer $ readRef x\n    writeRef x y = liftInfer $ writeRef x y\n\ninstance (MonadAtomicRef m) => MonadAtomicRef (InferT s m) where\n    atomicModifyRef x f =\n        liftInfer $\n            do\n                res <- snd . f <$> readRef x\n                _ <- modifyRef x $ fst . f\n                pure res\n\ninstance (Monad m) => MonadThrow (InferT s m) where\n    throwM = throwError . EvaluationError\n\ninstance (Monad m) => MonadCatch (InferT s m) where\n    catch m h =\n        catchError m $\n            \\case\n                EvaluationError e ->\n                    maybe\n                        (error $ \"Exception was not an exception: \" <> show e)\n                        h\n                        (fromException $ toException e)\n                err -> error $ \"Unexpected error: \" <> show err\n\n-- instance MonadThunkId m => MonadThunkId (InferT s m) where\n--   type ThunkId (InferT s m) = ThunkId m\n\ninstance\n    (Monad m) =>\n    FromValue NixString (InferT s m) (Judgment s)\n    where\n    fromValueMay _ = stub\n    fromValue _ = error \"Unused\"\n\ninstance\n    (MonadInfer m) =>\n    FromValue\n        ( AttrSet (Judgment s)\n        , PositionSet\n        )\n        (InferT s m)\n        (Judgment s)\n    where\n    fromValueMay (Judgment _ _ (TSet _ xs)) =\n        do\n            let sing = const inferred\n            pure $ pure (M.mapWithKey sing xs, mempty)\n    fromValueMay _ = stub\n    fromValue =\n        pure\n            . maybeToMonoid\n            <=< fromValueMay\n\nfoldInitializedWith :: (Traversable t, Applicative f) => (t c -> c) -> (b -> c) -> (a -> f b) -> t a -> f c\nfoldInitializedWith fld getter init =\n    -- maybe here is some law?\n    fmap fld . traverse (fmap getter . init)\n\ntoJudgment :: forall t m s. (Traversable t, Monad m) => (t Type -> Type) -> t (Judgment s) -> InferT s m (Judgment s)\ntoJudgment c xs =\n    liftA3\n        Judgment\n        (foldWith fold assumptions)\n        (foldWith fold typeConstraints)\n        (foldWith c inferredType)\n  where\n    foldWith :: (t a -> a) -> (Judgment s -> a) -> InferT s m a\n    foldWith g f = foldInitializedWith g f demand xs\n\ninstance\n    (MonadInfer m) =>\n    ToValue\n        (AttrSet (Judgment s), PositionSet)\n        (InferT s m)\n        (Judgment s)\n    where\n    toValue :: (AttrSet (Judgment s), PositionSet) -> InferT s m (Judgment s)\n    toValue (xs, _) = toJudgment (TSet Variadic) xs -- why variadic? Probably `Closed` (`mempty`)?\n\ninstance (MonadInfer m) => ToValue [Judgment s] (InferT s m) (Judgment s) where\n    toValue = toJudgment TList\n\ninstance (MonadInfer m) => ToValue Bool (InferT s m) (Judgment s) where\n    toValue _ = pure $ inferred typeBool\n\ninstance\n    (Monad m) =>\n    Scoped (Judgment s) (InferT s m)\n    where\n    askScopes = askScopesReader\n    clearScopes = clearScopesReader @(InferT s m) @(Judgment s)\n    pushScopes = pushScopesReader\n    lookupVar = lookupVarReader\n\n-- newtype JThunkT s m = JThunk (NThunkF (InferT s m) (Judgment s))\n\n--  2021-02-22: NOTE: Seems like suporflous instance\ninstance (Monad m) => MonadValue (Judgment s) (InferT s m) where\n    defer ::\n        InferT s m (Judgment s) ->\n        InferT s m (Judgment s)\n    defer = id\n\n    demand ::\n        Judgment s ->\n        InferT s m (Judgment s)\n    demand = pure\n\n    inform ::\n        Judgment s ->\n        InferT s m (Judgment s)\n    inform = pure\n\n--  2021-02-22: NOTE: Seems like suporflous instance\ninstance (Monad m) => MonadValueF (Judgment s) (InferT s m) where\n    demandF ::\n        ( Judgment s ->\n          InferT s m r\n        ) ->\n        Judgment s ->\n        InferT s m r\n    demandF f = f\n\n    informF ::\n        ( InferT s m (Judgment s) ->\n          InferT s m (Judgment s)\n        ) ->\n        Judgment s ->\n        InferT s m (Judgment s)\n    informF f = f . pure\n\n{-\ninstance MonadInfer m\n  => MonadThunk (JThunkT s m) (InferT s m) (Judgment s) where\n\n  thunkId (JThunk x) = thunkId x\n\n  thunk = fmap JThunk . thunk\n\n  query b (JThunk x) = query b x\n\n  -- If we have a thunk loop, we just don't know the type.\n  force (JThunk t) = catch (force t)\n    $ \\(_ :: ThunkLoop) ->\n                           f =<< Judgment mempty mempty <$> fresh\n\n  -- If we have a thunk loop, we just don't know the type.\n  forceEff (JThunk t) = catch (forceEff t)\n    $ \\(_ :: ThunkLoop) ->\n                           f =<< Judgment mempty mempty <$> fresh\n-}\n\npolymorphicVar :: (MonadInfer m) => VarName -> InferT s m (Judgment s)\npolymorphicVar var =\n    fmap\n        (join $ (`Judgment` mempty) . curry one var)\n        fresh\n\nconstInfer :: (Applicative f) => Type -> b -> f (Judgment s)\nconstInfer x = const $ pure $ inferred x\n\ninstance (MonadInfer m) => MonadEval (Judgment s) (InferT s m) where\n    freeVariable = polymorphicVar\n\n    synHole = polymorphicVar\n\n    -- If we fail to look up an attribute, we just don't know the type.\n    attrMissing _ _ = inferred <$> fresh\n\n    evaledSym _ = pure\n\n    evalCurPos =\n        pure $\n            inferred $\n                TSet mempty $\n                    M.fromList\n                        [ (\"file\", typePath)\n                        , (\"line\", typeInt)\n                        , (\"col\", typeInt)\n                        ]\n\n    evalConstant c = pure $ inferred $ fun c\n      where\n        fun = \\case\n            NURI _ -> typeString\n            NInt _ -> typeInt\n            NFloat _ -> typeFloat\n            NBool _ -> typeBool\n            NNull -> typeNull\n\n    evalString = constInfer typeString\n    evalLiteralPath = constInfer typePath\n    evalEnvPath = constInfer typePath\n\n    evalUnary op (Judgment as1 cs1 t1) =\n        (Judgment as1 =<< (cs1 <>) . (`unops` op) . (t1 :~>)) <$> fresh\n\n    evalBinary op (Judgment as1 cs1 t1) e2 =\n        do\n            Judgment as2 cs2 t2 <- e2\n            (Judgment (as1 <> as2) =<< ((cs1 <> cs2) <>) . (`binops` op) . ((t1 :~> t2) :~>)) <$> fresh\n\n    evalWith = Eval.evalWithAttrSet\n\n    evalIf (Judgment as1 cs1 t1) t f = do\n        Judgment as2 cs2 t2 <- t\n        Judgment as3 cs3 t3 <- f\n        pure $\n            Judgment\n                (as1 <> as2 <> as3)\n                (cs1 <> cs2 <> cs3 <> [EqConst t1 typeBool, EqConst t2 t3])\n                t2\n\n    evalAssert (Judgment as1 cs1 t1) body = do\n        Judgment as2 cs2 t2 <- body\n        pure $\n            Judgment\n                (as1 <> as2)\n                (cs1 <> cs2 <> one (EqConst t1 typeBool))\n                t2\n\n    evalApp (Judgment as1 cs1 t1) e2 = do\n        Judgment as2 cs2 t2 <- e2\n        tv <- fresh\n        pure $\n            Judgment\n                (as1 <> as2)\n                (cs1 <> cs2 <> one (EqConst t1 (t2 :~> tv)))\n                tv\n\n    evalAbs (Param x) k = do\n        a <- freshTVar\n        let tv = TVar a\n        ((), Judgment as cs t) <-\n            extendMSet\n                a\n                $ k\n                    (pure (join ((`Judgment` mempty) . curry one x) tv))\n                $ const\n                $ fmap (mempty,)\n        pure $\n            Judgment\n                (as `Assumption.remove` x)\n                (cs <> [EqConst t' tv | t' <- Assumption.lookup x as])\n                (tv :~> t)\n    evalAbs (ParamSet _mname variadic pset) k = do\n        js <- foldInitializedWith fold one intoFresh pset\n\n        let\n            f (as1, t1) (k, t) = (as1 <> one (k, t), M.insert k t t1)\n            (env, tys) = foldl' f mempty js\n            arg = pure $ Judgment env mempty $ TSet Variadic tys\n            call = k arg $ \\args b -> (args,) <$> b\n            names = fst <$> js\n\n        (args, Judgment as cs t) <- foldr (extendMSet . (\\(TVar a) -> a) . snd) call js\n\n        ty <- foldInitializedWith (TSet variadic) inferredType id args\n\n        pure $\n            Judgment\n                (foldl' Assumption.remove as names)\n                (cs <> [EqConst t' (tys M.! x) | x <- names, t' <- Assumption.lookup x as])\n                (ty :~> t)\n\n    evalError = throwError . EvaluationError\n\n-- * class @FreeTypeVars@\n\nclass FreeTypeVars a where\n    ftv :: a -> Set.Set TVar\n\noccursCheck :: (FreeTypeVars a) => TVar -> a -> Bool\noccursCheck a t = a `Set.member` ftv t\n\n-- ** Instances\n\ninstance FreeTypeVars Type where\n    ftv TCon{} = mempty\n    ftv (TVar a) = one a\n    ftv (TSet _ a) = Set.unions $ ftv <$> M.elems a\n    ftv (TList a) = Set.unions $ ftv <$> a\n    ftv (t1 :~> t2) = ftv t1 <> ftv t2\n    ftv (TMany ts) = Set.unions $ ftv <$> ts\n\ninstance FreeTypeVars TVar where\n    ftv = one\n\ninstance FreeTypeVars Scheme where\n    ftv (Forall as t) = ftv t `Set.difference` Set.fromList as\n\ninstance (FreeTypeVars a) => FreeTypeVars [a] where\n    ftv = foldr ((<>) . ftv) mempty\n\ninstance (Ord a, FreeTypeVars a) => FreeTypeVars (Set.Set a) where\n    ftv = foldr ((<>) . ftv) mempty\n\n-- * class @ActiveTypeVars@\n\nclass ActiveTypeVars a where\n    atv :: a -> Set.Set TVar\n\n-- ** Instances\n\ninstance ActiveTypeVars Constraint where\n    atv (EqConst t1 t2) = ftv t1 <> ftv t2\n    atv (ImpInstConst t1 ms t2) = ftv t1 <> (ftv ms `Set.intersection` ftv t2)\n    atv (ExpInstConst t s) = ftv t <> ftv s\n\ninstance (ActiveTypeVars a) => ActiveTypeVars [a] where\n    atv = foldr ((<>) . atv) mempty\n\n-- * Other\n\ntype MonadInfer m =\n    ( {- MonadThunkId m,-}\n      MonadAtomicRef m\n    , MonadFix m\n    )\n\n-- | Run the inference monad\nrunInfer' :: (MonadInfer m) => InferT s m a -> m (Either InferError a)\nrunInfer' =\n    runExceptT\n        . (`evalStateT` initInfer)\n        . (`runReaderT` mempty)\n        . getInfer\n\nrunInfer :: (forall s. InferT s (FreshIdT Int (ST s)) a) -> Either InferError a\nrunInfer m =\n    runST $ runFreshIdT (runInfer' m) =<< newRef (1 :: Int)\n\ninferType ::\n    forall s m. (MonadInfer m) => Env -> NExpr -> InferT s m [(Subst, Type)]\ninferType env ex =\n    do\n        Judgment as cs t <- infer ex\n        let\n            unbounds :: Set VarName\n            unbounds =\n                (Set.difference `on` Set.fromList)\n                    (Assumption.keys as)\n                    (Env.keys env)\n        when\n            (isPresent unbounds)\n            $ typeError\n            $ UnboundVariables\n            $ ordNub\n            $ Set.toList unbounds\n\n        inferState <- get\n        let\n            cs' =\n                [ ExpInstConst t s\n                | (x, ss) <- Env.toList env\n                , s <- ss\n                , t <- Assumption.lookup x as\n                ]\n            evalResult =\n                (`evalState` inferState) . runSolver $ second (`apply` t) . join (,) <$> solve (cs <> cs')\n\n        either\n            (throwError . TypeInferenceErrors)\n            pure\n            evalResult\n\n-- | Solve for the toplevel type of an expression in a given environment\ninferExpr :: Env -> NExpr -> Either InferError [Scheme]\ninferExpr env ex =\n    closeOver . uncurry apply <<$>> runInfer (inferType env ex)\n\nunops :: Type -> NUnaryOp -> [Constraint]\nunops u1 op =\n    one $\n        EqConst u1 $\n            case op of\n                NNot -> mkUnaryConstr typeBool\n                NNeg -> TMany $ mkUnaryConstr <$> [typeInt, typeFloat]\n  where\n    mkUnaryConstr :: Type -> Type\n    mkUnaryConstr = typeFun . mk2same\n      where\n        mk2same :: a -> NonEmpty a\n        mk2same a = a :| one a\n\nbinops :: Type -> NBinaryOp -> [Constraint]\nbinops u1 op =\n    if\n        -- Equality tells nothing about the types, because any two types are allowed.\n        | op `elem` [NEq, NNEq] -> mempty\n        | op `elem` [NGt, NGte, NLt, NLte] -> inequality\n        | op `elem` [NAnd, NOr, NImpl] -> gate\n        | op == NConcat -> concatenation\n        | op `elem` [NMinus, NMult, NDiv] -> arithmetic\n        | op == NUpdate -> rUnion\n        | op == NPlus -> addition\n        | otherwise -> fail \"GHC so far can not infer that this pattern match is full, so make it happy.\"\n  where\n    mk3 :: a -> a -> a -> NonEmpty a\n    mk3 a b c = a :| [b, c]\n\n    mk3same :: a -> NonEmpty a\n    mk3same a = a :| [a, a]\n\n    allConst :: Type -> [Constraint]\n    allConst = one . EqConst u1 . typeFun . mk3same\n\n    gate = allConst typeBool\n    concatenation = allConst typeList\n\n    eqConstrMtx :: [NonEmpty Type] -> [Constraint]\n    eqConstrMtx = one . EqConst u1 . TMany . fmap typeFun\n\n    inequality =\n        eqConstrMtx\n            [ mk3 typeInt typeInt typeBool\n            , mk3 typeFloat typeFloat typeBool\n            , mk3 typeInt typeFloat typeBool\n            , mk3 typeFloat typeInt typeBool\n            ]\n\n    arithmetic =\n        eqConstrMtx\n            [ mk3same typeInt\n            , mk3same typeFloat\n            , mk3 typeInt typeFloat typeFloat\n            , mk3 typeFloat typeInt typeFloat\n            ]\n\n    rUnion =\n        eqConstrMtx\n            [ mk3same typeSet\n            , mk3 typeSet typeNull typeSet\n            , mk3 typeNull typeSet typeSet\n            ]\n\n    addition =\n        eqConstrMtx\n            [ mk3same typeInt\n            , mk3same typeFloat\n            , mk3 typeInt typeFloat typeFloat\n            , mk3 typeFloat typeInt typeFloat\n            , mk3same typeString\n            , mk3same typePath\n            , mk3 typeString typeString typePath\n            ]\n\nliftInfer :: (Monad m) => m a -> InferT s m a\nliftInfer = InferT . lift . lift . lift\n\n-- * Other\n\ninfer :: (MonadInfer m) => NExpr -> InferT s m (Judgment s)\ninfer = foldFix Eval.eval\n\ninferTop :: Env -> [(VarName, NExpr)] -> Either InferError Env\ninferTop env [] = pure env\ninferTop env ((name, ex) : xs) =\n    (\\ty -> inferTop (extend env (name, ty)) xs)\n        =<< inferExpr env ex\n\n-- * Other\n\nnewtype Solver m a = Solver (LogicT (StateT [TypeError] m) a)\n    deriving\n        ( Functor\n        , Applicative\n        , Alternative\n        , Monad\n        , MonadPlus\n        , MonadLogic\n        , MonadState [TypeError]\n        )\n\nrunSolver :: forall m a. (Monad m) => Solver m a -> m (Either [TypeError] [a])\nrunSolver (Solver s) =\n    uncurry report <$> runStateT (observeAllT s) mempty\n  where\n    report :: [a] -> [TypeError] -> Either [TypeError] [a]\n    report xs e =\n        handlePresence\n            (Left $ ordNub e)\n            pure\n            xs\n\n-- ** Instances\n\ninstance MonadTrans Solver where\n    lift = Solver . lift . lift\n\ninstance (Monad m) => MonadError TypeError (Solver m) where\n    throwError err = Solver $ lift (modify (err :)) *> mempty\n    catchError _ _ = error \"This is never used\"\n\n-- * Other\n\nbind :: (Monad m) => TVar -> Type -> Solver m Subst\nbind a t\n    | t == TVar a = stub\n    | occursCheck a t = throwError $ InfiniteType a t\n    | otherwise = pure $ Subst $ one (a, t)\n\nconsidering :: [a] -> Solver m a\nconsidering xs = Solver $ LogicT $ \\c n -> foldr c n xs\n\nunifies :: (Monad m) => Type -> Type -> Solver m Subst\nunifies t1 t2 | t1 == t2 = stub\nunifies (TVar v) t = v `bind` t\nunifies t (TVar v) = v `bind` t\nunifies (TList xs) (TList ys)\n    | allSameType xs && allSameType ys =\n        case (xs, ys) of\n            (x : _, y : _) -> unifies x y\n            _ -> stub\n    | length xs == length ys = unifyMany xs ys\n-- Putting a statement that lists of different lengths containing various types would not\n-- be unified.\nunifies t1@(TList _) t2@(TList _) = throwError $ UnificationFail t1 t2\nunifies (TSet Variadic _) (TSet Variadic _) = stub\nunifies (TSet Closed s) (TSet Closed b) | null (M.keys b \\\\ M.keys s) = stub\nunifies (TSet _ a) (TSet _ b) | (M.keys a `intersect` M.keys b) == M.keys b = stub\nunifies (t1 :~> t2) (t3 :~> t4) = unifyMany [t1, t2] [t3, t4]\nunifies (TMany t1s) t2 = considering t1s >>- (`unifies` t2)\nunifies t1 (TMany t2s) = considering t2s >>- unifies t1\nunifies t1 t2 = throwError $ UnificationFail t1 t2\n\nunifyMany :: (Monad m) => [Type] -> [Type] -> Solver m Subst\nunifyMany [] [] = stub\nunifyMany (t1 : ts1) (t2 : ts2) =\n    do\n        su1 <- unifies t1 t2\n        su2 <-\n            (unifyMany `on` apply su1) ts1 ts2\n        pure $ compose su1 su2\nunifyMany t1 t2 = throwError $ UnificationMismatch t1 t2\n\nnextSolvable :: [Constraint] -> (Constraint, [Constraint])\nnextSolvable = fromJust . find solvable . pickFirstOne\n  where\n    pickFirstOne :: (Eq a) => [a] -> [(a, [a])]\n    pickFirstOne xs = [(x, ys) | x <- xs, let ys = delete x xs]\n\n    solvable :: (Constraint, [Constraint]) -> Bool\n    solvable (EqConst{}, _) = True\n    solvable (ExpInstConst{}, _) = True\n    solvable (ImpInstConst _t1 ms t2, cs) =\n        null $ (ms `Set.difference` ftv t2) `Set.intersection` atv cs\n\nsolve :: forall m. (MonadState InferState m) => [Constraint] -> Solver m Subst\nsolve [] = stub\nsolve cs = solve' $ nextSolvable cs\n  where\n    solve' (ImpInstConst t1 ms t2, cs) =\n        solve (ExpInstConst t1 (generalize ms t2) : cs)\n    solve' (ExpInstConst t s, cs) =\n        do\n            s' <- lift $ instantiate s\n            solve (EqConst t s' : cs)\n    solve' (EqConst t1 t2, cs) =\n        ( \\su1 ->\n            (pure . compose su1) -<< solve ((`apply` cs) su1)\n        )\n            -<< unifies t1 t2\n\ninfixr 1 -<<\n\n-- | @LogicT@ fair conjunction, since library has only @>>-@\n(-<<) :: (Monad m) => (a -> Solver m b) -> Solver m a -> Solver m b\n(-<<) = flip (>>-)\n"
  },
  {
    "path": "src/Nix/Type/LICENSE",
    "content": "Copyright (c) 2014-2015, Stephen Diehl\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to\ndeal in the Software without restriction, including without limitation the\nrights to use, copy, modify, merge, publish, distribute, sublicense, and/or\nsell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\nIN THE SOFTWARE.\n"
  },
  {
    "path": "src/Nix/Type/Type.hs",
    "content": "{- | The basis of the Nix type system (type-level).\n  Based on the Hindley–Milner type system.\n  Therefore -> from this the type inference follows.\n-}\nmodule Nix.Type.Type where\n\nimport Nix.Expr.Types\nimport Nix.Prelude hiding (TVar, Type)\n\n-- | Hindrey-Milner type interface\n\n-- | Type variable in the Nix type system.\nnewtype TVar = TV Text\n    deriving (Show, Eq, Ord)\n\n-- | The basic type definitions in the Nix type system (type-level code).\ndata Type\n    = -- | Type variable in the Nix type system.\n      TVar TVar\n    | -- | Concrete (non-polymorphic, constant) type in the Nix type system.\n      TCon Text\n    | -- | Heterogeneous map in the Nix type system. @True@ -> variadic.\n      TSet Variadic (AttrSet Type)\n    | -- | Heterogeneous list in the Nix type system.\n      TList [Type]\n    | -- | Type arrow (@Type -> Type@) in the Nix type system.\n      (:~>) Type Type\n    | -- | Variant type (term). Since relating to Nix type system, more precicely -\n      --       dynamic types in dynamicly typed language (which is Nix).\n      TMany [Type]\n    deriving (Show, Eq, Ord)\n\ninfixr 1 :~>\n\n{- | Hindley–Milner type system uses \"scheme\" term for \"polytypes\".\n  Types containing @forall@ quantifiers: @forall a . a@.\n  Note: HM allows only top-level @forall@ quantification, so no @RankNTypes@ in it.\n-}\ndata Scheme\n    = -- | @Forall [TVar] Type@: the Nix type system @forall vars. type@.\n      Forall [TVar] Type\n    deriving (Show, Eq, Ord)\n\n-- | Concrete types in the Nix type system.\ntypeNull, typeBool, typeInt, typeFloat, typeString, typePath :: Type\ntypeNull = TCon \"null\"\ntypeBool = TCon \"boolean\"\ntypeInt = TCon \"integer\"\ntypeFloat = TCon \"float\"\ntypeString = TCon \"string\"\ntypePath = TCon \"path\"\n\n-- This models a set that unifies with any other set.\ntypeSet :: Type\ntypeSet = TSet mempty mempty\n\ntypeList :: Type\ntypeList = TList mempty\n\ntypeFun :: NonEmpty Type -> Type\ntypeFun (head_ :| tail_) = foldr (:~>) head_ tail_\n"
  },
  {
    "path": "src/Nix/Unused.hs",
    "content": "{-# LANGUAGE FunctionalDependencies #-}\n{-# LANGUAGE TemplateHaskell #-}\n{-# OPTIONS_GHC -Wno-missing-signatures #-}\n\n{- | This module holds unused code.\nSo, if someone wants something - look here, use it & move to appropriate place.\n-}\nmodule Nix.Unused\nwhere\n\nimport Control.Monad.Free (Free (..))\nimport Data.Fix (Fix (..))\nimport Lens.Family2.TH (makeLensesBy)\nimport Nix.Prelude\n\n-- * From \"Nix.Utils\"\n\n-- | > type AlgM f m a = f a -> m a\ntype AlgM f m a = f a -> m a\n\nwhenFree ::\n    (Monoid b) =>\n    (f (Free f a) -> b) ->\n    Free f a ->\n    b\nwhenFree =\n    free\n        mempty\n{-# INLINE whenFree #-}\n\nwhenPure ::\n    (Monoid b) =>\n    (a -> b) ->\n    Free f a ->\n    b\nwhenPure f =\n    free\n        f\n        mempty\n{-# INLINE whenPure #-}\n\n{- | Replace:\n @Pure a -> a@\n @Free -> Fix@\n-}\nfreeToFix :: (Functor f) => (a -> Fix f) -> Free f a -> Fix f\nfreeToFix f = go\n  where\n    go =\n        free\n            f\n            $ Fix . (go <$>)\n\n{- | Replace:\n @a -> Pure a@\n @Fix -> Free@\n-}\nfixToFree :: (Functor f) => Fix f -> Free f a\nfixToFree = Free . go\n  where\n    go (Fix f) = Free . go <$> f\n\nloeb :: (Functor f) => f (f a -> a) -> f a\nloeb x = go\n  where\n    go = ($ go) <$> x\n\nadiM ::\n    ( Traversable t\n    , Monad m\n    ) =>\n    Transform t (m a) ->\n    AlgM t m a ->\n    Fix t ->\n    m a\nadiM g f = g $ f <=< traverse (adiM g f) . unFix\n\npara :: (Functor f) => (f (Fix f, a) -> a) -> Fix f -> a\npara f = f . fmap (id &&& para f) . unFix\n\nparaM :: (Traversable f, Monad m) => (f (Fix f, a) -> m a) -> Fix f -> m a\nparaM f = f <=< traverse (\\x -> (x,) <$> paraM f x) . unFix\n\ncataP :: (Functor f) => (Fix f -> f a -> a) -> Fix f -> a\ncataP f x = f x . fmap (cataP f) . unFix $ x\n\ncataPM :: (Traversable f, Monad m) => (Fix f -> f a -> m a) -> Fix f -> m a\ncataPM f x = f x <=< traverse (cataPM f) . unFix $ x\n\n$(makeLensesBy (\\n -> pure $ \"_\" <> n) ''Fix)\n"
  },
  {
    "path": "src/Nix/Utils/Fix1.hs",
    "content": "{-# LANGUAGE CPP #-}\n{-# LANGUAGE ConstraintKinds #-}\n{-# LANGUAGE GeneralizedNewtypeDeriving #-}\n{-# LANGUAGE PolyKinds #-}\n{-# LANGUAGE TypeFamilies #-}\n{-# LANGUAGE UndecidableInstances #-}\n\nmodule Nix.Utils.Fix1 (\n    Fix1 (..),\n    Fix1T (..),\n    MonadFix1T,\n)\nwhere\n\nimport Control.Monad.Catch (\n    MonadCatch,\n    MonadMask,\n    MonadThrow,\n )\nimport Control.Monad.Fix (MonadFix)\nimport Control.Monad.Ref (\n    MonadAtomicRef (..),\n    MonadRef (..),\n )\nimport Nix.Prelude\n\n{- | The fixpoint combinator.\nCourtesy of Gregory Malecha.\nhttps://gist.github.com/gmalecha/ceb3778b9fdaa4374976e325ac8feced\n-}\nnewtype Fix1 (t :: (k -> Type) -> k -> Type) (a :: k) = Fix1 {unFix1 :: t (Fix1 t) a}\n\nderiving instance Generic (Fix1 t a)\nderiving instance\n    (Functor (t (Fix1 t))) =>\n    Functor (Fix1 t)\nderiving instance\n    (Applicative (t (Fix1 t))) =>\n    Applicative (Fix1 t)\nderiving instance\n    (Alternative (t (Fix1 t))) =>\n    Alternative (Fix1 t)\nderiving instance\n    (Monad (t (Fix1 t))) =>\n    Monad (Fix1 t)\nderiving instance\n    (MonadPlus (t (Fix1 t))) =>\n    MonadPlus (Fix1 t)\nderiving instance\n    (MonadFix (t (Fix1 t))) =>\n    MonadFix (Fix1 t)\nderiving instance\n    (MonadIO (t (Fix1 t))) =>\n    MonadIO (Fix1 t)\nderiving instance\n    (MonadCatch (t (Fix1 t))) =>\n    MonadCatch (Fix1 t)\nderiving instance\n    (MonadThrow (t (Fix1 t))) =>\n    MonadThrow (Fix1 t)\n\nderiving instance\n    (MonadReader e (t (Fix1 t))) =>\n    MonadReader e (Fix1 t)\nderiving instance\n    (MonadState s (t (Fix1 t))) =>\n    MonadState s (Fix1 t)\n\nnewtype Fix1T (t :: (k -> Type) -> (Type -> Type) -> k -> Type) (m :: Type -> Type) (a :: k)\n    = Fix1T {unFix1T :: t (Fix1T t m) m a}\n\nderiving instance Generic (Fix1T t m m)\nderiving instance\n    (Functor (t (Fix1T t m) m)) =>\n    Functor (Fix1T t m)\nderiving instance\n    (Applicative (t (Fix1T t m) m)) =>\n    Applicative (Fix1T t m)\nderiving instance\n    (Alternative (t (Fix1T t m) m)) =>\n    Alternative (Fix1T t m)\nderiving instance\n    (Monad (t (Fix1T t m) m)) =>\n    Monad (Fix1T t m)\nderiving instance\n    (MonadFail (t (Fix1T t m) m)) =>\n    MonadFail (Fix1T t m)\nderiving instance\n    (MonadPlus (t (Fix1T t m) m)) =>\n    MonadPlus (Fix1T t m)\nderiving instance\n    (MonadFix (t (Fix1T t m) m)) =>\n    MonadFix (Fix1T t m)\nderiving instance\n    (MonadIO (t (Fix1T t m) m)) =>\n    MonadIO (Fix1T t m)\nderiving instance\n    (MonadCatch (t (Fix1T t m) m)) =>\n    MonadCatch (Fix1T t m)\nderiving instance\n    (MonadThrow (t (Fix1T t m) m)) =>\n    MonadThrow (Fix1T t m)\nderiving instance\n    (MonadMask (t (Fix1T t m) m)) =>\n    MonadMask (Fix1T t m)\n\nderiving instance\n    (MonadReader e (t (Fix1T t m) m)) =>\n    MonadReader e (Fix1T t m)\nderiving instance\n    (MonadState s (t (Fix1T t m) m)) =>\n    MonadState s (Fix1T t m)\n\ntype MonadFix1T t m = (MonadTrans (Fix1T t), Monad (t (Fix1T t m) m))\n\ninstance\n    ( MonadFix1T t m\n    , MonadRef m\n    ) =>\n    MonadRef (Fix1T t m)\n    where\n    type Ref (Fix1T t m) = Ref m\n\n    newRef = lift . newRef\n    {-# INLINE newRef #-}\n    readRef = lift . readRef\n    {-# INLINE readRef #-}\n    writeRef r = lift . writeRef r\n    {-# INLINE writeRef #-}\n\ninstance\n    ( MonadFix1T t m\n    , MonadAtomicRef m\n    ) =>\n    MonadAtomicRef (Fix1T t m)\n    where\n    atomicModifyRef r = lift . atomicModifyRef r\n    {-# INLINE atomicModifyRef #-}\n\n{-\n\nnewtype Flip (f :: i -> j -> *) (a :: j) (b :: i) = Flip { unFlip :: f b a }\n\n-- | Natural Transformations\n--  ( Included from\n--   [compdata](https://hackage.haskell.org/package/compdata)\n--  )\ntype (:->) f g = forall a. f a -> g a\n\nclass HFunctor f where\n  hfmap :: a :-> b -> f a :-> f b\n\n-}\n"
  },
  {
    "path": "src/Nix/Utils.hs",
    "content": "{-# LANGUAGE CPP #-}\n{-# LANGUAGE GeneralizedNewtypeDeriving #-}\n\n{- | This is a module of custom \"Prelude\" code.\nIt is for import for projects other then @HNix@.\nFor @HNix@ - this module gets reexported by \"Prelude\", so for @HNix@ please fix-up pass-through there.\n-}\nmodule Nix.Utils (\n    stub,\n    pass,\n    dup,\n    both,\n    mapPair,\n    iterateN,\n    nestM,\n    applyAll,\n    traverse2,\n    lifted,\n    whenTrue,\n    whenFalse,\n    whenJust,\n    isPresent,\n    handlePresence,\n    whenText,\n    free,\n    Path (..),\n    isAbsolute,\n    (</>),\n    joinPath,\n    splitDirectories,\n    takeDirectory,\n    takeFileName,\n    takeBaseName,\n    takeExtension,\n    takeExtensions,\n    addExtension,\n    dropExtensions,\n    replaceExtension,\n    readFile,\n    Alg,\n    Transform,\n    TransformF,\n    loebM,\n    adi,\n    Has (..),\n    askLocal,\n    KeyMap,\n    trace,\n    traceM,\n    module X,\n)\nwhere\n\nimport Relude hiding (\n    force,\n    pass,\n    readFile,\n    trace,\n    traceM,\n    whenJust,\n    whenNothing,\n )\n\nimport Codec.Serialise (Serialise)\nimport Control.Monad (foldM)\nimport Control.Monad.Fix (MonadFix (..))\nimport Control.Monad.Free (Free (..))\nimport Control.Monad.Trans.Control (MonadTransControl (..))\nimport qualified Data.Aeson as A\nimport Data.Binary (Binary)\nimport Data.Data (Data)\nimport Data.Fix (Fix (..))\nimport qualified Data.Text as Text\nimport Lens.Family2 as X (\n    Lens',\n    LensLike',\n    over,\n    view,\n )\nimport Lens.Family2.Stock (\n    _1,\n    _2,\n )\nimport qualified System.FilePath as FilePath\n\n#if ENABLE_TRACING\nimport qualified Relude.Debug                 as X\n#else\n-- Well, since it is currently CPP intermingled with Debug.Trace, required to use String here.\ntrace :: String -> a -> a\ntrace = const id\n{-# inline trace #-}\ntraceM :: Monad m => String -> m ()\ntraceM = const stub\n{-# inline traceM #-}\n#endif\n\n-- * Helpers\n\n-- After migration from the @relude@ - @relude: pass -> stub@\n\n-- | @pure mempty@: Short-curcuit, stub.\nstub :: (Applicative f, Monoid a) => f a\nstub = pure mempty\n{-# INLINE stub #-}\n\n-- | Alias for 'stub', since \"Relude\" has more specialized @pure ()@.\npass :: (Applicative f) => f ()\npass = stub\n{-# INLINE pass #-}\n\n-- | Duplicates object into a tuple.\ndup :: a -> (a, a)\ndup x = (x, x)\n{-# INLINE dup #-}\n\n{- | Apply a single function to both components of a pair.\n\n> both succ (1,2) == (2,3)\n\nTaken From package @extra@\n-}\nboth :: (a -> b) -> (a, a) -> (b, b)\nboth f (x, y) = (f x, f y)\n{-# INLINE both #-}\n\n{- | Gives tuple laziness.\n\nTakem from @utility-ht@.\n-}\nmapPair :: (a -> c, b -> d) -> (a, b) -> (c, d)\nmapPair ~(f, g) ~(a, b) = (f a, g b)\n{-# INLINE mapPair #-}\n\niterateN ::\n    forall a.\n    -- | Recursively apply 'Int' times\n    Int ->\n    -- | the function\n    (a -> a) ->\n    -- | starting from argument\n    a ->\n    a\niterateN n f x =\n    -- It is hard to read - yes. It is a non-recursive momoized action - yes.\n    fix ((<*> (0 /=)) . ((bool x . f) .) . (. pred)) n\n\nnestM ::\n    (Monad m) =>\n    -- | Recursively apply 'Int' times\n    Int ->\n    -- | function (Kleisli arrow).\n    (a -> m a) ->\n    -- | to value\n    a ->\n    -- | & join layers of 'm'\n    m a\nnestM 0 _ x = pure x\nnestM n f x =\n    foldM (const . f) x $ replicate @() n mempty -- fuses. But also, can it be fix join?\n{-# INLINE nestM #-}\n\n-- | In `foldr` order apply functions.\napplyAll :: (Foldable t) => t (a -> a) -> a -> a\napplyAll = flip (foldr id)\n\ntraverse2 ::\n    ( Applicative m\n    , Applicative n\n    , Traversable t\n    ) =>\n    -- | Run function that runs 2 'Applicative' actions\n    ( a ->\n      m (n b)\n    ) ->\n    -- | on every element in 'Traversable'\n    t a ->\n    -- | collect the results.\n    m (n (t b))\ntraverse2 f x = sequenceA <$> traverse f x\n\n--  2021-08-21: NOTE: Someone needs to put in normal words, what this does.\n-- This function is pretty spefic & used only once, in \"Nix.Normal\".\nlifted ::\n    (MonadTransControl u, Monad (u m), Monad m) =>\n    ((a -> m (StT u b)) -> m (StT u b)) ->\n    (a -> u m b) ->\n    u m b\nlifted f k =\n    restoreT . pure =<< liftWith (\\run -> f (run . k))\n\n-- * Eliminators\n\nwhenTrue ::\n    (Monoid a) =>\n    a ->\n    Bool ->\n    a\nwhenTrue =\n    bool\n        mempty\n{-# INLINE whenTrue #-}\n\nwhenFalse ::\n    (Monoid a) =>\n    a ->\n    Bool ->\n    a\nwhenFalse f =\n    bool\n        f\n        mempty\n{-# INLINE whenFalse #-}\n\nwhenJust ::\n    (Monoid b) =>\n    (a -> b) ->\n    Maybe a ->\n    b\nwhenJust =\n    maybe\n        mempty\n{-# INLINE whenJust #-}\n\nisPresent :: (Foldable t) => t a -> Bool\nisPresent = not . null\n{-# INLINE isPresent #-}\n\n-- | 'maybe'-like eliminator, for foldable empty/inhabited structures.\nhandlePresence :: (Foldable t) => b -> (t a -> b) -> t a -> b\nhandlePresence d f t =\n    bool\n        d\n        (f t)\n        (isPresent t)\n{-# INLINE handlePresence #-}\n\nwhenText ::\n    a -> (Text -> a) -> Text -> a\nwhenText e f t =\n    bool\n        e\n        (f t)\n        (not $ Text.null t)\n\n-- | Lambda analog of @maybe@ or @either@ for Free monad.\nfree :: (a -> b) -> (f (Free f a) -> b) -> Free f a -> b\nfree fP fF fr =\n    case fr of\n        Pure a -> fP a\n        Free fa -> fF fa\n{-# INLINE free #-}\n\n-- * Path\n\n-- | Explicit type boundary between FilePath & String.\nnewtype Path = Path FilePath\n    deriving\n        ( Eq\n        , Ord\n        , Generic\n        , Typeable\n        , Data\n        , NFData\n        , Serialise\n        , Binary\n        , A.ToJSON\n        , A.FromJSON\n        , Show\n        , Read\n        , Hashable\n        , Semigroup\n        , Monoid\n        )\n\ninstance ToText Path where\n    toText = toText @String . coerce\n\ninstance IsString Path where\n    fromString = coerce\n\n-- ** Path functions\n\n-- | This set of @Path@ funcs is to control system filepath types & typesafety and to easily migrate from FilePath to anything suitable (like @path@ or so).\n\n-- | 'Path's 'FilePath.isAbsolute'.\nisAbsolute :: Path -> Bool\nisAbsolute = coerce FilePath.isAbsolute\n\n-- | 'Path's 'FilePath.(</>)'.\n(</>) :: Path -> Path -> Path\n(</>) = coerce (FilePath.</>)\n\ninfixr 5 </>\n\n-- | 'Path's 'FilePath.joinPath'.\njoinPath :: [Path] -> Path\njoinPath = coerce FilePath.joinPath\n\n-- | 'Path's 'FilePath.splitDirectories'.\nsplitDirectories :: Path -> [Path]\nsplitDirectories = coerce FilePath.splitDirectories\n\n-- | 'Path's 'FilePath.takeDirectory'.\ntakeDirectory :: Path -> Path\ntakeDirectory = coerce FilePath.takeDirectory\n\n-- | 'Path's 'FilePath.takeFileName'.\ntakeFileName :: Path -> Path\ntakeFileName = coerce FilePath.takeFileName\n\n-- | 'Path's 'FilePath.takeBaseName'.\ntakeBaseName :: Path -> String\ntakeBaseName = coerce FilePath.takeBaseName\n\n-- | 'Path's 'FilePath.takeExtension'.\ntakeExtension :: Path -> String\ntakeExtension = coerce FilePath.takeExtensions\n\n-- | 'Path's 'FilePath.takeExtensions'.\ntakeExtensions :: Path -> String\ntakeExtensions = coerce FilePath.takeExtensions\n\n-- | 'Path's 'FilePath.addExtensions'.\naddExtension :: Path -> String -> Path\naddExtension = coerce FilePath.addExtension\n\n-- | 'Path's 'FilePath.dropExtensions'.\ndropExtensions :: Path -> Path\ndropExtensions = coerce FilePath.dropExtensions\n\n-- | 'Path's 'FilePath.replaceExtension'.\nreplaceExtension :: Path -> String -> Path\nreplaceExtension = coerce FilePath.replaceExtension\n\n-- | 'Path's 'FilePath.readFile'.\nreadFile :: (MonadIO m) => Path -> m Text\nreadFile = fmap decodeUtf8 . readFileBS . coerce\n\n-- * Recursion scheme\n\n{- | F-algebra defines how to reduce the fixed-point of a functor to a value.\n> type Alg f a = f a -> a\n-}\ntype Alg f a = f a -> a\n\n{- | Do according transformation.\n\nIt is a transformation of a recursion scheme.\nSee @TransformF@.\n-}\ntype Transform f a = TransformF (Fix f) a\n\n{- | Do according transformation.\n\nIt is a transformation between functors.\n-}\ntype TransformF f a = (f -> a) -> f -> a\n\nloebM :: (MonadFix m, Traversable t) => t (t a -> m a) -> m (t a)\nloebM f = mfix $ \\a -> (`traverse` f) ($ a)\n{-# INLINE loebM #-}\n\n{- | adi is Abstracting Definitional Interpreters:\n\n    https://arxiv.org/abs/1707.04755\n\n  All ADI does is interleaves every layer of evaluation by inserting intermitten layers between them, in that way the evaluation can be extended/embelished in any way wanted. Look at its use to see great examples.\n\n  Essentially, it does for evaluation what recursion schemes do for\n  representation: allows threading layers through existing structure, only\n  in this case through behavior.\n-}\nadi ::\n    (Functor f) =>\n    Transform f a ->\n    Alg f a ->\n    Fix f ->\n    a\nadi g f = g $ f . (adi g f <$>) . unFix\n\n-- * Has lens\n\nclass Has a b where\n    hasLens :: Lens' a b\n\ninstance Has a a where\n    hasLens f = f\n\ninstance Has (a, b) a where\n    hasLens = _1\n\ninstance Has (a, b) b where\n    hasLens = _2\n\n-- | Retrive monad state by 'Lens''.\naskLocal :: (MonadReader t m, Has t a) => m a\naskLocal = asks $ view hasLens\n\n-- * Other\n\n-- | > Hashmap Text -- type synonym\ntype KeyMap = HashMap Text\n"
  },
  {
    "path": "src/Nix/Value/Equal.hs",
    "content": "{-# LANGUAGE AllowAmbiguousTypes #-}\n{-# LANGUAGE ConstraintKinds #-}\n{-# LANGUAGE TypeFamilies #-}\n{-# OPTIONS_GHC -Wno-missing-pattern-synonym-signatures #-}\n\nmodule Nix.Value.Equal where\n\nimport Control.Comonad (Comonad (extract))\nimport Control.Monad.Free (Free (Free, Pure))\nimport Control.Monad.Trans.Except (throwE)\nimport qualified Data.HashMap.Lazy as HashMap.Lazy\nimport Data.Semialign (\n    Align,\n    Semialign (align),\n )\nimport Data.These (These (These))\nimport Nix.Atoms\nimport Nix.Expr.Types (AttrSet)\nimport Nix.Frames\nimport Nix.Prelude hiding (Comparison)\nimport Nix.String\nimport Nix.Thunk\nimport Nix.Value\n\ncheckComparable ::\n    ( Framed e m\n    , MonadDataErrorContext t f m\n    ) =>\n    NValue t f m ->\n    NValue t f m ->\n    m ()\ncheckComparable x y =\n    case (x, y) of\n        (NVConstant (NInt _), NVConstant (NInt _)) -> stub\n        (NVConstant (NInt _), NVConstant (NFloat _)) -> stub\n        (NVConstant (NFloat _), NVConstant (NInt _)) -> stub\n        (NVConstant (NFloat _), NVConstant (NFloat _)) -> stub\n        (NVStr _, NVStr _) -> stub\n        (NVPath _, NVPath _) -> stub\n        _ -> throwError $ Comparison x y\n\n{- | Checks whether two containers are equal, using the given item equality\n  predicate. If there are any item slots that don't match between the two\n  containers, the result will be @False@.\n-}\nalignEqM ::\n    (Align f, Traversable f, Monad m) =>\n    (a -> b -> m Bool) ->\n    f a ->\n    f b ->\n    m Bool\nalignEqM eq fa fb =\n    fmap\n        (isRight @() @())\n        $ runExceptT\n        $ traverse_\n            (guard <=< lift . uncurry eq)\n            =<< traverse\n                ( \\case\n                    These a b -> pure (a, b)\n                    _ -> throwE mempty\n                )\n                (Data.Semialign.align fa fb)\n\nalignEq :: (Align f, Traversable f) => (a -> b -> Bool) -> f a -> f b -> Bool\nalignEq eq fa fb =\n    runIdentity $ alignEqM ((Identity .) . eq) fa fb\n\nisDerivationM ::\n    (Monad m) =>\n    ( t ->\n      m (Maybe NixString)\n    ) ->\n    AttrSet t ->\n    m Bool\nisDerivationM f m =\n    maybe\n        False\n        -- (2019-03-18):\n        -- We should probably really make sure the context is empty here\n        -- but the C++ implementation ignores it.\n        ((==) \"derivation\" . ignoreContext)\n        . join\n        <$> traverse f (HashMap.Lazy.lookup \"type\" m)\n\nisDerivation ::\n    (Monad m) =>\n    ( t ->\n      Maybe NixString\n    ) ->\n    AttrSet t ->\n    Bool\nisDerivation f = runIdentity . isDerivationM (Identity . f)\n\nvalueFEqM ::\n    (Monad n) =>\n    ( AttrSet a ->\n      AttrSet a ->\n      n Bool\n    ) ->\n    ( a ->\n      a ->\n      n Bool\n    ) ->\n    NValueF p m a ->\n    NValueF p m a ->\n    n Bool\nvalueFEqM attrsEq eq =\n    curry $\n        \\case\n            (NVConstantF (NFloat x), NVConstantF (NInt y)) -> pure $ x == fromInteger y\n            (NVConstantF (NInt x), NVConstantF (NFloat y)) -> pure $ fromInteger x == y\n            (NVConstantF lc, NVConstantF rc) -> pure $ lc == rc\n            (NVStrF ls, NVStrF rs) -> pure $ (\\i -> i ls == i rs) ignoreContext\n            (NVListF ls, NVListF rs) -> alignEqM eq ls rs\n            (NVSetF _ lm, NVSetF _ rm) -> attrsEq lm rm\n            (NVPathF lp, NVPathF rp) -> pure $ lp == rp\n            _ -> pure False\n\nvalueFEq ::\n    (AttrSet a -> AttrSet a -> Bool) ->\n    (a -> a -> Bool) ->\n    NValueF p m a ->\n    NValueF p m a ->\n    Bool\nvalueFEq attrsEq eq x y =\n    runIdentity $\n        valueFEqM\n            ((Identity .) . attrsEq)\n            ((Identity .) . eq)\n            x\n            y\n\ncompareAttrSetsM ::\n    (Monad m) =>\n    (t -> m (Maybe NixString)) ->\n    (t -> t -> m Bool) ->\n    AttrSet t ->\n    AttrSet t ->\n    m Bool\ncompareAttrSetsM f eq lm rm =\n    bool\n        compareAttrs\n        (fromMaybe compareAttrs equalOutPaths)\n        =<< areDerivations\n  where\n    areDerivations = on (liftA2 (&&)) (isDerivationM f) lm rm\n    equalOutPaths = on (liftA2 eq) (HashMap.Lazy.lookup \"outPath\") lm rm\n    compareAttrs = alignEqM eq lm rm\n\ncompareAttrSets ::\n    (t -> Maybe NixString) ->\n    (t -> t -> Bool) ->\n    AttrSet t ->\n    AttrSet t ->\n    Bool\ncompareAttrSets f eq lm rm =\n    runIdentity $ compareAttrSetsM (Identity . f) ((Identity .) . eq) lm rm\n\nvalueEqM ::\n    forall t f m.\n    (MonadThunk t m (NValue t f m), NVConstraint f) =>\n    NValue t f m ->\n    NValue t f m ->\n    m Bool\nvalueEqM (Pure x) (Pure y) = thunkEqM x y\nvalueEqM (Pure x) y@(Free _) = thunkEqM x =<< thunk (pure y)\nvalueEqM x@(Free _) (Pure y) = (`thunkEqM` y) =<< thunk (pure x)\nvalueEqM (Free (NValue' (extract -> x))) (Free (NValue' (extract -> y))) =\n    valueFEqM\n        (compareAttrSetsM findNVStr valueEqM)\n        valueEqM\n        x\n        y\n  where\n    findNVStr :: NValue t f m -> m (Maybe NixString)\n    findNVStr =\n        free\n            ( pure\n                . ( \\case\n                        NVStr s -> pure s\n                        _ -> mempty\n                  )\n                <=< force\n            )\n            ( pure\n                . \\case\n                    NVStr' s -> pure s\n                    _ -> mempty\n            )\n\n-- This function has mutual recursion with `valueEqM`, and this function so far is not used across the project,\n-- but that one is.\nthunkEqM :: (MonadThunk t m (NValue t f m), NVConstraint f) => t -> t -> m Bool\nthunkEqM lt rt =\n    do\n        lv <- force lt\n        rv <- force rt\n\n        let\n            unsafePtrEq =\n                bool\n                    (valueEqM lv rv)\n                    (pure True)\n                    $ on (==) thunkId lt rt\n\n        case (lv, rv) of\n            (NVClosure _ _, NVClosure _ _) -> unsafePtrEq\n            (NVList _, NVList _) -> unsafePtrEq\n            (NVSet _ _, NVSet _ _) -> unsafePtrEq\n            _ -> valueEqM lv rv\n"
  },
  {
    "path": "src/Nix/Value/Monad.hs",
    "content": "module Nix.Value.Monad where\n\n-- * @MonadValue@ - a main implementation class\n\nclass MonadValue v m where\n    -- | Wrap value into a thunk.\n    defer :: m v -> m v\n\n    -- | Force the evaluation of the value.\n    demand :: v -> m v\n\n    -- | If 'v' is a thunk, 'inform' allows us to modify the action to be\n    --     performed by the thunk, perhaps by enriching it with scope info, for\n    --     example.\n    inform :: v -> m v\n\n-- * @MonadValueF@ - a Kleisli-able customization class\n\nclass MonadValueF v m where\n    demandF :: (v -> m r) -> v -> m r\n    informF :: (m v -> m v) -> v -> m v\n"
  },
  {
    "path": "src/Nix/Value.hs",
    "content": "{-# LANGUAGE CPP #-}\n{-# LANGUAGE ConstraintKinds #-}\n{-# LANGUAGE DeriveAnyClass #-}\n{-# LANGUAGE KindSignatures #-}\n{-# LANGUAGE PatternSynonyms #-}\n{-# LANGUAGE RankNTypes #-}\n{-# LANGUAGE TemplateHaskell #-}\n{-# OPTIONS_GHC -Wno-missing-pattern-synonym-signatures #-}\n{-# OPTIONS_GHC -Wno-missing-signatures #-}\n\n-- | The core of the type system, Nix language values\nmodule Nix.Value\nwhere\n\nimport Control.Comonad (\n    Comonad,\n    extract,\n )\nimport Control.Monad.Free (\n    Free (..),\n    hoistFree,\n    iter,\n    iterM,\n )\nimport qualified Data.Aeson as Aeson\nimport Data.Functor.Classes (\n    Eq1 (liftEq),\n    Show1,\n    liftShowsPrec,\n    showsUnaryWith,\n )\nimport Lens.Family2.Stock (_2)\nimport Lens.Family2.TH (\n    makeLenses,\n    makeTraversals,\n )\nimport Nix.Atoms\nimport Nix.Expr.Types\nimport Nix.Prelude\nimport Nix.String\nimport Nix.Thunk\nimport Text.Show (\n    showParen,\n    showString,\n    showsPrec,\n )\nimport qualified Text.Show\n\n-- * @__NValueF__@: Base functor (F)\n\n{- | An NValueF p m r represents all the possible types of Nix values.\n\n  Is is the base functor to form the Free monad of nix expressions.\n  The parameter `r` represents Nix values in their final form (NValue).\n  The parameter `p` represents exactly the same type, but is kept separate\n  or it would prevent NValueF from being a proper functor.\n  It is intended to be hard-coded to the same final type as r.\n  `m` is the monad in which evaluations will run.\n-}\n\n{- | An NValue' t f m a is a magic layer between NValueF and the Free monad construction.\n\n  It fixes the `p` parameter of NValueF to the final NValue type, making the\n  definition of NValue' and NValue depend on each other in a recursive\n  fashion.\n\n  It also introduces a `f` parameter for a custom functor that can be used\n  to wrap each intermediate value in the reduced expression tree.\n  This is where expression evaluations can store annotations and other\n  useful information.\n\n  `t` is not really used here, but is needed to type the (NValue t f m)\n  used to tie the knot of the `p` parameter in the inner NValueF.\n\n  `a` is will be an `NValue t f m` when NValue' functor is turned into a\n  Free monad.\n-}\n\n{- | 'NValue t f m' is the most reduced form of a 'NExpr' after evaluation is\n  completed. It is a layer cake of NValueF base values, wrapped in the f\n  functor and into the Free recursive construction.\n\n  Concretely, an NValue t f m can either be a thunk, representing a value\n  yet to be evaluated (Pure t), or a know value in WHNF\n  (Free (NValue' t f m (NValue t f m))) = (Free (f (NValueF NValue m NValue))\n  That is, a base value type, wrapped into the generic `f`\n  functor, and based on other NValue's, which can in turn be either thunks,\n  or more already WHNF evaluated values.\n\n  As an example, the value `[1]` will be represented as\n\n  Free (f (NVListF [\n     (Free (f (NVConstantF (NInt 1))))\n  ]))\n\n  Should this 1 be a laziy and yet unevaluated value, it would be represented as\n\n  Free (f (NVListF [ (Pure t) ]))\n\n  Where the t is evaluator dependant, and should contain anough information\n  to be evaluated to an NValue when needed. `demand` of `force` are used to\n  turn a potential thunk into a `m (NValue t f m)`.\n\n  Of course, trees can be much bigger.\n\n  The number of layers and type aliases for similar things is huge, so\n  this module provides ViewPatterns for each NValueF constructor.\n\n  For example, the pattern NVStr' ns matches a NValue' containing an NVStrF,\n  and bind that NVStrF to ns, ignoring the f functor inside.\n  Similarly, the pattern NVStr ns (without prime mark) will match the inner\n  NVstrF value inside an NValue. Of course, the patterns are declined for\n  all the NValueF constructors. The non primed version also has an NVThunk t\n  pattern to account for the possibility of an NValue to no be fully\n  evaluated yet, as opposed to an NValue'.\n-}\ndata NValueF p m r\n    = NVConstantF NAtom\n    | -- | A string has a value and a context, which can be used to record what a\n      --       string has been build from\n      NVStrF NixString\n    | NVPathF Path\n    | NVListF [r]\n    | -- |\n      --       Quite frequently actions/processing happens with values\n      --       (for example - forcing of values & recreation of the monad),\n      --       but @SourcePos@ does not change then.\n      NVSetF PositionSet (AttrSet r)\n    | -- | A function is a closed set of parameters representing the \"call\n      --       signature\", used at application time to check the type of arguments\n      --       passed to the function. Since it supports default values which may\n      --       depend on other values within the final argument set, this\n      --       dependency is represented as a set of pending evaluations. The\n      --       arguments are finally normalized into a set which is passed to the\n      --       function.\n      --\n      --       Note that 'm r' is being used here because effectively a function\n      --       and its set of default arguments is \"never fully evaluated\". This\n      --       enforces in the type that it must be re-evaluated for each call.\n      NVClosureF (Params ()) (p -> m r)\n    | -- | A builtin function is itself already in normal form. Also, it may\n      --       or may not choose to evaluate its argument in the production of a\n      --       result.\n      NVBuiltinF VarName (p -> m r)\n    deriving (Generic, Typeable, Functor)\n\n-- ** Eq\n\ninstance (Eq r) => Eq (NValueF p m r) where\n    (==) (NVConstantF x) (NVConstantF y) = x == y\n    (==) (NVStrF x) (NVStrF y) = x == y\n    (==) (NVPathF x) (NVPathF y) = x == y\n    (==) (NVListF x) (NVListF y) = x == y\n    (==) (NVSetF _ x) (NVSetF _ y) = x == y\n    (==) _ _ = False\n\n-- ** Eq1\n\ninstance Eq1 (NValueF p m) where\n    liftEq _ (NVConstantF x) (NVConstantF y) = x == y\n    liftEq _ (NVStrF x) (NVStrF y) = x == y\n    liftEq _ (NVPathF x) (NVPathF y) = x == y\n    liftEq eq (NVListF x) (NVListF y) = liftEq eq x y\n    liftEq eq (NVSetF _ x) (NVSetF _ y) = liftEq eq x y\n    liftEq _ _ _ = False\n\n-- ** Show\n\ninstance (Show r) => Show (NValueF p m r) where\n    showsPrec d =\n        \\case\n            (NVConstantF atom) -> showsCon1 \"NVConstant\" atom\n            (NVStrF ns) -> showsCon1 \"NVStr\" $ ignoreContext ns\n            (NVListF lst) -> showsCon1 \"NVList\" lst\n            (NVSetF _ attrs) -> showsCon1 \"NVSet\" attrs\n            (NVClosureF params _) -> showsCon1 \"NVClosure\" params\n            (NVPathF path) -> showsCon1 \"NVPath\" path\n            (NVBuiltinF name _) -> showsCon1 \"NVBuiltin\" name\n      where\n        showsCon1 :: (Show a) => String -> a -> String -> String\n        showsCon1 con a =\n            showParen (d > 10) $ showString (con <> \" \") . showsPrec 11 a\n\n-- ** Foldable\n\n-- | Folds what the value is known to contain at time of fold.\ninstance Foldable (NValueF p m) where\n    foldMap f = \\case\n        NVConstantF _ -> mempty\n        NVStrF _ -> mempty\n        NVPathF _ -> mempty\n        NVClosureF _ _ -> mempty\n        NVBuiltinF _ _ -> mempty\n        NVListF l -> foldMap f l\n        NVSetF _ s -> foldMap f s\n\n-- ** Traversable\n\n-- | @sequence@\nsequenceNValueF ::\n    (Functor n, Monad m, Applicative n) =>\n    (forall x. n x -> m x) ->\n    NValueF p m (n a) ->\n    n (NValueF p m a)\nsequenceNValueF transform = \\case\n    NVConstantF a -> pure $ NVConstantF a\n    NVStrF s -> pure $ NVStrF s\n    NVPathF p -> pure $ NVPathF p\n    NVListF l -> NVListF <$> sequenceA l\n    NVSetF p s -> NVSetF p <$> sequenceA s\n    NVClosureF p g -> pure $ NVClosureF p (transform <=< g)\n    NVBuiltinF s g -> pure $ NVBuiltinF s (transform <=< g)\n\n-- ** Monad\n\n-- | @bind@\nbindNValueF ::\n    (Monad m, Monad n) =>\n    -- | Transform @n@ into @m@.\n    (forall x. n x -> m x) ->\n    -- | A Kleisli arrow (see 'Control.Arrow.Kleisli' & Kleisli catagory).\n    (a -> n b) ->\n    -- | \"Unfixed\" (openly recursive) value of an embedded Nix language.\n    NValueF p m a ->\n    -- | An implementation of @transform (f =<< x)@ for embedded Nix language values.\n    n (NValueF p m b)\nbindNValueF transform f = \\case\n    NVConstantF a -> pure $ NVConstantF a\n    NVStrF s -> pure $ NVStrF s\n    NVPathF p -> pure $ NVPathF p\n    NVListF l -> NVListF <$> traverse f l\n    NVSetF p s -> NVSetF p <$> traverse f s\n    NVClosureF p g -> pure $ NVClosureF p (transform . f <=< g)\n    NVBuiltinF s g -> pure $ NVBuiltinF s (transform . f <=< g)\n\n-- *** MonadTrans\n\n-- | @lift@\nliftNValueF ::\n    (MonadTrans u, Monad m) =>\n    NValueF p m a ->\n    NValueF p (u m) a\nliftNValueF = hoistNValueF lift\n\n-- **** MonadTransUnlift\n\n-- | @unlift@\nunliftNValueF ::\n    (MonadTrans u, Monad m) =>\n    (forall x. u m x -> m x) ->\n    NValueF p (u m) a ->\n    NValueF p m a\nunliftNValueF = hoistNValueF\n\n-- **** Utils\n\n-- | Back & forth hoisting in the monad stack\nhoistNValueF ::\n    (forall x. m x -> n x) ->\n    NValueF p m a ->\n    NValueF p n a\nhoistNValueF lft =\n    \\case\n        -- Pass-through the:\n        --   [ NVConstantF a\n        --   , NVStrF s\n        --   , NVPathF p\n        --   , NVListF l\n        --   , NVSetF p s\n        --   ]\n        NVConstantF a -> NVConstantF a\n        NVStrF s -> NVStrF s\n        NVPathF p -> NVPathF p\n        NVListF l -> NVListF l\n        NVSetF p s -> NVSetF p s\n        NVBuiltinF s g -> NVBuiltinF s (lft . g)\n        NVClosureF p g -> NVClosureF p (lft . g)\n{-# INLINE hoistNValueF #-}\n\n-- * @__NValue'__@: forming the (F(A))\n\n{- | NVConstraint constraint the f layer in @NValue'@.\nIt makes bijection between sub category of Hask and Nix Value possible.\n'Comonad' enable Nix Value to Hask part.\n'Applicative' enable Hask to Nix Value part.\n-}\ntype NVConstraint f = (Comonad f, Applicative f)\n\n{- | At the time of constructor, the expected arguments to closures are values\n  that may contain thunks. The type of such thunks are fixed at that time.\n-}\nnewtype NValue' t f m a\n    = NValue'\n    { _nValue :: f (NValueF (NValue t f m) m a)\n    -- ^ Applying F-algebra Base functor data type (@NValueF@) to the F-algebra carrier (@NValue@), forming the \\( F(A)-> A \\)).\n    }\n    deriving (Generic, Typeable, Functor, Foldable)\n\ninstance (NVConstraint f, Show a) => Show (NValue' t f m a) where\n    show (NValue' (extract -> v)) = show v\n\n-- ** Show1\n\ninstance (NVConstraint f) => Show1 (NValue' t f m) where\n    liftShowsPrec sp sl p = \\case\n        NVConstant' atom -> showsUnaryWith showsPrec \"NVConstantF\" p atom\n        NVStr' ns -> showsUnaryWith showsPrec \"NVStrF\" p $ ignoreContext ns\n        NVList' lst -> showsUnaryWith (liftShowsPrec sp sl) \"NVListF\" p lst\n        NVSet' _ attrs -> showsUnaryWith (liftShowsPrec sp sl) \"NVSetF\" p attrs\n        NVPath' path -> showsUnaryWith showsPrec \"NVPathF\" p path\n        NVClosure' c _ -> showsUnaryWith showsPrec \"NVClosureF\" p c\n        NVBuiltin' name _ -> showsUnaryWith showsPrec \"NVBuiltinF\" p name\n\n-- ** Traversable\n\n-- | @sequence@\nsequenceNValue' ::\n    (Functor n, Traversable f, Monad m, Applicative n) =>\n    (forall x. n x -> m x) ->\n    NValue' t f m (n a) ->\n    n (NValue' t f m a)\nsequenceNValue' transform (NValue' v) =\n    NValue' <$> traverse (sequenceNValueF transform) v\n\n-- ** Profunctor\n\n-- | @lmap@\nlmapNValueF :: (Functor m) => (b -> a) -> NValueF a m r -> NValueF b m r\nlmapNValueF f = \\case\n    NVConstantF a -> NVConstantF a\n    NVStrF s -> NVStrF s\n    NVPathF p -> NVPathF p\n    NVListF l -> NVListF l\n    NVSetF p s -> NVSetF p s\n    NVClosureF p g -> NVClosureF p (g . f)\n    NVBuiltinF s g -> NVBuiltinF s (g . f)\n\n-- ** Free\n\n-- | @iter@\niterNValue' ::\n    forall t f m a r.\n    (MonadDataContext f m) =>\n    ((NValue' t f m a -> r) -> a -> r) ->\n    (NValue' t f m r -> r) ->\n    NValue' t f m a ->\n    r\niterNValue' k f = fix ((f .) . fmap . k)\n\n-- *** Utils\n\n-- | @hoistFree@: Back & forth hoisting in the monad stack\nhoistNValue' ::\n    (Functor m, Functor n, Functor f) =>\n    (forall x. n x -> m x) ->\n    (forall x. m x -> n x) ->\n    NValue' t f m a ->\n    NValue' t f n a\nhoistNValue' run lft (NValue' v) =\n    NValue' $ lmapNValueF (hoistNValue lft run) . hoistNValueF lft <$> v\n{-# INLINE hoistNValue' #-}\n\n-- ** Monad\n\n-- | @bind@\nbindNValue' ::\n    (Traversable f, Monad m, Monad n) =>\n    (forall x. n x -> m x) ->\n    (a -> n b) ->\n    NValue' t f m a ->\n    n (NValue' t f m b)\nbindNValue' transform f (NValue' v) =\n    NValue' <$> traverse (bindNValueF transform f) v\n\n-- *** MonadTrans\n\n-- | @lift@\nliftNValue' ::\n    (MonadTrans u, Monad m, Functor (u m), Functor f) =>\n    (forall x. u m x -> m x) ->\n    NValue' t f m a ->\n    NValue' t f (u m) a\nliftNValue' run = hoistNValue' run lift\n\n-- **** MonadTransUnlift\n\n-- | @unlift@\nunliftNValue' ::\n    (MonadTrans u, Monad m, Functor (u m), Functor f) =>\n    (forall x. u m x -> m x) -> -- aka \"run\"\n    NValue' t f (u m) a ->\n    NValue' t f m a\nunliftNValue' = hoistNValue' lift\n\n-- ** Bijective Hask subcategory <-> @NValue'@\n\n-- *** @F: Hask subcategory <-> NValue'@\n\n-- #mantra#\n\n{- $Patterns @F: Hask <-> NValue'@\n\nSince Haskell and Nix are both recursive purely functional lazy languages.\nAnd since recursion-schemes.\nIt is possible to create a direct functor between the Hask and Nix categories.\nOr make Nix a DLS language of Haskell, embed it into a Hask, if you would like.\nOf course, we mean: pick Hask subcategory and form Nix Category from it.\nTake subcategory of Hask, and by applying functor to it - have a Nix Category.\nWouldn't it be cool and fast?\n\nIn fact - it is what we do here.\n\nSince it is a proper way of scientific implementation, we would eventually form a\nlawful functor.\n\nModule pattens use @language PatternSynonyms@: bidirectional synonyms (@<-@),\nand @ViewPatterns@: (@->@) at the same time.\n@ViewPatterns Control.Comonad.extract@ extracts\nfrom the @NValue (Free (NValueF a))@\nthe @NValueF a@. Which is @NValueF p m r@. Since it extracted from the\n@NValue@, which is formed by \\( (F a -> a) F a \\) in the first place.\nSo @NValueF p m r@ which is extracted here, internally holds the next NValue.\n\nFacts of bijection between Hask subcategory objects and Nix objects,\nand between Hask subcategory morphisms and Nix morphisms are seen blow:\n-}\n\n-- | Using of Nulls is generally discouraged (in programming language design et al.), but, if you need it.\npattern NVNull' :: (NVConstraint w) => NValue' t w m a\npattern NVNull' = NVConstant' NNull\n\n-- | Haskell constant to the Nix constant,\npattern NVConstant' :: (NVConstraint w) => NAtom -> NValue' t w m a\npattern NVConstant' x <- NValue' (extract -> NVConstantF x)\n    where\n        NVConstant' = NValue' . pure . NVConstantF\n\n-- | Haskell text & context to the Nix text & context,\npattern NVStr' :: (NVConstraint w) => NixString -> NValue' t w m a\npattern NVStr' ns <- NValue' (extract -> NVStrF ns)\n    where\n        NVStr' = NValue' . pure . NVStrF\n\n-- | Haskell @Path@ to the Nix path,\npattern NVPath' :: (NVConstraint w) => Path -> NValue' t w m a\npattern NVPath' x <- NValue' (extract -> NVPathF x)\n    where\n        NVPath' = NValue' . pure . NVPathF . coerce\n\n-- | Haskell @[]@ to the Nix @[]@,\npattern NVList' :: (NVConstraint w) => [a] -> NValue' t w m a\npattern NVList' l <- NValue' (extract -> NVListF l)\n    where\n        NVList' = NValue' . pure . NVListF\n\n-- | Haskell key-value to the Nix key-value,\npattern NVSet' :: (NVConstraint w) => PositionSet -> AttrSet a -> NValue' t w m a\npattern NVSet' p s <- NValue' (extract -> NVSetF p s)\n    where\n        NVSet' p s = NValue' $ pure $ NVSetF p s\n\n-- | Haskell closure to the Nix closure,\npattern NVClosure' :: (NVConstraint w) => Params () -> (NValue t w m -> m a) -> NValue' t w m a\npattern NVClosure' x f <- NValue' (extract -> NVClosureF x f)\n    where\n        NVClosure' x f = NValue' $ pure $ NVClosureF x f\n\n-- | Haskell functions to the Nix functions!\npattern NVBuiltin' :: (NVConstraint w) => VarName -> (NValue t w m -> m a) -> NValue' t w m a\npattern NVBuiltin' name f <- NValue' (extract -> NVBuiltinF name f)\n    where\n        NVBuiltin' name f = NValue' $ pure $ NVBuiltinF name f\n\n{-# COMPLETE NVConstant', NVStr', NVPath', NVList', NVSet', NVClosure', NVBuiltin' #-}\n\n-- * @__NValue__@: Nix language values\n\n{- | 'NValue t f m' is\n  a value in head normal form (it means only the tip of it has been\n  evaluated to the normal form, while the rest of it is in lazy\n  not evaluated form (thunk), this known as WHNF).\n\n  An action 'm (NValue t f m)' is a pending evaluation that\n  has yet to be performed.\n\n  An 't' is either:\n    * a pending evaluation.\n    * a value in head normal form.\n\n  The 'Free' structure is used here to represent the possibility that\n  Nix language allows cycles that may appear during normalization.\n-}\ntype NValue t f m = Free (NValue' t f m) t\n\n-- ** Free\n\n-- | HOF of @iter@ from @Free@\niterNValue ::\n    forall t f m r.\n    (MonadDataContext f m) =>\n    ((NValue t f m -> r) -> t -> r) ->\n    (NValue' t f m r -> r) ->\n    NValue t f m ->\n    r\niterNValue k f = fix ((iter f .) . fmap . k) -- already almost iterNValue'\n\niterNValueByDiscardWith ::\n    (MonadDataContext f m) =>\n    r ->\n    (NValue' t f m r -> r) ->\n    NValue t f m ->\n    r\niterNValueByDiscardWith = iterNValue . const . const\n\n-- | HOF of @iterM@ from @Free@\niterNValueM ::\n    (MonadDataContext f m, Monad n) =>\n    (forall x. n x -> m x) ->\n    ((NValue t f m -> n r) -> t -> n r) ->\n    (NValue' t f m (n r) -> n r) ->\n    NValue t f m ->\n    n r\niterNValueM transform k f = fix (((iterM f <=< go) .) . fmap . k)\n  where\n    go (Pure x) = Pure <$> x -- It should be a 'sequenceA' if to remote 'transform' form function.\n    go (Free fa) = Free <$> bindNValue' transform go fa\n\n-- *** Utils\n\n-- | @hoistFree@, Back & forth hoisting in the monad stack\nhoistNValue ::\n    (Functor m, Functor n, Functor f) =>\n    (forall x. n x -> m x) ->\n    (forall x. m x -> n x) ->\n    NValue t f m ->\n    NValue t f n\nhoistNValue run lft = hoistFree $ hoistNValue' run lft\n{-# INLINE hoistNValue #-}\n\n-- ** MonadTrans\n\n-- | @lift@\nliftNValue ::\n    (MonadTrans u, Monad m, Functor (u m), Functor f) =>\n    (forall x. u m x -> m x) ->\n    NValue t f m ->\n    NValue t f (u m)\nliftNValue f = hoistNValue f lift\n\n-- *** MonadTransUnlift\n\n-- | @unlift@\nunliftNValue ::\n    (MonadTrans u, Monad m, Functor (u m), Functor f) =>\n    (forall x. u m x -> m x) -> -- aka \"run\"\n    NValue t f (u m) ->\n    NValue t f m\nunliftNValue = hoistNValue lift\n\n-- ** Methods @F: Hask → NValue@\n\n--\n\n{- $Methods @F: Hask → NValue@\n\nThe morphisms of the functor @Hask → NValue@.\nContinuation of the mantra: \"Nix.Value#mantra\"\n-}\n\n-- | Using of Nulls is generally discouraged (in programming language design et al.), but, if you need it.\nmkNVStrWithoutContext ::\n    (NVConstraint f) =>\n    Text ->\n    NValue t f m\nmkNVStrWithoutContext = NVStr . mkNixStringWithoutContext\n\nbuiltin ::\n    forall m f t.\n    (MonadThunk t m (NValue t f m), MonadDataContext f m) =>\n    -- | function name\n    VarName ->\n    -- | unary function\n    ( NValue t f m ->\n      m (NValue t f m)\n    ) ->\n    m (NValue t f m)\nbuiltin = (pure .) . NVBuiltin\n\nbuiltin2 ::\n    (MonadThunk t m (NValue t f m), MonadDataContext f m) =>\n    -- | function name\n    VarName ->\n    -- | binary function\n    ( NValue t f m ->\n      NValue t f m ->\n      m (NValue t f m)\n    ) ->\n    m (NValue t f m)\nbuiltin2 = ((.) <*> (.)) . builtin\n\nbuiltin3 ::\n    (MonadThunk t m (NValue t f m), MonadDataContext f m) =>\n    -- | function name\n    VarName ->\n    -- | ternary function\n    ( NValue t f m ->\n      NValue t f m ->\n      NValue t f m ->\n      m (NValue t f m)\n    ) ->\n    m (NValue t f m)\nbuiltin3 =\n    liftA2\n        (.) -- compose 2 together\n        builtin\n        ((.) . builtin2)\n\n-- *** @F: Evaluation -> NValue@\n\npattern NVNull = Free NVNull'\npattern NVThunk t = Pure t\npattern NVValue v = Free v\n{-# COMPLETE NVThunk, NVValue, NVNull #-}\npattern NVConstant x = Free (NVConstant' x)\npattern NVStr ns = Free (NVStr' ns)\npattern NVPath x = Free (NVPath' x)\npattern NVList l = Free (NVList' l)\npattern NVSet s x = Free (NVSet' s x)\npattern NVBuiltin name f = Free (NVBuiltin' name f)\npattern NVClosure x f = Free (NVClosure' x f)\n{-# COMPLETE NVThunk, NVConstant, NVStr, NVPath, NVList, NVSet, NVClosure, NVBuiltin #-}\n\n-- * @TStringContext@\n\ndata TStringContext = NoContext | HasContext\n    deriving (Show)\n\ninstance Semigroup TStringContext where\n    (<>) NoContext NoContext = NoContext\n    (<>) _ _ = HasContext\n\ninstance Monoid TStringContext where\n    mempty = NoContext\n\n-- * @ValueType@\n\ndata ValueType\n    = TInt\n    | TFloat\n    | TBool\n    | TNull\n    | TString TStringContext\n    | TList\n    | TSet\n    | TClosure\n    | TPath\n    | TBuiltin\n    deriving (Show)\n\n-- | Determine type of a value\nvalueType :: NValueF a m r -> ValueType\nvalueType =\n    \\case\n        NVConstantF a ->\n            case a of\n                NURI _ -> TString mempty\n                NInt _ -> TInt\n                NFloat _ -> TFloat\n                NBool _ -> TBool\n                NNull -> TNull\n        NVStrF ns ->\n            TString $\n                HasContext `whenTrue` hasContext ns\n        NVListF{} -> TList\n        NVSetF{} -> TSet\n        NVClosureF{} -> TClosure\n        NVPathF{} -> TPath\n        NVBuiltinF{} -> TBuiltin\n\n-- | Describe type value\ndescribeValue :: ValueType -> Text\ndescribeValue =\n    \\case\n        TInt -> \"an integer\"\n        TFloat -> \"a float\"\n        TBool -> \"a boolean\"\n        TNull -> \"a null\"\n        TString NoContext -> \"a string with no context\"\n        TString HasContext -> \"a string\"\n        TList -> \"a list\"\n        TSet -> \"an attr set\"\n        TClosure -> \"a function\"\n        TPath -> \"a path\"\n        TBuiltin -> \"a builtin function\"\n\nshowValueType ::\n    (MonadThunk t m (NValue t f m), Comonad f) =>\n    NValue t f m ->\n    m Text\nshowValueType (Pure t) = showValueType =<< force t\nshowValueType (Free (NValue' (extract -> v))) =\n    pure $ describeValue $ valueType v\n\n-- * @ValueFrame@\n\ndata ValueFrame t f m\n    = ForcingThunk t\n    | ConcerningValue (NValue t f m)\n    | Comparison (NValue t f m) (NValue t f m)\n    | Addition (NValue t f m) (NValue t f m)\n    | Multiplication (NValue t f m) (NValue t f m)\n    | Division (NValue t f m) (NValue t f m)\n    | Coercion ValueType ValueType\n    | CoercionToJson (NValue t f m)\n    | CoercionFromJson Aeson.Value\n    | Expectation ValueType (NValue t f m)\n    deriving (Typeable)\n\nderiving instance (NVConstraint f, Show t) => Show (ValueFrame t f m)\n\n-- * @MonadDataContext@\n\ntype MonadDataContext f (m :: Type -> Type) =\n    (Comonad f, Applicative f, Traversable f, Monad m)\n\n-- * @MonadDataErrorContext@\n\ntype MonadDataErrorContext t f m =\n    (Show t, Typeable t, Typeable m, Typeable f, MonadDataContext f m, MonadFail m)\n\ninstance (MonadDataErrorContext t f m) => Exception (ValueFrame t f m)\n\n-- * @instance Eq NValue'@\n\ninstance (Eq a, Comonad f) => Eq (NValue' t f m a) where\n    (==) (NValue' (extract -> x)) (NValue' (extract -> y)) = x == y\n\n-- * @instance Eq1 NValue'@\n\n-- TH derivable works only after MonadDataContext\ninstance (Comonad f) => Eq1 (NValue' t f m) where\n    liftEq eq (NValue' (extract -> x)) (NValue' (extract -> y)) = liftEq eq x y\n\n-- * @NValueF@ traversals, getter & setters\n\n-- | Make traversals for Nix traversable structures.\n$(makeTraversals ''NValueF)\n\n-- | Make lenses for the Nix values\n$(makeLenses ''NValue')\n\n{- | Lens-generated getter-setter function for a traversable NValue' key-val structures.\n  Nix value analogue of the @Data-Aeson-Lens@:@key :: AsValue t => Text -> Traversal' t Value@.\n-}\nkey ::\n    (Traversable f, Applicative g) =>\n    VarName ->\n    LensLike' g (NValue' t f m a) (Maybe a)\nkey k = nValue . traverse . _NVSetF . _2 . hashAt k\n"
  },
  {
    "path": "src/Nix/Var.hs",
    "content": "{-# LANGUAGE AllowAmbiguousTypes #-}\n{-# LANGUAGE ConstraintKinds #-}\n{-# OPTIONS_GHC -Wno-orphans #-}\n{-# OPTIONS_GHC -Wno-unused-top-binds #-}\n\nmodule Nix.Var ()\nwhere\n\nimport Control.Monad.Ref\nimport Data.GADT.Compare (GEq (..))\nimport Data.STRef (STRef)\nimport Nix.Prelude\nimport Type.Reflection ((:~:) (Refl))\n\nimport Unsafe.Coerce (unsafeCoerce)\n\neqVar :: (GEq (Ref m)) => Ref m a -> Ref m a -> Bool\neqVar a b = isJust $ geq a b\n\n-- TODO: Upstream GEq instances\n-- Upstream thread: https://github.com/haskellari/some/pull/34\ninstance GEq IORef where\n    geq = gEqual\n\ninstance GEq (STRef s) where\n    geq = gEqual\n\n-- | Simply a helper function\ngEqual :: (Eq a) => a -> b -> Maybe c\ngEqual a b =\n    bool\n        Nothing\n        (pure $ unsafeCoerce Refl)\n        (a == unsafeCoerce b)\n"
  },
  {
    "path": "src/Nix/XML.hs",
    "content": "module Nix.XML (toXML)\nwhere\n\nimport qualified Data.HashMap.Lazy as M\nimport Nix.Atoms\nimport Nix.Expr.Types\nimport Nix.Prelude\nimport Nix.String\nimport Nix.Value\nimport Text.XML.Light (\n    Attr (Attr),\n    Content (Elem),\n    Element (Element),\n    ppElement,\n    unqual,\n )\n\ntoXML :: forall t f m. (MonadDataContext f m) => NValue t f m -> NixString\ntoXML = runWithStringContext . fmap pp . iterNValueByDiscardWith cyc phi\n  where\n    cyc = pure $ mkEVal \"string\" \"<expr>\"\n\n    pp :: Element -> Text\n    pp e =\n        heading\n            <> fromString\n                ( ppElement $\n                    mkE\n                        \"expr\"\n                        (one $ Elem e)\n                )\n            <> \"\\n\"\n      where\n        heading = \"<?xml version='1.0' encoding='utf-8'?>\\n\"\n\n    phi :: NValue' t f m (WithStringContext Element) -> WithStringContext Element\n    phi = \\case\n        NVConstant' a ->\n            pure $\n                case a of\n                    NURI t -> mkEVal \"string\" t\n                    NInt n -> mkEVal \"int\" $ show n\n                    NFloat f -> mkEVal \"float\" $ show f\n                    NBool b -> mkEVal \"bool\" $ if b then \"true\" else \"false\"\n                    NNull -> mkE \"null\" mempty\n        NVStr' str ->\n            mkEVal \"string\" <$> extractNixString str\n        NVList' l ->\n            mkE \"list\" . fmap Elem <$> sequenceA l\n        NVSet' _ s ->\n            mkE\n                \"attrs\"\n                . fmap\n                    mkElem'\n                . sortWith fst\n                . M.toList\n                <$> sequenceA s\n          where\n            mkElem' :: (VarName, Element) -> Content\n            mkElem' (k, v) =\n                Elem $\n                    Element\n                        (unqual \"attr\")\n                        (one $ Attr (unqual \"name\") $ toString k)\n                        (one $ Elem v)\n                        Nothing\n        NVClosure' p _ ->\n            pure $\n                mkE\n                    \"function\"\n                    (paramsXML p)\n        NVPath' fp -> pure $ mkEVal \"path\" $ fromString $ coerce fp\n        NVBuiltin' name _ -> pure $ mkEName \"function\" name\n\nmkE :: Text -> [Content] -> Element\nmkE (toString -> n) c =\n    Element\n        (unqual n)\n        mempty\n        c\n        Nothing\n\nmkElem :: Text -> Text -> Text -> Element\nmkElem (toString -> n) (toString -> a) (toString -> v) =\n    Element\n        (unqual n)\n        (one $ Attr (unqual a) v)\n        mempty\n        Nothing\n\nmkEVal :: Text -> Text -> Element\nmkEVal = (`mkElem` \"value\")\n\nmkEName :: Text -> VarName -> Element\nmkEName x (coerce -> y) = (`mkElem` \"name\") x y\n\nparamsXML :: Params r -> [Content]\nparamsXML (Param name) = one $ Elem $ mkEName \"varpat\" name\nparamsXML (ParamSet mname variadic pset) =\n    one $ Elem $ Element (unqual \"attrspat\") (battr <> nattr) (paramSetXML pset) Nothing\n  where\n    battr =\n        one (Attr (unqual \"ellipsis\") \"1\") `whenTrue` (variadic == Variadic)\n    nattr =\n        (one . Attr (unqual \"name\") . toString) `whenJust` mname\n\nparamSetXML :: ParamSet r -> [Content]\nparamSetXML = fmap (Elem . mkEName \"attr\" . fst)\n"
  },
  {
    "path": "src/Nix.hs",
    "content": "module Nix (\n    module Nix.Cache,\n    module Nix.Exec,\n    module Nix.Expr.Types,\n    module Nix.Expr.Shorthands,\n    module Nix.Expr.Types.Annotated,\n    module Nix.Frames,\n    module Nix.Render.Frame,\n    module Nix.Normal,\n    module Nix.Options,\n    module Nix.String,\n    module Nix.Parser,\n    module Nix.Pretty,\n    module Nix.Reduce,\n    module Nix.Thunk,\n    module Nix.Value,\n    module Nix.XML,\n    withNixContext,\n    nixEvalExpr,\n    nixEvalExprLoc,\n    nixTracingEvalExprLoc,\n    evaluateExpression,\n    processResult,\n)\nwhere\n\nimport Data.Fix (Fix)\nimport qualified Data.HashMap.Lazy as M\nimport qualified Data.Text as Text\nimport qualified Data.Text.Read as Text\nimport GHC.Err (errorWithoutStackTrace)\nimport Nix.Builtins\nimport Nix.Cache\nimport qualified Nix.Eval as Eval\nimport Nix.Exec\nimport Nix.Expr.Shorthands\nimport Nix.Expr.Types\nimport Nix.Expr.Types.Annotated\nimport Nix.Frames\nimport Nix.Normal\nimport Nix.Options\nimport Nix.Parser\nimport Nix.Prelude\nimport Nix.Pretty\nimport Nix.Reduce\nimport Nix.Render.Frame\nimport Nix.String\nimport Nix.Thunk\nimport Nix.Value\nimport Nix.Value.Monad\nimport Nix.XML\nimport Relude.Unsafe ((!!))\n\n{- | This is the entry point for all evaluations, whatever the expression tree\n  type. It sets up the common Nix environment and applies the\n  transformations, allowing them to be easily composed.\n-}\nnixEval ::\n    (MonadNix e t f m, Has e Options, Functor g) =>\n    Transform g (m a) ->\n    Alg g (m a) ->\n    Maybe Path ->\n    Fix g ->\n    m a\nnixEval transform alg mpath = withNixContext mpath . adi transform alg\n\n-- | Evaluate a nix expression in the default context\nnixEvalExpr ::\n    (MonadNix e t f m, Has e Options) =>\n    Maybe Path ->\n    NExpr ->\n    m (NValue t f m)\nnixEvalExpr = nixEval id Eval.eval\n\n-- | Evaluate a nix expression in the default context\nnixEvalExprLoc ::\n    forall e t f m.\n    (MonadNix e t f m, Has e Options) =>\n    Maybe Path ->\n    NExprLoc ->\n    m (NValue t f m)\nnixEvalExprLoc =\n    nixEval\n        Eval.addMetaInfo\n        Eval.evalContent\n\n{- | Evaluate a nix expression with tracing in the default context. Note that\n  this function doesn't do any tracing itself, but 'evalExprLoc' will be\n  'tracing' is set to 'True' in the Options structure (accessible through\n  'MonadNix'). All this function does is provide the right type class\n  context.\n-}\nnixTracingEvalExprLoc ::\n    (MonadNix e t f m, Has e Options, MonadIO m, Alternative m) =>\n    Maybe Path ->\n    NExprLoc ->\n    m (NValue t f m)\nnixTracingEvalExprLoc mpath = withNixContext mpath . evalExprLoc\n\nevaluateExpression ::\n    (MonadNix e t f m, Has e Options) =>\n    Maybe Path ->\n    (Maybe Path -> NExprLoc -> m (NValue t f m)) ->\n    (NValue t f m -> m a) ->\n    NExprLoc ->\n    m a\nevaluateExpression mpath evaluator handler expr =\n    do\n        opts <- askOptions\n        (coerce -> args) <-\n            (traverse . traverse)\n                eval'\n                $ (second parseArg <$> getArg opts)\n                    <> (second mkStr <$> getArgstr opts)\n        f <- evaluator mpath expr\n        f' <- demand f\n        val <-\n            case f' of\n                NVClosure _ g -> g $ NVSet mempty $ M.fromList args\n                _ -> pure f\n        processResult handler val\n  where\n    parseArg s =\n        either\n            (errorWithoutStackTrace . show)\n            id\n            (parseNixText s)\n\n    eval' = normalForm <=< nixEvalExpr mpath\n\nprocessResult ::\n    forall e t f m a.\n    (MonadNix e t f m, Has e Options) =>\n    (NValue t f m -> m a) ->\n    NValue t f m ->\n    m a\nprocessResult h val =\n    do\n        opts <- askOptions\n        maybe\n            (h val)\n            (\\(coerce . Text.splitOn \".\" -> keys) -> processKeys keys val)\n            (getAttr opts)\n  where\n    processKeys :: [VarName] -> NValue t f m -> m a\n    processKeys kys v =\n        handlePresence\n            (h v)\n            ( \\((k : ks) :: [VarName]) ->\n                do\n                    v' <- demand v\n                    case (k, v') of\n                        (Text.decimal . coerce -> Right (n, \"\"), NVList xs) -> processKeys ks $ xs !! n\n                        (_, NVSet _ xs) ->\n                            maybe\n                                (errorWithoutStackTrace $ \"Set does not contain key ''\" <> show k <> \"''.\")\n                                (processKeys ks)\n                                (M.lookup k xs)\n                        (_, _) -> errorWithoutStackTrace $ \"Expected a set or list for selector '\" <> show k <> \"', but got: \" <> show v\n            )\n            kys\n"
  },
  {
    "path": "tests/EvalTests.hs",
    "content": "{-# LANGUAGE QuasiQuotes #-}\n{-# LANGUAGE TemplateHaskell #-}\n{-# OPTIONS_GHC -Wno-missing-signatures #-}\n\nmodule EvalTests (\n    tests,\n    genEvalCompareTests,\n) where\n\nimport Control.Monad.Catch\nimport Data.List ((\\\\))\nimport qualified Data.Set as S\nimport Data.Time\nimport NeatInterpolation (text)\nimport Nix\nimport Nix.Prelude\nimport Nix.Standard\nimport Nix.Value.Equal\nimport qualified System.Directory as D\nimport Test.Tasty\nimport Test.Tasty.HUnit\nimport Test.Tasty.TH\nimport TestCommon\n\ncase_basic_sum =\n    constantEqualText\n        \"2\"\n        \"1 + 1\"\n\ncase_basic_div =\n    constantEqualText\n        \"3\"\n        \"builtins.div 6 2\"\n\ncase_zero_div =\n    traverse_\n        assertNixEvalThrows\n        [ \"builtins.div 1 0\"\n        , \"builtins.div 1.0 0\"\n        , \"builtins.div 1 0.0\"\n        , \"builtins.div 1.0 0.0\"\n        ]\n\ncase_bit_ops =\n    traverse_\n        (uncurry constantEqualText)\n        [ (\"0\", \"builtins.bitAnd 1 0\")\n        , (\"1\", \"builtins.bitOr 1 1\")\n        , (\"3\", \"builtins.bitXor 1 2\")\n        ]\n\ncase_basic_function =\n    constantEqualText\n        \"2\"\n        \"(a: a) 2\"\n\ncase_set_attr =\n    constantEqualText\n        \"2\"\n        \"{ a = 2; }.a\"\n\ncase_function_set_arg =\n    constantEqualText\n        \"2\"\n        \"({ a }: 2) { a = 1; }\"\n\ncase_function_set_two_arg =\n    constantEqualText\n        \"2\"\n        \"({ a, b ? 3 }: b - a) { a = 1; }\"\n\ncase_function_set_two_arg_default_scope =\n    constantEqualText\n        \"2\"\n        \"({ x ? 1, y ? x * 3 }: y - x) {}\"\n\ncase_function_default_env =\n    constantEqualText\n        \"2\"\n        \"let default = 2; in ({ a ? default }: a) {}\"\n\ncase_function_definition_uses_environment =\n    constantEqualText\n        \"3\"\n        \"let f = (let a=1; in x: x+a); in f 2\"\n\ncase_function_atpattern =\n    -- jww (2018-05-09): This should be constantEqualText\n    constantEqualText'\n        \"2\"\n        \"(({a}@attrs:attrs) {a=2;}).a\"\n\ncase_function_ellipsis =\n    -- jww (2018-05-09): This should be constantEqualText\n    constantEqualText'\n        \"2\"\n        \"(({a, ...}@attrs:attrs) {a=0; b=2;}).b\"\n\ncase_function_default_value_not_in_atpattern =\n    constantEqualText\n        \"false\"\n        \"({a ? 2}@attrs: attrs ? a) {}\"\n\ncase_function_arg_shadowing =\n    constantEqualText\n        \"6\"\n        \"(y: y: x: x: x + y) 1 2 3 4\"\n\ncase_function_recursive_args =\n    constantEqualText\n        \"2\"\n        \"({ x ? 1, y ? x * 3}: y - x) {}\"\n\ncase_function_recursive_sets =\n    constantEqualText\n        \"[ [ 6 4 100 ] 4 ]\"\n        [text|\n      let x = rec {\n\n        y = 2;\n        z = { w = 4; };\n        v = rec {\n          u = 6;\n          t = [ u z.w s ];\n        };\n\n      }; s = 100; in [ x.v.t x.z.w ]\n    |]\n\ncase_nested_with =\n    constantEqualText\n        \"2\"\n        \"with { x = 1; }; with { x = 2; }; x\"\n\ncase_with_strictness =\n    constantEqualText\n        \"5\"\n        \"let x = with x; with { a = 5; }; a; in x\"\n\ncase_match_failure_null =\n    constantEqualText\n        \"null\"\n        \"builtins.match \\\"ab\\\" \\\"abc\\\"\"\n\ncase_find_file_success_no_prefix =\n    constantEqualText\n        \"./tests/files/findFile.nix\"\n        \"builtins.findFile [{ path=\\\"./tests/files\\\"; prefix=\\\"\\\"; }] \\\"findFile.nix\\\"\"\n\ncase_find_file_success_with_prefix =\n    constantEqualText\n        \"./tests/files/findFile.nix\"\n        \"builtins.findFile [{ path=\\\"./tests/files\\\"; prefix=\\\"nix\\\"; }] \\\"nix/findFile.nix\\\"\"\n\ncase_find_file_success_folder =\n    constantEqualText\n        \"./tests/files\"\n        \"builtins.findFile [{ path=\\\"./tests\\\"; prefix=\\\"\\\"; }] \\\"files\\\"\"\n\ncase_find_file_failure_not_found =\n    assertNixEvalThrows\n        \"builtins.findFile [{ path=\\\"./tests/files\\\"; prefix=\\\"\\\"; }] \\\"not_found.nix\\\"\"\n\ncase_find_file_failure_invalid_arg_1 =\n    assertNixEvalThrows\n        \"builtins.findFile 1 \\\"files\\\"\"\n\ncase_find_file_failure_invalid_arg_2 =\n    assertNixEvalThrows\n        \"builtins.findFile [{ path=\\\"./tests/files\\\"; prefix=\\\"\\\"; }] 2\"\n\ncase_find_file_failure_invalid_arg_no_path =\n    assertNixEvalThrows\n        \"builtins.findFile [{ prefix=\\\"\\\"; }] \\\"files\\\"\"\n\ncase_infinite_recursion =\n    assertNixEvalThrows\n        \"let foo = a: bar a; bar = a: foo a; in foo 3\"\n\ncase_nested_let =\n    constantEqualText\n        \"3\"\n        \"let a = 3; x.x = 2; in a\"\n\ncase_nested_nested_let =\n    constantEqualText\n        \"3\"\n        \"let a = 3; x.x = let b = a; in b; c = x.x; in c\"\n\ncase_inherit_in_rec_set =\n    constantEqualText\n        \"1\"\n        \"let x = 1; in (rec { inherit x; }).x\"\n\ncase_lang_version =\n    constantEqualText\n        \"5\"\n        \"builtins.langVersion\"\n\ncase_rec_set_attr_path_simpl =\n    constantEqualText\n        \"123\"\n        [text|\n      let x = rec {\n        foo.number = 123;\n        foo.function = y: foo.number;\n      }; in x.foo.function 1\n    |]\n\ncase_inherit_from_set_has_no_scope =\n    constantEqualText'\n        \"false\"\n        [text|\n      (builtins.tryEval (\n        let x = 1;\n            y = { z = 2; };\n        in { inherit (y) x; }.x\n      )).success\n    |]\n\n-- github/orblivion (2018-08-05): Adding these failing tests so we fix this feature\n--\n-- case_overrides =\n--     constantEqualText' \"2\" [text|\n--       let\n--\n--         overrides = { a = 2; };\n--\n--       in (rec {\n--         __overrides = overrides;\n--         x = a;\n--         a = 1;\n--       }.__overrides.a)\n--     |]\n\n-- case_inherit_overrides =\n--     constantEqualText' \"2\" [text|\n--       let\n--\n--         __overrides = { a = 2; };\n--\n--       in (rec {\n--         inherit __overrides;\n--         x = a;\n--         a = 1;\n--       }.__overrides.a)\n--     |]\n\ncase_unsafegetattrpos =\n    traverse_\n        (uncurry constantEqualText)\n        [\n            ( \"[ 5 14 ]\"\n            , [text|\n          let e = 1;\n              f = 1;\n              t = {};\n              s = {\n                inherit t e f;\n                a = 1;\n                \"b\" = 2;\n                c.d = 3;\n              };\n              p = builtins.unsafeGetAttrPos \"e\" s; in\n          [ p.line p.column ]\n          |]\n            )\n        ,\n            ( \"[ 5 14 ]\"\n            , [text|\n          let e = 1;\n              f = 1;\n              t = {};\n              s = {\n                inherit t e f;\n                a = 1;\n                \"b\" = 2;\n                c.d = 3;\n              };\n              p = builtins.unsafeGetAttrPos \"f\" s; in\n          [ p.line p.column ]\n        |]\n            )\n        ,\n            ( \"[ 6 7 ]\"\n            , [text|\n          let e = 1;\n              f = 1;\n              t = {};\n              s = {\n                inherit t e f;\n                a = 1;\n                \"b\" = 2;\n                c.d = 3;\n              };\n              p = builtins.unsafeGetAttrPos \"a\" s; in\n            [ p.line p.column ]\n          |]\n            )\n        ,\n            ( \"[ 7 7 ]\"\n            , [text|\n        let e = 1;\n            f = 1;\n            t = {};\n            s = {\n              inherit t e f;\n              a = 1;\n              \"b\" = 2;\n              c.d = 3;\n            };\n            p = builtins.unsafeGetAttrPos \"b\" s; in\n          [ p.line p.column ]\n        |]\n            )\n        ]\n\n-- jww (2018-05-09): These two are failing but they shouldn't be\n--\n-- , ( \"[ 7 13 ]\"\n--   , [text|\n--       let e = 1;\n--           f = 1;\n--           t = {};\n--           s = {\n--             inherit t e f;\n--             a = 1;\n--             \"b\" = 2;\n--             c.d = 3;\n--           };\n--           p = builtins.unsafeGetAttrPos \"c.d\" s; in\n--         [ p.line p.column ]\n--       |]\n--   )\n\n-- , ( \"[ 7 13 ]\"\n--   , [text|\n--       let e = 1;\n--           f = 1;\n--           t = {};\n--           s = {\n--             inherit t e f;\n--             a = 1;\n--             \"b\" = 2;\n--             c.d = 3;\n--           };\n--           p = builtins.unsafeGetAttrPos \"d\" s; in\n--         [ p.line p.column ]\n--       |]\n--   )\n\ncase_fixed_points =\n    constantEqualText\n        [text|\n      [\n        {\n          foobar = \"foobar\";\n          foo = \"foo\";\n          bar = \"bar\";\n        }\n        {\n          foobar = \"foo + bar\";\n          foo = \"foo + \";\n          bar = \"bar\";\n        }\n      ]\n    |]\n        [text|\n      let\n        fix = f: let x = f x; in x;\n        extends = f: rattrs: self:\n          let super = rattrs self; in super // f self super;\n        f = self: { foo = \"foo\";\n                    bar = \"bar\";\n                    foobar = self.foo + self.bar; };\n        g = self: super: { foo = super.foo + \" + \"; };\n      in [ (fix f) (fix (extends g f)) ]\n    |]\n\ncase_fixed_points_and_fold =\n    constantEqualText\n        [text|\n      [ {} {} ]\n    |]\n        [text|\n      let\n        extends = f: rattrs: self:\n          let super = rattrs self; in super // f self super;\n        flip = f: a: b: f b a;\n        toFixFold = builtins.foldl' (flip extends) (self: {}) ([(self: super: {})]);\n        toFix = extends (self: super: {}) (self: {});\n        fix = f: let x = f x; in x;\n      in [ (fix toFixFold) (fix toFix) ]\n    |]\n\ncase_fixed_points_attrsets =\n    constantEqualText\n        \"{ x = { y = { z = 100; }; z = { y = 100; }; }; }\"\n        [text|\n      let fix = f: let x = f x; in x;\n          f = self: { x.z.y = 100; x.y.z = self.x.z.y; };\n      in fix f\n    |]\n\ncase_function_equals =\n    traverse_\n        (uncurry constantEqualText)\n        [ -- ( \"true\"\n          -- , \"{f = x: x;} == {f = x: x;}\"\n          -- )\n          -- ( \"true\"\n          -- , \"[(x: x)] == [(x: x)]\"\n          -- )\n\n            ( \"false\"\n            , \"(let a = (x: x); in a == a)\"\n            )\n        ,\n            ( \"true\"\n            , \"(let a = {f = x: x;}; in a == a)\"\n            )\n        ,\n            ( \"true\"\n            , \"(let a = [(x: x)]; in a == a)\"\n            )\n        ,\n            ( \"false\"\n            , \"builtins.pathExists \\\"/var/empty/invalid-directory\\\"\"\n            )\n        ]\n\ncase_directory_pathexists =\n    constantEqualText\n        \"false\"\n        \"builtins.pathExists \\\"/var/empty/invalid-directory\\\"\"\n\n-- jww (2018-05-02): This constantly changes!\ncase_placeholder =\n    constantEqualText\n        \"\\\"/1rz4g4znpzjwh1xymhjpm42vipw92pr73vdgl6xs1hycac8kf2n9\\\"\"\n        \"builtins.placeholder \\\"out\\\"\"\n\ncase_rec_path_attr =\n    constantEqualText\n        \"10\"\n        \"let src = 10; x = rec { passthru.src = src; }; in x.passthru.src\"\n\ncase_mapattrs_builtin =\n    constantEqualText'\n        \"{ a = \\\"afoo\\\"; b = \\\"bbar\\\"; }\"\n        [text|\n      (builtins.mapAttrs (x: y: x + y) {\n        a = \"foo\";\n        b = \"bar\";\n      })\n    |]\n\n-- Regression test for #373\ncase_regression_373 :: Assertion\ncase_regression_373 =\n    traverse_\n        (uncurry sameFreeVars)\n        [\n            ( \"{ inherit a; }\"\n            , one \"a\"\n            )\n        ,\n            ( \"rec {inherit a; }\"\n            , one \"a\"\n            )\n        ,\n            ( \"let inherit a; in { }\"\n            , one \"a\"\n            )\n        ]\n\ncase_bound_vars :: Assertion\ncase_bound_vars =\n    traverse_\n        noFreeVars\n        [ \"a: a\"\n        , \"{b}: b\"\n        , \"let c = 5; d = c; in d\"\n        , \"rec { e = 5; f = e; }\"\n        ]\n  where\n    noFreeVars = flip sameFreeVars mempty\n\ncase_expression_split =\n    constantEqualText\n        \"[ \\\"\\\" [ \\\"a\\\" ] \\\"c\\\" ]\"\n        \"(x: builtins.deepSeq x x) (builtins.split \\\"(a)b\\\" \\\"abc\\\")\"\n\ncase_empty_string_equal_null_is_false =\n    constantEqualText\n        \"false\"\n        \"\\\"\\\" == null\"\n\ncase_null_equal_empty_string_is_false =\n    constantEqualText\n        \"false\"\n        \"null == \\\"\\\"\"\n\ncase_empty_string_not_equal_null_is_true =\n    constantEqualText\n        \"true\"\n        \"\\\"\\\" != null\"\n\ncase_null_equal_not_empty_string_is_true =\n    constantEqualText\n        \"true\"\n        \"null != \\\"\\\"\"\n\ncase_list_nested_bottom_diverges =\n    assertNixEvalThrows\n        \"let nested = [(let x = x; in x)]; in nested == nested\"\n\ncase_attrset_nested_bottom_diverges =\n    assertNixEvalThrows\n        \"let nested = { y = (let x = x; in x); }; in nested == nested\"\n\ncase_list_list_nested_bottom_equal =\n    constantEqualText\n        \"true\"\n        \"let nested = [[(let x = x; in x)]]; in nested == nested\"\n\ncase_list_attrset_nested_bottom_equal =\n    constantEqualText\n        \"true\"\n        \"let nested = [{ y = (let x = x; in x); }]; in nested == nested\"\n\ncase_list_function_nested_bottom_equal =\n    constantEqualText\n        \"true\"\n        \"let nested = [(_: let x = x; in x)]; in nested == nested\"\n\ncase_attrset_list_nested_bottom_equal =\n    constantEqualText\n        \"true\"\n        \"let nested = { y = [(let x = x; in x)];}; in nested == nested\"\n\ncase_attrset_attrset_nested_bottom_equal =\n    constantEqualText\n        \"true\"\n        \"let nested = { y = { y = (let x = x; in x); }; }; in nested == nested\"\n\ncase_attrset_function_nested_bottom_equal =\n    constantEqualText\n        \"true\"\n        \"let nested = { y = _: (let x = x; in x); }; in nested == nested\"\n\ncase_if_follow_by_with =\n    constantEqualText\n        \"1\"\n        \"let x = { a = true; b = 2; }; in if with x; a then 1 else 2\"\n\n-- Regression test for #527\n\ncase_add_string_thunk_left =\n    constantEqualText\n        [text|\n      \"cygwin\"\n    |]\n        [text|\n      builtins.head [\"cyg\"] + \"win\"\n    |]\n\ncase_add_string_thunk_right =\n    constantEqualText\n        [text|\n      \"cygwin\"\n    |]\n        [text|\n      \"cyg\" + builtins.head [\"win\"]\n    |]\n\ncase_add_int_thunk_left =\n    constantEqualText\n        \"3\"\n        \"builtins.head [1] + 2\"\n\ncase_add_int_thunk_right =\n    constantEqualText\n        \"3\"\n        \"1 + builtins.head [2]\"\n\ncase_concat_thunk_left =\n    constantEqualText\n        \"[1 2 3]\"\n        \"builtins.tail [0 1 2] ++ [3]\"\n\ncase_concat_thunk_rigth =\n    constantEqualText\n        \"[1 2 3]\"\n        \"[1] ++ builtins.tail [1 2 3]\"\n\n---------------------------------------------------------------------------------\n\ntests :: TestTree\ntests = $testGroupGenerator\n\ngenEvalCompareTests :: IO TestTree\ngenEvalCompareTests =\n    do\n        files <- coerce D.listDirectory testDir\n\n        let\n            unmaskedFiles :: [Path]\n            unmaskedFiles = filter ((== \".nix\") . takeExtension) files\n\n            testFiles :: [Path]\n            testFiles = unmaskedFiles \\\\ maskedFiles\n\n        pure $ testGroup \"Eval comparison tests\" $ fmap (mkTestCase testDir) testFiles\n  where\n    mkTestCase :: Path -> Path -> TestTree\n    mkTestCase dir f = testCase (coerce f :: TestName) $ assertEvalFileMatchesNix $ dir </> f\n\nconstantEqual :: NExprLoc -> NExprLoc -> Assertion\nconstantEqual expected actual =\n    do\n        time <- getCurrentTime\n        let opts = defaultOptions time\n        -- putStrLn =<< lint (stripAnnotation a)\n        (eq, expectedNF, actualNF) <-\n            runWithBasicEffectsIO opts $\n                do\n                    expectedNF <- getNormForm expected\n                    actualNF <- getNormForm actual\n                    eq <- valueEqM expectedNF actualNF\n                    pure (eq, expectedNF, actualNF)\n        let\n            message =\n                \"Inequal normal forms:\\n\"\n                    <> \"Expected: \"\n                    <> printNix expectedNF\n                    <> \"\\n\"\n                    <> \"Actual:   \"\n                    <> printNix actualNF\n        assertBool (toString message) eq\n  where\n    getNormForm = normalForm <=< nixEvalExprLoc mempty\n\nconstantEqualText' :: Text -> Text -> Assertion\nconstantEqualText' expected actual =\n    do\n        let (Right expected', Right actual') = both parseNixTextLoc (expected, actual)\n        constantEqual expected' actual'\n\nconstantEqualText :: Text -> Text -> Assertion\nconstantEqualText expected actual =\n    do\n        constantEqualText' expected actual\n        mres <- liftIO $ on (<|>) lookupEnv \"ALL_TESTS\" \"MATCHING_TESTS\"\n        whenJust (const $ assertEvalTextMatchesNix actual) mres\n\nassertNixEvalThrows :: Text -> Assertion\nassertNixEvalThrows a =\n    do\n        time <- getCurrentTime\n        let\n            opts = defaultOptions time\n            Right a' = parseNixTextLoc a\n        errored <-\n            catch\n                ( False\n                    <$ runWithBasicEffectsIO\n                        opts\n                        (normalForm =<< nixEvalExprLoc mempty a')\n                )\n                (\\(_ :: NixException) -> pure True)\n        when (not errored) $ assertFailure \"Did not catch nix exception\"\n\nsameFreeVars :: Text -> [VarName] -> Assertion\nsameFreeVars a xs =\n    do\n        let\n            Right a' = parseNixText a\n            free' = getFreeVars a'\n        assertEqual mempty (S.fromList xs) free'\n\nmaskedFiles :: [Path]\nmaskedFiles = mempty\n\ntestDir :: Path\ntestDir = \"tests/eval-compare\"\n"
  },
  {
    "path": "tests/Main.hs",
    "content": "{-# LANGUAGE QuasiQuotes #-}\n\nmodule Main where\n\nimport qualified Control.Exception as Exc\nimport Data.Fix\nimport Data.List (isSuffixOf, lookup)\nimport Data.Time\nimport qualified EvalTests\nimport GHC.Err (errorWithoutStackTrace)\nimport NeatInterpolation (text)\nimport qualified Nix\nimport Nix.Expr.Types\nimport Nix.Options\nimport Nix.Parser\nimport Nix.Prelude\nimport Nix.Standard\nimport Nix.String\nimport Nix.Value\nimport qualified NixLanguageTests\nimport qualified ParserTests\nimport qualified PrettyParseTests\nimport qualified PrettyTests\nimport qualified ReduceExprTests\nimport Relude (force)\nimport Relude.Unsafe (read)\nimport System.Directory\nimport System.Environment (setEnv)\nimport System.FilePath.Glob (compile, globDir1)\nimport System.PosixCompat.Files\nimport Test.Tasty\nimport Test.Tasty.HUnit\n\nensureLangTestsPresent :: Assertion\nensureLangTestsPresent = do\n    exist <- fileExist \"data/nix/tests/lang/eval-okay-if.nix\"\n    when (not exist) $\n        errorWithoutStackTrace \"Directory data/nix does not have any files.\"\n\nensureNixpkgsCanParse :: Assertion\nensureNixpkgsCanParse =\n    consider \"default.nix\" (parseNixFile \"default.nix\") $ \\case\n        Fix (NAbs (ParamSet _ _ pset) _) -> do\n            let rev = getString \"rev\" pset\n                sha256 = getString \"sha256\" pset\n            consider\n                \"fetchTarball expression\"\n                ( pure $\n                    parseNixTextLoc\n                        [text|\n        builtins.fetchTarball {\n          url    = \"https://github.com/NixOS/nixpkgs/archive/${rev}.tar.gz\";\n          sha256 = \"${sha256}\";\n        }|]\n                )\n                $ \\expr -> do\n                    NVStr ns <- do\n                        time <- getCurrentTime\n                        runWithBasicEffectsIO (defaultOptions time) $\n                            Nix.nixEvalExprLoc mempty expr\n                    let dir = toString $ ignoreContext ns\n                    exists <- fileExist dir\n                    when (not exists) $\n                        errorWithoutStackTrace $\n                            \"Directory \" <> show dir <> \" does not exist\"\n                    files <- globDir1 (compile \"**/*.nix\") dir\n                    handlePresence\n                        ( errorWithoutStackTrace $\n                            \"Directory \" <> show dir <> \" does not have any files\"\n                        )\n                        ( traverse_\n                            ( \\path ->\n                                let notEndsIn suffix = not $ isSuffixOf suffix path\n                                 in when\n                                        (on (&&) notEndsIn \"azure-cli/default.nix\" \"os-specific/linux/udisks/2-default.nix\")\n                                        $ mempty <$ consider (coerce path) (parseNixFileLoc (coerce path)) -- Parse and deepseq the resulting expression tree, to ensure the\n                                        -- parser is fully executed.\n                                        $ Exc.evaluate . force\n                            )\n                        )\n                        files\n        v -> fail $ \"Unexpected parse from default.nix: \" <> show v\n  where\n    getExpr k m =\n        let Just r = join $ lookup k m\n         in r\n    getString k m =\n        let Fix (NStr (DoubleQuoted [Plain str])) = getExpr k m\n         in str\n\n    consider path action k =\n        either\n            (\\err -> errorWithoutStackTrace $ \"Parsing \" <> coerce @Path path <> \" failed: \" <> show err)\n            k\n            =<< action\n\nmain :: IO ()\nmain = do\n    nixLanguageTests <- NixLanguageTests.genTests\n    evalComparisonTests <- EvalTests.genEvalCompareTests\n    let allOrLookup var = lookupEnv \"ALL_TESTS\" <|> lookupEnv var\n    nixpkgsTestsEnv <- allOrLookup \"NIXPKGS_TESTS\"\n    prettyTestsEnv <- lookupEnv \"PRETTY_TESTS\"\n\n    pwd <- getCurrentDirectory\n    setEnv \"NIX_REMOTE\" $ pwd <> \"/real-store\"\n    setEnv \"NIX_DATA_DIR\" $ pwd <> \"/data\"\n\n    defaultMain $\n        testGroup \"hnix\" $\n            [ ParserTests.tests\n            , EvalTests.tests\n            , PrettyTests.tests\n            , ReduceExprTests.tests\n            , PrettyParseTests.tests $ fromIntegral $ read @Int $ fromMaybe \"0\" prettyTestsEnv\n            , evalComparisonTests\n            , testCase \"Nix language tests present\" ensureLangTestsPresent\n            , nixLanguageTests\n            ]\n                <> [ testCase \"Nixpkgs parses without errors\" ensureNixpkgsCanParse\n                   | isJust nixpkgsTestsEnv\n                   ]\n"
  },
  {
    "path": "tests/NixLanguageTests.hs",
    "content": "module NixLanguageTests (genTests) where\n\nimport Control.Exception\nimport Control.Monad.ST\nimport Data.List (delete)\nimport Data.List.Split (splitOn)\nimport qualified Data.Map as Map\nimport qualified Data.Set as Set\nimport qualified Data.String as String\nimport qualified Data.Text as Text\nimport Data.Time\nimport GHC.Err (errorWithoutStackTrace)\nimport GHC.Exts\nimport Nix.Lint\nimport Nix.Options\nimport Nix.Options.Parser\nimport Nix.Parser\nimport Nix.Prelude\nimport Nix.Pretty\nimport Nix.String\nimport Nix.XML\nimport qualified Options.Applicative as Opts\nimport System.Environment (setEnv)\nimport System.FilePath.Glob (\n    compile,\n    globDir1,\n )\nimport Test.Tasty\nimport Test.Tasty.HUnit\nimport TestCommon\n\n{-\nFrom (git://nix)/tests/lang.sh we see that\n\n    lang/parse-fail-*.nix -> parsing should fail\n    lang/parse-okay-*.nix -> parsing should succeed\n    lang/eval-fail-*.nix -> eval should fail\n\n    lang/eval-okay-*.{nix,xml} -> eval should succeed,\n        xml dump should be the same as the .xml\n    lang/eval-okay-*.{nix,exp} -> eval should succeed,\n        plain text output should be the same as the .exp\n    lang/eval-okay-*.{nix,exp,flags} -> eval should succeed,\n        plain text output should be the same as the .exp,\n        pass the extra flags to nix-instantiate\n\n    NIX_PATH=lang/dir3:lang/dir4 should be in the environment of all\n        eval-okay-*.nix evaluations\n    TEST_VAR=foo should be in all the environments # for eval-okay-getenv.nix\n-}\n\ngroupBy :: (Ord k) => (v -> k) -> [v] -> Map k [v]\ngroupBy key = Map.fromListWith (<>) . fmap (key &&& pure)\n\n{- | New tests, which have never yet passed.  Once any of these is passing,\nplease remove it from this list.  Do not add tests to this list if they have\npreviously passed.\n-}\nnewFailingTests :: Set String\nnewFailingTests =\n    Set.fromList\n        [ \"eval-okay-fromTOML\"\n        , \"eval-okay-zipAttrsWith\"\n        , \"eval-okay-tojson\"\n        , \"eval-okay-search-path\"\n        , \"eval-okay-sort\"\n        , \"eval-okay-path-antiquotation\"\n        , \"eval-okay-getattrpos-functionargs\"\n        , \"eval-okay-attrs6\"\n        ]\n\n{- | Upstream tests that test cases that HNix disaded as a misfeature that is used so rarely\nthat it more effective to fix it & lint it out of existance.\n-}\ndeprecatedRareNixQuirkTests :: Set String\ndeprecatedRareNixQuirkTests =\n    Set.fromList\n        [ -- A rare quirk of Nix that is proper to fix&enforce then to support (see git commit history)\n          \"eval-okay-strings-as-attrs-names\"\n        , -- Nix upstream removed this test altogether\n          \"eval-okay-hash\"\n        ]\n\ngenTests :: IO TestTree\ngenTests =\n    do\n        testFiles <- getTestFiles\n        let\n            testsGroupedByName :: Map Path [Path]\n            testsGroupedByName = groupBy (takeFileName . dropExtensions) testFiles\n\n            testsGroupedByTypeThenName :: Map [String] [(Path, [Path])]\n            testsGroupedByTypeThenName = groupBy testType $ Map.toList testsGroupedByName\n\n            testTree :: [TestTree]\n            testTree = mkTestGroup <$> Map.toList testsGroupedByTypeThenName\n\n        pure\n            $ localOption\n                (mkTimeout 2000000)\n            $ testGroup\n                \"Nix (upstream) language tests\"\n                testTree\n  where\n    getTestFiles :: IO [Path]\n    getTestFiles = sortTestFiles <$> collectTestFiles\n      where\n        collectTestFiles :: IO [Path]\n        collectTestFiles = coerce (globDir1 (compile \"*-*-*.*\") nixTestDir)\n\n        sortTestFiles :: [Path] -> [Path]\n        sortTestFiles =\n            sort\n                -- Disabling the not yet done tests cases.\n                . filter withoutDisabledTests\n                . filter withoutXml\n          where\n            withoutDisabledTests :: Path -> Bool\n            withoutDisabledTests = (`Set.notMember` (newFailingTests `Set.union` deprecatedRareNixQuirkTests)) . takeBaseName\n\n            withoutXml :: Path -> Bool\n            withoutXml = (/= \".xml\") . takeExtension\n\n    testType :: (Path, b) -> [String]\n    testType (fullpath, _files) = coerce (take 2 . splitOn \"-\") $ takeFileName fullpath\n\n    mkTestGroup :: ([String], [(Path, [Path])]) -> TestTree\n    mkTestGroup (tType, tests) =\n        testGroup (String.unwords tType) $ mkTestCase <$> tests\n      where\n        mkTestCase :: (Path, [Path]) -> TestTree\n        mkTestCase (basename, files) =\n            testCase\n                (coerce $ takeFileName basename)\n                $ do\n                    time <- liftIO getCurrentTime\n                    let opts = defaultOptions time\n                    case tType of\n                        [\"parse\", \"okay\"] -> assertParse opts $ the files\n                        [\"parse\", \"fail\"] -> assertParseFail opts $ the files\n                        [\"eval\", \"okay\"] -> assertEval opts files\n                        [\"eval\", \"fail\"] -> assertEvalFail $ the files\n                        _ -> fail $ \"Unexpected: \" <> show tType\n\nassertParse :: Options -> Path -> Assertion\nassertParse _opts file =\n    either\n        (\\err -> assertFailure $ \"Failed to parse \" <> coerce file <> \":\\n\" <> show err)\n        (const stub) -- pure $! runST $ void $ lint opts expr\n        =<< parseNixFileLoc file\n\nassertParseFail :: Options -> Path -> Assertion\nassertParseFail opts file =\n    (`catch` \\(_ :: SomeException) -> stub) $\n        either\n            (const stub)\n            ( \\expr ->\n                do\n                    _ <- pure $! runST $ void $ lint opts expr\n                    assertFailure $ \"Unexpected success parsing `\" <> coerce file <> \":\\nParsed value: \" <> show expr\n            )\n            =<< parseNixFileLoc file\n\nassertLangOk :: Options -> Path -> Assertion\nassertLangOk opts fileBaseName =\n    do\n        actual <- printNix <$> hnixEvalFile opts (addNixExt fileBaseName)\n        expected <- read fileBaseName \".exp\"\n        assertEqual mempty expected (actual <> \"\\n\")\n\nassertLangOkXml :: Options -> Path -> Assertion\nassertLangOkXml opts fileBaseName =\n    do\n        actual <- ignoreContext . toXML <$> hnixEvalFile opts (addNixExt fileBaseName)\n        expected <- read fileBaseName \".exp.xml\"\n        assertEqual mempty expected actual\n\nassertEval :: Options -> [Path] -> Assertion\nassertEval _opts files =\n    do\n        time <- liftIO getCurrentTime\n        let opts = defaultOptions time\n        case delete \".nix\" $ sort $ fromString @Text . takeExtensions <$> files of\n            [] -> void $ hnixEvalFile opts $ addNixExt name\n            [\".exp\"] -> assertLangOk opts name\n            [\".exp.xml\"] -> assertLangOkXml opts name\n            [\".exp.disabled\"] -> stub\n            [\".exp-disabled\"] -> stub\n            [\".exp\", \".flags\"] ->\n                do\n                    liftIO $ setEnv \"NIX_PATH\" \"lang/dir4:lang/dir5\"\n                    flags <- read name \".flags\"\n                    let\n                        flags' :: Text\n                        flags' =\n                            bool\n                                id\n                                Text.init\n                                (Text.last flags == '\\n')\n                                flags\n                    case runParserGetResult time flags' of\n                        Opts.Failure err -> errorWithoutStackTrace $ \"Error parsing flags from \" <> coerce name <> \".flags: \" <> show err\n                        Opts.CompletionInvoked _ -> fail \"unused\"\n                        Opts.Success opts' -> assertLangOk opts' name\n            _ -> assertFailure $ \"Unknown test type \" <> show files\n  where\n    runParserGetResult :: UTCTime -> Text -> Opts.ParserResult Options\n    runParserGetResult time flags' =\n        Opts.execParserPure\n            Opts.defaultPrefs\n            (nixOptionsInfo time)\n            (fmap toString $ fixup $ Text.splitOn \" \" flags')\n\n    name :: Path\n    name = coerce nixTestDir <> the (takeFileName . dropExtensions <$> files)\n\n    fixup :: [Text] -> [Text]\n    fixup (\"--arg\" : x : y : rest) = \"--arg\" : (x <> \"=\" <> y) : fixup rest\n    fixup (\"--argstr\" : x : y : rest) = \"--argstr\" : (x <> \"=\" <> y) : fixup rest\n    fixup (x : rest) = x : fixup rest\n    fixup [] = mempty\n\nassertEvalFail :: Path -> Assertion\nassertEvalFail file =\n    (`catch` (\\(_ :: SomeException) -> stub)) $\n        do\n            time <- liftIO getCurrentTime\n            evalResult <- printNix <$> hnixEvalFile (defaultOptions time) file\n            evalResult `seq` assertFailure $ \"File: ''\" <> coerce file <> \"'' should not evaluate.\\nThe evaluation result was `\" <> toString evalResult <> \"`.\"\n\nnixTestDir :: FilePath\nnixTestDir = \"data/nix/tests/lang/\"\n\naddNixExt :: Path -> Path\naddNixExt path = addExtension path \".nix\"\n\nread :: Path -> String -> IO Text\nread path ext = readFile $ addExtension path ext\n"
  },
  {
    "path": "tests/ParserTests.hs",
    "content": "{-# LANGUAGE ExtendedDefaultRules #-}\n{-# LANGUAGE QuasiQuotes #-}\n{-# LANGUAGE RankNTypes #-}\n{-# LANGUAGE TemplateHaskell #-}\n{-# OPTIONS_GHC -Wno-missing-signatures #-}\n{-# OPTIONS_GHC -Wno-type-defaults #-}\n{-# OPTIONS_GHC -fno-warn-name-shadowing #-}\n\nmodule ParserTests (tests) where\n\nimport Data.Fix\nimport NeatInterpolation (text)\nimport Nix.Atoms\nimport Nix.Expr\nimport Nix.Parser\nimport Nix.Prelude hiding (($<))\nimport Nix.Pretty\nimport Prettyprinter\nimport Prettyprinter.Render.String (renderString)\nimport Prettyprinter.Render.Text\nimport Prettyprinter.Util (reflow)\nimport Test.Tasty\nimport Test.Tasty.HUnit\nimport Test.Tasty.TH\n\ndefault (NixLang)\n\n-- * Tests\n\n-- ** Literals\n\ncase_constant_int =\n    checks\n        ( mkInt 234\n        , \"234\"\n        )\n\ncase_constant_bool =\n    checks\n        ( mkBool True\n        , \"true\"\n        )\n        ( mkBool False\n        , \"false\"\n        )\n\ncase_constant_bool_respects_attributes =\n    invariantVals\n        \"true-foo\"\n        \"false-bar\"\n\ncase_constant_path_invariants =\n    knownAs\n        (staysInvariantUnder (mkRelPath . toString))\n        \"./.\"\n        \"./+-_/cdef/09ad+-\"\n        \"/abc\"\n        \"../abc\"\n        \"~/a\"\n        \"~/a/b\"\n        \"a/b\"\n        \"4/2\"\n        \"rec+def/cdef\"\n\ncase_constant_path =\n    checks\n        ( var \"a'b\" @@ mkRelPath \"/c\"\n        , \"a'b/c\"\n        )\n        ( mkRelPath \"a/b\" $// mkRelPath \"c/def\" $// mkEnvPath \"g\" $< mkRelPath \"def/d\"\n        , \"a/b//c/def//<g> < def/d\"\n        )\n        ( mkEnvPath \"abc\"\n        , \"<abc>\"\n        )\n        ( mkEnvPath \"../cdef\"\n        , \"<../cdef>\"\n        )\n        ( var \"a\" $// var \"b\"\n        , \"a//b\"\n        )\n\ncase_constant_path_syntax_mistakes =\n    mistakes\n        \".\"\n        \"..\"\n        \"/\"\n        \"a/\"\n        \"a/def/\"\n        \"~\"\n        \"~/\"\n\ncase_constant_uri =\n    knownAs\n        (staysInvariantUnder mkStr)\n        \"a:a\"\n        \"http://foo.bar\"\n        \"a+de+.adA+-:%%%ads%5asdk&/\"\n        \"rec+def:c\"\n        \"f.foo:bar\"\n\ncase_constant_uri_syntax_mistakes =\n    mistakes\n        \"http://foo${\\\"bar\\\"}\"\n        \":bcdef\"\n        \"a%20:asda\"\n        \".:adasd\"\n        \"+:acdcd\"\n\n-- *** Special chars in vals\n\ncase_identifier_special_chars =\n    invariantVals\n        \"_a\"\n        \"a_b\"\n        \"a'b\"\n        \"a''b\"\n        \"a-b\"\n        \"a--b\"\n        \"a12a\"\n\ncase_identifier_special_chars_syntax_mistakes =\n    mistakes\n        \".a\"\n        \"'a\"\n\n-- ** Sets\n\n-- *** Non-recursive sets\n\ncase_simple_set =\n    checks\n        ( mkNonRecSet\n            [ \"a\" $= mkInt 23\n            , \"b\" $= mkInt 4\n            ]\n        , \"{ a = 23; b = 4; }\"\n        )\n\ncase_simple_set_syntax_mistakes =\n    mistakes\n        \"{ a = 23 }\"\n\ncase_set_complex_keynames =\n    checks\n        ( mkNonRecSet $\n            one (NamedVar (one (DynamicKey (Plain (DoubleQuoted mempty)))) mkNull nullPos)\n        , \"{ \\\"\\\" = null; }\"\n        )\n        ( mkNonRecSet\n            [ NamedVar (StaticKey \"a\" :| one (StaticKey \"b\")) (mkInt 3) nullPos\n            , NamedVar (StaticKey \"a\" :| one (StaticKey \"c\")) (mkInt 4) nullPos\n            ]\n        , \"{ a.b = 3; a.c = 4; }\"\n        )\n        ( mkNonRecSet $\n            one (NamedVar (one (DynamicKey (Antiquoted letExpr))) (mkInt 4) nullPos)\n        , \"{ ${let a = \\\"b\\\"; in a} = 4; }\"\n        )\n        ( mkNonRecSet $\n            one (NamedVar (DynamicKey (Plain str) :| one (StaticKey \"e\")) (mkInt 4) nullPos)\n        , \"{ \\\"a${let a = \\\"b\\\"; in a}c\\\".e = 4; }\"\n        )\n  where\n    letExpr = mkLets (one (\"a\" $= mkStr \"b\")) (var \"a\")\n    str = DoubleQuoted [Plain \"a\", Antiquoted letExpr, Plain \"c\"]\n\n-- *** Recursivity in sets\n\ncase_set_rec =\n    checks\n        ( mkRecSet\n            [ \"a\" $= mkInt 3\n            , \"b\" $= var \"a\"\n            ]\n        , \"rec { a = 3; b = a; }\"\n        )\n\n-- *** Inheritance\n\ncase_set_inherit =\n    checks\n        ( mkNonRecSet\n            [ \"e\" $= mkInt 3\n            , inherit [\"a\", \"b\"]\n            ]\n        , \"{ e = 3; inherit a b; }\"\n        )\n        ( mkNonRecSet $ one $ inherit mempty\n        , \"{ inherit; }\"\n        )\n\ncase_set_scoped_inherit =\n    checks\n        ( mkNonRecSet $\n            (\\x -> [x, \"e\" $= mkInt 4, x]) $\n                inheritFrom (var \"a\") [\"b\", \"c\"]\n        , \"{ inherit (a) b c; e = 4; inherit(a)b c; }\"\n        )\n\ncase_set_inherit_direct =\n    checks\n        ( mkNonRecSet $ one (inheritFrom (mkNonRecSet $ one (\"a\" $= mkInt 3)) mempty)\n        , \"{ inherit ({a = 3;}); }\"\n        )\n\ncase_inherit_selector_syntax_mistakes =\n    mistakes\n        \"{ inherit a.x; }\"\n        -- A rare quirk of Nix that is proper to fix then to support (see git commit history)\n        -- (old parser test result was):\n        -- mkNonRecSet [inherit [DynamicKey (Plain (DoubleQuoted [Plain \"a\"]))]],\n        \"{ inherit \\\"a\\\"; }\"\n\n-- ** Lists\n\ncase_int_list =\n    checks\n        ( mkList $ mkInt <$> [1, 2, 3]\n        , \"[1 2 3]\"\n        )\n\ncase_int_null_list =\n    checks\n        ( mkList (mkConst <$> [NInt 1, NInt 2, NInt 3, NNull, NInt 4])\n        , \"[1 2 3 null 4]\"\n        )\n\ncase_mixed_list =\n    checks\n        ( mkList\n            [ mkNonRecSet (one $ \"a\" $= mkInt 3) @. \"a\"\n            , mkIf (mkBool True) mkNull (mkBool False)\n            , mkNull\n            , mkBool False\n            , mkInt 4\n            , emptyList\n            , (@.<|>) (var \"c\") \"d\" mkNull\n            ]\n        , \"[{a = 3;}.a (if true then null else false) null false 4 [] c.d or null]\"\n        )\n\ncase_mixed_list_syntax_mistakes =\n    mistakes\n        \"[if true then null else null]\"\n        \"[a ? b]\"\n        \"[a : a]\"\n        \"[${\\\"test\\\")]\"\n\n-- ** Lambdas\n\ncase_simple_lambda =\n    checks\n        ( mkFunction (Param \"a\") (var \"a\")\n        , \"a: a\"\n        )\n\ncase_lambda_or_uri =\n    checks\n        ( mkFunction (Param \"a\") $ var \"b\"\n        , \"a :b\"\n        )\n        ( var \"a\" @@ mkStr \"c:def\"\n        , \"a c:def\"\n        )\n        ( mkStr \"c:def:\" @@ var \"c\"\n        , \"c:def: c\"\n        )\n        ( mkFunction (Param \"a\") emptySet\n        , \"a:{}\"\n        )\n        ( mkFunction (Param \"a\") $ mkList $ one $ var \"a\"\n        , \"a:[a]\"\n        )\n\ncase_lambda_or_uri_syntax_mistakes =\n    mistakes\n        \"def:\"\n\ncase_lambda_pattern =\n    checks\n        ( mkFunction (mkParamSet args) $ var \"b\"\n        , \"{b, c ? 1}: b\"\n        -- Fix (NAbs (ParamSet [(\"b\",Nothing),(\"c\",Just (Fix (NConstant (NInt 1))))] False Nothing) (Fix (NSym \"b\")))\n        )\n        ( mkFunction (mkParamSet args2) $ var \"b\"\n        , \"{ b ? x: x  }: b\"\n        )\n        ( mkFunction (mkNamedParamSet \"a\" args) $ var \"b\"\n        , \"a@{b,c ? 1}: b\"\n        )\n        ( mkFunction (mkNamedParamSet \"a\" args) $ var \"c\"\n        , \"{b,c?1}@a: c\"\n        )\n        ( mkFunction (mkNamedVariadicParamSet \"a\" vargs) $ var \"c\"\n        , \"{b,c?1,...}@a: c\"\n        )\n        ( mkFunction (mkVariadicParamSet mempty) $ mkInt 1\n        , \"{...}: 1\"\n        )\n  where\n    args = [(\"b\", Nothing), (\"c\", pure $ mkInt 1)]\n    vargs = [(\"b\", Nothing), (\"c\", pure $ mkInt 1)]\n    args2 = one (\"b\", pure lam)\n    lam = mkFunction (Param \"x\") $ var \"x\"\n\ncase_lambda_pattern_syntax_mistakes =\n    mistakes\n        \"a@b: a\"\n        \"{a}@{b}: a\"\n\ncase_lambda_app_int =\n    checks\n        ( mkFunction (Param \"a\") (var \"a\") @@ mkInt 3\n        , \"(a: a) 3\"\n        )\n\n-- ** Let\n\ncase_simple_let =\n    checks\n        ( mkLets (one $ \"a\" $= mkInt 4) $ var \"a\"\n        , \"let a = 4; in a\"\n        )\n\ncase_simple_let_syntax_mistakes =\n    mistakes\n        \"let a = 4 in a\"\n\ncase_let_body =\n    checks\n        ( mkRecSet (one $ \"body\" $= mkInt 1) @. \"body\"\n        , \"let { body = 1; }\"\n        )\n\ncase_nested_let =\n    checks\n        ( mkLets (one $ \"a\" $= mkInt 4) $\n            mkLets (one $ \"b\" $= mkInt 5) $\n                var \"a\"\n        , \"let a = 4; in let b = 5; in a\"\n        )\n\ncase_nested_let_syntax_mistakes =\n    mistakes\n        \"let a = 4; let b = 3; in b\"\n\ncase_let_scoped_inherit =\n    checks\n        ( mkLets\n            [ \"a\" $= mkNull\n            , inheritFrom (var \"b\") $ one \"c\"\n            ]\n            $ var \"c\"\n        , \"let a = null; inherit (b) c; in c\"\n        )\n\ncase_let_scoped_inherit_syntax_mistakes =\n    mistakes\n        \"let inherit (b) c in c\"\n\n-- ** If\n\ncase_if =\n    checks\n        ( mkIf (mkBool True) (mkBool True) (mkBool False)\n        , \"if true then true else false\"\n        )\n\ncase_if_syntax_mistakes =\n    mistakes\n        \"if true then false\"\n        \"else\"\n        \"if true then false else\"\n        \"if true then false else false else\"\n        \"1 + 2 then\"\n\n-- ** If follow by with\n\ncase_if_follow_by_with =\n    checks\n        ( mkLets (one $ \"x\" $= mkNonRecSet [\"a\" $= mkBool True, \"b\" $= mkInt 2]) $\n            mkIf (mkWith (mkSym \"x\") (mkSym \"a\")) (mkInt 1) (mkInt 2)\n        , \"let x = { a = true; b = 2; }; in if with x; a then 1 else 2\"\n        )\n\n-- ** Literal expressions in vals\n\ncase_identifier_keyword_prefix_invariants =\n    invariantVals\n        \"true-name\"\n        \"trueName\"\n        \"null-name\"\n        \"nullName\"\n\ncase_identifier_keyword_prefix =\n    checks\n        ( mkList $ one $ var \"null-name\"\n        , \"[ null-name ]\"\n        )\n\n-- ** Strings\n\ninvariantString str =\n    checks\n        ( mkStr str\n        , \"\\\"\" <> str <> \"\\\"\"\n        )\n\ncase_simple_string =\n    knownAs\n        invariantString\n        \"abcdef\"\n        \"a\"\n        \"A\"\n        \"   a a  \"\n        \"\"\n\ncase_string_dollar =\n    knownAs\n        invariantString\n        \"a$b\"\n        \"a$$b\"\n        \"$cdef\"\n        \"gh$i\"\n\ncase_string_escape =\n    checks\n        ( mkStr \"$\\n\\t\\r\\\\\"\n        , \"\\\"\\\\$\\\\n\\\\t\\\\r\\\\\\\\\\\"\"\n        )\n        ( mkStr \" \\\" ' \"\n        , \"\\\" \\\\\\\" \\\\' \\\"\"\n        )\n\ncase_string_antiquote =\n    checks\n        ( Fix $\n            NStr $\n                DoubleQuoted\n                    [ Plain \"abc\"\n                    , Antiquoted $ mkIf (mkBool True) (mkStr \"def\") (mkStr \"abc\")\n                    , Plain \" g\"\n                    ]\n        , \"\\\"abc${  if true then \\\"def\\\" else \\\"abc\\\"  } g\\\"\"\n        )\n        ( mkStr \"${a}\"\n        , \"\\\"\\\\${a}\\\"\"\n        )\n\ncase_string_antiquote_syntax_mistakes =\n    mistakes\n        \"\\\"a\"\n        \"${true}\"\n        \"\\\"${true\\\"\"\n\n-- *** Indented string\n\ncase_indented_string =\n    checks\n        ( mkIndentedStr 0 \"a\"\n        , \"''a''\"\n        )\n        ( mkIndentedStr 2 \"foo\\nbar\"\n        , \"''\\n  foo\\n  bar''\"\n        )\n        ( mkIndentedStr 0 mempty\n        , \"''        ''\"\n        )\n        ( mkIndentedStr 0 \"''\"\n        , \"'''''''\"\n        )\n        ( Fix $\n            NStr $\n                Indented\n                    3\n                    [ Antiquoted mkNull\n                    , Plain \"\\na\"\n                    , Antiquoted mkNull\n                    ]\n        , \"''   ${null}\\n   a${null}''\"\n        )\n\ncase_indented_string_syntax_mistakes =\n    mistakes\n        \"'''''\"\n        \"''   '\"\n\ncase_indented_string_escape =\n    checks\n        ( mkIndentedStr 1 \"\\n \\t \\\\ ${ \\\\ \\\\n ' '' \"\n        , \"'' ''\\\\n ''\\\\t ''\\\\\\\\ ''${ \\\\ \\\\n ' ''' ''\"\n        )\n\n-- ** Selection\n\ncase_select =\n    checks\n        ( Fix $ NSelect Nothing (var \"a\") (StaticKey \"e\" :| [StaticKey \"di\", StaticKey \"f\"])\n        , \"a .  e .di. f\"\n        )\n        ( Fix $\n            NSelect\n                (pure mkNull)\n                (var \"a\")\n                (StaticKey \"e\" :| one (StaticKey \"d\"))\n        , \"a.e . d    or null\"\n        )\n        ( Fix $\n            NSelect\n                (pure mkNull)\n                emptySet\n                (one $ DynamicKey (Plain $ DoubleQuoted mempty))\n        , \"{}.\\\"\\\"or null\"\n        )\n        ( Fix $\n            NBinary\n                NConcat\n                ( (@.<|>)\n                    ( mkNonRecSet $\n                        one $\n                            NamedVar\n                                (mkSelector \"a\")\n                                (mkList $ one $ mkInt 1)\n                                nullPos\n                    )\n                    \"a\"\n                    (mkList $ one $ mkInt 2)\n                )\n                (mkList $ one $ mkInt 3)\n        , \"{ a = [1]; }.a or [2] ++ [3]\"\n        )\n\ncase_select_path =\n    checks\n        ( var \"f\" @@ mkRelPath \"./.\"\n        , \"f ./.\"\n        )\n        ( var \"f\" @. \"b\" @@ mkRelPath \"../a\"\n        , \"f.b ../a\"\n        )\n        ( emptySet @@ mkRelPath \"./def\"\n        , \"{}./def\"\n        )\n        ( Fix (NSelect Nothing emptySet $ one $ DynamicKey $ Plain $ DoubleQuoted mempty) @@ mkRelPath \"./def\"\n        , \"{}.\\\"\\\"./def\"\n        )\n\ncase_select_keyword =\n    checks\n        ( mkNonRecSet $ one $ \"false\" $= mkStr \"foo\"\n        , \"{ false = \\\"foo\\\"; }\"\n        )\n\ncase_select_or_precedence =\n    assertParsePrint\n        [text|\n        let\n          matchDef = def:   matcher:\n                              v:   let\n                                    case = builtins.head (builtins.attrNames v);\n                                  in (matcher.case or def case) (v.case);\n        in null\n      |]\n        [text|\n         let\n          matchDef = def:\n            matcher:\n              v:\n                let\n                  case = builtins.head (builtins.attrNames v);\n                in (matcher.case or def) case (v.case);\n        in null\n      |]\n\ncase_select_or_precedence2 =\n    assertParsePrint\n        [text|\n        let\n          matchDef = def:   matcher:\n                              v:   let\n                                    case = builtins.head (builtins.attrNames v);\n                                  in (matcher.case or null.foo) (v.case);\n        in null\n      |]\n        [text|\n        let\n          matchDef = def:\n            matcher:\n              v:\n                let\n                  case = builtins.head (builtins.attrNames v);\n                in (matcher.case or null).foo (v.case);\n        in null\n      |]\n\n-- ** Function application\n\ncase_fun_app =\n    checks\n        ( var \"f\" @@ var \"a\" @@ var \"b\"\n        , \"f a b\"\n        )\n        ( var \"f\" @@ (@.<|>) (var \"a\") \"x\" mkNull\n        , \"f a.x or null\"\n        )\n\ncase_fun_app_syntax_mistakes =\n    mistakes\n        \"f if true then null else null\"\n\n-- ** Operators\n\ncase_operator_fun_app =\n    checks\n        ( var \"a\" $++ var \"b\"\n        , \"a ++ b\"\n        )\n        ( var \"a\" $++ var \"f\" @@ var \"b\"\n        , \"a ++ f b\"\n        )\n\ncase_operators =\n    checks\n        ( mkInt 1 $+ mkInt 2 $- mkInt 3\n        , \"1 + 2 - 3\"\n        )\n        ( mkInt 1 $+ mkIf (mkBool True) (mkInt 2) (mkInt 3)\n        , \"1 + (if true then 2 else 3)\"\n        )\n        ( mkNonRecSet (one $ \"a\" $= mkInt 3) $// mkRecSet (one $ \"b\" $= mkInt 4)\n        , \"{ a = 3; } // rec { b = 4; }\"\n        )\n        ( mkNeg $ mkNeg $ var \"a\"\n        , \"--a\"\n        )\n        ( var \"a\" $- var \"b\" $- var \"c\"\n        , \"a - b - c\"\n        )\n        ( var \"foo\" $< var \"bar\"\n        , \"foo<bar\"\n        )\n\ncase_operators_syntax_mistakes =\n    mistakes\n        \"+ 3\"\n        \"foo +\"\n        \"1 + if true then 1 else 2\"\n\n-- ** Comments\n\ncase_comments =\n    do\n        Right expected <- parseNixFile \"data/let.nix\"\n        assertParseFile \"let-comments-multiline.nix\" expected\n        assertParseFile \"let-comments.nix\" expected\n\n-- ** Location\n\ncase_simpleLoc =\n    let\n        mkSPos = on (NSourcePos \"<string>\") (coerce . mkPos)\n        mkSpan = on SrcSpan (uncurry mkSPos)\n     in\n        assertParseTextLoc\n            [text|let\n    foo = bar\n         baz \"qux\";\n    in foo\n    |]\n            ( NLetAnn\n                (mkSpan (1, 1) (4, 7))\n                ( one $\n                    NamedVar\n                        (one $ StaticKey \"foo\")\n                        ( NAppAnn\n                            (mkSpan (2, 7) (3, 15))\n                            ( NAppAnn\n                                (mkSpan (2, 7) (3, 9))\n                                (NSymAnn (mkSpan (2, 7) (2, 10)) \"bar\")\n                                (NSymAnn (mkSpan (3, 6) (3, 9)) \"baz\")\n                            )\n                            (NStrAnn (mkSpan (3, 10) (3, 15)) $ DoubleQuoted $ one $ Plain \"qux\")\n                        )\n                        (mkSPos 2 1)\n                )\n                (NSymAnn (mkSpan (4, 4) (4, 7)) \"foo\")\n            )\n\ntests :: TestTree\ntests = $testGroupGenerator\n\n---------------------------------------------------------------------------------\n\n-- * Helpers\n\nvar = mkSym\n\ninvariantVal = staysInvariantUnder var\n\nstaysInvariantUnder :: (NixLang -> ExpectedHask) -> NixLang -> Assertion\nstaysInvariantUnder f v =\n    (<=>) (f v) v\n\ntype NixLang = Text\ntype ExpectedHask = NExpr\n\n(<=>) :: ExpectedHask -> NixLang -> Assertion\n(<=>) = assertParseText\n\nthrowParseError :: forall ann. Text -> Text -> Doc ann -> Assertion\nthrowParseError entity expr err =\n    assertFailure $\n        renderString $\n            layoutSmart Prettyprinter.defaultLayoutOptions $\n                nest 2 $\n                    vsep\n                        [ mempty\n                        , \"Unexpected fail parsing \" <> reflow entity <> \":\"\n                        , nest 2 $\n                            vsep\n                                [ \"Expression:\"\n                                , reflow expr\n                                , \"Error: \" <> nest 2 err\n                                ]\n                        ]\n\nassertParseText :: ExpectedHask -> NixLang -> Assertion\nassertParseText expected str =\n    either\n        (throwParseError \"expression\" str)\n        ( assertEqual\n            (\"When parsing \" <> toString str)\n            (stripPositionInfo expected)\n            . stripPositionInfo\n        )\n        (parseNixText str)\n\nassertParseTextLoc :: NixLang -> NExprLoc -> Assertion\nassertParseTextLoc str expected =\n    either\n        (throwParseError \"expression\" str)\n        ( assertEqual\n            (\"When parsing \" <> toString str)\n            expected\n        )\n        (parseNixTextLoc str)\n\nassertParseFile :: Path -> NExpr -> Assertion\nassertParseFile file expected =\n    do\n        res <- parseNixFile $ \"data/\" <> file\n        either\n            (throwParseError \"data file\" $ coerce fromString file)\n            ( assertEqual\n                (\"Parsing data file \" <> coerce file)\n                (stripPositionInfo expected)\n                . stripPositionInfo\n            )\n            res\n\nassertParseFail :: NixLang -> Assertion\nassertParseFail str =\n    either\n        (const stub)\n        ( \\r ->\n            assertFailure $ toString $ \"\\nUnexpected success parsing string ''\" <> str <> \"'':\\n''Parsed value: ''\" <> show r <> \"''.\"\n        )\n        (parseNixText str)\n\n-- assertRoundTrip :: Text -> Assertion\n-- assertRoundTrip src = assertParsePrint src src\n\nassertParsePrint :: Text -> Text -> Assertion\nassertParsePrint src expect =\n    let\n        Right expr = parseNixTextLoc src\n        result =\n            renderStrict\n                . layoutPretty defaultLayoutOptions\n                . prettyNix\n                . stripAnnotation\n                $ expr\n     in\n        assertEqual mempty expect result\n\n-----\n\n{- | This class constructs functions that accept variacic number of argumets.\nEvery argument is an assertion.\nSo now the new assertions can be added just by adding it to a block of according assertions.\n-}\nclass VariadicAssertions t where\n    checkListPairs' :: ((ExpectedHask, NixLang) -> Assertion) -> [(ExpectedHask, NixLang)] -> t\n\ninstance VariadicAssertions (IO a) where\n    checkListPairs' f acc =\n        do\n            traverse_ f acc\n            pure $ error \"never would be reached, cuz `I'm lazy`.\"\n\ninstance (VariadicAssertions a) => VariadicAssertions ((ExpectedHask, NixLang) -> a) where\n    checkListPairs' f acc x = checkListPairs' f (acc <> one x)\n\nchecks :: (VariadicAssertions a) => a\nchecks = checkListPairs' (uncurry assertParseText) mempty\n\nclass VariadicArgs t where\n    checkList' :: (NixLang -> Assertion) -> [NixLang] -> t\n\ninstance VariadicArgs (IO a) where\n    checkList' f acc =\n        do\n            traverse_ f acc\n            pure $ error \"never would be reached, cuz `I'm lazy`.\"\n\ninstance (VariadicArgs a) => VariadicArgs (NixLang -> a) where\n    checkList' f acc x = checkList' f (acc <> one x)\n\nknownAs :: (VariadicArgs a) => (NixLang -> Assertion) -> a\nknownAs f = checkList' f mempty\n\nmistakes :: (VariadicArgs a) => a\nmistakes = knownAs assertParseFail\n\ninvariantVals :: (VariadicArgs a) => a\ninvariantVals = knownAs invariantVal\n"
  },
  {
    "path": "tests/PrettyParseTests.hs",
    "content": "{-# LANGUAGE DataKinds #-}\n{-# LANGUAGE MonoLocalBinds #-}\n{-# LANGUAGE NoMonomorphismRestriction #-}\n\nmodule PrettyParseTests where\n\nimport Data.Algorithm.Diff\nimport Data.Algorithm.DiffOutput\nimport Data.Char\nimport Data.Fix\nimport qualified Data.String as String\nimport Hedgehog\nimport qualified Hedgehog.Gen as Gen\nimport qualified Hedgehog.Range as Range\nimport Nix.Atoms\nimport Nix.Expr\nimport Nix.Parser\nimport Nix.Prelude\nimport Nix.Pretty\nimport Prettyprinter\nimport Test.Tasty\nimport Test.Tasty.Hedgehog\nimport qualified Text.Show.Pretty as PS\n\nasciiString :: (MonadGen m) => m String\nasciiString = Gen.list (Range.linear 1 15) Gen.lower\n\nasciiText :: Gen Text\nasciiText = fromString <$> asciiString\n\nasciiVarName :: Gen VarName\nasciiVarName = coerce <$> asciiText\n\n-- Might want to replace this instance with a constant value\ngenNPos :: Gen NPos\ngenNPos = fmap coerce $ mkPos <$> Gen.int (Range.linear 1 256)\n\ngenNSourcePos :: Gen NSourcePos\ngenNSourcePos =\n    join\n        ( liftA3\n            NSourcePos\n            (fmap coerce asciiString)\n        )\n        genNPos\n\ngenKeyName :: Gen (NKeyName NExpr)\ngenKeyName =\n    Gen.choice [DynamicKey <$> genAntiquoted genString, StaticKey <$> asciiVarName]\n\ngenAntiquoted :: Gen a -> Gen (Antiquoted a NExpr)\ngenAntiquoted gen =\n    Gen.choice [Plain <$> gen, pure EscapedNewline, Antiquoted <$> genExpr]\n\ngenBinding :: Gen (Binding NExpr)\ngenBinding =\n    Gen.choice\n        [ liftA3\n            NamedVar\n            genAttrPath\n            genExpr\n            genNSourcePos\n        , liftA3\n            Inherit\n            (Gen.maybe genExpr)\n            (Gen.list (Range.linear 0 5) asciiVarName)\n            genNSourcePos\n        ]\n\ngenString :: Gen (NString NExpr)\ngenString =\n    Gen.choice\n        [ DoubleQuoted <$> genLines\n        , liftA2\n            Indented\n            (Gen.int $ Range.linear 0 10)\n            genLines\n        ]\n  where\n    genLines =\n        Gen.list\n            (Range.linear 0 5)\n            (genAntiquoted asciiText)\n\ngenAttrPath :: Gen (NAttrPath NExpr)\ngenAttrPath =\n    liftA2\n        (:|)\n        genKeyName\n        $ Gen.list (Range.linear 0 4) genKeyName\n\ngenParams :: Gen (Params NExpr)\ngenParams =\n    Gen.choice\n        [ Param <$> asciiVarName\n        , liftA3\n            (mkGeneralParamSet . pure)\n            (Gen.choice [stub, asciiText])\n            ( Gen.list (Range.linear 0 10) $\n                liftA2\n                    (,)\n                    asciiText\n                    (Gen.maybe genExpr)\n            )\n            Gen.bool\n        ]\n\ngenAtom :: Gen NAtom\ngenAtom =\n    Gen.choice\n        [ NInt <$> Gen.integral (Range.linear 0 1000)\n        , NFloat <$> Gen.float (Range.linearFrac 0.0 1000.0)\n        , NBool <$> Gen.bool\n        , pure NNull\n        ]\n\n-- This is written by hand so we can use `fairList` rather than the normal\n-- list Arbitrary instance which makes the generator terminate. The\n-- distribution is not scientifically chosen.\ngenExpr :: Gen NExpr\ngenExpr =\n    Gen.sized genCurbed\n  where\n    genCurbed (coerce -> n) =\n        Fix\n            <$> bool\n                small\n                big\n                (n >= 2)\n      where\n        genConstant = NConstant <$> genAtom\n        genStr = NStr <$> genString\n        genSym = NSym <$> asciiVarName\n        genLiteralPath = NLiteralPath . (\"./\" <>) . coerce <$> asciiString\n        genEnvPath = NEnvPath . coerce <$> asciiString\n\n        small = Gen.choice [genConstant, genStr, genSym, genLiteralPath, genEnvPath]\n\n        big =\n            let\n                sizeDivBy i = Size $ n `div` i\n                resizeDivBy i = Gen.resize (sizeDivBy i)\n             in\n                Gen.frequency\n                    [ (1, genConstant)\n                    , (1, genSym)\n                    , (2, genUnary)\n                    , (5, genList)\n                    , (20, genSet)\n                    , (10, genRecSet)\n                    , (1, resizeDivBy 2 genAssert)\n                    , (4, resizeDivBy 3 genIf)\n                    , (2, resizeDivBy 3 genBinary)\n                    , (3, resizeDivBy 3 genSelect)\n                    , (20, resizeDivBy 2 genAbs)\n                    , (2, resizeDivBy 2 genHasAttr)\n                    , (10, resizeDivBy 2 genLet)\n                    , (10, resizeDivBy 2 genWith)\n                    ]\n          where\n            genList = NList <$> fairList genExpr\n            genSet = NSet mempty <$> fairList genBinding\n            genRecSet = NSet Recursive <$> fairList genBinding\n            genUnary = liftA2 NUnary Gen.enumBounded genExpr\n            genBinary = join (liftA3 NBinary Gen.enumBounded) genExpr\n            genSelect = liftA3 NSelect (Gen.maybe genExpr) genExpr genAttrPath\n            genHasAttr = liftA2 NHasAttr genExpr genAttrPath\n            genAbs = liftA2 NAbs genParams genExpr\n            genLet = liftA2 NLet (fairList genBinding) genExpr\n            genIf = join (liftA3 NIf genExpr) genExpr\n            genWith = join (liftA2 NWith) genExpr\n            genAssert = join (liftA2 NAssert) genExpr\n\n{- | Useful when there are recursive positions at each element of the list as\n  it divides the size by the length of the generated list.\n-}\nfairList :: Gen a -> Gen [a]\nfairList g = Gen.sized $ \\s -> do\n    k <- Gen.int $ Range.linear 0 $ unSize s\n    -- Use max here to avoid dividing by zero when there is the empty list\n    Gen.resize (Size (unSize s `div` max 1 k)) $ Gen.list (Range.singleton k) g\n\nequivUpToNormalization :: NExpr -> NExpr -> Bool\nequivUpToNormalization x y = normalize x == normalize y\n\nnormalize :: NExpr -> NExpr\nnormalize = foldFix $ \\case\n    NConstant (NInt n)\n        | n < 0 ->\n            mkNeg $ mkInt $ negate n\n    NConstant (NFloat n)\n        | n < 0 ->\n            mkNeg $ mkFloat $ negate n\n    NSet recur binds ->\n        mkSet recur $ normBinding <$> binds\n    NLet binds r ->\n        mkLets (normBinding <$> binds) r\n    NAbs params r ->\n        mkFunction (normParams params) r\n    r -> Fix r\n  where\n    normBinding (NamedVar path r pos) = NamedVar (normKey <$> path) r pos\n    normBinding (Inherit mr names pos) = Inherit mr names pos\n\n    normKey (DynamicKey quoted) = DynamicKey (normAntiquotedString quoted)\n    normKey (StaticKey name) = StaticKey name\n\n    normAntiquotedString ::\n        Antiquoted (NString NExpr) NExpr ->\n        Antiquoted (NString NExpr) NExpr\n    normAntiquotedString (Plain (DoubleQuoted [EscapedNewline])) = EscapedNewline\n    normAntiquotedString (Plain (DoubleQuoted strs)) =\n        bool\n            normAntiquotedString\n            id\n            (strs == strs')\n            (Plain $ DoubleQuoted strs')\n      where\n        strs' = normAntiquotedText <$> strs\n    normAntiquotedString r = r\n\n    normAntiquotedText ::\n        Antiquoted Text NExpr ->\n        Antiquoted Text NExpr\n    normAntiquotedText (Plain \"\\n\") = EscapedNewline\n    normAntiquotedText (Plain \"''\\n\") = EscapedNewline\n    normAntiquotedText r = r\n\n    normParams (ParamSet (Just \"\") variadic pset) = ParamSet Nothing variadic pset\n    normParams r = r\n\n-- | Test that parse . pretty == id up to attribute position information.\nprop_prettyparse :: (Monad m) => NExpr -> PropertyT m ()\nprop_prettyparse p =\n    either\n        ( \\s -> do\n            footnote $\n                show $\n                    vsep\n                        -- Remove :: Text type annotation after String -> Text migration.\n                        [fillSep [\"Parse failed:\", pretty (show s :: Text)], indent 2 $ prettyNix p]\n            discard\n        )\n        ( \\v ->\n            bool\n                ( do\n                    let\n                        pp = normalise prog\n                        pv = normalise $ show $ prettyNix v\n\n                    footnote $\n                        show $\n                            vsep\n                                [ \"----------------------------------------\"\n                                , vsep [\"Expr before:\", indent 2 $ pretty $ PS.ppShow p]\n                                , \"----------------------------------------\"\n                                , vsep [\"Expr after:\", indent 2 $ pretty $ PS.ppShow v]\n                                , \"----------------------------------------\"\n                                , vsep [\"Pretty before:\", indent 2 $ pretty prog]\n                                , \"----------------------------------------\"\n                                , vsep [\"Pretty after:\", indent 2 $ prettyNix v]\n                                , \"----------------------------------------\"\n                                , vsep [\"Normalised before:\", indent 2 $ pretty pp]\n                                , \"----------------------------------------\"\n                                , vsep [\"Normalised after:\", indent 2 $ pretty pv]\n                                , \"========================================\"\n                                , vsep [\"Normalised diff:\", pretty $ ppDiff $ ldiff pp pv]\n                                , \"========================================\"\n                                ]\n                    assert (pp == pv)\n                )\n                success\n                (equivUpToNormalization p v)\n        )\n        (parse $ fromString prog)\n  where\n    prog = show $ prettyNix p\n\n    parse = parseNixText\n\n    normalise s = String.unlines $ reverse . dropWhile isSpace . reverse <$> String.lines s\n\n    ldiff :: String -> String -> [Diff [String]]\n    ldiff s1 s2 = getDiff (one <$> String.lines s1) (one <$> String.lines s2)\n\ntests :: TestLimit -> TestTree\ntests n =\n    testProperty \"Pretty/Parse Property\" $\n        withTests n $\n            property $\n                prop_prettyparse =<< forAll genExpr\n"
  },
  {
    "path": "tests/PrettyTests.hs",
    "content": "{-# LANGUAGE TemplateHaskell #-}\n\nmodule PrettyTests (tests) where\n\nimport Nix.Prelude\nimport Test.Tasty\nimport Test.Tasty.HUnit\nimport Test.Tasty.TH\n\nimport Nix.Expr\nimport Nix.Pretty\n\ncase_indented_antiquotation :: Assertion\ncase_indented_antiquotation =\n    do\n        assertPretty\n            (mkIndentedStr 0 \"echo $foo\")\n            \"''echo $foo''\"\n        assertPretty\n            (mkIndentedStr 0 \"echo ${foo}\")\n            \"''echo ''${foo}''\"\n\ncase_string_antiquotation :: Assertion\ncase_string_antiquotation =\n    do\n        assertPretty\n            (mkStr \"echo $foo\")\n            \"\\\"echo $foo\\\"\"\n        assertPretty\n            (mkStr \"echo ${foo}\")\n            \"\\\"echo \\\\${foo}\\\"\"\n\ncase_function_params :: Assertion\ncase_function_params =\n    assertPretty\n        (mkFunction (mkVariadicParamSet mempty) (mkInt 3))\n        \"{ ... }:\\n  3\"\n\ncase_paths :: Assertion\ncase_paths =\n    do\n        assertPretty\n            (mkPath False \"~/test.nix\")\n            \"~/test.nix\"\n        assertPretty\n            (mkPath False \"/test.nix\")\n            \"/test.nix\"\n        assertPretty\n            (mkPath False \"./test.nix\")\n            \"./test.nix\"\n\ntests :: TestTree\ntests = $testGroupGenerator\n\n---------------------------------------------------------------------------------\nassertPretty :: NExpr -> Text -> Assertion\nassertPretty e s =\n    assertEqual (\"When pretty-printing \" <> show e) s . show $ prettyNix e\n"
  },
  {
    "path": "tests/ReduceExprTests.hs",
    "content": "{-# OPTIONS_GHC -fno-warn-name-shadowing #-}\n\nmodule ReduceExprTests (tests) where\n\nimport Nix.Prelude\nimport Test.Tasty\nimport Test.Tasty.HUnit\n\nimport Nix.Expr.Shorthands\nimport Nix.Expr.Types\nimport Nix.Expr.Types.Annotated\nimport Nix.Parser\nimport Nix.Reduce (reduceExpr)\n\ntests :: TestTree\ntests =\n    testGroup\n        \"Expr Reductions\"\n        [ testCase \"Non nested NSelect on set should be reduced\" $\n            cmpReduceResult selectBasic selectBasicExpect\n        , testCase \"Nested NSelect on set should be reduced\" $\n            cmpReduceResult selectNested selectNestedExpect\n        , testCase \"Non nested NSelect with incorrect attrpath shouldn't be reduced\" $\n            shouldntReduce selectIncorrectAttrPath\n        , testCase \"Nested NSelect with incorrect attrpath shouldn't be reduced\" $\n            shouldntReduce selectNestedIncorrectAttrPath\n        ]\n\nassertSucc :: Result a -> IO a\nassertSucc =\n    either\n        (assertFailure . show)\n        pure\n\ncmpReduceResult :: Result NExprLoc -> NExpr -> Assertion\ncmpReduceResult r e = do\n    r <- assertSucc r\n    r <- stripAnnotation <$> reduceExpr mempty r\n    r @?= e\n\nshouldntReduce :: Result NExprLoc -> Assertion\nshouldntReduce r = do\n    r <- assertSucc r\n    rReduced <- reduceExpr mempty r\n    r @?= rReduced\n\nselectBasic :: Result NExprLoc\nselectBasic = parseNixTextLoc \"{b=2;a=42;}.a\"\n\nselectBasicExpect :: NExpr\nselectBasicExpect = mkInt 42\n\nselectNested :: Result NExprLoc\nselectNested = parseNixTextLoc \"{a={b=2;a=42;};b={a=2;};}.a.a\"\n\nselectNestedExpect :: NExpr\nselectNestedExpect = mkInt 42\n\nselectIncorrectAttrPath :: Result NExprLoc\nselectIncorrectAttrPath = parseNixTextLoc \"{a=42;}.b\"\n\nselectNestedIncorrectAttrPath :: Result NExprLoc\nselectNestedIncorrectAttrPath = parseNixTextLoc \"{a={a=42;};}.a.b\"\n"
  },
  {
    "path": "tests/TestCommon.hs",
    "content": "module TestCommon where\n\nimport Control.Monad.Catch\nimport Data.Text.IO as Text\nimport Data.Time\nimport GHC.Err (errorWithoutStackTrace)\nimport Nix\nimport Nix.Prelude\nimport Nix.Standard\nimport System.Environment\nimport System.IO\nimport System.PosixCompat.Files\nimport System.PosixCompat.Temp\nimport System.Process\nimport Test.Tasty.HUnit\n\nhnixEvalFile :: Options -> Path -> IO StdVal\nhnixEvalFile opts file =\n    do\n        parseResult <- parseNixFileLoc file\n        either\n            (\\err -> fail $ \"Parsing failed for file `\" <> coerce file <> \"`.\\n\" <> show err)\n            ( \\expr ->\n                do\n                    setEnv \"TEST_VAR\" \"foo\"\n                    runWithBasicEffects opts $\n                        evaluateExpression (pure $ coerce file) nixEvalExprLoc normalForm expr\n                            `catch` \\case\n                                NixException frames ->\n                                    errorWithoutStackTrace . show\n                                        =<< renderFrames\n                                            @StdVal\n                                            @StdThun\n                                            frames\n            )\n            parseResult\n\nnixEvalFile :: Path -> IO Text\nnixEvalFile (coerce -> fp) = fromString <$> readProcess \"nix-instantiate\" [\"--eval\", \"--strict\", fp] mempty\nhnixEvalText :: Options -> Text -> IO StdVal\nhnixEvalText opts src =\n    either\n        (\\err -> fail $ toString $ \"Parsing failed for expression `\" <> src <> \"`.\\n\" <> show err)\n        (runWithBasicEffects opts . (normalForm <=< nixEvalExpr mempty))\n        $ parseNixText src\n\nnixEvalText :: Text -> IO Text\nnixEvalText expr =\n    do\n        (fp, h) <- mkstemp \"nix-test-eval\"\n        Text.hPutStr h expr\n        hClose h\n        res <- nixEvalFile $ coerce fp\n        removeLink fp\n        pure res\n\nassertEvalMatchesNix ::\n    ( Options ->\n      Text ->\n      IO (NValue t (StdCited StandardIO) StandardIO)\n    ) ->\n    (Text -> IO Text) ->\n    Text ->\n    IO ()\nassertEvalMatchesNix evalHNix evalNix fp =\n    do\n        time <- liftIO getCurrentTime\n        hnixVal <- (<> \"\\n\") . printNix <$> evalHNix (defaultOptions time) fp\n        nixVal <- evalNix fp\n        assertEqual (toString fp) nixVal hnixVal\n\n-- | Compares @HNix@ & @Nix@ return results.\nassertEvalFileMatchesNix :: Path -> Assertion\nassertEvalFileMatchesNix fp =\n    assertEvalMatchesNix\n        (\\o -> hnixEvalFile o . coerce . toString)\n        (nixEvalFile . coerce . toString)\n        $ fromString\n        $ coerce fp\n\nassertEvalTextMatchesNix :: Text -> Assertion\nassertEvalTextMatchesNix =\n    assertEvalMatchesNix hnixEvalText nixEvalText\n"
  },
  {
    "path": "tests/eval-compare/builtins.appendContext.nix",
    "content": "let\n  drv = derivation {\n    name = \"fail\";\n    builder = \"/bin/false\";\n    system = \"x86_64-linux\";\n    outputs = [ \"out\" \"foo\" ];\n  };\n\n  path = \"${./builtins.appendContext.nix}\";\n\n  desired-context = {\n    \"${builtins.unsafeDiscardStringContext path}\" = {\n      path = true;\n    };\n    \"${builtins.unsafeDiscardStringContext drv.drvPath}\" = {\n      outputs = [ \"foo\" \"out\" ];\n      allOutputs = true;\n    };\n  };\n\n  # TODO: Remove builtins.attrValues here once store hash is correct.\n  legit-context = builtins.attrValues (builtins.getContext \"${path}${drv.outPath}${drv.foo.outPath}${drv.drvPath}\");\n\n  constructed-context = builtins.attrValues (builtins.getContext (builtins.appendContext \"\" desired-context));\n# jww (2019-03-17): This is not working just yet\n# in [ (builtins.appendContext \"foo\" {})\n#      (legit-context == constructed-context)\n#      constructed-context\n#    ]\nin true\n"
  },
  {
    "path": "tests/eval-compare/builtins.eq-bottom-00.nix",
    "content": "let\n\n  plain = (let x = x; in x);\n  nested_list = [(let x = x; in x)];\n  nested_attrset = { y = (let x = x; in x); };\n  nested_list_list = [[(let x = x; in x)]];\n  nested_list_attrset = [{ y = (let x = x; in x); }];\n  nested_list_function = [(_: let x = x; in x)];\n  nested_attrset_list = { y = [(let x = x; in x)]; };\n  nested_attrset_attrset = { y = { y = (let x = x; in x); }; };\n  nested_attrset_function = { y = (_: let x = x; in x); };\n\n  tests = [\n    # (plain == plain) # Diverges\n    # (nested_list == nested_list) # Diverges\n    # (nested_attrset == nested_attrset) # Diverges\n    (nested_list_list == nested_list_list)\n    (nested_list_attrset == nested_list_attrset)\n    (nested_list_function == nested_list_function)\n    (nested_attrset_attrset == nested_attrset_attrset)\n    (nested_attrset_list == nested_attrset_list)\n    (nested_attrset_function == nested_attrset_function)\n  ];\n\nin tests\n"
  },
  {
    "path": "tests/eval-compare/builtins.fetchurl-01.nix",
    "content": "with builtins;\n\nlet a = fetchurl \"https://haskell.org\";\n\nin [ a (hasContext a) ]\n"
  },
  {
    "path": "tests/eval-compare/builtins.fromJSON-01.nix",
    "content": "with builtins;\n\nlet simpleJSON = \"{\\\"foo\\\": \\\"39\\\", \\\"bar\\\": 472}\";\n    screwyJSON = \"{\\\"4275\\\": \\\"Please do not fail.\\\"}\";\n    crazyJSON = \"     {\n    \\\"response\\\": {\n        \\\"success\\\": 1,\n        \\\"current_time\\\": 1362339098,\n        \\\"prices\\\": {\n            \\\"35\\\": {\n                \\\"11\\\": {\n                    \\\"0\\\": {\n                        \\\"current\\\": {\n                            \\\"currency\\\": \\\"keys\\\",\n                            \\\"value\\\": 39,\n                            \\\"value_high\\\": 41,\n                            \\\"date\\\": 1357515306\n                        },\n                        \\\"previous\\\": {\n                            \\\"currency\\\": \\\"keys\\\",\n                            \\\"value\\\": 37,\n                            \\\"value_high\\\": 39\n                        }\n                    }\n                },\n                \\\"3\\\": {\n                    \\\"0\\\": {\n                        \\\"current\\\": {\n                            \\\"currency\\\": \\\"metal\\\",\n                            \\\"value\\\": 0.33,\n                            \\\"value_high\\\": 0.66\n                        }\n                    }\n                }\n            },\n            \\\"5002\\\": {\n                \\\"6\\\": {\n                    \\\"0\\\": {\n                        \\\"current\\\": {\n                            \\\"currency\\\": \\\"usd\\\",\n                            \\\"value\\\": 0.39,\n                            \\\"value_high\\\": 0.42,\n                            \\\"date\\\": 1358090106\n                        }\n                    }\n                }\n            },\n            \\\"5022\\\": {\n                \\\"6\\\": {\n                    \\\"1\\\": {\n                        \\\"current\\\": {\n                            \\\"currency\\\": \\\"metal\\\",\n                            \\\"value\\\": 1.33,\n                            \\\"value_high\\\": 1.55,\n                            \\\"date\\\": 1357515175\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\";\nin [(fromJSON simpleJSON) (fromJSON screwyJSON) (fromJSON crazyJSON)]\n"
  },
  {
    "path": "tests/eval-compare/builtins.getContext.nix",
    "content": "with builtins;\n\n[ (getContext \"foo\")\n  (attrValues (getContext (toFile \"foo\" \"foo contents\")))\n  # TODO: Re-enable this once output hash is correct.\n  # (getContext (toFile \"foo\" \"foo contents\"))\n]\n"
  },
  {
    "path": "tests/eval-compare/builtins.lessThan-01.nix",
    "content": "with builtins;\n\nlet numTestPrecisionA = 4.000000000000000000001;\n    numTestPrecisionB = 4;\n    numTest3 = -4.1;\n    numTest4 = -4;\n    numTestZeroA = 0;\n    numTestZeroB = -0;\n    numTestMaxBoundA = 999999999999999999;\n    numTestMaxBoundB = 999999999999999998;\n    numTestMinBoundA = -999999999999999999;\n    numTestMinBoundB = -999999999999999998;\n    stringTest1 = \"abcd\";\n    stringTest2 = \"abce\";\n    stringTestBase1 = \"foo\" + \"/\" + stringTest1;\n    stringTestBase2 = \"foo\" + \"/\" + stringTest2;\n    stringTestJSONA = toJSON stringTest1;\n    stringTestJSONB = toJSON stringTest2;\n    stringTestToFileA = toFile \"stringTest1\" stringTest1;\n    stringTestToFileB = toFile \"stringTest2\" stringTest2;\nin [(lessThan numTestPrecisionA numTestPrecisionB)\n    (lessThan numTestPrecisionB numTestPrecisionA)\n    (lessThan numTest3 numTest4)\n    (lessThan numTest4 numTest3)\n    (lessThan numTestZeroA numTestZeroB)\n    (lessThan numTestZeroB numTestZeroA)\n    (lessThan numTestMaxBoundA numTestMaxBoundB)\n    (lessThan numTestMaxBoundB numTestMaxBoundA)\n    (lessThan numTestMinBoundA numTestMinBoundB)\n    (lessThan numTestMinBoundB numTestMinBoundA)\n    (lessThan stringTest1 stringTest2)\n    (lessThan stringTest2 stringTest1)\n    (lessThan stringTestJSONA stringTestJSONB)\n    (lessThan stringTestJSONB stringTestJSONA)\n    (lessThan stringTest1 stringTestJSONB)\n    (lessThan stringTestJSONB stringTest1)\n    (lessThan stringTest2 stringTestJSONA)\n    (lessThan stringTestJSONA stringTest2)\n    (lessThan stringTest1 stringTestToFileB)\n    (lessThan stringTestToFileB stringTest1)\n    (lessThan stringTestToFileA stringTest2)\n    (lessThan stringTest1 (baseNameOf stringTestBase1))\n    (lessThan stringTest2 (baseNameOf stringTestBase2))\n  ]\n"
  },
  {
    "path": "tests/eval-compare/builtins.mapAttrs-01.nix",
    "content": "with builtins;\n\nlet fooset = { foo = 123; bar = 456; };\n    lolset = { \"foo/bar\" = \"lol\"; \"bar/baz\" = \"wat\";};\n    emptyset = {};\nin [ (all (x: hasContext(x)) (attrValues (mapAttrs (key: value: key) fooset)))\n     (all (x: hasContext(x)) (attrValues (mapAttrs (key: value: key) lolset)))\n     (all (x: hasContext(x)) (attrValues (mapAttrs (key: value: key) emptyset)))\n     (all (x: hasContext(x)) (attrValues (mapAttrs (key: value: key + toString value) fooset)))\n     (all (x: hasContext(x)) (attrValues (mapAttrs (key: value: key + toString value) lolset)))\n     (all (x: hasContext(x)) (attrValues (mapAttrs (key: value: key + toString value) emptyset)))\n     (all (x: hasContext(x)) (attrValues (mapAttrs (key: value: key + toJSON value) fooset)))\n     (all (x: hasContext(x)) (attrValues (mapAttrs (key: value: key + toJSON value) lolset)))\n     (all (x: hasContext(x)) (attrValues (mapAttrs (key: value: key + toJSON value) emptyset)))\n     (all (x: hasContext(x)) (attrValues (mapAttrs (key: value: key + toJSON (toString value)) fooset)))\n     (all (x: hasContext(x)) (attrValues (mapAttrs (key: value: key + toJSON (toString value)) lolset)))\n     (all (x: hasContext(x)) (attrValues (mapAttrs (key: value: key + toJSON (toString value)) emptyset)))\n     (all (x: hasContext(x)) (attrValues (mapAttrs (key: value: key + value) lolset)))\n     (all (x: hasContext(x)) (attrValues (mapAttrs (key: value: key + value) emptyset)))\n  ]\n"
  },
  {
    "path": "tests/eval-compare/builtins.pathExists.nix",
    "content": "builtins.pathExists \"/var/empty/invalid-directory\"\n"
  },
  {
    "path": "tests/eval-compare/builtins.replaceStrings-01.nix",
    "content": "with builtins;\n\nlet a1 = toFile \"foo\" \"foo contents\"; # /nix/store/pqwdc5m06lxl8gmzcd26ifwsdhq9fj7k-foo\n    a2 = toFile \"bar\" \"bar contents\"; # /nix/store/4q6kxj1ym13yfp1bcdrzrwa1la6dqgp5-bar\n    b = dirOf a1;\n    c = substring 3 1 b;\n    d = replaceStrings [\"b\"] [c] \"abc\";\n    e = replaceStrings [\"k\"] [c] \"abc\";\n    f = replaceStrings [\"y\"] [c] (dirOf a2);\n    g = replaceStrings [\"s\"] [c] (dirOf a2);\n    h = replaceStrings [\"y\"] [\"z\"] \"abc\";\nin [ b c d e f g h     # TODO Add a1 here when we have correct store hashing working\n     (hasContext d)\n     (hasContext e)\n     (hasContext f)\n     (hasContext g)\n     (hasContext h)\n   ]"
  },
  {
    "path": "tests/eval-compare/builtins.split-01.nix",
    "content": "builtins.split \"(a)b\" \"abc\"\n"
  },
  {
    "path": "tests/eval-compare/builtins.split-02.nix",
    "content": "builtins.split \"([ac])\" \"abc\"\n"
  },
  {
    "path": "tests/eval-compare/builtins.split-03.nix",
    "content": "builtins.split \"(a)|(c)\" \"abc\"\n"
  },
  {
    "path": "tests/eval-compare/builtins.split-04.nix",
    "content": "builtins.split \"([[:upper:]]+)\" \"  FOO   \"\n"
  },
  {
    "path": "tests/eval-compare/builtins.string.store.nix",
    "content": "\"${builtins.storeDir}\"\n"
  },
  {
    "path": "tests/eval-compare/builtins.toJSON.nix",
    "content": "with builtins;\n\nlet f = toFile \"foo\" \"foo contents\"; # /nix/store/pqwdc5m06lxl8gmzcd26ifwsdhq9fj7k-foo\n    objA = { a = 15; b = substring 1 3 (dirOf f); };\n    objB = { a = 42; b = \"hello\"; };\nin [ (hasContext (toJSON objA))\n     (hasContext (toJSON objB))\n   ]"
  },
  {
    "path": "tests/eval-compare/current-system.nix",
    "content": "builtins.hasContext builtins.currentSystem"
  },
  {
    "path": "tests/eval-compare/ellipsis.nix",
    "content": "let x = 1;\n    f = { ... }: x;\nin f { x = 2; }\n"
  },
  {
    "path": "tests/eval-compare/ind-string-01.nix",
    "content": "let\n\n  s1 = ''\n    This is an indented multi-line string\n    literal.  An amount of whitespace at\n    the start of each line matching the minimum\n    indentation of all lines in the string\n    literal together will be removed.  Thus,\n    in this case four spaces will be\n    stripped from each line, even though\n      THIS LINE is indented six spaces.\n\n    Also, empty lines don't count in the\n    determination of the indentation level (the\n    previous empty line has indentation 0, but\n    it doesn't matter).\n  '';\n\nin s1\n"
  },
  {
    "path": "tests/eval-compare/ind-string-02.nix",
    "content": "let\n\n  s2 = ''  If the string starts with whitespace\n    followed by a newline, it's stripped, but\n    that's not the case here. Two spaces are\n    stripped because of the \"  \" at the start. \n  '';\n\nin s2\n"
  },
  {
    "path": "tests/eval-compare/ind-string-03.nix",
    "content": "let\n\n  s3 = ''\n      This line is indented\n      a bit further.\n        ''; # indentation of last line doesn't count if it's empty\n\nin s3\n"
  },
  {
    "path": "tests/eval-compare/ind-string-04.nix",
    "content": "let\n\n  s4 = ''\n    Anti-quotations, like ${if true then \"so\" else \"not so\"}, are\n    also allowed.\n  '';\n\nin s4\n"
  },
  {
    "path": "tests/eval-compare/ind-string-05.nix",
    "content": "let\n\n  s5 = ''\n      The \\ is not special here.\n    ' can be followed by any character except another ', e.g. 'x'.\n    Likewise for $, e.g. $$ or $varName.\n    But ' followed by ' is special, as is $ followed by {.\n    If you want them, use anti-quotations: ${\"''\"}, ${\"\\${\"}.\n  '';\n\nin s5\n"
  },
  {
    "path": "tests/eval-compare/ind-string-06.nix",
    "content": "let\n\n  s6 = ''  \n    Tabs are not interpreted as whitespace (since we can't guess\n    what tab settings are intended), so don't use them.\n \tThis line starts with a space and a tab, so only one\n    space will be stripped from each line.\n  '';\n\nin s6\n"
  },
  {
    "path": "tests/eval-compare/ind-string-07.nix",
    "content": "let\n\n  s7 = ''\n    Also note that if the last line (just before the closing ' ')\n    consists only of whitespace, it's ignored.  But here there is\n    some non-whitespace stuff, so the line isn't removed. '';\n\nin s7\n"
  },
  {
    "path": "tests/eval-compare/ind-string-08.nix",
    "content": "let\n\n  s8 = ''    ${\"\"}\n    This shows a hacky way to preserve an empty line after the start.\n    But there's no reason to do so: you could just repeat the empty\n    line.\n  '';\n\nin s8\n"
  },
  {
    "path": "tests/eval-compare/ind-string-09.nix",
    "content": "let\n\n  s9 = ''\n  ${\"\"}  Similarly you can force an indentation level,\n    in this case to 2 spaces.  This works because the anti-quote\n    is significant (not whitespace).\n  '';\n\nin s9\n"
  },
  {
    "path": "tests/eval-compare/ind-string-10.nix",
    "content": "let\n\n  s10 = ''\n  '';\n\nin s10\n"
  },
  {
    "path": "tests/eval-compare/ind-string-11.nix",
    "content": "let\n\n  s11 = '''';\n\nin s11\n"
  },
  {
    "path": "tests/eval-compare/ind-string-12.nix",
    "content": "let\n\n  s12 = ''   '';\n\nin s12\n"
  },
  {
    "path": "tests/eval-compare/ind-string-13.nix",
    "content": "let\n\n  s13 = ''\n    start on network-interfaces\n\n    start script\n    \n      rm -f /var/run/opengl-driver\n      ${if true\n        then \"ln -sf 123 /var/run/opengl-driver\"\n        else if true\n        then \"ln -sf 456 /var/run/opengl-driver\"\n        else \"\"\n      }\n\n      rm -f /var/log/slim.log\n       \n    end script\n\n    env SLIM_CFGFILE=${\"abc\"}\n    env SLIM_THEMESDIR=${\"def\"}\n    env FONTCONFIG_FILE=/etc/fonts/fonts.conf  \t\t\t\t# !!! cleanup\n    env XKB_BINDIR=${\"foo\"}/bin         \t\t\t\t# Needed for the Xkb extension.\n    env LD_LIBRARY_PATH=${\"libX11\"}/lib:${\"libXext\"}/lib:/usr/lib/          # related to xorg-sys-opengl - needed to load libglx for (AI)GLX support (for compiz)\n\n    ${if true\n      then \"env XORG_DRI_DRIVER_PATH=${\"nvidiaDrivers\"}/X11R6/lib/modules/drivers/\"\n    else if true\n      then \"env XORG_DRI_DRIVER_PATH=${\"mesa\"}/lib/modules/dri\"\n      else \"\"\n    } \n\n    exec ${\"slim\"}/bin/slim\n  '';\n\nin s13\n"
  },
  {
    "path": "tests/eval-compare/ind-string-14.nix",
    "content": "let\n\n  s14 = ''\n    Escaping of ' followed by ': '''\n    Escaping of $ followed by {: ''${\n    And finally to interpret \\n etc. as in a string: ''\\n, ''\\r, ''\\t.\n  '';\n\nin s14\n"
  },
  {
    "path": "tests/eval-compare/ind-string-15.nix",
    "content": "let\n\n  # Regression test: antiquotation in '${x}' should work, but didn't.\n  s15 = let x = \"bla\"; in ''\n    foo\n    '${x}'\n    bar\n  '';\n\nin s15\n"
  },
  {
    "path": "tests/eval-compare/ind-string-16.nix",
    "content": "let\n\n  # Regression test: accept $'.\n  s16 = ''\n    cut -d $'\\t' -f 1\n  '';\n\nin s16\n"
  },
  {
    "path": "tests/eval-compare/ind-string-17.nix",
    "content": "let\n\n  # Accept dollars at end of strings \n  s17 = ''ending dollar $'' + ''$'' + \"\\n\";\n\nin s17\n"
  },
  {
    "path": "tests/eval-compare/ind-string-18.nix",
    "content": "# to observe the upstream nix behavior for dollar sign excape in doublequote string\n\"\\${foo \\$ $foo\"\n"
  },
  {
    "path": "tests/eval-compare/ind-string-19.nix",
    "content": "# to observe the upstream nix behavior for dollar excape in Indented string\n''\n''$ $ ''${\n''\n"
  },
  {
    "path": "tests/eval-compare/paths-01.nix",
    "content": "baseNameOf foo/bar"
  },
  {
    "path": "tests/eval-compare/placeholder.nix",
    "content": "builtins.placeholder \"foo\""
  },
  {
    "path": "tests/files/attrs.nix",
    "content": "rec {\n\n  y = 2;\n  z = { w = 4; };\n  v = rec {\n    u = 6;\n    t = [ u z.w s.q ];\n  };\n  s = { r = import ./goodbye.nix; q = 10; };\n  p = import ./hello.nix;\n\n}\n"
  },
  {
    "path": "tests/files/callLibs.nix",
    "content": "let callLibs = file: import file { lib = self; };\n    trivial = callLibs ./trivial.nix;\nin trivial\n"
  },
  {
    "path": "tests/files/eighty.nix",
    "content": "80\n"
  },
  {
    "path": "tests/files/file.nix",
    "content": "({ x ? 1, y ? x * 3 }: import ./file2.nix { a = y; }) {}\n"
  },
  {
    "path": "tests/files/file2.nix",
    "content": "{ a }: a + 100\n"
  },
  {
    "path": "tests/files/findFile.nix",
    "content": ""
  },
  {
    "path": "tests/files/force.nix",
    "content": "let f = { a = 1; b = import ./hello.nix; }; in f.a\n"
  },
  {
    "path": "tests/files/goodbye.nix",
    "content": "\"Goodbye, world!\"\n"
  },
  {
    "path": "tests/files/hello.nix",
    "content": "\"Hello, world!\"\n"
  },
  {
    "path": "tests/files/hello2.nix",
    "content": "let x = { z = x: import ./eighty.nix + 20 + x; w = 123; };\n            allPackages = self:\n              super:\n                let\n                  res = import ./eighty.nix {\n                    inherit lib nixpkgsFun noSysDirs\n                            config;\n                  } null self;\n                in res;\n    y = \"Hello\";\n    z = \"Goodbye\";\n    f = x: if x == 0 then x * 2 else x + 2;\n    w = x.z 5 + f 3 - 15;\nin assert w == 1;\n   if x.z 2 == 100 then y else 3\n"
  },
  {
    "path": "tests/files/if-then.nix",
    "content": "# [ ({ a = 1; b = 2; } // { c = 1; d = 2; })\n#   ([1 2 3] ++ [4.0 5.0 6.0])\n#   (x: y: x + y)\n# ]\n\n({ x, y ? x + 1 }: x + x)\n"
  },
  {
    "path": "tests/files/lint.nix",
    "content": "{ x, y }: let z = x + y; in [ z (y + 2) ]\n"
  },
  {
    "path": "tests/files/loop.nix",
    "content": "(with builtins;\n{ localSystem ? builtins.intersectAttrs {\n     system = null;\n     platform = null;\n   } args\n   , system ? null\n   , platform ? null\n   , crossSystem ? null\n   , config ? {}\n   , overlays ? []\n   , ... }@args:\n  ({ localSystem\n   , crossSystem ? null\n   , config ? null\n   , overlays ? null\n   , stdenvStages ? { lib, localSystem, crossSystem, config, overlays }@args:\n     let\n       inherit (\n         rec {\n           stageFun = step:\n             last:\n               { shell ? \"/bin/bash\"\n               , overrides ? (self: super: {})\n               , allowedRequisites ? null }:\n                 let\n                   name = \"bootstrap-stage${toString step}\";\n                   thisStdenv = (let\n                     fix' = f: let x = f x // { __unfix__ = null; }; in x;\n                     makeExtensible = rattrs: fix' rattrs // { extend = null; };\n                     lib = makeExtensible (self:\n                         let callLibs = file: import file { lib = self; };\n                         in with self; {\n                           customisation =\n                             callLibs <nixpkgs/lib/customisation.nix>;\n                           trivial =\n                             callLibs <nixpkgs/lib/trivial.nix>;\n                           inherit (customisation) makeOverridable;\n                           inherit (trivial) functionArgs setFunctionArgs;\n                         });\n                   in lib.makeOverridable ({ name ? null\n                                           , preHook ? null\n                                           , initialPath\n                                           , shell\n                                           , allowedRequisites ? null\n                                           , overrides ? (self: super: {})\n                                           , config\n                                           , buildPlatform\n                                           , hostPlatform\n                                           , targetPlatform }:\n                     let\n                       defaultBuildInputs = [];\n                       stdenv = derivation\n                         ({ allowedRequisites =\n                              allowedRequisites ++\n                              defaultBuildInputs;\n                          } // {\n                         inherit name;\n                         inherit (buildPlatform) system;\n                         builder = shell;\n                       }) // {\n                         inherit overrides;\n                       };\n                     in stdenv)) {\n                     name = \"${name}-stdenv-darwin\";\n                     inherit config shell;\n                     allowedRequisites = if allowedRequisites == null\n                       then null else allowedRequisites ++ [];\n                     buildPlatform = localSystem;\n                     hostPlatform = localSystem;\n                     targetPlatform = localSystem;\n                     initialPath = [];\n                     overrides = self: super: (overrides self super) // { fetchurl = null; };\n                   };\n                 in {\n                   inherit config overlays;\n                   stdenv = thisStdenv;\n                 };\n           stage0 = stageFun 0 null {\n             overrides = self: super: super;\n           };\n           stage1 = prevStage:\n             with prevStage;\n             stageFun 1 prevStage {\n               allowedRequisites = [\n                 (pkgs.darwin.Libsystem) # THUNK FORCE STARTS HERE\n               ];\n               overrides = sefl: super: {};\n             };\n           stagesDarwin = [ ({  }: stage0) stage1 ];\n         }) stagesDarwin;\n     in stagesDarwin }@args:\n    let\n      lib = let\n        fix' = f: let x = f x // { __unfix__ = null; }; in x;\n        makeExtensible = rattrs: fix' rattrs // { extend = null; };\n        in makeExtensible (self:\n            let callLibs = file: import file { lib = self; };\n            in with self;\n            {\n              fixedPoints = callLibs <nixpkgs/lib/fixed-points.nix>;\n              lists = callLibs <nixpkgs/lib/lists.nix>;\n              inherit (fixedPoints) fix extends;\n              inherit (lists) foldl' imap1;\n            });\n\n      allPackages = newArgs:\n        ({ lib\n         , nixpkgsFun\n         , stdenv\n         , allowCustomOverrides\n         , noSysDirs ? null\n         , config\n         , overlays }:\n          let\n            allPackages = pkgs: super: {\n              pkgs = pkgs;\n              darwin = pkgs.darwin; # THUNK FORCE LOOPS: self-reference\n            };\n          in lib.fix (lib.foldl' (x: y: lib.extends y x) (self:\n              {}) ([\n              (self: super: { inherit stdenv; })\n              allPackages\n              (self: super: super.stdenv.overrides null super)\n            ]))) ({ inherit lib nixpkgsFun; } // newArgs);\n\n       withAllowCustomOverrides = lib.lists.imap1 (index: stageFun: prevStage:\n           { allowCustomOverrides = index == 1; } // stageFun prevStage)\n         (lib.lists.reverseList\n          (stdenvStages {\n             inherit lib localSystem crossSystem config overlays;\n           }));\n\n       go = n:\n         if n == builtins.length withAllowCustomOverrides\n         then {}\n         else let\n           succ = go (n + 1);\n           in allPackages (builtins.elemAt withAllowCustomOverrides n succ);\n     in go 0)\n\n  (args // {\n     inherit config overlays crossSystem;\n     localSystem = { system = builtins.currentSystem; };\n   })) {}\n"
  },
  {
    "path": "tests/files/test.nix",
    "content": "let x = rec {\n\n  y = 2;\n  z = { w = 4; };\n  v = rec {\n    u = 6;\n    t = [ u z.w s.q ];\n  };\n  s = { r = import ./goodbye.nix; q = 10; };\n  p = import ./hello.nix;\n\n}; o = 100; in [ x.v.t x.z.w x.p x.p ]\n"
  },
  {
    "path": "tests/files/with.nix",
    "content": "with { x = 1; }; with { x = 2; }; y\n"
  }
]